campo-sirio/cg/cg0200.cpp

373 lines
9.1 KiB
C++
Executable File

#include <relapp.h>
#include <lffiles.h>
#include <modaut.h>
#include <utility.h>
#include <pconti.h>
#include <clifo.h>
#include <anagr.h>
#include <anafis.h>
#include <validate.h>
#include <defmask.h>
#include <config.h>
#include "cg0.h"
#include "cg0200.h"
class CG0200_application : public TRelation_application
{
TMask* _msk;
TRelation *_rel;
TLocalisamfile* _saldi;
TLocalisamfile* _anag;
TLocalisamfile* _fis;
TLocalisamfile* _comuni;
TLocalisamfile* _pcon;
bool user_create();
bool user_destroy();
virtual TMask* get_mask(int mode) {return _msk;}
virtual bool changing_mask(int mode) {return FALSE;}
virtual bool protected_record(TRectype &rec);
virtual const char* get_next_key();
virtual void init_query_mode(TMask& m);
public:
virtual TRelation* get_relation() const {return _rel;}
CG0200_application() {}
};
bool CG0200_application::protected_record(TRectype &rec)
{
TMask* m = get_mask(MODE_MOD);
const int gruppo = atoi(m->get(F_GRUPPO));
const int conto = atoi(m->get(F_CONTO));
const long sottoc = atol(m->get(F_CODCF));
_saldi->zero();
_saldi->put(PCN_GRUPPO, gruppo);
_saldi->put(PCN_CONTO, conto);
_saldi->put(PCN_SOTTOCONTO, sottoc);
_saldi->read();
return _saldi->good() &&
gruppo ==_saldi->get_int(PCN_GRUPPO) &&
conto ==_saldi->get_int(PCN_CONTO) &&
sottoc ==_saldi->get_long(PCN_SOTTOCONTO);
}
const char* CG0200_application::get_next_key()
{
TLocalisamfile& clifo = *_rel->lfile() ;
long codcf = 1L ;
const TString tipo(_msk->get(F_TIPOCF)) ;
if (!clifo.empty())
{
clifo.zero() ;
clifo.setkey(1) ;
if ( tipo == TCLI )
{
clifo.put(CLI_TIPOCF, (const char* ) TFOR);
clifo.read(_isgteq ) ;
if (clifo.good())
clifo.prev() ;
clifo.setstatus(NOERR);
}
else clifo.last( ) ;
if ( clifo.good() )
{
const TFixed_string tipocf(clifo.get(CLI_TIPOCF));
if ( tipocf == tipo )
codcf += clifo.get_long(CLI_CODCF);
}
}
return format("%d|%s|%d|%ld", F_TIPOCF, (const char*) tipo, F_CODCF, codcf);
}
HIDDEN bool no_dup_fis(TMask_field& f, KEY key)
{
TMask& msk = f.mask() ;
if (msk.query_mode() || !f.to_check(key)) return TRUE;
CG0200_application* app = (CG0200_application*) MainApp();
TLocalisamfile& clifo = *app->get_relation()->lfile(LF_CLIFO) ;
if ( f.get().not_empty() && !clifo.empty() )
{
clifo.zero() ;
const char t1 = msk.get(F_TIPOCF)[0] ;
clifo.put(CLI_TIPOCF, t1);
clifo.put(CLI_COFI, f.get());
clifo.setkey(4) ;
clifo.read() ;
clifo.setkey(1) ;
const char t = clifo.get_char(CLI_TIPOCF);
const TFixed_string s = clifo.get(CLI_CODCF);
const TFixed_string s1(msk.get(F_CODCF));
if (clifo.good() && (t1 != t || s1 != s))
{
f.yesno_box("Codice fiscale gia' utilizzato per il codice : %c/%s",
t, (const char*) s);
return FALSE;
}
}
return TRUE ;
}
HIDDEN bool no_dup_iva(TMask_field& f, KEY key)
{
TMask& msk = f.mask() ;
if (msk.query_mode() || !f.to_check(key)) return TRUE;
CG0200_application* app = (CG0200_application*) MainApp();
TLocalisamfile& clifo = *app->get_relation()->lfile(LF_CLIFO) ;
if ( f.get().not_empty() && !clifo.empty() )
{
clifo.zero() ;
const char t1 = msk.get(F_TIPOCF)[0];
clifo.put(CLI_TIPOCF, t1) ;
clifo.put(CLI_STATOPAIV, msk.get(F_STATOPAIV)) ;
clifo.put(CLI_PAIV, f.get()) ;
clifo.setkey(5) ;
clifo.read() ;
clifo.setkey(1) ;
const char t = clifo.get_char(CLI_TIPOCF);
const TFixed_string s = clifo.get(CLI_CODCF);
const TFixed_string s1(msk.get(F_CODCF));
if (clifo.good() && (t1 != t || s1 != s))
{
f.error_box("Partita iva gia' definita per il codice : %c/%s",
t, (const char*) s);
return FALSE ;
}
}
return TRUE ;
}
HIDDEN bool autoexit_handler(TMask_field& f, KEY key)
{
if (f.mask().query_mode())
{
if (key == K_TAB && f.focusdirty())
{
TArray parms;
parms.add((TString)format("%d", f.dlg()));
::validate(AUTOEXIT_FUNC, (TEdit_field&) f, key, parms);
}
}
else
if (f.to_check(key) && f.mask().get(F_ALLEG) != "4")
{
if (f.dlg() == F_COFI) return no_dup_fis(f, key);
else return no_dup_iva(f, key);
}
return TRUE;
}
HIDDEN bool lbcn = FALSE;
HIDDEN bool tipo_handler(TMask_field& f, KEY key)
{
TMask& m = f.mask();
const bool fis = f.get() == "F";
m.send_key(K_SHIFT + K_CTRL + (lbcn && fis ? 's' : 'h'), -5);
return TRUE;
}
HIDDEN bool percip_handler(TMask_field& f, KEY key)
{
TMask& m = f.mask();
if (f.to_check(key) && m.get(F_CODANAGPER).not_empty())
{
TLocalisamfile anag(LF_ANAG);
TString c(m.get(F_COFI)), p(m.get(F_PAIV));
if ((c.not_empty() && c != anag.get(ANA_COFI)) ||
(p.not_empty() && p != anag.get(ANA_PAIV))) return error_box("Percipiente non corretto");
TString r(anag.get(ANA_RAGSOC));
if (m.get(F_RAGSOC).empty() ||
(key == K_TAB && yesno_box("Ragione sociale differente correggo in %s", (const char*) r)))
m.set(F_RAGSOC, r, TRUE);
if (m.get(F_INDCF).empty()) m.set(F_INDCF, anag.get(ANA_INDRES));
if (m.get(F_CIVCF).empty()) m.set(F_CIVCF, anag.get(ANA_CIVRES));
if (m.get(F_CAPCF).empty()) m.set(F_CAPCF, anag.get(ANA_CAPRES));
if (m.get(F_COMCF).empty())
{
m.set(F_STATOCF, anag.get(ANA_STATORES), TRUE);
m.set(F_COMCF, anag.get(ANA_COMRES), TRUE);
}
if (c.empty()) m.set(F_COFI, anag.get(ANA_COFI));
if (p.empty()) m.set(F_PAIV, anag.get(ANA_PAIV));
if (m.get(F_TIPOAPER) == "F")
{
m.send_key(K_SHIFT + K_CTRL + (lbcn ? 's' : 'h'), -5);
if (lbcn)
{
TLocalisamfile fis(LF_ANAGFIS);
fis.zero();
fis.put(ANF_CODANAGR, anag.get(ANA_CODANAGR));
fis.read();
if (fis.good())
{
if (m.get(F_DATANASC).empty()) m.set(F_DATANASC, fis.get(ANF_DATANASC));
if (m.get(F_COMNASC).empty())
{
m.set(F_STATONASC, fis.get(ANF_STATONASC));
m.set(F_COMNASC, fis.get(ANF_COMNASC));
}
}
}
}
}
return TRUE;
}
HIDDEN bool alleg_handler(TMask_field& f, KEY key)
{
if (f.to_check(key))
{
const int tipoall = atoi(f.get());
TMask& m = f.mask();
if (tipoall == 0 || tipoall == 4) m.enable(F_CODALLEG);
else
{
m.disable(F_CODALLEG);
m.reset(F_CODALLEG);
}
m.set(F_OCCASIONALE, (tipoall == 2) ? "X" : " ");
}
return TRUE;
}
HIDDEN bool occas_handler(TMask_field& f, KEY key)
{
if (f.to_check(key))
{
const bool occas = f.get().not_empty();
TMask& m = f.mask();
if (occas) m.set(F_ALLEG, "2");
else
if (m.get_int(F_ALLEG) == 2) m.set(F_ALLEG, " ");
}
return TRUE;
}
HIDDEN bool codalleg_handler(TMask_field& f, KEY key)
{
if (f.to_check(key))
{
const TString cod(f.get());
if (cod.not_empty())
{
TMask& m = f.mask();
if (cod == m.get(F_TIPOCF))
return error_box("Codice per allegato non corretto");
TLocalisamfile clifo(LF_CLIFO);
const TString tipo(m.get(F_TIPOCF));
clifo.zero() ;
clifo.setkey(1) ;
clifo.put(CLI_TIPOCF, tipo);
clifo.put(CLI_CODCF, cod);
clifo.read() ;
if (clifo.bad()) return FALSE;
TString tipoall(clifo.get(CLI_ALLEG));
if (clifo.get(CLI_CODALLEG).not_empty() ||
clifo.get(CLI_PAIV).empty() ||
(tipoall.not_empty() && tipoall != "4"))
return error_box("Codice per allegato non corretto");
}
}
return TRUE;
}
void CG0200_application::init_query_mode(TMask& m)
{
TConfig conf(CONFIG_DITTA, "cg");
lbcn = (conf.get("GsLbCn") == "X");
m.send_key(K_SHIFT + K_CTRL + (lbcn ? 's' : 'h'), -5);
}
bool CG0200_application::user_create() // initvar e arrmask
{
const bool ftaut = has_module(FTAUT);
const bool spaut = has_module(SPAUT);
const bool anyaut = spaut || ftaut;
_rel = new TRelation(LF_CLIFO);
_saldi = new TLocalisamfile(LF_SALDI);
_anag = new TLocalisamfile(LF_ANAG);
_fis = new TLocalisamfile(LF_ANAGFIS);
_pcon = new TLocalisamfile(LF_PCON);
_comuni = new TLocalisamfile(LF_COMUNI);
_msk = new TMask("cg0200a") ;
_msk->enable(F_SCONTO,ftaut);
_msk->enable(F_CODVAL,ftaut);
_msk->enable(F_RAGGRB,ftaut);
_msk->enable(F_RAGGFT,ftaut);
_msk->enable(F_CODVETT1,ftaut);
_msk->enable(F_CODVETT2,ftaut);
_msk->enable(F_CODVETT3,ftaut);
_msk->enable(F_CODCFFATT,ftaut);
_msk->enable(F_DESTIN,ftaut);
_msk->enable(F_FIDO,spaut);
_msk->enable(F_CODABI, anyaut);
_msk->enable(F_CODBAN, anyaut);
_msk->enable(F_CODAG, anyaut);
_msk->set_handler(F_OCCASIONALE, occas_handler);
_msk->set_handler(F_COFI, autoexit_handler);
_msk->set_handler(F_PAIV, autoexit_handler);
_msk->set_handler(F_CODANAGPER, percip_handler);
_msk->set_handler(F_TIPOPERS, tipo_handler);
_msk->set_handler(F_ALLEG, alleg_handler);
_msk->set_handler(F_CODALLEG, codalleg_handler);
_saldi->setkey(2);
return TRUE;
}
bool CG0200_application::user_destroy() // releasev e arrmask
{
delete _msk;
delete _rel;
delete _saldi;
delete _anag;
delete _fis;
delete _pcon;
delete _comuni;
return TRUE;
}
int cg0200(int argc, char* argv[])
{
CG0200_application a ;
a.run(argc, argv, "Clienti/Fornitori");
return 0;
}