diff --git a/at/agaat.men b/at/agaat.men index fe6be2cf8..9d5370e94 100755 --- a/at/agaat.men +++ b/at/agaat.men @@ -57,6 +57,7 @@ Item_11 = "Motivi per controlli sanitari", "ba3 -0 mtc", "" Item_12 = "Professioni", "ba3 -0 prf", "" Item_13 = "Tipi di donazione", "ba3 -0 tdn", "" Item_14 = "Tipi/Esiti controlli sanitari", "ba3 -0 tcs", "" +Item_15 = "Singoli controlli sanitari", "ba3 -0 scs", "" [AVIS_002] Caption = "Convocazioni" @@ -150,13 +151,14 @@ Item_01 = "Sezioni", "at6 -1", "" Item_02 = "Medici", "at6 -0", "" Item_03 = "Categorie donatori", "ba3 -1 ctd", "" Item_04 = "Categorie non donatori", "ba3 -1 ctn", "" -Item_05 = "Controlli sanitari", "ba3 -1 tcs", "" -Item_06 = "Gruppi aziendali", "ba3 -1 gaz", "" -Item_07 = "Localita' postali", "ba3 -1 lcp", "" -Item_08 = "Punti di prelievo", "ba3 -1 ldn", "" -Item_09 = "Luoghi di lavoro", "ba3 -1 ldl", "" -Item_10 = "Motivi per controlli", "ba3 -1 mtc", "" -Item_11 = "Professioni", "ba3 -1 prf", "" +Item_05 = "Gruppi aziendali", "ba3 -1 gaz", "" +Item_06 = "Localita' postali", "ba3 -1 lcp", "" +Item_07 = "Punti di prelievo", "ba3 -1 ldn", "" +Item_08 = "Luoghi di lavoro", "ba3 -1 ldl", "" +Item_09 = "Motivi per controlli", "ba3 -1 mtc", "" +Item_10 = "Professioni", "ba3 -1 prf", "" +Item_11 = "Tipi/Esiti Controlli sanitari", "ba3 -1 tcs", "" +Item_12 = "Singoli controlli san.", "ba3 -1 scs", "" [AVIS_005] Caption = "Statistiche" diff --git a/at/at0100.cpp b/at/at0100.cpp index d9b70ad94..514791072 100755 --- a/at/at0100.cpp +++ b/at/at0100.cpp @@ -147,12 +147,33 @@ static int compare_date(const TObject** o1, const TObject** o2) return d; } +static int compare_benem(const TObject** o1, const TObject** o2) +{ + TToken_string* s1 = (TToken_string*)*o1; + TToken_string* s2 = (TToken_string*)*o2; + + const TString16 b1(s1->get(0)); + const TString16 b2(s2->get(0)); + + int b=0; + if (b1>b2) b=+1; + else + if (b1put(BEN_CODICE, m.get(F_CODICE)); _sbenemerenze->set_key(key); - ordina_sheet_data(s); + ordina_sheet_benem(s); for (r=s.items(); r>0; r--) { diff --git a/at/at1200.cpp b/at/at1200.cpp index 6b253e969..23f911d59 100755 --- a/at/at1200.cpp +++ b/at/at1200.cpp @@ -39,7 +39,7 @@ class TAttribuzioneBenemerenze : public TPrintapp TString16 _gruppoazie, _oldben; int _bonus; TDate _dataela, _datapre; - bool _attgruppi,_anchegruppi, _prevista; + bool _attgruppi,_anchegruppi, _prevista, _nuovicriteri; bool _definitiva; TParagraph_string _cognome_nome; int _numdon; @@ -171,8 +171,9 @@ void TAttribuzioneBenemerenze::set_page(int file, int cnt) set_row(1,"@26g@S", FLD(LF_SOGGETTI,SOG_CATDON)); set_row(1,"@29g@S", FLD(LF_SOGGETTI,SOG_TESSAVIS)); set_row(1,"@39g@pn", FLD(LF_SOGGETTI,SOG_TOTDON,"###")); + set_row(1,"@48g@ld", FLD(LF_SOGGETTI,SOG_DATAISC)); if (_prevista) - set_row(1,"@48g#3d", &_numdon); + set_row(1,"@59g#3d", &_numdon); } else set_row(1,""); @@ -196,6 +197,7 @@ bool TAttribuzioneBenemerenze::set_print(int) tasto = _msk->run(); if (tasto == K_ENTER) { + const TDate datarif = TDate("16/05/2004"); _oldben = "**"; _contatore = 0; _prevista = (_msk->get(F_SITUAZIONE)[0] == 'P'); @@ -205,6 +207,7 @@ bool TAttribuzioneBenemerenze::set_print(int) _gruppoazie = _msk->get(F_GRUPPOAZIE); _anchegruppi = _msk->get_bool(F_ANCHEGRUPPI); _definitiva = _msk->get_bool(F_DEFINITIVA); + _nuovicriteri = _msk->get_bool(F_NUOVICRITERI); _catdon.destroy(); const TString16 catpri = _msk->get(F_CAT1); const TString16 catsec = _msk->get(F_CAT2); @@ -230,8 +233,15 @@ bool TAttribuzioneBenemerenze::set_print(int) { TString16 codben = ben.get("CODTAB"); int numdonben = ben.get_int("I0"); - real* oggetto = new real(numdonben); - _tabben.add((const char*)codben, (TObject*) oggetto); + int m_numdon = ben.get_int("I1"); + int m_anni = ben.get_int("I2"); + TToken_string* condizioni = new TToken_string();; + condizioni->add(numdonben); + condizioni->add(m_numdon); + condizioni->add(m_anni); + _tabben.add((const char*)codben, (TObject*) condizioni); + //real* oggetto = new real(numdonben); + //_tabben.add((const char*)codben, (TObject*) oggetto); } TString80 filtro; if (_attgruppi) @@ -293,20 +303,55 @@ bool TAttribuzioneBenemerenze::set_print(int) } if (filtrato) { + const char sesso = sog.get(SOG_SESSO)[0]; + const TDate datanasc = sog.get_date(SOG_DATANASC); + const TDate dataisc = sog.get_date(SOG_DATAISC); TRectype* key = new TRectype(LF_DONAZ); key->put(DON_CODICE, codice); int err = _sdonazioni->read(key); if (err == NOERR) - { + { int precsi = sog.get_int(SOG_DONPRECSI); int precaf = sog.get_int(SOG_DONPRECAF); int numdon = precsi + precaf; + int donxanno = 0; + int anno = 0; for (int r=1; r<=_sdonazioni->rows(); r++) { const TRectype& riga = _sdonazioni->row(r); - TDate datadon = riga.get_date(DON_DATADON); + const TDate datadon = riga.get_date(DON_DATADON); + const TString16 tipodon = riga.get(DON_TIPODON); if (datadon<=_dataela) - numdon++; + { + if (_nuovicriteri && datadon>datarif) // 16/05/2004 + { + if (anno != datadon.year()) + { + if (donxanno > 4) + donxanno = 4; + numdon += donxanno; + donxanno = 0; + } + donxanno++; + int eta = datadon.year() - datanasc.year(); + if (datadon.month() < datanasc.month()) + eta--; + else + if (datadon.month() == datanasc.month()) + if (datadon.day() < datanasc.day()) + eta--; + if ((tipodon == "SI" || tipodon=="SN") && (sesso == '2') && (eta < 50)) + donxanno++; + } + else + numdon++; + } + } + if (_nuovicriteri) + { + if (donxanno > 4) + donxanno = 4; + numdon += donxanno; } if (_prevista) { @@ -345,22 +390,48 @@ bool TAttribuzioneBenemerenze::set_print(int) ultben = "**"; } } - long bonusctrl = 0; + //long bonusctrl = 0; + int bonusctrl = 0; + int m_bonusctrl = 0; + int m_annictrl = 0; if (ultben != "**") { - real& ndonult = (real&) _tabben.find((const char*) ultben); - bonusctrl = ndonult.integer(); + //real& ndonult = (real&) _tabben.find((const char*) ultben); + //bonusctrl = ndonult.integer(); + TToken_string& condizioni = (TToken_string&) _tabben.find((const char*) ultben); + TString str = condizioni.get(); + bonusctrl = atoi(str); + str = condizioni.get(); + m_bonusctrl = atoi(str); + str = condizioni.get(); + m_annictrl = atoi(str); + str = condizioni.get(); } _tabben.restart(); - real* c; - for (c = (real*) _tabben.first_item(); c != NULL; c = (real*) _tabben.succ_item()) + TToken_string* c; + for (c = (TToken_string*) _tabben.first_item(); c != NULL; c = (TToken_string*) _tabben.succ_item()) { const char* tipoben = _tabben.get_hashobj()->key(); - long bonus = c->integer(); + //long bonus = c->integer(); + TString str = c->get(0); + int bonus = atoi(str); + str = c->get(); + int m_bonus = atoi(str); + str = c->get(); + int m_anni = atoi(str); + str = c->get(); if (bonus > bonusctrl) { - if (numdon >= bonus) - { + bool attribuisci = false; + if (numdon >= bonus) + attribuisci = true; + if (_nuovicriteri && !attribuisci && (m_bonus > 0 || m_anni > 0)) // se uso nuovi criteri e non ne ha diritto col vecchio sistema quardo se ne ha diritto con i nuovi criteri + { + const int anniisc = (_dataela - dataisc)/360; + attribuisci = (numdon >= m_bonus) && (anniisc >= m_anni); + } + if (attribuisci) + { // controllo che non abbia ricevuto la benemerenza _benem->zero(); _benem->put(BEN_CODICE, codice); @@ -403,6 +474,8 @@ void TAttribuzioneBenemerenze::crea_intestazione() TString sep(132); sep = "ATTRIBUZIONE BENEMERENZE "; + if (_nuovicriteri) + sep << "CON NUOVI CRITERI "; if (_prevista) sep << " PREVISTE "; if (_definitiva) @@ -422,13 +495,13 @@ void TAttribuzioneBenemerenze::crea_intestazione() set_header(3, (const char *) sep); if (_prevista) { - set_header(4,"@0gCognome e nome@26gC.@29gTessera@39gTot.don.@48gDon.pre."); - set_header(5,"@0-------------------------@26g--@29g--------@39g--------@48g--------"); + set_header(4,"@0gCognome e nome@26gC.@29gTessera@39gTot.don.@48gData isc.@59gDon.pre."); + set_header(5,"@0-------------------------@26g--@29g--------@39g--------@48g----------@59g--------"); } else { - set_header(4,"@0gCognome e nome@26gC.@29gTessera@39gTot.don."); - set_header(5,"@0-------------------------@26g--@29g--------@39g--------"); + set_header(4,"@0gCognome e nome@26gC.@29gTessera@39gTot.don.@48gData isc."); + set_header(5,"@0-------------------------@26g--@29g--------@39g--------@48g----------"); } } diff --git a/at/at1200a.h b/at/at1200a.h index 4f1b5b00a..58149d0ec 100755 --- a/at/at1200a.h +++ b/at/at1200a.h @@ -19,7 +19,8 @@ #define F_CAT6 211 #define F_D_CAT6 212 -#define F_SITUAZIONE 308 +#define F_SITUAZIONE 307 +#define F_NUOVICRITERI 308 #define F_DATAELA 309 #define F_DATAPRE 310 #define F_ATTGRUPPI 311 diff --git a/at/at1200a.uml b/at/at1200a.uml index 307062b9d..f0b3bd743 100755 --- a/at/at1200a.uml +++ b/at/at1200a.uml @@ -214,6 +214,11 @@ BEGIN ITEM "P|Prevista" END +BOOLEAN F_NUOVICRITERI +BEGIN + PROMPT 30 10 "Usa anche nuovi criteri per attribuzione" +END + DATE F_DATAELA BEGIN PROMPT 2 11 "Data elaborazione " diff --git a/at/at2600.cpp b/at/at2600.cpp index 897ba6419..e66f7ba71 100755 --- a/at/at2600.cpp +++ b/at/at2600.cpp @@ -496,15 +496,20 @@ bool TStampaIscritti::user_create() _etlarghezza = config.get_int("EtLarghezza"); _etcolonne = config.get_int("EtColonne"); _form_eti = new TEti_iscritti_form(etformato); + TFilename iscrname = "iscritti"; iscrname.ext("dbf"); TFilename iscrtrr = "iscritti"; iscrtrr.ext("trr"); - if (iscrtrr.exist()) - _fileiscr = new TExternisamfile(iscrname, iscrtrr, false); + if (!iscrtrr.custom_path()) + { + iscrtrr = "recdesc/iscritti"; + iscrtrr.ext("trr"); + } + _fileiscr = new TExternisamfile(iscrname, iscrtrr, false); - return TRUE; + return true; } bool TStampaIscritti::user_destroy() diff --git a/at/at2700.cpp b/at/at2700.cpp index 8e074588d..2b8cefb32 100755 --- a/at/at2700.cpp +++ b/at/at2700.cpp @@ -1252,12 +1252,18 @@ bool TStampaPerCategorie::user_create() _sfamiglia = new TRecord_array(LF_FAMIGLIE,FAM_PROGFAM); add_cursor(new TSorted_cursor(_rel,"SOG_CODSEZ|SOG_CODSOT","",3)); _msk = new TMask("at2700a"); + TFilename filename = "filecat"; filename.ext("dbf"); TFilename filetrr = "filecat"; filetrr.ext("trr"); - filetrr.custom_path(); + if (!filetrr.custom_path()) + { + filetrr = "recdesc/filecat"; + filetrr.ext("trr"); + } _file = new TExternisamfile(filename, filetrr, FALSE); + TFilename namepers("filepers"); namepers.ext("dbf"); if (namepers.exist()) diff --git a/at/at9.cpp b/at/at9.cpp index 262fb36b0..cdaada365 100755 --- a/at/at9.cpp +++ b/at/at9.cpp @@ -18,6 +18,8 @@ int main(int argc,char** argv) rt = at9200(argc,argv) ; break; // Estrazione archivi per aggiornamento case 2: rt = at9300(argc,argv) ; break; // Aggiornamento archivi da estrazione + case 3: + rt = at9400(argc,argv) ; break; // Aggiornamento soggetti default: error_box(usage, argv[0]) ; break; } diff --git a/at/at9.h b/at/at9.h index 700b2dc16..7c24b5067 100755 --- a/at/at9.h +++ b/at/at9.h @@ -4,6 +4,7 @@ int at9100(int argc, char* argv[]); // statistica soggetti sospesi (NON UTILIZZARE) int at9200(int argc, char* argv[]); // Parma: estrazione archivi per aggiornamento int at9300(int argc, char* argv[]); // Parma: aggiornamento archivi da estrazione +int at9400(int argc, char* argv[]); // aggiornamento sit. sogg. #endif // __AT9_H diff --git a/at/at9400.cpp b/at/at9400.cpp new file mode 100755 index 000000000..f8b46aca6 --- /dev/null +++ b/at/at9400.cpp @@ -0,0 +1,236 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "at9.h" + +#include "atlib.h" + +// nomi dei campi +#include "soggetti.h" +#include "donaz.h" +#include "contsan.h" +#include "idoneita.h" +#include "rconvoc.h" + +class TReconstruction : public TApplication +{ + TMask* _msk; + TRelation* _rel; + + TLocalisamfile* _soggetti; + TLocalisamfile* _donaz; + TLocalisamfile* _contsan; + TLocalisamfile* _idoneita; + TRecord_array* _sdonazioni; + TRecord_array* _scontrolli; + TRecord_array* _sidoneita; + // parametri di sezione + int _intsi_f1, _intsi_f2, _intsi_m, _intaf_m, _etadonne; + int _numdon1, _numdon2; + TString16 _catini1, _catfin1, _catini2, _catfin2, _motivoid; + bool _sttess2, _dataisc, _nomessage, _autoid; + + +protected: + virtual bool create(); + virtual bool destroy(); + virtual bool menu(MENU_TAG m); + virtual TMask& get_mask() { return *_msk; } + virtual TRelation* get_relation() const { return _rel; } + + int write(TSheet_field& s); + +public: + TReconstruction() {} + +}; + +HIDDEN inline TReconstruction& app() { return (TReconstruction&) main_app(); } + +bool TReconstruction::create() +{ + TApplication::create(); + _msk = new TMask("at9400a"); + _rel = new TRelation(LF_SOGGETTI); + _donaz = new TLocalisamfile(LF_DONAZ); + _contsan = new TLocalisamfile(LF_CONTSAN); + _idoneita = new TLocalisamfile(LF_IDONEITA); + _sdonazioni = new TRecord_array(LF_DONAZ,DON_PROGDON); + _scontrolli = new TRecord_array(LF_CONTSAN,CON_PROGCON); + _sidoneita = new TRecord_array(LF_IDONEITA,IDO_PROGIDO); + TConfig config(CONFIG_STUDIO); + _numdon1 = config.get_int("NumDon1"); + _numdon2 = config.get_int("NumDon2"); + _catini1 = config.get("CatIni1"); + _catfin1 = config.get("CatFin1"); + _catini2 = config.get("CatIni2"); + _catfin2 = config.get("CatFin2"); + _sttess2 = config.get_bool("StTess2"); + _dataisc = config.get_bool("DataIsc"); + _nomessage = config.get_bool("NoMessage"); + _etadonne = config.get_int("EtaDonne"); + _intsi_f1 = config.get_int("IntSI_F1"); + _intsi_f2 = config.get_int("IntSI_F2"); + _intsi_m = config.get_int("IntSI_M"); + _intaf_m = config.get_int("IntAF_M"); + dispatch_e_menu(BAR_ITEM(1)); + return TRUE; +} + +bool TReconstruction::destroy() +{ + delete _sidoneita; + delete _scontrolli; + delete _sdonazioni; + delete _idoneita; + delete _contsan; + delete _donaz; + delete _rel; + delete _msk; + return TApplication::destroy(); +} + +static int compare_date(const TObject** o1, const TObject** o2) +{ + const TRectype& s1 = *((TRectype*)*o1); + const TRectype& s2 = *((TRectype*)*o2); + + const TDate d1(s1.get(IDO_DATAIDO)); + const TDate d2(s2.get(IDO_DATAIDO)); + + int d=0; + if (d1>d2) d=+1; + else + if (d1run(); + if (tasto == K_ENTER) + { + TLocalisamfile rconvoc(LF_RCONVOC); + _rel->lfile().setkey(1); + bool modificato = FALSE; + TDate oggi(TODAY); + TRectype& recsog = _rel->curr(); + TProgind pi(_rel->items(),"Aggiornamento situazione soggetti da appoggio", TRUE, TRUE, 10); + pi.setstatus(1); + for (_rel->first(); _rel->ok(); _rel->next()) + { + pi.addstatus(1); + if (pi.iscancelled()) break; + const long codsog = recsog.get_long("CODICE"); + TRectype* keyd = new TRectype(LF_DONAZ); + keyd->put(DON_CODICE, codsog); + int err = _sdonazioni->read(keyd); + calcola_donazioni_lib(recsog, _sdonazioni); + _sdonazioni->rewrite(); + recsog.rewrite(_rel->lfile()); + TRectype* key = new TRectype(LF_IDONEITA); + key->put(IDO_CODICE, recsog.get(SOG_CODICE)); + err = _sidoneita->read(key); + _sidoneita->sort(compare_date); + _sidoneita->rewrite(); + TRectype* keyc = new TRectype(LF_CONTSAN); + keyc->put(CON_CODICE, recsog.get(SOG_CODICE)); + _scontrolli->read(keyc); + if (_scontrolli->rows()>0 || _sidoneita->rows()>0) + { + con_reord(recsog,_scontrolli,_sidoneita); + recsog.rewrite(_rel->lfile()); + } + if (_calcolacat) + { + TTable ctd("CTD"); + TString16 catdon = recsog.get(SOG_CATDON); + const int totdon = recsog.get_int(SOG_TOTDON); + ctd.put("CODTAB",catdon); + if (ctd.read() == NOERR) + { + bool dimissione = ctd.get_bool("B0"); + if (dimissione) + { + recsog.put(SOG_CATDON,ctd.get("S6")); + if (ctd.get("S6").not_empty()) + catdon = ctd.get("S6"); + } + if ((catdon == _catini1 || _catini1.empty()) && (totdon>=_numdon1) && _catfin1.not_empty()) + { + recsog.put(SOG_CATDON, _catfin1); + catdon = _catfin1; + } + const bool tstampata = recsog.get_bool(SOG_T_STAMPATA); + if ((catdon == _catini2 || _catini2.empty()) && (totdon>=_numdon2) && _catfin2.not_empty() && (!_sttess2 || tstampata)) + { + recsog.put(SOG_CATDON, _catfin2); + catdon = _catfin2; + } + } + } + TDate dataiscsog = recsog.get_date(SOG_DATAISC); + if (!dataiscsog.ok() && _dataisc) + { + if (!recsog.get_date(SOG_DATAPRISI) == NULLDATE) + recsog.put(SOG_DATAISC,recsog.get(SOG_DATAPRISI)); + else + { + const TRectype& riga = _sdonazioni->row(1); + recsog.put(SOG_DATAISC,riga.get(DON_DATADON)); + } + } + const TDate dataprossi = recsog.get_date(SOG_DATAPROSSI); + const TDate dataconv = recsog.get_date(SOG_DATACONV); + const char stato = modstato_tcs(recsog.get(SOG_STATO)); + const TString16 statosi = recsog.get(SOG_STATOSI); + if ((stato == 'S') || (statosi == SOSPENSIONE) || (dataprossi > dataconv) || !dataprossi.ok()) + { + rconvoc.setkey(3); + rconvoc.zero(); + rconvoc.put(RCV_CODICE, recsog.get(SOG_CODICE)); + rconvoc.put(RCV_DATACONV, recsog.get(SOG_DATACONV)); + if (rconvoc.read() == NOERR) + { + rconvoc.put(RCV_ANNULLATO, TRUE); + int err = rconvoc.write(); + } + const TDate datanulla(NULLDATE); + recsog.put(SOG_DATACONV, datanulla); + recsog.put(SOG_DATAULTSOL, datanulla); + const int numzero = 0; + recsog.put(SOG_NUMCONV,numzero); + } + recsog.put(SOG_DATAULTAGG, oggi); + recsog.put(SOG_UTENULTAGG, "CONVE"); + recsog.rewrite(_rel->lfile()); + } + } + return FALSE; +} + +int TReconstruction::write(TSheet_field& s) +{ + return NOERR; +} + + +int at9400(int argc, char* argv[]) +{ + TReconstruction a; + a.run(argc, argv, "Aggiornamento situazione soggetti"); + return 0; +} diff --git a/at/at9400a.uml b/at/at9400a.uml new file mode 100755 index 000000000..7aa01bc1a --- /dev/null +++ b/at/at9400a.uml @@ -0,0 +1,13 @@ +PAGE "Aggiornamento situazione soggetti" -1 -1 78 20 +BUTTON DLG_OK 9 2 +BEGIN + PROMPT -12 14 "" +END + +BUTTON DLG_QUIT 9 2 +BEGIN + PROMPT -22 14 "" +END + +ENDPAGE +ENDMASK diff --git a/at/bastscs.uml b/at/bastscs.uml new file mode 100755 index 000000000..148c4cf5f --- /dev/null +++ b/at/bastscs.uml @@ -0,0 +1,16 @@ +//DEFINIZIONE MASCHERA PER STAMPA TABELLA SINGOLI CONTROLLI SANITARI + +PAGE "Stampa Tabella Singoli controlli sanitari" -1 -1 56 8 + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -12 -1 "" +END + +BUTTON DLG_QUIT 10 2 +BEGIN + PROMPT -22 -1 "" +END + +ENDPAGE +ENDMASK diff --git a/at/batbbnz.h b/at/batbbnz.h index 0586d5fe2..0b65de9c9 100755 --- a/at/batbbnz.h +++ b/at/batbbnz.h @@ -2,4 +2,6 @@ #define F_TABBNZ_DESCR 101 #define F_TABBNZ_NDON 102 #define F_TABBNZ_STATUTO 103 -#define DLG_DEL 105 +#define F_TABBNZ_M_NDON 104 +#define F_TABBNZ_M_ANNI 105 +#define DLG_DEL 108 diff --git a/at/batbbnz.uml b/at/batbbnz.uml index d90b31d18..1414e10dc 100755 --- a/at/batbbnz.uml +++ b/at/batbbnz.uml @@ -8,13 +8,13 @@ PAGE "Benemerenze" -1 -1 78 7 STRING F_TABBNZ_CODTAB 2 BEGIN - PROMPT 2 1 "Codice " - FIELD CODTAB + PROMPT 2 1 "Codice " + FIELD CODTAB HELP "Inserire il codice della benemerenza" USE BNZ CHECKTYPE REQUIRED INPUT CODTAB F_TABBNZ_CODTAB - DISPLAY "Codice " CODTAB + DISPLAY "Codice " CODTAB DISPLAY "Descrizione@30" S0 OUTPUT F_TABBNZ_CODTAB CODTAB OUTPUT F_TABBNZ_DESCR S0 @@ -24,22 +24,22 @@ END STRING F_TABBNZ_DESCR 30 BEGIN - PROMPT 2 3 "Descrizione " - FIELD S0 + PROMPT 2 3 "Descrizione " + FIELD S0 HELP "Inserire la descrizione della benemerenza" USE BNZ KEY 2 CHECKTYPE REQUIRED INPUT S0 F_TABBNZ_DESCR DISPLAY "Descrizione@30" S0 - DISPLAY "Codice " CODTAB + DISPLAY "Codice " CODTAB COPY OUTPUT F_TABBNZ_CODTAB KEY 2 END NUMBER F_TABBNZ_NDON 3 BEGIN - PROMPT 2 5 "Num. donazioni " - FIELD I0 + PROMPT 2 5 "Num. donazioni " + FIELD I0 HELP "Inserire il numero di donazioni necessarie per ottenere la benemerenza" CHECKTYPE REQUIRED FLAGS "U" @@ -48,8 +48,29 @@ END BOOLEAN F_TABBNZ_STATUTO BEGIN PROMPT 30 5 "Da statuto " - FIELD B0 - HELP "La benemerenza Š prevista nello statuto AVIS?" + FIELD B0 + HELP "La benemerenza Š prevista nello statuto AVIS?" +END + +GROUPBOX DLG_NULL 77 4 +BEGIN + PROMPT 1 7 "Nuovi criteri per benemerenza" +END + +NUMBER F_TABBNZ_M_NDON 3 +BEGIN + PROMPT 2 8 "Numero donazioni " + FIELD I1 + HELP "Inserire il numero di donazioni necessarie per ottenere la benemerenza" + FLAGS "U" +END + +NUMBER F_TABBNZ_M_ANNI 2 +BEGIN + PROMPT 2 9 "Anni di iscrizione " + FIELD I2 + HELP "Inserire il numero di anni di iscrizione necessari" + FLAGS "U" END ENDPAGE diff --git a/at/batbscs.h b/at/batbscs.h new file mode 100755 index 000000000..8caad6e08 --- /dev/null +++ b/at/batbscs.h @@ -0,0 +1,3 @@ +#define F_TABSCS_CODTAB 100 +#define F_TABSCS_DESCR 101 +#define DLG_DEL 105 diff --git a/at/batbscs.rpt b/at/batbscs.rpt new file mode 100755 index 000000000..b1d5f1e96 --- /dev/null +++ b/at/batbscs.rpt @@ -0,0 +1,9 @@ +[Headers] +80 +Tabella singoli controlli sanitari +1|@0g%s|Codice +1|@7g%s|Descrizione + +[Rows] +1|CODTAB|@0g@2s +1|S0|@7g@30,ls diff --git a/at/batbscs.uml b/at/batbscs.uml new file mode 100755 index 000000000..50c744b37 --- /dev/null +++ b/at/batbscs.uml @@ -0,0 +1,40 @@ +#include "batbscs.h" + +TOOLBAR "" 0 20 0 2 +#include +ENDPAGE + +PAGE "Singoli controlli sanitari" -1 -1 78 7 + +STRING F_TABSCS_CODTAB 2 +BEGIN + PROMPT 2 1 "Codice " + FIELD CODTAB + HELP "Inserire il codice del singolo controllo" + USE SCS + CHECKTYPE REQUIRED + INPUT CODTAB F_TABSCS_CODTAB + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@30" S0 + OUTPUT F_TABSCS_CODTAB CODTAB + OUTPUT F_TABSCS_DESCR S0 + KEY 1 + FLAGS "U" +END + +STRING F_TABSCS_DESCR 30 +BEGIN + PROMPT 2 3 "Descrizione " + FIELD S0 + HELP "Inserire la descrizione del singolo controllo" + USE SCS KEY 2 + CHECKTYPE REQUIRED + INPUT S0 F_TABSCS_DESCR + DISPLAY "Descrizione@30" S0 + DISPLAY "Codice" CODTAB + COPY OUTPUT F_TABSCS_CODTAB + KEY 2 +END + +ENDPAGE +ENDMASK diff --git a/gv/f158.dir b/gv/f158.dir index 8f9054409..e8f718967 100755 --- a/gv/f158.dir +++ b/gv/f158.dir @@ -1,3 +1,3 @@ 158 -1 -$righef24|0|0|138|0|Righe di delega F24||| +0 +$righef24|0|0|175|0|Righe di delega F24||| \ No newline at end of file diff --git a/gv/f158.trr b/gv/f158.trr index eaa32cb52..d87bf89c0 100755 --- a/gv/f158.trr +++ b/gv/f158.trr @@ -1,5 +1,5 @@ 158 -14 +18 PROGR|3|6|0|Progressivo riga F24|3|6|0|Numero F24 a cui la riga e' associata TRIBUTO|1|4|0|Codice tributo @@ -10,10 +10,14 @@ DATASCAD|5|8|0|Data scadenza DATAVERS|5|8|0|Data versamento ABI|10|5|0|ABI banca su cio e' stato effettuato il versamento CAB|10|5|0|CAB -RRP|1|4|0|Rateazione/Regione/Prov. +RATEAZIONE|1|8|0|Rateazione/Regione/Prov. ANNO|2|4|0|Anno di riferimento IMPORTODEB|4|15|2|Importo a debito IMPORTOCRE|4|15|2|Importo a credito +SEDE|1|4|0|Sede sezione INPS +MATRICOLA|1|17|0|Matricola +PERIODODA|10|6|0|Inizio periodo di riferimento +PERIODOA|10|6|0|Fine periodo di riferimento 3 PROGR| F24+PROGR| diff --git a/gv/gv0.cpp b/gv/gv0.cpp new file mode 100755 index 000000000..0000c24d0 --- /dev/null +++ b/gv/gv0.cpp @@ -0,0 +1,14 @@ +#include +#include "gv0.h" + +int main(int argc, char** argv) +{ + const int n = argc > 1 ? argv[1][1]-'0' : 0; + switch (n) + { + case 4: gv0500(argc, argv); break; + case 5: gv0600(argc, argv); break; + default: break; + } + return 0; +} \ No newline at end of file diff --git a/gv/gv0.h b/gv/gv0.h new file mode 100755 index 000000000..9f1e6a478 --- /dev/null +++ b/gv/gv0.h @@ -0,0 +1,2 @@ +int gv0500(int argc, char* argv[]); +int gv0600(int argc, char* argv[]); \ No newline at end of file diff --git a/gv/gv0500.cpp b/gv/gv0500.cpp new file mode 100755 index 000000000..14c69fcb1 --- /dev/null +++ b/gv/gv0500.cpp @@ -0,0 +1,741 @@ +#include "gv0.h" +#include "gv0500a.h" + +#include "gvlib.h" + +#include +#include +#include +#include + +#include +#include +#include + +/////////////////////////////////////////////////////////// +// Utilities +/////////////////////////////////////////////////////////// + +// Trasforma un codice tributo in sezione F24 +static char trib2sec(const TString& trib) +{ + const TString& sec = cache().get("%TRB", trib, "S6"); + return sec[0]; +} + +// Traformazione da codice sheet a codice tributo e viceversa +static const short ids[] = { F_ERARIO, F_INPS, 0 }; +static const char sec[] = { 'E', 'I', '\0' }; + +static char sheet2sec(short id) +{ + int i; + for (i = 0; ids[i] && ids[i] != id; i++); + return sec[i]; +} + +static short sec2sheet(char s) +{ + int i; + for (i = 0; sec[i] && sec[i] != s; i++); + return ids[i]; +} + +/////////////////////////////////////////////////////////// +// TF24_query_mask +/////////////////////////////////////////////////////////// + +class TF24_query_mask : public TAutomask +{ +protected: + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + +public: + TF24_query_mask() : TAutomask("gv0500a") {} +}; + +bool TF24_query_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + switch (o.dlg()) + { + case F_DISTINTA: + if (e == fe_button) + { + TArray_sheet sheet(-1, -1, 60, 20, TR("Distinte"), + HR("F24@6|Progr.|Data@10|Tipo|Codice|ABI@5|CAB@5")); + + TElencoF24_set delega(1); // Distinte non inviate + + const long abi = get_long(F_ABI); + const long cab = get_long(F_CAB); + const char tipo = get(F_TIPOINTEST)[0]; + const long f24 = atol(o.get()); + + long sel = 0; + for (bool ok = delega.move_first(); ok; ok = delega.move_next()) + { + const long dist = delega.get(F24_F24).as_int(); + bool keep = dist > 0; + if (keep && cab > 0) + keep = delega.get(F24_ABI).as_int()==abi && delega.get(F24_CAB).as_int()==cab; + if (keep && tipo > ' ') + keep = delega.get(F24_TIPOINTEST).as_string()[0] == tipo; + if (keep) + { + if (dist == f24) + sel = sheet.items(); + + TToken_string row; + row << dist; + row.add(delega.get(F24_PROGR).as_int()); + row.add(delega.get(F24_DATASCAD).as_string()); + row.add(delega.get(F24_TIPOINTEST).as_string()); + row.add(delega.get(F24_INTEST).as_string()); + row.add(delega.get(F24_ABI).as_string()); + row.add(delega.get(F24_CAB).as_string()); + sheet.add(row); + } + } + + if (sel > 0) + sheet.select(sel); + if (sheet.run() == K_ENTER) + { + TToken_string& row = sheet.row(); + set(F_DISTINTA, row.get_long(0)); + //set(F_PROGR, row.get_long(1)); + stop_run(K_AUTO_ENTER); + } + } + if (e == fe_modify) + { + TF24_set delega(atol(o.get())); + if (delega.move_first()) + set(F_PROGR, delega.get(F24_PROGR).as_int()); + } + break; + case F_PROGR: + if (e == fe_button) + { + // Metodo astuto come un cervo per ottenere le righe F24 non assegnate + TRigheF24_set riga(0x1); + + TArray_sheet sheet(-1, -1, -3, -3, TR("Righe"), + HR("@1|Progr.|Trib.|Data@10|Debito@15R|Credito@15R|Tipo|Codice|ABI@5|CAB@5")); + + const long abi = get_long(F_ABI); + const long cab = get_long(F_CAB); + const char tipo = get(F_TIPOINTEST)[0]; + const long f24 = atol(o.get()); + + for (bool ok = riga.move_first(); ok; ok = riga.move_next()) + { + bool keep = true; + if (keep && cab > 0) + keep = riga.get(F24_ABI).as_int()==abi && riga.get(F24_CAB).as_int()==cab; + if (keep && tipo > ' ') + keep = riga.get(F24_TIPOINTEST).as_string()[0] == tipo; + if (keep) + { + TToken_string row; + row = " "; + row.add(riga.get(F24_PROGR).as_int()); + row.add(riga.get(F24_TRIBUTO).as_string()); + row.add(riga.get(F24_DATASCAD).as_string()); + row.add(riga.get(F24_IMPORTODEB).as_string()); + row.add(riga.get(F24_IMPORTOCRE).as_string()); + row.add(riga.get(F24_TIPOINTEST).as_string()); + row.add(riga.get(F24_INTEST).as_string()); + row.add(riga.get(F24_ABI).as_string()); + row.add(riga.get(F24_CAB).as_string()); + sheet.add(row); + } + } + + if (sheet.run() == K_ENTER) + { + TToken_string& row = sheet.row(); + set(F_PROGR, row.get_long(1)); + set(F_DISTINTA, get_next_f24()); + stop_run(K_INS); + } + } + break; + default: + break; + } + return true; +} + +/////////////////////////////////////////////////////////// +// TF24_mask +/////////////////////////////////////////////////////////// + +class TF24_edit_mask : public TAutomask +{ +private: + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + +protected: + int find_empty_row(TSheet_field& s) const; + bool load_row(short id, const TRecordset& riga, int pos) const; + void link_tributo(TOperable_field& o); + void compute_total(short id, int rows); + +public: + bool add_row(const TRecordset& riga, int pos = -1); + void compute_totals(int mode = 0xFF); + + TF24_edit_mask() : TAutomask("gv0500b") {} +}; + +void TF24_edit_mask::compute_total(short id, int rows) +{ + TSheet_field& s = sfield(id); + TMask& m = s.sheet_mask(); + + const TMask_field* debito = m.find_by_fieldname(F24_IMPORTODEB); + const TMask_field* credito = m.find_by_fieldname(F24_IMPORTOCRE); + + const int posdeb = s.cid2index(debito->dlg()); + const int poscre = s.cid2index(credito->dlg()); + + const bool needs_update = s.items() < rows; + + real a, b; + for (int r = 0; r < rows; r++) + { + TToken_string& row = s.row(r); + a += real(row.get(posdeb)); + b += real(row.get(poscre)); + } + set(id+1, a); + set(id+2, b); + set(id+3, real(a-b)); + + if (needs_update) + s.force_update(); +} + +void TF24_edit_mask::compute_totals(int mode) +{ + if (mode & 1) + compute_total(F_ERARIO, 6); + + if (mode & 2) + compute_total(F_INPS, 4); + + real saldo; + saldo += get_real(F_ERARIO_AB); + saldo += get_real(F_INPS_CD); + set(F_SALDO, saldo); +} + +void TF24_edit_mask::link_tributo(TOperable_field& o) +{ + TSheet_field& sheet = *o.mask().get_sheet(); + const char sez[2] = { sheet2sec(sheet.dlg()), '\0' }; + + TString query = "USE RIGHEF24 KEY 2 SELECT 4->S6=#SEC"; + query << "\nJOIN %TRB INTO CODTAB==TRIBUTO"; + query << "\nTO PROGR=999999"; + TISAM_recordset delega(query); + delega.set_var("#SEC", TVariant(sez)); + + if (delega.items() > 0) + { + TCursor_sheet s(delega.cursor(), + " |PROGR|TRIBUTO|DATASCAD|IMPORTODEB|IMPORTOCRE|ABI|CAB|TIPOINTEST|INTEST", + TR("Righe disponibili"), + HR("@1|Progr.|Trib.|Data@10|Debito@15R|Credito@15R|ABI@5|CAB@5|Tipo|Codice"), + 0, 1); + + if (s.run() == K_ENTER) + { + if (!s.one_checked()) + s.check(s.selected()); + + TISAM_recordset riga("USE RIGHEF24\nFROM PROGR=#RIGA\nTO PROGR=#RIGA"); + for (TRecnotype i = 0; i < s.items(); i++) if (s.checked(i)) + { + const long progr = s.row(i).get_long(1); + riga.set_var("#RIGA", TVariant(progr)); + if (riga.move_first()) + { + const int pos = sheet.selected(); + add_row(riga, pos); + if (o.mask().is_running()) + sheet.update_mask(pos); + else + sheet.force_update(pos); + } + } + } + } + else + warning_box(TR("Non esistono righe F24 compatibili")); +} + +int TF24_edit_mask::find_empty_row(TSheet_field& s) const +{ + int i = 0; + for (i = 0; i < 6 && i < s.items(); i++) + { + const TToken_string& row = s.row(i); + if (row.empty_items()) + break; + } + return i; +} + +bool TF24_edit_mask::load_row(short id, const TRecordset& riga, int pos) const +{ + TSheet_field& s = sfield(id); + if (pos < 0 || pos >= 6) + pos = find_empty_row(s); + + bool ok = pos >= 0 && pos < 6; + if (ok) + { + TMask& m = s.sheet_mask(); + + TToken_string& row = s.row(pos); + row.cut(0); + FOR_EACH_MASK_FIELD(m, i, f) + { + const TFieldref* fr = f->field(); + if (fr != NULL) + { + const int j = s.cid2index(f->dlg()); + row.add(riga.get(fr->name()).as_string(), j); + } + } + } + + return ok; +} + +bool TF24_edit_mask::add_row(const TRecordset& riga, int pos) +{ + const TString& tributo = riga.get(F24_TRIBUTO).as_string(); + const char sec = trib2sec(tributo); + const short id = sec2sheet(sec); + bool ok = id > 0 && load_row(id, riga, pos); + if (!ok) + { + const long progr = riga.get(F24_PROGR).as_int(); + error_box(FR("Impossibile aggiungere la riga %ld (%s) alla delega"), + progr, (const char*)tributo); + } + return ok; +} + +bool TF24_edit_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + bool ok = true; + switch (o.dlg()) + { + case DLG_USER: + if (e == fe_button && jolly > 0) + link_tributo(o); + break; + case F_ERARIO: + switch (e) + { + case se_notify_modify: + case se_notify_del: + compute_totals(0x1); + break; + case se_query_add: + ok = false; + break; + default: + break; + } + break; + case F_INPS: + switch (e) + { + case se_notify_modify: + case se_notify_del: + compute_totals(0x2); + break; + case se_query_add: + ok = false; + break; + default: + break; + } + break; + default: + break; + } + + return ok; +} + +/////////////////////////////////////////////////////////// +// TF24_app +// TRelation_application molto all'avanguardia +// avendo un recorset filtrato come sorgente dati principale. +// Notare l'arguta implementazione dei metodi get_filtered_cursor +// e get_relation in modo far funzionare bene le ricerche +/////////////////////////////////////////////////////////// + +class TF24_app : public TRelation_application +{ + TPointer_array _progr; + TElencoF24_set* _recset; + TArray _msk; + +private: + int riscrivi(const TMask& mask); + void init_mask(TMask& mask) const; + +protected: + virtual bool user_create(); + virtual bool user_destroy(); + + virtual bool has_filtered_cursor() const { return _recset != NULL; } + virtual TCursor& get_filtered_cursor() const { return *_recset->cursor(); } + virtual TRelation* get_relation() const { return get_filtered_cursor().relation(); } + virtual bool get_next_key(TToken_string& key); + + virtual bool changing_mask(int mode) { return true; } + virtual TMask* get_mask(int mode); + virtual void init_query_mode(TMask& m); + virtual void init_insert_mode(TMask& m); + virtual void init_modify_mode(TMask& m); + virtual int read(TMask& m); + virtual int write(const TMask& mask); + virtual int rewrite(const TMask& mask); + virtual bool remove(); +}; + +bool TF24_app::user_create() +{ + _recset = new TElencoF24_set(1); // Elenco di tutti gli F24 da inviare + _msk.add(new TF24_query_mask); + _msk.add(new TF24_edit_mask); + set_search_field(F_DISTINTA); + + return _recset->cursor() != NULL; +} + +bool TF24_app::user_destroy() +{ + _msk.destroy(); + delete _recset; + return true; +} + +bool TF24_app::get_next_key(TToken_string& key) +{ + key.cut(0); + key.add(F_DISTINTA, 0); + key.add(get_next_f24(), 1); + return true; +} + + +TMask* TF24_app::get_mask(int mode) +{ + const int n = (mode == MODE_QUERY) ? 0 : 1; + return (TMask*)_msk.objptr(n); +} + +void TF24_app::init_mask(TMask& mask) const +{ + TF24_edit_mask& m = (TF24_edit_mask&)mask; + + char ti = m.get(F_TIPOINTEST)[0]; + long intest = m.get_long(F_PERSON); + TString codfis, ragsoc, key; + if (ti == 'C') + { + key.cut(0) << "C|" << intest; + const TRectype& cli = cache().get(LF_CLIFO, key); + codfis = cli.get(CLI_COFI); + ragsoc = cli.get(CLI_RAGSOC); + if (codfis.blank()) + codfis = cli.get(CLI_PAIV); + } + else + { + if (ti == 'D' || ti <= ' ') + { + ti = prefix().firm().get(NDT_TIPOA)[0]; + intest = prefix().firm().get_long(NDT_CODANAGR); + } + key.cut(0) << ti << '|' << intest; + const TRectype& anag = cache().get(LF_ANAG, key); + ragsoc = anag.get(ANA_RAGSOC); + codfis = anag.get(ANA_COFI); + if (codfis.blank()) + codfis = anag.get(ANA_PAIV); + } + + m.set(F_PERSON, intest); + m.set(F_COFI, codfis); + m.set(F_RAGSOC, ragsoc); + + m.compute_totals(); +} + +void TF24_app::init_query_mode(TMask& /*mask*/) +{ +} + +void TF24_app::init_insert_mode(TMask& mask) +{ + init_mask(mask); + + const TMask& q = *get_mask(MODE_QUERY); + const long progr = q.get_long(F_PROGR); + if (progr > 0) + { + TISAM_recordset riga("USE RIGHEF24\nFROM PROGR=#RIGA\nTO PROGR=#RIGA"); + riga.set_var("#RIGA", progr); + if (riga.move_first()) + { + TF24_edit_mask& m = (TF24_edit_mask&)mask; + m.add_row(riga); + } + } +} + +void TF24_app::init_modify_mode(TMask& mask) +{ + init_mask(mask); +} + +int TF24_app::read(TMask& mask) +{ + const int err = TRelation_application::read(mask); + + _progr.destroy(); // Azzera lista delle righe + + FOR_EACH_MASK_SHEET(mask, i, s) + s->destroy(); + + if (err == NOERR) + { + TF24_edit_mask& m = (TF24_edit_mask&)mask; + TF24_set delega(m.get_long(F_DISTINTA)); + for (bool ok = delega.move_first(); ok; ok = delega.move_next()) + { + if (m.add_row(delega)) + { + const long p = delega.get(F24_PROGR).as_int(); + _progr.add_long(p); // Tengo traccia delle righe lette + } + } + } + + return err; +} + +int TF24_app::riscrivi(const TMask& mask) +{ + TPointer_array righe; + + if (mask.sheets() > 0) // dummy test + { + // Compila la lista di tutte le righe F24 nella distinta corrente + FOR_EACH_MASK_SHEET(mask, i, s) + { + const TMask_field* friga = s->sheet_mask().find_by_fieldname(F24_PROGR); + const int pos = s->cid2index(friga->dlg()); + FOR_EACH_SHEET_ROW(*s, r, row) + { + const long progr = row->get_long(pos); + if (progr > 0) + righe.add_long(progr); + } + } + } + + TLocalisamfile righef24(LF_RIGHEF24); + + if (_progr.items() > 0) + { + // Scollega tutte le righe f24 ora non piu' presenti + for (int r = 0; r < _progr.items(); r++) + { + const long progr = _progr.get_long(r); + if (righe.find_long(progr) < 0) // Questa riga c'era prima ma ora non piu' + { + righef24.put("PROGR", progr); + int err = righef24.read(_isequal, _lock); + if (err == NOERR) + { + righef24.zero("F24"); + err = righef24.rewrite(); + } + if (err != NOERR) + error_box("Errore %d di scollegamento della riga %ld", err, progr); + } + } + } + + // Tenta eventuale rinumerazione della distinta + if (mask.insert_mode()) + { + righef24.setkey(2); + + long f24 = 0; + for (f24 = mask.get_long(F_DISTINTA); ; f24++) + { + righef24.zero(); + righef24.put("F24", f24); + int err = righef24.read(_isgreat); + if (err != NOERR || righef24.get_long("F24") != f24) + break; + } + ((TMask&)mask).set(F_DISTINTA, f24); // Aggiorna numero distinta + } + + // Mi preparo a numerare le eventuali righe nuove + long next_progr = get_next_progr_f24(); + + // Salva le righe F24 nella distinta corrente + FOR_EACH_MASK_SHEET(mask, i, s) + { + // Calcolo le posizioni dei campi importanti nella TToken_string + const TMask_field* frig = s->sheet_mask().find_by_fieldname(F24_PROGR); + const TMask_field* fdeb = s->sheet_mask().find_by_fieldname(F24_IMPORTODEB); + const TMask_field* fcre = s->sheet_mask().find_by_fieldname(F24_IMPORTOCRE); + const int pos_pro = s->cid2index(frig->dlg()); // Progressivo + const int pos_deb = s->cid2index(fdeb->dlg()); // Debito + const int pos_cre = s->cid2index(fcre->dlg()); // Credito + + // Scandisco le righe dello sheet + FOR_EACH_SHEET_ROW(*s, r, row) + { + const real deb = row->get(pos_deb); + const real cre = row->get(pos_cre); + const bool is_empty = deb.is_zero() && cre.is_zero(); + long progr = row->get_long(pos_pro); + int err = NOERR; + if (progr <= 0 && !is_empty) // E' una riga nuova con importi validi? + { + do + { + progr = next_progr++; + righef24.zero(); + righef24.put(F24_PROGR, progr); + righef24.put(F24_F24, mask.get(F_DISTINTA)); + err = righef24.write(); + } while (err == _isreinsert); + if (err != NOERR) + { + error_box(FR("Errore %d nell'inserimento righe F24"), err); + return err; + } + row->add(progr, pos_pro); // Aggiorno il progressivo nella riga nuova + } + if (progr > 0) // E' una riga da aggiornare? + { + righef24.zero(); + righef24.put(F24_PROGR, progr); + + if (is_empty) + { + err = righef24.remove(); + } + else + { + err = righef24.read(_isequal, _lock); + if (err == NOERR) + { + FOR_EACH_MASK_FIELD(s->sheet_mask(), i, f) + { + const TFieldref* fr = f->field(); + if (fr != NULL) + { + const int pos = s->cid2index(f->dlg()); + righef24.put(fr->name(), row->get(pos)); + } + } + + // Metto anche la roba di testata uguale per tutti + FOR_EACH_MASK_FIELD(mask, j, g) + { + const TFieldref* fr = g->field(); + if (fr != NULL) + righef24.put(fr->name(), g->get()); + } + + err = righef24.rewrite(); + } + } + if (err != NOERR) + { + error_box(FR("Errore %d nell'aggiornamento righe F24"), err); + return err; + } + } + } + } + + _recset->requery(); // Aggiorno la lista delle distinte + _progr = righe; // Forse verra' fatto comunque dalla prossima read + + // Sembra utile non passare in modifica della distinta successiva! + TRectype& rec = get_filtered_cursor().curr(); + rec.put(F24_F24, mask.get(F_DISTINTA)); + rec.zero(F24_PROGR); + get_filtered_cursor().read(); + + return NOERR; +} + +int TF24_app::write(const TMask& mask) +{ + _progr.destroy(); // Precauzione inutile? Chissa'! + return riscrivi(mask); +} + +int TF24_app::rewrite(const TMask& mask) +{ + return riscrivi(mask); +} + +// Azzera il campo F24 nelle righe della distinta corrente +bool TF24_app::remove() +{ + const long f24 = get_relation()->curr().get_long(F24_F24); + +/* + // Vecchio modo + TRectype rec(LF_RIGHEF24); + rec.put(F24_F24, f24); + + TCursor cur(get_relation(), "", 2, &rec, &rec); + const TRecnotype items = cur.items(); + cur.freeze(); + for (cur = 0; cur.pos() < items; ++cur) + { + cur.curr().zero(F24_F24); + cur.relation()->rewrite(); + } +*/ + // Lezione di stile + TF24_set cur(f24); + TRelation& rel = *cur.cursor()->relation(); + for (bool ok = cur.move_first(); ok; ok = cur.move_next()) + { + rel.curr().zero(F24_F24); + rel.rewrite(); + } + + return true; +} + +int gv0500(int argc, char* argv[]) +{ + TF24_app app; + app.run(argc, argv, "F24"); + return 0; +} + diff --git a/gv/gv0500a.h b/gv/gv0500a.h new file mode 100755 index 000000000..c6b85b350 --- /dev/null +++ b/gv/gv0500a.h @@ -0,0 +1,27 @@ +#define F_ABI 202 +#define F_CAB 203 +#define F_DESABI 204 +#define F_DESCAB 205 + +#define F_TIPOINTEST 211 +#define F_CLIFO 212 +#define F_PERSON 213 +#define F_DISTINTA 214 +#define F_PROGR 215 + +#define F_COFI 301 +#define F_RAGSOC 302 + +#define F_ERARIO 401 +#define F_ERARIO_A 402 +#define F_ERARIO_B 403 +#define F_ERARIO_AB 404 + +#define F_INPS 501 +#define F_INPS_C 502 +#define F_INPS_D 503 +#define F_INPS_CD 504 + +#define F_SALDO 999 + + diff --git a/gv/gv0500a.uml b/gv/gv0500a.uml new file mode 100755 index 000000000..e73f73907 --- /dev/null +++ b/gv/gv0500a.uml @@ -0,0 +1,115 @@ +#include "gv0500a.h" + +TOOLBAR "" 0 -2 0 2 +#include +ENDPAGE + +PAGE "F24" 0 0 0 -3 + +GROUPBOX DLG_NULL 78 5 +BEGIN + PROMPT 1 0 "@bSelezione" +END + +NUMBER F_ABI 5 +BEGIN + PROMPT 2 1 "ABI " + CHECKTYPE NORMAL + FLAGS "Z" +END + +NUMBER F_CAB 5 +BEGIN + PROMPT 2 2 "CAB " + USE BNP + JOIN %BAN ALIAS 883 INTO CODTAB==CODTAB[1,5] + JOIN %BAN ALIAS 884 INTO CODTAB==CODTAB + INPUT CODTAB[1,5] F_ABI + INPUT CODTAB[6,10] F_CAB + DISPLAY "ABI@5" CODTAB[1,5] + DISPLAY "CAB@5" CODTAB[6,10] + DISPLAY "Descrizione@50" 884@->S0 + OUTPUT F_ABI CODTAB[1,5] + OUTPUT F_CAB CODTAB[6,10] + OUTPUT F_DESABI 883@->S0 + OUTPUT F_DESCAB 884@->S0 + CHECKTYPE NORMAL + FLAGS "Z" +END + +STRING F_DESABI 70 50 +BEGIN + PROMPT 26 1 "" + FLAGS "D" +END + +STRING F_DESCAB 70 50 +BEGIN + PROMPT 26 2 "" + USE BNP KEY 2 + JOIN %BAN ALIAS 883 INTO CODTAB==CODTAB[1,5] + JOIN %BAN ALIAS 884 INTO CODTAB==CODTAB + INPUT S0 F_DESCAB + DISPLAY "Descrizione@50" 884@->S0 + DISPLAY "ABI@5" CODTAB[1,5] + DISPLAY "CAB@5" CODTAB[6,10] + COPY OUTPUT F_CAB + CHECKTYPE NORMAL +END + +LIST F_TIPOINTEST 1 10 +BEGIN + PROMPT 2 3 "Intestatario " + ITEM " |Tutti" MESSAGE HIDE,F_CLIFO|HIDE,F_PERSON + ITEM "D|Ditta" MESSAGE HIDE,F_CLIFO|HIDE,F_PERSON + ITEM "C|Cliente" MESSAGE SHOW,F_CLIFO|HIDE,F_PERSON + ITEM "F|Fisico" MESSAGE HIDE,F_CLIFO|SHOW,F_PERSON + ITEM "G|Giuridico" MESSAGE HIDE,F_CLIFO|SHOW,F_PERSON +END + +NUMBER F_CLIFO 6 +BEGIN + PROMPT 36 3 "" + USE LF_CLIFO + INPUT TIPOCF "C" + INPUT CODCF F_CLIFO + DISPLAY "Codice" CODCF + DISPLAY "Ragione Sociale@50" RAGSOC + OUTPUT F_CLIFO CODCF + CHECKTYPE NORMAL + ADD RUN cg0 -1 C +END + +NUMBER F_PERSON 6 +BEGIN + PROMPT 36 3 "" + USE LF_ANAG + INPUT TIPOA F_TIPOINTEST + INPUT CODANAGR F_PERSON + DISPLAY "Codice" CODANAGR + DISPLAY "Ragione Sociale@50" RAGSOC + OUTPUT F_PERSON CODANAGR + CHECKTYPE NORMAL + ADD RUN ba4 -1 #F_TIPOINTEST +END + +NUMBER F_DISTINTA 6 +BEGIN + PROMPT 2 5 "Distinta " + FIELD F24 + KEY 2 + FLAGS "B" + CHECKTYPE REQUIRED +END + +NUMBER F_PROGR 6 +BEGIN + PROMPT 22 5 "Progressivo " + FIELD PROGR + FLAGS "B" + KEY 1 +END + +ENDPAGE + +ENDMASK \ No newline at end of file diff --git a/gv/gv0500b.h b/gv/gv0500b.h new file mode 100755 index 000000000..edf94c855 --- /dev/null +++ b/gv/gv0500b.h @@ -0,0 +1,7 @@ +#define F_FILTER 101 +#define F_ABI 102 +#define F_CAB 103 +#define F_DESBAN 104 +#define F_TIPOINTEST 105 +#define F_CLIFO 106 +#define F_PERSON 107 diff --git a/gv/gv0500b.uml b/gv/gv0500b.uml new file mode 100755 index 000000000..6ea4a89d1 --- /dev/null +++ b/gv/gv0500b.uml @@ -0,0 +1,473 @@ +#include "gv0500a.h" + +TOOLBAR "" 0 -3 0 3 + +#include + +CURRENCY F_SALDO 15 +BEGIN + PROMPT 49 0 "@bSALDO FINALE " + FLAGS "D" +END + +ENDPAGE + +PAGE "Erario" 0 0 0 -3 + +GROUPBOX -1 78 4 +BEGIN + PROMPT 1 0 "AGENZIA DELLE ENTRATE" +END + +TEXT -1 +BEGIN + PROMPT 2 1 "@bMODELLO DI PAGAMENTO" +END + +TEXT -1 +BEGIN + PROMPT 2 2 "@bUNIFICATO" +END + +NUMBER F_DISTINTA 6 +BEGIN + PROMPT 16 2 "" + FLAGS "D" + FIELD F24 + KEY 2 +END + +NUMBER F_ABI 5 +BEGIN + PROMPT 24 1 "" + FLAGS "Z" + FIELD ABI + CHECKTYPE REQUIRED +END + +STRING F_DESABI 50 44 +BEGIN + PROMPT 32 1 "" + FLAGS "D" +END + +NUMBER F_CAB 5 +BEGIN + PROMPT 24 2 "" + USE BNP + JOIN %BAN ALIAS 883 INTO CODTAB==CODTAB[1,5] + JOIN %BAN ALIAS 884 INTO CODTAB==CODTAB + INPUT CODTAB[1,5] F_ABI + INPUT CODTAB[6,10] F_CAB + DISPLAY "ABI@5" CODTAB[1,5] + DISPLAY "CAB@5" CODTAB[6,10] + DISPLAY "Descrizione@50" 884@->S0 + OUTPUT F_ABI CODTAB[1,5] + OUTPUT F_CAB CODTAB[6,10] + OUTPUT F_DESABI 883@->S0 + OUTPUT F_DESCAB 884@->S0 + CHECKTYPE REQUIRED + FLAGS "Z" + FIELD CAB +END + +STRING F_DESCAB 50 44 +BEGIN + PROMPT 32 2 "" + USE BNP KEY 2 + JOIN %BAN ALIAS 883 INTO CODTAB==CODTAB[1,5] + JOIN %BAN ALIAS 884 INTO CODTAB==CODTAB + INPUT S0 F_DESCAB + DISPLAY "Descrizione@50" 884@->S0 + DISPLAY "ABI@5" CODTAB[1,5] + DISPLAY "CAB@5" CODTAB[6,10] + COPY OUTPUT F_CAB + CHECKTYPE SEARCH +END + +GROUPBOX -1 78 4 +BEGIN + PROMPT 1 4 "CONTRIBUENTE" +END + +LIST F_TIPOINTEST 1 10 +BEGIN + PROMPT 2 5 "Intestatario " + ITEM "D|Ditta" + ITEM "C|Cliente" + ITEM "F|Fisico" + ITEM "G|Giuridico" + FLAGS "D" + FIELD TIPOINTEST +END + +NUMBER F_PERSON 6 +BEGIN + PROMPT 32 5 "" + FIELD INTEST + FLAGS "D" +END + +STRING F_COFI 13 +BEGIN + PROMPT 47 5 "Codice fiscale " + FLAGS "D" +END + +STRING F_RAGSOC 50 58 +BEGIN + PROMPT 2 6 "Ragione sociale " + FLAGS "D" +END + +TEXT -1 +BEGIN + PROMPT 1 10 "@bSEZIONE ERARIO" +END + +SPREADSHEET F_ERARIO 0 8 +BEGIN + PROMPT 2 11 "Erario" + ITEM "cod.\ntrib.@4" + ITEM "rateazione\nreg./prov.@10" + ITEM "anno\nrif." + ITEM "importi a debito\nversati@18" + ITEM "importi a credito\ncompensati@18" + ITEM "riga@7" + ITEM "descrizione@50" +END + +CURRENCY F_ERARIO_A 15 +BEGIN + PROMPT 2 20 "@b(A) " + FLAGS "D" +END + +CURRENCY F_ERARIO_B 15 +BEGIN + PROMPT 26 20 "@b(B) " + FLAGS "D" +END + +CURRENCY F_ERARIO_AB 15 +BEGIN + PROMPT 50 20 "@bSaldo (A-B) " + FLAGS "D" +END + +ENDPAGE + +PAGE "INPS/Regioni" -1 -1 0 0 + +TEXT -1 +BEGIN + PROMPT 1 0 "@bSEZIONE INPS" +END + +SPREADSHEET F_INPS 0 6 +BEGIN + PROMPT 2 1 "INPS" + ITEM "codice\nsede" + ITEM "caus.\ncontr.@5" + ITEM "matricola INPS\ncodice INPS" + ITEM "da mm/aaaa" + ITEM "a mm/aaaa" + ITEM "importi\na debito@15" + ITEM "importi\na credito@15" + ITEM "riga@7" +END + +CURRENCY F_INPS_C 15 +BEGIN + PROMPT 2 8 "@b(C) " + FLAGS "D" +END + +CURRENCY F_INPS_D 15 +BEGIN + PROMPT 26 8 "@b(D) " + FLAGS "D" +END + +CURRENCY F_INPS_CD 15 +BEGIN + PROMPT 50 8 "@bSaldo (C-D) " + FLAGS "D" +END + +ENDPAGE + +ENDMASK + +PAGE "Erario" -1 -1 68 6 + +TEXT -1 +BEGIN + PROMPT 1 0 "codice" +END + +TEXT -1 +BEGIN + PROMPT 1 1 "tributo" +END + +STRING 101 4 +BEGIN + PROMPT 1 2 "" + USE %TRB SELECT S6=="E" + INPUT CODTAB 101 + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@70" S0 + OUTPUT 101 CODTAB + CHECKTYPE REQUIRED + FIELD TRIBUTO +END + +TEXT -1 +BEGIN + PROMPT 9 0 "rateazione" +END + +TEXT -1 +BEGIN + PROMPT 9 1 "reg./prov." +END + +STRING 102 8 +BEGIN + PROMPT 9 2 "" +END + +TEXT -1 +BEGIN + PROMPT 19 1 "anno" +END + +NUMBER 103 4 +BEGIN + PROMPT 19 2 "" + FIELD ANNO +END + +TEXT -1 +BEGIN + PROMPT 25 0 "importi a debito" +END + +TEXT -1 +BEGIN + PROMPT 25 1 "versati" +END + +CURRENCY 104 15 +BEGIN + PROMPT 25 2 "" + FIELD IMPORTODEB +END + +TEXT -1 +BEGIN + PROMPT 45 0 "importi a credito" +END + +TEXT -1 +BEGIN + PROMPT 45 1 "compensati" +END + +CURRENCY 105 15 +BEGIN + PROMPT 45 2 "" + FIELD IMPORTOCRE +END + +NUMBER 106 7 +BEGIN + PROMPT 1 4 "riga " + FLAGS "D" + FIELD PROGR +END + +STRING 107 50 +BEGIN + PROMPT 10 4 "" + FIELD DESCR +END + +BUTTON DLG_USER 10 2 +BEGIN + PROMPT -14 -1 "" + PICTURE BMP_LINK +END + +BUTTON DLG_DELREC 10 2 +BEGIN + PROMPT -24 -1 "" +END + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -34 -1 "" +END + +BUTTON DLG_CANCEL 10 2 +BEGIN + PROMPT -44 -1 "" +END + +ENDPAGE + +ENDMASK + +PAGE "INPS" -1 -1 78 9 + +TEXT -1 +BEGIN + PROMPT 1 0 "codice" +END + +TEXT -1 +BEGIN + PROMPT 1 1 "sede" +END + +STRING 101 4 +BEGIN + PROMPT 1 2 "" + FIELD SEDE +END + +TEXT -1 +BEGIN + PROMPT 10 0 "causale" +END + +TEXT -1 +BEGIN + PROMPT 10 1 "contr." +END + +STRING 102 4 +BEGIN + PROMPT 10 2 "" + USE %TRB SELECT S6=="I" + INPUT CODTAB 101 + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@70" S0 + OUTPUT 101 CODTAB + CHECKTYPE REQUIRED + FIELD TRIBUTO +END + +TEXT -1 +BEGIN + PROMPT 21 0 "matricola INPS" +END + +TEXT -1 +BEGIN + PROMPT 21 1 "codice INPS" +END + +STRING 103 17 +BEGIN + PROMPT 19 2 "" + FIELD MATRICOLA +END + +TEXT -1 +BEGIN + PROMPT 40 0 "periodo di riferimento" +END + +TEXT -1 +BEGIN + PROMPT 40 1 "da mm/aaaa" +END + +NUMBER 104 6 +BEGIN + PROMPT 48 2 "" + FIELD PERIODODA +END + +TEXT -1 +BEGIN + PROMPT 48 1 "a mm/aaaa" +END + +NUMBER 105 6 +BEGIN + PROMPT 40 2 "" + FIELD PERIODOA +END + +TEXT -1 +BEGIN + PROMPT 1 3 "importi a debito" +END + +TEXT -1 +BEGIN + PROMPT 1 4 "versati" +END + +CURRENCY 106 15 +BEGIN + PROMPT 1 5 "" + FIELD IMPORTODEB +END + +TEXT -1 +BEGIN + PROMPT 18 3 "importi a credito" +END + +TEXT -1 +BEGIN + PROMPT 18 4 "compensati" +END + +CURRENCY 107 15 +BEGIN + PROMPT 18 5 "" + FIELD IMPORTOCRE +END + +NUMBER 108 7 +BEGIN + PROMPT 1 7 "riga " + FIELD PROGR + FLAGS "D" +END + +STRING 109 50 +BEGIN + PROMPT 10 7 "" + FIELD DESCR +END + +BUTTON DLG_USER 10 2 +BEGIN + PROMPT -14 -1 "" + PICTURE BMP_LINK +END + +BUTTON DLG_DELREC 10 2 +BEGIN + PROMPT -24 -1 "" +END + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -34 -1 "" +END + +BUTTON DLG_CANCEL 10 2 +BEGIN + PROMPT -44 -1 "" +END + +ENDPAGE + +ENDMASK diff --git a/gv/gv0600.cpp b/gv/gv0600.cpp new file mode 100755 index 000000000..ca30bbecb --- /dev/null +++ b/gv/gv0600.cpp @@ -0,0 +1,1033 @@ +#include "gv0.h" +#include "gv0600a.h" +#include "gvlib.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +/////////////////////////////////////////////////////////// +// TF24_textset +/////////////////////////////////////////////////////////// + +class TF24_textset : public TAS400_recordset +{ + TAssoc_array _contatori; + real _totale_positivi; + +protected: + long add_count(const char* type, long n = 1); + +protected: + void add_field(const char* trc, int from, int to, bool req = false, char tipo = 'a', + const char* name = "Filler", const char* def = NULL); + +public: + virtual TRecnotype new_rec(const char* tipo); + virtual bool destroy(TRecnotype r); + virtual const TString& rec_type(TRecnotype r = -1) const; + virtual bool set(const char* field, const TVariant& v); + + TRecnotype get_count(const char* tipo) const; + real & totale_positivi() { return _totale_positivi;} + + TF24_textset(const char* query = ""); +}; + +/////////////////////////////////////////////////////////// +// TF24_sender +/////////////////////////////////////////////////////////// + +class TF4_sender : public TSkeleton_application +{ + TF24_textset* _f24; + TLog_report* _log; + bool _errors_logged; + +protected: + bool new_rec(const char* t) { CHECK(t && *t, "Tipo non valido"); return _f24->new_rec(t) > 0; } + void set(const char* field, const TVariant& var); + void set(const char* field, const int n) { set(field, TVariant((long)n)); } + void set(const char* field, const char* s) { set(field, TVariant(s)); } + void set(const char* field, const TDate& d) { set(field, TVariant(d)); } + void set(const char* field, const real& v) { set(field, TVariant(v)); } + + char trib2sec(const TString& tributo); + void split_ragsoc(const TString& ragsoc, bool bPhysical, TString& cognome, TString& nome) const; + + void add_header(const TMask& m); + void add_10_20(const TRecordset& riga, const TMask& m); + void add_erario(TRecordset& riga, real& saldo_tot, real& credito_tot); + void add_inps(TRecordset& riga, real& saldo_tot, real& credito_tot); + void add_50(TRecordset& riga, const real& saldo_tot, const real& credito_tot, const TMask& m); + void add_delega(long nDelega, const TMask& m); + void add_footer(const TMask& m); + bool set_data_versamento(long nDelega, const TDate& datavers); + +public: + void log(int sev, const char* msg); + + virtual void main_loop(); + TF4_sender() {} +}; + +TF4_sender& app() { return (TF4_sender&)main_app(); } + +/////////////////////////////////////////////////////////// +// TF24_textset +/////////////////////////////////////////////////////////// + +long TF24_textset::add_count(const char* type, long i) +{ + TString4 tipo; tipo.strncpy(type, 2); + + CHECK(strlen(tipo) == 2, "Tipo record non valido"); + real* n = (real*)_contatori.objptr(tipo); + if (n == NULL) + { + n = new real; + _contatori.add(tipo, n); + } + *n += i; + return n->integer(); +} + +TRecnotype TF24_textset::get_count(const char* tipo) const +{ + long i = 0; + if (tipo && *tipo) + { + CHECK(strlen(tipo) == 2, "Tipo record non valido"); + real* n = (real*)_contatori.objptr(tipo); + if (n != NULL) + i = n->integer(); + } + else + i = items(); + return i; +} + +TRecnotype TF24_textset::new_rec(const char* tipo) +{ + CHECK(tipo && *tipo, "Tipo record nullo"); + + const TRecnotype n = TAS400_recordset::new_rec(tipo); + if (n >= 0) + { + add_count(tipo); + if (strlen(tipo) == 5) + { + TString& str = row(n); + str.overwrite(tipo+3, 10); + } + } + return n; +} + +const TString& TF24_textset::rec_type(TRecnotype r) const +{ + const TString& t = TAS400_recordset::rec_type(r); + if (t == "40" || t == "50") + { + TString& tmp = get_tmp_string(); + tmp << t << '-' << row(r).mid(10, 2); // TIPO-SUBTIPO + return tmp; + } + return t; +} + +bool TF24_textset::destroy(TRecnotype r) +{ + const bool ok = TAS400_recordset::destroy(r); + if (ok) + { + if (r >= 0) + { + const TString& t = TAS400_recordset::rec_type(r); // Igora subtipo record! + add_count(t, -1); + } + else + _contatori.destroy(); + } + return ok; +} + +void TF24_textset::add_field(const char* trc, int from, int to, bool required, + char tipo, const char* name, const char* def) +{ + CHECK(trc && *trc, "Tracciato nullo"); + TString80 fname; fname << trc << '.' << name; + + const TFieldtypes t = tipo == 'n' ? _longzerofld : _alfafld; + const int pos = from - 1; + const int len = to >= from ? to-from+1 : record_length()-pos; + if (def && *def) + { + CHECKS(def == NULL || (int)strlen(def) <= len, "Invalid default value ", def); + TVariant var(def); var.convert_to(t); + create_field(fname, pos, len, t, required, var); + } + else + create_field(fname, pos, len, t, required); +} + +bool TF24_textset::set(const char* field, const TVariant& var) +{ + const char* err = NULL; + int c = -1; + const TAS400_column_info* info = parse_field(field, c, false); + bool ok = info != NULL; + if (ok) + { + switch (var.type()) + { + case _datefld: + if (var.is_zero()) + ok = set_field(*info, NULL_VARIANT); + else + { + long ansi = 0; + const TDate d = var.as_date(); + if (info->_width == 6) + ansi = d.day()*10000 + d.month()*100 + d.year()%100; + else + ansi = d.date2ansi(); + ok = set_field(*info, TVariant(ansi)); + } + break; + case _realfld: + if (var.is_zero()) + ok = set_field(*info, NULL_VARIANT); + else + { + real v = var.as_real(); v *= CENTO; + ok = set_field(*info, TVariant(v.integer())); + } + break; + default: + ok = set_field(*info, var); + break; + } + if (!ok) + err = TR("Campo obbligatorio non compilato"); + } + else + err = TR("Campo non riconosciuto"); + + if (err != NULL) + { + TString msg; + msg << field << ": " << err; + app().log(2, msg); + } + return ok; +} + +TF24_textset::TF24_textset(const char* query) + : TAS400_recordset(TString("AS400(120,2,1)\n") << query) +{ + const char an = 'a'; + const char n = 'n'; + const bool o = true; + const bool f = false; + + add_field("F4", 1, 1); + add_field("F4", 2, 3, o, an, "TipoRecord", "F4"); + add_field("F4", 4, 8, o, an, "Mittente"); + add_field("F4", 9, 13, o, n, "Ricevente"); + add_field("F4", 14, 19, o, n, "DataCreazione"); + add_field("F4", 20, 39, o, an, "NomeSupporto"); + add_field("F4", 40, 45, f, an, "Riferimenti"); + add_field("F4", 46,104); + add_field("F4",105,105, o, an, "TipoFlusso", "2"); + add_field("F4",106,106, o, an, "QualificatoreFlusso", "$"); + add_field("F4",107,111, o, an, "SoggettoVeicolatore"); + add_field("F4",112,113); + add_field("F4",114,114, o, an, "CodiceDivisa", "E"); + add_field("F4",115,120); + + add_field("EF", 1, 1); + add_field("EF", 2, 3, o, an, "TipoRecord", "EF"); + add_field("EF", 4, 8, o, an, "Mittente"); + add_field("EF", 9, 13, o, n, "Ricevente"); + add_field("EF", 14, 19, o, n, "DataCreazione"); + add_field("EF", 20, 39, o, an, "NomeSupporto"); + add_field("EF", 40, 45, f, an, "Riferimenti"); + add_field("EF", 46, 52, o, n, "NumeroDisposizioni"); + add_field("EF", 53, 67, o, n, "TotImportiPositivi"); + add_field("EF", 68, 82, o, n, "TotImportiNegativi"); + add_field("EF", 83, 89, o, n, "NumeroRecord"); + add_field("EF", 90,113); + add_field("EF",114,114, o, an, "CodiceDivisa", "E"); + add_field("EF",115,120); + + add_field("10", 1, 1); + add_field("10", 2, 3, o, an, "TipoRecord", "10"); + add_field("10", 4, 10, o, n, "ProgressivoDelega"); + add_field("10", 11, 26, o, an, "CodiceFiscale"); + add_field("10", 27, 50, o, an, "Cognome"); + add_field("10", 51, 70, f, an, "Nome"); + add_field("10", 71, 71, f, an, "Sesso"); + add_field("10", 72, 96, f, an, "ComuneNascita"); + add_field("10", 97, 98, f, an, "ProvinciaNascita"); + add_field("10", 99,106, f, n, "DataNascita"); + add_field("10",107,113, o, n, "ProtocolloDelega"); + add_field("10",114,120); + + add_field("20", 1, 1); + add_field("20", 2, 3, o, an, "TipoRecord", "20"); + add_field("20", 4, 10, o, n, "ProgressivoDelega"); + add_field("20", 11, 35, o, an, "Comune"); + add_field("20", 36, 37, o, an, "Provincia"); + add_field("20", 38, 72, o, an, "Indirizzo"); + add_field("20", 73, 80, o, n, "DataPagamento"); + add_field("20", 81, 81, f, n, "FlagAnnoImposta"); // non sarebbe f, ma 0 e' valido + add_field("20", 82,120); + + add_field("40-01", 1, 1); + add_field("40-01", 2, 3, o, an, "TipoRecord", "40"); + add_field("40-01", 4, 10, o, n, "ProgressivoDelega"); + add_field("40-01", 11, 12, o, an, "SubtipoRecord", "01"); + add_field("40-01", 13, 14, o, n, "ProgressivoTributo"); + add_field("40-01", 15, 18, o, an, "CodiceTributo"); + add_field("40-01", 19, 26, o, an, "RiferimentiTributo"); + add_field("40-01", 27, 41, f, n, "ImportoDebito"); // non sarebbe f, ma 0 e' valido + add_field("40-01", 42, 56, f, n, "ImportoCredito"); // non sarebbe f, ma 0 e' valido + add_field("40-01", 57, 59, f, an, "CodiceUfficio"); + add_field("40-01", 60, 70, f, n, "CodiceAtto"); + add_field("40-01", 71,120); + + add_field("40-02", 1, 1); + add_field("40-02", 2, 3, o, an, "TipoRecord", "40"); + add_field("40-02", 4, 10, o, n, "ProgressivoDelega"); + add_field("40-02", 11, 12, o, an, "SubtipoRecord", "02"); + add_field("40-02", 13, 27, f, n, "TotaleDebito"); // non sarebbe f, ma 0 e' valido + add_field("40-02", 28, 42, f, n, "TotaleCredito"); // non sarebbe f, ma 0 e' valido + add_field("40-02", 43, 43, o, an, "SegnoSezione"); + add_field("40-02", 44, 58, f, n, "SaldoSezione"); + add_field("40-02", 59,120); + + add_field("40-03", 1, 1); + add_field("40-03", 2, 3, o, an, "TipoRecord", "40"); + add_field("40-03", 4, 10, o, n, "ProgressivoDelega"); + add_field("40-03", 11, 12, o, an, "SubtipoRecord", "03"); + add_field("40-03", 13, 14, o, n, "ProgressivoContributo"); + add_field("40-03", 15, 18, o, n, "CodiceSede"); + add_field("40-03", 19, 22, o, an, "CausaleContributo"); + add_field("40-03", 23, 39, o, an, "MatricolaINPS"); + add_field("40-03", 40, 45, o, n, "PeriodoInizio"); + add_field("40-03", 46, 51, f, n, "PeriodoFine"); + add_field("40-03", 52, 66, f, n, "ImportoDebito"); // non sarebbe f, ma 0 e' valido + add_field("40-03", 67, 81, f, n, "ImportoCredito"); // non sarebbe f, ma 0 e' valido + add_field("40-03", 82,120); + + add_field("40-04", 1, 1); + add_field("40-04", 2, 3, o, an, "TipoRecord", "40"); + add_field("40-04", 4, 10, o, n, "ProgressivoDelega"); + add_field("40-04", 11, 12, o, an, "SubtipoRecord", "04"); + add_field("40-04", 13, 27, f, n, "TotaleDebito"); // non sarebbe f, ma 0 e' valido + add_field("40-04", 28, 42, f, n, "TotaleCredito"); // non sarebbe f, ma 0 e' valido + add_field("40-04", 43, 43, o, an, "SegnoSezione"); + add_field("40-04", 44, 58, f, n, "SaldoSezione"); + add_field("40-04", 59,120); + + add_field("50-01", 1, 1); + add_field("50-01", 2, 3, o, an, "TipoRecord", "50"); + add_field("50-01", 4, 10, o, n, "ProgressivoDelega"); + add_field("50-01", 11, 12, o, an, "SubtipoRecord", "01"); + add_field("50-01", 13, 17, o, n, "BancaPassiva"); + add_field("50-01", 18, 22, o, n, "SportelloPassivo"); + add_field("50-01", 23, 34, o, n, "ContoAddebito"); + add_field("50-01", 35, 35, f, an, "Cin"); + add_field("50-01", 36, 50, f, n, "SaldoFinale"); + add_field("50-01", 51, 51, f, n, "FlagFirmatario"); + add_field("50-01", 52, 53); + add_field("50-01", 54, 69, o, an, "CodiceFiscale"); + add_field("50-01", 70, 70, o, n, "TitolarePagamento"); + add_field("50-01", 71, 78, o, n, "DataPagamento"); + add_field("50-01", 79, 93, f, n, "TotaleImportiCredito"); + add_field("50-01", 94, 95); + add_field("50-01", 96, 96, o, n, "CodiceIndividuale", "3"); + add_field("50-01", 97,120); + + add_field("50-02", 1, 1); + add_field("50-02", 2, 3, o, an, "TipoRecord", "50"); + add_field("50-02", 4, 10, o, n, "ProgressivoDelega"); + add_field("50-02", 11, 12, o, an, "SubtipoRecord", "02"); + add_field("50-02", 13, 28, o, an, "CodiceFiscaleMittente"); + add_field("50-02", 29, 32); + add_field("50-02", 33, 37, o, n, "ABI"); + add_field("50-02", 38, 42, o, n, "CAB"); + add_field("50-02", 43, 62, f, an, "CodiceClienteBancario"); + add_field("50-02", 63, 63, o, an, "DestinatarioStampa", "1"); + add_field("50-02", 64,108, o, an, "Denominazione"); + add_field("50-02",109,120); + +} + +/////////////////////////////////////////////////////////// +// TF4_mask +/////////////////////////////////////////////////////////// + +class TF24_mask : public TAutomask +{ + clock_t _next_update; + bool _updating; + +private: + bool apply_filter(const TRecordset& righe) const; + void update_sheet(); + void invalidate_sheet(); + void serialize(bool bSave); + +protected: + virtual void on_idle(); + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + +public: + TF24_mask(); + ~TF24_mask(); +}; + +bool TF24_mask::apply_filter(const TRecordset& righe) const +{ + const TDate dal = get(F_DATA_DA); + const TDate al = get(F_DATA_AL); + if (dal.ok() || al.ok()) + { + const TDate scad = righe.get("DATASCAD").as_date(); + if ((dal.ok() && scad < dal) || (al.ok() && scad > al)) + return false; + } + + const long abi = get_long(F_ABI); + const long cab = get_long(F_CAB); + if (abi > 0 || cab > 0) + { + const long rabi = righe.get("ABI").as_int(); + const long rcab = righe.get("CAB").as_int(); + if ((abi > 0 && abi != rabi) || (cab > 0 && cab != rcab)) + return false; + } + + const char tipoint = get(F_TIPOINTEST)[0]; + if (tipoint > ' ') + { + const char rtipoint = righe.get("TIPOINTEST").as_string()[0]; + if (tipoint != rtipoint) + return false; + + long codint = 0; + switch (tipoint) + { + case 'C': codint = get_long(F_CLIFO); break; + case 'F': + case 'G': codint = get_long(F_PERSON); break; + default : break; + } + if (codint != 0) + { + const long rcodint = righe.get("INTEST").as_int(); + if (codint != rcodint) + return false; + } + } + + return true; +} + +void TF24_mask::update_sheet() +{ + if (!_updating) + { + _updating = true; + _next_update = 0; + + TSheet_field& s = sfield(F_DISTINTE); + TMask& m = s.sheet_mask(); + + s.destroy(); + + int flags = 1; + switch (get(F_FILTER)[0]) + { + case 'Q': flags = 0; break; // Tutte + case 'I': flags = 2; break; // Inviate + default : flags = 1; break; // Da inviare + } + + TElencoF24_set righe(flags); + TProgind pi(righe.items(), "Lettura F24", true, true); + for (bool ok = righe.move_first(); ok; ok = righe.move_next()) + { + if (apply_filter(righe)) + { + TToken_string& row = s.row(-1); + for (int i = m.fields()-1; i > 0; i--) + { + const TMask_field& f = m.fld(i); + const TFieldref* fr = f.field(); + if (fr != NULL) + { + const int pos = s.cid2index(f.dlg()); + row.add(righe.get(fr->name()).as_string(), pos); + } + } + } + } + + s.force_update(); + _updating = false; + } +} + +void TF24_mask::invalidate_sheet() +{ + _next_update = clock()+CLOCKS_PER_SEC/2; // Aspetta mezzo secondo! +} + +void TF24_mask::on_idle() +{ + // Aggiorna lo sheet, ma non troppo spesso! + if (_next_update != 0 && !_updating && clock() > _next_update) + update_sheet(); +} + +bool TF24_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + bool ok = true; + switch (o.dlg()) + { + case F_FILTER: + case F_DATA_DA: + case F_DATA_AL: + case F_ABI: + case F_CAB: + case F_TIPOINTEST: + case F_CLIFO: + case F_PERSON: + if (e == fe_modify) + invalidate_sheet(); + break; + case F_DISTINTE: + switch (e) + { + case fe_init: + update_sheet(); + break; + case se_query_modify: + case se_query_add: + case se_query_del: + ok = false; + default: + break; + } + break; + default: + break; + } + return ok; +} + +void TF24_mask::serialize(bool bSave) +{ + const char* defpar = "gv"; + TConfig ini(CONFIG_DITTA, defpar); + for (int i = fields()-1; i >= 0; i--) + { + TMask_field& f = fld(i); + const TFieldref* fr = f.field(); + if (fr != NULL) + { + if (bSave) + fr->write(ini, defpar, f.get()); + else + f.set(fr->read(ini, defpar)); + } + } +} + +TF24_mask::TF24_mask() + : TAutomask("gv0600a"), _updating(false), _next_update(0) +{ + serialize(false); +} + +TF24_mask::~TF24_mask() +{ + serialize(true); +} + +/////////////////////////////////////////////////////////// +// TF4_sender +/////////////////////////////////////////////////////////// + +void TF4_sender::log(int sev, const char* msg) +{ + if (sev > 0) + { + TString m; + m << TR("Record") << ' ' << _f24->rec_type() << ": " << msg; + _log->log(sev, m); + _errors_logged = true; + } + else + _log->log(sev, msg); +} + +void TF4_sender::set(const char* field, const TVariant& var) +{ + _f24->set(field, var); +} + +void TF4_sender::add_header(const TMask& m) +{ + new_rec("F4"); + set("Mittente", m.get(F_MITTENTE)); + set("Ricevente", m.get(F_ABI)); + set("DataCreazione", m.get_date(F_DATA)); + set("NomeSupporto", m.get(F_FILE)); // Somma dei tre campi precedenti + set("SoggettoVeicolatore", m.get(F_MITTENTE)); +} + +void TF4_sender::split_ragsoc(const TString& ragsoc, bool bPhysical, + TString& cognome, TString& nome) const +{ + const int maxc = 24, maxn = 20; // Sarebbe bello prenderli dal tracciato, ma ... + if (bPhysical) + { + TParagraph_string rs(ragsoc, maxc); + cognome = rs.get(); + nome = ragsoc.mid(30); + if (nome.len() > maxn) + { + TParagraph_string rs(nome, maxn); + nome = rs.get(); + } + } + else + { + TParagraph_string rs(ragsoc, maxc+maxn); + cognome = rs.get(); + nome = cognome.mid(maxc); + cognome.cut(maxc); + } + CHECKS(cognome.len()<=maxc && nome.len()<=maxn, "Ragsoc balorda", (const char*)ragsoc); +} + +void TF4_sender::add_10_20(const TRecordset& riga, const TMask& m) +{ + const char tipointest = riga.get("TIPOINTEST").as_string()[0]; + const long intest = riga.get("INTEST").as_int(); + + TString80 codfis, ragsoc; + + char tipoa = tipointest; + long codanagr = intest; + + TString16 key; + + if (tipointest == 'C') + { + key.cut(0) << "C|" << intest; + const TRectype& cli = cache().get(LF_CLIFO, key); + codfis = cli.get(CLI_COFI); + ragsoc = cli.get(CLI_RAGSOC); + + tipoa = cli.get_char(CLI_TIPOAPER); + codanagr = cli.get_long(CLI_CODANAGPER); + if (codfis.blank()) + codfis = cli.get(CLI_PAIV); + } + else + { + if (tipoa == 'D') + { + tipoa = prefix().firm().get(NDT_TIPOA)[0]; + codanagr = prefix().firm().get_long(NDT_CODANAGR); + } + key.cut(0) << tipoa << '|' << codanagr; + const TRectype& anag = cache().get(LF_ANAG, key); + ragsoc = anag.get(ANA_RAGSOC); + codfis = anag.get(ANA_COFI); + if (codfis.blank()) + codfis = anag.get(ANA_PAIV); + } + + ///////////////////////////////////////////////////////// + // Tipo record 10 + ///////////////////////////////////////////////////////// + + const long nProgr = _f24->get_count("10")+1; // Sfrutto il suo contatore! + if (new_rec("10")) + { + set("ProgressivoDelega", nProgr); + set("CodiceFiscale", codfis); + + TString80 cognome, nome; + split_ragsoc(ragsoc, tipoa == 'F', cognome, nome); + set("Cognome", cognome); + set("Nome", nome); + + if (tipoa == 'F' && codanagr > 0) + { + const TRectype& anf = cache().get(LF_ANAGFIS, codanagr); + set("Sesso", anf.get(ANF_SESSO)); + const TString4 comnasc = anf.get(ANF_COMNASC); + set("ComuneNascita", comnasc); + if (comnasc < "Z") // Nato in Italia + { + key = " |"; key << comnasc; + const TRectype& com = cache().get(LF_COMUNI, key); + set("ProvinciaNascita", com.get(COM_PROVCOM)); + } + else + set("ProvinciaNascita", "EE"); + } + } + + ///////////////////////////////////////////////////////// + // Tipo record 20 + ///////////////////////////////////////////////////////// + if (new_rec("20")) + { + set("ProgressivoDelega", nProgr); + set("DataPagamento", m.get_date(F_DATAPAG)); + + TString80 indirizzo; + if (tipointest == 'C') + { + key.cut(0) << "C|" << intest; + const TRectype& cli = cache().get(LF_CLIFO, key); + key.cut(0) << cli.get(CLI_STATOCF) << '|' << cli.get(CLI_COMCF); + + indirizzo << cli.get(CLI_INDCF) << ' ' << cli.get(CLI_CIVCF) + << ' ' << cli.get(CLI_LOCCF); + + } else + if (tipoa == 'F' || tipoa == 'G') + { + key.cut(0) << tipoa << '|' << codanagr; + const TRectype& anag = cache().get(LF_ANAG, key); + + key.cut(0) << anag.get(ANA_STATORES) << '|' << anag.get(ANA_COMRES); + indirizzo << anag.get(ANA_INDRES) << ' ' << anag.get(ANA_CIVRES); + } + + const TRectype& com = cache().get(LF_COMUNI, key); + set("Comune", com.get(COM_DENCOM)); + set("Provincia", com.get(COM_PROVCOM)); + + TParagraph_string ind(indirizzo, 35); + set("Indirizzo", ind.get()); // Salva i primi 35 caratteri dell'indirizzo + } +} + +char TF4_sender::trib2sec(const TString& tributo) +{ + const char* err = NULL; + char sec = ' '; + const TRectype& trb = cache().get("%TRB", tributo); + if (trb.empty()) + { + err = TR("Non presente in tabella"); + } + else + { + sec = toupper(trb.get_char("S6")); + if (!isalpha(sec)) + err = TR("Sezione F24 non valida"); + } + if (err) + { + TString msg; + msg << TR("Codice tributo") << " (" << tributo << ") :" << err; + log(2, msg); + } + return sec; +} + + +void TF4_sender::add_erario(TRecordset& riga, real& saldo_tot, real& credito_tot) +{ + const long nProgDelega = _f24->get_count("10"); + + int nProgr = 0; + real debito, credito; + + for (bool ok = riga.move_first(); ok ; ok = riga.move_next()) + { + const TString4 tributo = riga.get("TRIBUTO").as_string(); + const char sezione = trib2sec(tributo); + if (sezione == 'E') + { + if (new_rec("40-01")) + { + set("ProgressivoDelega", nProgDelega); + set("ProgressivoTributo", ++nProgr); + set("CodiceTributo", tributo); + + const real d = riga.get("IMPORTODEB").as_real(); + set("ImportoDebito", d); + debito += d; + + const real c = riga.get("IMPORTOCRED").as_real(); + set("ImportoCredito", c); + credito += c; + + if (nProgr > 6) + log(2, "Numero eccessivo di righe nella sezione Erario"); + } + } + } + + const real saldo = debito-credito; + if (nProgr > 0 && new_rec("40-02")) + { + set("ProgressivoDelega", nProgDelega); + set("TotaleDebito", debito); + set("TotaleCredito", credito); + set("SegnoSezione", saldo < ZERO ? "N" : "P"); + set("SaldoSezione", saldo < ZERO ? -saldo : saldo); + } + + saldo_tot += saldo; + credito_tot += credito; +} + +void TF4_sender::add_inps(TRecordset& riga, real& saldo_tot, real& credito_tot) +{ + const long nProgDelega = _f24->get_count("10"); + + int nProgr = 0; + real debito, credito; + + for (bool ok = riga.move_first(); ok ; ok = riga.move_next()) + { + const TString4 tributo = riga.get("TRIBUTO").as_string(); + const char sezione = trib2sec(tributo); + if (sezione == 'I') + { + if (new_rec("40-03")) + { + set("ProgressivoDelega", nProgDelega); + set("ProgressivoContributo", ++nProgr); + set("CausaleContributo", tributo); + + const real d = riga.get("IMPORTODEB").as_real(); + set("ImportoDebito", d); + debito += d; + + const real c = riga.get("IMPORTOCRED").as_real(); + set("ImportoCredito", c); + credito += c; + + if (nProgr > 4) + log(2, "Numero eccessivo di righe nella sezione INPS"); + } + } + } + + const real saldo = debito-credito; + if (nProgr > 0 && new_rec("40-04")) + { + set("ProgressivoDelega", nProgDelega); + set("TotaleDebito", debito); + set("TotaleCredito", credito); + set("SegnoSezione", saldo < ZERO ? "N" : "P"); + set("SaldoSezione", saldo < ZERO ? -saldo : saldo); + } + + saldo_tot += saldo; + credito_tot += credito; +} + +void TF4_sender::add_50(TRecordset& riga, const real& saldo_tot, const real& credito_tot, const TMask& m) +{ + riga.move_first(); + + const long nProgDelega = _f24->get_count("10"); + const TString8 abi(riga.get("ABI").as_string()); + const TString8 cab(riga.get("CAB").as_string()); + TString16 key; + + key << prefix().firm().get(NDT_TIPOA) << '|' << prefix().firm().get_long(NDT_CODANAGR); + + TString16 cofi = cache().get(LF_ANAG, key, ANA_COFI); + + if (cofi.blank()) + cofi = cache().get(LF_ANAG, key, ANA_PAIV); + + if (new_rec("50-01")) + { + set("ProgressivoDelega", nProgDelega); + set("BancaPassiva", abi); + set("SportelloPassivo", cab); + + TString16 banca; banca << abi << cab; + const TString& iban = cache().get("BNP", banca, "S3"); + set("ContoAddebito", iban.mid(15)); + set("Cin", iban.mid(4, 1)); + set("SaldoFinale", saldo_tot); + + set("CodiceFiscale", cofi); + + int titpag = 1; // Saldo zero + if (!saldo_tot.is_zero()) + { + const char tipointes = riga.get("TIPOINTEST").as_string()[0]; + titpag = tipointes == 'C' ? 3 : 2; + } + set("TitolarePagamento", titpag); + set("DataPagamento", m.get_date(F_DATAPAG)); + set("TotaleImportiCredito", credito_tot); + } + if (new_rec("50-02")) + { + set("ProgressivoDelega", nProgDelega); + set("CodiceFiscaleMittente", cofi); + set("ABI", abi); + set("CAB", cab); + set("Denominazione", prefix().firm().get(NDT_RAGSOC)); + } + +} + +void TF4_sender::add_delega(long nDelega, const TMask& m) +{ + TString msg; msg << TR("Delega") << ' ' << nDelega; + log(0, msg); + + TF24_set delega(nDelega); + + real saldo_tot, credito_tot; + + add_10_20(delega, m); + add_erario(delega, saldo_tot, credito_tot); + add_inps(delega, saldo_tot, credito_tot); + add_50(delega, saldo_tot, credito_tot, m); + _f24->totale_positivi() += saldo_tot; + +} + +bool TF4_sender::set_data_versamento(long nDelega, const TDate& datavers) +{ + TLocalisamfile righe(LF_RIGHEF24); + TF24_set f24(nDelega); + for (bool ok = f24.move_first(); ok; ok = f24.move_next()) + { + const long progr = f24.get("PROGR").as_int(); + righe.put("PROGR", progr); + int err = righe.read(_isequal, _lock); + if (err != NOERR) + { + righe.put("DATAVERS", datavers); + err = righe.rewrite(); + } + if (err != NOERR) + return error_box(FR("Errore %d durante l'aggiornamento della riga %ld"), err, progr); + } + return true; +} + +void TF4_sender::add_footer(const TMask& m) +{ + if (new_rec("EF")) + { + set("Mittente", m.get(F_MITTENTE)); + set("Ricevente", m.get(F_ABI)); + set("DataCreazione", m.get_date(F_DATA)); + set("NomeSupporto", m.get(F_FILE)); // Somma dei tre campi precedenti + + set("NumeroDisposizioni", _f24->get_count("10")); + set("NumeroRecord", _f24->get_count(NULL)); + set("TotImportiPositivi", _f24->totale_positivi()); + } +} + +void TF4_sender::main_loop() +{ + TF24_mask m; + while (m.run() != K_QUIT) + { + const char* const title = TR("Generazione F24"); + _f24 = new TF24_textset; + _log = new TLog_report(title); + _errors_logged = false; + + add_header(m); + + TSheet_field& sheet = m.sfield(F_DISTINTE); + if (sheet.items() > 0) + { + TProgind pi(sheet.items(), title, true, true); + FOR_EACH_SHEET_ROW(sheet, r, row) if (row->get(0)[0] > ' ') + { + if (!pi.setstatus(r+1)) + break; + const long nDelega = row->get_long(1); + add_delega(nDelega, m); + } + } + + add_footer(m); + + TReport_book book; + book.add(*_log); +#ifdef DBG + TAS400_report rep(*_f24); + book.add(rep); +#endif + book.preview(); + + bool save = true; + if (_errors_logged) + { + save = yesno_box(TR("Sono stati riscontrati uno o piu' errori:\n" + "Si desidera salvare il file ugualmente?")); + } + if (save) + { + TFilename name = m.get(F_PATH); + name.add(m.get(F_FILE)); + _f24->save_as(name); + + if (!_errors_logged) + { + TProgind pi(sheet.items(), TR("Aggiornamento data versamento"), true, true); + const TDate datavers = m.get(F_DATA); + FOR_EACH_SHEET_ROW(sheet, r, row) if (row->get(0)[0] > ' ') + { + if (!pi.setstatus(r+1)) + break; + + const long nDelega = row->get_long(1); + if (!set_data_versamento(nDelega, datavers)) + break; + } + } + } + + delete _log; + delete _f24; + } +} + +int gv0600(int argc, char* argv[]) +{ + TF4_sender app; + app.run(argc, argv, "Invio F24"); + return 0; +} diff --git a/gv/gv0600a.h b/gv/gv0600a.h new file mode 100755 index 000000000..6851405b0 --- /dev/null +++ b/gv/gv0600a.h @@ -0,0 +1,18 @@ +#define F_DISTINTE 200 + +#define F_PATH 201 +#define F_FILE 202 +#define F_DATAPAG 203 +#define F_DATA 204 + +#define F_FILTER 210 +#define F_DATA_DA 211 +#define F_DATA_AL 212 +#define F_ABI 213 +#define F_CAB 214 +#define F_DESBAN 215 +#define F_TIPOINTEST 216 +#define F_CLIFO 217 +#define F_PERSON 218 + +#define F_MITTENTE 301 diff --git a/gv/gv0600a.uml b/gv/gv0600a.uml new file mode 100755 index 000000000..375f5a671 --- /dev/null +++ b/gv/gv0600a.uml @@ -0,0 +1,267 @@ +#include "gv0600a.h" + +TOOLBAR "" 0 -2 0 2 + +BUTTON DLG_ELABORA 10 2 +BEGIN + PROMPT -12 -11 "~Elabora" + PICTURE BMP_ELABORA + MESSAGE EXIT,69 +END + +BUTTON DLG_QUIT 10 2 +BEGIN + PROMPT -22 -11 "" +END + +ENDPAGE + +PAGE "Invio F4" 0 0 0 -3 + +GROUPBOX DLG_NULL 78 5 +BEGIN + PROMPT 1 0 "@bSelezione" +END + +LIST F_FILTER 1 13 +BEGIN + PROMPT 2 1 "Mostra distinte " + ITEM " |da inviare" + ITEM "I|inviate" + ITEM "Q|qualsiasi" +END + +DATE F_DATA_DA +BEGIN + PROMPT 36 1 "Scadenze dal" +END + +DATE F_DATA_AL +BEGIN + PROMPT 62 1 "al " +END + +NUMBER F_ABI 5 +BEGIN + PROMPT 2 2 "Banca (ABI-CAB) " + CHECKTYPE REQUIRED + FLAGS "Z" + FIELD ABI +END + +NUMBER F_CAB 5 +BEGIN + PROMPT 25 2 " " + USE BNP + JOIN %BAN ALIAS 883 INTO CODTAB==CODTAB + INPUT CODTAB[1,5] F_ABI + INPUT CODTAB[6,10] F_CAB + DISPLAY "ABI@5" CODTAB[1,5] + DISPLAY "CAB@5" CODTAB[6,10] + DISPLAY "Descrizione@50" 883@->S0 + OUTPUT F_ABI CODTAB[1,5] + OUTPUT F_CAB CODTAB[6,10] + OUTPUT F_DESBAN 883@->S0 + CHECKTYPE REQUIRED + FLAGS "Z" + FIELD CAB +END + +STRING F_DESBAN 70 40 +BEGIN + PROMPT 36 2 "" + FLAGS "D" +END + +LIST F_TIPOINTEST 1 10 +BEGIN + PROMPT 2 3 "Intestatario " + ITEM " |Tutti" MESSAGE HIDE,F_CLIFO|HIDE,F_PERSON + ITEM "C|Cliente" MESSAGE SHOW,F_CLIFO|HIDE,F_PERSON + ITEM "D|Ditta" MESSAGE HIDE,F_CLIFO|HIDE,F_PERSON + ITEM "F|Fisico" MESSAGE HIDE,F_CLIFO|SHOW,F_PERSON + ITEM "G|Giuridico" MESSAGE HIDE,F_CLIFO|SHOW,F_PERSON +END + +NUMBER F_CLIFO 6 +BEGIN + PROMPT 36 3 "" + USE LF_CLIFO + INPUT TIPOCF "C" + INPUT CODCF F_CLIFO + DISPLAY "Codice" CODCF + DISPLAY "Ragione Sociale@50" RAGSOC + OUTPUT F_CLIFO CODCF + CHECKTYPE NORMAL + ADD RUN cg0 -1 C +END + +NUMBER F_PERSON 6 +BEGIN + PROMPT 36 3 "" + USE LF_ANAG + INPUT TIPOA F_TIPOINTEST + INPUT CODANAGR F_PERSON + DISPLAY "Codice" CODANAGR + DISPLAY "Ragione Sociale@50" RAGSOC + OUTPUT F_PERSON CODANAGR + CHECKTYPE NORMAL + ADD RUN ba4 -1 #F_TIPOINTEST +END + +GROUPBOX DLG_NULL 78 5 +BEGIN + PROMPT 1 5 "@bParametri" +END + +STRING F_MITTENTE 5 +BEGIN + PROMPT 2 6 "Codice SIA del mittente " + CHEKCTYPE REQUIRED + FIELD Mittente +END + +DATE F_DATA +BEGIN + PROMPT 49 6 "Data di creazione " + CHEKCTYPE REQUIRED + FLAGS "A" +END + +DATE F_DATAPAG +BEGIN + PROMPT 49 7 "Data di pagamento " + CHEKCTYPE REQUIRED +END + +STRING F_PATH 256 39 +BEGIN + PROMPT 2 8 "Cartella " + DSELECT + CHECKTYPE REQUIRED + FIELD F24DestPath +END + +STRING F_FILE 18 +BEGIN + PROMPT 54 8 "File " + FLAGS "DG" + DRIVENBY F_DATA F_ABI F_MITTENTE + STR_CALC ANSI(#F_DATA)+#F_ABI+#F_MITTENTE +END + +SPREADSHEET F_DISTINTE 78 +BEGIN + PROMPT 1 10 "" + ITEM "@1" + ITEM "Distinta" + ITEM "Scadenza@10" + ITEM "ABI@5" + ITEM "CAB@5" + ITEM "Tipo@2" + ITEM "Intestatario" + ITEM "Invio@10" + FLAGS "D" +END + +ENDPAGE + +ENDMASK + +PAGE "Distinta" -1 -1 56 12 + +GROUP DLG_NULL 54 4 +BEGIN + PROMPT 1 0 "@bDistinta" +END + +BOOLEAN 101 +BEGIN + PROMPT 2 1 "Da inviare" +END + +NUMBER 102 7 +BEGIN + PROMPT 2 2 "Numero " + FLAGS "L" + FIELD F24 +END + +DATE 103 +BEGIN + PROMPT 32 1 "Scadenza " + FLAGS "L" + FIELD DATASCAD +END + +DATE 108 +BEGIN + PROMPT 32 2 "Inviata il " + FLAGS "L" + FIELD DATAVERS +END + +GROUP DLG_NULL 54 4 +BEGIN + PROMPT 1 4 "@bBanca" +END + +NUMBER 104 5 +BEGIN + PROMPT 2 5 "ABI " + FIELD ABI + FLAGS "LZ" +END + +NUMBER 105 5 +BEGIN + PROMPT 16 5 "CAB " + FIELD CAB + FLAGS "LZ" + USE %BAN + INPUT CODTAB[1,5] 104 + INPUT CODTAB[6,10] 105 + DISPLAY "ABI@5" CODTAB[1,5] + DISPLAY "CAB@5" CODTAB[6,10] + DISPLAY "Descrizione@50" S0 + OUTPUT 115 S0 + CHECTYPE NORMAL +END + +STRING 115 50 +BEGIN + PROMPT 2 6 "" + FLAGS "D" +END + +GROUP DLG_NULL 54 3 +BEGIN + PROMPT 1 8 "@bIntestatario" +END + +LIST 106 1 10 +BEGIN + PROMPT 2 9 "Tipo " + ITEM "C|Cliente" + ITEM "D|Ditta" + ITEM "F|Fisico" + ITEM "G|Giuridico" + FIELD TIPOINTEST + FLAGS "L" +END + +NUMBER 107 6 +BEGIN + PROMPT 26 9 "" + FIELD INTEST + FLAGS "L" +END + +BUTTON DLG_CANCEL 10 2 +BEGIN + PROMPT -11 -1 "" +END + +ENDPAGE + +ENDMASK \ No newline at end of file diff --git a/gv/gvlib.cpp b/gv/gvlib.cpp new file mode 100755 index 000000000..b8a8087b6 --- /dev/null +++ b/gv/gvlib.cpp @@ -0,0 +1,106 @@ +#include "gvlib.h" + +#include + +/////////////////////////////////////////////////////////// +// TRigheF24_set +/////////////////////////////////////////////////////////// + +// 0=tutte 1=libere 2=assegnate 3=tutte +TRigheF24_set::TRigheF24_set(int flags) + : TISAM_recordset("USE RIGHEF24 KEY 2") +{ + switch ((flags & 0x3) % 3) + { + case 1: set("USE RIGHEF24 KEY 2\nTO PROGR=999999"); break; + case 2: set("USE RIGHEF24 KEY 2\nFROM F24=1"); break; + default: break; + } +} + +/////////////////////////////////////////////////////////// +// TF24_set +/////////////////////////////////////////////////////////// + +TF24_set::TF24_set(long codice) + : TISAM_recordset("USE RIGHEF24 KEY 2\nFROM F24=#DIST\nTO F24=#DIST") +{ + CHECKD(codice > 0, "Distinta ma sospetta:", codice); + set_var("#DIST", TVariant(codice)); +} + +/////////////////////////////////////////////////////////// +// TElencoF24_set +/////////////////////////////////////////////////////////// + +const TElencoF24_set* TElencoF24_set::_currentF24 = NULL; + +bool TElencoF24_set::f24killer(const TRelation* rel) +{ + // Il record e' buono se il bit corrispondente e' settato + return _currentF24->_good[rel->file().recno()]; +} + +TCursor* TElencoF24_set::cursor() const +{ + _currentF24 = this; + + TCursor* c = TISAM_recordset::cursor(); + if (c != NULL && c->filterfunction() == NULL) + { + TBit_array& goodies = ((TElencoF24_set*)this)->_good; + goodies.reset(); + + long last = 0; + + TRecnotype tot = c->items(); + const TRectype& curr = c->curr(); + for (*c = 0; c->pos() < tot; ++*c) + { + const long f24 = curr.get_long("F24"); + bool good = f24 > last; + if (good) + { + last = f24; + if (_flags != 0) // Non voglio tutto? + { + const TDate inv = curr.get(F24_DATAVERS); + good = (_flags == 1) ^ inv.ok(); + } + if (good) + goodies.set(c->file().recno()); + } + } + c->freeze(false); + c->set_filterfunction(f24killer); + tot = c->items(); + c->freeze(true); + } + return c; +} + +// 0=tutte 1=da inviare 2=inviate 3=tutte +TElencoF24_set::TElencoF24_set(int flags) + : TRigheF24_set(0x2) +{ + _flags = (flags & 0x3) % 3; // isolo i flag = 1 o flag = 2 +} + +long get_next_f24() +{ + long f24 = 1; + TRigheF24_set deleghe(0x2); + if (deleghe.move_last()) + f24 += deleghe.get(F24_F24).as_int(); + return f24; +} + +long get_next_progr_f24() +{ + TLocalisamfile righef24(LF_RIGHEF24); + long next_progr = 1; + + if (righef24.read(_islast) == NOERR) + next_progr += righef24.get_long(F24_PROGR); + return next_progr; +} diff --git a/gv/gvlib.h b/gv/gvlib.h new file mode 100755 index 000000000..2d1a52cb5 --- /dev/null +++ b/gv/gvlib.h @@ -0,0 +1,43 @@ +#ifndef __GVLIB_H +#define __GVLIB_H + +#ifndef __RECSET_H +#include +#endif + +#ifndef __RIGHE_F24 +#include +#endif + +// Elenco di tutte righe + o - assegnate ad un F24 +class TRigheF24_set : public TISAM_recordset +{ +public: + TRigheF24_set(int flags = 0); // 0=tutte 1=libere 2=assegnate 3=tutte +}; + +// Elenco delle righe di un singolo F24 +class TF24_set : public TISAM_recordset +{ +public: + TF24_set(long codice); +}; + +// Elenco delle distinte F24 (solo la prima riga di ognuna) +class TElencoF24_set : public TRigheF24_set +{ + int _flags; + TBit_array _good; + + static const TElencoF24_set* _currentF24; + static bool f24killer(const TRelation* rel); + +public: + virtual TCursor* cursor() const; + TElencoF24_set(int flags = 0); // 0=tutte 1=da inviare 2=inviate 3=tutte +}; + +long get_next_f24(); +long get_next_progr_f24(); + +#endif \ No newline at end of file diff --git a/include/array.cpp b/include/array.cpp index 9eff2b343..d34df4b11 100755 --- a/include/array.cpp +++ b/include/array.cpp @@ -627,6 +627,13 @@ int TPointer_array::insert(const TObject& object, int index, bool force) return TArray::insert(&(TObject&)object, index, force); } +int TPointer_array::find_long(long value) const +{ + int i = 0; + for (i = last(); i >= 0 && get_long(i) != value; i = pred(i)); + return i; +} + /////////////////////////////////////////////////////////// // TBit_array /////////////////////////////////////////////////////////// diff --git a/include/array.h b/include/array.h index 590d5f382..1cc5e476b 100755 --- a/include/array.h +++ b/include/array.h @@ -176,20 +176,20 @@ public: TArray& operator=(const TArray& a); // @cmember Rimuove uno o tutti (default) gli elementi - virtual bool destroy(int index = -1, bool pack = FALSE); + virtual bool destroy(int index = -1, bool pack = false); // @cmember Aggiunge un oggetto ad un array. virtual int add(TObject* obj, int index = -1) ; // @cmember Inserisce un elemento dell'array nella posizione index - virtual int insert(TObject* obj, int index = 0, bool force = FALSE); + virtual int insert(TObject* obj, int index = 0, bool force = false); // @cmember Aggiunge un oggetto all'array. L'oggetto viene duplicato virtual int add(const TObject& object, int index = -1) ; // @cmember Inserisce un oggetto alla posizione index - virtual int insert(const TObject& object, int index = 0, bool force = FALSE); + virtual int insert(const TObject& object, int index = 0, bool force = false); // @cmember Elimina l'elemento nella posizione index dell'array - TObject* remove(int index, bool pack = FALSE); + TObject* remove(int index, bool pack = false); // @cmember Elimina l'elemento nella posizione index dell'array - TObject* remove_item(bool pack = FALSE) ; + TObject* remove_item(bool pack = false) ; // @cmember Scambia di posto due elementi dell'array void swap(int i1, int i2); // @cmember Rende contigui tutti gli elementi non nulli @@ -229,10 +229,10 @@ protected: void copy(const TArray& a); public: - virtual bool destroy(int index = -1, bool pack = FALSE); + virtual bool destroy(int index = -1, bool pack = false); virtual int add(TObject* object, int index = -1); virtual int add(const TObject& object, int index = -1); - virtual int insert(const TObject& object, int index = 0, bool force = FALSE); + virtual int insert(const TObject& object, int index = 0, bool force = false); virtual TPointer_array& operator= (const TArray& a) { copy(a); return *this; } virtual TPointer_array& operator= (const TPointer_array& a) { copy(a); return *this; } @@ -240,6 +240,7 @@ public: int get_int(int index) const { return (int)get_long(index); } int add_long(long value, int index = -1) { return add((TObject*)value, index); } int insert_long(long value, int index = -1) { return TArray::insert((TObject*)value, index, TRUE); } + int find_long(long value) const; TPointer_array() { } TPointer_array(int size) : TArray(size) { } diff --git a/include/assoc.cpp b/include/assoc.cpp index 84358dfe0..61583d3b1 100755 --- a/include/assoc.cpp +++ b/include/assoc.cpp @@ -266,7 +266,7 @@ TObject& TAssoc_array::find( TObject* TAssoc_array::objptr( const char* key) const // @parm Chiave dell'oggetto da ritornare { - bool isnew = FALSE; + bool isnew = false; THash_object* o = ((TAssoc_array*)this)->_lookup(key,isnew); return o ? o->_obj : NULL; } diff --git a/include/campo.aut b/include/campo.aut index 50ed83ce3..dd5ca5572 100755 --- a/include/campo.aut +++ b/include/campo.aut @@ -25,7 +25,7 @@ vd Vendita al dettaglio af Autoformazione gi Gestione ICI is Gestione ISI -tc Tecnico Contabile +tc Trasferimento altre Contabilita' tm Tecnico Approv. Merci ac Accettazione AVIS av AVIS Assist diff --git a/include/causali.h b/include/causali.h index 170f7399c..6f60f2cd4 100755 --- a/include/causali.h +++ b/include/causali.h @@ -25,5 +25,6 @@ #define CAU_SOLOIVA "SOLOIVA" #define CAU_MOVIND "MOVIND" #define CAU_PROVV "PROVV" +#define CAU_CODCAUREG "CODCAUREG" #endif \ No newline at end of file diff --git a/include/codeb.c b/include/codeb.c index d57d4c13f..d573478b8 100755 --- a/include/codeb.c +++ b/include/codeb.c @@ -138,6 +138,7 @@ int DB_open(const char *filename,int mode,int index) int DB_close(int handle) { if(!handle_ok(handle)) return(-1); + d4close(dbdata[handle]); dbdata[handle]=(DATA4 *) 0; code_base.errorCode=0; @@ -412,7 +413,10 @@ int DB_rewrite(int handle) d4recNo(dbdata[handle]) + 1, d4fileName(dbdata[handle])); xvt_dm_post_fatal_exit(msg); } - rt=DB_unlock(handle); + + if (rt == 0) + rt = DB_flush(handle); + rt = DB_unlock(handle); return (rt); } @@ -462,9 +466,9 @@ int DB_add(int handle) u4delaySec(); } } - DB_unlock(handle); if (is_locked == 0) - d4unlock(data); + DB_unlock(handle); + return(rt); } @@ -1160,7 +1164,7 @@ char* DB_memoptr( const int handle, const char * fieldname ) return f4memoPtr( f ); } -int DB_memowrite( const int handle, const char * fieldname, const char * data ) +int DB_memowrite( const int handle, const char* fieldname, const char* data ) { FIELD4* f = d4field(dbdata[handle], fieldname ); int ret = f4memoAssign( f, (char*)data ); diff --git a/include/controls.cpp b/include/controls.cpp index c97bec19e..d790906ab 100755 --- a/include/controls.cpp +++ b/include/controls.cpp @@ -91,6 +91,7 @@ class TPicture_array public: bool add(short id); + short add(const char * n); const TImage& image(short id) const { return (const TImage&)_enabled[id]; } const TImage& disabled_image(short id) const { return (const TImage&)_disabled[id]; } @@ -101,6 +102,15 @@ public: virtual ~TPicture_array() {} }; +short TPicture_array::add(const char * n) +{ + short id; + + for (id = 30000; objptr(id) != NULL; id++); + + return TArray::add(new TImage(n), id); +} + bool TPicture_array::add(short id) { TImage* i = (TImage*)_enabled.objptr(id); @@ -152,6 +162,8 @@ void TPicture_array::reload() HIDDEN TPicture_array* _picture = NULL; HIDDEN XVT_FNTID DEF_FONT = NULL; HIDDEN XVT_FNTID FAT_FONT = NULL; +HIDDEN XVT_FNTID BIG_FONT = NULL; +HIDDEN XVT_FNTID BIGFAT_FONT = NULL; bool is_xvt_font(const char * nome_font) { @@ -168,7 +180,7 @@ bool is_xvt_font(const char * nome_font) return found; } -XVT_FNTID xvt_default_font(bool bold) +XVT_FNTID xvt_default_font(bool bold, bool big) { if (DEF_FONT == NULL) { @@ -203,7 +215,18 @@ XVT_FNTID xvt_default_font(bool bold) xvt_font_map_using_default(FAT_FONT); CHECK(xvt_font_is_mapped(FAT_FONT), "Can't map native font"); - // Compute true text size + BIG_FONT = xvt_font_create(); + xvt_font_copy(BIG_FONT, DEF_FONT, XVT_FA_ALL); + xvt_font_set_size(BIG_FONT, xvt_font_get_size(DEF_FONT) * 2); + xvt_font_map_using_default(BIG_FONT); + CHECK(xvt_font_is_mapped(BIG_FONT), "Can't map native font"); + + BIGFAT_FONT = xvt_font_create(); + xvt_font_copy(BIGFAT_FONT, FAT_FONT, XVT_FA_ALL); + xvt_font_set_size(BIGFAT_FONT, xvt_font_get_size(FAT_FONT) * 2); + xvt_font_map_using_default(BIGFAT_FONT); + CHECK(xvt_font_is_mapped(BIGFAT_FONT), "Can't map native font"); +// Compute true text size ROWY = (pc.bottom - pc.top) / 25; const int COLX = (pc.right - pc.left) / 80; @@ -223,7 +246,13 @@ XVT_FNTID xvt_default_font(bool bold) CHARY = ROWY-2; } - return bold ? FAT_FONT : DEF_FONT; + XVT_FNTID f; + + if (bold) + f = big ? BIGFAT_FONT : FAT_FONT; + else + f = big ? BIG_FONT : DEF_FONT; + return f; } XVT_FNTID xvt_load_default_font() @@ -238,9 +267,19 @@ XVT_FNTID xvt_load_default_font() xvt_font_destroy(FAT_FONT); FAT_FONT = NULL; } + if (BIG_FONT) + { + xvt_font_destroy(BIG_FONT); + BIG_FONT = NULL; + } + if (BIGFAT_FONT) + { + xvt_font_destroy(BIGFAT_FONT); + BIGFAT_FONT = NULL; + } X_FU_MULTIPLE = Y_FU_MULTIPLE = 0; - XVT_FNTID font = xvt_default_font(false); + XVT_FNTID font = xvt_default_font(); xi_set_font_id(font); xi_init_sysvals(); // Ricalcola i FU units @@ -394,6 +433,11 @@ void free_controls() xvt_font_destroy(FAT_FONT); FAT_FONT = NULL; } + if (BIG_FONT) + { + xvt_font_destroy(BIG_FONT); + BIG_FONT = NULL; + } } /////////////////////////////////////////////////////////// @@ -483,7 +527,7 @@ WINDOW create_interface(WINDOW parent, short x, short y, short dx, short dy, def->v.itf->automatic_back_color = false; def->v.itf->back_color = MASK_BACK_COLOR; - def->v.itf->font_id = xvt_default_font(false); + def->v.itf->font_id = xvt_default_font(); def->v.itf->tab_on_enter = true; def->v.itf->win = (XinWindow)win; def->v.itf->edit_menu = true; // Update edit menu items @@ -959,9 +1003,10 @@ unsigned long TControl::flags2attr(const char* flags) const return attrib; } -const char* TControl::parse_caption(const char* cap, bool& bold, COLOR& color) const +const char* TControl::parse_caption(const char* cap, bool& bold, bool& big, COLOR& color) const { bold = false; + big = false; color = NORMAL_COLOR; const char* t; @@ -975,6 +1020,12 @@ const char* TControl::parse_caption(const char* cap, bool& bold, COLOR& color) c { bold = true; t++; + } + else + if (code == 'G') + { + big = true; + t++; } else { @@ -1131,6 +1182,13 @@ void TControl::set_read_only(bool on) change_attrib(XI_ATR_READONLY, on); } +void TControl::set_pos(int pos) +{ + xi_lowlevel_focus(_obj, TRUE); + if (pos >= 0) + xi_aga_field_set_pos(_obj, pos); +} + const char* TControl::caption() const { const char* c = xi_get_text(_obj, NULL, 512); @@ -1160,9 +1218,9 @@ TText_control::TText_control(WINDOW win, short cid, short left, short top, short width, short height, const char* flags, const char* text) { - bool bold; + bool bold, big; COLOR color; - TString t = parse_caption(text, bold, color); + TString t = parse_caption(text, bold, big, color); t.rtrim(); if (width <= 0) width = t.len(); @@ -1185,20 +1243,20 @@ TText_control::TText_control(WINDOW win, short cid, void TText_control::set_caption(const char* text) { - bool bold; + bool bold, big; COLOR color; - const char* c = parse_caption(text, bold, color); + const char* c = parse_caption(text, bold, big, color); xi_set_text(_obj, (char*)c); _obj->v.text->fore_color = color; #ifdef XI_R4 - xi_set_obj_font_id(_obj, xvt_default_font(bold)); + xi_set_obj_font_id(_obj, xvt_default_font(bold, big)); #else FONT_OBJ* &font = _obj->v.text->font; if (font == NULL) font = (FONT_OBJ*)xi_tree_malloc(sizeof(FONT_OBJ), _obj->v.text); - *font = xi_create_copy_font_id(get_interface(), xvt_default_font(bold), NULL); + *font = xi_create_copy_font_id(get_interface(), xvt_default_font(bold. big), NULL); RCT rct; get_rect(rct); if (bold) @@ -1388,7 +1446,12 @@ bool TField_control::event_handler(XI_OBJ* itf, XI_EVENT* xiev) break; case XIE_DBL_FIELD: if (!read_only()) - notify_key(K_F9); + { + if( true) + notify_key(K_F12); + else + notify_key(K_F9); + } break; case XIE_CHAR_FIELD: { @@ -1445,7 +1508,7 @@ void TButton_control::create(WINDOW win, short cid, const char* flags, const char* text, WIN_TYPE wc, XI_OBJ* container) { - bool bold; + bool bold, big; COLOR color; TString txt(text); txt.trim(); @@ -1460,7 +1523,7 @@ void TButton_control::create(WINDOW win, short cid, mnemonic = txt[underscore+1]; txt.strip("&~"); } - const char* t = parse_caption(txt, bold, color); + const char* t = parse_caption(txt, bold, big, color); if (width <= 0) width = strlen(t)+3; RCT rct; coord2rct(win, left, top, width, height, rct); @@ -1472,7 +1535,11 @@ void TButton_control::create(WINDOW win, short cid, def->app_data = (long)this; switch (wc) { - case WC_PUSHBUTTON : def->v.btn->type = XIBT_BUTTON; break; + case WC_PUSHBUTTON : + def->v.btn->type = XIBT_BUTTON; + if (bold) + def->v.btn->font = (XinFont *)BIG_FONT; + break; case WC_CHECKBOX : def->v.btn->type = XIBT_CHECKBOX; break; case WC_RADIOBUTTON: def->v.btn->type = XIBT_RADIOBTN; break; case WC_CHECKBUTTON: def->v.btn->type = XIBT_BUTTON_CHECKBOX; break; @@ -1628,9 +1695,10 @@ char TPushbutton_control::mnemonic() const void TPushbutton_control::set_caption(const char* c) { - bool bold; + bool bold, big; COLOR color; - const char* cap = parse_caption(c, bold, color); + const char* cap = parse_caption(c, bold, big, color); + if (*cap) { TControl::set_caption(cap); @@ -1638,17 +1706,10 @@ void TPushbutton_control::set_caption(const char* c) set_bmp(0, 0); _obj->v.btn->drawable = false; _obj->v.btn->fore_color = color; + xi_set_obj_font_id(_obj, xvt_default_font(bold, big)); } } -void TPushbutton_control::set_central_icon(unsigned int hicon) -{ - xi_set_icon(_obj, hicon, hicon); - _obj->v.btn->icon_x = (_obj->v.btn->rct.right - _obj->v.btn->rct.left - 32) / 2 - 5; - _obj->v.btn->icon_y = (_obj->v.btn->rct.bottom - _obj->v.btn->rct.top - 32) / 2 - 5; - _obj->v.btn->drawable = false; -} - void TPushbutton_control::set_bmp(short bmp_up, short bmp_dn) { if (bmp_up > 0) @@ -1662,6 +1723,22 @@ void TPushbutton_control::set_bmp(short bmp_up, short bmp_dn) _obj->v.btn->drawable = _bmp_up > 0; } +void TPushbutton_control::set_bmp(const char * bmp_up, const char * bmp_dn) +{ + if (bmp_up && *bmp_up) + { + _bmp_up = _picture->add(bmp_up); + if (bmp_dn && *bmp_dn) + _bmp_dn = _picture->add(bmp_dn); + else + _bmp_dn = _bmp_up; + set_icon(0); + } + else + _bmp_up = _bmp_dn = 0; + _obj->v.btn->drawable = _bmp_up > 0; +} + void TPushbutton_control::update() { const long attrib = xi_get_attrib(_obj); @@ -1817,9 +1894,9 @@ TRadiobutton_control::TRadiobutton_control(WINDOW win, short cid, const unsigned long attrib = flags2attr(flags); for (int b = 1; b <= tot; b++) { - bool bold; + bool bold, big; COLOR color; - const char* t = parse_caption(testo.get(), bold, color); + const char* t = parse_caption(testo.get(), bold, big, color); const int next = cid + (b+1)*1000; XI_OBJ_DEF* btn_def = xi_add_button_def(def, cid + b*1000, NULL, attrib, (char*)t, next); @@ -1942,9 +2019,9 @@ TTagbutton_control::TTagbutton_control(WINDOW win, short cid, for (int b = 1; b <= tot; b++) { - bool bold; + bool bold, big; COLOR color; - const char* t = parse_caption(titolo.get(), bold, color); + const char* t = parse_caption(titolo.get(), bold, big, color); const int next_bid = b == tot ? cid+1 : cid+b+1; XI_OBJ_DEF* btn_def = xi_add_button_def(cnt_def, cid+b, NULL, attrib, (char*)t, next_bid); diff --git a/include/controls.h b/include/controls.h index 61955e04c..0ebb7cfaf 100755 --- a/include/controls.h +++ b/include/controls.h @@ -20,7 +20,7 @@ struct XI_EVENT; void init_controls(); void free_controls(); -XVT_FNTID xvt_default_font(bool bold = FALSE); +XVT_FNTID xvt_default_font(bool bold = false, bool big = false); XVT_FNTID xvt_load_default_font(); WINDOW create_interface(WINDOW parent, short x, short y, short dx, short dy, @@ -63,7 +63,7 @@ protected: void coord2rct(WINDOW win, short left, short top, short width, short height, RCT& rct) const; unsigned long flags2attr(const char* flags) const; void update_tab_cid(); - const char* parse_caption(const char* cap, bool& bold, COLOR& color) const; + const char* parse_caption(const char* cap, bool& bold, bool& big, COLOR& color) const; void change_attrib(unsigned long attr, bool on, XI_OBJ* obj = NULL); @@ -114,6 +114,9 @@ public: virtual RCT& get_rect(RCT& r) const; virtual void set_rect(const RCT& r); + + // @cmember imposta la posizione del cursore a + void set_pos(int pos = -1); bool on_key(KEY k); }; @@ -226,6 +229,7 @@ public: virtual void set_caption(const char* c); void set_bmp(short up, short dn); + void set_bmp(const char * up, const char * dn); void set_central_icon(unsigned int hicon); char mnemonic() const; diff --git a/include/date.cpp b/include/date.cpp index 74519422d..0e97e468c 100755 --- a/include/date.cpp +++ b/include/date.cpp @@ -73,39 +73,34 @@ TDate::TDate(const char* s) { _val = NULLDATE; - const int len = (s && *s) ? strlen(s) : 0; - if (len != 8 && len != 10) + const int len = (s && *s >= '0') ? strlen(s) : 0; + if (len != 8 && len != 10) // Chi si azzarda ad aggiungere len != 6 ? return; - - int d = 0, m = 0, y = 0, i; + if (len == 8) { + int i; for (i = 0; i < 8; i++) if (!isdigit(s[i])) break; if (i == 8) - { - TString8 str(s); - d = atoi(((const char *)str)+6); str.cut(6); - m = atoi(((const char *)str)+4); str.cut(4); - y = atoi(((const char *)str)+0); - } + _val = atol(s); } else - if (len == 10) + { + if (s[2] == s[5] && !isdigit(s[2])) { - if (s[2] == s[5] && !isdigit(s[2])) - { - d = atoi(s); - m = atoi(&s[3]); - y = atoi(&s[6]); - } - } + const int d = atoi(s); + const int m = atoi(&s[3]); + const int y = atoi(&s[6]); + _val = makedata(d, m, y); + } + } #ifdef DBG - if (d < 1 || d > 31 || m < 1 || m > 12 || y < 0) - yesnofatal_box("Lamentati con Guy se la data %s non viene accettata!", s); + if (day() < 1 || day() > 31 || month() < 1 || month() > 12 || year() < 0) + yesnofatal_box("Lamentati con Guy se la data '%s' non viene accettata!", s); #endif - _val = makedata(d, m, y); + } TDate::TDate(int day, int month, int year) diff --git a/include/expr.cpp b/include/expr.cpp index 61f7ac0ef..f92108a56 100755 --- a/include/expr.cpp +++ b/include/expr.cpp @@ -612,7 +612,7 @@ void TExpression::eval() { const int len = (int)evalstack.pop_real().integer(); TString & s1 = evalstack.peek_string(); - s1 = s1.left(len); + s1.cut(len); } break; case _right: diff --git a/include/image.cpp b/include/image.cpp index 2270c9936..c80d35fc3 100755 --- a/include/image.cpp +++ b/include/image.cpp @@ -35,13 +35,46 @@ XVT_IMAGE TImage::set( // Certified 100% // @doc EXTERNAL +bool TImage::build_filename(TFilename & file) +{ + const char * const exts[] = {"gif", "png", "bmp", "jpg", NULL}; + bool ok = false; + + if (file.ext()[0] != '\0') + ok = file.custom_path(); + if (!ok) + { + for (int i = 0; !ok && exts[i]; i++) + { + file.ext(exts[i]); + ok = file.custom_path(); + if (!ok) + { + TFilename res(file); + + res.insert("res/"); + ok = res.exist(); + if (ok) + file = res; + } + } + } + return ok; +} + // @mfunc Legge l'immagine dal file XVT_IMAGE TImage::load( const char* n) // @parm Nome del file contenente l'immagine -{ - XVT_IMAGE i = xvt_image_read((char*)n); - if (i != NULL) - set(i); +{ + TFilename f(n); + XVT_IMAGE i = NULL; + + if (build_filename(f)) + { + i = xvt_image_read(f); + if (i != NULL) + set(i); + } return i; } diff --git a/include/image.h b/include/image.h index f64e9bd92..a21a1a9b2 100755 --- a/include/image.h +++ b/include/image.h @@ -9,6 +9,9 @@ #include #endif +#ifndef __STRINGS_H +#include +#endif /////////////////////////////////////////////////////////// // TImage /////////////////////////////////////////////////////////// @@ -88,7 +91,8 @@ public: // @cmember Setta l'

.esime entry della paletta al colore

void set_clut(byte n, COLOR c); - // @cmember Costruttore. Viene passato il nome del file + static bool build_filename(TFilename & file); + // @cmember Costruttore. Viene passato il nome del file TImage(const char* n); // @cmember Costruttore. Viene passato l'identificatore dell'immagine sul file di risorsa TImage(short id); @@ -100,4 +104,5 @@ public: virtual ~TImage(); }; + #endif diff --git a/include/isam.cpp b/include/isam.cpp index f7fcabf4c..adc15171b 100755 --- a/include/isam.cpp +++ b/include/isam.cpp @@ -1,22 +1,10 @@ -#include - -#include -#ifdef WIN32 -#include -#include -#include -#endif -#include -#include - -#include - #define __ISAM_CPP #include #include #include #include +#include #include #include #include @@ -28,6 +16,19 @@ #include #include +#ifdef WIN32 +#include +#include +#include +#endif + +#include +#include +#include + +#include + + #ifdef JOURNAL #include @@ -2151,10 +2152,14 @@ int TSystemisamfile::update( return err; } - TString s; s << TR("Aggiornamento") << ' ' << fname; + TString s(256); s << TR("Aggiornamento") << ' ' << fname; const TRecnotype nitems = items(); - TProgind p(nitems > 0 ? nitems : 1, s, true, true); +#ifdef DBG + TProgind p(nitems > 0 ? nitems : 1, s, true, true, 78); +#else + TProgind p(nitems > 0 ? nitems : 1, s, false, true, 78); +#endif TExtrectype nrec(wrec); @@ -2173,6 +2178,7 @@ int TSystemisamfile::update( { if (!p.addstatus(1)) { + err = _iseof; // Simula errore in caso di interruzione break; } ni++; diff --git a/include/isamrpc.cpp b/include/isamrpc.cpp index 2e8a49756..15192f138 100755 --- a/include/isamrpc.cpp +++ b/include/isamrpc.cpp @@ -316,6 +316,26 @@ bool rpc_UserLogout(const char* appname) return TRUE; } +bool http_isredirected_server(TString & server, + TFilename & remote_file, + const char * authorization) +{ + TSocketClient client; + if (!client.IsOk()) + return error_box("Impossibile inizializzare il client HTTP"); + + CONNID connection = client.QueryConnection("80", server); + bool ok = connection != 0; + if (ok) + { + ok = client.HttpIsRedirectedServer(connection, server, remote_file, authorization) != 0; + + client.RemoveConnection(connection); + } + + return ok; +} + bool http_get(const char* server, const char* remote_file, diff --git a/include/isamrpc.h b/include/isamrpc.h index 3ebe7922b..96f6d7f0b 100755 --- a/include/isamrpc.h +++ b/include/isamrpc.h @@ -24,6 +24,7 @@ bool rpc_UserLogout(const char* appname); bool rpc_Start(); bool rpc_Stop(); +bool http_isredirected_server(TString & server, TFilename & remote_file, const char* authorization = NULL); bool http_get(const char* server, const char* remote_file, const char* local_file, const char* authorization = NULL); bool http_dir(const char* server, const char* remote_dir, TString_array & list); diff --git a/include/mask.cpp b/include/mask.cpp index ab5e1515e..ec879c630 100755 --- a/include/mask.cpp +++ b/include/mask.cpp @@ -847,13 +847,9 @@ bool TMask::on_key( xvt_help_process_event(hi, win(), &e); } break; - case K_F12: - post_error_message(format("Lettura = %ld\n" - "Creazione = %ld\n" - "Inizializzazione = %ld\n", - _total_time-_build_time, _build_time, _init_time), - 1); - break; + case K_F12: + send_key(K_F12, focus_field().dlg()); + break; case K_CTRL+'+': if (is_running()) { diff --git a/include/mask.h b/include/mask.h index 95005b063..e744472a8 100755 --- a/include/mask.h +++ b/include/mask.h @@ -1,10 +1,6 @@ #ifndef __MASK_H #define __MASK_H -#ifndef __WINDOW_H -#include -#endif - #ifndef __MASKFLD_H #include #endif diff --git a/include/maskfld.cpp b/include/maskfld.cpp index d7c0faf8d..48e23d295 100755 --- a/include/maskfld.cpp +++ b/include/maskfld.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include @@ -92,7 +93,7 @@ char TMask_field::TField_Flags::update(const char* f, bool reset) case 'G': ghost = !reset; break; case 'H': - show_default = shown = reset; break; + show_default = shown = reset; break; case 'I': break; // reserved for sheetfield insert case 'L': @@ -148,8 +149,7 @@ void TMask_field::update_flags(const char* f, bool reset) TMask_field::TMask_field(TMask* m) : _mask(m), _groups(NULL), _ctl(NULL) -{ -} +{ } // Certified 100% TMask_field::~TMask_field() @@ -234,6 +234,15 @@ short TMask_field::atodlg( // @doc EXTERNAL +// @mfunc Imposta la posizione +void TMask_field::set_pos( + int pos) // @parm Posizione +{ + _ctl->set_pos(pos); +} + +// @doc EXTERNAL + // @mfunc Costruisce il campo void TMask_field::construct( short id, // @parm Identificatore del campo @@ -1199,6 +1208,11 @@ void TButton_field::set_bmp(short up, short dn) ((TPushbutton_control*)_ctl)->set_bmp(up, dn); } +void TButton_field::set_bmp(const char * up, const char * dn) +{ + ((TPushbutton_control*)_ctl)->set_bmp(up, dn); +} + void TButton_field::set_central_icon(unsigned icon) { ((TPushbutton_control*)_ctl)->set_icon(icon); @@ -2192,7 +2206,7 @@ int TBrowse::do_input( val = (fld+1); if (val.not_empty()) val.rtrim(1); tofilter = filter; - } + } else { const TMask_field* campf = NULL; @@ -3123,9 +3137,14 @@ void TEdit_field::parse_head(TScanner& scanner) const TBrowse* TEdit_field::parse_browse(TScanner& scanner) const { - const int id = scanner.integer(); - const TEdit_field& f = mask().efield(id); - const TBrowse* b = f.browse(); + const TBrowse* b = NULL; + const pos = mask().id2pos(scanner.integer()); + if (pos >= 0) + { + const TMask_field& f = mask().fld(pos); + if (f.is_edit()) + b = ((TEdit_field&)f).browse(); + } return b; } @@ -3236,10 +3255,8 @@ bool TEdit_field::parse_item(TScanner& scanner) if (scanner.key() == "CO") // Copyuse { - const TString16 what(scanner.popkey()); + const TString8 what(scanner.popkey()); const TBrowse* b = parse_browse(scanner); - - CHECK(b,"Impossibile copiare la browse da un campo visto che quel campo non l'ha" ); if (b) { if (what == "US" || what == "AL") @@ -3788,6 +3805,15 @@ bool TEdit_field::on_key(KEY key) } } break; + case K_F12: + { + TVirtual_keyboard keyboard(*this); + + get_window_data(); + keyboard.run(); + return true; + } + break; case K_CTRL+K_SPACE: set_dirty(TRUE); return handler(K_SPACE); @@ -4205,6 +4231,15 @@ bool TReal_field::on_key(KEY key) beep(); return ok; } + else + if (key == K_F12) + { + TVirtual_numpad numpad(*this); + + get_window_data(); + numpad.run(); + return true; + } } return TEdit_field::on_key(key); @@ -4461,6 +4496,14 @@ bool TCurrency_field::on_key(KEY key) case '-': ok = !_flags.uppercase; break; + case K_F12 : + { + TVirtual_numpad numpad(*this, true); + + get_window_data(); + numpad.run(); + return true; + } default : ok = strchr("0123456789.,+*-/()", key) != NULL; break; diff --git a/include/maskfld.h b/include/maskfld.h index 8ea833bc7..feeb460e0 100755 --- a/include/maskfld.h +++ b/include/maskfld.h @@ -152,6 +152,8 @@ public: // TObject virtual bool is_kind_of(word cid) const; public: + // @cmember Imposta la posizione a + void set_pos(int pos = -1); // @cmember Costruisce il campo da file void construct(TScanner& scanner, WINDOW parent); // @cmember Converte una stringa in un identificatore di controllo @@ -181,6 +183,10 @@ public: // @cmember Setta lo stato di dirty del campo void set_dirty(byte d = true); + // @cmember ritorna il trim degli spazi + byte trim() const + { return _flags.trim; } + // @cmember Abilita il trim degli spazi void set_trim(bool t) { _flags.trim = byte(t ? 3 : 0); } @@ -208,6 +214,10 @@ public: bool zerofilled() const { return _flags.zerofilled; } + // @cmember Ritorna TRUE se il campo e' password + bool password() const + { return _flags.password; } + // @cmember Verifica se l'inserimento del carattere pipe e' stato abilitato bool pipe_allowed() const { return _flags.pipeallowed; } @@ -548,7 +558,8 @@ public: { return _exit_key; } void set_exit_key(KEY k) { _exit_key = k; } - void set_bmp(short up, short dn); + void set_bmp(short up, short dn = 0); + void set_bmp(const char * up, const char * dn = NULL); void set_central_icon(unsigned int icon); // @cmember Costruttore @@ -1132,11 +1143,11 @@ protected: // @cmember Imposta lo sfondo del campo void set_background(); + // @access Public Member +public: // @cmember Setta il flag read-only virtual void set_read_only(bool r); - // @access Public Member -public: // @cmember Ritorna l'identificatore della classe virtual word class_id() const; // @cmember Legge un item del controllo dal file

diff --git a/include/msksheet.cpp b/include/msksheet.cpp index e1aa642d7..4ea190f25 100755 --- a/include/msksheet.cpp +++ b/include/msksheet.cpp @@ -1009,7 +1009,7 @@ bool TSpreadsheet::off_cell_handler(XI_OBJ *cell) _cell_dirty = FALSE; if (_row_dirty) { - owner().mask().notify_focus_field(owner().dlg()); // A volte si diverte a perdere il focus + owner().mask().notify_focus_field(id()); // A volte si diverte a perdere il focus mask2str(_cur_rec); // Update sheet row } } @@ -1215,13 +1215,13 @@ bool TSpreadsheet::event_handler(XI_OBJ* itf, XI_EVENT *xiev) if (items() > 0 && !owner().append()) { // XI_OBJ* itf = get_interface(); - if (owner().mask().focus_field().dlg() == owner().dlg()) + if (owner().mask().focus_field().dlg() == id()) rec = _cur_rec + 1; else rec = 0; } - insert(rec, TRUE, TRUE); - owner().mask().notify_focus_field(owner().dlg()); + insert(rec, true, true); + owner().mask().notify_focus_field(id()); } } } @@ -1348,7 +1348,7 @@ bool TSpreadsheet::event_handler(XI_OBJ* itf, XI_EVENT *xiev) } break; case XIE_ON_LIST: - owner().mask().notify_focus_field(owner().dlg()); + owner().mask().notify_focus_field(id()); break; case XIE_OFF_LIST: on_idle(); @@ -1443,12 +1443,12 @@ bool TSpreadsheet::event_handler(XI_OBJ* itf, XI_EVENT *xiev) EVENT e; e.type = E_UPDATE; xi_eh(_obj->itf->v.itf->xvt_win, &e); #endif + owner().mask().notify_focus_field(id()); // Non si ripete mai abbastanza! } XI_OBJ row; XI_MAKE_ROW(&row, _obj, _cur_row); xi_cell_request(&row); // Update internal values - } break; case XIE_OFF_CELL: @@ -1611,13 +1611,13 @@ bool TSpreadsheet::event_handler(XI_OBJ* itf, XI_EVENT *xiev) if (items() > 0 && !owner().append()) { get_interface(); // verificare - if (owner().mask().focus_field().dlg() == owner().dlg()) + if (owner().mask().focus_field().dlg() == id()) rec = _cur_rec + 1; else rec = 0; } insert(rec, TRUE, TRUE); - owner().mask().notify_focus_field(owner().dlg()); + owner().mask().notify_focus_field(id()); refused = TRUE; } else @@ -2376,7 +2376,7 @@ void TSpreadsheet::str2mask(int riga) // Certified 100% bool TSpreadsheet::notify(int rec, KEY k) { - const bool ok = _notify ? _notify(owner(), rec, k) : TRUE; + const bool ok = _notify ? _notify(owner(), rec, k) : true; if (k == K_ENTER) { const bool cell_dirty = _cell_dirty; // preservato lo stato di cell_dirty diff --git a/include/msksheet.h b/include/msksheet.h index 0c90c2f06..7366b710f 100755 --- a/include/msksheet.h +++ b/include/msksheet.h @@ -276,9 +276,9 @@ public: }; #define FOR_EACH_SHEET_ROW(__sheet, __r, __riga) \ - FOR_EACH_ARRAY_ROW(__sheet.rows_array(), __r, __riga) + FOR_EACH_ARRAY_ROW((__sheet).rows_array(), __r, __riga) #define FOR_EACH_SHEET_ROW_BACK(__sheet, __r, __riga) \ - FOR_EACH_ARRAY_ROW_BACK(__sheet.rows_array(), __r, __riga) + FOR_EACH_ARRAY_ROW_BACK((__sheet).rows_array(), __r, __riga) #endif diff --git a/include/netsock.cpp b/include/netsock.cpp index 39fe8f023..3b12b84c9 100755 --- a/include/netsock.cpp +++ b/include/netsock.cpp @@ -1,8 +1,9 @@ #define XVT_INCL_NATIVE #include -#include -#include + #include +#include +#include #include // skstream.h @@ -713,7 +714,7 @@ bool TSocketClient::ReadLine(CONNID id, TString& str) TSocket_connection* conn = (TSocket_connection*)GetConnection(id); if (conn) return conn->ReadLine(str); - return FALSE; + return false; } void TSocketClient::ReleaseBuffer() @@ -725,84 +726,197 @@ void TSocketClient::ReleaseBuffer() m_dwSize = 0; } } - -bool TSocketClient::HttpGetFile(CONNID id, const char* remote, const char* local, const char* authorization) - +int TSocketClient::HttpGetHeader(CONNID id, const char* remote, const char* authorization, + TString_array& header) { - bool ok = FALSE; - TSocket_connection* conn = (TSocket_connection*)GetConnection(id); - - TString buf(8*1024); + int ret = 0; + + TSocket_connection* conn = (TSocket_connection*)GetConnection(id); + TString buf(4*1024); buf << "GET " << remote << " HTTP/1.1\r\n" << "User-Agent: Campo\r\n" << "Host: " << conn->Server() << "\r\n"; + if (authorization && *authorization) buf << "Authorization: " << authorization << "\r\n"; + + const TFixed_string rem(remote); + buf << "Connection: " << (rem.ends_with("/") ? "Close" : "Keep-Alive") << "\r\n"; + buf << "\r\n"; + header.destroy(); if (WriteLine(id, buf)) { - long size = 0; for (int r = 0; ; r++) { ReadLine(id, buf); if (buf.blank()) break; - if (r == 0 && buf.find("200 OK") < 0) - return FALSE; // File not found - if (buf.compare("Content-length:", 15, TRUE) == 0) + if (r == 0) + ret = atoi(buf.after(' ')); + header.add(buf); + } + } + return ret; +} + +bool TSocketClient::HttpIsRedirectedServer(CONNID id, TString & http_server, TFilename & remote, const char* authorization) +{ + TString_array header; + const bool redirected = HttpGetHeader(id, remote, NULL, header) == 302; + if (redirected) + { + FOR_EACH_ARRAY_ROW(header, r, row) + { + TString& buf = *row; + if (buf.starts_with("Location:", true)) { - const int colon = buf.find(':'); - size = atol(buf.mid(colon+1)); + buf = buf.after(':'); + if (buf.full()) + { + buf.trim(); + if (buf.starts_with("http://", true)) + buf.ltrim(7); + const int slash = buf.find('/'); + if (slash > 0) + { + remote = buf.mid(slash); + if (!remote.ends_with("/")) + remote << '/'; + http_server = buf.left(slash); + } + } } } + } + return redirected; +} + +static const TString& bytes2str(long b) +{ + TString& tmp = get_tmp_string(); + if (b > 0) + { + const long mega = 1024*1024; + if (b >= mega) + tmp.format("%ld MBytes", (b+mega/2)/mega); + else + { + const long kappa = 1024; + if (b >= kappa) + tmp.format("%ld KBytes", (b+kappa/2)/kappa); + else + tmp.format("%ld Bytes", b); + } + } + else + tmp = TR("Dimensione sconosciuta"); + return tmp; +} + +bool TSocketClient::HttpGetFile(CONNID id, const char* remote, const char* local, const char* authorization) +{ + bool ok = false; + + TString_array header; + const int ret = HttpGetHeader(id, remote, authorization, header); + if (ret == 200) + { + long size = -1; // Unknown size + FOR_EACH_ARRAY_ROW(header, r, row) + { + if (row->starts_with("Content-length:", true)) + { + size = atol(row->after(':')); + break; + } + } + if (size == 0) // File not found + return false; + ofstream outfile(local, ios::out | ios::binary); if (outfile.good()) { - buf.cut(0) << remote << " - " << (size / 1024 + 1) << " KBytes"; - TProgind pi(size, buf, TRUE, TRUE); + TString buf(8*1024); + + TToken_string strpi(256, '\n'); + strpi << remote << " - " << bytes2str(size); + strpi.add(TR("Trasferiti")); long total = 0; + + TSocket_connection* conn = (TSocket_connection*)GetConnection(id); skstream* cur_socket = conn->GetSocket(); - while (!cur_socket->eof()) + if (size > 0) // Dimensione nota { - int nchars = buf.size(); - - if (size >0 && nchars > size - total) - nchars = size - total; - cur_socket->read(buf.get_buffer(), nchars); - const int count = cur_socket->gcount(); - if (count > 0) + if (size <= buf.size()) // File piccolo: Niente barra di progresso { - outfile.write(buf, count); - total += count; - pi.setstatus(total); - if (pi.iscancelled()) - break; - if (size > 0 && total >= size) - break; + while (total < size && !cur_socket->eof()) + { + const int nchars = min(buf.size(), size - total); + cur_socket->read(buf.get_buffer(), nchars); + const int count = cur_socket->gcount(); + if (count > 0) + { + total += count; + outfile.write(buf, count); + } + } } + else + { + TProgind pi(size, strpi, true, true); + while (!cur_socket->eof() && !pi.iscancelled()) + { + const int nchars = min(buf.size(), size - total); + cur_socket->read(buf.get_buffer(), nchars); + const int count = cur_socket->gcount(); + if (count > 0) + { + outfile.write(buf, count); + total += count; + if (total >= size || !pi.setstatus(total)) // Controllo se ormai ho finito + break; + strpi.add(TR("Trasferiti"), 1); + strpi << ' ' << bytes2str(total); + pi.set_text(strpi); + } + } + } + ok = total >= size; // Ho finito per bene? + } + else // Dimensione ignota + { + TIndwin pi(100, strpi, true, false); + while (!cur_socket->eof() && !pi.iscancelled()) + { + cur_socket->read(buf.get_buffer(), buf.size()); + const int count = cur_socket->gcount(); + if (count > 0) + { + outfile.write(buf, count); + total += count; + strpi.add(TR("Trasferiti"), 1); + strpi << ' ' << bytes2str(total); + pi.set_text(strpi); + } + } + ok = total > 0 && !pi.iscancelled(); // Ho finito per bene? } - ok = size = 0 ? cur_socket->eof() != 0 : total >= size; } else - error_box("Impossibile scrivere il file %s", local); + error_box(FR("Impossibile scrivere il file %s"), local); } return ok; } -HIDDEN int find_href(const TString& riga) +HIDDEN int find_href(const TString& riga, int from) { int href = -1; - int img = riga.find("= 0) href = riga.find("href=", img+4); - else - { - img = riga.find("= 0) - href = riga.find("HREF=", img+4); - } return href; } @@ -813,21 +927,22 @@ bool TSocketClient::HttpGetDir(CONNID id, const char* remote, TString_array& lis if (ok) { ifstream s(local); - TString riga(256); + TString riga(512); while (!s.eof()) { s.getline(riga.get_buffer(), riga.size()); - const int href = find_href(riga); - if (href > 0) + riga.lower(); + for (int href = find_href(riga, 0); href > 0; href = find_href(riga, href+5)) { const int start = riga.find('"', href) + 1; - if (start > href && isalnum(riga[start + 1])) + if (start > href) { const int stop = riga.find('"', start); if (stop > start) { const TString& name = riga.sub(start, stop); - list.add(name); + if (isdigit(name[0]) || (name[0]>='a' && name[0]<='z')) // isalnum non funziona! + list.add(name); } } } diff --git a/include/netsock.h b/include/netsock.h index bd5125cfe..1ff4e2a8e 100755 --- a/include/netsock.h +++ b/include/netsock.h @@ -37,6 +37,7 @@ class TSocketClient : public TLanClient protected: // TLanClient virtual TConnection* OnQueryConnection(const char* service, const char* server); + int HttpGetHeader(CONNID id, const char* remote, const char* authorization, TString_array& header); public: virtual bool Request(CONNID id, const char* cmd); @@ -47,6 +48,7 @@ public: bool WriteLine(CONNID id, const char* str); bool ReadLine(CONNID id, TString& str); + bool HttpIsRedirectedServer(CONNID id, TString & http_server, TFilename & remote, const char* authorization = NULL); bool HttpGetFile(CONNID id, const char* remote, const char* local, const char* authorization = NULL); bool HttpGetDir(CONNID id, const char* remote, TString_array& list); bool HttpSoap(CONNID id, const char* query); diff --git a/include/prefix.cpp b/include/prefix.cpp index a67820543..e296f7e4e 100755 --- a/include/prefix.cpp +++ b/include/prefix.cpp @@ -1295,6 +1295,100 @@ bool TPrefix::build_firm_data(long codditta, bool flagcom) set_codditta(codditta); set_autoload_new_files(TRUE); - return TRUE; + return true; } +/////////////////////////////////////////////////////////// +// TTable name converter +/////////////////////////////////////////////////////////// + +class TTable_names : public TObject +{ + TAssoc_array _names; + TArray _ids; + long _filled; + +protected: + void fill(); + void add_file(int logic, const TString& table); + +public: + const TString& name(int logic_num); + int logic_num(const TString& name); + + TTable_names() : _filled(-1) { } +} _table_names; + +void TTable_names::add_file(int logic, const TString& table) +{ + TString8* id = new TString8; + id->format("%d", logic); + _names.add(table, id); + _ids.add(table, logic); +} + +void TTable_names::fill() +{ + if (_filled != prefix().get_codditta()) + { + FileDes dir; + CGetFile(LF_DIR, &dir, _nolock, NORDIR); + const int nfiles = (int)dir.EOD; + + TFilename n; + for (int logic = LF_USER; logic <= nfiles; logic++) + { + const FileDes& fd = prefix().get_filedes(logic); + n = fd.SysName; n = n.name(); n.upper(); + if (_names.objptr(n) == NULL) + add_file(logic, n); + } + _filled = prefix().get_codditta(); + } +} + +int TTable_names::logic_num(const TString& n) +{ + // Non cambiare: n puo' essere temporaneo e pieno di spazi! + TString80 name = n; name.trim(); + if (isdigit(name[0]) || name[0] == '-') + { + int num = atoi(name); + if (name[name.len()-1] == '@') + num = -num; + return num; + } + + if (name[0] == '%' && name.len() == 4) + return LF_TABCOM; + + name.upper(); + TString* str = (TString*)_names.objptr(name); + if (str == NULL) + { + fill(); + str = (TString*)_names.objptr(name); + } + + if (str == NULL && name.len() == 3) + return LF_TAB; + + return str == NULL ? 0 : atoi(*str); +} + +const TString& TTable_names::name(int logic_num) +{ + TString* str = (TString*)_ids.objptr(logic_num); + if (str == NULL) + { + fill(); + str = (TString*)_ids.objptr(logic_num); + } + return str == NULL ? (const TString&)EMPTY_STRING : *str; +} + +const TString& logic2table(int logic_num) +{ return _table_names.name(logic_num); } + +int table2logic(const TString& name) +{ return _table_names.logic_num(name); } diff --git a/include/prefix.h b/include/prefix.h index c0e596831..b5a85b340 100755 --- a/include/prefix.h +++ b/include/prefix.h @@ -69,14 +69,13 @@ class TFirm : public TObject { TAssoc_array _rec; -protected: - const TString& get(const char* attr) const; - long get_long(const char* attr) const; - public: bool read(long code); TFirm& operator=(long code) { read(code); return *this; } + const TString& get(const char* attr) const; + long get_long(const char* attr) const; + long codice() const; const TString& codice_valuta() const; const TString& ragione_sociale() const; @@ -229,5 +228,8 @@ bool prefix_valid(); TPrefix& prefix(); void prefix_destroy(); +const TString& logic2table(int logic_num); +int table2logic(const TString& name); + #endif // __PREFIX_H diff --git a/include/progind.cpp b/include/progind.cpp index 220d32a51..b4ab86320 100755 --- a/include/progind.cpp +++ b/include/progind.cpp @@ -248,7 +248,7 @@ void TIndwin::on_button(short id) // TProgind -------------------------------------------------------------- TProgind::TProgind(long max, const char* txt, bool cancel, bool bar, int div) - : TIndwin(max, txt, cancel, bar, div) + : TIndwin(max, txt, cancel, bar, div), _next_update(0) {} bool TProgind::setstatus(long l) @@ -258,15 +258,16 @@ bool TProgind::setstatus(long l) NFCHECK("Negative progind status"); l = 0; } - const long old_perc = _status * 100L / _max; + _status = l > _max ? _max : l; - const long new_perc = _status * 100L / _max; - const bool tictac = new_perc != old_perc; - if (tictac) + + if (clock() > _next_update) { update(); - do_events(); - } + do_events(); + _next_update = clock()+CLOCKS_PER_SEC; // Prossimo aggiornamento tra un secondo + } + return !iscancelled(); } diff --git a/include/progind.h b/include/progind.h index 14eb68c96..1905bc645 100755 --- a/include/progind.h +++ b/include/progind.h @@ -103,6 +103,8 @@ public: class TProgind : public TIndwin // @author:(INTERNAL) Villa { + clock_t _next_update; + // @access Public Member public: // @cmember Setta lo stato della barra d'attesa diff --git a/include/recset.cpp b/include/recset.cpp index 3894b0878..e42b99a84 100755 --- a/include/recset.cpp +++ b/include/recset.cpp @@ -199,11 +199,9 @@ bool TRecordset::save_as_html(const char* path) out << " " << endl; TString val; - for (TRecnotype n = 0; n < items(); n++) + for (bool ok = move_first(); ok; ok = move_next()) { - move_to(n); - pi.addstatus(1); - if (pi.iscancelled()) + if (!pi.addstatus(1)) break; out << " " << endl; for (unsigned int c = 0; c < columns(); c++) @@ -250,34 +248,36 @@ bool TRecordset::save_as_silk(const char* path) for (unsigned int c = 0; c < columns(); c++) { const TRecordset_column_info& ci = column_info(c); - out << "C;Y1;X" << (c+1) << ";K\"" << ci._name << '"' << endl; + out << 'C'; + if (c == 0) out << ";Y1"; + out << ";X" << (c+1) << ";K\"" << ci._name << '"' << endl; } TString val; - for (TRecnotype n = 0; n < items(); n++) + for (bool ok = move_first(); ok; ok = move_next()) { - move_to(n); - pi.addstatus(1); - if (pi.iscancelled()) - break; for (unsigned int c = 0; c < columns(); c++) { - const TRecordset_column_info& ci = column_info(c); - const bool is_alpha = ci._type == _alfafld || ci._type == _charfld || - ci._type == _memofld || ci._type == _datefld; - - out << "C;Y" << (n+2) << ";X" << (c+1) << ";K"; - if (is_alpha) out << '"'; - get(c).as_string(val); - if (!val.blank()) + out << 'C'; + if (c == 0) out << ";Y" << (current_row()+2); + const TVariant& var = get(c); + if (!var.is_empty()) { - val.rtrim(); - val.replace('"', '\''); - out << val; + out << ";X" << (c+1) << ";K"; + var.as_string(val); + if (var.type() == _alfafld || var.type() == _datefld) + { + val.rtrim(); + val.replace('"', '\''); + out << '"' << val << '"'; + } + else + out << val; } - if (is_alpha) out << '"'; out << endl; } + if (!pi.addstatus(1)) + break; } out << "E" << endl; @@ -290,23 +290,25 @@ bool TRecordset::save_as_text(const char* path) ofstream out(path); TString val; - for (TRecnotype n = 0; n < items(); n++) + for (bool ok = move_first(); ok; ok = move_next()) { - move_to(n); for (unsigned int c = 0; c < columns(); c++) { if (c > 0) out << '\t'; - get(c).as_string(val); - if (!val.blank()) + const TVariant& var = get(c); + if (!var.is_empty()) { + var.as_string(val); val.rtrim(); - out << val; + if (val.find('\n') >= 0 || val.find('\t') >= 0) + out << unesc(val); // Evitiamo doppi separatori di campo e record + else + out << val; } } out << endl; - pi.addstatus(1); - if (pi.iscancelled()) + if (!pi.addstatus(1)) break; } @@ -333,24 +335,31 @@ bool TRecordset::save_as_campo(const char* path) out << endl << endl << "[Data]" << endl; TString val; - for (TRecnotype n = 0; n < items(); n++) + for (bool ok = move_first(); ok; ok = move_next()) { - move_to(n); for (unsigned int c = 0; c < columns(); c++) { if (c > 0) out << '|'; - get(c).as_string(val); - if (!val.blank()) + const TVariant& var = get(c); + if (!var.is_empty()) { - val.rtrim(); - val = unesc(val); - out << val; + var.as_string(val); + if (var.type() == _alfafld) + { + val.rtrim(); + val.replace('|', SAFE_PIPE_CHR); // Evitiamo doppi separatori di campo + if (val.find('\n') >= 0) // Evitiamo doppi separatori di record + out << unesc(val); + else + out << val; + } + else + out << val; } } out << endl; - pi.addstatus(1); - if (pi.iscancelled()) + if (!pi.addstatus(1)) break; } return !pi.iscancelled(); @@ -363,7 +372,7 @@ bool TRecordset::save_as(const char* path, TRecordsetExportFormat fmt, int mode) TString ext; xvt_fsys_parse_pathname(path, NULL, NULL, NULL, ext.get_buffer(), NULL); ext.lower(); - if (ext.starts_with("htm")) + if (ext == "htm" || ext == "html" || ext == "xml") fmt = fmt_html; else if (ext == "xls" || ext == "slk") fmt = fmt_silk; @@ -428,9 +437,9 @@ const TVariant& TRecordset::get(const char* column_name) const int s = str.find(subfield); if (s == 0 || (s > 0 && str[s-1] < ' ')) { - static TVariant var; s += subfield.len(); const int e = str.find('\n', s); + TVariant& var = get_tmp_var(); var.set(str.sub(s, e)); return var; } @@ -485,7 +494,7 @@ bool is_var_separator(char c) { if (isspace(c)) return true; - return strchr("<=>(,", c) != NULL; + return strchr("<=>+-*/(,.", c) != NULL; } // Cerca le variabili nel testo SQL: @@ -1982,7 +1991,7 @@ const TRecordset_column_info& TISAM_recordset::column_info(size_t i) const TCursor* TISAM_recordset::cursor() const { - if (_cursor == NULL && !_use.blank()) + if (_cursor == NULL && _use.full()) { TString use; parsed_text(use); TPerformance_profiler prof("ISAM query"); @@ -2051,16 +2060,7 @@ bool TISAM_recordset::move_to(TRecnotype pos) void TISAM_recordset::reset() { _column.destroy(); - if (_relation != NULL) - { - delete _relation; - _relation = NULL; - } - if (_cursor != NULL) - { - delete _cursor; - _cursor = NULL; - } + requery(); } void TISAM_recordset::requery() @@ -2070,6 +2070,11 @@ void TISAM_recordset::requery() delete _cursor; _cursor = NULL; } + if (_relation != NULL) + { + delete _relation; + _relation = NULL; + } } void TISAM_recordset::set(const char* use) @@ -2087,7 +2092,7 @@ TISAM_recordset::TISAM_recordset(const char* use) TISAM_recordset::~TISAM_recordset() { - reset(); + requery(); } /////////////////////////////////////////////////////////// diff --git a/include/recset.h b/include/recset.h index ccb86fe48..3b6f20ff3 100755 --- a/include/recset.h +++ b/include/recset.h @@ -142,7 +142,7 @@ protected: public: bool valid_cursor() { return _cursor != NULL; } - TCursor* cursor() const; + virtual TCursor* cursor() const; void set(const char* use); virtual void requery(); virtual TRecnotype items() const; diff --git a/include/relapp.cpp b/include/relapp.cpp index 31952ed1f..a3c9bc874 100755 --- a/include/relapp.cpp +++ b/include/relapp.cpp @@ -23,19 +23,16 @@ TRelation_application::~TRelation_application() TCursor& TRelation_application::get_filtered_cursor() const { - TEdit_field& f = get_search_field(); - TCursor* cur = f.browse()->cursor(); - return *cur; + const TEdit_field& f = get_search_field(); + return *f.browse()->cursor(); } void TRelation_application::setkey() { if (has_filtered_cursor()) - { get_filtered_cursor().setkey(); - return; // ????? - } - file().setkey(1); + else + file().setkey(1); } void TRelation_application::set_key_filter() @@ -85,46 +82,46 @@ void TRelation_application::set_limits( { if (has_filtered_cursor()) { - TEdit_field& f = get_search_field(); - TBrowse* b = f.browse(); - TCursor* cur = b != NULL ? b->cursor() : NULL; - if (cur) + const TEdit_field& f = get_search_field(); + if (f.browse() != NULL) + f.browse()->do_input(true); + + TCursor& cur = get_filtered_cursor(); + cur.setkey(); + if (cur.items() > 0) { - cur->setkey(); - b->do_input(TRUE); - if (cur->items() == 0) - _first = _last = -1; - else + if (what & 0x1) { - if (what & 0x1) - { - *cur = 0; - _first = cur->file().recno(); - } - if (what & 0x2) - { - *cur = cur->items() - 1; - _last = cur->file().recno(); - } + cur = 0; + _first = cur.file().recno(); + } + if (what & 0x2) + { + cur = cur.items() - 1; + _last = cur.file().recno(); } - return; } + else + _first = _last = -1; } - - file().setkey(1); - if (what & 0x1) + else { - if (!file().empty() && file().first() == NOERR) - _first = file().recno(); - else - _first = -1; - } - if (what & 0x2) - { - if (!file().empty() && file().last() == NOERR) - _last = file().recno(); - else - _last = -1; + setkey(); + if (!file().empty()) + { + if (what & 0x1) + { + if (file().first() == NOERR) + _first = file().recno(); + } + if (what & 0x2) + { + if (file().last() == NOERR) + _last = file().recno(); + } + } + else + _first = _last = -1; } } @@ -436,10 +433,10 @@ void TRelation_application::query_mode( void TRelation_application::insert_mode() { - bool try_auto = TRUE; + bool try_auto = true; if (_mask->query_mode()) - try_auto = test_key(1, FALSE) == FALSE; + try_auto = !test_key(1, FALSE); if (try_auto && !autonum(_mask, FALSE)) { @@ -1110,6 +1107,8 @@ bool TRelation_application::save(bool check_dirty) int TRelation_application::read(TMask& m) { const TRelation &r = *get_relation(); + +/* Metodo VECCHIO! const int max = m.fields(); for (int i = 0; i < max; i++) { @@ -1120,6 +1119,16 @@ int TRelation_application::read(TMask& m) f.record()->read(*f.putkey(r)); } } +*/ + if (m.sheets() > 0) // Metodo Salvatempo + { + FOR_EACH_MASK_SHEET(m, i, s) + { + if (s->record() && !s->external_record()) + s->record()->read(*s->putkey(r)); + } + } + m.autoload(r); return NOERR; } @@ -1336,7 +1345,7 @@ void TRelation_application::main_loop() case K_SAVE: if (save(FALSE)) { - if ((_autoins_caller.not_empty() || is_transaction()) && _curr_trans_mode != TM_REMAIN) + if ((_autoins_caller.full() || is_transaction()) && _curr_trans_mode != TM_REMAIN) { k = K_QUIT; } diff --git a/include/relapp.h b/include/relapp.h index d0aae9594..816ee315d 100755 --- a/include/relapp.h +++ b/include/relapp.h @@ -234,11 +234,11 @@ protected: virtual void ini2sheet(TConfig& ini, TSheet_field &sheet); virtual void sheet2ini(TSheet_field &sheet,TConfig& ini); virtual void ini2mask(TConfig& ini, TMask& m, bool query); - virtual void mask2ini(const TMask& m, TConfig& ini); virtual bool mask2mail(const TMask& m); // @access Public Member public: + virtual void mask2ini(const TMask& m, TConfig& ini); // @cmember Ritorna la relazione da modificare virtual TRelation* get_relation() const pure; @@ -253,7 +253,7 @@ public: bool filtered() const { return _fixed.not_empty(); } // @cmember Cerca un record corrispondente alla chiave

(0 prima chiave completa) - bool find(word key = 0); + virtual bool find(word key = 0); // @cmember Costruisce il membro void set_link(TMask & m, const char * keyexpr); // @cmember Ritorna TRUE se e' stato chiamato col messaggio di link diff --git a/include/relation.cpp b/include/relation.cpp index 8f64daca1..b6697f7ad 100755 --- a/include/relation.cpp +++ b/include/relation.cpp @@ -2053,28 +2053,20 @@ TSorted_cursor::~TSorted_cursor() int name2log( const char* name) // @parm Stringa da convertire { - int log = 0; - - if (name) - while (*name == ' ') name++; - - if (name && *name) - { - if (isdigit(*name) || *name == '-') - { - log = atoi(name); - if (strchr(name, '@')) log = -log; - } - else - { - const int len = strlen(name); - if (len == 3 || len == 4) - log = TTable::name2log(name); - } - - CHECKS(log != 0, "Non e' un file ne' una tabella: ", name); - } + int log = 0; + if (name) + { + while (isspace(*name)) + name++; + + if (*name) + { + log = table2logic(TFixed_string(name)); + + CHECKS(log != 0, "Non e' un file ne' una tabella: ", name); + } + } return log; } @@ -2411,9 +2403,7 @@ void TRelation_description::read_rel() const char* tn = tt.get(0); // Codice del file o tabella - int which_file = atoi(tn); // Non spostare questa riga (tn puo' cambiare!) - if (which_file == 0) - which_file = TTable::name2log(tn); // Numero logico del file + const int which_file = name2log(tn); // Numero logico del file if (tn[0] == '%' || tn[0] == '$') descfname << (tn+1); diff --git a/include/report.cpp b/include/report.cpp index fdba4af4a..97a092b3d 100755 --- a/include/report.cpp +++ b/include/report.cpp @@ -670,8 +670,8 @@ void TReport_section::save(TXmlItem& root) const item.AddChild("condition") << condition(); if (grouped_by().not_empty()) item.AddChild("groupby") << grouped_by(); - if (_recordset != NULL) - item.AddChild("sql") << _recordset->query_text(); + if (recordset() != NULL) + item.AddChild("sql") << recordset()->query_text(); if (has_font()) _font->save(item); @@ -1256,7 +1256,7 @@ void TReport_field::set(const TVariant& var) bool TReport_field::load_field() { - const bool ok = !_field.blank(); + const bool ok = _field.full(); if (ok) { const TFieldtypes ft = var_type(); @@ -1914,8 +1914,8 @@ void TReport::load_printer_font() void TReport::update_recordset_parent() { - if (_recordset != NULL) - _recordset->set_parent(NULL); + if (recordset() != NULL) + recordset()->set_parent(NULL); for (int i = find_max_level('B'); i > 0; i--) section('B', i).update_recordset_parent(); } @@ -2187,8 +2187,8 @@ bool TReport::save(const char* fname) const } } - if (_recordset != NULL) - xml.AddChild("sql") << _recordset->query_text(); + if (recordset() != NULL) + xml.AddChild("sql") << recordset()->query_text(); _prescript.save(xml, "prescript"); _postscript.save(xml, "postscript"); @@ -2340,7 +2340,7 @@ bool TReport::get_report_field(const TString& name, TVariant& var) const bool TReport::get_record_field(const TString& name, TVariant& var) const { bool found = false; - if (_recordset != NULL) + if (recordset() != NULL) { const char* str = name; if (name.starts_with("#RECORD.")) @@ -2353,7 +2353,7 @@ bool TReport::get_record_field(const TString& name, TVariant& var) const // Se non lo trovo, allora lo cerco nel recordset principale if (!found) { - var = _recordset->get(str); + var = recordset()->get(str); if (!var.is_null()) found = true; } @@ -2660,14 +2660,27 @@ void TReport::do_isam_read_output(const TRectype& file, TToken_string& out) void TReport::msg_isam_read(TVariant_stack& stack) { - const TString& f_code = stack.pop().as_string(); // prende il codice del file da leggere + int fkey = 1; // numero e chiave del file da leggere + + TString16 f_code = stack.pop().as_string(); // prende il codice del file da leggere + const int exclam = f_code.find('!'); + if (exclam > 0) + { + fkey = atoi(f_code.mid(exclam+1)); + f_code.cut(exclam); + } + const int logicnum = table2logic(f_code); if (logicnum < LF_USER) return; // File sconosciuto TRectype keyrec(logicnum); if (logicnum == LF_TAB || logicnum == LF_TABCOM) + { + if (f_code[0] == '%') + f_code.ltrim(1); keyrec.put("COD", f_code); + } TToken_string in(stack.pop().as_string(), '!'); TVariant var; @@ -2686,9 +2699,24 @@ void TReport::msg_isam_read(TVariant_stack& stack) keyrec.put(fld, var.as_string()); // scrive il risultato dell'espressione nel campo del file } + + TToken_string out(stack.pop().as_string(), '!'); // Lista dei campi di output + + if (fkey <= 1) + { const TRectype& rec = cache().get(keyrec); - TToken_string out(stack.pop().as_string(), '!'); do_isam_read_output(rec, out); // Se rec e' vuoto azzera gli outputs + } + else + { + TLocalisamfile file(logicnum); + TRectype& rec = file.curr(); + rec = keyrec; + file.setkey(fkey); + if (file.read() != NOERR) + rec.zero(); + do_isam_read_output(rec, out); // Se rec e' vuoto azzera gli outputs + } } void TReport::msg_table_read(TVariant_stack& stack) @@ -3032,4 +3060,4 @@ TReport::TReport() TReport::~TReport() { destroy(); -} \ No newline at end of file +} diff --git a/include/report.h b/include/report.h index 67bf90b2d..3c03863ea 100755 --- a/include/report.h +++ b/include/report.h @@ -1,18 +1,14 @@ #ifndef __REPORT_H #define __REPORT_H -#ifndef __IMAGE_H -#include -#endif - -#ifndef __ISAMS_H -class TRectype; -#endif - #ifndef __WINDOW_H #include #endif +#ifndef __IMAGE_H +#include +#endif + #ifndef __XML_H #include #endif @@ -25,6 +21,10 @@ class TRectype; #include #endif +#ifndef __ISAM_H +class TRectype; +#endif + /////////////////////////////////////////////////////////// // TReport_font /////////////////////////////////////////////////////////// @@ -528,8 +528,8 @@ public: int print_lpi() const; virtual bool set_recordset(const TString& sql); - bool set_recordset(TRecordset* sql); - TRecordset* recordset() const { return _recordset; } + virtual bool set_recordset(TRecordset* sql); + virtual TRecordset* recordset() const { return _recordset; } bool evaluate_atom(const char* atom, TVariant& var); bool evaluate(const char* expr, TVariant& var, TFieldtypes force_type); diff --git a/include/reprint.cpp b/include/reprint.cpp index 9ebe2cabe..a6a8ec1d8 100755 --- a/include/reprint.cpp +++ b/include/reprint.cpp @@ -1087,9 +1087,12 @@ void TBook::draw_image(const TRectangle& rect, const char* name) void TBook::add_doc(const TString& name) { - TBook::open_page(); - *_out << ""<< endl; - TBook::close_page(); + if (name.full()) + { + TBook::open_page(); + *_out << ""<< endl; + TBook::close_page(); + } } /////////////////////////////////////////////////////////// @@ -2260,6 +2263,37 @@ void TReport_book::print_subsections(int father) } } +void TReport_book::add_doc(const TString& name) +{ + if (name.ends_with(".rep", true)) // Tratto a parte i report! + { + TReport* eminem = new TReport; + if (eminem->load(name)) + { + TReport* rep = _report; // Salvo variabile globale + + if (rep->use_mask()) + { + TFilename msk = rep->filename().name(); + msk.ext("msk"); + if (msk.custom_path()) + { + TMask m(msk); + rep->report2mask(m); + eminem->mask2report(m); + } + } + + add(*eminem, true); + _report = rep; // Ripristino variabile globale + } + delete eminem; + } + else + TBook::add_doc(name); +} + + bool TReport_book::add(TReport& rep, bool progind) { if (!init(rep)) @@ -2297,7 +2331,7 @@ bool TReport_book::add(TReport& rep, bool progind) _rep_page = rep.last_printed_page(); // Azzera numero di pagina relativo _is_last_page = false; - bool ok = rex->move_to(0); + bool ok = rex->move_first(); open_page(); for (; ok && !_print_aborted; ok = rex->move_next()) diff --git a/include/reprint.h b/include/reprint.h index a554611d0..3f90daeed 100755 --- a/include/reprint.h +++ b/include/reprint.h @@ -103,6 +103,7 @@ class TReport_book : public TBook protected: virtual bool open_page(); virtual bool close_page(); + virtual void add_doc(const TString& name); virtual void define_frame(const TRectangle& r); virtual bool on_link(const TReport_link& lnk); diff --git a/include/righef24.h b/include/righef24.h new file mode 100755 index 000000000..65bfaabd4 --- /dev/null +++ b/include/righef24.h @@ -0,0 +1,23 @@ +#ifndef __RIGHE_F24 +#define __RIGHE_F24 + +#define F24_PROGR "PROGR" +#define F24_F24 "F24" +#define F24_TRIBUTO "TRIBUTO" +#define F24_TIPOINTEST "TIPOINTEST" +#define F24_INTEST "INTEST" +#define F24_DESCR "DESCR" +#define F24_DATASCAD "DATASCAD" +#define F24_DATAVERS "DATAVERS" +#define F24_ABI "ABI" +#define F24_CAB "CAB" +#define F24_RATEAZIONE "RATEAZIONE" +#define F24_ANNO "ANNO" +#define F24_IMPORTODEB "IMPORTODEB" +#define F24_IMPORTOCRE "IMPORTOCRE" +#define F24_SEDE "SEDE" +#define F24_MATRICOLA "MATRICOLA" +#define F24_PERIODODA "PERIODODA" +#define F24_PERIODOA "PERIODOA" + +#endif diff --git a/include/tabapp.cpp b/include/tabapp.cpp index 255be1183..ccc178792 100755 --- a/include/tabapp.cpp +++ b/include/tabapp.cpp @@ -136,7 +136,6 @@ bool TTable_application::user_destroy() return TRUE; } - /////////////////////////////////////////////////// // Tabelle Multirel /////////////////////////////////////////////////// @@ -176,6 +175,60 @@ void TMultirel_application::get_mask_name(TString& tabname) const tabname << _tabname; } +bool TMultirel_application::find(word k) +{ + bool ok = TRelation_application::find(k); + + if (!ok && k < 2) + { + file().setkey(1); + file().zero(); + for (TEditable_field* e = get_mask()->get_key_field(1, true); e; e = get_mask()->get_key_field(1, false)) + { + if (e->shown() || e->ghost()) // Ignora campi invisibili non ghost + e->autosave(*get_relation()); + } + + TRectype rec(file().curr()); + ok = file().read(_isequal) == NOERR; + } + + return ok; +} + +void TMultirel_application::init_insert_mode(TMask& m) +{ + for (int i = m.fields() - 1; i >= 0; i--) + { + TMask_field& c = m.fld(i); + if (c.in_group(1) && c.is_edit()) + { + TEdit_field& e = (TEdit_field&)c; + + e.enable(); + if (e.browse() != NULL) + e.enable_check(); + _second = e.get(); + } + } + +} + +int TMultirel_application::rewrite(const TMask& m) +{ + int err = TRelation_application::write(m); + + if (err == NOERR) + { + TRelation & rel = *get_relation(); + + rel.save_status(); + rel.lfile().put("SECOND", _second); + rel.remove(); + rel.restore_status(); + } + return err; +} bool TMultirel_application::user_create() { diff --git a/include/tabapp.h b/include/tabapp.h index 6a91b9156..0ce79947d 100755 --- a/include/tabapp.h +++ b/include/tabapp.h @@ -68,7 +68,6 @@ public: virtual ~TTable_application(); }; - /////////////////////////////////////////////////////////////// // Tabelle multirel /////////////////////////////////////////////////////////////// @@ -86,6 +85,8 @@ class TMultirel_application : public TRelation_application TRelation* _rel; // @cmember:(INTERNAL) Nome della tabella da utilizzare TString _tabname; + // @cmember:(INTERNAL) valore iniziale campo collegato + TString _second; // @access Protected Member protected: @@ -98,19 +99,25 @@ protected: virtual bool changing_mask(int mode); // @cmember Ritorna la relazione da modificare virtual TRelation* get_relation() const; + // @cmember Inizializza la maschera per il modo inserimento + virtual void init_insert_mode(TMask& m); + // @cmember Inizializza la maschera per il modo modifica + virtual void init_modify_mode(TMask& m) { init_insert_mode(m);} // @cmember Inizializzazione dei dati dell'utente virtual bool user_create() ; // @cmember Distruzione dei dati dell'utente virtual bool user_destroy() ; // @cmember Chiama il programma di stampa virtual void print(); - + // @cmember Riscrive sulla relazione i valori dalla maschera

+ virtual int rewrite(const TMask& m); // @access Public Member public: // @cmember Ritorna il nome della tabella const TString& get_tabname() const { return _tabname; } + virtual bool find(word key = 0); // @cmember Costruttore TMultirel_application(); diff --git a/include/variant.cpp b/include/variant.cpp index 0720713b5..5c756827b 100755 --- a/include/variant.cpp +++ b/include/variant.cpp @@ -120,7 +120,7 @@ bool TVariant::as_bool() const { bool ok = false; if (_type == _alfafld) - ok = strchr("1XY", as_string()[0]) != NULL; + ok = strchr("1VXY", as_string()[0]) != NULL; else ok = as_int() != 0; return ok; @@ -179,11 +179,16 @@ void TVariant::convert_to(TFieldtypes ft) { switch (ft) { - case _alfafld: set(as_string()); break; - case _datefld: set(as_date()); break; - case _longfld: set(as_int()); break; - case _realfld: set(as_real()); break; - default : set_null(); break; + case _nullfld : set_null(); break; + case _datefld : set(as_date()); break; + case _intfld : + case _intzerofld : + case _longzerofld: + case _wordfld : + case _longfld : set(as_int()); break; + case _boolfld : set(as_bool()); break; + case _realfld : set(as_real()); break; + default : set(as_string()); break; } } } @@ -210,6 +215,11 @@ bool TVariant::is_kind_of(word cid) const return cid == CLASS_VARIANT || TSortable::is_kind_of(cid); } +void TVariant::print_on(ostream& out) const +{ + out << as_string(); +} + int TVariant::compare(const TSortable& s) const { CHECK(s.is_kind_of(CLASS_VARIANT), "Illegal Variant comparison"); diff --git a/include/varmask.cpp b/include/varmask.cpp index 624fa0920..d108f46ea 100755 --- a/include/varmask.cpp +++ b/include/varmask.cpp @@ -14,7 +14,7 @@ void TVariable_mask::set_handler(short fld_id, CONTROL_HANDLER handler) TMask::set_handler( fld_id, handler ); } -void TVariable_mask::set(short fld_id, const char* str, bool hit ) +void TVariable_mask::set(short fld_id, const char* str, byte hit) { if(present( fld_id )) TMask::set( fld_id, str, hit ); diff --git a/include/varmask.h b/include/varmask.h index 88d763885..26000b988 100755 --- a/include/varmask.h +++ b/include/varmask.h @@ -26,7 +26,7 @@ public: // @cmember Esegue il check e i messaggi sul campo

della maschera virtual void check_field( short fld_id ); // @cmember Setta il campo con una stringa - virtual void set(short fld_id, const char* str, bool hit=FALSE); + virtual void set(short fld_id, const char* str, byte hit=0x0); // @cmember Ritorna il contenuto del campo

sotto forma di stringa virtual const TString& get(short fld_id) const; // @cmember Definisce l'handler del campo

diff --git a/include/virtkeyb.cpp b/include/virtkeyb.cpp new file mode 100755 index 000000000..eacb1d6be --- /dev/null +++ b/include/virtkeyb.cpp @@ -0,0 +1,313 @@ +#include +#include +#include +#include +#include + +#define DLG_BACKSPACE 400 +#define DLG_CAPS 401 +#define DLG_LSHIFT 402 +#define DLG_RSHIFT 403 +#define DLG_LARR 404 +#define DLG_RARR 405 +#define DLG_F2 406 +#define DLG_BASE 500 + +bool TVirtual_keyboard::handler(TMask_field& f, KEY key) +{ + if (key == K_SPACE) + { + const short id = f.dlg(); + TVirtual_keyboard & m = (TVirtual_keyboard &) f.mask(); + static bool vk_shift = false; + static bool vk_caps = false; + int & pos = m.pos(); + TMask_field & target = m.field(101); + + target.set_focus(); + + switch (id) + { + case DLG_BACKSPACE : + if (pos > 0) + { + TString val(m.get(101)); + + if (pos == val.len()) + val.rtrim(1); + else + { + const TString v = val.mid(pos); + + val.cut(pos - 1); + val << v; + } + pos--; + target.set(val); + } + break; + case DLG_F2 : + pos = 0; + target.reset(); + break; + case DLG_CAPS : + vk_caps = !vk_caps; + break; + case DLG_RSHIFT : + case DLG_LSHIFT : + vk_shift = true; + break; + case DLG_LARR : + if (pos > 0) + pos--; + break; + case DLG_RARR: + if (pos < target.get().len()) + pos++; + break; + default : + if (id >= DLG_BASE + ' ' && pos < target.size()) + { + char k = id - DLG_BASE; + + if (vk_caps || vk_shift) + k = toupper(k); + vk_shift = false; + + TString val(target.get()); + + val.insert(format("%c", k), pos++); + target.set(val); + } + break; + } + target.set_pos(pos); + } + return true; +} + +void TVirtual_keyboard::create_keyboard_row(int y, const char * keyboard_row) +{ + const TString80 row(keyboard_row); + const int len = row.len(); + RCT rw; + short id; + int x; + TString16 prompt; + + xvt_vobj_get_client_rect(win(), &rw); + const int width = xvt_rect_get_width(&rw); + + x = 0; + for (int i = 0; i < len; i++) + { + unsigned char k = row[i]; + + switch (k) + { + case '\b' : + id = DLG_BACKSPACE; + prompt = "<<"; + break; + case '\n' : + id = DLG_OK; + prompt = "Invio"; + break; + case '\01' : + id = DLG_CAPS; + prompt = "Mai"; + break; + case '\02' : + id = DLG_RSHIFT; + prompt = "Shift"; + break; + case '\03' : + id = DLG_LSHIFT; + prompt = "Shift"; + break; + case '\04' : + id = DLG_LARR; + prompt = "<-"; + break; + case '\05' : + id = DLG_RARR; + prompt = "->"; + break; + case '\06' : + id = DLG_F2; + prompt = "Azzera"; + break; + case '\27' : + id = DLG_CANCEL; + prompt = "Esc"; + break; + default : + if (k >= ' ') + { + id = DLG_BASE + k; + prompt = " "; prompt[0] = k; + } + break; + } + + const int w = prompt.len() > 2 ? 2 : 1; + prompt.insert("@g"); + TButton_field & b = add_button(id, 0, "", x, y, w, 2, ""); + TFilename bmp(prompt); + + if (TImage::build_filename(bmp)) + b.set_bmp(bmp); + else + b.set_prompt(prompt); + + set_handler(id, handler); + + RCT r; + + r.left = x * (width / buttons_per_row() - 4); + r.right = r.left + w * width / buttons_per_row() ; + r.top = (ROWY - 2) * y; + r.bottom = r.top + ROWY * 2; + b.set_rect(r); + x += w; + } +} + +KEY TVirtual_keyboard::run() +{ + if (id2pos(500 + '0') < 0) + init(); + set(101, fld().get()); + _pos = fld().get().len(); + field(101).set_pos(_pos); + + KEY k = TMask::run(); + + if (k == K_ENTER) + { + TMask & mask = fld().mask(); + + fld().set(get(101)); + fld().set_focus(); + mask.send_key(K_TAB, 0); + mask.send_key(K_F12, 0); + } + else + _fld.set_focus(); + return k; +} + +void TVirtual_keyboard::init() +{ + TString flags; + + if (fld().password()) + flags << '*'; + if (fld().roman()) + flags << 'M'; + if (fld().right_justified()) + flags << 'R'; + if (fld().uppercase()) + flags << 'U'; + + byte trim = fld().trim(); + + if (trim == 0) + flags << '_'; + else + if (trim == 1) + flags << '@'; + else + if (trim == 2) + flags << '#'; + + TEdit_field & e = add_string(101, 0, "", 1, 0, fld().size(), flags); + + e.set_read_only(true); + e.allow_pipe(fld().pipe_allowed()); + + create_keyboard_row(1, "1234567890'ģ\b\27"); + create_keyboard_row(3, "qwertyuiopč+\n\06"); + create_keyboard_row(5, "\01asdfghjklņął\04\05"); + create_keyboard_row(7,"\02 m.bottom) + ypos = f.top - 10 - height - xvt_vobj_get_attr(win(), ATTR_TITLE_HEIGHT); // attuaņmente wxWidget ignora i titoli + + + if (xpos + width > m.right) + xpos = f.right - width; + if (xpos < 0) + xpos = 20; + + k.top = ypos; + k.bottom = ypos + height; + k.left = xpos; + k.right = xpos + width; + xvt_vobj_move(win(), &k); +} + +void TVirtual_numpad::init() +{ + TString flags; + + if (fld().password()) + flags << '*'; + if (fld().roman()) + flags << 'M'; + if (fld().right_justified()) + flags << 'R'; + if (fld().uppercase()) + flags << 'U'; + + byte trim = fld().trim(); + + if (trim == 0) + flags << '_'; + else + if (trim == 1) + flags << '@'; + else + if (trim == 2) + flags << '#'; + + if (_currency ) + add_currency(101, 0, "", 1, 0, fld().size(), flags); + else + add_number(101, 0, "", 1, 0, fld().size(), flags, ((TReal_field& )fld()).decimals()); + + field(101).set_read_only(true); + field(101).allow_pipe(fld().pipe_allowed()); + + create_keyboard_row(1, "789\b"); + create_keyboard_row(3, "456-\06"); + create_keyboard_row(5, "123\04\05"); + create_keyboard_row(7, "0,\n\27"); +} + + +TVirtual_numpad::TVirtual_numpad(TMask_field & fld, bool currency, int cols, int rows) + : TVirtual_keyboard(fld, cols, rows), _currency(currency) + +{ +} + + diff --git a/include/virtkeyb.h b/include/virtkeyb.h new file mode 100755 index 000000000..970fd89c5 --- /dev/null +++ b/include/virtkeyb.h @@ -0,0 +1,62 @@ +#ifndef __VIRTKEYB_H +#define __VIRTKEYB_H + +#ifndef __WINDOW_H +#include +#endif + +#ifndef __MASK_H +#include +#endif + +// @doc EXTERNAL +// @doc EXTERNAL + +// @class TVirtual_keyboard | Classe per la gestione della tastiera virtuale +// +// @base public | TMask + +class TVirtual_keyboard : public TMask +{ + TMask_field & _fld; // campo legato alla tastiera + int _pos; + + // @author:(INTERNAL) Guido + + // @access Protected Member +protected: + void create_keyboard_row(int y, const char * keyboard_row); + virtual void init(); + virtual int buttons_per_row() const { return 16;} + int & pos() { return _pos;} + TMask_field & fld() {return _fld;} + static bool handler(TMask_field& f, KEY key); + + // @access Public Member +public: + // @cmember Run della testatiera + virtual KEY run(); + // @cmember Costruttore + TVirtual_keyboard(TMask_field & fld, int cols = 90, int rows = 8); + // @cmember Distruttore + virtual ~TVirtual_keyboard() {} +}; + +class TVirtual_numpad : public TVirtual_keyboard +{ + // @author:(INTERNAL) Guido + bool _currency; + // @access Protected Member +protected: + virtual void init(); + virtual int buttons_per_row() const { return 6;} + + // @access Public Member +public: + // @cmember Costruttore + TVirtual_numpad(TMask_field & fld, bool currency = false, int cols = 35, int rows = 8); + // @cmember Distruttore + virtual ~TVirtual_numpad() {} +}; + +#endif // __VIRTKEYB_H diff --git a/include/window.cpp b/include/window.cpp index 6168e1587..c2dbe7347 100755 --- a/include/window.cpp +++ b/include/window.cpp @@ -232,7 +232,7 @@ void TWindow_manager::destroy() bool TWindow_manager::can_close() const { - bool ok = TRUE; + bool ok = true; if (_current >= 0) ok = cur_win()->can_be_closed(); return ok; diff --git a/ps/indice_programmi.txt b/ps/indice_programmi.txt index 947f4152a..10c3e9e29 100755 --- a/ps/indice_programmi.txt +++ b/ps/indice_programmi.txt @@ -1,6 +1,12 @@ PF0001 Stampa etichette Fiorito +PD0666 +Esportazione clifo e partite a SAP per MEDICASA + +PD0777 +Importazione stipendi in prima nota per OMASA + PD1579 Importazione clienti CoFiDi diff --git a/ps/pd0350_conslinereg.rep b/ps/pd0350_conslinereg.rep index e7af362b5..6c344cd25 100755 --- a/ps/pd0350_conslinereg.rep +++ b/ps/pd0350_conslinereg.rep @@ -71,8 +71,8 @@ MESSAGE RESET,F4.105 PROVINCIA - #THIS @ -"F4.101" ! + #THIS @ +"F4.101" !

diff --git a/ps/pd0350_progart.msk b/ps/pd0350_progart.msk new file mode 100755 index 000000000..cd293403f --- /dev/null +++ b/ps/pd0350_progart.msk @@ -0,0 +1,44 @@ +PA "Stampa progressivo articoli" -1 -1 64 10 +NU 251 5 +BE +PR 1 1 "Ditta " +FL "FRD" +US 9 KE 1 +CH REQUIRED +IN CODDITTA 251 +DI "Codice" CODDITTA +DI "Ragione sociale @50" RAGSOC +OU 251 CODDITTA +OU 252 RAGSOC +EN +ST 252 50 +BE +PR 15 1 "" +FL "D" +EN +DA 256 +BE +PR 1 3 "Dalla data " +FI DADATA +GR 1 +CH RE +EN +DA 257 +BE +PR 40 3 "Alla data " +FI ADATA +GR 2 +CH RE +FL "A" +EN +BU 24 10 2 +BE +PR -12 -1 "~Stampa" +ME EXIT,13 +EN +BU 9 10 2 +BE +PR -22 -1 "" +EN +EN +ENDMASK diff --git a/ps/pd0350_progart.rep b/ps/pd0350_progart.rep new file mode 100755 index 000000000..b5d203c43 --- /dev/null +++ b/ps/pd0350_progart.rep @@ -0,0 +1,83 @@ + + + Progressivo articoli + +
+ + + + #SYSTEM.RAGSOC + + + #SYSTEM.DATE + + + #REPORT.PAGE + + + + #DADATA + + + + #ADATA + + + + + + + +
+
+ + + +
+
+ CODART + MESSAGE RESET,F2.104 +MESSAGE RESET,F2.105 + + +
+
+
+ +
+
+ + #PAGE + +
+
+
+ + + + +
+ USE RMOVMAG KEY 2 +SELECT +(NUM(ANSI(110.DATAREG)E;=ANSI(#DADATA)))(NUM(ANSI(110.DATAREG)C;=ANSI(#ADATA)))(110.CODCAUSC;="02") +JOIN MOVMAG INTO NUMREG=NUMREG +JOIN ANAMAG INTO CODART=CODART + \ No newline at end of file diff --git a/ps/pd0666.cpp b/ps/pd0666.cpp new file mode 100755 index 000000000..4018fafb1 --- /dev/null +++ b/ps/pd0666.cpp @@ -0,0 +1,21 @@ +#include + +#include "pd0666.h" + +int main(int argc,char** argv) +{ + const int s = (argc > 1) ? argv[1][1] - '0' : 0; + + switch (s) + { + case 0 : + default: pd0666100(argc,argv); // Esportazione clifo e partite a SAP di Medicasa + break; + } + exit(0); + return 0; +} + + + + diff --git a/ps/pd0666.h b/ps/pd0666.h new file mode 100755 index 000000000..59e010842 --- /dev/null +++ b/ps/pd0666.h @@ -0,0 +1,3 @@ +int pd0666100(int argc, char* argv[]); + + diff --git a/ps/pd0666100.cpp b/ps/pd0666100.cpp new file mode 100755 index 000000000..331424fce --- /dev/null +++ b/ps/pd0666100.cpp @@ -0,0 +1,319 @@ +#include "pd0666.h" +#include "pd0666100a.h" + +#include +#include +#include +#include +#include + +#include "../cg/cglib01.h" + +#include +#include + + +/////////////////////////////////////////////////////////// +// TEsporta_SAP_mask +/////////////////////////////////////////////////////////// + +class TEsporta_SAP_mask : public TAutomask +{ + +public: + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + TEsporta_SAP_mask(); +}; + + +bool TEsporta_SAP_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ +/* switch (o.dlg()) + { + default: + break; + }*/ + return true; +} + +TEsporta_SAP_mask::TEsporta_SAP_mask() : TAutomask("pd0666100a") +{ + //file dei clienti.. + TFilename file; + file.tempdir(); + file.add("clienti.xls"); + set(F_CLIFILE, file); + //..dei fornitori.. + file.tempdir(); + file.add("fornitori.xls"); + set(F_FORNFILE, file); + //..e delle partite + file.tempdir(); + file.add("partite.xls"); + set(F_PARTFILE, file); +} + + +class TEsporta_SAP_clienti_recordset : public TAS400_recordset +{ +public: + TEsporta_SAP_clienti_recordset(); +}; + +TEsporta_SAP_clienti_recordset::TEsporta_SAP_clienti_recordset() +: TAS400_recordset("AS400(512)") +{ + create_field("KTOKD", -1, 4, _alfafld); //zicc o zicu + create_field("NAME1", -1, 30, _alfafld); //ragsoc1 + create_field("NAME2", -1, 20, _alfafld); //ragsoc2 + create_field("SORTL", -1, 1, _alfafld); //campo non richiesto? + create_field("STRAS", -1, 45, _alfafld); //via+numero + create_field("ORT01", -1, 35, _alfafld); //localita' + create_field("PSTLZ", -1, 5, _alfafld); //cap + create_field("LAND1", -1, 3, _alfafld); //codice paese + create_field("REGIO", -1, 2, _alfafld); //occhio al casino in fase di caricamento! + create_field("SPRAS", -1, 1, _alfafld); //codlin + create_field("TELX1", -1, 40, _alfafld); //somma prefisso+telefono telex + create_field("TELF1", -1, 40, _alfafld); //somma prefisso+telefono ptel1+tel1 + create_field("TELFX", -1, 40, _alfafld); //somma prefisso+telefono fax + create_field("TELF2", -1, 40, _alfafld); //somma prefisso+telefono ptel2+tel2 + create_field("LZONE", -1, 10, _alfafld); //non l'abbiamo + create_field("VBUND", -1, 1, _alfafld); //non l'abbiamo + create_field("STCD1", -1, 16, _alfafld); //non l'abbiamo;cofi + create_field("STCD2", -1, 16, _alfafld); //non l'abbiamo + create_field("BRSCH", -1, 2, _alfafld); //non l'abbiamo + create_field("STCEG", -1, 14, _alfafld); //statopaiv+p.iva + create_field("STKZN", -1, 1, _alfafld); //tipopers + create_field("BUSAB", -1, 2, _alfafld); //non l'abbiamo + create_field("XAUSZ", -1, 1, _alfafld); //non l'abbiamo + create_field("AKONT", -1, 8, _alfafld); //conto da tabella! + create_field("FDGRV", -1, 5, _alfafld); //non l'abbiamo + create_field("ZTERM", -1, 4, _alfafld); //codpag? + create_field("ZAMIM", -1, 1, _alfafld); //non l'abbiamo + create_field("ZWELS", -1, 4, _alfafld); //codpag ancora? + create_field("VZSKZ", -1, 2, _alfafld); //non l'abbiamo + create_field("EIKTO", -1, 6, _alfafld); //nostro codcf + create_field("XZVER", -1, 1, _alfafld); //non l'abbiamo + create_field("TOGRU", -1, 4, _alfafld); //non l'abbiamo + create_field("ALTKN", -1, 7, _alfafld); //non l'abbiamo + create_field("MAHNA", -1, 4, _alfafld); //non l'abbiamo +} + +/////////////////////////////////////////////////////////// +// TEsporta_SAP +/////////////////////////////////////////////////////////// + +class TEsporta_SAP_app : public TSkeleton_application +{ + TAssoc_array _codpag; + +protected: + virtual bool check_autorization() const {return false;} + virtual const char * extra_modules() const {return "cg";} + virtual void main_loop(); + + bool is_cofi(const TString& cofi) const; + +public: + void esporta_clienti(const TString& path) const; + void esporta_fornitori(const TString& path) const; + void esporta_partite(const TString& path) const; + +}; + +bool TEsporta_SAP_app::is_cofi(const TString& cofi) const +{ + if (cofi.len() != 16) + return false; + const char* const fmt = "AAAAAANNANNANNNA"; + int i = 0; + for (i = 15; i >= 0; i--) + { + if (fmt[i] == 'A') + { + if (cofi[i] < 'A' || cofi[i] > 'Z') + break; + } + else + { + if (cofi[i] < '0' || cofi[i] > '9') + break; + } + } + return i < 0; +} + +void TEsporta_SAP_app::esporta_clienti(const TString& path) const +{ + TString query; + query << "USE CLIFO"; + query << "\nFROM TIPOCF='C'"; + query << "\nTO TIPOCF='C'"; + TISAM_recordset clienti_campo(query); + + TEsporta_SAP_clienti_recordset clienti_sap; + + const int cazzoni = clienti_campo.items(); + TProgind pi(cazzoni, "Trasferimento clienti...", true, true); + TString workstring; + for (bool ok = clienti_campo.move_first(); ok; ok = clienti_campo.move_next()) + { + if (!pi.addstatus(1)) + break; + + //creazione di un nuovo record di tipo clienti.. + clienti_sap.new_rec(); + //..e successivo riempimento + const long conto = clienti_campo.get(CLI_CONTO).as_int(); //ktokd + if (conto == 8 || conto == 9) + clienti_sap.set("KTOKD", TVariant("ZICC")); + else + clienti_sap.set("KTOKD", TVariant("ZICU")); + + workstring = clienti_campo.get(CLI_RAGSOC).as_string(); //name1 e name2 + clienti_sap.set("NAME1", TVariant(workstring.left(30))); + clienti_sap.set("NAME2", TVariant(workstring.mid(30))); + + workstring = clienti_campo.get(CLI_INDCF).as_string(); //stras + workstring << " " << clienti_campo.get(CLI_CIVCF).as_string(); + clienti_sap.set("STRAS", TVariant(workstring)); + + //pocci su comune localita' provincia + if (clienti_campo.get(CLI_COMCF).is_empty()) + { + workstring = cap2comune(clienti_campo.get(CLI_CAPCF).as_string(), + clienti_campo.get(CLI_LOCCF).as_string()); + workstring.insert(" |"); + } + else + { + workstring = clienti_campo.get(CLI_STATOCF).as_string(); + workstring << "|" << clienti_campo.get(CLI_COMCF).as_string(); + } + const TRectype& com_rec = cache().get(LF_COMUNI, workstring); + const TString& dencom = com_rec.get(COM_DENCOM); + + workstring = clienti_campo.get(CLI_LOCCF).as_string(); //ort01 + if (dencom.full()) + { + if (workstring.blank()) + workstring = dencom; + else + { + workstring.upper(); + if (xvt_str_fuzzy_compare(workstring, dencom) < 0.75) + workstring << ", " << dencom; + } + } + clienti_sap.set("ORT01", TVariant(workstring)); + + workstring = clienti_campo.get(CLI_CAPCF).as_string(); //pstlz + clienti_sap.set("PSTLZ", TVariant(workstring)); + + workstring = clienti_campo.get(CLI_STATOCF).as_string(); //land1 + clienti_sap.set("LAND1", TVariant(workstring)); + + workstring = com_rec.get(COM_PROVCOM); //regio + clienti_sap.set("REGIO", TVariant(workstring)); + + workstring = clienti_campo.get(CLI_CODLIN).as_string(); //spras + clienti_sap.set("SPRAS", TVariant(workstring)); + + workstring = clienti_campo.get(CLI_PTELEX).as_string(); //telx1 + workstring << clienti_campo.get(CLI_TELEX).as_string(); + clienti_sap.set("TELX1", TVariant(workstring)); + + workstring = clienti_campo.get(CLI_PTEL).as_string(); //telf1 + workstring << clienti_campo.get(CLI_TEL).as_string(); + clienti_sap.set("TELF1", TVariant(workstring)); + + workstring = clienti_campo.get(CLI_PFAX).as_string(); //telfx + workstring << clienti_campo.get(CLI_FAX).as_string(); + clienti_sap.set("TELFX", TVariant(workstring)); + + workstring = clienti_campo.get(CLI_PTEL2).as_string(); //telf2 + workstring << clienti_campo.get(CLI_TEL2).as_string(); + clienti_sap.set("TELF2", TVariant(workstring)); + + workstring = clienti_campo.get(CLI_COFI).as_string(); //stcd1 + clienti_sap.set("STCD1", TVariant(workstring)); + + if (is_cofi(workstring)) //stkzn + clienti_sap.set("STKZN", TVariant("X")); + + workstring = clienti_campo.get(CLI_STATOPAIV).as_string(); //stceg + workstring << clienti_campo.get(CLI_PAIV).as_string(); + clienti_sap.set("STCEG", TVariant(workstring)); + + if (conto == 8 || conto == 9) //akont + clienti_sap.set("AKONT", TVariant("8/9")); + else + clienti_sap.set("AKONT", TVariant("7")); + + workstring = clienti_campo.get(CLI_CODPAG).as_string(); //zterm + TString* codpag = (TString*)_codpag.objptr(workstring); + if (codpag == NULL) + workstring = "R000"; + else + workstring = *codpag; + clienti_sap.set("ZTERM", TVariant(workstring)); + + clienti_sap.set("ZWELS", TVariant("D")); //zwels + + workstring = clienti_campo.get(CLI_CODCF).as_string(); //eikto + clienti_sap.set("EIKTO", TVariant(workstring)); + } + + //scrivitore in formato xls + clienti_sap.save_as(path, fmt_silk); +#ifdef DBG + xvt_sys_goto_url(path, "open"); +#endif + +} + +void TEsporta_SAP_app::esporta_fornitori(const TString& path) const +{ +} + +void TEsporta_SAP_app::esporta_partite(const TString& path) const +{ +} + +void TEsporta_SAP_app::main_loop() +{ + //crea tabella trascodifica + _codpag.add("BB", new TString("R000")); + _codpag.add("B09", new TString("R002")); + _codpag.add("B01", new TString("R003")); + _codpag.add("BB09", new TString("R004")); + _codpag.add("B05", new TString("R004")); + _codpag.add("B07", new TString("R005")); + _codpag.add("B03", new TString("R007")); + _codpag.add("B04", new TString("R007")); + _codpag.add("B11", new TString("R007")); + _codpag.add("BB30", new TString("R007")); + _codpag.add("B08", new TString("R009")); + _codpag.add("BB60", new TString("R009")); + _codpag.add("B10", new TString("R010")); + _codpag.add("BB90", new TString("R010")); + + TEsporta_SAP_mask m; + + while (m.run() == K_ENTER) + { + if (m.get_bool(F_CLIENTI)) + esporta_clienti(m.get(F_CLIFILE)); + if (m.get_bool(F_FORNITORI)) + esporta_fornitori(m.get(F_FORNFILE)); + if (m.get_bool(F_PARTITE)) + esporta_partite(m.get(F_PARTFILE)); + } +} + +int pd0666100(int argc, char* argv[]) +{ + TEsporta_SAP_app app; + app.run(argc, argv, TR("Esportazione a SAP")); + return 0; +} diff --git a/ps/pd0666100a.h b/ps/pd0666100a.h new file mode 100755 index 000000000..dfc75ba8c --- /dev/null +++ b/ps/pd0666100a.h @@ -0,0 +1,6 @@ +#define F_CLIENTI 101 +#define F_CLIFILE 102 +#define F_FORNITORI 103 +#define F_FORNFILE 104 +#define F_PARTITE 105 +#define F_PARTFILE 106 diff --git a/ps/pd0666100a.uml b/ps/pd0666100a.uml new file mode 100755 index 000000000..958bc3a45 --- /dev/null +++ b/ps/pd0666100a.uml @@ -0,0 +1,68 @@ +#include "pd0666100a.h" + +PAGE "Trasferimento a SAP per Medicasa" -1 -1 72 12 + +GROUPBOX DLG_NULL 70 4 +BEGIN + PROMPT 1 1 "@bEsportazione clenti / fornitori" +END + +BOOLEAN F_CLIENTI +BEGIN + PROMPT 2 2 "Clienti" + MESSAGE FALSE DISABLE,F_CLIFILE + MESSAGE TRUE ENABLE,F_CLIFILE +END + +STRING F_CLIFILE 128 50 +BEGIN + PROMPT 14 2 "File " + CHECKTYPE REQUIRED +END + +BOOLEAN F_FORNITORI +BEGIN + PROMPT 2 3 "Fornitori" + MESSAGE FALSE DISABLE,F_FORNFILE + MESSAGE TRUE ENABLE,F_FORNFILE +END + +STRING F_FORNFILE 128 50 +BEGIN + PROMPT 14 3 "File " + CHECKTYPE REQUIRED +END + +GROUPBOX DLG_NULL 70 4 +BEGIN + PROMPT 1 5 "@bEsportazione partite" +END + +BOOLEAN F_PARTITE +BEGIN + PROMPT 2 6 "Partite" + MESSAGE FALSE DISABLE,F_PARTFILE + MESSAGE TRUE ENABLE,F_PARTFILE +END + +STRING F_PARTFILE 128 50 +BEGIN + PROMPT 14 6 "File " + CHECKTYPE REQUIRED +END + +BUTTON DLG_ELABORA 10 2 +BEGIN + PROMPT -12 -1 "" + PICTURE BMP_ELABORA + MESSAGE EXIT,K_ENTER +END + +BUTTON DLG_QUIT 10 2 +BEGIN + PROMPT -22 -1 "" +END + +ENDPAGE + +ENDMASK diff --git a/ps/pd0666conf.ini b/ps/pd0666conf.ini new file mode 100755 index 000000000..7014b5844 --- /dev/null +++ b/ps/pd0666conf.ini @@ -0,0 +1,4 @@ +[MAIN] +PATH = C:\temp\ +FILE = +LASTDATA = diff --git a/ps/pd0777.cpp b/ps/pd0777.cpp new file mode 100755 index 000000000..5313aeecf --- /dev/null +++ b/ps/pd0777.cpp @@ -0,0 +1,21 @@ +#include + +#include "pd0777.h" + +int main(int argc,char** argv) +{ + const int s = (argc > 1) ? argv[1][1] - '0' : 0; + + switch (s) + { + case 0 : + default: pd0777100(argc,argv); // Importa stipendi in prima nota (OMASA) + break; + } + exit(0); + return 0; +} + + + + diff --git a/ps/pd0777.h b/ps/pd0777.h new file mode 100755 index 000000000..fc1d86cc6 --- /dev/null +++ b/ps/pd0777.h @@ -0,0 +1,3 @@ +int pd0777100(int argc, char* argv[]); + + diff --git a/ps/pd0777100.cpp b/ps/pd0777100.cpp new file mode 100755 index 000000000..74c08301c --- /dev/null +++ b/ps/pd0777100.cpp @@ -0,0 +1,448 @@ +// OMASA + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "pd0777.h" +#include "pd0777100a.h" +#include "pd0777100b.h" +#include "pd0777100C.h" +#include "../cg/cglib01.h" + +#include +#include +#include +#include + + +#define MAX_CG_ROWS 98 + +// tabella per la conversione dei numeri negativi (schede perforate????) +static unsigned char _tabella[10] = {'p','q','r','s','t','u','v','w','x','y'}; + +////////////////////////// +// TAutomask +////////////////////////// +class TOmasa_mask : public TAutomask +{ +protected: + bool on_field_event(TOperable_field& o, TField_event e, long jolly); +public: + TOmasa_mask(); + virtual ~TOmasa_mask(){}; +}; + +TOmasa_mask::TOmasa_mask() :TAutomask ("pd0777100a") +{ +} + +bool TOmasa_mask::on_field_event(TOperable_field& f, TField_event e, long jolly) +{ + return true; +} + +///////////////////////// +// TFile_text +///////////////////////// +class TOmasa_file: public TFile_text +{ +protected: + virtual void validate(TCursor& cur,TRecord_text &rec, TToken_string &val, TString& str); + +public: + TOmasa_file(const TString& file_name); + virtual ~TOmasa_file() { } +}; + +TOmasa_file::TOmasa_file(const TString& file_name) + : TFile_text(file_name, "pd0777100a.ini") +{ +} + +void TOmasa_file::validate(TCursor& cur,TRecord_text &rec, TToken_string &s, TString& str) +{ + const TString code(s.get(0)); + TString valore = str; + if (code == "_UPPERCASE") + { + valore.upper(); + } + else NFCHECK("Macro non definita: %s", (const char *)code); + str = valore; +} + +// TSkeleton_application + +class TOmasa : public TSkeleton_application +{ + TOmasa_mask* _msk; + TOmasa_file* _trasfile; + TConfig* _configfile; + TRelation* _rel; + TCursor* _cur; + TProgind* _prog; + TEsercizi_contabili* _esc; + + long _numreg; + + virtual bool check_autorization() const {return false;} + virtual const char * extra_modules() const {return "cg";} + +public: + virtual bool create(); + virtual bool destroy(); + virtual void main_loop(); + virtual void ini2mask(); + virtual void mask2ini(); + bool transfer(); + void negativo(TString& importo); + int strip_zero(TString& importo); + bool my_isdigit(unsigned char ch); + int look(unsigned char carattere); + + TOmasa() {} +}; + +TOmasa& app() { return (TOmasa&) main_app(); } + +bool TOmasa::create() +{ + open_files(LF_TABCOM, LF_TAB, LF_SALDI, LF_PCON, LF_MOV, LF_RMOV, LF_RMOVIVA, + LF_PARTITE, LF_SCADENZE, LF_PAGSCA, 0); + + TFilename configname = "pd0777conf.ini"; + configname.custom_path(); + _configfile = new TConfig(configname); + _msk = new TOmasa_mask(); + _rel = new TRelation (LF_PCON); + _cur = new TCursor(_rel,"((GRUPPO!=\"\")&&(CONTO!=\"\")&&(SOTTOCONTO==\"\"))",1); + _esc = new TEsercizi_contabili; + + return TSkeleton_application::create(); +} + +bool TOmasa::destroy() +{ + delete _esc; + delete _cur; + delete _rel; + delete _msk; + delete _configfile; + + return TApplication::destroy(); +} + +int TOmasa::strip_zero(TString& importo) +{ + TString16 app; + + int size = importo.len(); + + for (int i = 0; i < size; i++) + if (importo[i] != '0') break; + + if (i > 0) + { + app = importo.mid(importo[i] == '.' ? i - 1 : i); + importo = app; + } + + return (i ? i - 1 : i); +} + +bool TOmasa::my_isdigit(unsigned char ch) +{ + return (ch >= '0' && ch <= '9'); +} + +int TOmasa::look(unsigned char carattere) +{ + for (int i = 0; i < 10; i++) + if (_tabella[i] == carattere) + return i; + + return -1; +} + +void TOmasa::negativo(TString& importo) +{ + strip_zero(importo); + int size = importo.len(); + if (!size) return; + unsigned char last = importo[size - 1]; + if (!my_isdigit(last)) + { + int new_last = look(last); + TString16 dep; dep << new_last; + if (new_last >= 0) + { + importo[size - 1] = dep[0]; + importo.insert("-"); + } + } +} + +void TOmasa::mask2ini() +{ + TSheet_field& sheet = (TSheet_field&)_msk->field(F_SHEET_CONTI); + for (int i=0;iset(contoomasa, conto, "CONTI"); + } + TSheet_field& sheetcms = (TSheet_field&)_msk->field(F_SHEET_CMS); + for (i=0;iset(cmsomasa, cms, "COMMESSE"); + } + _configfile->set_paragraph("CONTI"); +} + +void TOmasa::ini2mask() +{ + TString_array vl; + _configfile->list_variables(vl,TRUE, "CONTI", TRUE); + TSheet_field& sheet = (TSheet_field&)_msk->field(F_SHEET_CONTI); + sheet.destroy(); + int i=0; + FOR_EACH_ARRAY_ROW(vl,r,s) + { + TToken_string& riga = sheet.row(i); + TString16 contoomasa = (*s).get(); + TToken_string conto = _configfile->get(contoomasa, "CONTI"); + riga.add(contoomasa); + riga.add(conto.get(0)); + riga.add(conto.get(1)); + riga.add(conto.get(2)); + sheet.check_row(i); + i++; + } + _configfile->list_variables(vl,TRUE, "COMMESSE", TRUE); + TSheet_field& sheetcms = (TSheet_field&)_msk->field(F_SHEET_CMS); + sheetcms.destroy(); + i=0; + FOR_EACH_ARRAY_ROW(vl,rc,sc) + { + TToken_string& riga = sheetcms.row(i); + TString16 cmsomasa = (*sc).get(); + TString80 cms = (*sc).get(); + riga.add(cmsomasa); + riga.add(cms); + sheetcms.check_row(i); + i++; + } +} + +void TOmasa::main_loop() +{ + KEY tasto; + _msk->set(F_PERCORSO, _configfile->get("PERCORSO", "MAIN")); + _msk->set(F_CODCAUS, _configfile->get("CODCAUS", "MOVIMENTO")); + ini2mask(); + tasto = _msk->run(); + if (tasto == K_ENTER) + { + mask2ini(); + _numreg = 0; + if (transfer()) + { + _configfile->set("PERCORSO", _msk->get(F_PERCORSO), "MAIN"); + _configfile->set("CODCAUS", _msk->get(F_CODCAUS), "MOVIMENTO"); + message_box(TR("Importazione stipendi completata")); + } + } +} + +bool TOmasa::transfer() +{ + TString_array transactions; + TFilename tempdir; + tempdir.tempdir(); + + TString80 listfiles = tempdir; + listfiles << "\\oo*.ini"; + list_files(listfiles, transactions); + FOR_EACH_ARRAY_ROW(transactions, row, name) + remove(*name); + + TConfig* movpn=NULL; + + _trasfile = new TOmasa_file(_msk->get(F_PERCORSO)); + _trasfile->open(_msk->get(F_PERCORSO),'r'); + + // creazione file temporanei per commessa e conto dare e avere + const long dimension = fsize(_msk->get(F_PERCORSO)); + TProgind pi(dimension,"Importazione in corso..."); + + TRecord_text curr; + while (_trasfile->read(curr) == NOERR) + { + pi.setstatus(_trasfile->read_file()->tellg()); + TString impstr = curr.get(F_VALOREVOCE); + impstr.insert(".",11); + negativo(impstr); + const real importo(impstr); + TString16 contodare = curr.get(F_CONTODARE); + TString16 contoavere = curr.get(F_CONTOAVERE); + if ((!real::is_null(impstr)) && (!contodare.blank() || !contoavere.blank())) + { + TString16 codcms = curr.get(F_CENTROCOSTO); + codcms.trim(); + TString80 cms = _configfile->get(codcms, "COMMESSE"); + if (cms.empty()) + { + TMask mskcms("pd0777100c"); + mskcms.set(F_CMSOMASA, codcms); + if (mskcms.run() == K_ENTER) + _configfile->set(codcms, mskcms.get(F_CODCMS), "COMMESSE"); + else + return TRUE; + } + TFilename name; + name.tempdir(); + name.add(format("oo%s", (const char*) codcms)); + name.ext(".ini"); + movpn = new TConfig(name); + movpn->set_paragraph("MAIN"); + movpn->set("CODCMS",codcms); + if (!contodare.blank()) + { + movpn->set_paragraph("IMPORTI"); + contodare.trim(); + impstr = movpn->get(contodare, "IMPORTI"); + real importomem(impstr); + importomem+=importo; + movpn->set(contodare, importomem.string()); + } + if (!contoavere.blank()) + { + movpn->set_paragraph("IMPORTI"); + contoavere.trim(); + impstr = movpn->get(contoavere, "IMPORTI"); + real importomem(impstr); + importomem-=importo; + movpn->set(contoavere, importomem.string()); + } + delete movpn; + if (pi.iscancelled()) + return TRUE; + } + } + _trasfile->close(); + delete _trasfile; + + // creazione .ini per la prima nota + const TDate datareg = _msk->get_date(F_DATAREG); + const int annoes = _esc->date2esc(datareg); + const TString8 codcaus = _msk->get(F_CODCAUS); + + listfiles = tempdir; + listfiles << "\\oo*.ini"; + list_files(listfiles, transactions); + FOR_EACH_ARRAY_ROW(transactions, row_oo, name_oo) + { + TConfig* movpn=NULL; + TConfig file_oo(*name_oo); + TString16 codcms = file_oo.get("CODCMS", "MAIN"); + codcms.trim(); + TFilename name; + name.tempdir(); + name.add(format("ooo%s", (const char*) codcms)); + name.ext(".ini"); + movpn = new TConfig(name); + + movpn->set_paragraph("Transaction"); + movpn->set("Action","INSERT"); + movpn->set("Mode","AUTO"); + + movpn->set_paragraph(format("%d",LF_MOV)); + movpn->set("ANNOES", annoes); + movpn->set("DATACOMP", datareg); + movpn->set("DATAREG", datareg); + movpn->set("DESCR", cache().get(LF_CAUSALI, codcaus, CAU_DESCR)); + movpn->set("CODCAUS", codcaus); + + int numrig = 0; + + TString_array vl; + file_oo.list_variables(vl,TRUE, "IMPORTI", TRUE); + FOR_EACH_ARRAY_ROW(vl,r,s) + { + TString16 contoomasa = (*s).get(); + TString16 importos = (*s).get(); + TToken_string conto = _configfile->get(contoomasa, "CONTI"); + if (conto.empty()) + { + TMask mskconto("pd0777100b"); + mskconto.set(F_CONTOOMASA, contoomasa); + if (mskconto.run() == K_ENTER) + { + const int gr = mskconto.get_int(F_GRUPPO); + const int co = mskconto.get_int(F_CONTO); + const long so = mskconto.get_long(F_SOTTOCONTO); + conto.format("%d|%d|%ld", gr, co, so); + _configfile->set(contoomasa, conto, "CONTI"); + } + else + return TRUE; + } + numrig++; + movpn->set_paragraph(format("%d,%d",LF_RMOV, numrig)); + movpn->set("ANNOES", annoes); + movpn->set("DATAREG", datareg); + movpn->set("NUMRIG", numrig); + real importo(importos); + if (importo > 0) + movpn->set("SEZIONE", "D"); + else + movpn->set("SEZIONE", "A"); + importos.strip("-"); + movpn->set("IMPORTO", importos); + TString16 contoindbil; + contoindbil.format("%s|%s", conto.get(0), conto.get(1)); + const char indbil = cache().get(LF_PCON, contoindbil, PCN_INDBIL)[0]; + if ((indbil != '1') && (indbil != '2')) + movpn->set("CODCMS", _configfile->get(codcms, "COMMESSE")); + movpn->set("GRUPPO", conto.get(0)); + movpn->set("CONTO", conto.get(1)); + movpn->set("SOTTOCONTO", conto.get(2)); + } + delete movpn; + } + + tempdir.tempdir(); + TString80 applicat = "cg2.exe -0 -i"; + applicat << tempdir; + applicat << "\\ooo*.ini"; + TExternal_app primanota(applicat); + primanota.run(); + + listfiles = tempdir; + listfiles << "\\oo*.ini"; + list_files(listfiles, transactions); + FOR_EACH_ARRAY_ROW(transactions, rowf, namef) + remove(*namef); + return TRUE; +} + +int pd0777100 (int argc, char* argv[]) +{ + TOmasa main_app; + main_app.run(argc, argv, TR("Importazione stipendi")); + return TRUE; +} diff --git a/ps/pd0777100a.h b/ps/pd0777100a.h new file mode 100755 index 000000000..3e2b94667 --- /dev/null +++ b/ps/pd0777100a.h @@ -0,0 +1,40 @@ +// campi della maschera principale pd0777100a.uml + +#define F_PERCORSO 101 +#define F_DATAREG 102 +#define F_CODCAUS 103 +#define F_DESCR 104 +#define F_SHEET_CONTI 105 +#define F_SHEET_CMS 106 + +// campi della maschera di conversione conti +#define F_S_CONTOOMASA 101 +#define F_S_GRUPPO 102 +#define F_S_CONTO 103 +#define F_S_SOTTOCONTO 104 +#define F_S_DESCRIZIONE 105 + +// campi della maschera di conversione commesse +#define F_S_CMSOMASA 101 +#define F_S_CODCMS 102 +#define F_S_DESCRCMS 103 + +// campi del tracciato record + +#define F_CODAZIENDA 0 +#define F_CODDIP 1 +#define F_VOCE 2 +#define F_TIPOVOCE 3 +#define F_QUOTAVOCE 4 +#define F_VALOREVOCE 5 +#define F_IMPORTO 6 +#define F_CONTODARE 7 +#define F_CONTOAVERE 8 +#define F_CENTROCOSTO 9 +#define F_SEDELAVORO 10 +#define F_SEDEINPS 11 +#define F_QUALIFICA 12 +#define F_POSINAIL 13 +#define F_VARIABILE 14 +#define F_CONTRATTO 15 +#define F_FILLER 16 diff --git a/ps/pd0777100a.uml b/ps/pd0777100a.uml new file mode 100755 index 000000000..d0515f629 --- /dev/null +++ b/ps/pd0777100a.uml @@ -0,0 +1,188 @@ +#include "pd0777100a.h" + +TOOLBAR "" 0 20 0 2 + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -12 -1 "" +END + +BUTTON DLG_QUIT 10 2 +BEGIN + PROMPT -22 -1 "" +END + +ENDPAGE + +PAGE "Importazione stipendi" 0 -1 0 19 + +STRING F_PERCORSO 50 +BEGIN +PROMPT 2 2 "File da trasferire " + CHECKTYPE REQUIRED + VALIDATE FILENAME_FUNC + FLAGS "A" + HELP "Percorso e nome file da trasferire" + WARNING "E' necessario specificare il nome del file da trasferire" +END + +DATE F_DATAREG +BEGIN + PROMPT 2 3 "Data registrazione " + CHECKTYPE REQUIRED + HELP "Data di registrazione dei movimenti contabili" + WARNING "E' necessario specificare la data di registrazione" +END + +STRING F_CODCAUS 4 +BEGIN + PROMPT 2 4 "Causale " + FLAGS "UZ" + USE LF_CAUSALI + INPUT CODCAUS F_CODCAUS + DISPLAY "Codice" CODCAUS + DISPLAY "Descrizione@60" DESCR + OUTPUT F_CODCAUS CODCAUS + OUTPUT F_DESCR DESCR + CHECKTYPE SEARCH +END + +STRING F_DESCR 50 +BEGIN + PROMPT 17 4 "" + USE LF_CAUSALI KEY 2 + INPUT DESCR F_DESCR + DISPLAY "Descrizione@60" DESCR + DISPLAY "Codice" CODCAUS + COPY OUTPUT F_CODCAUS + CHECKTYPE SEARCH +END + +SPREADSHEET F_SHEET_CONTI 70 6 +BEGIN + PROMPT 2 6 "Tabella conversione conti" + ITEM "Conto OMASA" + ITEM "Gruppo" + ITEM "Conto" + ITEM "Sottoc." + ITEM "Descrizione" +END + +SPREADSHEET F_SHEET_CMS 70 6 +BEGIN + PROMPT 2 14 "Tabella conversione commesse" + ITEM "Cms OMASA" + ITEM "Corrispondente" + ITEM "Descrizione" +END + +ENDPAGE + +ENDMASK + +PAGE "Conversione conti" 0 -1 0 10 + +STRING F_S_CONTOOMASA 14 +BEGIN + PROMPT 2 2 "Conto OMASA " + FLAGS "D" +END + +NUMBER F_S_GRUPPO 3 +BEGIN + PROMPT 2 4 "Conto corrispon." + USE LF_PCON KEY 1 SELECT (CONTO="") + INPUT GRUPPO F_S_GRUPPO + DISPLAY "Gruppo" GRUPPO + DISPLAY "Descrizione@50" DESCR + OUTPUT F_S_GRUPPO GRUPPO + CHECKTYPE NORMAL +END + +NUMBER F_S_CONTO 3 +BEGIN + PROMPT 24 4 "" + USE LF_PCON KEY 1 SELECT (SOTTOCONTO="") + INPUT GRUPPO F_S_GRUPPO + INPUT CONTO F_S_CONTO + DISPLAY "Gruppo" GRUPPO + DISPLAY "Conto" CONTO + DISPLAY "Descrizione@50" DESCR + OUTPUT F_S_CONTO CONTO + OUTPUT F_S_GRUPPO GRUPPO + CHECKTYPE NORMAL +END + +NUMBER F_S_SOTTOCONTO 6 +BEGIN + PROMPT 30 4 "" + USE LF_PCON + INPUT GRUPPO F_S_GRUPPO + INPUT CONTO F_S_CONTO + INPUT SOTTOCONTO F_S_SOTTOCONTO + DISPLAY "Gruppo" GRUPPO + DISPLAY "Conto" CONTO + DISPLAY "Sottoconto" SOTTOCONTO + DISPLAY "Descrizione@50" DESCR + OUTPUT F_S_SOTTOCONTO SOTTOCONTO + OUTPUT F_S_GRUPPO GRUPPO + OUTPUT F_S_CONTO CONTO + OUTPUT F_S_DESCRIZIONE DESCR + CHECKTYPE NORMAL +END + +STRING F_S_DESCRIZIONE 50 +BEGIN + PROMPT 39 4 "" + USE LF_PCON KEY 2 + INPUT DESCR F_S_DESCRIZIONE + DISPLAY "Descrizione@50" DESCR + DISPLAY "Gruppo" GRUPPO + DISPLAY "Conto" CONTO + DISPLAY "Sottoconto" SOTTOCONTO + OUTPUT F_S_SOTTOCONTO SOTTOCONTO + OUTPUT F_S_CONTO CONTO + OUTPUT F_S_GRUPPO GRUPPO + OUTPUT F_S_DESCRIZIONE DESCR + CHECKTYPE NORMAL +END + +ENDPAGE + +ENDMASK + +PAGE "Conversione commesse" 0 -1 0 10 + +STRING F_S_CMSOMASA 14 +BEGIN + PROMPT 2 2 "Commessa OMASA " + FLAGS "D" +END + +STRING F_S_CODCMS 20 +BEGIN + PROMPT 2 4 "Commessa corrispondente " + FLAGS "UZ" + USE CMS + INPUT CODTAB F_S_CODCMS + DISPLAY "Codice@20" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_S_CODCMS CODTAB + OUTPUT F_S_DESCRCMS S0 + CHECKTYPE NORMAL +END + +STRING F_S_DESCRCMS 50 +BEGIN + PROMPT 39 4 "" + USE CMS KEY 2 + INPUT S0 F_S_DESCRCMS + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice@20" CODTAB + COPY OUTPUT F_S_CODCMS + CHECKTYPE NORMAL +END + +ENDPAGE + +ENDMASK diff --git a/ps/pd0777100b.h b/ps/pd0777100b.h new file mode 100755 index 000000000..87baff881 --- /dev/null +++ b/ps/pd0777100b.h @@ -0,0 +1,7 @@ +// campi della maschera pd0777100b.uml + +#define F_CONTOOMASA 101 +#define F_GRUPPO 102 +#define F_CONTO 103 +#define F_SOTTOCONTO 104 +#define F_DESCRIZIONE 105 diff --git a/ps/pd0777100b.uml b/ps/pd0777100b.uml new file mode 100755 index 000000000..8f7e20c52 --- /dev/null +++ b/ps/pd0777100b.uml @@ -0,0 +1,87 @@ +#include "pd0777100b.h" + +TOOLBAR "" 0 20 0 2 + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -12 -1 "" +END + +BUTTON DLG_QUIT 10 2 +BEGIN + PROMPT -22 -1 "" +END + +ENDPAGE + +PAGE "Conversione conti" 0 -1 0 10 + +STRING F_CONTOOMASA 14 +BEGIN + PROMPT 2 2 "Conto OMASA " + FLAGS "D" +END + +NUMBER F_GRUPPO 3 +BEGIN + PROMPT 2 4 "Conto corrispondente " + USE LF_PCON KEY 1 SELECT (CONTO="") + INPUT GRUPPO F_GRUPPO + DISPLAY "Gruppo" GRUPPO + DISPLAY "Descrizione@50" DESCR + OUTPUT F_GRUPPO GRUPPO + CHECKTYPE NORMAL +END + +NUMBER F_CONTO 3 +BEGIN + PROMPT 29 4 "" + USE LF_PCON KEY 1 SELECT (SOTTOCONTO="") + INPUT GRUPPO F_GRUPPO + INPUT CONTO F_CONTO + DISPLAY "Gruppo" GRUPPO + DISPLAY "Conto" CONTO + DISPLAY "Descrizione@50" DESCR + OUTPUT F_CONTO CONTO + OUTPUT F_GRUPPO GRUPPO + CHECKTYPE NORMAL +END + +NUMBER F_SOTTOCONTO 6 +BEGIN + PROMPT 35 4 "" + USE LF_PCON + INPUT GRUPPO F_GRUPPO + INPUT CONTO F_CONTO + INPUT SOTTOCONTO F_SOTTOCONTO + DISPLAY "Gruppo" GRUPPO + DISPLAY "Conto" CONTO + DISPLAY "Sottoconto" SOTTOCONTO + DISPLAY "Descrizione@50" DESCR + OUTPUT F_SOTTOCONTO SOTTOCONTO + OUTPUT F_GRUPPO GRUPPO + OUTPUT F_CONTO CONTO + OUTPUT F_DESCRIZIONE DESCR + CHECKTYPE NORMAL +END + +STRING F_DESCRIZIONE 50 +BEGIN + PROMPT 44 4 "" + USE LF_PCON KEY 2 + INPUT DESCR F_DESCRIZIONE + DISPLAY "Descrizione@50" DESCR + DISPLAY "Gruppo" GRUPPO + DISPLAY "Conto" CONTO + DISPLAY "Sottoconto" SOTTOCONTO + OUTPUT F_SOTTOCONTO SOTTOCONTO + OUTPUT F_CONTO CONTO + OUTPUT F_GRUPPO GRUPPO + OUTPUT F_DESCRIZIONE DESCR + CHECKTYPE NORMAL +END + +ENDPAGE +ENDMASK + + diff --git a/ps/pd0777100c.h b/ps/pd0777100c.h new file mode 100755 index 000000000..06572cd04 --- /dev/null +++ b/ps/pd0777100c.h @@ -0,0 +1,5 @@ +// campi della maschera pd0777100c.uml + +#define F_CMSOMASA 101 +#define F_CODCMS 102 +#define F_DESCRCMS 103 diff --git a/ps/pd0777100c.uml b/ps/pd0777100c.uml new file mode 100755 index 000000000..9d713780d --- /dev/null +++ b/ps/pd0777100c.uml @@ -0,0 +1,52 @@ +#include "pd0777100c.h" + +TOOLBAR "" 0 20 0 2 + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -12 -1 "" +END + +BUTTON DLG_QUIT 10 2 +BEGIN + PROMPT -22 -1 "" +END + +ENDPAGE + +PAGE "Conversione commesse" 0 -1 0 10 + +STRING F_CMSOMASA 14 +BEGIN + PROMPT 2 2 "Commessa OMASA " + FLAGS "D" +END + +STRING F_CODCMS 20 +BEGIN + PROMPT 2 4 "Commessa corrispondente " + FLAGS "UZ" + USE CMS + INPUT CODTAB F_CODCMS + DISPLAY "Codice@20" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_CODCMS CODTAB + OUTPUT F_DESCRCMS S0 + CHECKTYPE NORMAL +END + +STRING F_DESCRCMS 50 +BEGIN + PROMPT 2 5 "Descrizione " + USE CMS KEY 2 + INPUT S0 F_DESCRCMS + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice@20" CODTAB + COPY OUTPUT F_CODCMS + CHECKTYPE NORMAL +END + +ENDPAGE +ENDMASK + + diff --git a/ps/pd0777conf.ini b/ps/pd0777conf.ini new file mode 100755 index 000000000..56baabb4f --- /dev/null +++ b/ps/pd0777conf.ini @@ -0,0 +1,99 @@ +[CONTI] +105010 = 1|5|105010 +420020 = 4|20|420020 +421000 = 4|21|421000 +421100 = 4|21|421100 +422010 = 4|22|422010 +422020 = 4|22|422020 +422090 = 4|22|422090 +423010 = 4|23|423010 +423030 = 4|23|423030 +423040 = 4|23|423040 +423050 = 4|23|423050 +423060 = 4|23|423060 +423070 = 4|23|423070 +423090 = 4|23|423090 +423100 = 4|23|423100 +424100 = 4|24|424100 +424110 = 4|24|424110 +424120 = 4|24|424120 +424130 = 4|24|424130 +424150 = 4|24|424150 +426000 = 4|24|426000 +430500 = 4|30|430500 +442060 = 4|42|442060 +442070 = 4|42|442070 +470000 = 4|70|470000 +471010 = 4|71|471010 +499000 = 4|99|499000 +601100 = 6|2|601100 +601110 = 6|2|601110 +601120 = 6|2|601120 +601150 = 6|2|601150 +601330 = 6|2|601330 +601340 = 6|2|601340 +601350 = 6|2|601350 +601375 = 6|2|601375 +601385 = 6|2|601385 +602740 = 6|3|602740 +603430 = 6|3|603430 +608030 = 6|8|608030 +608040 = 6|8|608040 +805000 = 8|5|805000 + +[MAIN] +PERCORSO = c:\MEDISTIPENDI\medicasa102006 + +[MOVIMENTO] +CODCAUS = STI + +[COMMESSE] +1SUA = RO +1SW = TR +1SYA = TE +1SZ = MI +1SZA = VA +1SZB = UD +1SZC = AS +1SZD = VE +1SZE = CTA +1SZF = CZO +1SZI = NA +1SZM = SA +1SZO = PD +1SZU = PA +2SUA = RO +2SW = TR +2SYA = TE +2SZ = MI +2SZA = VA +2SZB = UD +2SZC = AS +2SZD = VE +2SZE = CTA +2SZF = CZO +2SZI = NA +2SZL = ME +2SZM = SA +2SZN = PE +2SZU = PA +3SLD = SE +3SUA = RO +3SY = SE +3SZ = MI +3SZE = CTA +4SUA = RO +4SW = TR +4SY = SE +4SYA = TE +4SZ = MI +4SZA = VA +4SZB = UD +4SZC = AS +4SZD = VE +4SZE = CTA +4SZF = CZO +4SZI = NA +4SZM = SA +4SZO = PD + diff --git a/ps/ps0544200.cpp b/ps/ps0544200.cpp index 7a4c99329..a4809ea25 100755 --- a/ps/ps0544200.cpp +++ b/ps/ps0544200.cpp @@ -59,7 +59,7 @@ class TServus : public TSkeleton_application long _nrecords; int _cont11, _cont12, _cont13; TRiga_documento* _riga_doc_curr; - real _tot_prezzinetti, _tot_tempi, _tot_manodopera, _tot_vari ; + real _tot_mate, _tot_temp, _tot_mano, _tot_vari ; virtual const char * extra_modules() const {return "ve";} @@ -68,7 +68,7 @@ protected: virtual bool destroy(void); virtual void main_loop() ; void azzera_totali() ; - void aggiorna_totali(const real& prezzonetto, const real& tempi, const real& manodopera, const real& vari); + void aggiorna_totali(const real& materiale, const real& tempi, const real& manodopera, const real& vari); void elabora_documenti(); static int calcola_tipo(const TRiga_documento& r); @@ -79,6 +79,10 @@ public: const int nriga11() { return _cont11;}; const int nriga12() { return _cont12;}; const int nriga13() { return _cont13;}; + const real& tot_temp() { return _tot_temp;}; + const real& tot_mano() { return _tot_mano;}; + const real& tot_vari() { return _tot_vari;}; + const real& tot_mate() { return _tot_mate;}; const TRiga_documento& riga_doc_curr() { return *_riga_doc_curr;}; TConfig configfile() {return *_configfile;}; TServus() {} ; @@ -126,14 +130,20 @@ void TServus_file::validate(TCursor& cur,TRecord_text &rec, TToken_string &s, TS TString in(s.get()); if (in == "IMPORTO") { - real importo = app().riga_doc_curr().importo(TRUE, TRUE); + real importo = app().riga_doc_curr().importo(TRUE, FALSE); valore = importo.string(); valore.strip("."); } else if (in == "PREZZO") { - real importo = app().riga_doc_curr().prezzo(TRUE, TRUE); - valore = importo.string(); + real importo = app().riga_doc_curr().prezzo(TRUE, FALSE); + valore = importo.string(0,2); + valore.strip("."); + } + else if (in == "QTA") + { + real qta = app().riga_doc_curr().quantita(); + valore = qta.string(0,2); valore.strip("."); } } @@ -200,6 +210,23 @@ void TServus_file::validate(TCursor& cur,TRecord_text &rec, TToken_string &s, TS else if (in == "13") valore.format("%ld", app().nriga13()); } + else if (code == "_TOTALE") + { + real totale; + TString in(s.get()); + if (in == "TEMP") + totale = app().tot_temp(); + else if (in == "MATE") + totale = app().tot_mate(); + else if (in == "MANO") + totale = app().tot_mano(); + else if (in == "VARI") + totale = app().tot_vari(); + else if (in == "SOMM") + totale = app().tot_mano()+app().tot_mate(); + valore = totale.string(0,2); + valore.strip("."); + } else NFCHECK("Macro non definita: %s", (const char *)code); str = valore; @@ -227,18 +254,18 @@ bool TServus::destroy() void TServus::azzera_totali() { - _tot_prezzinetti = ZERO; - _tot_tempi = ZERO; - _tot_manodopera = ZERO; - _tot_vari = ZERO; + _tot_mate = ZERO; + _tot_temp = ZERO; + _tot_mano = ZERO; + _tot_vari = ZERO; } -void TServus::aggiorna_totali(const real& prezzonetto, const real& tempi, const real& manodopera, const real& vari) +void TServus::aggiorna_totali(const real& materiale, const real& tempi, const real& manodopera, const real& vari) { - _tot_prezzinetti = _tot_prezzinetti+prezzonetto; - _tot_tempi = _tot_tempi+tempi; - _tot_manodopera = _tot_manodopera+manodopera; + _tot_mate = _tot_mate+materiale; + _tot_temp = _tot_temp+tempi; + _tot_mano = _tot_mano+manodopera; _tot_vari = _tot_vari+vari; } @@ -349,8 +376,7 @@ void TServus::elabora_documenti() _trasfile->write(rec); TDocumento documento = doc_rel.curr(); documento.body(LF_RIGHEDOC).sort(righe_sort); - - _cont11 = _cont12 = _cont13 = 0; + _cont11 = _cont12 = _cont13 = 0; for (int i=1;i<=documento.rows();i++) { const TRiga_documento& rec_rdoc = documento[i]; @@ -359,19 +385,37 @@ void TServus::elabora_documenti() if (tipo_record >= 11 && tipo_record <= 13) { doc_rel.curr(LF_RIGHEDOC) = rec_rdoc; + switch (tipo_record) { case 11: - rec.set_type("11"); - _cont11++; + { + rec.set_type("11"); + _cont11++; + //real ore = rec_rdoc.get_real(RDOC_QTA); + //real importo = rec_rdoc.get_real(RDOC_PREZZO); + real importo = rec_rdoc.prezzo(TRUE, FALSE); + real ore = rec_rdoc.quantita(); + aggiorna_totali(ZERO, ore, importo, ZERO); + } break; case 12: - rec.set_type("12"); - _cont12++; + { + rec.set_type("12"); + _cont12++; + //real importo = rec_rdoc.get_real(RDOC_PREZZO); + real importo = rec_rdoc.prezzo(TRUE, FALSE); + aggiorna_totali(importo, ZERO, ZERO, ZERO); + } break; case 13: - rec.set_type("13"); - _cont13++; + { + rec.set_type("13"); + _cont13++; + //real importo = rec_rdoc.get_real(RDOC_PREZZO); + real importo = rec_rdoc.prezzo(TRUE, FALSE); + aggiorna_totali(ZERO, ZERO, ZERO, importo); + } break; default: break; diff --git a/ps/ps0544200.ini b/ps/ps0544200.ini index 34415acf4..c261db53f 100755 --- a/ps/ps0544200.ini +++ b/ps/ps0544200.ini @@ -45,8 +45,7 @@ ALIGN = R DATA = S DECIMAL = 0 FILLER = '0' -LENGTH = 0 -PICTURE = +LENGTH = 8 [HEADER OP] NAME(0)=IDENTIFICATIVO TESTA @@ -131,6 +130,7 @@ NAME(7) = TIPO VEICOLO TYPE(7) = STRINGA LENGTH(7) = 12 POSITION(7) = 57 +FIELD(7) = 33->TIPO NAME(8) = ACQUISTO TYPE(8) = STRINGA @@ -153,6 +153,7 @@ NAME(11) = SECONDO TIPO VEICOLO TYPE(11) = STRINGA LENGTH(11) = 2 POSITION(11) = 77 +FIELD(11) = 33->LIBCOL NAME(12) = RICHIESTA INOLTRATA DA TYPE(12) = STRINGA @@ -238,11 +239,11 @@ LENGTH(4) = 13 POSITION(4) = 15 FIELD(4) = 33->TELAIO[4,16] -NAME(26) = SUFFISSO PZ +NAME(26) = SECONDA PARTE TELAIO TYPE(26) = STRINGA LENGTH(26) = 2 POSITION(26) = 28 -MESSAGE(26) = _FISSO,!PZ +FIELD(26) = 33->TELAIO[17,19] NAME(5) = GIORNO IMMATRICOLAZIONE TYPE(5) = NUMERO @@ -404,9 +405,10 @@ FIELD(20) = 34->CODART NAME(5) = ORE LAVORO TYPE(5) = STRINGA -LENGTH(5) = 5 -POSITION(5) = 30 +LENGTH(5) = 4 +POSITION(5) = 27 FIELD(5) = 34->QTA +MESSAGE(5) = _DARIGA,QTA NAME(6) = TESTO LAVORO TYPE(6) = STRINGA @@ -452,11 +454,13 @@ NAME(13) = INDICATORE CORRENTEZZA TYPE(13) = STRINGA LENGTH(13) = 1 POSITION(13) = 88 +FIELD(13) = 34->CODAGG1[1,1] NAME(14) = RICONOSCIMENTO PAGAMENTO TYPE(14) = STRINGA LENGTH(14) = 1 POSITION(14) = 89 +MESSAGE(14) = _FISSO,!1 NAME(15) = IDENTIFICATORE TYPE(15) = STRINGA @@ -472,7 +476,6 @@ NAME(17) = IMPORTO ORA LAVORO TYPE(17) = IMPORTO LENGTH(17) = 6 POSITION(17) = 93 -//FIELD(17) = 34->PREZZO MESSAGE(17) = _DARIGA,PREZZO NAME(18) = PREZZO @@ -543,14 +546,14 @@ NAME(9) = PREZZO VENDITA TYPE(9) = IMPORTO LENGTH(9) = 8 POSITION(9) = 45 -FIELD(9) = 34->PREZZO -MESSAGE(9) = _IMPORTO +//FIELD(9) = 34->PREZZO +MESSAGE(9) = _DARIGA,PREZZO NAME(10) = IMPORTO AL NETTO -TYPE(10) = IMPORTO +TYPE(10) = STRINGA LENGTH(10) = 1 POSITION(10) = 53 -MESSAGE(10) = _IMPORTO + NAME(11) = FILLER TYPE(11) = STRINGA @@ -589,12 +592,13 @@ NAME(16) = INDICATORE CORRENTEZZA TYPE(16) = STRINGA LENGTH(16) = 1 POSITION(16) = 88 -MESSAGE(16) = _FISSO,!V +FIELD(16) = 34->CODAGG1[1,1] NAME(17) = RICONOSCIMENTO ASSEGNAZIONI PARTICOLARI TYPE(17) = STRINGA LENGTH(17) = 1 POSITION(17) = 89 +MESSAGE(17) = _FISSO,!1 NAME(18) = RICONOSCIMENTO POSIZIONI PARTICOLARI TYPE(18) = STRINGA @@ -645,8 +649,8 @@ NAME(5) = SPESE FATTURA ESTERNA TYPE(5) = IMPORTO LENGTH(5) = 8 POSITION(5) = 18 -FIELD(5) = 34->PREZZO -MESSAGE(5) = _IMPORTO +//FIELD(5) = 34->PREZZO +MESSAGE(5) = _DARIGA,PREZZO NAME(6) = VARIE TYPE(6) = STRINGA @@ -675,7 +679,7 @@ NAME(10) = INDICATORE CORRENTEZZA TYPE(10) = STRINGA LENGTH(10) = 1 POSITION(10) = 88 -MESSAGE(10) = _FISSO,!V +FIELD(10) = 34->CODAGG1[1,1] NAME(11) = RICONOSCIMENTO ASSEGNAZIONI PARTICOLARI TYPE(11) = STRINGA @@ -726,6 +730,7 @@ NAME(4) = SOMMA MATERIALE TYPE(4) = IMPORTO LENGTH(4) = 8 POSITION(4) = 15 +MESSAGE(4) = _TOTALE,MATE NAME(5) = SOMMA PERSONALE TYPE(5) = NUMERO @@ -736,21 +741,25 @@ NAME(6) = SOMMA TEMPI TYPE(6) = NUMERO LENGTH(6) = 4 POSITION(6) = 28 +MESSAGE(6) = _TOTALE,TEMP NAME(7) = SOMMA MANODOPERA TYPE(7) = NUMERO LENGTH(7) = 8 POSITION(7) = 32 +MESSAGE(7) = _TOTALE,MANO NAME(8) = SOMMA VARI TYPE(8) = NUMERO LENGTH(8) = 8 POSITION(8) = 40 +MESSAGE(8) = _TOTALE,VARI NAME(9) = SOMMA MATERIALE+MANODOPERA TYPE(9) = NUMERO LENGTH(9) = 8 POSITION(9) = 48 +MESSAGE(9) = _TOTALE,SOMM NAME(10) = ALLEGATI TYPE(10) = STRINGA diff --git a/sc/sc2100.cpp b/sc/sc2100.cpp index 85e6f250b..e8581a3c3 100755 --- a/sc/sc2100.cpp +++ b/sc/sc2100.cpp @@ -1,11 +1,3 @@ -#include -#include -#include -#include -#include -#include - -#include "../cg/cgsaldac.h" #include "sc2.h" #include "sc2101.h" #include "sc2102.h" @@ -13,12 +5,43 @@ #include "sc2100a.h" #include "sc21pec.h" +#include "../cg/cgsaldac.h" +#include "../pr/agenti.h" + +#include +#include +#include +#include +#include + #include -#include #include #include -#include "../pr/agenti.h" +class TEC_recordset : public TAS400_recordset +{ +public: + TEC_recordset(); +}; + +TEC_recordset::TEC_recordset() : TAS400_recordset("AS400(255,0,0)") +{ + create_field("Cliente", 0, 6, _longfld); + create_field("RagioneSociale", -1, 50); + create_field("Valuta", -1, 3); + create_field("Causale", -1, 3); + create_field("Descrizione", -1, 60); + create_field("DataDoc", -1, 10, _datefld); + create_field("NumDoc" , -1, 7); + create_field("ProtIVA", -1, 6, _intfld); + create_field("DataPag", -1, 10, _datefld); + create_field("Dare", -1, 15, _realfld); + create_field("Avere", -1, 15, _realfld); + create_field("Scaduto", -1, 15, _realfld); + create_field("Esposto", -1, 15, _realfld); + create_field("SBF", -1, 1); + create_field("TotDoc", -1, 15, _realfld); +} /////////////////////////////////////////////////////////// // TEC_form @@ -29,6 +52,7 @@ class TEC_form : public TForm friend class TEC_row; static TEC_form* _form; + TEC_recordset* _recordset; enum { MAXTOT = 16 }; @@ -55,7 +79,7 @@ protected: void print_total(int riga, const THash_object& o); void stampa_testata(TPrinter& p); - void stampa_pedata(TPrinter& p); + void stampa_pedata(); void stampa_riporti(TPrinter& p); static void ec_header_handler(TPrinter& p); @@ -81,18 +105,26 @@ public: void set_agente(const TString& codag); - TEC_form(const TEC_mask& m, bool gesval); + bool printing() const { return _recordset == NULL; } + bool exporting() const { return _recordset != NULL; } + void export_total(); + + TEC_recordset& recordset() const { CHECK(exporting(),"Not exporting"); return *_recordset; } + + TEC_form(const TEC_mask& m, bool gesval, bool excel); virtual ~TEC_form(); }; TEC_form* TEC_form::_form = NULL; - /////////////////////////////////////////////////////////// // TEC_row // Rappresenta una singola riga di stampa /////////////////////////////////////////////////////////// +static char __ltipocf; +static long __lcodcf; + class TEC_row : public TSortable { TDate _data; // Data scadenza o pagamento @@ -101,6 +133,9 @@ class TEC_row : public TSortable TString _causale; // Codice causale TString _descrizione; // Sua descrizione + + char _tipocf; + long _codcf; TDate _data_doc; // Data del documento TString _num_doc; // Numero documento @@ -146,6 +181,7 @@ public: bool in_valuta() const { return _valuta.in_valuta(); } void print_on(TPrint_section& body); + void export_to(TEC_recordset& set); TEC_row(const TRiga_partite& row, const TDate& data, const TImporto& imp, int rata); TEC_row(const char* desc, const TImporto& imp, const TValuta& val); @@ -153,7 +189,7 @@ public: }; TEC_row::TEC_row(const TRiga_partite& row, const TDate& data, const TImporto& imp, int rata) - : _salvo_buon_fine(FALSE), _bloccata(FALSE) + : _salvo_buon_fine(false), _bloccata(false) { _riga = row.get_int(PART_NRIGA); _rata = rata; @@ -172,15 +208,19 @@ TEC_row::TEC_row(const TRiga_partite& row, const TDate& data, const TImporto& im const bool valuta = form().in_valuta() && _valuta.in_valuta(); const char* const field = valuta ? PART_IMPTOTVAL : PART_IMPTOTDOC; _totale = row.get_real(field); + __ltipocf = _tipocf = row.get_char(PART_TIPOCF); + __lcodcf = _codcf = row.get_long(PART_SOTTOCONTO); } TEC_row::TEC_row(const char* desc, const TImporto& imp, const TValuta& val) : _riga(9999), _rata(9999), _num_doc(0), - _num_prot(0), _num_reg(0), _salvo_buon_fine(FALSE), _bloccata(FALSE) + _num_prot(0), _num_reg(0), _salvo_buon_fine(false), _bloccata(false) { _descrizione = desc; _importo = imp; _importo.normalize(); _valuta = val; + _tipocf = __ltipocf; + _codcf = __lcodcf; } // Le righe dell'estratto conto sono ordinate per data, riga partita, numero rata o @@ -254,7 +294,7 @@ void TEC_row::print_on(TPrint_section& body) numdoc.set(_num_doc); TForm_item& numprot = body.find_field(PEC_PROTIVA); - TString16 protiva; protiva << _num_prot; + TString8 protiva; protiva << _num_prot; numprot.set(protiva); TForm_item& datapag = body.find_field(PEC_DATAPAG); @@ -285,8 +325,8 @@ void TEC_row::print_on(TPrint_section& body) TForm_item& totdoc = body.find_field(PEC_TOTDOC); set_imp(totdoc, _totale, cod_valuta); - TForm_item& lire = body.find_field(PEC_IMPEURO); - set_imp(lire, _importo_euro, ""); // In generale va espresso nella valuta della ditta + TForm_item& euro = body.find_field(PEC_IMPEURO); + set_imp(euro, _importo_euro, ""); // In generale va espresso nella valuta della ditta TForm_item& cambio = body.find_field(PEC_CAMBIO); cambio.set(_valuta.cambio().string()); @@ -306,6 +346,28 @@ void TEC_row::print_on(TPrint_section& body) descr.set_prompt(old_prompt); } +void TEC_row::export_to(TEC_recordset& r) +{ + r.new_rec(); + r.set("Cliente", TVariant(_codcf)); + TString key; key.format("%c|%ld", _tipocf, _codcf); + const TString & ragsoc = cache().get(LF_CLIFO, key, CLI_RAGSOC); + + r.set("RagioneSociale", TVariant(ragsoc)); + r.set("Valuta", TVariant(_valuta.codice())); + r.set("Causale", TVariant(_causale)); + r.set("Descrizione", TVariant(_descrizione)); + r.set("DataDoc", TVariant(_data_doc)); + r.set("NumDoc", TVariant(_num_doc)); + r.set("ProtIVA", TVariant(_num_prot)); + r.set("DataPag", TVariant(_data)); + r.set(_importo.sezione() == 'D' ? "Dare" : "Avere", _importo.valore()); + r.set("Scaduto", TVariant(_scaduto)); + r.set("Esposto", TVariant(_esposto)); + r.set("SBF", TVariant(_salvo_buon_fine ? "*" : " ")); + r.set("TotDoc", TVariant(_totale)); +} + /////////////////////////////////////////////////////////// // TEC_array /////////////////////////////////////////////////////////// @@ -508,7 +570,7 @@ void TEC_array::add_row(const TRiga_partite& row) } if (in_valuta) { - TImporto il = rata.importo(FALSE); + TImporto il = rata.importo(false); il.normalize(sezione); rec.importo_euro(il.valore()); } @@ -531,7 +593,7 @@ void TEC_array::add_row(const TRiga_partite& row) const TDate& dls = form().data_limite_scaduto(); const TDate& dir = form().data_inizio_rischio(); - bool sbf = FALSE; + bool sbf = false; TImporto esposto(row.esposto(in_valuta, dls, dir, sbf)); bool esp = !esposto.is_zero(); @@ -551,13 +613,13 @@ void TEC_array::add_row(const TRiga_partite& row) rec.descrizione(form().describe(PEC_ABBUONI)); if (in_valuta) { - TImporto il(row.importo(FALSE, 0x2)); + TImporto il(row.importo(false, 0x2)); il.normalize(sezione); rec.importo_euro(il.valore()); } } - TImporto diffcam(row.importo(FALSE, 0x4)); + TImporto diffcam(row.importo(false, 0x4)); if (!diffcam.is_zero() && !in_valuta) { TEC_row& rec = new_row(row, data_pag, TImporto('D', ZERO), RIGA_DIFFCAM); @@ -565,7 +627,7 @@ void TEC_array::add_row(const TRiga_partite& row) rec.importo(diffcam); } - TImporto ritenute(row.importo(FALSE, 0x8)); + TImporto ritenute(row.importo(false, 0x8)); if (!ritenute.is_zero()) { TEC_row& rec = new_row(row, data_pag, TImporto('D', ZERO), RIGA_RITENUTE); @@ -915,7 +977,7 @@ void TEC_form::print_total(int riga, const THash_object& o) printer().setfooterline(riga + r, foot.row(r)); } -void TEC_form::stampa_pedata(TPrinter& pr) +void TEC_form::stampa_pedata() { THash_object* tot[MAXTOT]; word num_rip = ordina_totali_per_valuta(tot); @@ -927,9 +989,30 @@ void TEC_form::stampa_pedata(TPrinter& pr) print_total(j*_total_rows+1, *tot[j]); } +void TEC_form::export_total() +{ + THash_object* tot[MAXTOT]; + word num_rip = ordina_totali_per_valuta(tot); + for (word j = 0; j < num_rip; j++) + { + _recordset->new_rec(); + + const THash_object& o = *tot[j]; + const TTotal& t = (const TTotal&)o.obj(); + + TString descr; descr << "*** " << TR("Totale") << ' ' << o.key(); + _recordset->set("Descrizione", TVariant(descr)); + _recordset->set(t.importo().sezione() == 'D' ? "Dare" : "Avere", t.importo().valore()); + _recordset->set("Scaduto", t.scaduto()); + _recordset->set("Esposto", t.esposto()); + +// _recordset->new_rec(); + } +} + void TEC_form::ultima_pagina() { - set_last_page(TRUE); + set_last_page(true); } void TEC_form::ec_header_handler(TPrinter& pr) @@ -944,29 +1027,30 @@ void TEC_form::ec_footer_handler(TPrinter& pr) if (_form->page(pr) > 0) // Normal page _form->stampa_riporti(pr); else // Last page - _form->stampa_pedata(pr); + _form->stampa_pedata(); } void TEC_form::azzera_totali() { totali().destroy(); // Azzera tutti i riporti _num_rip = 0; // Azzera il numero di righe di riporto - set_last_page(FALSE); // Azzera il flag di ultima pagina di stampa + set_last_page(false); // Azzera il flag di ultima pagina di stampa - TPrint_section& foot = section('F'); - printer().footerlen(foot.height()); - printer().setcurrentpage(1); + if (printing()) + { + TPrint_section& foot = section('F'); + printer().footerlen(foot.height()); + printer().setcurrentpage(1); + } } bool TEC_form::print_game(const TPartita& game) { - bool ok = FALSE; + bool ok = false; TEC_array righe(game, this); - TPrinter& pr = printer(); - TPrintrow prow; - + TPrint_section& body = section('B'); TImporto saldo; @@ -979,30 +1063,40 @@ bool TEC_form::print_game(const TPartita& game) int r; for (r = 0; r < righe.items(); r++) { - TEC_row& riga = righe.row(r); - - if (pr.rows_left() <= (body.height()+1)) // salto pagina + if (printing()) { - pr.formfeed(); - for (word nr = 0; nr < _num_rip; nr++) - { - TPrintrow* fl = pr.getfooterline(nr + 1); - CHECKD(fl, "Manca la riga di riporto ", nr + 1); - pr.print(*fl); - } - } + TPrinter& pr = printer(); + if (pr.rows_left() <= (body.height()+1)) // salto pagina + { + pr.formfeed(); + for (word nr = 0; nr < _num_rip; nr++) + { + TPrintrow* fl = pr.getfooterline(nr + 1); + CHECKD(fl, "Manca la riga di riporto ", nr + 1); + pr.print(*fl); + } + } + } + TEC_row& riga = righe.row(r); const int ri = riga.riga(); const int ra = riga.rata(); if (ri == ultima_riga && ra == ultima_rata+1) riga.reset_uguali(); ultima_riga = ri; ultima_rata = ra; - - riga.print_on(body); - pr.print(body.row(0)); + + if (printing()) + { + riga.print_on(body); + printer().print(body.row(0)); + } + else + { + riga.export_to(*_recordset); + } - TString16 codval; + TString4 codval; if (in_valuta()) codval = riga.valuta().codice(); @@ -1013,7 +1107,7 @@ bool TEC_form::print_game(const TPartita& game) scaduto += riga.scaduto(); esposto += riga.esposto(); implire += riga.importo_euro(); - ok = TRUE; + ok = true; } if (ok && stampa_saldo()) @@ -1032,8 +1126,14 @@ bool TEC_form::print_game(const TPartita& game) sld.scaduto(scaduto); sld.esposto(esposto); sld.importo_euro(implire); - sld.print_on(body); - pr.print(body.row(0)); + + if (printing()) + { + sld.print_on(body); + printer().print(body.row(0)); + } + else + sld.export_to(*_recordset); } return ok; } @@ -1073,23 +1173,34 @@ void TEC_form::init_header(const TMask& m) void TEC_form::set_agente(const TString& codag) { + const bool good = codag.full(); + TPrint_section& head = section('H'); TForm_item& agente = head.find_field(PEC_AGENTE); - - const bool good = !codag.blank(); agente.show(good); + if (good) { TString ag; ag << codag << ' '; ag << cache().get(LF_AGENTI, codag, AGE_RAGSOC); - agente.set(ag); + + if (printing()) + { + agente.set(ag); + } + else + { + _recordset->new_rec(); + _recordset->set("Descrizione", TVariant(ag)); + _recordset->new_rec(); + } } } -TEC_form::TEC_form(const TEC_mask& m, bool gesval) - : TForm(BASE_EC_PROFILE, m.get_prof_name()), - _in_valuta(FALSE), _stampa_saldo(TRUE), _num_rip(0), _total_rows(0) +TEC_form::TEC_form(const TEC_mask& m, bool gesval, bool excel) + : TForm(BASE_EC_PROFILE, m.get_prof_name()), _recordset(NULL), + _in_valuta(false), _stampa_saldo(true), _num_rip(0), _total_rows(0) { _form = this; @@ -1103,66 +1214,79 @@ TEC_form::TEC_form(const TEC_mask& m, bool gesval) _dls = m.get(F_DATALIMSC); _giorni_rischio = m.get_int(F_GIORISCH); _dir = _dls; _dir -= _giorni_rischio; - - TPrinter& pr = printer(); - - pr.setheaderhandler(ec_header_handler); - TPrint_section& head = section('H'); - pr.headerlen(head.height()); - - pr.setfooterhandler(ec_footer_handler); - const TPrint_section& foot = section('F'); - pr.footerlen(foot.height()); TForm_item& flags = find_field('H', last_page, PEC_FLAGS); - + TToken_string f(flags.prompt()); _in_valuta = gesval && f.get_char(0) == 'X'; // Il profilo e' in valuta se c'e' il flag di valuta _fincatura = f.get_int(1); - - if (_fincatura > 0) - { - const int first = head.height()-2; - const int last = pr.formlen(); - const int horiz[] = { first+2, last-foot.height()+1, 0 }; - set_fink_mode(_fincatura == 1 ? FALSE : TRUE); - genera_fincatura(odd_page, first, last, horiz); - } - TForm_item& uns = section('F').find_field(PEC_UNASSIGNED); - TForm_item& tuns = section('F').find_field(PEC_TUNASSIGNED); - if (uns.shown()) uns.hide(); - if (tuns.shown()) tuns.hide(); - genera_intestazioni(odd_page, head.height() - 1); - init_header(m); // Set fixed text - - _total_rows = 1; - for (word fi = 0; fi < foot.fields(); fi++) + if (!excel) { - const TForm_item& item = foot.field(fi); - if (item.shown()) + TPrinter& pr = printer(); + + pr.setheaderhandler(ec_header_handler); + TPrint_section& head = section('H'); + pr.headerlen(head.height()); + + pr.setfooterhandler(ec_footer_handler); + const TPrint_section& foot = section('F'); + pr.footerlen(foot.height()); + + if (_fincatura > 0) + { + const int first = head.height()-2; + const int last = pr.formlen(); + const int horiz[] = { first+2, last-foot.height()+1, 0 }; + set_fink_mode(_fincatura == 1 ? false : true); + genera_fincatura(odd_page, first, last, horiz); + } + + TForm_item& uns = section('F').find_field(PEC_UNASSIGNED); + TForm_item& tuns = section('F').find_field(PEC_TUNASSIGNED); + if (uns.shown()) uns.hide(); + if (tuns.shown()) tuns.hide(); + + genera_intestazioni(odd_page, head.height() - 1); + init_header(m); // Set fixed text + + _total_rows = 1; + for (word fi = 0; fi < foot.fields(); fi++) { - const word y = (word)item.y(); - if (y > _total_rows) - _total_rows = y; - } + const TForm_item& item = foot.field(fi); + if (item.shown()) + { + const word y = (word)item.y(); + if (y > _total_rows) + _total_rows = y; + } + } + + _maxtot = f.get_int(3); + + // La prima e l'ultima riga del footer devono essere lasciate libere per la fincatura + // Ogni totale occupa _total_rows righe: per cui posso calcolare il massimo di totali + // che posso stampare nel footer. + const word max = (foot.height() - 2) / _total_rows; + if (_maxtot <= 0 || _maxtot > max) + _maxtot = max; } - - _maxtot = f.get_int(3); - - // La prima e l'ultima riga del footer devono essere lasciate libere per la fincatura - // Ogni totale occupa _total_rows righe: per cui posso calcolare il massimo di totali - // che posso stampare nel footer. - const word max = (foot.height() - 2) / _total_rows; - if (_maxtot <= 0 || _maxtot > max) - _maxtot = max; + else + _recordset = new TEC_recordset; } TEC_form::~TEC_form() { - TPrinter& pr = printer(); - pr.setheaderhandler(NULL); - pr.setfooterhandler(NULL); + if (printing()) + { + TPrinter& pr = printer(); + pr.setheaderhandler(NULL); + pr.setfooterhandler(NULL); + } + else + { + delete _recordset; + } _form = NULL; } @@ -1205,9 +1329,9 @@ bool TEC_Game_list::has_clifo(long codcf) { signat = key; if (signat.get_long(1) == codcf) - return TRUE; + return true; } - return FALSE; + return false; } bool TEC_Game_list::has_game(const TRectype& rec) @@ -1280,10 +1404,15 @@ bool TStampaEC_application::print_selected() const long print_all = !s.one_checked(); // Se non ho selezionato nulla allora li stampo tutti long analfabeti = 0; // Persone non stampate in quanto aventi lingua errata - - printer().open(); - + const bool printing = form().printing(); const long items = c.items(); + + TProgind* pi = NULL; + if (printing) + printer().open(); + else + pi = new TProgind(items, TR("Calcolo estratto conto"), true, true); + for (long i = 0; i < items; i++) { if (print_all || s.checked(i)) @@ -1293,23 +1422,37 @@ bool TStampaEC_application::print_selected() if (ret < 0) analfabeti++; } - if (printer().frozen()) - break; + + if (printing) + { + if (printer().frozen()) + break; + } + else + { + if (!pi->addstatus(1)) + break; + } } - printer().close(); - - if (analfabeti > 0) - { - const char* anag = who == 'C' ? TR("clienti") : TR("fornitori"); - warning_box(FR("%ld %s non sono stati stampati in quanto " - "il codice lingua non corrispondeva al profilo di stampa"), - analfabeti, anag); - } - if (_tiponumec > ' ' && who == 'C') - save_numec(); + if (printing) + { + printer().close(); + if (_tiponumec > ' ' && who == 'C') + save_numec(); + + if (analfabeti > 0) + { + const char* anag = who == 'C' ? TR("clienti") : TR("fornitori"); + warning_box(FR("%ld %s non sono stati stampati in quanto " + "il codice lingua non corrispondeva al profilo di stampa"), + analfabeti, anag); + } + } + else + delete pi; - return TRUE; + return true; } void TStampaEC_application::find_agents_scads(TAssoc_array& agents) @@ -1340,11 +1483,10 @@ void TStampaEC_application::find_agents_scads(TAssoc_array& agents) const long items = cur.items(); cur.freeze(); - TProgind pi(items, TR("Ricerca scadenze aperte per agente..."), TRUE, TRUE); + TProgind pi(items, TR("Ricerca scadenze aperte per agente..."), true, true); for (cur = 0L; cur.pos() < items; ++cur) { - pi.addstatus(1); - if (pi.iscancelled()) + if (!pi.addstatus(1)) break; const char* codag = pagsca.get(PAGSCA_CODAG); @@ -1378,33 +1520,32 @@ void TStampaEC_application::find_agents_unassigned_pags(TAssoc_array& agents) TRelation rel(LF_PAGSCA); TRectype& curr = rel.curr(); - curr.put(PAGSCA_TIPOC, mask().get(SC_CLIFO)); + curr.put(PAGSCA_TIPOC, mask().get(SC_CLIFO)); // Imposta C o F TRectype recfr(curr), recto(curr); if (fromcli > 0) - recfr.put(PAGSCA_SOTTOCONTO, fromcli); + recfr.put(PAGSCA_SOTTOCONTO, fromcli); // Imposta cliente iniziale if (tocli >= fromcli) - recto.put(PAGSCA_SOTTOCONTO, tocli); + recto.put(PAGSCA_SOTTOCONTO, tocli); // Imposta cliente finale TString filter; filter << '(' << PAGSCA_NRATA <<"==9999)"; - if (fromage.not_empty()) - filter << "&&(" << PAGSCA_CODAG << ">=" << fromage << ')'; + if (fromage.full()) + filter << "&&(" << PAGSCA_CODAG << ">='" << fromage << "')"; else - filter << "&&(" << PAGSCA_CODAG << ">0)"; - if (toage.not_empty()) - filter << "&&(" << PAGSCA_CODAG << "<=" << toage << ')'; + filter << "&&(" << PAGSCA_CODAG << "!='')"; + if (toage.full()) + filter << "&&(" << PAGSCA_CODAG << "<='" << toage << "')"; TCursor cur(&rel, filter, 1, &recfr, &recto); const long items = cur.items(); if (items > 0) { cur.freeze(); - TProgind pi(items, TR("Ricerca pagamenti non assegnati per agente..."), TRUE, TRUE); + TProgind pi(items, TR("Ricerca pagamenti non assegnati per agente..."), true, true); for (cur = 0L; cur.pos() < items; ++cur) { - pi.addstatus(1); - if (pi.iscancelled()) + if (!pi.addstatus(1)) break; const char* codag = curr.get(PAGSCA_CODAG); TEC_Game_list* games = (TEC_Game_list*)agents.objptr(codag); @@ -1441,70 +1582,91 @@ bool TStampaEC_application::print_agents() filter.put(CLI_TIPOCF, who); fc.setregion(filter, filter); + const bool printing = form().printing(); const long print_all = !s.one_checked(); // Se non ho selezionato nulla allora li stampo tutti long analfabeti = 0; // Persone non stampate in quanto aventi lingua errata TAssoc_array agents; const long totag = find_agents_games(agents); - if (totag > 0) - { + if (totag <= 0) + return false; + + TRelation rel(LF_AGENTI); + TCursor cur(&rel); + const long items = cur.items(); + cur.freeze(); + + TProgind* pi = NULL; + if (printing) printer().open(); - - TRelation rel(LF_AGENTI); - TCursor cur(&rel); - const long items = cur.items(); - cur.freeze(); - for (cur = 0L; cur.pos() < items; ++cur) + else + pi = new TProgind(items, "Calcolo estratto conto", true, true); + + for (cur = 0L; cur.pos() < items; ++cur) + { + const TString& codag = cur.curr().get(AGE_CODAGE); + TEC_Game_list* games = (TEC_Game_list*)agents.objptr(codag); + if (games != NULL) { - const TString& codag = cur.curr().get(AGE_CODAGE); - TEC_Game_list* games = (TEC_Game_list*)agents.objptr(codag); - if (games != NULL) + form().set_agente(codag); + const long items = c.items(); + for (long i = 0; i < items; i++) { - form().set_agente(codag); - const long items = c.items(); - for (long i = 0; i < items; i++) + if (print_all || s.checked(i)) + { + fc = i; // Muove il cursore alla posizione corrente + const long codcf = fc.curr().get_long(CLI_CODCF); + if (games->has_clifo(codcf)) + { + const int ret = print_ec(games); + if (ret < 0) + analfabeti++; + } + } + if (printing) { - if (print_all || s.checked(i)) - { - fc = i; // Muove il cursore alla posizione corrente - const long codcf = fc.curr().get_long(CLI_CODCF); - if (games->has_clifo(codcf)) - { - const int ret = print_ec(games); - if (ret < 0) - analfabeti++; - } - } if (printer().frozen()) break; } + else + { + if (!pi->addstatus(1)) + break; + } } } - printer().close(); } - - if (analfabeti > 0) - { - const char* anag = who == 'C' ? TR("clienti") : TR("fornitori"); - warning_box(FR("%ld %s non sono stati stampati in quanto " - "il codice lingua non corrispondeva al profilo di stampa"), - analfabeti, anag); - } - if (_tiponumec > ' ' && who == 'C') - save_numec(); - - return TRUE; + if (printing) + { + printer().close(); + if (_tiponumec > ' ' && who == 'C') + save_numec(); + + if (analfabeti > 0) + { + const char* anag = who == 'C' ? TR("clienti") : TR("fornitori"); + warning_box(FR("%ld %s non sono stati stampati in quanto " + "il codice lingua non corrispondeva al profilo di stampa"), + analfabeti, anag); + } + } + else + delete pi; + + + return true; } void TStampaEC_application::save_numec() { - if (_lastnumcf.items() > 0) // Ho numerato qualche estratto conto? + // Ho numerato qualche estratto conto? + if (_lastnumcf.items() > 0 && form().printing()) { if (yesno_box(TR("Si desidera aggiornare il numero di estratto conto stampato definitivamente?"))) { - TProgind pi(_lastnumcf.items(), TR("Aggiornamento numero estratto conto..."), FALSE, TRUE); + TProgind pi(_lastnumcf.items(), TR("Aggiornamento numero estratto conto..."), false, true); const char tipocf = mask().get_who(); // Dovrebbe essere sempre 'C' TLocalisamfile cfven(LF_CFVEN); FOR_EACH_ASSOC_STRING(_lastnumcf, obj, key, str) @@ -1547,11 +1709,13 @@ void TStampaEC_application::save_numec() void TStampaEC_application::update_numec(const TRectype& clf, int sign) { - if (_tiponumec > ' ' && clf.get_char(CLI_TIPOCF) == 'C') + const char tipocf = clf.get_char(CLI_TIPOCF); + if (_tiponumec > ' ' && tipocf == 'C' && form().printing()) { TForm_item& nec = form().find_field('H', odd_page, PEC_NUMPROG); if (nec.shown()) { + const TString8 codcf = clf.get(CLI_CODCF); TString16 num; switch(_tiponumec) { @@ -1559,12 +1723,8 @@ void TStampaEC_application::update_numec(const TRectype& clf, int sign) if (sign > 0) { TString16 key; - - key.format("%s|%s", (const char *) clf.get(CLI_TIPOCF), - (const char *) clf.get(CLI_CODCF)); - - const TRectype & cfven = cache().get(LF_CFVEN, key); - + key.format("%c|%s", tipocf, (const char*)codcf); + const TRectype& cfven = cache().get(LF_CFVEN, key); num << (cfven.get_long("NUMESC")+1); } break; @@ -1580,13 +1740,13 @@ void TStampaEC_application::update_numec(const TRectype& clf, int sign) default: break; } - if (num.not_empty()) + if (num.full()) { nec.set(num); - _lastnumcf.add(clf.get(CLI_CODCF), num); + _lastnumcf.add(codcf, num); } else - _lastnumcf.remove(clf.get(CLI_CODCF)); + _lastnumcf.remove(codcf); } } } @@ -1598,19 +1758,21 @@ int TStampaEC_application::print_ec(TEC_Game_list* games) TWait_cursor hourglass; TEC_form& f = form(); + const bool printing = f.printing(); const TRectype& clf = f.cursor()->curr(); - const TString16 lincf(clf.get(CLI_CODLIN)); - - bool ok = TRUE; - // make controllations per lingua profilo/CF - if ((f.lingua() == _lingua_ditta && !lincf.empty()) || - f.lingua() != _lingua_ditta) - ok = lincf == f.lingua(); - - if (!ok) // Cliente analfabeta - return -1; + if (printing) + { + // make controllations per lingua profilo/CF + const TString& lincf = clf.get(CLI_CODLIN); + bool ok = true; + if ((f.lingua() == _lingua_ditta && lincf.full()) || + f.lingua() != _lingua_ditta) + ok = lincf == f.lingua(); + if (!ok) // Cliente analfabeta + return -1; + } f.azzera_totali(); // Azzera totali di fine pagina @@ -1629,10 +1791,12 @@ int TStampaEC_application::print_ec(TEC_Game_list* games) TString status; - bool one_printed = FALSE; // Non ho stampato ancora nulla - update_numec(clf, +1); // Incrementa contatore + int printed = 0; // Non ho stampato ancora nulla + + if (printing) + update_numec(clf, +1); // Incrementa contatore - TString16 last_game; + TString8 last_game; int last_year = 0; for (cur = 0; cur.pos() < items; ++cur) @@ -1669,7 +1833,7 @@ int TStampaEC_application::print_ec(TEC_Game_list* games) const TRiga_partite& riga = game.riga(r); if (riga.is_fattura()) { - const TDate dd(riga.get(PART_DATADOC)); + const TDate dd = riga.get(PART_DATADOC); if (dd >= data_chiuse) break; } @@ -1679,31 +1843,43 @@ int TStampaEC_application::print_ec(TEC_Game_list* games) continue; } - if (one_printed) + if (printing) { - TPrintrow empty; // Salta una riga vuota - printer().print(empty); // (Non farlo alla fine di ogni partita!) - } + if (printed) + { + TPrintrow empty; // Salta una riga vuota + printer().print(empty); // (Non farlo alla fine di ogni partita!) + } + if (printer().frozen()) + break; + } - const bool printed = form().print_game(game); - if (printed) - one_printed = TRUE; - - if (printer().frozen()) - break; + if (f.print_game(game)) + printed++; } - - if (one_printed) + + if (printing) { - f.ultima_pagina(); - printer().formfeed(); + if (printed > 0) + { + f.ultima_pagina(); + printer().formfeed(); + } + else + update_numec(clf, -1); } else - update_numec(clf, -1); + { + if (printed > 0) + { + f.export_total(); +// f.recordset().new_rec(); + } + } xvtil_statbar_set(NULL); - return one_printed ? 1 : 0; + return printed; } /////////////////////////////////////////////////////////// @@ -1745,33 +1921,44 @@ void TStampaEC_application::main_loop() TEC_mask& m = mask(); m.set(F_STAMPSALDO, "X"); - while (TRUE) + while (true) { m.show(F_ULTIMOEC, _tiponumec == 'G'); m.set(F_ULTIMOEC, _lastnumec); - if (m.run() != K_QUIT) - { - _form = new TEC_form(m, _gesval); + const KEY k = m.run(); + if (k == K_QUIT) + break; + const bool excel = k != K_ENTER; + _form = new TEC_form(m, _gesval, excel); + + _form->stampa_saldo(m.get_bool(F_STAMPSALDO)); + + if (!excel) + { TForm_item& nec = _form->find_field('H', odd_page, PEC_NUMPROG); if (nec.enabled() && nec.shown()) { nec.show(_tiponumec > ' ' && m.get_who() == 'C'); _lastnumec = m.get_long(F_ULTIMOEC); } - - _form->stampa_saldo(m.get_bool(F_STAMPSALDO)); - - if (m.get_bool(F_GROUPAGENT)) - print_agents(); - else - print_selected(); - - delete _form; - _form = NULL; } + + if (m.get_bool(F_GROUPAGENT)) + print_agents(); else - break; + print_selected(); + + if (excel) + { + TFilename slk; slk.tempdir(); slk.add("ec.slk"); + _form->recordset().save_as(slk, fmt_silk); + xvt_sys_goto_url(slk, "open"); + } + + delete _form; + _form = NULL; + } } diff --git a/sc/sc2100a.uml b/sc/sc2100a.uml index a9cb1691e..62c26aa75 100755 --- a/sc/sc2100a.uml +++ b/sc/sc2100a.uml @@ -5,13 +5,20 @@ TOOLBAR "Toobar" 0 -3 0 3 BUTTON DLG_PRINT 10 2 BEGIN - PROMPT -12 -11 "" + PROMPT -13 -11 "" MESSAGE EXIT,K_ENTER END +BUTTON DLG_EDIT 10 2 +BEGIN + PROMPT -23 -11 "" + PICTURE BMP_EDIT + MESSAGE EXIT,69 +END + BUTTON DLG_QUIT 10 2 BEGIN - PROMPT -22 -11 "" + PROMPT -33 -11 "" END ENDPAGE diff --git a/sc/sc2200.cpp b/sc/sc2200.cpp index 2d2ebd08d..563571140 100755 --- a/sc/sc2200.cpp +++ b/sc/sc2200.cpp @@ -125,7 +125,7 @@ public: void check_add_key_to_tp(int t, char u); // controlla e aggiunge i valori relativi alla chiave k ai totali del prospetto void check_add_key_to_tl(tipo_pe p, int t); // controlla e aggiunge i valori elaborati all'assoc array indicato dal periodo (_tlxxx) // Ritorna TRUE se la partita corrente _p non e' piu' riferita alla scadenza corrente - bool scad_changed(char tipo, int gruppo, int conto, long codcf, int anno, TString& nump); + bool scad_changed(char tipo, int gruppo, int conto, long codcf, int anno, const TString& nump); // Ritorna TRUE se la scadenza corrente ha una banca diversa dalla precedente // bool bank_will_change(); // Totalizza i pagamenti non assegnati per la partita corrente (NB si spera che siano tutti nella stessa valuta) @@ -331,7 +331,7 @@ void TStampaScadenzario::check_add_key_to_tp(int t, char u) _tp.add(k,_w_imp_res); } -bool TStampaScadenzario::scad_changed(char tipo, int gruppo, int conto, long codcf, int anno, TString& nump) +bool TStampaScadenzario::scad_changed(char tipo, int gruppo, int conto, long codcf, int anno, const TString& nump) { if (_p == NULL) return TRUE; @@ -437,7 +437,14 @@ void TStampaScadenzario::calcola_pagamenti(real& imp_scad, int riga, int rata, T TAssoc_array& unsnc = (TAssoc_array&) _uns_cache[1]; TAssoc_array& unsins = (TAssoc_array&) _uns_cache[2]; - TRiga_scadenze& rs = _p->rata(riga,rata); + if (!_p->esiste(riga, rata)) + { + error_box("Nella partita %c %ld %d %s la rata %d non corrisponde ad una riga di fattura (%d)", + bill.tipo(), bill.codclifo(), _p->anno(), (const char*)_p->numero(), rata, riga); + return; + } + + const TRiga_scadenze& rs = _p->rata(riga, rata); const char ssez = _p->riga(riga).sezione(); const char* field = (_stvaluta && rs.in_valuta()) ? PAGSCA_IMPORTOVAL : PAGSCA_IMPORTO; const char* sfield = (_stvaluta && rs.in_valuta()) ? SCAD_IMPORTOVAL : SCAD_IMPORTO; @@ -472,7 +479,7 @@ void TStampaScadenzario::calcola_pagamenti(real& imp_scad, int riga, int rata, T _w_imp_pag = totalep.valore(); imp_scad = scdz.valore(); real a,b,c; - TString k; + TString80 k; look_in_cache(a,b,c,uns,unsnc,unsins,k); if (b > ZERO) // Scala le note di credito dalle scadenze { @@ -554,19 +561,19 @@ const char * TStampaScadenzario::tipi_tab(int tipo) bool TStampaScadenzario::preprocess_page(int file, int counter) // Se ritorna FALSE salta questa scadenza e va alla prossima. { - const TRectype &rc = current_cursor()->curr(LF_SCADENZE); - char tipoc = rc.get_char(SCAD_TIPOCF); // Tipo - int gruppo = rc.get_int(SCAD_GRUPPO); // Gruppo - int conto = rc.get_int(SCAD_CONTO); // Conto - long codcf = rc.get_long(SCAD_SOTTOCONTO); // Codice Cliente/Fornitore/Conto - int annop = rc.get_int(SCAD_ANNO); // Anno partita - TString nump ( rc.get(SCAD_NUMPART)); // Nr partita - int nrigap = rc.get_int(SCAD_NRIGA); // Nr riga - int nratap = rc.get_int(SCAD_NRATA); // Nr rata - TDate datascad = rc.get_date(SCAD_DATASCAD); // Data scadenza - int tipo_pag = rc.get_int(SCAD_TIPOPAG); // Tipo di pagamento - char ult_cla = rc.get_char(SCAD_ULTCLASS); // Ulteriore classificazione - real imp_scad ; + const TRectype &rc = current_cursor()->curr(LF_SCADENZE); + const char tipoc = rc.get_char(SCAD_TIPOCF); // Tipo + const int gruppo = rc.get_int(SCAD_GRUPPO); // Gruppo + const int conto = rc.get_int(SCAD_CONTO); // Conto + const long codcf = rc.get_long(SCAD_SOTTOCONTO); // Codice Cliente/Fornitore/Conto + const int annop = rc.get_int(SCAD_ANNO); // Anno partita + const TString8 nump = rc.get(SCAD_NUMPART); // Nr partita + const int nrigap = rc.get_int(SCAD_NRIGA); // Nr riga + const int nratap = rc.get_int(SCAD_NRATA); // Nr rata + const TDate datascad = rc.get_date(SCAD_DATASCAD); // Data scadenza + const int tipo_pag = rc.get_int(SCAD_TIPOPAG); // Tipo di pagamento + const char ult_cla = rc.get_char(SCAD_ULTCLASS); // Ulteriore classificazione + real imp_scad ; // Importo in scadenza (vale IMPORTO o // IMPORTOVAL a seconda sia stata impostata la @@ -593,7 +600,6 @@ bool TStampaScadenzario::preprocess_page(int file, int counter) if (scad_changed(tipoc,gruppo,conto,codcf,annop,nump)) { TRectype rp(LF_PARTITE); - rp.zero(); rp.put(PART_TIPOCF,tipoc); rp.put(PART_GRUPPO,gruppo); rp.put(PART_CONTO,conto); @@ -603,7 +609,7 @@ bool TStampaScadenzario::preprocess_page(int file, int counter) if (_p) delete _p; _p = new TPartita(rp); - TString k; // compone la chiave dei tassoc_array dentro a _uns_cache + TString80 k; // compone la chiave dei tassoc_array dentro a _uns_cache k << tipoc << gruppo ; k << conto << codcf; k << annop << nump; diff --git a/server/indexing.cpp b/server/indexing.cpp new file mode 100755 index 000000000..7e28884bd --- /dev/null +++ b/server/indexing.cpp @@ -0,0 +1,275 @@ +#include "baseserv.h" +#include +#include +#include +#include + +////////////////////////////////////////////////////////////////////////////// +// TFileToIndex: incapsula le info sui file da indicizzare +/////////////////////////////////////////////////////////////////////////////// + +class TFileToIndex +{ + protected: + wxFileName _filename; + wxStringTokenizer _contents; + + bool _dirty; + + static void ReadPDF(wxFileInputStream& file, wxString& output); + static void ReadTXT(wxFileInputStream& file, wxString& output); + + public: + TFileToIndex(); + TFileToIndex(const wxString& strFileName); + + const bool IsOk() const; + const bool Dirty() const; + + void SetFileName(const wxString& strFileName); + + wxStringTokenizer& GetText(); +}; + +TFileToIndex::TFileToIndex(): _dirty(true) +{ +} + +TFileToIndex::TFileToIndex(const wxString& strFileName): _filename(strFileName), _dirty(true) +{ +} + +void TFileToIndex::SetFileName(const wxString& strFileName) +{ + _dirty = true; + _filename = strFileName; +} + +const bool TFileToIndex::IsOk() const +{ + return _filename.IsOk(); +} + +const bool TFileToIndex::Dirty() const +{ + return _dirty; +} + +void TFileToIndex::ReadTXT(wxFileInputStream& file, wxString& output) +{ + file.Read(wxStringBuffer(output,file.GetSize()),file.GetSize()); +} + +void TFileToIndex::ReadPDF(wxFileInputStream& file, wxString& output) +{ + wxString buffer; + file.Read(wxStringBuffer(buffer,file.GetSize()),file.GetSize()); + + bool morestreams = true; + + while (morestreams) + { + size_t streamstart = buffer.Index("stream"); + size_t streamend = buffer.Index("endstream"); + if (streamstart>0 && streamend>streamstart) + { + streamstart += 6; + wxZlibInputStream inflated(wxStringInputStream(buffer.Mid(streamstart,streamend-streamstart)), wxZLIB_AUTO); + inflated.Read(wxStringOutputStream(&output)); + output << " "; + + buffer = buffer.Mid(streamend+7); + } + else + { + morestreams = false; + } + } +} + +wxStringTokenizer& TFileToIndex::GetText() +{ + if (Dirty()) + { + _contents = wxStringTokenizer(" ", " "); + + if (IsOk()) + { + wxFileInputStream stream(_filename.GetFullPath()); + + if (stream.CanRead()) + { + wxString strContents(" "); + if (!_filename.GetExt().CmpNoCase("pdf")) + { + ReadPDF(stream, strContents); + } + if (!_filename.GetExt().CmpNoCase("txt") || !_filename.GetExt().CmpNoCase("ini") || !_filename.GetExt().CmpNoCase("log")) + { + ReadTXT(stream, strContents); + } + _contents = wxStringTokenizer(strContents, " \t\r\n.,:;(){}[]\"=", wxTOKEN_STRTOK); + } + } + } + + return _contents; +} + +////////////////////////////////////////////////////////////////////////////// +// TIndexingServer +/////////////////////////////////////////////////////////////////////////////// + +class TIndexingServer : public TBaseServerApp +{ +protected: + virtual const wxChar* GetAppName() const; + virtual void ProcessCommand(wxString cmd, wxSocketBase& outs); + void ProcessHttpGet(wxString cmd, wxSocketBase& outs); + void ProcessHttpPost(wxString cmd, wxSocketBase& outs); + +protected: + bool IsMagicName(wxString& strFilename) const; + void GenerateFileFromGet(wxString& strFilename); + void GenerateFileFromPost(wxString& strFilename, THashTable& thArgs); +}; + +const wxChar* TIndexingServer::GetAppName() const +{ + return "Indexing"; +} + +bool TIndexingServer::IsMagicName(wxString& strFilename) const +{ + wxString strName; + wxSplitPath(strFilename, NULL, &strName, NULL); + strName.MakeLower(); + const int q = strName.Find('?'); + if (q > 0) + strName.Truncate(q); + + if (strName == "index") + { + strFilename = strName; + return true; + } + + if (strName == "results") + { + strFilename = strName; + return true; + } + + return false; +} + +void TIndexingServer::GenerateFileFromGet(wxString& strFilename) +{ + wxString strName, strArgs; + wxSplitPath(strFilename, NULL, &strName, NULL); + strName.MakeLower(); + const int q = strFilename.Find('?'); + if (q > 0) + strArgs = strFilename.Mid(q+1); + + if (strName == "index") + { + TXmlItem html; + TXmlItem& body = CreatePageBody(html).AddChild("center").AddChild("form"); + body.SetAttr("action", "results.htm"); + body.SetAttr("method", "POST"); + + body.AddChild("h1") << "Welcome to the indexing test server"; + body.AddChild("br"); + + TXmlItem& table = body.AddChild("table"); + TXmlItem& textfield = table.AddChild("tr").AddChild("td").AddChild("input"); + TXmlItem& button = table.AddChild("tr").AddChild("td").AddChild("input"); + button.SetAttr("value", "Search"); + button.SetAttr("type", "submit"); + textfield.SetAttr("type", "text"); + textfield.SetAttr("name", "filetodisplay"); + + strFilename = GetTempFilename(); + html.Save(strFilename); + } +} + +void TIndexingServer::GenerateFileFromPost(wxString& strFilename, THashTable& htArgs) +{ + wxString strName, strArgs; + wxSplitPath(strFilename, NULL, &strName, NULL); + strName.MakeLower(); + const int q = strFilename.Find('?'); + if (q > 0) + strArgs = strFilename.Mid(q+1); + + if (strName == "results") + { + TFileToIndex file(htArgs.Get("filetodisplay")); + wxStringTokenizer& text = file.GetText(); + + TXmlItem html; + TXmlItem& body = CreatePageBody(html).AddChild("center"); + + body.AddChild("h1") << "Text contained in file"; + body.AddChild("br"); + + TXmlItem& results = body.AddChild("div"); + + while (text.HasMoreTokens()) + { + results << text.GetNextToken() << ", "; + } + + strFilename = GetTempFilename(); + html.Save(strFilename); + } +} + +void TIndexingServer::ProcessHttpGet(wxString cmd, wxSocketBase& outs) +{ + const int stop = cmd.Find(" HTTP"); + wxString str = cmd.Mid(4, stop-4).Trim(); + + if (str == "/") + str += "index.htm"; + wxString strFilename = GetDocumentRoot() + str; + + if (IsMagicName(strFilename)) + GenerateFileFromGet(strFilename); + SendFile(strFilename, outs); +} + +void TIndexingServer::ProcessHttpPost(wxString cmd, wxSocketBase& outs) +{ + const int stop = cmd.Find(" HTTP"); + wxString str = cmd.Mid(5, stop-5).Trim(); + + wxString args; + + const int pos = cmd.Find("\r\n\r\n"); + if (pos > 0) + args = cmd.Mid(pos+4); + + THashTable hashArgs(17); + ParseArguments(args, hashArgs); + + if (str == "/") + str += "results.htm"; + wxString strFilename = GetDocumentRoot() + str; + + if (IsMagicName(strFilename)) + GenerateFileFromPost(strFilename, hashArgs); + SendFile(strFilename, outs); +} + +void TIndexingServer::ProcessCommand(wxString cmd, wxSocketBase& outs) +{ + if (cmd.StartsWith("GET ")) + ProcessHttpGet(cmd, outs); else + if (cmd.StartsWith("POST ")) + ProcessHttpPost(cmd, outs); +} + +IMPLEMENT_APP(TIndexingServer) diff --git a/tc/IMPPN.v2006.1.0.doc b/tc/IMPPN.v2006.1.0.doc new file mode 100755 index 000000000..1b1b6ad6b Binary files /dev/null and b/tc/IMPPN.v2006.1.0.doc differ diff --git a/tc/tc0300.cpp b/tc/tc0300.cpp new file mode 100755 index 000000000..be7416a56 --- /dev/null +++ b/tc/tc0300.cpp @@ -0,0 +1,145 @@ +#include +#include +#include +#include +#include + +#include "../include/mov.h" +#include "../cg/cglib01.h" +#include "tcconf.h" + +class TTS_confditta : public TConfig_application +{ + char _current; + + static bool check_fields(TMask_field& f, KEY k); + // @cmember:(INTERNAL) Salva i parametri dalla maschera + virtual void save_mask(bool tosave); + virtual void load_mask(); +public: + // @cmember Disabilita la verifica del modulo in chiave + virtual bool check_autorization() const { return FALSE; } + + virtual bool preprocess_config (TMask& mask, TConfig& config); + virtual bool postprocess_config (TMask& mask, TConfig& config); + virtual bool user_create( ); + virtual bool user_destroy( ); + + TTS_confditta() : TConfig_application( CONFIG_DITTA ){ } + virtual ~TTS_confditta( ){ } +}; + +bool TTS_confditta::check_fields(TMask_field& f, KEY k) +{ + return true; +} + +void TTS_confditta::load_mask() +{ + TMask* mask = get_mask(); + if (mask==NULL) return; + TConfig_application::load_mask(); + TConfig& config = *get_config(); + TSheet_field& s = mask->sfield(F_SHEET_IVA); + for (int i=0;config.exist("TSGIVA", i);i++) + { + TToken_string& row = s.row(i); + row.add(config.get("TSGIVA", NULL, i)); + row.add(config.get("TSCIVA", NULL, i)); + row.add(config.get("TSSIVA", NULL, i)); + s.check_row(i); + } +} + +void TTS_confditta::save_mask(bool tosave) +{ + if (tosave) + { + const TMask & m = *get_mask(); + + if (m.get_bool(F_RIPRISTINO)) + { + const TDate from(m.get(F_ULTINVIO)); + TEsercizi_contabili esc; + const TEsercizio & e = esc.esercizio(esc.date2esc(from)); + const TDate to(e.fine()); + + TString query = "USE MOV KEY 2 SELECT INVIATO==\"X\""; + + query << "\nFROM DATAREG=#DATA_DA"; + query << "\nTO DATAREG=#DATA_AL"; + + TISAM_recordset mov(query); + + mov.set_var("#DATA_DA", TVariant(from)); + mov.set_var("#DATA_AL", TVariant(to)); + + if (mov.items() >0L) + { + TProgind pi(mov.items(), TR("Ripristino movimenti"), true, true); + TLocalisamfile cgmov(LF_MOV); + + for (bool ok = mov.move_first(); ok; ok = mov.move_next()) + { + if (!pi.addstatus(1)) + break; + const long numreg = mov.get(MOV_NUMREG).as_int(); + + cgmov.put(MOV_NUMREG, numreg); + if (cgmov.read(_isequal, _lock) == NOERR) + { + cgmov.zero(MOV_INVIATO); + cgmov.rewrite(); + } + } + } + } + + TConfig& config = *get_config(); + for (int i = 0; config.exist("TSGIVA", i); i++) + { + config.remove("TSGIVA", i); + config.remove("TSCIVA", i); + config.remove("TSSIVA", i); + } + TSheet_field& s = m.sfield(F_SHEET_IVA); + FOR_EACH_SHEET_ROW(s, j, row) + { + config.set("TSGIVA", row->get(0), NULL, true, j); + config.set("TSCIVA", row->get(1), NULL, true, j); + config.set("TSSIVA", row->get(2), NULL, true, j); + } + } + TConfig_application::save_mask(tosave); +} + +bool TTS_confditta::preprocess_config (TMask& mask, TConfig& config) +{ + return true; +} + +bool TTS_confditta::postprocess_config (TMask& mask, TConfig& config) +{ + return true; +} + + +bool TTS_confditta::user_create( ) +{ + TConfig conf(CONFIG_DITTA); + + conf.set( "EdMask", "tc0300a", "tc"); + return true; +} + +bool TTS_confditta::user_destroy( ) +{ + return true; +} + +int tc0300(int argc, char* argv[]) +{ + TTS_confditta appc; + appc.run(argc, argv, TR("Parametri ditta TeamSystem")); + return 0; +} diff --git a/tc/tc0300a.uml b/tc/tc0300a.uml new file mode 100755 index 000000000..4a8d74e89 --- /dev/null +++ b/tc/tc0300a.uml @@ -0,0 +1,223 @@ +#include "tcconf.h" + +TOOLBAR "" 0 20 0 2 + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -12 -1 "" +END + +BUTTON DLG_QUIT 10 2 +BEGIN + PROMPT -22 -1 "" +END + +ENDPAGE + +PAGE "Configurazione ditta per invio a TeamSystem" -1 -1 0 0 + +GROUPBOX DLG_NULL 76 3 +BEGIN + PROMPT 1 1 "@bDitta corrente" +END + +NUMBER F_CODDITTA 5 +BEGIN + PROMPT 2 2 "Codice " + FLAGS "FD" + USE LF_NDITTE + INPUT CODDITTA F_CODDITTA + OUTPUT F_RAGSOC RAGSOC + CHECKTYPE REQUIRED +END + +STRING F_RAGSOC 50 +BEGIN + PROMPT 22 2 "" + FLAGS "D" +END + +NUMBER F_CODDITTATS 5 +BEGIN + PROMPT 2 4 "Codice Ditta TeamSystem " + FLAGS "Z" + FIELD TSDitta + MESSAGE "X",F_RICLI11 +END + +BOOLEAN F_RICLNAZ +BEGIN + PROMPT 2 6 "Trascodifica Nazioni" + FIELD TSRNAZ +END + +BOOLEAN F_RICLIVA +BEGIN + PROMPT 42 6 "Trascodifica Codici IVA" + FIELD TSRIVA +END + +BOOLEAN F_RICLI11 +BEGIN + PROMPT 2 8 "Trascodifica Codici IVA 11" + FIELD TSRI11 + FLAGS "D" +END + +BOOLEAN F_RICLCDP +BEGIN + PROMPT 42 8 "Trascodifica Condizioni di Pagamento" + FIELD TSRCDP +END + +BOOLEAN F_RICLREG +BEGIN + PROMPT 2 10 "Trascodifica Registri" + FIELD TSRREG +END + +BOOLEAN F_RICLCAU +BEGIN + PROMPT 42 10 "Trascodifica Causali" + FIELD TSRCAU +END + +BOOLEAN F_RICLCONTI +BEGIN + PROMPT 2 12 "Trascodifica Piano dei conti" + FIELD TSRCONTI +END + +BOOLEAN F_NOHCLI +BEGIN + PROMPT 42 12 "Non trasferire il cod.cliente di testata" + FIELD TSRNOHCLI +END + +BOOLEAN F_SENDCG +BEGIN + PROMPT 2 14 "Trasferisci le righe contabili invece delle contropartite" + FIELD TSSENDCG +END + +BOOLEAN F_RIPRISTINO +BEGIN + PROMPT 2 16 "Ripristina alla data" + MESSAGE FALSE DISABLE,F_ULTINVIO + MESSAGE TRUE ENABLE,F_ULTINVIO +END + +DATE F_ULTINVIO +BEGIN + PROMPT 42 16 "Data ultimo invio " + FIELD TSULTINV + FLAGS "D" +END + +ENDPAGE + +PAGE "Configurazione conti" -1 -1 0 0 + +SPREADSHEET F_SHEET_IVA +BEGIN + PROMPT 0 2 "Conti IVA da non trasferire" + ITEM "Gr." + ITEM "Co." + ITEM "Sottoc." + ITEM "Descrizione Conto@50" +END + +ENDPAGE + +ENDMASK + +PAGE "" -1 -1 68 11 + +NUMBER SI_GRUPPO 3 +BEGIN + PROMPT 1 3 "Gruppo " + HELP "Codice del gruppo" + USE LF_PCON KEY 1 SELECT (CONTO="") + INPUT GRUPPO SI_GRUPPO + DISPLAY "Gruppo" GRUPPO + DISPLAY "Descrizione@50" DESCR + CHECKTYPE NORMAL + OUTPUT SI_GRUPPO GRUPPO + OUTPUT SI_DESCR DESCR + WARNING "Gruppo assente" + CHECKTYPE NORMAL +END + +NUMBER SI_CONTO 3 +BEGIN + PROMPT 15 3 "Conto " + HELP "Codice del conto" + USE LF_PCON KEY 1 SELECT SOTTOCONTO="" + INPUT GRUPPO SI_GRUPPO + INPUT CONTO SI_CONTO + DISPLAY "Gruppo" GRUPPO + DISPLAY "Conto" CONTO + DISPLAY "Descrizione@50" DESCR + CHECKTYPE NORMAL + OUTPUT SI_CONTO CONTO + OUTPUT SI_GRUPPO GRUPPO + OUTPUT SI_DESCR DESCR + WARNING "Conto assente" + CHECKTYPE NORMAL +END + +NUMBER SI_SOTTOCONTO 6 +BEGIN + PROMPT 29 3 "Sottoconto " + HELP "Codice del sottoconto" + USE LF_PCON + INPUT GRUPPO SI_GRUPPO + INPUT CONTO SI_CONTO + INPUT SOTTOCONTO SI_SOTTOCONTO + DISPLAY "Gruppo" GRUPPO + DISPLAY "Conto" CONTO + DISPLAY "Sottoconto" SOTTOCONTO + DISPLAY "Descrizione@50" DESCR + OUTPUT SI_SOTTOCONTO SOTTOCONTO + OUTPUT SI_GRUPPO GRUPPO + OUTPUT SI_CONTO CONTO + OUTPUT SI_DESCR DESCR + CHECKTYPE NORMAL + WARNING "Sottoconto assente" +END + +STRING SI_DESCR 50 +BEGIN + PROMPT 1 5 "Descrizione " + HELP "Indicare la descrizione della riga" + USE LF_PCON KEY 2 + INPUT DESCR SI_DESCR + DISPLAY "Descrizione@50" DESCR + DISPLAY "Gruppo" GRUPPO + DISPLAY "Conto" CONTO + DISPLAY "Sottoconto" SOTTOCONTO + OUTPUT SI_SOTTOCONTO SOTTOCONTO + OUTPUT SI_CONTO CONTO + OUTPUT SI_GRUPPO GRUPPO + OUTPUT SI_DESCR DESCR +END + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -13 -1 "" +END + +BUTTON DLG_DELREC 10 2 +BEGIN + PROMPT -23 -1 "" +END + +BUTTON DLG_CANCEL 10 2 +BEGIN + PROMPT -33 -1 "" +END + +ENDPAGE + +ENDMASK + diff --git a/tc/tc0700.cpp b/tc/tc0700.cpp new file mode 100755 index 000000000..7a7854108 --- /dev/null +++ b/tc/tc0700.cpp @@ -0,0 +1,1422 @@ +#include "tc0.h" +#include "tc0700a.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../cg/cglib01.h" + +#define TSMAIALCONST 600 + +/////////////////////////////////////////////////////////// +// TRiclassifica_cache +/////////////////////////////////////////////////////////// +class TRiclassifica_cache : public TCache +{ + TLocalisamfile _multirel; +protected: + virtual TObject* key2obj(const char* key); +public: + const char * sdecode(const char* tab, const TString& cod); + long decode(const char* tab, const TString& cod); + TRiclassifica_cache() : _multirel(LF_MULTIREL) { _multirel.setkey(2);} +}; + +TObject* TRiclassifica_cache::key2obj(const char* key) +{ + TToken_string tok(key); + TString8 tab, cod; + tok.get(0,tab); + tok.get(1, cod); + _multirel.put(MULTI_COD, tab); + _multirel.put(MULTI_FIRST, ""); + _multirel.put(MULTI_SECOND, cod); + int err = _multirel.read(_isgteq); + if (err == NOERR && _multirel.get(MULTI_SECOND) == cod) + return new TString(_multirel.get(MULTI_FIRST)); + return NULL; +} + +long TRiclassifica_cache::decode(const char* tab, const TString& cod) +{ + TToken_string tok; + tok.add(tab); + tok.add(cod); + const TString* ric = (const TString*) objptr(tok); + return (ric ? atol(*ric) : 0); +} + +const char * TRiclassifica_cache::sdecode(const char* tab, const TString& cod) +{ + TToken_string tok; + tok.add(tab); + tok.add(cod); + const TString* ric = (const TString*) objptr(tok); + return ric ? (const char *) *ric : ""; +} + +/////////////////////////////////////////////////////////// +// TTS_textset +/////////////////////////////////////////////////////////// + +class TTS_textset : public TAS400_recordset +{ + TAssoc_array _contatori; + +protected: + long add_count(const char* tipo, long n = 1); + +protected: + void add_field(const char* trc, const char* name = "Filler", int len = 0, char tipo = 'a', + int from = -1, const char* def = NULL); + +public: + virtual bool destroy(TRecnotype r); + virtual const TString& rec_type(TRecnotype r = -1) const; + virtual bool set(const char* field, const TVariant& v); + + TTS_textset(const char* query = ""); +}; + +class TIVA_item : public TObject +{ + int _row; + long _conto; + long _codiva; + long _codiva11; + real _imponibile; + real _imposta; +public: + int & row() { return _row;} + long & conto() { return _conto;} + long & codiva() { return _codiva;} + long & codiva11() { return _codiva11;} + real & imponibile() { return _imponibile;} + real & imposta() { return _imposta;} + TIVA_item(int row, long conto, long codiva, long codiva11) : _row(row), _conto(conto), _codiva(codiva), _codiva11(codiva11) {} + virtual ~TIVA_item() {} +}; + +/////////////////////////////////////////////////////////// +// TTS_sender +/////////////////////////////////////////////////////////// + +class TTS_sender : public TSkeleton_application +{ + TRiclassifica_cache* _tabelle; + TRecord_cache* _conti; + TAssoc_array _riclassifica; + TTS_textset* _tsfile; + TLog_report* _log; + bool _errors_logged; + bool _send_cg; + TString8 _dittamulti; + TDate _from; + TArray _recsets; + TAssoc_array _iva; + TAssoc_array _contiiva; + +protected: + bool new_rec(const char* t) { CHECK(t && *t, "Tipo non valido"); return _tsfile->new_rec(t) >= 0; } + void remove_last(); + void set(const char* field, const TVariant& var); + void set(const char* field, const int n) { set(field, TVariant((long)n)); } + void set(const char* field, const char* s) { set(field, TVariant(s)); } + void set(const char* field, const TDate& d) { set(field, TVariant(d)); } + void set(const char* field, const real& v) { set(field, TVariant(v)); } + + const TVariant& get(const char* field); + void add_mov(const TRecordset& mov); + void add_clifor(char tipocf, long codcf); + void add_header(const TRecordset& mov, const bool fullhead = true); + void add_datiiva(const TRecordset& mov); + void add_tot_fattura(const TRecordset& mov); + void add_conti_ricavo_costo(const TRecordset& mov); + void add_new_rec(const TRecordset& mov, const char tipocf, long codcf); + void add_diversi(const TRecordset& mov, const bool moviva); + void add_ratei_risconti(const TRecordset& mov); + void add_ulteriori(const TRecordset& mov); + const TString & scod2ricl(const char* tab, const TString& cod); + const TString & scod2ricl(const char* tab, const TVariant& cod); + const long cod2ricl(const char* tab, const TString& cod); + const long cod2ricl(const char* tab, const TVariant& cod); + const long bill2ricl(char & t, int gr, int co, long so, const bool header_cli = false); + + virtual TRecordset & movrecset(const TDate & from = eotime, const TDate & to = botime); + virtual TRecordset & rmovrecset(const TRecordset & mov); + virtual TRecordset & rivarecset(const TRecordset & mov); + virtual TRecordset & clirecset(const char tipocf, const long codcf); + virtual void get_citta_provincia(const TRecordset& cli, TString & dencom, TString & provcom, bool nascita = false); + virtual const char * decode_causale(const TRecordset& mov); + virtual bool test_swap(const TRecordset& mov); + +public: + void log(int sev, const char* msg); + + TString & dittamulti() { return _dittamulti;} + TAssoc_array & riclassifica() {return _riclassifica;} + + virtual void update_parameters(const TDate & d); + virtual void set_parameters(); + virtual bool create(); + virtual void main_loop(); + virtual bool destroy(); + TTS_sender() : _tabelle(NULL), _conti(NULL) {} +}; + +TTS_sender& app() { return (TTS_sender&)main_app(); } + +/////////////////////////////////////////////////////////// +// TTS_textset +/////////////////////////////////////////////////////////// + +long TTS_textset::add_count(const char* tipo, long i) +{ + CHECK(strlen(tipo) == 1, "Tipo record non valido"); + real* n = (real*)_contatori.objptr(tipo); + if (n == NULL) + { + n = new real; + _contatori.add(tipo, n); + } + *n += i; + return n->integer(); +} + +const TString& TTS_textset::rec_type(TRecnotype r) const +{ + const TString& t = TAS400_recordset::rec_type(r); + return t; +} + +bool TTS_textset::destroy(TRecnotype r) +{ + bool ok; + if (r >= 0) + { + const TString& t = TAS400_recordset::rec_type(r); // Igora subtipo record! + ok = TAS400_recordset::destroy(r); + + if (ok) + add_count(t, -1); + } + else + { + ok = TAS400_recordset::destroy(r); + if (ok) + _contatori.destroy(); + } + return ok; +} + +void TTS_textset::add_field(const char* trc, const char* name, int len, + char tipo, int from, const char* def) +{ + const bool required = false; + CHECK(trc && *trc, "Tracciato nullo"); + TString80 fname; fname << trc << '.' << name; + + const TFieldtypes t = tipo == 'n' ? _longzerofld : _alfafld; + const int pos = from - 1; + if (def && *def) + { + CHECKS(def == NULL || (int)strlen(def) <= len, "Invalid default value ", def); + TVariant var(def); var.convert_to(t); + create_field(fname, pos, len, t, required, var); + } + else + create_field(fname, pos, len, t, required); +} + +bool TTS_textset::set(const char* field, const TVariant& var) +{ + const char* err = NULL; + int c = -1; + const TAS400_column_info* info = parse_field(field, c, false); + bool ok = info != NULL; + if (ok) + { + switch (var.type()) + { + case _datefld: + if (var.is_zero()) + ok = set_field(*info, NULL_VARIANT); + else + { + long ansi = 0; + const TDate d = var.as_date(); + if (info->_width == 6) + ansi = d.day()*10000 + d.month()*100 + d.year()%100; + else + ansi = d.date2ansi(); + ok = set_field(*info, TVariant(ansi)); + } + break; + case _realfld: + if (var.is_zero()) + ok = set_field(*info, NULL_VARIANT); + else + { + real v = var.as_real(); v *= CENTO; + ok = set_field(*info, TVariant(v.integer())); + } + break; + default: + ok = set_field(*info, var); + break; + } + if (!ok) + err = TR("Campo obbligatorio non compilato"); + } + else + err = TR("Campo non riconosciuto"); + + if (err != NULL) + { + TString msg; + msg << field << ": " << err; + app().log(2, msg); + } + return ok; +} + +TTS_textset::TTS_textset(const char* query) + : TAS400_recordset(TString("AS400(7001,1,6)\n") << query) +{ + const char an = 'a'; + const char n = 'n'; + const bool o = true; + const bool f = false; + + add_field("0", "TRF-DITTA", 5, n, 1); // codice ditta multi + add_field("0", "TRF-VERSIONE", 1, n, 6, "3"); // versione + add_field("0", "TRF-TARC", 1, n, 7, "0"); // tipo record + + // dati cliente/fornitore + add_field("0", "TRF-COD-CLIFOR", 5, n, 8, "0"); // codice cliente/fornitore + add_field("0", "TRF-RASO", 32, an, 13); // ragione sociale + add_field("0", "TRF-IND", 30, an, 45); // indirizzo + add_field("0", "TRF-CAP", 5, n, 75); // cap + add_field("0", "TRF-CITTA", 25, an, 80); // citta + add_field("0", "TRF-PROV", 2, an, 105); // provincia + add_field("0", "TRF-COFI", 16, an, 107); // codice fiscale + add_field("0", "TRF-PIVA", 11, an, 123); // partita iva + add_field("0", "TRF-PF", 1, an, 134); // persona fisica S/N + add_field("0", "TRF-DIVIDE", 2, n, 135); // posizione spazio tra cognome e nome + add_field("0", "TRF-PAESE", 4, n, 137); // paese estero di residenza + add_field("0", "TRF-PIVA-ESTERO",12, an, 141); // partita iva estera + add_field("0", "TRF-COFI-ESTERO",20, an, 153); // codice fiscale estero + add_field("0", "TRF-SESSO", 1, an, 173); // sesso M/F + add_field("0", "TRF-DTNAS", 8, n, 174); // data di nascita + add_field("0", "TRF-COMNA", 25, an, 182); // comune di nascita + add_field("0", "TRF-PRVNA", 2, an, 207); // provincia di nascita + add_field("0", "TRF-PREF", 4, an, 209); // prefisso telefonico + add_field("0", "TRF-NTELENUM", 20, an, 213); // numero telefonico + add_field("0", "TRF-FAX-PREF", 4, an, 233); // prefisso fax + add_field("0", "TRF-FAX-NUM", 9, an, 237); // numero fax + add_field("0", "TRF-CFCONTO", 7, n, 246); // codice conto di costo abituale + add_field("0", "TRF-CFCODPAG", 4, n, 253); // codice condizioni pagamenti + add_field("0", "TRF-CFBANCA", 5, n, 257); // codice abi + add_field("0", "TRF-CFAGENZIA", 5, n, 262); // codice cab + add_field("0", "TRF-CFINTERM", 1, n, 267); // codice intermerdio clienti/fornitori + + // dati fattura + add_field("0", "TRF-CAUSALE", 3, n, 268); // codice causale movimento + add_field("0", "TRF-CAU-DES", 15, an, 271); // descrizione causale + add_field("0", "TRF-CAU-AGG", 18, an, 286); // causale aggiuntiva + add_field("0", "TRF-CAU-AGG-1", 34, an, 304); // ulteriore causale aggiuntiva + add_field("0", "TRF-CAU-AGG-2", 34, an, 338); // ulteriore causale aggiuntiva + add_field("0", "TRF-DATA-REGISTRAZIONE", 8, n, 372); // data registrazione + add_field("0", "TRF-DATA-DOC", 8, n, 380); // data documento + add_field("0", "TRF-NUM-DOC-FOR", 8, n, 388); // numero documento fornitore compreso sezionale + add_field("0", "TRF-NDOC", 5, n, 396); // numero documento + add_field("0", "TRF-SERIE", 2, n, 401); // sezionale iva + add_field("0", "TRF-EC-PARTITA", 6, n, 403); // estratto conto numero partita + add_field("0", "TRF-EC-PARTITA-ANNO", 4, n, 409); // estratto conto anno partita + add_field("0", "TRF-EC-COD-VAL", 3, n, 413); // estratto conto in valuta codice valuta esetera + add_field("0", "TRF-EC-CAMBIO", 13, n, 416); // estratto conto in valuta cambio valuta estera + add_field("0", "TRF-EC-DATA-CAMBIO", 8, n, 429); // estratto conto in valuta data cambio + add_field("0", "TRF-EC-TOT-DOC-VAL", 16, n, 437); // estratto conto in valuta totale documento in valuta + add_field("0", "TRF-EC-TOT-IVA-VAL", 16, n, 453); // estratto conto in valuta totale iva in valuta + add_field("0", "TRF-PLAFOND", 6, n, 469); // mmaaaa riferimento plafond e fatture differite + + TString80 field; + // dati iva + for (int i=0; i<8; i++) + { + field.format("TRF-IMPONIB_%d", i); + add_field("0", field, 12, n, 475+(31*i)); // imponibile + field.format("TRF-ALIQ_%d", i); + add_field("0", field, 3, n, 487+(31*i)); // aliquota iva o codice esenzione + field.format("TRF-ALIQ_AGRICOLA_%d", i); + add_field("0", field, 3, n, 490+(31*i)); // aliquota iva di compensazione agricola + field.format("TRF-IVA11_%d", i); + add_field("0", field, 2, n, 493+(31*i)); // codice di memorizzazione per iva11 + field.format("TRF-IMPOSTA_%d", i); + add_field("0", field, 11, n, 495+(31*i)); // imposta + } + + // totale fattura + add_field("0", "TRF-TOT-FATT", 12, n, 723); // totale fattura + + // conti di ricavo/costo + for (i=0; i<8; i++) + { + field.format("TRF-CONTORIC_%d", i); + add_field("0", field, 7, n, 735+(19*i)); // codice conto di ricavo/costo + field.format("TRF-IMP-RIC_%d", i); + add_field("0", field, 12, n, 742+(19*i)); // importo ricavo/costo + } + + // dati eventuale pagamentofattura o movimenti diversi + add_field("0", "TRF-CAU-PAGAM", 3, n, 887); // codice causale + add_field("0", "TRF-CAU-DES-PAGAM", 15, an, 890); // descrizione causale + add_field("0", "TRF-CAU-AGG-1-PAGAM", 34, an, 905); // ulteriore descrizione aggiuntiva + add_field("0", "TRF-CAU-AGG-2-PAGAM", 34, an, 939); // ulteriore descrizione aggiuntiva + + // altri movimenti + for (i=0; i<80; i++) + { + field.format("TRF-CONTO_%d", i); + add_field("0", field, 7, n, 973+(64*i)); // codice conto + field.format("TRF-DA_%d", i); + add_field("0", field, 1, an, 980+(64*i)); // segno operazione D/A + field.format("TRF-IMPORTO_%d", i); + add_field("0", field, 12, n, 981+(64*i)); // importo + field.format("TRF-CAU-AGGIUNT_%d", i); + add_field("0", field, 18, an, 993+(64*i)); // causale aggiuntiva + field.format("TRF-EC-PARTITA-PAG_%d", i); + add_field("0", field, 6, n, 1011+(64*i)); // estratto conto numero partita + field.format("TRF-EC-PARTITA-ANNO-PAG_%d", i); + add_field("0", field, 4, n, 1017+(64*i)); // estratto conto anno partita + field.format("TRF-EC-IMP-VAL_%d", i); + add_field("0", field, 16, n, 1021+(64*i)); // estratto conto in valuta + } + + // ratei e risconti + for (i=0; i<10; i++) + { + field.format("TRF-RIFER-TAB_%d", i); + add_field("0", field, 1, an, 6093+(19*i)); // tabella di riferimento + field.format("TRF-IND-RIGA_%d", i); + add_field("0", field, 2, n, 6094+(19*i)); // indice della tabella + field.format("TRF-DT-INI_%d", i); + add_field("0", field, 8, n, 6096+(19*i)); // data inizio + field.format("TRF-DT-INI_%d", i); + add_field("0", field, 8, n, 6104+(19*i)); // data fine + } + + // ndoc a 6 cifre se non bastano le 5 di tf-ndoc + add_field("0", "TRF-DOC6", 6, n, 6283); // ndoc a 6 cifre se non bastano le 5 di trf-doc + + // ulteriori dati cliente/fornitore + add_field("0", "TRF-AN-OMONIMI", 1, an, 6289); // considera omonimo + add_field("0", "TRF-AN-TIPO-SOGG", 1, n, 6290); // tipo soggetto ritenuta di acconto + + // ulteriori dati ev. pagamento o movimenti diversi + for (i=0; i<80; i++) + { + field.format("TRF-EC-PARTITA-SEZ-PAG_%d", i); + add_field("0", field, 2, n, 6291+(2*i)); // numero sezionale partita estratto conto + } + // ulteriori dati gestione professionista per eventuale pagamento fattura o dati fattura + add_field("0", "TRF-NUM-DOC-PAG-PROF", 7, n, 6451); // numero doc. incasso/pagamento + add_field("0", "TRF-DATA-DOC-PAG-PROF", 8, n, 6458); // data doc. incasso/pagamento + add_field("0", "TRF-RIT-ACC", 12, n, 6466); // ritenuta d'acconto + add_field("0", "TRF-RIT-PREV", 12, n, 6478); // ritenuta previdenziale + add_field("0", "TRF-RIT-1", 12, n, 6490); // altre ritenute 1 + add_field("0", "TRF-RIT-2", 12, n, 6502); // 2 + add_field("0", "TRF-RIT-3", 12, n, 6514); // 3 + add_field("0", "TRF-RIT-4", 12, n, 6526); // 4 + + // ulteriori dati per unita' produttive ricavi + for (i=0; i<8; i++) + { + field.format("TRF-UNITA-RICAVI_%d", i); + add_field("0", field, 2, n, 6538+(2*i)); // + } + // ulteriori dati per unita' produttive pagamenti + for (i=0; i<80; i++) + { + field.format("TRF-UNITA-PAGAM_%d", i); + add_field("0", field, 2, n, 6554+(2*i)); // + } + + // ulteriori dati cliente/fornitore + add_field("0", "TRF-FAX-PREF-1", 4, an, 6714); // prefisso fax sostitutivo + add_field("0", "TRF-FAX-NUM-1", 20, an, 6718); // numero fax sositutivo + add_field("0", "TRF-SOLO-CLIFOR", 1, an, 6738); // C crea solo cliente F crea solo fornitore (non genera primanota) + add_field("0", "TRF-80-SEGUENTE", 1, an, 6739); // s=record successivo identico a quello attuale ma con tabella pag compilata (ultima=u) + + // ulteriori dati gestione professionista per eventuale pagamento fattura o dati fattura + add_field("0", "TRF-CONTO-RIT-ACC", 7, n, 6740); // conto ritenuta d'acconto + add_field("0", "TRF-CONTO-RIT-PREV", 7, n, 6747); // conto ritenuta previdenziale + add_field("0", "TRF-CONTO-RIT-1", 7, n, 6754); // conto ritenuta 1 + add_field("0", "TRF-CONTO-RIT-2", 7, n, 6761); // conto ritenuta 2 + add_field("0", "TRF-CONTO-RIT-3", 7, n, 6768); // conto ritenuta 3 + add_field("0", "TRF-CONTO-RIT-4", 7, n, 6775); // conto ritenuta 4 + add_field("0", "TRF-DIFFERIMENTO-IVA", 1, an, 6782); // differimento registrazione iva per autotrasportatori S/N + add_field("0", "TRF-STORICO", 1, an, 6783); // aggiornamento storico anagrafica + add_field("0", "TRF-STORICO-DATA", 8, n, 6784); // data aggiornamento storico anagrafica + add_field("0", "TRF-CAUS-ORI", 3, n, 6792); // causale originaria + add_field("0", "TRF-PREV-TIPOMOV", 1, an, 6795); // previsionale + add_field("0", "TRF-PREV-RATRIS", 1, an, 6796); // rateo /risconto + add_field("0", "TRF-PREV-DTCOMP-INI", 8, n, 6797); // data iniziale competenza + add_field("0", "TRF-PREV-DTCOMP-FIN", 8, n, 6805); // data finale competenza + add_field("0", "TRF-PREV-FLAG-CONT", 1, an, 6813); // non contabilizza + add_field("0", "TRF-PREV-RIFERIMENTO",20, an, 6814); // riferimento record interno + add_field("0", "FILLER", 166, an, 6834); // spazio + add_field("0", "FINE-RECORD", 2, an, 7000, "\r\n"); // terminatore record +} + +/////////////////////////////////////////////////////////// +// TTS_mask +/////////////////////////////////////////////////////////// + +class TTS_mask : public TAutomask +{ + clock_t _next_update; + bool _updating; + +private: + bool apply_filter(const TRecordset& righe) const; + void serialize(bool bSave); + +protected: + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + +public: + TTS_mask(); + ~TTS_mask(); +}; + +bool TTS_mask::apply_filter(const TRecordset& righe) const +{ + const TDate dal = get(F_DATA_DA); + const TDate al = get(F_DATA_AL); + if (dal.ok() || al.ok()) + { + const TDate scad = righe.get("DATASCAD").as_date(); + if ((dal.ok() && scad < dal) || (al.ok() && scad > al)) + return false; + } + return true; +} + +bool TTS_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + bool ok = true; + switch (o.dlg()) + { + case F_DATA_DA: + case F_DATA_AL: + break; + default: + break; + } + return ok; +} + +void TTS_mask::serialize(bool bSave) +{ + const char* defpar = "tc"; + TConfig ini(CONFIG_DITTA, defpar); + for (int i = fields()-1; i >= 0; i--) + { + TMask_field& f = fld(i); + const TFieldref* fr = f.field(); + if (fr != NULL) + { + if (bSave) + fr->write(ini, defpar, f.get()); + else + f.set(fr->read(ini, defpar)); + } + } +} + +TTS_mask::TTS_mask() + : TAutomask("tc0700a"), _updating(false), _next_update(0) +{ + serialize(false); +} + +TTS_mask::~TTS_mask() +{ + serialize(true); +} + +/////////////////////////////////////////////////////////// +// TTS_sender +/////////////////////////////////////////////////////////// + +void TTS_sender::log(int sev, const char* msg) +{ + if (sev > 0) + { + TString m; + m << TR("Record") << ' ' << _tsfile->rec_type() << ": " << msg; + _log->log(sev, m); + _errors_logged = true; + } + else + _log->log(sev, msg); +} + +void TTS_sender::set(const char* field, const TVariant& var) +{ + _tsfile->set(field, var); +} + +const TVariant& TTS_sender::get(const char* field) +{ + return _tsfile->get(field); +} + + +void TTS_sender::remove_last() +{ + _tsfile->destroy(_tsfile->last()); + _tsfile->move_last(); +} + +void TTS_sender::add_ulteriori(const TRecordset& mov) +{ +} + +void TTS_sender::add_ratei_risconti(const TRecordset& mov) +{ +} + +void TTS_sender::add_new_rec(const TRecordset& mov, char tipocf, long codcf) +{ + if (codcf > 0 && get("TRF-RASO").as_string().blank()) + add_clifor(tipocf, codcf); + set("TRF-80-SEGUENTE", "S"); + if (new_rec("0")) + { + add_header(mov, false); + set("TRF-80-SEGUENTE", "U"); + } +} + +void TTS_sender::add_diversi(const TRecordset& mov, const bool moviva) +{ + const bool dont_send_clifo = _riclassifica.is_key("TSNOHCLI"); + TRecordset & rmov = rmovrecset(mov); + int i = 0 , j = 0; + bool added_rec = false, valid_rec = false, as400 = false; + bool first_cli = true; + TString80 field; + TString16 key; + + for (bool ok = rmov.move_first(); ok; ok = rmov.move_next(), i++) + { + const int gr = rmov.get(RMV_GRUPPO).as_int(); + const int co = rmov.get(RMV_CONTO).as_int(); + const long so = rmov.get(RMV_SOTTOCONTO).as_int(); + char t = rmov.get(RMV_TIPOC).as_string()[0]; + bool one_clifor =(dont_send_clifo && t > ' '); + const long contoricl = bill2ricl(t, gr, co, so, one_clifor); + bool add_rec = (j >= 80) || (dont_send_clifo && t > ' '); + + if (moviva) + { + const char tiporiga = rmov.get(RMV_ROWTYPE).as_string()[0]; + + switch (tiporiga) + { + case 'T': + case 'I': + case 'D': + case 'N': + continue; + case 'F': + case 'S': + break; + default: + if (i == 0 && _send_cg && tiporiga <= ' ') + as400 = true; + if (!as400) + { + key.format("%08ld", contoricl); + if (_contiiva.is_key(key)) + continue; + if (_iva.is_key(key)) + { + const char sez = rmov.get(RMV_SEZIONE).as_string()[0]; + const bool vendite = mov.get(MOV_TIPO).as_string()[0] != 'F'; + + if (vendite) + { + if (sez == 'A') + continue; + } + else + { + if (sez == 'D') + continue; + } + } + } + break; + } + } + if (add_rec) + { + if (!first_cli) + { + add_new_rec(mov, t, so); + j = 0; + added_rec = true; + valid_rec = false; + } + first_cli = false; + } + field.format("TRF-CONTO_%d", j); + set(field, contoricl); + field.format("TRF-IMPORTO_%d", j); + set(field, rmov.get(RMV_IMPORTO)); + field.format("TRF-DA_%d", j); + set(field, rmov.get(RMV_SEZIONE)); + j++; + valid_rec = true; + + } + if (added_rec && !valid_rec) + { + remove_last(); + set("TRF-80-SEGUENTE", "U"); + } +} + +void TTS_sender::add_conti_ricavo_costo(const TRecordset& mov) +{ + if (_send_cg) + { + TRecordset & rmov = rmovrecset(mov); + + rmov.move_first(); + if (rmov.get(RMV_ROWTYPE).as_string()[0] <= ' ') + return; + } + + TRecordset & riva = rivarecset(mov); + TString codice = scod2ricl("TSREG", mov.get(MOV_REG)); + const bool corrispettivo = codice[0] == 'C'; + int i = 0, j = 0; + real fattore = UNO; + TString16 key; + + if (test_swap(mov)) + fattore = -fattore; + _iva.destroy(); + for (bool ok = riva.move_first(); ok; ok = riva.move_next(), i++) + { + const int gr = riva.get(RMI_GRUPPO).as_int(); + const int co = riva.get(RMI_CONTO).as_int(); + const long so = riva.get(RMI_SOTTOCONTO).as_int(); + char t = riva.get(RMI_TIPOC).as_string()[0]; + const long hcli = movrecset().get(MOV_CODCF).as_int(); + const long contoricl = bill2ricl(t, gr, co, so, hcli == so); + + real imponibile = riva.get(RMI_IMPONIBILE).as_real() * fattore; + + if (corrispettivo) + { + if (riva.get(RMI_IMPOSTA).as_real() == ZERO) + { + TCodiceIVA c(riva.get(RMI_CODIVA).as_string()); + + c.scorpora(imponibile); + } + } + else + { + const bool indetraibile = riva.get(RMI_TIPODET).as_int() > '0'; //da modificare nella 3.1 + + if (indetraibile) + imponibile += riva.get(RMI_IMPOSTA).as_real() * fattore; + } + key.format("%08ld", contoricl); + TIVA_item * item = (TIVA_item *) _iva.objptr(key); + + if (item == NULL) + { + item = new TIVA_item(j++, contoricl, 0L, 0L); + _iva.add(key, item); + } + item->imponibile() += imponibile; + } + + TString80 field; + + if (_iva.items() > 8) + log(2, TR("Registrazione con piuą di 8 conti di costo/ricavo")); + + + FOR_EACH_ASSOC_OBJECT(_iva, o, k, it) + { + TIVA_item & item = (TIVA_item &) *it; + const int row = item.row(); + + if (row < 8) + { + field.format("TRF-CONTORIC_%d", row); + set(field, item.conto()); + field.format("TRF-IMP-RIC_%d", row); + set(field, item.imponibile()); + } + } +} + +bool TTS_sender::test_swap(const TRecordset& mov) +{ + TRecordset & rmov = rmovrecset(mov); + + rmov.move_first(); + + const char sez = rmov.get(RMV_SEZIONE).as_string()[0]; + const bool vendite = mov.get(MOV_TIPO).as_string()[0] != 'F'; + + const bool s = vendite ^ (sez == 'D'); + return s; +} + +void TTS_sender::add_tot_fattura(const TRecordset& mov) +{ + real totdoc = mov.get(MOV_TOTDOC).as_real(); + + if (test_swap(mov)) + totdoc = -totdoc; + set("TRF-TOT-FATT", totdoc); +} + +void TTS_sender::add_datiiva(const TRecordset& mov) +{ + TRecordset & rmoviva = rivarecset(mov); + TString codice = scod2ricl("TSREG", mov.get(MOV_REG)); + const bool corrispettivo = codice[0] == 'C'; + int i = 0, j = 0; + real fattore = UNO; + TString16 key; + + if (test_swap(mov)) + fattore = -fattore; + _iva.destroy(); + for (bool ok = rmoviva.move_first(); ok; ok = rmoviva.move_next(), i++) + { + real imponibile = rmoviva.get(RMI_IMPONIBILE).as_real() * fattore; + real imposta = rmoviva.get(RMI_IMPOSTA).as_real() * fattore; + + if (corrispettivo) + { + if (imposta == ZERO) + { + TCodiceIVA c(rmoviva.get(RMI_CODIVA).as_string()); + + imposta = c.scorpora(imponibile); + } + } + long codiva = cod2ricl("TSIVA", rmoviva.get(RMI_CODIVA)); + long codiva11 = 0L; + const bool indetraibile = rmoviva.get(RMI_TIPODET).as_int() > '0'; //da modificare nella 3.1 + + if (indetraibile) + codiva += TSMAIALCONST; // maialata + if (rmoviva.get(RMI_TIPOCR).as_int() > 0) + codiva11 = cod2ricl("TSI11", rmoviva.get(RMI_TIPOCR)); + key.format("%04ld%04ld", codiva, codiva11); + TIVA_item * item = (TIVA_item *) _iva.objptr(key); + + if (item == NULL) + { + item = new TIVA_item(j++, 0L, codiva, codiva11); + _iva.add(key, item); + } + item->imponibile() += imponibile; + item->imposta() += imposta; + } + + TString80 field; + + if (_iva.items() > 8) + log(2, TR("Registrazione con piu di 8 righe IVA")); + + + FOR_EACH_ASSOC_OBJECT(_iva, o, k, it) + { + TIVA_item & item = (TIVA_item &) *it; + const int row = item.row(); + + if (row < 8) + { + field.format("TRF-IMPONIB_%d", row); + set(field, item.imponibile()); + field.format("TRF-ALIQ_%d", row); + set(field, item.codiva()); + field.format("TRF-ALIQ_AGRICOLA_%d", row); + //set(field,field // dato non presente CHIEDERE + field.format("TRF-IVA11_%d", row); + set(field, item.codiva11()); + field.format("TRF-IMPOSTA_%d", row); + set(field, item.imposta()); + } + } +} + +void TTS_sender::add_header(const TRecordset& mov, const bool fullhesd) +{ + const bool moviva = !mov.get(MOV_REG).is_empty(); + const long codcaus = cod2ricl("TSCAU", mov.get(MOV_CODCAUS)); + + // dati obbligatori + set("TRF-DITTA", _dittamulti); + set("TRF-CAUSALE", codcaus); + TString descaus(decode_causale(mov)); + set("TRF-CAU-DES", descaus.left(15)); + + const TDate datareg(mov.get(MOV_DATAREG).as_string()); + + set("TRF-DATA-REGISTRAZIONE", datareg.string(full, '\0')); + + const TDate datadoc( mov.get(MOV_DATADOC).as_string()); + + set("TRF-DATA-DOC", datadoc.string(full, '\0')); + + TString numdoc(mov.get(MOV_NUMDOC).as_string()); + TString codice = moviva ? scod2ricl("TSREG", mov.get(MOV_REG)) : EMPTY_STRING; + + numdoc.left(6); + if (numdoc.full()) + numdoc << codice.mid(1); + set("TRF-NUM-DOC-FOR", numdoc); + set("TRF-NDOC", mov.get(MOV_PROTIVA)); + const bool send_clifo = !_riclassifica.is_key("TSNOHCLI"); + + if (send_clifo) + set("TRF-COD-CLIFOR", mov.get(MOV_CODCF)); + + if (moviva) + { + const long codreg = atol(codice.mid(1)); + + set("TRF-SERIE", codreg); + } +} + +void TTS_sender::get_citta_provincia(const TRecordset& cli, TString & dencom, TString & provcom, bool nascita) +{ + TString16 key; + + if (nascita) + { + key << cli.get(CLI_STATONASC); + key << '|' << cli.get(CLI_COMNASC); + } + else + { + key << cli.get(CLI_STATOCF); + key << '|' << cli.get(CLI_COMCF); + } + + const TRectype& com = cache().get(LF_COMUNI, key); + + dencom.cut(0); + if (!nascita) + dencom << cli.get(CLI_LOCCF) << " "; + dencom << com.get(COM_DENCOM); + dencom.trim(); + provcom = com.get(COM_PROVCOM); +} + +const char * TTS_sender::decode_causale(const TRecordset& mov) +{ + const TRectype& caus = cache().get(LF_CAUSALI, mov.get(MOV_CODCAUS).as_string()); + + return caus.get(CAU_DESCR); +} + +void TTS_sender::add_clifor(char tipocf, long codcf) +{ + // dati clienti/fornitore + if (codcf != 0) + { + TRecordset & cli = clirecset(tipocf, codcf); + const char tipocf = cli.get(CLI_TIPOCF).as_string()[0]; + TString80 indirizzo; + + indirizzo << cli.get(CLI_INDCF) << ' ' + << cli.get(CLI_CIVCF) << ' ' + << cli.get(CLI_LOCCF); + TString ragsoc(cli.get(CLI_RAGSOC).as_string()); + const char tipopers = cli.get(CLI_TIPOPERS).as_string()[0]; + const bool fisica = tipopers=='F'; + int divide = 0; + + if (fisica) + { + TString80 r1(ragsoc.left(30)); + TString80 r2(ragsoc.mid(30)); + + r1.trim(); + r2.trim(); + ragsoc = r1; + divide = ragsoc.len() + 1; + ragsoc << " " << r2; + } + + set("TRF-RASO", ragsoc); + set("TRF-IND", indirizzo); + set("TRF-CAP", cli.get(CLI_CAPCF)); + + TString dencom; + TString4 provcom; + get_citta_provincia(cli, dencom, provcom); + + set("TRF-CITTA", dencom.left(80)); + set("TRF-PROV", provcom); + + set("TRF-COFI", cli.get(CLI_COFI)); + set("TRF-PIVA", cli.get(CLI_PAIV)); + + set("TRF-PF", fisica ? "S" : "N"); + + set("TRF-DIVIDE", divide); + const long stato = cod2ricl("TSNAZ", cli.get(CLI_STATOCF)); + set("TRF-PAESE", stato); + + //set("TRF-PIVA-ESTERO",); // partita iva estera + //set("TRF-COFI-ESTERO",); // codice fiscale estero + + if (fisica) + { + //set("TRF-SESSO",); // sesso M/F + const TDate dnasc(cli.get(CLI_DATANASC).as_string()); + + set("TRF-DTNAS", dnasc.string(full, '\0')); + + get_citta_provincia(cli, dencom, provcom, true); + + set("TRF-COMNA", dencom.left(80)); + set("TRF-PRVNA", provcom); + } + set("TRF-PREF", cli.get(CLI_PTEL)); + set("TRF-NTELENUM", cli.get(CLI_TEL)); + set("TRF-FAX-PREF", cli.get(CLI_PFAX)); + set("TRF-FAX-NUM", cli.get(CLI_FAX)); + + if (tipocf == 'F') + { + const int gr = cli.get(CLI_GRUPPORIC).as_int(); + const int co = cli.get(CLI_CONTORIC).as_int(); + const int so = cli.get(CLI_SOTTOCRIC).as_int(); + + char t = tipocf; + const long contoricl = bill2ricl(t, gr, co, so); + + set("TRF-CFCONTO", contoricl); + } + + const long codpag = cod2ricl("TSCDP", cli.get(CLI_CODPAG)); + set("TRF-CFCODPAG", codpag); + + set("TRF-CFBANCA", cli.get(CLI_CODABI)); + set("TRF-CFAGENZIA", cli.get(CLI_CODCAB)); + } +} + +void TTS_sender::add_mov(const TRecordset& mov) +{ + TString msg; msg << TR("Registrazione n.") << ' ' << mov.get(MOV_NUMREG); + log(0, msg); + if (new_rec("0")) + { + char tipocf = mov.get(MOV_TIPO).as_string()[0]; + long codcf = mov.get(MOV_CODCF).as_int(); + + add_clifor(tipocf, codcf); + add_header(mov); + + const bool moviva = !mov.get(MOV_REG).is_empty(); + + if (moviva) + { + add_datiiva(mov); + add_tot_fattura(mov); + add_conti_ricavo_costo(mov); + } + add_ratei_risconti(mov); // Non ce li abbiamo micca! + add_ulteriori(mov); + add_diversi(mov, moviva); + } +} + +const long TTS_sender::bill2ricl(char & t, int gr, int co, long so, const bool header_cli) +{ + long codricl = 0; + if (gr > 0) + { + const char* const tiporic = "TSCONTI"; + const bool ricl = _riclassifica.is_key(tiporic); + + if (ricl) + { + TToken_string cod; + cod.add(tiporic); + cod.add(gr); + cod.add(co); + if (t <= ' ') + cod.add(so); + + // Provo il sottoconto ma se non riesco provo con conto e poi anche gruppo + for (int c = 3; c > 0 && codricl <= 0; c--) + { + codricl = atol(_conti->get(cod, "CODICE")); + cod.add(0, c); + } + if (codricl <= 0) + { + TString msg; + msg << TR("Conto") << " " << gr << " " << co << " " << so << " :" << TR("Non presente in tabella"); + log(2, msg); + } + else + { + if (codricl % 10000 > 0) + t = ' '; + if (t > ' ') + { + if (header_cli) + { + if (t == 'C') + codricl = 9999999L; + else + codricl = 9999998L; + } + else + codricl += so; + } + } + } + else + codricl = gr*100000+co*1000+so; + } + return codricl; +} + +const TString & TTS_sender::scod2ricl(const char* tab, const TString& cod) +{ + TString & codricl = get_tmp_string(); + if (cod.full()) + { + const bool ricl = _riclassifica.is_key(tab); + const char* err = NULL; + if (ricl) + { + codricl = _tabelle->sdecode(tab, cod); + if (codricl.blank()) + err = TR("Non presente in tabella"); + } + else + codricl = cod; + if (err) + { + TString msg; + msg << TR("Codice") << " " << cod << " " << TR("Tabella") << " " << tab << " :" << err; + log(2, msg); + } + } + return codricl; +} + +const TString & TTS_sender::scod2ricl(const char* tab, const TVariant& cod) +{ + return scod2ricl(tab, cod.as_string()); +} + +const long TTS_sender::cod2ricl(const char* tab, const TString& cod) +{ + long codricl = 0; + if (cod.full()) + { + const bool ricl = _riclassifica.is_key(tab); + const char* err = NULL; + if (ricl) + { + codricl = _tabelle->decode(tab, cod); + if (codricl <= 0) + err = TR("Non presente in tabella"); + } + else + { + if (real::is_natural(cod)) + codricl = atol(cod); + else + err = TR("Non e' un codice numerico"); + } + if (err) + { + TString msg; + msg << TR("Codice") << " " << cod << " " << TR("Tabella") << " " << tab << " :" << err; + log(2, msg); + } + } + return codricl; +} + +const long TTS_sender::cod2ricl(const char* tab, const TVariant& cod) +{ + return cod2ricl(tab, cod.as_string()); +} + +void TTS_sender::update_parameters(const TDate & d) +{ + if (yesno_box(TR("Confermare il traferimento"))) + { + TConfig configtc(CONFIG_DITTA); + TRecordset & mov = movrecset(); + + configtc.set("TSULTINV", d); + + if (mov.items() > 0L) + { + TProgind pi(mov.items(), TR("Conferma movimenti"), true, true); + TLocalisamfile cgmov(LF_MOV); + + for (bool ok = mov.move_first(); ok; ok = mov.move_next()) + { + if (!pi.addstatus(1)) + break; + + const long numreg = mov.get(MOV_NUMREG).as_int(); + + cgmov.put(MOV_NUMREG, numreg); + if (cgmov.read(_isequal, _lock) == NOERR) + { + cgmov.put(MOV_INVIATO, true); + cgmov.rewrite(); + } + } + } + } +} + +void TTS_sender::set_parameters() +{ + TConfig configtc(CONFIG_DITTA); + const TDate d(configtc.get("TSULTINV")); + + _from = d; + _dittamulti = configtc.get("TSDitta"); + _send_cg = configtc.get_bool("TSSENDCG"); + + TAssoc_array& tab = configtc.list_variables(); + + + FOR_EACH_ASSOC_STRING(tab, h, k, v) + { + TString16 var(k); + + if (var.starts_with("TSR")) + { + const bool ric = (*v > ' ') && strchr("1SXY", *v) != NULL; + + if (ric) + { + var.format("TS%s", (const char *)var.mid(3)); + _riclassifica.add(var, NULL); + } + } + } + bool go_on = true; + + for (int i = 0; go_on; i++) + { + int gr = configtc.get_int("TSGIVA", NULL, i); + if (gr == 0) + go_on = false; + else + { + int co = configtc.get_int("TSCIVA", NULL, i); + long so = configtc.get_long("TSSIVA", NULL, i); + char t = ' '; + + long contoricl = bill2ricl(t, gr, co, so); + TString16 key; key.format("%08ld", contoricl); + _contiiva.add(key, NULL); + } + } + +} + +bool TTS_sender::create() +{ + _tabelle = new TRiclassifica_cache; + _conti = new TRecord_cache(LF_RICLPDC, 3); + set_parameters(); + return TSkeleton_application::create(); +} + +bool TTS_sender::destroy() +{ + delete _conti; + delete _tabelle; + return TSkeleton_application::destroy(); +} + +TRecordset & TTS_sender::movrecset(const TDate & from, const TDate & to) +{ + TRecordset * mov = (TRecordset *) _recsets.objptr(LF_MOV); + + if (mov == NULL) + { + TString query = "USE MOV KEY 2 SELECT INVIATO!=\"X\""; + + query << "\nFROM DATAREG=#DATA_DA"; + query << "\nTO DATAREG=#DATA_AL"; + + _recsets.add(::create_recordset(query), LF_MOV); + mov = (TRecordset *) _recsets.objptr(LF_MOV); + } + if (from != eotime) + mov->set_var("#DATA_DA", TVariant(from)); + if (to != botime) + mov->set_var("#DATA_AL", TVariant(to)); + return *mov; +} + +TRecordset & TTS_sender::rmovrecset(const TRecordset & mov) +{ + TRecordset * rmov = (TRecordset *) _recsets.objptr(LF_RMOV); + + if (rmov == NULL) + { + _recsets.add(::create_recordset("USE RMOV\nFROM NUMREG=#NUMREG\nTO NUMREG=#NUMREG"), LF_RMOV); + rmov = (TRecordset *) _recsets.objptr(LF_RMOV); + } + + const TVariant & numreg = mov.get(MOV_NUMREG); + + if (numreg != rmov->get("#NUMREG")) + rmov->set_var("#NUMREG", numreg); + return *rmov; +} + +TRecordset & TTS_sender::rivarecset(const TRecordset & mov) +{ + TRecordset * rmoviva = (TRecordset *) _recsets.objptr(LF_RMOVIVA); + + if (rmoviva == NULL) + { + _recsets.add(::create_recordset("USE RMOVIVA\nFROM NUMREG=#NUMREG\nTO NUMREG=#NUMREG"), LF_RMOVIVA); + rmoviva = (TRecordset *) _recsets.objptr(LF_RMOVIVA); + } + + const TVariant & numreg = mov.get(MOV_NUMREG); + + if (numreg != rmoviva->get("#NUMREG")) + rmoviva->set_var("#NUMREG", numreg); + return *rmoviva; +} + +TRecordset & TTS_sender::clirecset(const char tipocf, const long codcf) +{ + TRecordset * clifo = (TRecordset *) _recsets.objptr(LF_CLIFO); + + if (clifo == NULL) + { + _recsets.add(::create_recordset("USE CLIFO\nFROM TIPOCF=#TIPOCF CODCF=#CODCF\nTO TIPOCF=#TIPOCF CODCF=#CODCF"), LF_CLIFO); + clifo = (TRecordset *) _recsets.objptr(LF_CLIFO); + } + TString4 w; w << tipocf; + TVariant t(w); + + clifo->set_var("#TIPOCF", t); + clifo->set_var("#CODCF", codcf); + return *clifo; +} + +void TTS_sender::main_loop() +{ + TTS_mask m; + TDate to(TODAY); + + to.addmonth(-1); + to.set_end_month(); + if (to <= _from) + { + to = _from; + to.addmonth(1); + to.set_end_month(); + } + m.set(F_DATA_DA, _from); + m.set(F_DATA_AL, to); + while (m.run() != K_QUIT) + { + const char* const title = TR("Invio a TeamSystem"); + _tsfile = new TTS_textset; + _log = new TLog_report(title); + _errors_logged = false; + + TRecordset & mov = movrecset(m.get_date(F_DATA_DA), m.get_date(F_DATA_AL)); + TProgind pi(mov.items(), TR("Scansione movimenti"), true, true); + + for (bool ok = mov.move_first(); ok; ok = mov.move_next()) + { + if (!pi.addstatus(1)) + break; + add_mov(mov); + } + TReport_book book; + book.add(*_log); +#ifdef DBG + TAS400_report rep(*_tsfile); + book.add(rep); +#endif + book.preview(); + + bool save = true; + if (_errors_logged) + { + save = yesno_box(TR("Sono stati riscontrati uno o piu' errori:\n" + "Si desidera salvare il file ugualmente?")); + } + if (save) + { + TFilename name = m.get(F_PATH); + + name.add(m.get(F_FILE)); + _tsfile->save_as(name); + update_parameters(m.get_date(F_DATA_AL)); + } + + delete _log; + delete _tsfile; + } +} + +int tc0700(int argc, char* argv[]) +{ + TTS_sender app; + app.run(argc, argv, "Invio a TeamSystem"); + return 0; +} diff --git a/tc/tc0700a.h b/tc/tc0700a.h new file mode 100755 index 000000000..ffc643992 --- /dev/null +++ b/tc/tc0700a.h @@ -0,0 +1,10 @@ +// invio dati ad altra procedura (teamsystem) + +#define F_CODDITTA 101 +#define F_RAGSOC 102 +#define F_MOVIMENTI 103 +#define F_INTRASTAT 104 +#define F_PATH 105 +#define F_FILE 106 +#define F_DATA_DA 107 +#define F_DATA_AL 108 diff --git a/tc/tc0700a.uml b/tc/tc0700a.uml new file mode 100755 index 000000000..fc2b6fb91 --- /dev/null +++ b/tc/tc0700a.uml @@ -0,0 +1,78 @@ +#include "tc0700a.h" + +PAGE "Invio dati contabilita'" -1 -1 78 20 + +GROUPBOX DLG_NULL 76 3 +BEGIN + PROMPT 2 1 "@bDitta corrente" +END + +NUMBER F_CODDITTA 5 +BEGIN + PROMPT 3 2 "Codice " + FLAGS "FD" + USE LF_NDITTE + INPUT CODDITTA F_CODDITTA + OUTPUT F_RAGSOC RAGSOC + CHECKTYPE REQUIRED +END + +STRING F_RAGSOC 50 +BEGIN + PROMPT 23 2 "" + FLAGS "D" +END + +GROUPBOX DLG_NULL 76 4 +BEGIN + PROMPT 2 4 "Dati da inviare" +END + +BOOLEAN F_MOVIMENTI +BEGIN + PROMPT 3 5 "Movimenti contabili" +END + +BOOLEAN F_INTRASTAT +BEGIN + PROMPT 3 6 "Intrastat" +END + +STRING F_PATH 256 39 +BEGIN + PROMPT 2 8 "Cartella " + DSELECT + CHECKTYPE REQUIRED + FIELD TSDestPath +END + +STRING F_FILE 18 +BEGIN + PROMPT 54 8 "File " + FIELD TSDestFile +END + + +DATE F_DATA_DA +BEGIN + PROMPT 2 10 "Data iniz. " +END + +DATE F_DATA_AL +BEGIN + PROMPT 30 10 "Data fin. " +END + +BUTTON DLG_OK 9 2 +BEGIN + PROMPT -12 -1 "" +END + +BUTTON DLG_QUIT 9 2 +BEGIN + PROMPT -22 -1 "" +END + +ENDPAGE + +ENDMASK diff --git a/tc/tc0800.cpp b/tc/tc0800.cpp new file mode 100755 index 000000000..5e1342e6d --- /dev/null +++ b/tc/tc0800.cpp @@ -0,0 +1,201 @@ +// gestione files Contabilita' Analitica: CENTRI DI COSTO +#include +#include +#include + +#include "tc0800a.h" + +//////////////////////////////////////////////////////////////////////// +//MASCHERA +//////////////////////////////////////////////////////////////////////// +class TTS_ricl_msk : public TAutomask +{ + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly) { return true;} + +public: + TTS_ricl_msk() : TAutomask("tc0800a") {} +}; + + +class TTSRiclass_application : public TRelation_application + +// @author:(INTERNAL) Vari +// @access:(INTERNAL) Private Member +{ + // @cmember:(INTERNAL) Maschera corrente dell'applicazione + TMask* _msk; + // @cmember:(INTERNAL) Relazione corrente dell'applicazione + TRelation* _rel; + // @cmember:(INTERNAL) valori iniziale dei gruppo conto sottoconto + int _gruppo; + int _conto; + long _sottoconto; + +// @access Protected Member +protected: + virtual TMask* get_mask(int mode = MODE_QUERY) { CHECK(_msk, "Null mask"); return _msk; } + // @cmember Indica se la futura ritornera' una maschera diversa + // dalla corrente. + virtual bool changing_mask(int mode) { return false; } + // @cmember Ritorna la relazione da modificare + virtual TRelation* get_relation() const { CHECK(_rel, "Null relation"); return _rel; } + // @cmember Inizializza la maschera per il modo inserimento + virtual void init_insert_mode(TMask& m); + // @cmember Inizializza la maschera per il modo modifica + virtual void init_modify_mode(TMask& m); + // @cmember Inizializzazione dei dati dell'utente + virtual bool user_create() ; + // @cmember Distruzione dei dati dell'utente + virtual bool user_destroy() ; + // @cmember Chiama il programma di stampa + virtual void print(); + // @cmember Riscrive sulla relazione i valori dalla maschera

+ virtual int rewrite(const TMask& m); + +// @access Public Member +public: + virtual bool find(word key = 0); + + // @cmember Costruttore + TTSRiclass_application() : _msk(NULL), _rel(NULL) { } + + + // @cmember Distruttore + virtual ~TTSRiclass_application() {} +}; + + +void TTSRiclass_application::print() +{ + TFilename rep("tctsricl.rep"); + TString cmd; + + rep.custom_path(); + cmd << "ba8 -4 "<< rep; + TExternal_app stampa(cmd); + stampa.run(); +} + +bool TTSRiclass_application::find(word k) +{ + bool ok = TRelation_application::find(k); + + if (!ok && k < 2) + { + file().setkey(1); + file().zero(); + for (TEditable_field* e = get_mask()->get_key_field(1, true); e; e = get_mask()->get_key_field(1, false)) + { + if (e->shown() || e->ghost()) // Ignora campi invisibili non ghost + e->autosave(*get_relation()); + } + + TRectype rec(file().curr()); + + ok = file().read(_isgteq) == NOERR && file().curr() == rec; + } + + return ok; +} + +void TTSRiclass_application::init_insert_mode(TMask& m) +{ + TLocalisamfile ricl(LF_RICLPDC); + + ricl.put("TIPORIC", m.get(F_COD)); + TString codice(m.get(F_TSGRUPPO)); + + codice << m.get(F_TSCONTO); + codice << m.get(F_TSSOTTOCONTO); + ricl.put("CODICE", codice); + if (ricl.read(_isgteq) == NOERR && codice == ricl.get("CODICE")) + m.set(F_DESCRIZ, ricl.get("DESCRIZ")); + for (int i = m.fields() - 1; i >= 0; i--) + { + TMask_field& c = m.fld(i); + if (c.in_group(1) && c.is_edit()) + { + TEdit_field& e = (TEdit_field&)c; + + e.enable(); + if (e.browse() != NULL) + e.enable_check(); + } + } +} + +void TTSRiclass_application::init_modify_mode(TMask& m) +{ + for (int i = m.fields() - 1; i >= 0; i--) + { + TMask_field& c = m.fld(i); + if (c.in_group(1) && c.is_edit()) + { + TEdit_field& e = (TEdit_field&)c; + + e.enable(); + if (e.browse() != NULL) + e.enable_check(); + } + } + _gruppo = m.get_int(F_GRUPPO); + _conto = m.get_int(F_CONTO); + _sottoconto = m.get_long(F_SOTTOCONTO); +} + +int TTSRiclass_application::rewrite(const TMask& m) +{ + int err = TRelation_application::write(m); + + if (err == NOERR) + { + TRelation & rel = *get_relation(); + + rel.save_status(); + rel.lfile().put("GRUPPO", _gruppo); + rel.lfile().put("CONTO", _conto); + rel.lfile().put("SOTTOCONTO", _sottoconto); + rel.remove(); + rel.restore_status(); + } + return err; +} + +bool TTSRiclass_application::user_create() +{ + _rel = new TRelation(LF_RICLPDC); + _msk = new TTS_ricl_msk; + + set_search_field(F_TSSOTTOCONTO); + + TFilename rep("tctsricl.rep"); + + if (rep.custom_path()) + enable_menu_item(M_FILE_PRINT); + + TString title; + _msk->get_caption(title); + set_title(title); + return true; +} + +bool TTSRiclass_application::user_destroy() +{ + if (_msk) + delete _msk; + if (_rel) + delete _rel; + + return true; +} + + + +int tc0800(int argc, char* argv[]) +{ + TTSRiclass_application a; + + a.run(argc, argv, TR("Riclassificazione piano dei conto Team System")); + return 0; +} + diff --git a/tc/tc0800a.h b/tc/tc0800a.h new file mode 100755 index 000000000..83ae72d1e --- /dev/null +++ b/tc/tc0800a.h @@ -0,0 +1,13 @@ +//id campi maschera tc0800a (file piano dei conti Team System) +//campi normali +#define F_COD 101 +#define F_TSGRUPPO 102 +#define F_TSCONTO 103 +#define F_TSSOTTOCONTO 104 +#define F_DESCRIZ 105 +#define F_GRUPPO 106 +#define F_CONTO 107 +#define F_SOTTOCONTO 108 +#define F_DESCG 109 +#define F_DESCC 110 +#define F_DESC 111 diff --git a/tc/tc0800a.uml b/tc/tc0800a.uml new file mode 100755 index 000000000..836774eea --- /dev/null +++ b/tc/tc0800a.uml @@ -0,0 +1,180 @@ +#include "tc0800a.h" + +TOOLBAR "" 0 -2 0 2 +#include +ENDPAGE + +PAGE "" -1 -1 64 6 + +LIST F_COD 7 +BEGIN + PROMPT 1 1 "" + ITEM "TSCONTI|TSCONTI" + FIELD TIPORIC + FLAGS "HG" + KEY 1 +END + +GROUPBOX DLG_NULL 78 4 +BEGIN + PROMPT 1 1 "Conto Teamsystem" +END + +STRING F_TSGRUPPO 2 +BEGIN + PROMPT 2 2 "Gruppo " + USE LF_RICLPDC + INPUT TIPORIC F_COD SELECT + INPUT CODICE[1,2] F_TSGRUPPO + INPUT CODICE[3,4] F_TSCONTO + INPUT CODICE[5,9] F_TSSOTTOCONTO + DISPLAY "Gruppo TS" CODICE[1,2] + DISPLAY "Conto TS" CODICE[3,4] + DISPLAY "Sotoconto TS" CODICE[5,7] + DISPLAY "Descrizione@50" DESCRIZ + DISPLAY "Gruppo" GRUPPO + DISPLAY "Conto" CONTO + DISPLAY "Sottoconto" SOTTOCONTO + OUTPUT F_TSGRUPPO CODICE[1,2] + OUTPUT F_TSCONTO CODICE[3,4] + OUTPUT F_TSSOTTOCONTO CODICE[5,7] + OUTPUT F_DESCRIZ DESCRIZ + OUTPUT F_GRUPPO GRUPPO + OUTPUT F_CONTO CONTO + OUTPUT F_SOTTOCONTO SOTTOCONTO + CHECKTYPE REQUIRED + VALIDATE FIXLEN_FUNC 2 + FIELD CODICE[1,2] + KEY 1 +END + +STRING F_TSCONTO 2 +BEGIN + PROMPT 19 2 "Conto " + COPY ALL F_TSGRUPPO + CHECKTYPE REQUIRED + FIELD CODICE[3,4] + VALIDATE FIXLEN_FUNC 2 + KEY 1 +END + +STRING F_TSSOTTOCONTO 3 +BEGIN + PROMPT 30 2 "Sottoconto " + COPY ALL F_TSGRUPPO + CHECKTYPE REQUIRED + FIELD CODICE[5,7] + VALIDATE FIXLEN_FUNC 3 + KEY 1 +END + +STRING F_DESCRIZ 50 +BEGIN + PROMPT 2 3 "Descrizione " + USE LF_RICLPDC KEY 2 + INPUT TIPORIC F_COD SELECT + INPUT DESCRIZ F_DESCRIZ + DISPLAY "Descrizione@50" DESCRIZ + DISPLAY "Gruppo TS" CODICE[1,2] + DISPLAY "Conto TS" CODICE[3,4] + DISPLAY "Sotoconto TS" CODICE[5,7] + DISPLAY "Gruppo" GRUPPO + DISPLAY "Conto" CONTO + DISPLAY "Sottoconto" SOTTOCONTO + COPY OUTPUT F_TSGRUPPO + FIELD DESCRIZ + KEY 2 + CHECKTYPE REQUIRED +END + +NUMBER F_GRUPPO 3 +BEGIN + PROMPT 2 6 "Gruppo " + HELP "Codice del gruppo" + FIELD GRUPPO + KEY 1 + GROUP 1 + USE LF_PCON KEY 1 SELECT CONTO="" + INPUT GRUPPO F_GRUPPO + DISPLAY "Gruppo" GRUPPO + DISPLAY "Descrizione@50" DESCR + OUTPUT F_GRUPPO GRUPPO + OUTPUT F_DESCG DESCR + CHECKTYPE NORMAL +END + +STRING F_DESCG 50 +BEGIN + PROMPT 24 6 "" + FLAGS "D" +END + +NUMBER F_CONTO 3 +BEGIN + PROMPT 2 8 "Conto " + HELP "Codice dell'eventuale conto" + FIELD CONTO + FLAGS "R" + KEY 1 + GROUP 1 + USE LF_PCON KEY 1 SELECT ((CONTO!="")&&(SOTTOCONTO="")) + COPY INPUT F_GRUPPO + INPUT CONTO F_CONTO + DISPLAY "Gruppo" GRUPPO + DISPLAY "Conto" CONTO + DISPLAY "Descrizione@50" DESCR + OUTPUT F_GRUPPO GRUPPO + OUTPUT F_CONTO CONTO + OUTPUT F_DESCC DESCR + CHECKTYPE NORMAL + VALIDATE REQIF_FUNC 1 F_SOTTOCONTO + WARNING "Manca il conto" +END + +STRING F_DESCC 50 +BEGIN + PROMPT 24 8 "" + FLAGS "D" +END + +NUMBER F_SOTTOCONTO 6 +BEGIN + PROMPT 2 10 "Sottoconto " + HELP "Codice dell'eventuale sottoconto" + FIELD SOTTOCONTO + KEY 1 + GROUP 1 + USE LF_PCON KEY 1 SELECT SOTTOCONTO!="" + COPY INPUT F_CONTO + INPUT SOTTOCONTO F_SOTTOCONTO + DISPLAY "Gruppo" GRUPPO + DISPLAY "Conto" CONTO + DISPLAY "Sottoconto" SOTTOCONTO + DISPLAY "Sosp." SOSPESO + DISPLAY "Descrizione@50" DESCR + OUTPUT F_SOTTOCONTO SOTTOCONTO + OUTPUT F_GRUPPO GRUPPO + OUTPUT F_CONTO CONTO + OUTPUT F_DESC DESCR + CHECKTYPE NORMAL +END + +STRING F_DESC 50 +BEGIN + PROMPT 24 10 "" + USE LF_PCON KEY 2 + INPUT DESCR F_DESC + DISPLAY "Descrizione@50" DESCR + DISPLAY "Sosp." SOSPESO + DISPLAY "Gruppo" GRUPPO + DISPLAY "Conto" CONTO + DISPLAY "Sottoconto" SOTTOCONTO + COPY OUTPUT F_SOTTOCONTO + CHECKTYPE NORMAL + HELP "Descrizione del gruppo o del conto o del sottoconto" + WARNING "Descrizione mancante" +END + +ENDPAGE + +ENDMASK \ No newline at end of file diff --git a/tc/tcconf.h b/tc/tcconf.h new file mode 100755 index 000000000..d3975432c --- /dev/null +++ b/tc/tcconf.h @@ -0,0 +1,20 @@ +#define F_CODDITTA 101 +#define F_RAGSOC 102 +#define F_CODDITTATS 103 +#define F_RICLNAZ 104 +#define F_RICLIVA 105 +#define F_RICLI11 106 +#define F_RICLCDP 107 +#define F_RICLREG 108 +#define F_RICLCAU 109 +#define F_RICLCONTI 110 +#define F_RIPRISTINO 111 +#define F_ULTINVIO 112 +#define F_NOHCLI 113 +#define F_SENDCG 114 +#define F_SHEET_IVA 115 + +#define SI_GRUPPO 101 +#define SI_CONTO 102 +#define SI_SOTTOCONTO 103 +#define SI_DESCR 104 diff --git a/tc/tcmenu.men b/tc/tcmenu.men new file mode 100755 index 000000000..d3f8cda2d --- /dev/null +++ b/tc/tcmenu.men @@ -0,0 +1,36 @@ +[TCMENU_001] +Caption = "Trasferimenti ad altre Contabilita'" +Picture = +Module = 27 +Flags = "" +Item_01 = "TeamSystem", [TCMENU_002] +Item_02 = "Zucchetti", "tc1 -0", "" + +[TCMENU_002] +Caption = "TeamSystem" +Picture = +Module = 27 +Flags = "" +Item_01 = "Trasferimento", "tc0 -6", "" +Item_02 = "Tabelle di riclassificazione", [TCMENU_003] +Item_03 = "Configurazione modulo", [TCMENU_004] + +[TCMENU_003] +Caption = "Tabelle di riclassificazione" +Picture = +Module = 27 +Flags = "" +Item_01 = "Causali", "tc0 -4 CAU", "" +Item_02 = "Condizioni di pagamento", "tc0 -4 CDP", "" +Item_03 = "Stati esteri", "tc0 -4 NAZ", "" +Item_04 = "Registri", "tc0 -4 REG", "" +Item_05 = "Codici IVA", "tc0 -4 IVA", "" +Item_06 = "Codici IVA 11", "tc0 -4 I11", "" +Item_07 = "Piano dei conti", "tc0 -7", "" + +[TCMENU_004] +Caption = "Configurazione modulo" +Picture = +Module = 27 +Flags = "" +Item_01 = "Parametri ditta", "tc0 -2", "" diff --git a/tc/tctsi11.uml b/tc/tctsi11.uml new file mode 100755 index 000000000..1bde9c11d --- /dev/null +++ b/tc/tctsi11.uml @@ -0,0 +1,76 @@ +#include "tcts.h" + +TOOLBAR "" 0 -3 0 3 + +#include + +ENDPAGE + +PAGE "Codici IVA 11" -1 -1 78 15 + +GROUPBOX DLG_NULL 78 3 +BEGIN + PROMPT 1 1 "Codice IVA 11 TeamSystem" +END + +LIST F_COD 5 +BEGIN + PROMPT 1 1 "" + ITEM "TSI11|TSI11" + FIELD COD + FLAGS "HG" + KEY 1 +END + +NUMBER F_CODTAB 2 +BEGIN + PROMPT 2 2 "" + USE LF_MULTIREL + INPUT COD F_COD SELECT + INPUT FIRST F_CODTAB + DISPLAY "Codice" FIRST + DISPLAY "Descrizione@60" DATA + DISPLAY "Tipo spesa/ricavo" SECOND + OUTPUT F_CODTAB FIRST + OUTPUT F_DESC DATA + OUTPUT F_COD_CAMPO SECOND + CHECKTYPE REQUIRED + FIELD FIRST + FLAGS "Z" + KEY 1 +END + +STRING F_DESC 50 +BEGIN + PROMPT 10 2 "Descrizione " + USE LF_MULTIREL KEY 2 + INPUT COD F_COD SELECT + INPUT DATA F_DESC + DISPLAY "Descrizione@60" DATA + DISPLAY "Codice" FIRST + DISPLAY "Tipo spesa/ricavo" SECOND + COPY OUTPUT F_CODTAB + FIELD DATA + KEY 3 + CHECKTYPE REQUIRED +END + +LIST F_COD_CAMPO 1 50 +BEGIN + PROMPT 2 4 "Tipo Spesa/Ricavo " + FIELD SECOND + ITEM "0|0. Acquisti o vendite in genere" + ITEM "1|1. Acquisti beni per rivendita" + ITEM "2|2. Acquisti beni ammortizzabili" + ITEM "3|3. Acquisti beni ammortizzabili con detr. 6%" + ITEM "4|4. Vendita beni strumentali art. 17" + ITEM "5|5. Beni per rivendita da non ventilare" + ITEM "8|8. Altri beni strumentali acquistati in leasing" + ITEM "9|9. Spese Generali" + KEY 1 + GROUP 1 +END + +ENDPAGE + +ENDMASK diff --git a/tc/tctsiva.uml b/tc/tctsiva.uml new file mode 100755 index 000000000..1d92ee5d3 --- /dev/null +++ b/tc/tctsiva.uml @@ -0,0 +1,75 @@ +#include "tcts.h" + +TOOLBAR "" 0 -3 0 3 + +#include + +ENDPAGE + +PAGE "Codici IVA" -1 -1 78 15 + +GROUPBOX DLG_NULL 78 3 +BEGIN + PROMPT 1 1 "Codice IVA TeamSystem" +END + +LIST F_COD 5 +BEGIN + PROMPT 1 1 "" + ITEM "TSIVA|TSIVA" + FIELD COD + FLAGS "HG" + KEY 1 +END + +NUMBER F_CODTAB 3 +BEGIN + PROMPT 2 2 "" + USE LF_MULTIREL + INPUT COD F_COD SELECT + INPUT FIRST F_CODTAB + DISPLAY "Codice" FIRST + DISPLAY "Descrizione@60" DATA + DISPLAY "Codice IVA Collegato" SECOND + OUTPUT F_CODTAB FIRST + OUTPUT F_DESC DATA + OUTPUT F_COD_CAMPO SECOND + CHECKTYPE REQUIRED + FIELD FIRST + FLAGS "Z" + KEY 1 +END + +STRING F_DESC 50 +BEGIN + PROMPT 10 2 "Descrizione " + USE LF_MULTIREL KEY 2 + INPUT COD F_COD SELECT + INPUT DATA F_DESC + DISPLAY "Descrizione@60" DATA + DISPLAY "Codice" FIRST + DISPLAY "Codice IVA Collegato" SECOND + COPY OUTPUT F_CODTAB + FIELD DATA + KEY 3 + CHECKTYPE REQUIRED +END + +STRING F_COD_CAMPO 4 +BEGIN + PROMPT 2 4 "Codice IVA collegato " + FIELD SECOND + FLAGS "U" + USE %IVA + INPUT CODTAB F_COD_CAMPO + DISPLAY "Cod." CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_COD_CAMPO CODTAB + KEY 1 + CHECKTYPE NORMAL + GROUP 1 +END + +ENDPAGE + +ENDMASK diff --git a/tc/tsricl.txt b/tc/tsricl.txt new file mode 100755 index 000000000..386b65a4b --- /dev/null +++ b/tc/tsricl.txt @@ -0,0 +1,1325 @@ +[Header] +Version=199519 +File=159 +Fields=TIPORIC,10|GRUPPO,3|CONTO,3|SOTTOCONTO,6|CODICE,50|DESCRIZ,50 + +[Data] +TSCONTI||||0100000|CREDITI V/SOCI P/VERS.ANC.DOVUTI +TSCONTI||||0105000|CREDITI V/SOCI P/VERS.ANC.DOVUTI +TSCONTI||||0105005|SOCI C/SOTTOSCRIZIONE +TSCONTI||||0105010|SOCI C/DECIMI RICHIAMATI +TSCONTI||||0300000|IMMOBILIZZAZIONI IMMATERIALI +TSCONTI||||0305000|COSTI DI IMPIANTO E AMPLIAMENTO +TSCONTI||||0305005|COSTI DI IMPIANTO +TSCONTI||||0305010|COSTI DI AMPLIAMENTO +TSCONTI||||0310000|COSTI RIC.,SVIL.,PUBBL. DA AMM. +TSCONTI||||0310005|COSTI DI RIC.,SVIL.,PUBB. DA AMM +TSCONTI||||0315000|DIRITTI DI BREV.E UTIL.OPERE ING +TSCONTI||||0315005|DIRITTI DI BREVETTO +TSCONTI||||0315010|DIRITTI DI UTIL.OPERE INGEGNO +TSCONTI||||0315015|LIC.ZA USO SOFTWARE TEMPO INDET. +TSCONTI||||0320000|CONCESSIONI, LICENZE, MARCHI +TSCONTI||||0320005|CONC.ONI, LICENZE E DIR. SIMILI +TSCONTI||||0320010|MARCHI DI FABBRICA E COMMERCIO +TSCONTI||||0320015|LIC.ZA D'USO SOFTWARE TEMPO DET. +TSCONTI||||0325000|AVVIAMENTO +TSCONTI||||0325005|AVVIAMENTO +TSCONTI||||0330000|IMM.IMM. IN CORSO E ACCONTI +TSCONTI||||0330005|IMMOB.IMMATERIALI IN CORSO +TSCONTI||||0330010|FOR.RI IMMOB. IMMAT.LI C/ACCONTI +TSCONTI||||0335000|ALTRE IMMOB.ZIONI IMMATERIALI +TSCONTI||||0335005|LAVORI STRAOR. SU BENI DI TERZI +TSCONTI||||0335010|MANUT.STRAORDINARIE-PROFESS. +TSCONTI||||0335015|ALTRI COSTI AD UTIL.PLUR.DA AMM. +TSCONTI||||0400000|F/AMM IMMOBILIZZAZIONI IMMAT. +TSCONTI||||0405000|F/AMM COSTI DI IMPIANTO E AMPL. +TSCONTI||||0405005|F/AMM COSTI IMPIANTO +TSCONTI||||0405010|F/AMM COSTI DI AMPLIAMENTO +TSCONTI||||0410000|F/AMM COSTI DI RIC,SVIL,PUBB.AMM +TSCONTI||||0410005|F/AMM COSTI DI RIC,SVIL,PUBB.AMM +TSCONTI||||0415000|F/AMM DIRITTI DI BREV. E UT. OP. +TSCONTI||||0415005|F/AMM DIRITTI DI BREVETTO +TSCONTI||||0415010|F/AMM DIR.TI UTIL.OPERE INGEGNO +TSCONTI||||0415015|F/AMM LIC. D'USO SOF. A TEM. IND +TSCONTI||||0420000|F/AMM CONCESS. LICENZE MARCHI +TSCONTI||||0420005|F/AMM CONC.LIC. E ALTRI DIR.SIM. +TSCONTI||||0420010|F/AMM MARCHI DI FABBRICA E COMM. +TSCONTI||||0420015|F/AMM LIC. D'USO SOF. A TEMP.DET +TSCONTI||||0425000|F/AMM AVVIAMENTO +TSCONTI||||0425005|F.DO AMM AVVIAMENTO +TSCONTI||||0435000|F/AMM ALTRE IMMOB. IMMATERIALI +TSCONTI||||0435005|F/AMM LAV. STR. SU BENI DI TERZ +TSCONTI||||0435010|F/AMM.MANUT.STRAORD.-PROFESS. +TSCONTI||||0435015|F/AMM ALT. COS. AD UT. PLU. AMM +TSCONTI||||0500000|F.DO SVAL. IMMOB. IMMATERIALI +TSCONTI||||0505000|F.DO SVALUT. IMMOB. IMMATERIALI +TSCONTI||||0505005|F.DO SVAL. DIRITTI DI BREVETTO +TSCONTI||||0600000|IMMOBILIZZAZIONI MATERIALI +TSCONTI||||0605000|TERRENI E FABBBRICATI +TSCONTI||||0605005|TERRENI +TSCONTI||||0605006|TERRENI AMMORTIZZABILI +TSCONTI||||0605010|FABBRICATI CIVILI +TSCONTI||||0605015|FABBRICATI IND.LI. E COMM.LI +TSCONTI||||0605020|COSTRUZIONI LEGGERE +TSCONTI||||0605025|FAB.USO UFF.ACQ.ANTE 15.6.90-PRO +TSCONTI||||0610000|IMPIANTI E MACCHINARIO +TSCONTI||||0610005|IMPIANTI GENERICI +TSCONTI||||0610010|IMPIANTI SPECIFICI +TSCONTI||||0610015|MACCHINARI +TSCONTI||||0615000|ATTREZZATURE IND.LI E COMM.LI +TSCONTI||||0615005|ATTREZZAT. IND.LI E COMM.LI +TSCONTI||||0615010|ATTR.VARIE E MINUTE (<516,46 E.) +TSCONTI||||0620000|MOBILI E MACC.D'UFF.(ALTRI BENI) +TSCONTI||||0620005|MOBILI E MACCHINE ORD. D'UFFICIO +TSCONTI||||0620010|MACCHINE ELETTROMEC. D'UFFICIO +TSCONTI||||0625000|AUTOMEZZI (ALTRI BENI) +TSCONTI||||0625015|AUTOCARRI/AUTOVETTURE +TSCONTI||||0625020|AUTO AGENTI/RAPPRESENTANTI +TSCONTI||||0625025|AUTOVETTURE +TSCONTI||||0625030|MOTOVEICOLI AGENTI/RAPPRES. +TSCONTI||||0625035|MOTOVEICOLI +TSCONTI||||0630000|ALTRI BENI +TSCONTI||||0630040|ARREDAMENTO +TSCONTI||||0630045|STIGLIATURA +TSCONTI||||0630050|IMBALLAGGI DUREVOLI +TSCONTI||||0630055|NAVI (art. 8 bis DPR n. 633/72) +TSCONTI||||0630060|BIANCHERIA-ALBERGHI E RISTORANTI +TSCONTI||||0630100|ALTRI BENI MATERIALI +TSCONTI||||0635000|IMMOBIL. IN CORSO E ACCONTI +TSCONTI||||0635005|IMMOB. MATERIALI IN CORSO +TSCONTI||||0635010|FORN.IMMOB.MATERIALI C/ACCONTI +TSCONTI||||0700000|F/AMM IMMOB. MATERIALI +TSCONTI||||0705000|F/AMM FABBRICATI +TSCONTI||||0705006|F.DO AMMORTAMENTO TERRENI +TSCONTI||||0705010|F/AMM FABBRICATI CIVILI +TSCONTI||||0705015|F/AMM FABBR. IND.LI E COMM.LI. +TSCONTI||||0705020|F/AMM COSTRUZIONI LEGGERE +TSCONTI||||0705025|F/AMM FAB.USO UF.ANT.15.6.90-PRO +TSCONTI||||0710000|F/AMM IMPIANTI E MACCHINARIO +TSCONTI||||0710005|F/AMM IMPIANTI GENERICI +TSCONTI||||0710010|F/AMM IMPIANTI SPECIFICI +TSCONTI||||0710015|F/AMM MACCHINARI +TSCONTI||||0715000|F/AMM ATTREZ. IND.LI E COMM.LI +TSCONTI||||0715005|F/AMM ATTREZ. IND.LI E COMM.LI +TSCONTI||||0715010|F/AMM ATTR. VARIE E MINUTE +TSCONTI||||0720000|F/AMM. MOBILI E MACCH. D'UFFICIO +TSCONTI||||0720005|F/AMM MOBILI E MACCH. ORD. D'UFF +TSCONTI||||0720010|F/AMM MACCH. ELETTROM. D'UFF. +TSCONTI||||0725000|F/AMM. AUTOMEZZI (ALTRI BENI) +TSCONTI||||0725015|F/AMM. AUTOCARRI/AUTOVETTURE +TSCONTI||||0725020|F/AMM. AUTO AGENTI/RAPPRES. +TSCONTI||||0725025|F/AMM. AUTOVETTURE +TSCONTI||||0725030|F/AMM. MOTOVEIC. AGENTI/RAPPRES. +TSCONTI||||0725035|F/AMM. MOTOVEICOLI +TSCONTI||||0730000|F/AMM. ALTRI BENI +TSCONTI||||0730040|F/AMM. ARREDAMENTO +TSCONTI||||0730045|F/AMM. STIGLIATURA +TSCONTI||||0730050|F/AMM. IMBALLAGGI DUREVOLI +TSCONTI||||0730055|F/AMM.NAVI(art.8 bis DPR 633/72) +TSCONTI||||0730060|F/AMM.BIANCHERIA-ALBERGHI E RIST +TSCONTI||||0730100|F/AMM. ALTRI BENI MATERIALI +TSCONTI||||0800000|F.DI SVALUT. IMMOB. MATERIALI +TSCONTI||||0805000|F.DO SVALUT. IMMOB. MATERIALI +TSCONTI||||0805005|F.DO SVALUTAZIONE TERRENI +TSCONTI||||0900000|IMMOBILIZZAZIONI FINANZIARIE +TSCONTI||||0905000|PARTECIPAZIONI +TSCONTI||||0905005|PARTEC. IN IMPRESE CONTROLLATE +TSCONTI||||0905010|PARTEC. IN IMPRESE COLLEGATE +TSCONTI||||0905015|PARTEC. IN IMPRESE CONTROLLANTI +TSCONTI||||0905090|PARTECIPAZIONI IN ALTRE IMPR. +TSCONTI||||0905095|PARTECIPAZIONE IN SOC. DI PERS. +TSCONTI||||0910000|CREDITI IMMOBILIZZATI +TSCONTI||||0910005|CREDITI V/IMPRESE CONTROLLATE +TSCONTI||||0910006|CRED.V/IMPR.CONTR.OLTRE ESER.SUC +TSCONTI||||0910010|CREDITI V/IMPRESE COLLEGATE +TSCONTI||||0910011|CRED.V/IMPR.COLL.OLTRE ESER.SUC. +TSCONTI||||0910015|CREDITI V/CONTROLLANTI +TSCONTI||||0910016|CREDITI V/CONTROLL.OLTRE ES.SUCC +TSCONTI||||0910020|MUTUI ATTIVI +TSCONTI||||0910025|CAMBIALI ATTIVE FINANZIARIE +TSCONTI||||0910030|DEPOSITI CAUZIONALI SU CONTRATTI +TSCONTI||||0910035|POLIZZA ASSIC. CAPITALIZZ. TFR +TSCONTI||||0910040|ERARIO C/ACC.TI RITENUTE TFR +TSCONTI||||0910090|ALTRI CRED.IMM.OLTRE ES.SUCC. +TSCONTI||||0915000|ALTRI TITOLI +TSCONTI||||0915005|TITOLI A REDDITO FISSO IMMOBILIZ +TSCONTI||||0920000|AZIONI PROPRIE +TSCONTI||||0920005|AZIONI PROPRIE +TSCONTI||||1000000|F/SVAL. IMM. FINANZIARIE +TSCONTI||||1005000|F/SVAL. IMM. FINANZIARIE +TSCONTI||||1005005|F/SVAL. PARTEC. IN. IMPR. CONTR. +TSCONTI||||1005010|F/SVAL. PARTEC. IN IMPR. COLLEG. +TSCONTI||||1005015|F/SVAL. PARTEC. IN IMPR. CONTROL +TSCONTI||||1005020|F/SVAL. PARTEC. IN ALTRE IMP. +TSCONTI||||1005025|F/DO SVAL. RISCHI SU CREDITI IMM +TSCONTI||||1005030|F/SVAL. TIT. A REDD. FISSO IMM. +TSCONTI||||1005035|FONDO SVALUTAZ. AZIONI PROPRIE +TSCONTI||||1100000|RIMANENZE +TSCONTI||||1105000|MATERIE PRIME, SUSS.E DI CONSUMO +TSCONTI||||1105005|MATERIE PRIME +TSCONTI||||1105010|MATERIE SUSSIDIARIE +TSCONTI||||1105015|MATERIE DI CONSUMO +TSCONTI||||1105020|MATERIALI VARI +TSCONTI||||1110000|PROD.IN CORSO DI LAV. E SEMILAV. +TSCONTI||||1110005|PRODOTTI IN CORSO DI LAVORAZIONE +TSCONTI||||1110010|SEMILAVORATI +TSCONTI||||1115000|LAVORI IN CORSO SU ORDINAZIONE +TSCONTI||||1115005|LAV.IN CORSO SU ORD. (<12 MESI) +TSCONTI||||1115015|OPERE/SERV.ULTRAN.inESEC-VAL.RIC +TSCONTI||||1115020|OPERE/SERV.ULTRANinESEC-VAL.COST +TSCONTI||||1120000|PRODOTTI FINITI E MERCI +TSCONTI||||1120005|PRODOTTI FINITI +TSCONTI||||1120010|MERCI +TSCONTI||||1125000|ACCONTI +TSCONTI||||1125005|FORNITORI C/ACC.-RIMANENZE +TSCONTI||||1400000|CREDITI V/CLIENTI +TSCONTI||||1500000|ALTRI CREDITI V/CLIENTI +TSCONTI||||1505000|ALTRI CREDITI V/CLIENTI +TSCONTI||||1505005|EFFETTI IN PORTAFOGLIO +TSCONTI||||1505010|EFFETTI ALLO SCONTO +TSCONTI||||1505015|EFFETTI ALL'INCASSO +TSCONTI||||1505020|EFFETTI AL SALVO BUON FINE +TSCONTI||||1505025|EFFETTI INSOLUTI E PROTESTATI +TSCONTI||||1505030|CREDITI INSOLUTI V/CLIENTI +TSCONTI||||1505035|RICEVUTE BANCARIE S.B.F. +TSCONTI||||1505040|CLIENTI C/SPESE ANTICIPATE +TSCONTI||||1505045|FATTURE DA EMETTERE +TSCONTI||||1505050|CARTE DI CREDITO +TSCONTI||||1505090|ALTRI CREDITI V/CLIENTI +TSCONTI||||1505091|CRED.V/CLI.ESIG.OLTRE ES.SUCC. +TSCONTI||||1600000|F.DI RISCHI SU CREDITI V. CLIENT +TSCONTI||||1610000|F.DI RISCHI SU CREDITI V. CLIENT +TSCONTI||||1610010|F/DO RISCHI SU CREDITI V.CLIENTI +TSCONTI||||1610011|F/DO RISCHI SU CREDITI TASSATO +TSCONTI||||1610040|F/DO RISC.SU CREDITI P/INT.MORA +TSCONTI||||1800000|ALTRI CREDITI +TSCONTI||||1805000|CREDITI V/IMPRESE CONTROLLATE +TSCONTI||||1805005|CREDITI V/IMPRESE CONTROLLATE +TSCONTI||||1805090|CREDITI V/CONTROLL.OLTRE ES.SUCC +TSCONTI||||1810000|CREDITI V/IMPRESE COLLEGATE +TSCONTI||||1810005|CREDITI V/IMPRESE COLLEGATE +TSCONTI||||1810090|CREDITI V/COLLEG.OLTRE ES.SUCC. +TSCONTI||||1815000|CREDITI V/CONTROLLANTI +TSCONTI||||1815005|CREDITI V/CONTROLLANTI +TSCONTI||||1815090|CREDITI V/CONTROLL.OLTRE ES.SUCC +TSCONTI||||1820000|CREDITI TRIBUTARI +TSCONTI||||1820005|IVA SU ACQUISTI +TSCONTI||||1820015|ERARIO C/ACCONTO IVA +TSCONTI||||1820020|ERARIO C/RIMBORSO IVA +TSCONTI||||1820030|ERARIO C/ACCONTI IRPEG +TSCONTI||||1820035|ERARIO C/RIMBORSO IRPEG +TSCONTI||||1820037|ERARIO C/ACCONTI IRES +TSCONTI||||1820040|REGIONI C/ACCONTI IRAP +TSCONTI||||1820050|ERARIO C/RITENUTE SUBITE +TSCONTI||||1820055|ERARIO C/RITENUTE DA SCOMPUTARE +TSCONTI||||1820065|ERARIO C/CRED. D'IMPOSTA +TSCONTI||||1820070|ERARIO C/ACCONTO RITENUTA T.F.R. +TSCONTI||||1820080|ERARIO C/COMPENSAZIONI +TSCONTI||||1820090|ALTRI CREDITI TRIBUTARI +TSCONTI||||1820190|ALTRI CRED.TRIB.ESIG.OLTRE +TSCONTI||||1822000|IMPOSTE ANTICIPATE +TSCONTI||||1822005|CREDITI PER IMPOSTE ANTICIPATE +TSCONTI||||1822105|CRED.P/IMPOSTE ANTIC.ESIG.OLTRE +TSCONTI||||1825000|CREDITI V/ISTITUTI PREVIDENZIALI +TSCONTI||||1825005|INPS C/ACCONTI +TSCONTI||||1825010|INPS C/RIMBORSI +TSCONTI||||1825015|INPS C/CONGUAGLIO +TSCONTI||||1825020|INAIL C/ACCONTI +TSCONTI||||1825025|INAIL C/RIMBORSI +TSCONTI||||1825030|INAIL C/CONGUAGLIO +TSCONTI||||1825090|ALTRI CREDITI V/ISTITUTI PREVID. +TSCONTI||||1830000|CREDITI V/SOCI +TSCONTI||||1830005|SOCI C/PRELEVAMENTI +TSCONTI||||1830090|ALTRI CREDITI V/SOCI +TSCONTI||||1835000|CREDITI V/DIPENDENTI +TSCONTI||||1835005|DIPENDENTI C/CONTRIBUTI ANTIC. +TSCONTI||||1835010|DIPENDENTI C/ANTICIPI SU RETRIB. +TSCONTI||||1835015|DIPENDENTI C/ANTICIPI SU TFR +TSCONTI||||1835020|DIPENDENTI C/PRESTITI +TSCONTI||||1835025|DIPEND. C/ANTICIPI SPESE VIAGGIO +TSCONTI||||1835090|ALTRI CREDITI V/DIPENDENTI +TSCONTI||||1840000|CREDITI V/FORNITORI +TSCONTI||||1840005|FORNITORI C/CAUZ.IMBALLAGGI +TSCONTI||||1840025|CAPARRE A FORNITORI +TSCONTI||||1840030|FORNITORI C/PREMI DA LIQUIDARE +TSCONTI||||1840035|FORNITORI C/SPESE ANTICIPATE +TSCONTI||||1840040|NOTE CREDITO DA RICEVERE +TSCONTI||||1840090|ALTRI CREDITI V/FORNITORI +TSCONTI||||1845000|CREDITI VARI +TSCONTI||||1845005|CREDITI PER CAUZIONI +TSCONTI||||1845010|CREDITI PER ANTICIPI +TSCONTI||||1845030|ASSICURAZIONI C/RISARCIMENTI +TSCONTI||||1845040|CREDITI V/FACTOR +TSCONTI||||1845050|ASSOCIATI IN PARTECIP. C/UTILI +TSCONTI||||1845090|CREDITI DIVERSI +TSCONTI||||1845091|CRED.DIV.ESIG.OLTRE ES.SUCC. +TSCONTI||||1900000|F.DO RISCHI SU ALTRI CREDITI +TSCONTI||||1905000|F.DO RISCHI SU ALTRI CREDITI +TSCONTI||||1905005|F.DO RIS.CRE. V/IMP. CONTROLLATE +TSCONTI||||1905025|F.DO RISCHI SU CRE. V/IMP. COLLE +TSCONTI||||1905045|F.DO RIS.CRE.V/IMP.CONTROLLANTI +TSCONTI||||1905090|F.DO RISCHI SU ALTRI CREDITI +TSCONTI||||2000000|ATT. FINANZ. CHE NON COST. IMMOB +TSCONTI||||2005000|PARTECIPAZIONI IN IMPRESE CONTR. +TSCONTI||||2005005|PARTECIPAZIONI IN IMPRESE CONTR. +TSCONTI||||2010000|PARTECIPAZIONI IN IMPRESE COLLEG +TSCONTI||||2010005|PARTECIPAZIONI IN IMPRESE COLLEG +TSCONTI||||2015000|PARTECIP.IN IMPRESE CONTROLLANTI +TSCONTI||||2015005|PARTECIP.IN IMPRESE CONTROLLANTI +TSCONTI||||2020000|ALTRE PARTECIPAZIONI +TSCONTI||||2020005|ALTRE PARTECIPAZIONI +TSCONTI||||2025000|AZIONI PROPRIE +TSCONTI||||2025005|AZIONI PROPRIE +TSCONTI||||2030000|ALTRI TITOLI +TSCONTI||||2030005|TITOLI A REDDITO FISSO NON IMMOB +TSCONTI||||2100000|F.DO SVAL.ATT.CHE NON COST.IMMOB +TSCONTI||||2105000|F.DO SVAL.ATT.CHE NON COST.IMMOB +TSCONTI||||2105005|F.DO SVAL.PARTEC.IMP.CONTROLLATE +TSCONTI||||2105010|F.DO SVAL. PARTEC. IN IMP. COLL. +TSCONTI||||2105015|F.DO SVAL.PART.IMP.CONTROLLANTI +TSCONTI||||2105020|F.DO SVALUT. ALTRE PARTECIPAZ. +TSCONTI||||2105025|F.DO SVALUTAZIONE AZIONI PROPRIE +TSCONTI||||2105030|F.DO SVAL. ALTRI TITOLI NON IMM. +TSCONTI||||2400000|DISPONIBILITA' LIQUIDE +TSCONTI||||2405000|DEPOSITI BANCARI E POSTALI +TSCONTI||||2405001|BANCA C/C +TSCONTI||||2405002|BANCA C/C +TSCONTI||||2405003|BANCA C/C +TSCONTI||||2405004|BANCA C/C +TSCONTI||||2405005|BANCA C/C +TSCONTI||||2405006|BANCA C/C +TSCONTI||||2405007|BANCA C/C +TSCONTI||||2405008|BANCA C/C +TSCONTI||||2405009|BANCA C/C +TSCONTI||||2405010|BANCA C/C +TSCONTI||||2405025|BANCA C/VINCOLATO +TSCONTI||||2405045|BANCA C/VALUTARIO +TSCONTI||||2405065|C/C POSTALE +TSCONTI||||2410000|ASSEGNI +TSCONTI||||2410005|ASSEGNI BANCARI +TSCONTI||||2410010|ASSEGNI CIRCOLARI +TSCONTI||||2415000|DENARO E VALORI IN CASSA +TSCONTI||||2415005|DENARO IN CASSA +TSCONTI||||2415010|VALORI BOLLATI +TSCONTI||||2600000|RATEI E RISCONTI ATTIVI +TSCONTI||||2605000|RATEI ATTIVI +TSCONTI||||2605005|RATEI ATTIVI +TSCONTI||||2610000|RISCONTI ATTIVI +TSCONTI||||2610005|RISCONTI ATTIVI +TSCONTI||||2615000|COSTI ANTICIPATI +TSCONTI||||2615005|COSTI ANTICIPATI +TSCONTI||||2620000|DISAGGIO SU PRESTITI +TSCONTI||||2620005|DISAGGIO SU PRESTITI +TSCONTI||||2625000|SPESE NON PAGATE-PROFESSIONISTI +TSCONTI||||2625005|SPESE NON PAGATE-PROFESSIONISTI +TSCONTI||||2800000|PATRIMONIO NETTO +TSCONTI||||2805000|CAPITALE +TSCONTI||||2805005|CAPITALE SOCIALE +TSCONTI||||2805010|FONDO DI DOTAZIONE +TSCONTI||||2805015|CAPITALE NETTO +TSCONTI||||2805020|TITOLARE C/VERSAM. e/o PRELEVAM. +TSCONTI||||2810000|RISERVA DA SOPRAPREZ. AZ./QUOTE +TSCONTI||||2810005|RISERVA DA SOPRAPREZ. AZ./QUOTE +TSCONTI||||2815000|RISERVE DI RIVALUTAZIONE +TSCONTI||||2815005|RISERVE DI RIVALUT. LEGGE N. ... +TSCONTI||||2820000|RISERVA LEGALE +TSCONTI||||2820005|RISERVA LEGALE +TSCONTI||||2825000|RISERVA P/AZIONI PROP.IN PORTAF. +TSCONTI||||2825005|RISERVA P/AZIONI PROP.IN PORTAF. +TSCONTI||||2830000|RISERVE STATUTARIE +TSCONTI||||2830005|RISERVE STATUTARIE +TSCONTI||||2835000|ALTRE RISERVE +TSCONTI||||2835005|RISERVA STRAORDINARIA +TSCONTI||||2835010|F.DO PLUSV. RINVIATE ART.86 T.U. +TSCONTI||||2835015|RISER.CONTR.E LIBER. ART.88 T.U. +TSCONTI||||2835020|F.DO RISER.TASS.TA P/RISCHI FUT. +TSCONTI||||2835025|SOCI P/VERS.TI IN C/FUT.AUM.CAP. +TSCONTI||||2835030|RISER.DA CONFER.AGEV.(L.576/75) +TSCONTI||||2835035|SOCI P/VERS.TI IN C/COP.PERDITE +TSCONTI||||2835040|RISERVA P/AMM.TO ANTICIPATO +TSCONTI||||2835045|ALTRE RIS. IN SOSP. D'IMPOSTA +TSCONTI||||2835049|RISERVA DI TRASF.EX SOC.CAPIT. +TSCONTI||||2835050|RISERVA DI TRASF. EX SOC.DI PERS +TSCONTI||||2835052|RISERVA DI UTILI TASS.P/TRASPAR. +TSCONTI||||2835055|RISERVA P/ARROT. UNITA' DI EURO +TSCONTI||||2835060|RIS.F.DI PREV.INTEG.(DLgs124/93) +TSCONTI||||2835065|RISERVA NON DISTR.(ex.art. 2426) +TSCONTI||||2835070|RISERVA DI CUI ART.15 DL 429/82 +TSCONTI||||2835075|RISERVA INDIVIS.ART.12, L.904/77 +TSCONTI||||2835080|RISERVA PER UTILI SU CAMBI +TSCONTI||||2835090|ALTRE RISERVE DI CAPITALE +TSCONTI||||2835091|ALTRE RISERVE DI UTILI +TSCONTI||||2840000|UTILI (PERDITE) PORTATI A NUOVO +TSCONTI||||2840005|UTILI PORTATI A NUOVO +TSCONTI||||2840010|AVANZO UTILI +TSCONTI||||2840015|PERDITE PORTATE A NUOVO +TSCONTI||||2845000|UTILE (PERDITA) DELL'ESERCIZIO +TSCONTI||||2845005|UTILE DI ESERCIZIO +TSCONTI||||2845010|PERDITA DI ESERCIZIO +TSCONTI||||2845090|RISULTATO DI ESERCIZIO +TSCONTI||||3000000|FONDI PER RISCHI ED ONERI +TSCONTI||||3005000|F.DI P/TRAT.QUIESC.E OBBL.SIMILI +TSCONTI||||3005005|F.DO TRATT. QUIESC. PREV. INTEG. +TSCONTI||||3005020|F.DO P/CESS. DI RAPP. CO.CO.CO +TSCONTI||||3005025|F.DO P/INDENNITA' SUPP.CLIENTELA +TSCONTI||||3010000|FONDO PER IMPOSTE +TSCONTI||||3010005|F.DO PER IMPOSTE DIFFERITE +TSCONTI||||3010010|FONDO PER IMPOSTE IN CONTENZIOSO +TSCONTI||||3015000|ALTRI FONDI PER RISCHI ED ONERI +TSCONTI||||3015005|F.DO RISCHI SU CAMBI +TSCONTI||||3015045|F.DO RIS.P/CONTROV.LEGALIinCORSO +TSCONTI||||3015050|F.DO RIS.P/RIT.CONS.LAV.O PROD. +TSCONTI||||3015055|F.DO COPERTURA RISCHI PERSONALE +TSCONTI||||3015075|F.DO RISCHI RECUPERO AMBIENTALE +TSCONTI||||3015090|F.DO RIS.CONT.LAV.CORSO SU ORD. +TSCONTI||||3015100|F.DO RISC.CONTR.OP.ULTR.ESEC. +TSCONTI||||3015120|F.DO RIS.MAN.E RIP.BENI AZ.AFF. +TSCONTI||||3015130|F.DO OPERAZ. E CONCORSI A PREMIO +TSCONTI||||3015190|ALTRI FONDI RISCHI ED ONERI +TSCONTI||||3100000|TFR LAVORO SUBORDINATO +TSCONTI||||3105000|TFR LAVORO SUBORDINATO +TSCONTI||||3105005|DEBITI P/T.F.R. +TSCONTI||||3200000|OBBLIGAZIONI +TSCONTI||||3205000|OBBLIGAZIONI +TSCONTI||||3205005|OBBLIGAZIONI +TSCONTI||||3205010|OBBLIGAZIONI ESIG.OLTRE ES.SUCC. +TSCONTI||||3210000|OBBLIGAZIONI CONVERTIBILI +TSCONTI||||3210005|OBBLIGAZIONI CONVERTIBILI +TSCONTI||||3210010|OBBLIG.CONVER.ESIG.OLTRE ES.SUCC +TSCONTI||||3400000|DEBITI V/BANCHE +TSCONTI||||3405000|DEBITI V/BANCHE +TSCONTI||||3405005|BANCA C/MUTUI IPOT.ESIG.ENTRO ES +TSCONTI||||3405006|BANCA C/MUTUI IPOT.ESIG.OLTRE ES +TSCONTI||||3405025|BANCA C/SOVVENZIONI +TSCONTI||||3405045|BANCA C/FINANZIAMENTI +TSCONTI||||3405085|BANCA C/RICEVUTE S.B.F. +TSCONTI||||3405115|BANCA C/ANTICIPI SU FATTURE +TSCONTI||||3405290|DEB.V/BANCHE ESIG. OLTRE ES.SUCC +TSCONTI||||3600000|DEBITI V/ALTRI FINANZIATORI +TSCONTI||||3605000|DEBITI V/ALTRI FINANZIATORI +TSCONTI||||3605005|SOCI C/FINANZIAMENTI (INFRUTT.) +TSCONTI||||3605010|SOCI C/FINANZIAM. ESIG. OLTRE +TSCONTI||||3605035|FINANZIAMENTI DA TERZI +TSCONTI||||3605065|EFFETTI PASSIVI FINANZIARI +TSCONTI||||3605085|DEBITI V/FACTOR +TSCONTI||||3605190|ALTRI DEBITI FINANZIARI +TSCONTI||||3605191|ALTRI DEB.FIN.ESIG.OLTRE ES.SUCC +TSCONTI||||3800000|ACCONTI +TSCONTI||||3805000|ACCONTI +TSCONTI||||3805005|CLIENTI C/ANTICIPI +TSCONTI||||3805010|CLIENTI C/CAPARRE +TSCONTI||||3805015|CLIENTI C/F.DO SPESE +TSCONTI||||3805020|CLIENTI C/RIMBORSO SPESE +TSCONTI||||3805030|CLIENTI C/PAG.CONTR-IMPOSTE-RIT. +TSCONTI||||3805040|INCASSI C/TERZI +TSCONTI||||3805090|CLIENTI C/ANT.ESIG.OLTRE ES.SUCC +TSCONTI||||4000000|DEBITI V/FORNITORI +TSCONTI||||4100000|ALTRI DEBITI V/FORNITORI +TSCONTI||||4105000|ALTRI DEBITI V/FORNITORI +TSCONTI||||4105005|FATTURE DA RICEVERE +TSCONTI||||4105090|DEB.V/FORN. ESIG. OLTRE ES.SUCC. +TSCONTI||||4200000|DEBITI RAPP. DA TITOLI DI CRED. +TSCONTI||||4205000|DEBITI RAPP. DA TITOLI DI CRED. +TSCONTI||||4205005|EFFETTI PASSIVI COMMERCIALI +TSCONTI||||4205090|ALTRI DEB. RAPP. DA TIT. DI CRE. +TSCONTI||||4205091|DEB.RAPPR.TIT.CRED.OLTRE ES.SUCC +TSCONTI||||4400000|DEBITI V/IMPRESE CONTROLLATE +TSCONTI||||4405000|DEBITI V/IMPRESE CONTROLLATE +TSCONTI||||4405005|DEBITI V/IMPRESE CONTROLLATE +TSCONTI||||4405050|DEBITI V/IMPR.CONTR.ESIG.OLTRE +TSCONTI||||4500000|DEBITI V/IMPRESE COLLEGATE +TSCONTI||||4505000|DEBITI V/IMPRESE COLLEGATE +TSCONTI||||4505005|DEBITI V/IMPRESE COLLEGATE +TSCONTI||||4505050|DEBITI V/IMPR.COLLEG.ESIG.OLTRE +TSCONTI||||4600000|DEBITI V/CONTROLLANTI +TSCONTI||||4605000|DEBITI V/CONTROLLANTI +TSCONTI||||4605005|DEBITI V/CONTROLLANTI +TSCONTI||||4605050|DEBITI V/CONTROLLANTI ESIG.OLTRE +TSCONTI||||4800000|DEBITI TRIBUTARI +TSCONTI||||4805000|DEBITI TRIBUTARI +TSCONTI||||4805005|ERARIO C/IRPEG +TSCONTI||||4805010|ERARIO C/IRES +TSCONTI||||4805015|ERARIO C/IMPOSTA SOST. RIV. TFR +TSCONTI||||4805040|ERARIO C/IVA +TSCONTI||||4805045|IVA SU VENDITE +TSCONTI||||4805050|IVA SU CORRISPETTIVI +TSCONTI||||4805055|IVA IN SOSPENSIONE +TSCONTI||||4805056|IVA C/TRANSITORIO +TSCONTI||||4805080|ERARIO C/RIT. LAVORO DIPENDENTE +TSCONTI||||4805085|ERARIO C/RIT. LAVORO AUTONOMO +TSCONTI||||4805090|ERARIO C/RIT. SU DIVIDENDI +TSCONTI||||4805100|REGIONI C/IRAP +TSCONTI||||4805105|REGIONI C/RIT. ADDIZ. IRPEF +TSCONTI||||4805110|COMUNI C/RIT. ADDIZ. IRPEF +TSCONTI||||4805190|ALTRI DEBITI TRIBUTARI +TSCONTI||||4805191|DEB.TRIBUT.ESIG.OLTRE ES.SUCC. +TSCONTI||||5000000|DEBITI V/IST.PREV.E SICUR.SOC. +TSCONTI||||5005000|DEBITI V/IST.PREV.E SICUR.SOC. +TSCONTI||||5005005|INPS C/CONTRIBUTI SOC. LAV. DIP. +TSCONTI||||5005010|INPS C/CONTR. SOC. LAV. AUT. +TSCONTI||||5005020|INAIL C/CONTRIBUTI +TSCONTI||||5005030|ENASARCO C/CONTRIBUTI +TSCONTI||||5005035|CASSA EDILE C/CONTRIBUTI +TSCONTI||||5005040|ENTE COMETA C/CONTRIBUTI +TSCONTI||||5005045|COVELCO C/CONTRIBUTI +TSCONTI||||5005050|ENPALS C/CONTRIBUTI +TSCONTI||||5005090|ALTRI DEB.V/IST.PREV.E SIC.SOC. +TSCONTI||||5005091|DEB.V/IST.PREV.ESIG.OLTRE ES.SUC +TSCONTI||||5200000|ALTRI DEBITI +TSCONTI||||5205000|ALTRI DEBITI +TSCONTI||||5205005|AMMINISTRATORI C/COMPENSI +TSCONTI||||5205010|SINDACI C/COMPENSI +TSCONTI||||5205015|NOTE CREDITO DA EMETTERE +TSCONTI||||5205020|CLIENTI C/CAUZIONI IMBALLAGGI +TSCONTI||||5205025|CLIENTI C/PREMI DA LIQUIDARE +TSCONTI||||5205040|DEBITI PER CAUZIONI +TSCONTI||||5205055|DIPENDENTI C/RETRIBUZIONI +TSCONTI||||5205060|DIPENDENTI C/FERIE DA LIQUID. +TSCONTI||||5205065|DIPENDENTI C/LIQUIDAZIONE +TSCONTI||||5205070|RITENUTE SINDACALI +TSCONTI||||5205075|RAPPRESENT. C/PROV. DA LIQUID. +TSCONTI||||5205080|COLLABORATORI C/COMPENSI +TSCONTI||||5205090|SOCI C/UTILI +TSCONTI||||5205100|AZIONISTI C/DIVIDENDI +TSCONTI||||5205110|SOCI C/LIQUIDAZIONI +TSCONTI||||5205120|SOCI C/RIMBORSI +TSCONTI||||5205150|DEBITI V/CASSA NAZ. E PREVID. +TSCONTI||||5205290|DEBITI DIVERSI +TSCONTI||||5205291|DEBITI DIV.ESIG.OLTRE ES.SUCC. +TSCONTI||||5400000|RATEI E RISCONTI PASSIVI +TSCONTI||||5405000|RATEI PASSIVI +TSCONTI||||5405005|RATEI PASSIVI +TSCONTI||||5410000|RISCONTI PASSIVI +TSCONTI||||5410005|RISCONTI PASSIVI +TSCONTI||||5415000|RICAVI ANTICIPATI +TSCONTI||||5415005|RICAVI ANTICIPATI +TSCONTI||||5420000|AGGIO SU PRESTITI +TSCONTI||||5420005|AGGIO SU PRESTITI +TSCONTI||||5425000|COMPENSI NON RISCOSSI-PROFESS. +TSCONTI||||5425005|COMPENSI NON RISCOSSI-PROFESS. +TSCONTI||||5500000|CONTI RIEPILOGATIVI PATRIMONIALI +TSCONTI||||5505000|CONTI RIEPILOGATIVI PATRIMONIALI +TSCONTI||||5505005|BILANCIO DI APERTURA +TSCONTI||||5505010|BILANCIO DI CHIUSURA +TSCONTI||||5505015|BILANCIO APERTURA EURO +TSCONTI||||5505020|BILANCIO CHIUSURA EURO +TSCONTI||||5510000|CONTI D'ORDINE +TSCONTI||||5510005|CONTO D'ORDINE "STANDARD" +TSCONTI||||5800000|RICAVI +TSCONTI||||5805000|RICAVI DELLE VENDITE +TSCONTI||||5805005|PRODOTTI FINITI C/VENDITE +TSCONTI||||5805010|MERCI C/VENDITE +TSCONTI||||5805015|IMBALLAGGI C/VENDITE +TSCONTI||||5805100|CORR.P/CESSIONE BENI-NO VENTILAZ +TSCONTI||||5805105|CORR.P/CESSIONE BENI-SI VENTILAZ +TSCONTI||||5805107|RICAVI C/CESSIONE BENI USATI +TSCONTI||||5805110|AGGI MONOPOLI, VALORI BOLLATI +TSCONTI||||5805111|RICAVI GENERI DI MONOPOLIO +TSCONTI||||5805115|RICAVI PER CESS. DI CARBURANTI +TSCONTI||||5805120|RICAVI P/CESSIONE GIOR.,RIV.,ECC +TSCONTI||||5805125|RICAVI PER CESSIONE LIBRI +TSCONTI||||5805130|CORRISP. C/VENDITE PROD. EDITOR. +TSCONTI||||5805133|VENDITE RICAR.BIGLIET.LOTTO,BOLL +TSCONTI||||5805135|RICAVI ATTIVITA' DI AGRITURISMO +TSCONTI||||5805190|RICAVI AGRIC.ATTIV.CONN.TASS.15% +TSCONTI||||5805195|RICAVI BENI/SERV. AGRIC.TASS.25% +TSCONTI||||5805200|RICAVI P/CORRISPETTIVI AGRICOLI +TSCONTI||||5805205|RIMB.SPESE RILEV. STUDI DI SETT. +TSCONTI||||5805210|AUTOCONSUMOoFINAL.ESTR.ALL'IMPR. +TSCONTI||||5805215|RESI SU VENDITE +TSCONTI||||5805220|SCONTI SU VENDITE +TSCONTI||||5805225|ABBUONI SU VENDITE +TSCONTI||||5805230|PREMI SU VENDITE +TSCONTI||||5805235|RICAVI IMPRESE MINIME +TSCONTI||||5805490|ALTRI RICAVI DELLE VENDITE +TSCONTI||||5810000|RICAVI DELLE PRESTAZ. - IMPRESE +TSCONTI||||5810005|RICAVI PER PRESTAZ. DI SERVIZI +TSCONTI||||5810010|CORRISPET. PER PRESTAZ. DI SERV. +TSCONTI||||5810015|LAVORAZIONI C/TERZI +TSCONTI||||5810020|PROVVIGIONI ATTIVE +TSCONTI||||5810025|NOLEGGI DI IMP. E MACCHINARI +TSCONTI||||5810100|RICAVI PER TRASP. CONTO TERZI +TSCONTI||||5810200|RICAVI IMMOB.STR.IMPRESE IMMOB. +TSCONTI||||5810210|RICAVI IMM.NO STR.IMP.IMM.CATAST +TSCONTI||||5810211|RICAVI IMMOB.NON STRUM.TASSATI +TSCONTI||||5810490|ALTRI RICAVI DELLE PRESTAZIONI +TSCONTI||||5815000|RICAVI DELLE PRESTAZ. - PROFESS. +TSCONTI||||5815005|COMP. PROFESS. PERCEPITI CON R/A +TSCONTI||||5815010|COMP. PROFESS. PERCEP. SENZA R/A +TSCONTI||||5815030|CONTRIBUTO 4% PERCEPITO +TSCONTI||||5815050|RISAR.ASSIC. P/PERD.RICAVI PROF. +TSCONTI||||5815051|PROVENTI P/INDEN. DI MATERNITA' +TSCONTI||||5815060|INTERESSI ATTIVI V/CLIENTI PROF. +TSCONTI||||5815490|ALTRI RICAVI PREST. DI PROFESS. +TSCONTI||||6000000|VAR.RIM,PROD.IN LAV.,SEM. E FINI +TSCONTI||||6005000|VAR.RIM.PROD.IN CORSO LAVORAZ. +TSCONTI||||6005005|PROD.IN CORSO DI LAV. C/ESIST.IN +TSCONTI||||6005010|PROD. IN CORSO DI LAV. C/R.F. +TSCONTI||||6010000|VAR. RIMANENZE SEMILAVORATI +TSCONTI||||6010005|SEMILAVORATI C/ESIST.INIZIALI +TSCONTI||||6010010|SEMILAVORATI C/RIM . FINALI +TSCONTI||||6015000|VAR. RIM. PRODOTTI FINITI +TSCONTI||||6015005|PROD.FIN.C/ESIST.INIZIALI +TSCONTI||||6015010|PRODOTTI FINITI C/RIM. FINALI +TSCONTI||||6100000|VAR. DEI LAVORI IN CORSO SU ORD. +TSCONTI||||6105000|VAR. DEI LAVORI IN CORSO SU ORD. +TSCONTI||||6105005|LAV.IN CORSOsuORD.C/R.I. <12MESI +TSCONTI||||6105010|LAV.IN CORSOsuORD.C/R.F. <12MESI +TSCONTI||||6105025|OP.E SER.ULTR.ESEC.C/R.I-V.RIC. +TSCONTI||||6105030|OP.E SER.ULTR.ESEC.C/R.F.-V.RIC. +TSCONTI||||6105035|OP.E SER.ULTR.ESEC.C/R.I.-V.COST +TSCONTI||||6105040|OP.E SER.ULTR.ESEC.C/R.F.-V.COST +TSCONTI||||6200000|INCREM.DI IMM. PER LAV. INTERNI +TSCONTI||||6205000|CAPIT.DEI COSTI - IMM. IMMAT. +TSCONTI||||6205005|CAPIT. DI COSTI DI IMM. IMMAT. +TSCONTI||||6205100|CAP.DI COS.IMM.IMM.NON RIL.IRAP +TSCONTI||||6210000|CAPIT. DEI COSTI - IMMOB. MAT. +TSCONTI||||6210005|COSTR. INTERNE DI IMM. MATERIALI +TSCONTI||||6210100|CAP.DI COS. IMM.MAT.NON RIL.IRAP +TSCONTI||||6400000|ALTRI RICAVI E PROVENTI +TSCONTI||||6405000|ALTRI RIC.E PROV.GEST.NON CARAT. +TSCONTI||||6405005|FITTI ATTIVI FABB. STRUMENTALI +TSCONTI||||6405006|FITTI ATT.FAB.NON STRUM.TAX CATA +TSCONTI||||6405007|FITTI ATTIVI FABBR.NON STRUM.TAS +TSCONTI||||6405010|FITTI ATTIVI TERRENI +TSCONTI||||6405015|PROV.IND.CES.RAP.AGEN.-SOG.IRPEF +TSCONTI||||6405016|PROV.IND.CES.RAP.AGEN.-SOG.IRES +TSCONTI||||6405045|RIS.DANNI BENI DEST. ALLA RIVEN. +TSCONTI||||6405050|ALTRI RISARCIMENTI DANNI +TSCONTI||||6405055|RIC.MENSA AZIEND.- GEST. INTERNA +TSCONTI||||6405100|ABBUONI/ARROTONDAMENTI ATTIVI +TSCONTI||||6405101|SCONTI ATTIVI +TSCONTI||||6405105|PLUSV. ORD. DA RATEIZZARE +TSCONTI||||6405106|PLUSV. ORDIN. NON RATEIZZABILI +TSCONTI||||6405110|PLUSVALENZE NON TASSABILI +TSCONTI||||6405115|SOPRAVVENIENZE ORDINARIE ATTIVE +TSCONTI||||6405116|SOPRAVV. ORD. ATTIVE NON TASSAB. +TSCONTI||||6405117|SOPR.ORD.ATT.DA RATEIZ.ART.88C3B +TSCONTI||||6405120|RIMBORSI SPESE NON RILEV.STUDI +TSCONTI||||6405125|RECUP.ONERI DIP.DISTACC.c/oTERZI +TSCONTI||||6405130|RECUP.COMP.AMM.DALLE SOC.DI APP. +TSCONTI||||6405145|CANONI ATT.P/AFFIT.AZIEN. O RAMO +TSCONTI||||6405150|OMAGGI DA FORNITORI +TSCONTI||||6405155|PROVENTI PER LIBERALITA' +TSCONTI||||6405160|PROV.DA PARTECIP. A FONDI COMUNI +TSCONTI||||6405165|PROV.DA ATT. FIN.NON IMMOBILIZ. +TSCONTI||||6405170|PROV.DA ROYAL.,BREVETTI,MARCHI +TSCONTI||||6405390|ALTRI RICAVI E PROVENTI VARI +TSCONTI||||6410000|CONTRIBUTO IN CONTO ESERCIZIO +TSCONTI||||6410005|CONTR.C/ESERC.DA ENTI PUBBLICI +TSCONTI||||6410010|CONTR.C/ESERC.PER CONTRATTO +TSCONTI||||6410015|CONTRIB. C/ESERC.NON TASS.IRAP +TSCONTI||||6410020|CONT.P/ONERI SOC.E P/COSTO PERS. +TSCONTI||||6410025|CONT.C/CRED.D'IMP.TASSABILI +TSCONTI||||6410035|CONT.PER CRED.D'IMP.AUTOTRASP. +TSCONTI||||6410036|CONTRIBUTI CARBON TAX-AUTOTRASP. +TSCONTI||||6410037|CONTR.CARO PETROLI AUTOTRASPORT. +TSCONTI||||6410090|CONTR.C/CRED.D'IMP.NON TASSABILI +TSCONTI||||6410091|CONT.C/CRED.D'IMP.NON TASS.IRAP +TSCONTI||||6410092|CONT.ESENTI IRPEF/IRES TAS.IRAP +TSCONTI||||6415000|CONTRIBUTI IN CONTO CAPITALE +TSCONTI||||6415005|CONTRIBUTI IN C/CAPITALE +TSCONTI||||6415006|CONTRIBUTI C/CAPITALE NON TASSAB +TSCONTI||||6415015|CONTR.C/CAP.NON INCASSATI +TSCONTI||||6415020|CONTR. C/CAP.RATEIZZABILI +TSCONTI||||6415025|CONTRIBUTI C/IMPIANTI +TSCONTI||||6415026|CONTRIBUTI C/IMPIANTI NON TASSAB +TSCONTI||||6600000|COSTI P/MAT.PRI,SUSS.,CON.E MER. +TSCONTI||||6605000|MATERIE PRIME +TSCONTI||||6605005|MATERIE PRIME C/ACQUISTI +TSCONTI||||6605006|MATERIE PRIME C/ACQ.P/PROD.SERV. +TSCONTI||||6605010|RESI SU ACQUISTI - MATERIE PRIME +TSCONTI||||6605015|SCONTI/ABBUONI ACQ.MATERIE PRIME +TSCONTI||||6605020|PREMI SU ACQUISTI-MATERIE PRIME +TSCONTI||||6610000|MATERIE SUSSIDIARIE +TSCONTI||||6610005|MATERIE SUSS. C/ACQUISTI +TSCONTI||||6610010|RESI SU ACQUISTI - MATER.SUSSID. +TSCONTI||||6610015|SCONTI/ABBUONI ACQ.MATER.SUSSID. +TSCONTI||||6610020|PREMI SU ACQUISTI-MATER.SUSSID. +TSCONTI||||6615000|SEMILAVORATI E COMPONENTI +TSCONTI||||6615005|SEMILAVORATI C/ACQUISTI +TSCONTI||||6615010|RESI SU ACQUISTI DI SEMILAVORATI +TSCONTI||||6615015|SCONTI/ABBUONI ACQ.SEMILAVORATI +TSCONTI||||6615020|PREMI SU ACQUISTI-SEMILAVORATI +TSCONTI||||6615025|COMPONENTI C/ACQUISTI +TSCONTI||||6615030|RESI SU ACQUISTI DI COMPONENTI +TSCONTI||||6615035|SCONTI/ABBUONI SU ACQ.COMPONENTI +TSCONTI||||6615040|PREMI SU ACQUISTI DI COMPONENTI +TSCONTI||||6620000|MATERIE DI CONSUMO +TSCONTI||||6620005|MATERIE DI CONSUMO C/ACQUISTI +TSCONTI||||6620010|RESI SU ACQUISTI.MATER.CONSUMO +TSCONTI||||6620015|SCONTI/ABBUONI ACQ.MATERIE CONS. +TSCONTI||||6620020|PREMI SU ACQUISTI MATER.CONSUMO +TSCONTI||||6625000|MERCI +TSCONTI||||6625005|MERCI C/ACQUISTI +TSCONTI||||6625006|MERCI C/ACQUISTI P/PROD.SERV. +TSCONTI||||6625010|MERCI C/ACQUISTI - CARBURANTI +TSCONTI||||6625015|MERCI C/ACQUISTI - LIBRI E GIOR. +TSCONTI||||6625016|MERCI C/ACQU.-GENERI MONOPOLIO +TSCONTI||||6625018|ACQUISTI RICAR.BIGLIET.LOTTO,BOL +TSCONTI||||6625020|MERCI C/ACQ. - AGRICOLTORI +TSCONTI||||6625025|MERCI C/ACQ.-ATTIV. DI AGRITUR. +TSCONTI||||6625030|RESI SU ACQUISTI DI MERCI +TSCONTI||||6625035|SCONTI/ABBUONI ACQUISTI MERCI +TSCONTI||||6625040|PREMI SU ACQUISTI DI MERCI +TSCONTI||||6630000|ALTRI ACQUISTI +TSCONTI||||6630005|MATERIALI DI MANUTENZIONE +TSCONTI||||6630010|IMBALLAGGI C/ACQUISTI +TSCONTI||||6630015|MATERIALE DI PULIZIA +TSCONTI||||6630020|COMBUSTIB. PER RISCALDAMENTO +TSCONTI||||6630025|CANCELLERIA +TSCONTI||||6630030|MATERIALE PUBBLICITARIO +TSCONTI||||6630035|CARBURANTI E LUBRIFICANTI +TSCONTI||||6630036|CARB.E LUB.AUTOTR.C/TERZI E TASS +TSCONTI||||6630037|CARBURANTI E LUBRIFICANTI INDED. +TSCONTI||||6630038|CARB. E LUBR. AGENTI E RAPPR. +TSCONTI||||6630045|INDUMENTI DI LAVORO +TSCONTI||||6630050|PROD.P/MENSA AZIEND.(GEST.INTER) +TSCONTI||||6630055|SPESE ACCES.SU ACQUIS.(NO STUDI) +TSCONTI||||6630060|ACQUISTI BENI COSTO UNIT.<516,46 +TSCONTI||||6630070|ACQ. AGRICOLT. REDD. IMPRESA +TSCONTI||||6630080|ACQ. AGRITUR. DEST. ALLA PROD. +TSCONTI||||6630100|COSTI P/BENI-PAR.FISC.ART.110C10 +TSCONTI||||6630110|COSTI P/BENI-PAR.FISC.ART.110C11 +TSCONTI||||6630490|ALTRI ACQUISTI (NO STUDI) +TSCONTI||||6630491|ALTRI ACQUISTI INDEDUCIBILI +TSCONTI||||6635000|ACQUISTI PROFESSIONISTI +TSCONTI||||6635005|CARB.E LUBR.CICLOM.MOTO.PROF.75% +TSCONTI||||6635010|CARB.E LUBRIF.AUTO PROF. IND.75% +TSCONTI||||6635090|PROD. C/ACQUISTI - PROFESS. +TSCONTI||||6635095|RESI SU ACQUISTI-PROFESSIONISTI +TSCONTI||||6800000|COSTI PER SERVIZI +TSCONTI||||6805000|COSTI PER SERVIZI +TSCONTI||||6805005|TRASPORTI SU ACQUISTI +TSCONTI||||6805006|TRASPORTI SU VENDITE +TSCONTI||||6805015|DAZI SU ACQUISTI +TSCONTI||||6805020|LAVOR.DI TERZI P/PROD.DI BENI +TSCONTI||||6805021|LAVORAZ.DI TERZI P/PROD.SERVIZI +TSCONTI||||6805025|ENERGIA ELETTRICA +TSCONTI||||6805026|ENERGIA ELETTRICA (INDED.50%) +TSCONTI||||6805030|FORZA MOTRICE +TSCONTI||||6805035|GAS CUCINA +TSCONTI||||6805040|GAS RISCALDAMENTO +TSCONTI||||6805045|ACQUA +TSCONTI||||6805048|SPESE IMMOBILI USO PROMISCUO +TSCONTI||||6805050|SPESE CONDOMINIALI +TSCONTI||||6805052|CANONE DI MANUTENZIONE PERIODICA +TSCONTI||||6805055|MANUT. E RIPARAZ. BENI PROPRI +TSCONTI||||6805056|MAN.E RIP.AUTOM.AUTOTRASP. C/T. +TSCONTI||||6805057|MAN. E RIP. AUTOMEZZI INDED. +TSCONTI||||6805058|MAN.E RIP.AGENTI/RAPPR.(IND.20%) +TSCONTI||||6805059|MAN.E RIP.FABB.NON STRUM.INDEDUC +TSCONTI||||6805060|MAN.E RIP. FABBR.nonSTRUM.SFITTI +TSCONTI||||6805061|MAN.E RIP.FABBR.NON STRUM.DED. +TSCONTI||||6805062|MAN.FABBR.NON STR.DED.IMPR.IMMOB +TSCONTI||||6805070|UTENZE FABB. NON STRUMENTALI +TSCONTI||||6805071|UTENZE FABBR.NON STRUM.SFITTI +TSCONTI||||6805075|MAN. E RIP. BENI DI TERZI +TSCONTI||||6805076|MAN.E RIP.BENI TERZI AGENTI/RAPP +TSCONTI||||6805077|MAN.E RIP.BENI DI TERZI INDED. +TSCONTI||||6805080|PEDAGGI AUTOSTRADALI +TSCONTI||||6805081|PEDAGGI AUTOSTR. TRASP. C/TERZI +TSCONTI||||6805085|PEDAGGI AUTOSTRAD.AGENTI E RAPP. +TSCONTI||||6805090|PEDAGGI AUTOSTRADALI INDED. +TSCONTI||||6805095|ALTRI ONERI P/AUTOMEZZI +TSCONTI||||6805100|ALTRI ONERI P/AUTO AGENTI/RAPPR. +TSCONTI||||6805105|ALTRI ONERI P/AUTOMEZ. INDED. +TSCONTI||||6805110|ASSICURAZIONI R.C.A. +TSCONTI||||6805115|ASSIC.RCA AGENTI/RAPPR.(IND.20%) +TSCONTI||||6805120|ASSICURAZIONI R.C.A. INDED. +TSCONTI||||6805125|ASSICURAZ. NON OBBLIGATORIE +TSCONTI||||6805127|PREMI INAIL SOCI/TITOLARE +TSCONTI||||6805130|VIGILANZA +TSCONTI||||6805132|SERVIZI DI PULIZIA +TSCONTI||||6805135|COMP.AMMINIST.PROF.(SOCIsnc-sas) +TSCONTI||||6805136|COMP.AMMINIST.PROF.(SOCIspa-srl) +TSCONTI||||6805140|COMP.AMM.-CO.CO.CO.(SOCIsnc-sas) +TSCONTI||||6805150|COMP.AMM.-CO.CO.CO.(SOCIspa-srl) +TSCONTI||||6805155|COMPENSI AMMIN. (NON PAGATI) +TSCONTI||||6805160|COMPENSI SINDACI-PROFESSIONISTI +TSCONTI||||6805165|COMPENSI SINDACI-COLL.COOR.CONT. +TSCONTI||||6805170|COMP.COLL.COORD.ATTIN.ATTIVITA' +TSCONTI||||6805175|COMP.COLL.COORD.NON ATTIN.ATTIV. +TSCONTI||||6805180|CO.CO.PRO.ATTIN.COOP.ED.P.IND. +TSCONTI||||6805181|CO.CO.PRO.NON ATT.COOP.ED.P.IND. +TSCONTI||||6805184|COMPENSI LAV.OCCAS.ATTIN.ATTIV. +TSCONTI||||6805185|COMP.LAV.OCCAS.(IND.IRAP)NO IMPR +TSCONTI||||6805190|COMP.LAV.OCC.ATTIN.COOP ED.P.IND +TSCONTI||||6805191|COMP.LAV.OCC.NON ATT.COOP ED.P.I +TSCONTI||||6805192|COMPENSI OCCAS.IMPRESA PROD.BENI +TSCONTI||||6805193|COMPENSI OCCAS.IMPRESA PROD.SERV +TSCONTI||||6805194|COMPENSI OCCAS.IMPRESA SERV.AMM. +TSCONTI||||6805195|COMPENSI OCCAS.IMPRESA NON ATTIN +TSCONTI||||6805198|CONT.INPS AMM-CO.CO.CO.(snc-sas) +TSCONTI||||6805199|CONT.INPS AMM-CO.CO.CO.(spa-srl) +TSCONTI||||6805200|CONTR.INPS COLLAB. ATTIN.ATT. +TSCONTI||||6805205|CONTR.INPS COLLAB. NON ATTIN.AT +TSCONTI||||6805210|CONTR.INAIL COLLABOR. ATTIN.ATT. +TSCONTI||||6805215|CONTR.INAIL COLLAB.NON ATT.ATTIV +TSCONTI||||6805220|RIMB.PIE'LISTA ATTIN.ATT.CO.CO. +TSCONTI||||6805225|RIMB.PIE'LISTA NON ATT.AT.CO.CO. +TSCONTI||||6805230|RIMB.IND.CHILOM.ATTIN.ATT.CO.CO. +TSCONTI||||6805235|RIM.IND.CHIL.NON ATTIN.ATT.CO.CO +TSCONTI||||6805240|RIMB.FORF.ATTINENTI L'ATT.CO.CO. +TSCONTI||||6805245|RIM.FORF.NON ATTIN.ATT.CO.CO. +TSCONTI||||6805255|COSTO P/TRASFERTE NON DED. +TSCONTI||||6805261|COMP.PROF. ATTINENTI ATTIVITA' +TSCONTI||||6805265|COMP.PROF.NON ATTIN.L'ATT. +TSCONTI||||6805270|COMP.ASS.PART.SOLO LAV.(SEMPLIF) +TSCONTI||||6805271|CONTR.INPS ASS.PART.SOLO LAVORO +TSCONTI||||6805272|SOMMINISTR.LAVORO ECCED.ONERI +TSCONTI||||6805273|SOMMIN.LAV.ECC.ONERI-COOP.ED.P.I +TSCONTI||||6805275|SPESE PER ANALISI,PROVE E LABOR. +TSCONTI||||6805280|PROVVIGIONI A INTERMEDIARI +TSCONTI||||6805285|CONTRIBUTO ENASARCO, FIRR +TSCONTI||||6805286|INDENNITA' SUPPLETTIVAdiCLIENTEL +TSCONTI||||6805290|PUBBLICITA' +TSCONTI||||6805295|PUBBLICITA' DA RATEIZ.IN 5 QUOTE +TSCONTI||||6805300|MOSTRE E FIERE +TSCONTI||||6805305|SP.RECUP.CREDITI E CONTENZIOSO +TSCONTI||||6805310|SPESE LEGALI +TSCONTI||||6805315|SPESE TELEF.-IMPIANTI AUTOTRASP. +TSCONTI||||6805320|SPESE TELEFONICHE DEDUCIBILI +TSCONTI||||6805325|SPESE CELLULARI +TSCONTI||||6805330|SPESE POSTALI E DI AFFRANCATURA +TSCONTI||||6805335|SPESE DI RAPPRESENTANZA +TSCONTI||||6805340|SP.RAPPRES.-OMAGGI <25,82 EURO +TSCONTI||||6805345|PASTI E SOGGIORNI +TSCONTI||||6805346|SPESE PER VIAGGI +TSCONTI||||6805350|MENSA AZ.APPALTATAeBUONI PASTO +TSCONTI||||6805355|RICERCA,ADDESTRAM.E FORMAZIONE +TSCONTI||||6805360|SPESE PER STUDI E RICERCHE +TSCONTI||||6805361|SP. PER STUDI/RICERCHE RATEIZZAB +TSCONTI||||6805365|SERVIZIO SMALTIMENTO RIFIUTI +TSCONTI||||6805370|ONERI BANCARI +TSCONTI||||6805375|FORMALITA' AMMINISTRATIVE +TSCONTI||||6805380|ONERI DI FACTORING +TSCONTI||||6805385|TENUTA PAGHE,CONT.DICH.DA IMPRES +TSCONTI||||6805386|TEN.PAGHE,CONT.,DICH.DA LAV.AUT. +TSCONTI||||6805390|SIAE PER DISCOT.E SALE DA BALLO +TSCONTI||||6805391|SIAE P/ATT.DIVER.DA DISCO.E SALE +TSCONTI||||6805395|COSTI PER SERV.-ATTIV.DI AGRIT. +TSCONTI||||6805400|COSTI PER SERV.-ATTIV.AGRICOLA +TSCONTI||||6805401|COSTI P/SERV.PAR-FISC.ART.110C10 +TSCONTI||||6805402|COSTI P/SERV.PAR-FISC.ART.110C11 +TSCONTI||||6805404|ACQUISTI SERVIZI P/PRODUZ.BENI +TSCONTI||||6805405|ALTRI COSTI P/PRODUZIONE SERVIZI +TSCONTI||||6805406|ALTRI COSTI P/SERV.RILEV. STUDI +TSCONTI||||6805407|ALTRI COSTI P/SERV. NO STUDI +TSCONTI||||6805490|ALTRI SERVIZI DEDUCIBILI +TSCONTI||||6805491|ALTRI SERVIZI INDEDUCIBILI +TSCONTI||||6810000|SPESE PER SERV.-PROFESSIONISTI +TSCONTI||||6810005|MAN.E RIP ORDIN.FABBR.-PROFES. +TSCONTI||||6810010|SPESE RELATIVE IMMOBILI USO PROM +TSCONTI||||6810015|COMP.A TERZI NON AFFER.L'ATTIVIT +TSCONTI||||6810020|COMP.A TER.P/PREST.AFF.PROP.ATT. +TSCONTI||||6810025|ASSIC. R.C. PROFESSIONALI +TSCONTI||||6810030|QUOTA SP.P/ATT.IN STRUTT.POLIF. +TSCONTI||||6810035|QUOTA SPESE UTIL.STRUT.DI TERZI +TSCONTI||||6810040|QUOTA SPESE DI SEGRETERIA +TSCONTI||||6810045|SPESE AGG. E MANUT. SOFTWARE +TSCONTI||||6810050|SPESE ACQ.OGGETTI D'ARTE-PROFES. +TSCONTI||||6810055|SPESE DI RAPP.-PROFESSIONISTI +TSCONTI||||6810060|MANUT.E RIPAR.AUTO PROF.IND.75% +TSCONTI||||6810063|MAN.RIPAR.BENI TERZI PROF.IND.75 +TSCONTI||||6810066|PEDAGGI AUTOSTR.PROF.INDED.75% +TSCONTI||||6810069|ALTRI ONERI AUTOM. PROF.IND.75% +TSCONTI||||6810072|ASSICURAZIONI RCA PROF. IND.75% +TSCONTI||||6810090|ALTRE SPESE SERV.DED.-PROFES. +TSCONTI||||6810091|ALTRE SPESE SERV.IND.-PROFESS. +TSCONTI||||7000000|COSTI P/GODIMENTO BENI DI TERZI +TSCONTI||||7005000|AFFITTI E LOCAZIONI +TSCONTI||||7005010|FITTI PASSIVI (BENI IMMOBILI) +TSCONTI||||7005100|NOL.IMP.E MACCH.CANONI AFF.D'AZ. +TSCONTI||||7005101|NOLEGGIO DEDUCIBILE +TSCONTI||||7005102|NOLEGGIO INDEDUCIBILE +TSCONTI||||7010000|LEASING +TSCONTI||||7010005|CANONI DI LEASING BENI MOB. DED. +TSCONTI||||7010006|CANONI DI LEASING BENI MOB. IND. +TSCONTI||||7010015|CAN.LEAS.QUO.INT.BEN.MOB.IND IRA +TSCONTI||||7010020|CAN.DI LEAS.BENI IMMOB.DEDUCIB. +TSCONTI||||7010021|CAN.LEAS.QUO.INT.BEN.IMM.IND IRA +TSCONTI||||7010022|CANONI DI LEASING BENI IMMOB.IND +TSCONTI||||7020000|LEASING FABBRIC.-PROFESSIONISTI +TSCONTI||||7020005|CAN.LEAS.FABB.UFF.15.06.90-PROF. +TSCONTI||||7025000|ALTRI COST.PER GOD.BENI DI TERZI +TSCONTI||||7025005|ROYALTIES,DIR.D'AUT.BREV.(NO STU +TSCONTI||||7025006|ROYALTIES DIR.D'AUT.BREV(SI STUD +TSCONTI||||7025010|LIC. D'USO SOFTWARE DI ESERCIZIO +TSCONTI||||7025090|ALTRI COSTI P/GOD.BENI TERZI DED +TSCONTI||||7025091|ALTRI COSTI P/GOD.BENI TERZI IND +TSCONTI||||7200000|COSTI PER IL PERSONALE +TSCONTI||||7205000|SALARI E STIPENDI +TSCONTI||||7205010|SALARI E STIPENDI +TSCONTI||||7205020|SAL.E STIP.PERS.CONTR.INSERIMEN. +TSCONTI||||7205030|SAL. E STIP.APPREND.E DISABILI +TSCONTI||||7205050|SOMMINISTRAZIONE LAVORO +TSCONTI||||7205060|TRANSAZIONI CON DIPENDENTI +TSCONTI||||7205065|SUSSIDI OCCASIONALI +TSCONTI||||7205070|PERS.DIST.-IMP.DISTACCATARIA +TSCONTI||||7205075|TRASFERTE INDEDUCIBILI +TSCONTI||||7205080|RIMB. A PIE'DI LISTA DIPENDENTI +TSCONTI||||7205081|RIMBORSI INDENN.TRASF.AUTOTRASP. +TSCONTI||||7205085|RIMB.INDENNITA' CHILOMETRICHE +TSCONTI||||7205090|RIMB.IND.TA' FORF.IN BUSTA PAGA +TSCONTI||||7210000|SAL.STIP.COOP.ED.E CONS.GAR.FIDI +TSCONTI||||7210010|SALARI E STIP.COOP.ED.PR.INDIV. +TSCONTI||||7210020|SAL.E STIP.CONTR.INSER.COOP.ED. +TSCONTI||||7210030|RETRIB.APPR/DISAB.-CONS.GAR.FIDI +TSCONTI||||7210050|SOMMIN.LAVORO-COOP.ED.P.IND. +TSCONTI||||7210060|TRANSAZ. CON DIP.CONS.GAR FIDI +TSCONTI||||7210065|SUSSIDI OCCAS.COOP.ED.P.IND. +TSCONTI||||7210070|PERS.DISTACCATO-COOP.ED.P.IND. +TSCONTI||||7210075|TRASFERTE INDED.COOP ED.P.IND. +TSCONTI||||7210080|RIMB.PIE'LISTA DIP.COOP.ED.P.IND +TSCONTI||||7210085|RIMBORSI INDEN.CHIL.COOP.ED.P.IN +TSCONTI||||7210090|RIMB.INDEN.FORF.IN BUSTA COOP.ED +TSCONTI||||7215000|ONERI SOCIALI +TSCONTI||||7215005|ONERI SOCIALI INPS +TSCONTI||||7215010|ONERI SOC.INPS PERS.CONTR.INSER. +TSCONTI||||7215020|ONERI SOCIALI INPS APPR.E DISAB. +TSCONTI||||7215025|ONERI SOCIALI INAIL +TSCONTI||||7215030|ONERI SOC.INAIL PERS.CONTR.INSER +TSCONTI||||7215040|ONERI SOC.INAIL APP.E DISABILI +TSCONTI||||7215050|ONERI SOCIALI CASSA EDILE +TSCONTI||||7215055|ONERI SOC.CASSA ED.PERS.CONT.INS +TSCONTI||||7215060|ONERI SOC.CASSA ED.APP.E DISAB. +TSCONTI||||7215065|ONERI SOCIALI ENPALS +TSCONTI||||7215066|ONERI SOC.ENPALS PERS.CONTR.INS. +TSCONTI||||7215067|ONERI SOC. ENPALS APPREN./DISAB. +TSCONTI||||7215090|ALTRI ONERI SOCIALI +TSCONTI||||7215091|ALTRI ONERI SOC.PERS.CONTR.INSER +TSCONTI||||7215092|ALTRI ONERI SOC. APPREN./DISAB. +TSCONTI||||7220000|TRATTAMENTO FINE RAPPORTO +TSCONTI||||7220005|TFR ACCANTONATO +TSCONTI||||7220010|TFR ACCANT.PERS.CONTR.INSERIM. +TSCONTI||||7220020|TFR ACC. APPREND. E DISAB. +TSCONTI||||7225000|TRATTAMENTO DI QUIESC.E SIMILI +TSCONTI||||7225005|ACC.TO F.DO TRAT.QUIES.PREV.INT. +TSCONTI||||7225020|ACC.P/CES.RAP.COLL.COORD.ATTIN.A +TSCONTI||||7225021|ACC.P/CESS.COLL.COORD.NON ATT.AT +TSCONTI||||7225025|ACC.TO AL F.DO INDEN.SUPP.CLIEN. +TSCONTI||||7230000|ALTRI COSTI DEL PERSONALE +TSCONTI||||7230010|ALTRI COSTI DEL PERSONALE +TSCONTI||||7230015|COSTI DEL PERS.-ATT.DI AGRIT. +TSCONTI||||7230017|COSTI DEL PERS.-ATT.AGRICOLA +TSCONTI||||7230020|ALTRI COSTI DEL PERS.CONTR.INSER +TSCONTI||||7230040|ALTRI COSTI PERS. APPREND.E DIS. +TSCONTI||||7230045|COSTI SOST.P/GENER. DEI DIPEND. +TSCONTI||||7230048|COSTI P/GENERALITA' DIP. INDED. +TSCONTI||||7400000|AMM.TI IMM. IMMATERIALI +TSCONTI||||7405000|AMM.TO COSTI D'IMP. E AMPLIAM. +TSCONTI||||7405005|AMM.TO COSTI D'IMPIANTO +TSCONTI||||7405010|AMM.TO COSTI DI AMPLIAMENTO +TSCONTI||||7410000|AMM.TO COSTI RIC. SVIL. PUBBL. +TSCONTI||||7410005|AMM.TO COSTI RIC. SVIL. PUBBL. +TSCONTI||||7415000|AMM.TO DIR.BREV.E UTIL.OP.ING. +TSCONTI||||7415005|AMM.TO DIRITTI DI BREVETTO +TSCONTI||||7415010|AMM.TO DIR.DI UTIL.DELLE OP.ING. +TSCONTI||||7415015|AMM.TO LIC.USO SOFT.A TEMP.IND. +TSCONTI||||7420000|AMM.TO CONCESS.,LICENZE,MARCHI +TSCONTI||||7420005|AMM.TO CONC.,LIC.E DIRITTI SIM. +TSCONTI||||7420010|AMM.TO MARCHI DI FABB.E DI COMM. +TSCONTI||||7420015|AMM.TO LIC.USO SOFT.A TEMP.DET. +TSCONTI||||7425000|AMM.TO AVVIAMENTO +TSCONTI||||7425005|AMM.TO AVVIAMENTO +TSCONTI||||7425010|AMM.TO AVVIAM. INDEDUCIBILE +TSCONTI||||7435000|AMM.TO ALTRE IMM.IMMATERIALI +TSCONTI||||7435005|AMM.LAV. STRAORD.BENI DI TERZI +TSCONTI||||7435010|AMM.TO MANUT.STRAORD.-PROFESS. +TSCONTI||||7435015|AMM.TO ALT.COS.AD UT.PLUR.DA AMM +TSCONTI||||7440000|AMM.TO IMM. IMMAT. INDEDUCIBILI +TSCONTI||||7440005|AMM.TO IMM. IMMAT. INDEDUCIBILE +TSCONTI||||7500000|AMM.TO IMM. MAT. - ORDINARIO +TSCONTI||||7505000|AMM.TO FABBRICATI +TSCONTI||||7505006|AMM.TO ORDIN.TERRENI DEDUCIBILI +TSCONTI||||7505007|AMM.TO ORDIN. TERRENI INDEDUCIB. +TSCONTI||||7505010|AMM.TO ORD.FABBRICATI CIVILI +TSCONTI||||7505011|AMM.TO ORD.FABB.CIVILI INDED. +TSCONTI||||7505012|AMM.TO ORD.FABBR.CIV.DED.IRAP +TSCONTI||||7505015|AMM.TO ORD.FABB.IND.LI E COM. +TSCONTI||||7505016|AMM.TO ORD.FABB.IND.LI E COM.IND +TSCONTI||||7505020|AMM.TO ORD. COST.LEGG. +TSCONTI||||7505021|AMM.TO ORD.COST.LEGG.INDED. +TSCONTI||||7505025|AMM.TO FAB.US.UF.ACQ.ANTE15.6.90 +TSCONTI||||7510000|AMM.TO IMPIANTI E MACCHINARIO +TSCONTI||||7510005|AMM.TO ORD.IMP.GEN. +TSCONTI||||7510006|AMM.TO ORD.IMP. GENERICI INDED. +TSCONTI||||7510010|AMM.TO ORD. IMP. SPEC. +TSCONTI||||7510011|AMM.TO ORD.IMP. SPEC. INDED. +TSCONTI||||7510015|AMM.TO ORD. MACC. +TSCONTI||||7510016|AMM.TO ORD. MACC. INDEDUCIB. +TSCONTI||||7515000|AMM.TO ATTREZ. IND.LI E COMM.LI +TSCONTI||||7515005|AMM.TO ORD.ATT.IND.LI E COMM. +TSCONTI||||7515006|AMM.TO ORD.ATT.IND.LI E COM.IND. +TSCONTI||||7515010|AMM.TO ORD.ATTR.VAR.E MIN. +TSCONTI||||7515011|AMM.TO ORD.ATTR.VAR.E MIN.IND. +TSCONTI||||7520000|AMM.TO MOBILI E MACCHINE D'UFF. +TSCONTI||||7520005|AMM.TO ORD.MOB.E MAC.ORD.UF. +TSCONTI||||7520006|AMM.TO ORD.MOB.E MAC.ORD.UF.IND. +TSCONTI||||7520010|AMM.TO ORD.MAC.ELETTROM.UF. +TSCONTI||||7520011|AMM.TO ORD.MAC.ELETTR.UF.INDED. +TSCONTI||||7525000|AMM.TO AUTOMEZZI (ALTRI BENI) +TSCONTI||||7525015|AMM.TO ORD.AUTOCARRI/AUTOVET. +TSCONTI||||7525016|AMM.TO AUTOCARRI/AUTOVETTURE IND +TSCONTI||||7525020|AMM.TO ORD.AUTO AGENTI/RAPPR. +TSCONTI||||7525021|AMM.TO AUTO AGENTI/RAPPRES. IND. +TSCONTI||||7525025|AMM.TO ORD. AUTOVETTURE +TSCONTI||||7525026|AMM.TO AUTOVETTURE IND. +TSCONTI||||7525030|AMM.TO ORD.MOTO AGENTI/RAPPR. +TSCONTI||||7525031|AMM.TO MOTO AGENTI/RAPPR. IND. +TSCONTI||||7525035|AMM.TO ORD. MOTOVEICOLI +TSCONTI||||7525036|AMM.TO MOTOVEICOLI INDED. +TSCONTI||||7530000|AMM.TO ALTRI BENI +TSCONTI||||7530040|AMM.TO ORD.ARREDAMENTO +TSCONTI||||7530041|AMM.TO ORD. ARREDAMENTO INDED. +TSCONTI||||7530045|AMM.TO ORD. STIGLIATURA +TSCONTI||||7530046|AMM.TO ORD. STIGLIATURA IND. +TSCONTI||||7530050|AMM.TO ORD.IMBALL.DUREV. +TSCONTI||||7530051|AMM.TO ORD.IMBALLAGGI DUR. INDED +TSCONTI||||7530055|AMM.TO ORD.NAVI (art. 8Bis) +TSCONTI||||7530056|AMM.TO ORD.NAVI (art. 8Bis) IND. +TSCONTI||||7530060|AMM.TO ORD. BIANCHERIA +TSCONTI||||7530061|AMM.TO ORD.BIANCHERIA INDED. +TSCONTI||||7530100|AMM.TO ORD. ALTRI BENI +TSCONTI||||7530101|AMM.TO ORD. ALTRI BENI INDED. +TSCONTI||||7600000|AMM.TI ANTICIP.IMM. MATERIALI +TSCONTI||||7605000|AMM.TO ANTICIPATO FABBRICATI +TSCONTI||||7605010|AMM.TO ANTICIP. FABB. CIV. DED. +TSCONTI||||7605011|AMM.TO ANTIC. FABB. CIVILI IND. +TSCONTI||||7605015|AMM.TO ANT.FAB.IND.E COM.LI DED. +TSCONTI||||7605016|AMM.TO ANT. FAB.IND.E COMM.IND. +TSCONTI||||7605020|AMM.TO ANT. COST.LEGG.DEDUC. +TSCONTI||||7605021|AMM.TO ANTICIP. COST.LEGG.IND. +TSCONTI||||7610000|AMM.TO ANT. IMP. E MACCHINARIO +TSCONTI||||7610005|AMM.TO ANTIC.IMPIANTI GENER.DED. +TSCONTI||||7610006|AMM.TO ANTIC.IMPIANTI GEN. IND. +TSCONTI||||7610010|AMM.TO ANTIC.IMPIANTI SPEC.DED. +TSCONTI||||7610011|AMM.TO ANTICIP. IMP.SPEC.INDED. +TSCONTI||||7610015|AMM.TO ANTICIP. MACC. DEDUC. +TSCONTI||||7610016|AMM.TO ANTICIP. MACCHIN.INDED. +TSCONTI||||7615000|AMM.TO ANT.ATTR.IND.LI E COMM.LI +TSCONTI||||7615005|AMM.TO ANT.ATTREZ.IND.E COMM.DED +TSCONTI||||7615006|AMM.TO ANT.ATT.IND.E COMM.INDED. +TSCONTI||||7615010|AMM.TO ANTIC.AT.VAR.E MIN.DED. +TSCONTI||||7615011|AMM.TO ANTIC.AT.VARIE E MIN.IND. +TSCONTI||||7620000|AMM.TO ANT.TO MOBILI E MACCH.UFF +TSCONTI||||7620005|AMM.TO ANT.MOB.E MAC.ORD.UF.DED. +TSCONTI||||7620006|AMM.TO ANT.MOB.E MAC.ORD.UF.IND. +TSCONTI||||7620010|AMM.TO ANT.MAC.ELETR.UFF.DED +TSCONTI||||7620011|AMM.TO ANT.MAC.ELETTR.UFF.IND. +TSCONTI||||7625000|AMM.TO ANT.AUTOMEZ. (ALTRI BENI) +TSCONTI||||7625015|AMM.TO ANT.TO AUTOCARRI/AUTOVET. +TSCONTI||||7625020|AMM.TO ANT.AUTO AGENTI/RAPPR. +TSCONTI||||7625025|AMM.TO ANT.TO AUTOVETTURE +TSCONTI||||7625030|AMM.TO ANT.MOTO AGENTI/RAPPR. +TSCONTI||||7625035|AMM.TO ANT.TO MOTOVEICOLI +TSCONTI||||7630000|AMM.TO ANT.TO ALTRI BENI +TSCONTI||||7630040|AMM.TO ANT.TO ARREDAMENTO DED. +TSCONTI||||7630041|AMM.TO ANT.TO ARREDAMENTO INDED. +TSCONTI||||7630045|AMM.TO ANT.TO STIGLIATURA DED. +TSCONTI||||7630046|AMM.TO ANT.TO STIGLIATURA INDED. +TSCONTI||||7630050|AMM.TO ANT. IMBALL.DUREVOLI DED. +TSCONTI||||7630051|AMM.TO ANT.IMBALL.DUREVOLI INDED +TSCONTI||||7630055|AMM.TO ANT.NAVI (art. 8Bis) DED. +TSCONTI||||7630056|AMM.TO ANT.NAVI (art. 8Bis) IND. +TSCONTI||||7630060|AMM.ANT.BIANCHERIA DED. +TSCONTI||||7630061|AMM.ANT.BIANCHERIA INDED. +TSCONTI||||7630100|AMM.TO ANT.TO ALTRI BENI DED. +TSCONTI||||7630101|AMM.TO ANT.TO ALTRI BENI INDED. +TSCONTI||||7800000|SVALUTAZIONI (COSTI PRODUZIONE) +TSCONTI||||7805000|SVALUTAZ. DELLE IMMOBILIZZAZIONI +TSCONTI||||7805005|SVAL.NE IMMOB.IMMAT. E MATERIALI +TSCONTI||||7810000|SVAL.CRED.ATT.CIRC.E DISP.LIQ. +TSCONTI||||7810010|ACC.TO P/RISCHI SU CRED.V/CLIENT +TSCONTI||||7810011|ACC.TO PER RISCHI SU CRED.IND. +TSCONTI||||7810040|ACC.TO P/RISCHI CRED.SU INT.MORA +TSCONTI||||8000000|VAR.RIM.DI MAT.PR,SUS,CONS,MERCI +TSCONTI||||8005000|VARIAZ. RIMAN. DI MATERIE PRIME +TSCONTI||||8005005|MATERIE PRIME C/ESIST.INIZIALI +TSCONTI||||8005010|MATERIE PRIME C/RIMANENZE FINALI +TSCONTI||||8010000|VARIAZ.RIMAN. DI MATERIE SUSSID. +TSCONTI||||8010005|MATERIE SUSS. C/ESIST.INIZIALI +TSCONTI||||8010010|MATERIE SUSS. C/RIMAN. FINALI +TSCONTI||||8015000|VARIAZ.RIM.DI MATERIE DI CONSUMO +TSCONTI||||8015005|MATERIE DI CONS.C/ESIST.INIZIALI +TSCONTI||||8015010|MATERIE DI CONSUMO C/RIM.FINALI +TSCONTI||||8020000|VARIAZ.RIMAN. DI MATERIALI VARI +TSCONTI||||8020005|MATERIALI VARI C/ESIST.INIZIALI +TSCONTI||||8020010|MATERIALI VARI C/RIM. FINALI +TSCONTI||||8020098|MATERIALI C/ESIST.INIZ.NON RILEV +TSCONTI||||8020099|MATERIALI C/RIM.FINAL.NON RILEV. +TSCONTI||||8025000|VARIAZ.RIMANENZE DI MERCI +TSCONTI||||8025005|MERCI C/ESISTENZE INIZIALI +TSCONTI||||8025010|MERCI C/RIM. FINALI +TSCONTI||||8025015|CARBURANTE C/ESIST.INIZ.DISTRIB. +TSCONTI||||8025020|CARBURANTE C/RIM.FINALI DISTRIB. +TSCONTI||||8025025|LIBRI C/ESISTENZE INIZIALI +TSCONTI||||8025030|LIBRI C/RIMANENZE FINALI +TSCONTI||||8025031|GENERI DI MONOPOLIO C/ESIST.INIZ +TSCONTI||||8025032|GENERI DI MONOPOLIO C/RIM.FINALI +TSCONTI||||8025033|RICAR.BIGLI.LOTTO,BOLLO C/ESIS.I +TSCONTI||||8025034|RICAR.BIGLI.LOTTO,BOLLO C/RIM.F. +TSCONTI||||8025035|CARBURANTE C/ESIST.INIZ.AUTOTRAS +TSCONTI||||8025040|CARBURANTE C/RIM.FINALI AUTOTR. +TSCONTI||||8025045|CARBURANTE C/ESIST.INIZ.IMPRESE +TSCONTI||||8025050|CARBURANTE C/RIM.FINALI IMPRESE +TSCONTI||||8200000|ACCANTONAMENTI PER RISCHI +TSCONTI||||8215000|ACCANTONAMENTO PER RISCHI +TSCONTI||||8215045|ACC.TO AL F.DO RIS.P/CONTR.LEG. +TSCONTI||||8215050|ACC.TO AL F.DO RIS.P/RIT.CON.LAV +TSCONTI||||8215055|ACC.TO AL F.DO COP.RISCHI PERS. +TSCONTI||||8215075|ACC.TO AL F.DO RECUPERO AMBIENT. +TSCONTI||||8215090|ACC.F.DO RIS.CON.LAV.CORSO S/ORD +TSCONTI||||8215100|ACC.F.DO RIS.CON.OP.ULTR.IN ESEC +TSCONTI||||8215190|ACC.TO AD ALTRI FONDI RISCHI +TSCONTI||||8300000|ALTRI ACCANTONAMENTI +TSCONTI||||8305000|ALTRI ACCANTONAMENTI +TSCONTI||||8305005|ACC.F.CES.RAP.AMM.PROF.(SNC-SAS) +TSCONTI||||8305010|ACC.F.CES.RAP.AMM.PROF.(SPA-SRL) +TSCONTI||||8305015|ACC.F.CES.RAP.CO.CO.CO AMM.(SNC) +TSCONTI||||8305020|ACC.AL F.CESS.RAP.CO.CO.CO AMM. +TSCONTI||||8305100|ACC.F.DO MAN.RIPR.BENI AZ.AF.IND +TSCONTI||||8305105|ACC/AMM.MANUT.BENI AZ.AFF.DED. +TSCONTI||||8305110|ACCANT.OPERAZ.E CONC. A PREMIO +TSCONTI||||8400000|ONERI DIVERSI DI GESTIONE +TSCONTI||||8405000|IMPOSTE E TASSE +TSCONTI||||8405005|IMPOSTA DI BOLLO +TSCONTI||||8405010|IMPOSTA COM.SUGLI IMM.-ICI +TSCONTI||||8405015|IMPOSTA DI FABBRICAZIONE +TSCONTI||||8405020|IMPOSTA DI REGISTRO +TSCONTI||||8405025|IMPOSTE IPOTECARIE E CATASTALI +TSCONTI||||8405030|INVIM +TSCONTI||||8405035|TASSE DI CONCESSIONE GOVERNAT. +TSCONTI||||8405040|TASSE DI PROPRIETA' AUTOVEICOLI +TSCONTI||||8405041|TASSE PROPR.AUTOVEIC. (IND.20%) +TSCONTI||||8405042|TASSE PROPR.AUTOVEIC. INDED. +TSCONTI||||8405045|TASSA SUI RIFIUTI +TSCONTI||||8405060|IVA SU ACQ. INDETRAIBILE +TSCONTI||||8405070|DIRITTI CAMERALI +TSCONTI||||8405090|ALTRE IMPOSTE E TASSE DEDUCIBILI +TSCONTI||||8405100|IMPOSTE E TASSE INDEDUCIBILI +TSCONTI||||8410000|ALTRI ONERI DIVERSI DI GESTIONE +TSCONTI||||8410005|PERDITE SU CREDITI +TSCONTI||||8410006|PERDITE SU CREDITI INDEDUCIBILI +TSCONTI||||8410010|CONTRIBUTI SINDACALI PAGATI +TSCONTI||||8410011|CONTRIBUTI SINDACALI NON PAGATI +TSCONTI||||8410015|ABBONAMENTI RIVISTE,GIORNALI +TSCONTI||||8410020|SPESE BANCHE DATI +TSCONTI||||8410025|CONTR. REVISIONE COOPERATIVE +TSCONTI||||8410035|MULTE E AMMENDE INDEDUCIBILI +TSCONTI||||8410040|MINUSVALENZE ORDINARIE +TSCONTI||||8410045|MINUSV. ORDINARIE INDEDUCIBILI +TSCONTI||||8410050|SOPRAVVENIENZ. PASSIVE ORD.DED. +TSCONTI||||8410055|SOPRAV. PASSIVE ORD.INDEDUCIBILI +TSCONTI||||8410065|OMAGGI A CLIENTI E ART.PROMOZ. +TSCONTI||||8410090|ABBUONI/ARROTONDAMENTI PASSIVI +TSCONTI||||8410091|SCONTI PASSIVI +TSCONTI||||8410094|EROG. LIBERALI DEDUCIBILI +TSCONTI||||8410095|EROG.LIBERALI DED. (MAX.2%REDD.) +TSCONTI||||8410096|EROGAZ.LIBERALI INDEDUCIBILI +TSCONTI||||8410097|EROG.LIBERALI DEDUCIBILI IRAP +TSCONTI||||8410098|EROGAZIONI LIB. INDED. IRAP +TSCONTI||||8410125|ONER. DIV. DI GEST.-ATT. AGRIT. +TSCONTI||||8410180|QUOTA SP.GEN.DEDUCIBILI IRAP +TSCONTI||||8410190|ALTRI ONERI DI GEST. DEDUC. +TSCONTI||||8410191|ALTRI ONERI DI GEST.INDEDUCIBILI +TSCONTI||||8415000|ONERI DIV. - PROFESSIONISTI +TSCONTI||||8415005|SP.RIS.DANNI TERZI-PROF.NON ASS. +TSCONTI||||8415010|SP.PART.CONV,CONG. E SIMILI-PROF +TSCONTI||||8415015|SPES.PER ACQ.CLIENT.-PROFESS. +TSCONTI||||8415020|SPES.PER LIQID.PARC. PROFESS. +TSCONTI||||8415025|CONT.ANN.ISCR.ORD. PROFESS. +TSCONTI||||8415030|TASSE PROPR.AUTO PROF. IND.75% +TSCONTI||||8415090|ALTRI ONERI DIV. DED.- PROFESS. +TSCONTI||||8415190|ALTRI ON.DIV.IND. - PROFES. +TSCONTI||||8600000|PROVENTI DA PARTECIPAZIONI +TSCONTI||||8605000|DA IMPR.CONTROLL.(PROV.DA PART.) +TSCONTI||||8605005|DIVIDENDI SOC.CONTR.P/SOGG.IRES +TSCONTI||||8605006|DIVIDENDI SOC.CONTR.P/SOGG.IRPEF +TSCONTI||||8605010|MAGG.DIVID. PER CRED. D'IMPOSTA +TSCONTI||||8605018|UTILI DA SOCIETA'TRASPAR.CONTR. +TSCONTI||||8605050|PLUSVALENZE PEX ART.87 SOC.CONT. +TSCONTI||||8605051|PLUSV.PEX TASS.5%PARZ.IMPR.CONTR +TSCONTI||||8605052|PLUSV.PEX TASS.9%PARZ.IMPR.CONTR +TSCONTI||||8605060|PLUSVALENZE TASSATE 40%SOC.CONT. +TSCONTI||||8610000|DA IMPR.COLLEGATE(PROV.DA PART.) +TSCONTI||||8610005|DIVIDENDI SOC.COLL.P/SOGG.IRES +TSCONTI||||8610006|DIVIDENDI SOC.COLL.P/SOGG.IRPEF +TSCONTI||||8610010|DIV.DA SOC.COLLEG.NON RESID. +TSCONTI||||8610015|MAGG.DIVID.PER CRED.D'IMPOSTA +TSCONTI||||8610018|UTILI DA SOCIETA' TRASPAR.COLL. +TSCONTI||||8610050|PLUSVALENZE PEX ART.87 SOC.COLL. +TSCONTI||||8610051|PLUSV.PEX TASS.5%PARZ.IMPR.COLL. +TSCONTI||||8610052|PLUSV.PEX TASS.9%PARZ.IMPR.COLL. +TSCONTI||||8610060|PLUSVALENZE TASSATE 40% SOC.COLL +TSCONTI||||8615000|ALTRI (PROV. DA PARTECIPAZIONE) +TSCONTI||||8615005|MAGG.DIVID.PER CREDITO D'IMP. +TSCONTI||||8615010|UTILI DISTRIB.DA SOC.FIGLIE UE +TSCONTI||||8615015|UTILI DISTR. DA SOC. DI PERS. +TSCONTI||||8615018|UTILI DA SOCIETA' TRASPARENTI +TSCONTI||||8615020|UTILI DA CFC ART.167 NON TASSATI +TSCONTI||||8615025|UTILI DA CFC TASS.EX ART.167 T.U +TSCONTI||||8615030|DIVIDENDI PERCEPITI DA SOGG.IRES +TSCONTI||||8615035|DIVIDENDI PERCEPITI DA SOG.IRPEF +TSCONTI||||8615050|PLUSVALENZE PEX - ART.87 +TSCONTI||||8615051|PLUSV.PEX TASS.5% PARZ. +TSCONTI||||8615052|PLUSV.PEX TASS.9% PARZ. +TSCONTI||||8615060|PLUSVALENZE TASSATE AL 40% +TSCONTI||||8615090|ALTRI PROV. DA PARTECIPAZ. +TSCONTI||||8700000|ALTRI PROVENTI FINANZIARI +TSCONTI||||8705000|DA CRED.ISCRITTI NELLE IMMOB. +TSCONTI||||8705005|INT. ATTIVI DA IMPRESE CONTROL. +TSCONTI||||8705010|INT. ATTIVI DA IMPRESE COLLEGATE +TSCONTI||||8705015|INT. ATTIVI DA CONTROLLANTI +TSCONTI||||8705040|INT. ATT. PER ACCONT.RIT. SU TFR +TSCONTI||||8705090|INT.ATT.DA ALT.CR.ISCR.NELLE IMM +TSCONTI||||8710000|DA TIT.ISCRITTI NELLE IMMOB. +TSCONTI||||8710005|INT.ATT.TIT.REDD.FISSO IMP.SOST. +TSCONTI||||8710010|INT.ATT.TIT.RED.FISSO NO IMP.SOS +TSCONTI||||8710055|UTILI SU TITOLI IMMOBILIZZATI +TSCONTI||||8710090|ALT.PR.FIN.DA TIT.ISCR.NELLE IMM +TSCONTI||||8715000|DA TIT. ISCR.NELL'ATT.CIRCOLANTE +TSCONTI||||8715005|INT.ATT.SU TIT.RED.FIS.AS.IMP.SO +TSCONTI||||8715010|IN.ATT.SU TIT.RED.FIS.NON AS.IMP +TSCONTI||||8715050|UTILI SU TITOLI NON IMMOBILIZZAT +TSCONTI||||8715090|ALT.PR.FINANZ.DA TIT.ISC.AT.CIRC +TSCONTI||||8720000|PROV. DIVERSI DAI PRECEDENTI +TSCONTI||||8720005|ALTRI PROV.FIN.DA IMP.CONTROL. +TSCONTI||||8720010|ALTRI PROV.FIN.DA IMP. COLLEGATE +TSCONTI||||8720015|ALTRI PROV. FIN. DA CONTROLLANTI +TSCONTI||||8720020|INT. ATTIVI V/CLIENTI +TSCONTI||||8720025|INT. ATTIVI V/ERARIO +TSCONTI||||8720030|INT.ATT.V/DIPENDENTI +TSCONTI||||8720035|INT.ATT.SU DEPOSITI BANCARI +TSCONTI||||8720036|INTERESSI ATT.SU DEP.BANC.-PROF. +TSCONTI||||8720040|INT.ATTIVI SU DEPOSITI POSTALI +TSCONTI||||8720045|INT.ATT.CRED.IMPOS.(IVA,...) +TSCONTI||||8720047|INT.ATT. DI MORA NON PERCEPITI +TSCONTI||||8720050|ALTRI INTERESSI ATTIVI +TSCONTI||||8720055|UTILIZ.F.DO RISCHI SU INT. MORA +TSCONTI||||8720060|UTILI SU CAMBI +TSCONTI||||8720062|UTILI SU CAMBI NON REALIZZATI +TSCONTI||||8720065|CONTRIBUTI C/INTERESSI +TSCONTI||||8720090|ALTRI PROVENTI FINANZIARI +TSCONTI||||8720091|PROV. FINANZ. NON TASSAB. +TSCONTI||||8800000|INT. PASS.E ALTRI ONERI FINANZ. +TSCONTI||||8805000|VERS.IMPRESE CONTROLLATE +TSCONTI||||8805005|INTERESSI PAS.V/IMP. CONTROLL. +TSCONTI||||8805050|MINUSVALENZE PEX-ART.87 SOC.CONT +TSCONTI||||8805060|MINUSVALENZE PEX IND.60%SOC.CONT +TSCONTI||||8810000|VERS.IMPRESE COLLEGATE +TSCONTI||||8810005|INT.PASS.V/IMPRESE COLLEGATE +TSCONTI||||8810050|MINUSVALENZE PEX-ART.87 SOC.COLL +TSCONTI||||8810060|MINUSVALENZE PEX IND.60%SOC.COLL +TSCONTI||||8815000|VERSO CONTROLLANTI +TSCONTI||||8815005|INT.PASS.VERSO CONTROLLANTI +TSCONTI||||8815050|MINUSVALENZE PEX-ART.87 SOC.CONT +TSCONTI||||8815060|MINUSVALENZE PEX IND.60%SOC.CONT +TSCONTI||||8820000|VERSO ALTRI (0NERI FINANZIARI) +TSCONTI||||8820010|INT.PASS.SUI DEB.V/BAN.DI CR.ORD +TSCONTI||||8820015|INTERESSI PASSIVI SU MUTUI +TSCONTI||||8820020|INT.PASS.SUI DEB. V/ALTRI FINAN. +TSCONTI||||8820025|INT.PAS.SUI DEB.RAP.DA TIT.DI CR +TSCONTI||||8820035|INT.PASS.V/FORNITORI +TSCONTI||||8820040|SCONTI E ALTRI ONERI FINANZ.DED. +TSCONTI||||8820041|SCONTI E ALTRI ONERI FIN.INDED. +TSCONTI||||8820043|INTERESSI PASSIVI INDED. ART. 96 +TSCONTI||||8820044|INTERESSI PASSIVI INDED. ART. 97 +TSCONTI||||8820045|INTERESSI PASSIVI INDED. ART. 98 +TSCONTI||||8820046|INTERESSI PASSIVI INDEDUCIBILI +TSCONTI||||8820050|SCON.PAS.SU EFFETTI FINANZ. +TSCONTI||||8820055|MINUSVALENZE PEX - ART. 87 +TSCONTI||||8820060|MINUSV.PEX/ASSOC.PART.IND.60% +TSCONTI||||8820065|MINUSVALENZE DIVIDEND-WASHING +TSCONTI||||8820095|PERDITE SU CAMBI +TSCONTI||||8820100|ACC.TO AL F.DO RISC.SU CAMBI DED +TSCONTI||||8820101|PERDITE SU CAMBI NON REALIZZATE +TSCONTI||||8820110|PERDITE SU TITOLI +TSCONTI||||8820115|PER.DI REAL.DI ATT.FIN.NON IMM. +TSCONTI||||8820120|INTER.PASS.SU OBBLIGAZIONI +TSCONTI||||8820125|AMMORTAM. DISAGGIO SU PRESTITI +TSCONTI||||8820190|ALTRI INT.PASS.E ONER.FIN.DED. +TSCONTI||||8820191|ONERI FINANZIARI INDEDUCIBILI +TSCONTI||||8820192|INTERESSI PASS.REGIME FORFETT. +TSCONTI||||8820195|PERDIT. DA SOC. DI PERSONE +TSCONTI||||9000000|RIVALUTAZIONI +TSCONTI||||9005000|RIVALUTAZIONI DI PARTECIPAZIONI +TSCONTI||||9005005|RIV.DI PART.IN IMPRESE CONTROLL. +TSCONTI||||9005010|RIV. DI PART. IN IMPRESE COLL. +TSCONTI||||9005015|RIV.DI PART.IN IMPR.CONTROLLANTI +TSCONTI||||9005020|RIV.DI PART.IN ALTRE IMPRESE +TSCONTI||||9005090|ALTRE RIVAL.DI PARTECIPAZIONI +TSCONTI||||9010000|RIV.DI IMM.FIN.CHENON COST.PART. +TSCONTI||||9010005|RIVALUT. DI CREDITI IMMOBILIZ. +TSCONTI||||9010010|RIVALUTAZIONI DI ALTRI TITOLI +TSCONTI||||9010015|RIVALUT.DI AZIONI PROPRIE +TSCONTI||||9010030|RIVAL.VOLONT.NON TASSABILI +TSCONTI||||9010090|ALTRE RIV. DI IMM. FINANZIARE +TSCONTI||||9015000|RIV.DI TIT.ISCR.NELL'ATT.CIRC. +TSCONTI||||9015005|RIVAL.TITOLI ATT.CIRC.NON PARTEC +TSCONTI||||9015090|ALT.RIV.DI TIT.ISCR.NELL'ATT.CIR +TSCONTI||||9100000|SVALUTAZIONI(RETTIF.FINANZIARIE) +TSCONTI||||9105000|SVALUTAZ.DI PARTECIPAZIONI +TSCONTI||||9105005|SVAL.DI PARTECIP.IN IMP.CONTROL. +TSCONTI||||9105010|SVAL.DI PART.IN IMPR.COLLEGATE +TSCONTI||||9105015|SVAL.DI PART.IN IMPRESE CONTROL. +TSCONTI||||9105020|SVAL.DI PARTECIP.IN ALTRE IMPR. +TSCONTI||||9105025|SVALUTAZIONI DI PARTECIP. INDED. +TSCONTI||||9105027|SVAL.PARTEC.INDED.ex DL209/02 +TSCONTI||||9105030|SVALUTAZ.DI PARTECIP.DA RATEIZZ. +TSCONTI||||9105090|ALTRE SVALUT.DI PARTECIPAZIONI +TSCONTI||||9110000|SVALUT.DI ALTRE IMMOB.FINANZIARE +TSCONTI||||9110005|SVAL.DI CREDITI IMMOBILIZZATI +TSCONTI||||9110010|SVALUTAZIONI DI ALTRI TITOLI +TSCONTI||||9110015|SVALUTAZIONI DI AZIONI PROPRIE +TSCONTI||||9110090|ALTRE SVAL.DI IMMOB.FINANZIARE +TSCONTI||||9115000|SVAL.DI TIT.ISCR.NELL'ATT.CIRC. +TSCONTI||||9115005|SVAL.DI TIT.ISCR.NELL'ATT.CIRC. +TSCONTI||||9115090|ALT.SVAL.DI TIT.ISC.NELL'ATT.CIR +TSCONTI||||9400000|PROVENTI STRAORDINARI +TSCONTI||||9405000|PLUSVALENZA DA ALIENAZIONI +TSCONTI||||9405005|PLUS.CES.AZ.,CONF.,FUS. E SCIS +TSCONTI||||9405090|ALTRE PLUSVALENZE STRAORDINARIE +TSCONTI||||9405100|PLUSVALENZE STRAORD.NON TASSAB. +TSCONTI||||9410000|VARIE (PROVENTI STRAORDINARI) +TSCONTI||||9410005|SOPR.ATT.ESTR.ALL'ATT.TASSAB. +TSCONTI||||9410010|SOPR.ATT.ESTR.ALL'ATT.NON TASS. +TSCONTI||||9410015|SOPR.ATT.REGOL.SCR.CO.a14 289/02 +TSCONTI||||9410035|CONTRIBUTI IN CONTO CAPITALE +TSCONTI||||9410045|ALTRE LIBERALITA' RICEVUTE +TSCONTI||||9410085|ALTRI PROV.STR.NON TASS.IRAP +TSCONTI||||9410090|ALTRI PROVENTI STRAORDINARI +TSCONTI||||9410091|ALTRI PROVENTI STRAORD.TASS.IRAP +TSCONTI||||9410100|PROV.STRAORDINARI NON TASSABILI +TSCONTI||||9410110|INDENNIZZI ESER.PREC.NON TASSATI +TSCONTI||||9500000|ONERI STRAORDINARI +TSCONTI||||9505000|MINUSVALENZE DA ALIENAZIONE +TSCONTI||||9505005|MIN.CES.AZ.,CONF.AZ.,FUS.E SCISS +TSCONTI||||9505090|ALTRE MINUSVALENZE STRAORDINARIE +TSCONTI||||9505100|MINUSVALENZE STRAORD.NON DED. +TSCONTI||||9510000|IMPOSTE ESERC.PRECEDENTI +TSCONTI||||9510005|IMPOSTE ESERCIZI PRECEDENTI +TSCONTI||||9515000|VARIE (ONERI STRAORDINARI) +TSCONTI||||9515005|SOPR.PAS.ESTR.ALL'ATT.DED. +TSCONTI||||9515010|SOPR.PAS.ESTR.ALL'ATT.INDED. +TSCONTI||||9515015|SOPR.PAS.P/SPESE COM.ES.PRE.A109 +TSCONTI||||9515085|ALTRI ONERI STR.INDED.IRAP +TSCONTI||||9515086|ALTRI ONERI STRAORDINARI DED. +TSCONTI||||9515087|ALTRI ONERI STRAOR.DEDUC.IRAP +TSCONTI||||9515090|ALTRI ONERI STRAORD.INDEDUCIBILI +TSCONTI||||9600000|IMPOSTE SUL REDDITO DELL'ESERC. +TSCONTI||||9605000|IMPOSTE CORRENTI +TSCONTI||||9605005|IRPEG DELL'ESERCIZIO +TSCONTI||||9605010|IRAP DELL'ESERCIZIO +TSCONTI||||9605015|IRES DELL'ESERCIZIO +TSCONTI||||9610000|IMPOSTE DIFFERITE E ANTICIPATE +TSCONTI||||9610005|ACC.TO PER IMPOSTE DIFFERITE +TSCONTI||||9610006|UTILIZZO FONDO IMPOSTE DIFFERITE +TSCONTI||||9610010|IMPOSTE ANTICIPATE +TSCONTI||||9615000|Prov.(oneri)adesione reg.traspar +TSCONTI||||9615005|PROVENTI DA ADESIONE TRASPARENZA +TSCONTI||||9615010|ONERI DA ADESIONE TRASPARENZA +TSCONTI||||9900000|CONTO RIEPILOGATIVO ECONOMICO +TSCONTI||||9905000|PROFITTI E PERDITE +TSCONTI||||9905005|PROFITTI E PERDITE diff --git a/tc/tstab.txt b/tc/tstab.txt new file mode 100755 index 000000000..eefec1e73 --- /dev/null +++ b/tc/tstab.txt @@ -0,0 +1,166 @@ +[Header] +Version=199519 +File=155 +Fields=COD,5|FIRST,20|SECOND,20|DATA,50 + +[Data] +TSCAU|001||FATTURA VENDITA +TSCAU|010||PAGATA FAT.PROF +TSCAU|101||NI-SVA.IMM.IMM. +TSCAU|102||NI-SVA.IMM.MAT. +TSCAU|103||NI-RIV.IMM.FIN. +TSCAU|104||NI-SVA.IMM.FIN. +TSCAU|105||NI-ACQ.IMM.FIN. +TSCAU|106||NI-VEN.IMM.FIN. +TSCAU|107||NI-ACC.TFR.ESE. +TSCAU|108||NI-UTI.FDO.TFR. +TSCAU|011||FATT.ACQUISTO +TSCAU|012||N.C.DA FORNIT. +TSCAU|013||N.C. A FORNIT. +TSCAU|014||N.D.DA FORNIT. +TSCAU|015||N.D. A FORNIT. +TSCAU|016||N.VAR.DA FORNIT +TSCAU|017||FT.ACQ.S.MARINO +TSCAU|018||ESTR.DA DEP IVA +TSCAU|019||FATT.ACQ.INTRA +TSCAU|002||N.C. A CLIENTE +TSCAU|20||CORRISPETTIVO +TSCAU|201||EC-ACCONTO CLIE +TSCAU|202||EC-INSOLUT CLIE +TSCAU|203||EC-EMI.EFF CLIE +TSCAU|204||EC-PRE.EFF CLIE +TSCAU|205||EC-RISCOSS CLIE +TSCAU|206||EC-PAGAMEN FORN +TSCAU|207||EC-BONIFIC FORN +TSCAU|208||EC-ACCONTO FORN +TSCAU|021||BOLLA DOGANALE +TSCAU|022||FATTURA VENDITA +TSCAU|023||PAG.RIT.ACC. +TSCAU|024||CORRIS.MENSILI +TSCAU|025||SALDO APERTURA +TSCAU|026||SALDO CHIUSURA +TSCAU|027||DIVERSI DIVERSI +TSCAU|028||ABBUONO +TSCAU|029||COMPENSI AMMIN. +TSCAU|003||N.C. DA CLIENTE +TSCAU|030||VERSAMENTO F24 +TSCAU|031||FATT. DIFFERITA +TSCAU|032||FATT. SUBFORNIT +TSCAU|034||ACQ.R.MARG.GLOB +TSCAU|035||VEN.R.MARG.GLOB +TSCAU|036||ACQ.R.MARG.ORDI +TSCAU|037||VEN.R.MARG.ORDI +TSCAU|038||FAT.R.MARG.FORF +TSCAU|039||COR.R.MARG.FORF +TSCAU|004||N.D. A CLIENTE +TSCAU|040||FAT.R.MARG.NORM +TSCAU|041||ACQ.R.MAR.GL.AN +TSCAU|042||VEN.R.MAR.GL.AN +TSCAU|043||FT.ACQ.ROTTAMI +TSCAU|044||NC.ACQ.ROTTAMI +TSCAU|045||FATTURA EDITORI +TSCAU|046||CORRISP EDITORI +TSCAU|047||ACQ.INTRA EDITO +TSCAU|048||COSTI ART.74 T +TSCAU|049||RICAVI ART.74 T +TSCAU|005||N.D. DA CLIENTE +TSCAU|006||N.VAR.A CLIENTE +TSCAU|007||AUTOFATTURA +TSCAU|070||INCASSO +TSCAU|071||PAGAMENTO +TSCAU|072||INCASSO DIFF. +TSCAU|073||PAGAMENTO DIFF. +TSCAU|074||INCASSO CLI. +TSCAU|075||PAGAMENTO FOR. +TSCAU|076||INC SOM C/TERZI +TSCAU|077||VER SOM C/TERZI +TSCAU|079||AMMORTAMENTI +TSCAU|008||INC.FT/IN SOSP. +TSCAU|080||PLUSVALENZA +TSCAU|801||STORNO VENDITE +TSCAU|081||MINUSVALENZA +TSCAU|811||STORNO ACQUISTI +TSCAU|082||COSTI NON IVA +TSCAU|820||STORNO INCASSI +TSCAU|083||RICAVI NON IVA +TSCAU|831||RETT. CON VEND. +TSCAU|832||RETT. CON ACQU. +TSCAU|833||RETT. CON CORR. +TSCAU|834||RETT. CON GENE. +TSCAU|009||FATT.VEND.INTRA +TSCAU|090||RAT.ATT.RIS.PAS +TSCAU|901||RETT. IVA VEND. +TSCAU|902||RETT. IVA ACQU. +TSCAU|903||RETT. IVA CORR. +TSCAU|091||RAT.PAS.RIS.ATT +TSCAU|092||AUTOTR/AG.VIAG. +TSCAU|093||RIC.BENI USATI +TSCAU|094||COS.BENI USATI +TSCAU|095||ONERI PREVIDENZ +TSCAU|097||ADEGUAMENTO +TSCAU|098||MAGGIORI RICAVI +TSI11|01|2|Beni ammortizzabili Art.2 c.1 +TSI11|07|4|Cessioni di beni strumentali +TSI11|08|8|Altri beni strumentali Art.2 c.2 +TSI11|09|1|Beni destinati alla rivendita A3 +TSI11|09|5|Beni destinati alla rivendita A3 +TSI11|10|3|Leasing detrazione 6% +TSIVA|010||Aliquota 10% +TSIVA|104||Corr.scorp.04% +TSIVA|110||Corr.scorp.10% +TSIVA|012||Aliquota12,50% +TSIVA|120||Corr.scorp.20% +TSIVA|020||Aliquota 20% +TSIVA|200||Corr.ventilare +TSIVA|204||Acqu.riven.04% +TSIVA|210||Acqu.riven.10% +TSIVA|220||Acqu.riven.20% +TSIVA|301||Esc.art. 2 +TSIVA|302||Esc.art. 3 +TSIVA|303||Esc.art. 4 +TSIVA|304||Esc.art. 5 +TSIVA|305||Esc.art. 7 +TSIVA|306||Esc.art.15 +TSIVA|307||Esc.art.26 +TSIVA|308||Esc.art.74 c.1 +TSIVA|309||Esc.art.74 8/9 +TSIVA|311||Ese.art.10 n1-9 +TSIVA|312||Ese.art.10 n11 +TSIVA|313||Ese.art.10 n27Q +TSIVA|321||Fuori campo Iva +TSIVA|325||NI art. 8 c. 1 +TSIVA|331||NI art.8 c.1 +TSIVA|332||NI art.9 c.1 +TSIVA|333||NI art.8 c.2 +TSIVA|334||NI art.9 c.2 +TSIVA|335||NI art.40 +TSIVA|336||NI art.41 +TSIVA|337||NI art.42 +TSIVA|338||NI art.71 +TSIVA|339||NI art.72 +TSIVA|340||Depositi IVA +TSIVA|341||Provv.Ag.Viaggi +TSIVA|351||Mar.Forf.A.36/5 +TSIVA|352||Mar.Glob.A.36/6 +TSIVA|353||Reg.Ordi.A.36/1 +TSIVA|004||Aliquota 04% +TSIVA|404||Doc.ritard.04% +TSIVA|410||Doc.ritard.10% +TSIVA|420||Doc.ritard.20% +TSIVA|500||Note varia.iva +TSIVA|501||Note varia imp. +TSIVA|604||Iva 04% ND +TSIVA|610||Iva 10% ND +TSIVA|620||Iva 20% ND +TSIVA|704||Iva 04% ND 50% +TSIVA|710||Iva 10% ND 50% +TSIVA|720||Iva 20% ND 50% +TSIVA|075||Aliquota 7,50% +TSIVA|804||Iva agrico.04% +TSIVA|810||Iva agrico.10% +TSIVA|820||Iva agrico.20% +TSIVA|085||Aliquota 8,50% +TSIVA|900||Corr.Vent.Farm. +TSIVA|904||Iva sospes.04% +TSIVA|910||Iva sospes.10% +TSIVA|920||Iva sospes.20% diff --git a/tp/tp0100.cpp b/tp/tp0100.cpp index ee1dfe068..8cee41b43 100755 --- a/tp/tp0100.cpp +++ b/tp/tp0100.cpp @@ -5,107 +5,21 @@ #include #include #include +#include #include +const char* const APPNAME = TR("Trasferimento PACK"); /////////////////////////////////////////////////////////// // TPack_log /////////////////////////////////////////////////////////// -class TPack_log : public TRecordset +class TPack_log : public TLog_report { - struct TPack_row : public TObject - { - TVariant _sev, _msg; - }; - - TRecnotype _cur; - TArray _log; - TRecordset_column_info _info[2]; - public: - virtual TRecnotype items() const; - virtual bool move_to(TRecnotype pos); - virtual TRecnotype current_row() const; - virtual void requery(); - virtual const TString& query_text() const { return EMPTY_STRING; } - - virtual unsigned int columns() const; - virtual const TRecordset_column_info& column_info(unsigned int column) const; - virtual const TVariant& get(unsigned int column) const; - - void reset(const char* header); - void log(long sev, const char* msg); - - TPack_log(); - virtual ~TPack_log(); + TPack_log() : TLog_report(APPNAME) {} }; -TRecnotype TPack_log::items() const -{ return _log.items(); } - -bool TPack_log::move_to(TRecnotype pos) -{ - _cur = pos; - return pos >= 0 && pos < items(); -} - -TRecnotype TPack_log::current_row() const -{ return _cur; } - -void TPack_log::requery() -{ _cur = -1; } - -unsigned int TPack_log::columns() const -{ return 2; } - -const TRecordset_column_info& TPack_log::column_info(unsigned int i) const -{ return _info[i % columns()]; } - -const TVariant& TPack_log::get(unsigned int column) const -{ - if (_cur >= 0 && _cur < items()) - { - const TPack_row& row = (const TPack_row&)_log[_cur]; - switch(column) - { - case 0: return row._sev; - case 1: return row._msg; - default: return NULL_VARIANT; - } - } - return NULL_VARIANT; -} - -void TPack_log::reset(const char* header) -{ - set_var("#HEADER", header, true); - _log.destroy(); -} - -void TPack_log::log(long sev, const char* msg) -{ - TPack_row* row = new TPack_row; - row->_sev = sev; - row->_msg = msg; - _log.add(row); -} - -TPack_log::TPack_log() : _log(NULL) -{ - _info[0]._name = "SEVERITY"; - _info[0]._width = 1; - _info[0]._type = _intfld; - - _info[1]._name = "MESSAGE"; - _info[1]._width = 80; - _info[1]._type = _alfafld; -} - -TPack_log::~TPack_log() -{ -} - /////////////////////////////////////////////////////////// // TPack_iterator /////////////////////////////////////////////////////////// @@ -199,7 +113,7 @@ TObject* TCache_tab::key2obj(const char* key) if (tab == "%IVA") { // Campo non digerisce i codici IVA numerici di un solo carattere - if (isdigit(cod[0])) + if (cod.len() < 2 && isdigit(cod[0])) cod.right_just(2, '0'); // per cui aggiungo uno 0 iniziale } @@ -219,18 +133,17 @@ TObject* TCache_tab::key2obj(const char* key) // TPack_transfer /////////////////////////////////////////////////////////// -void TPack_transfer::init(const char* title, const char* qry_hdr, TPack_log* log) +void TPack_transfer::init(const char* title, const char* qry_hdr, TPack_log& log) { - _log = log; - _log->reset(title); + _log = &log; + _log->reset(); + _log->set_title(title); _query_header = qry_hdr; _write_enabled = true; } const TString& TPack_transfer::title() const -{ - return _log->get_var("#HEADER").as_string(); -} +{ return _log->title(); } void TPack_transfer::log(const char* msg, int sev) const { @@ -354,10 +267,10 @@ const TString& TPack_transfer::get_str(const char* field) const const TString& TPack_transfer::get_real_str(const char* campo) const { - const real val = recordset().get(campo).as_real(); - if (val.is_zero()) + const TVariant& var = recordset().get(campo); + if (var.is_zero()) return EMPTY_STRING; - return get_tmp_string() = val.string(); + return get_tmp_string() = var.as_string(); } long TPack_transfer::get_long(const char* field) const @@ -490,11 +403,9 @@ void TTrasferimentoPack_mask::trasferisci() query_header << "ODBC(" << get(F_DSN) << ',' << get(F_USR) << ',' << get(F_PWD) << ")\n"; TReport_book book; - TReport rep; rep.load("tp0100a"); - TPack_log* log = new TPack_log; - rep.set_recordset(log); - bool rep_to_print = false; + TPack_log log; + bool rep_to_print = false; bool go_on = true; if (go_on && get_bool(F_CONTI)) @@ -502,7 +413,7 @@ void TTrasferimentoPack_mask::trasferisci() TPack_conti pc; pc.init(TR("Piano dei conti"), query_header, log); go_on = pc.trasferisci(); - book.add(rep); + book.add(log); rep_to_print = true; } @@ -511,7 +422,7 @@ void TTrasferimentoPack_mask::trasferisci() TPack_pag pc; pc.init(TR("Pagamenti"), query_header, log); go_on = pc.trasferisci(); - book.add(rep); + book.add(log); rep_to_print = true; } @@ -519,10 +430,10 @@ void TTrasferimentoPack_mask::trasferisci() { if (go_on) { - TPack_clifo pc(true); - pc.init(TR("Agenti"), query_header, log); - go_on = pc.trasferisci(); - book.add(rep); + TPack_clifo pa(true); + pa.init(TR("Agenti"), query_header, log); + go_on = pa.trasferisci(); + book.add(log); } if (go_on) @@ -530,14 +441,14 @@ void TTrasferimentoPack_mask::trasferisci() TPack_clifo pc(false); pc.init(TR("Clienti/Fornitori"), query_header, log); go_on = pc.trasferisci(); - book.add(rep); + book.add(log); } if (go_on) { TPack_indsped is; is.init(TR("Indirizzi di spedizione"), query_header, log); go_on = is.trasferisci(); - book.add(rep); + book.add(log); } rep_to_print = true; } @@ -548,10 +459,12 @@ void TTrasferimentoPack_mask::trasferisci() pc.activate_custref(get_bool(F_CUSTREF)); pc.activate_paper_info(get_bool(F_PAPER)); pc.activate_customer_code(get_bool(F_CUSTCODE)); + pc.activate_ref_info(get_bool(F_REFINFO)); + pc.activate_cmsref(get_bool(F_CMSREF));; pc.set_data_limite(get_date(F_DATABOLLE)); pc.init(TR("Documenti di trasporto"), query_header, log); go_on = pc.trasferisci(); - book.add(rep); + book.add(log); rep_to_print = true; } @@ -602,6 +515,6 @@ void TTrasferimentoPack::main_loop() int tp0100(int argc, char* argv[]) { TTrasferimentoPack tp; - tp.run(argc, argv, TR("Trasferimento Pack")); + tp.run(argc, argv, APPNAME); return 0; } diff --git a/tp/tp0100.h b/tp/tp0100.h index 415ae457c..f3606b2f5 100755 --- a/tp/tp0100.h +++ b/tp/tp0100.h @@ -48,7 +48,7 @@ protected: virtual bool trasferisci() pure; public: - void init(const char* rh, const char* qh, TPack_log* log); + void init(const char* rh, const char* qh, TPack_log& log); const TString& title() const; TConfig& config() { return _config; } const TString& query_header() const { return _query_header; } @@ -170,7 +170,7 @@ class TPack_ddt : public TPack_transfer { TCache_art* _art; TCache_umart* _umart; - bool _cust_ref, _paper_info, _cust_code; + bool _cust_ref, _paper_info, _ref_info, _cust_code, _cms_ref; TDate _data_limite; TAssoc_array _iva; // Codici IVA PACK @@ -190,10 +190,12 @@ protected: public: virtual bool trasferisci(); - void activate_custref(bool on) { _cust_ref = on; } - void activate_paper_info(bool on) { _paper_info = on; } - void activate_customer_code(bool on); + void activate_custref(bool on) { _cust_ref = on; } + void activate_paper_info(bool on) { _paper_info = on; } + void activate_ref_info(bool on) { _ref_info = on; } + void activate_cmsref(bool on) { _cms_ref = on; } void set_data_limite(const TDate& data) { _data_limite = data; } + void activate_customer_code(bool on); TPack_ddt(); ~TPack_ddt(); diff --git a/tp/tp0100a.h b/tp/tp0100a.h index c9c61aa31..1f6609c09 100755 --- a/tp/tp0100a.h +++ b/tp/tp0100a.h @@ -17,5 +17,8 @@ #define F_CUSTREF 210 #define F_PAPER 211 #define F_CUSTCODE 212 +#define F_REFINFO 213 +#define F_CMSREF 214 + #endif diff --git a/tp/tp0100a.rep b/tp/tp0100a.rep deleted file mode 100755 index 1b1c1ee93..000000000 --- a/tp/tp0100a.rep +++ /dev/null @@ -1,28 +0,0 @@ - - - Log trasferimento PACK - -

-
- - - #HEADER - -
-
-
- - SEVERITY - -
  • -
  • -
  • - - - - MESSAGE - -
  • -
    -
    - \ No newline at end of file diff --git a/tp/tp0100a.uml b/tp/tp0100a.uml index 7b0254a7b..e44356631 100755 --- a/tp/tp0100a.uml +++ b/tp/tp0100a.uml @@ -96,26 +96,37 @@ BEGIN FLAGS "*" END -GROUPBOX DLG_NULL 68 5 +GROUPBOX DLG_NULL 68 7 BEGIN PROMPT 1 6 "@bDocumenti di trasporto" END BOOLEAN F_CUSTREF BEGIN - PROMPT 2 7 "Inserire righe riferimento cliente" + PROMPT 2 7 "Inserire riferimenti cliente nelle righe di descrizione" END BOOLEAN F_PAPER BEGIN - PROMPT 2 8 "Inserire informazioni estese nella descrizione aggiuntiva" + PROMPT 2 8 "Inserire formato carta nella descrizione aggiuntiva" +END + +BOOLEAN F_REFINFO +BEGIN + PROMPT 2 9 "Inserire riferimenti cliente nella descrizione aggiuntiva" +END + +BOOLEAN F_CMSREF +BEGIN + PROMPT 2 10 "Inserire riferimenti cliente nel campo CODCMS" END BOOLEAN F_CUSTCODE BEGIN - PROMPT 2 9 "Utilizzare il codice articolo del cliente" + PROMPT 2 11 "Utilizzare il codice articolo del cliente (Richiede tipo riga 14)" END + ENDPAGE ENDMASK diff --git a/tp/tp0101.cpp b/tp/tp0101.cpp index fadd4c9c8..ed9b003f0 100755 --- a/tp/tp0101.cpp +++ b/tp/tp0101.cpp @@ -1,3 +1,6 @@ +#include "tp0100.h" + +#include #include #include #include @@ -10,8 +13,6 @@ #include #include -#include "tp0100.h" - /////////////////////////////////////////////////////////// // Cache banche /////////////////////////////////////////////////////////// @@ -470,22 +471,36 @@ bool TPack_clifo::aggiorna_record(TLocalisamfile& file, const TString_array& lis { row->get(0, campo_dest); row->get(1, campo_orig); - if (!campo_orig.blank()) + if (campo_orig.full()) { if (campo_orig[0] == '_') { - TToken_string elabora(campo_orig.mid(1),','); - const TString& str = elabora.get(); - if (str == "TAB") // formato _TAB, ,, + if (campo_orig.starts_with("_FISSO")) // valore fisso indicato in configurazione + { + valore = campo_orig.after(','); + valore.trim(); + } else + if (campo_orig.starts_with("_STREXPR")) // formato _STREXPR, espressione { - const TString4 tab = elabora.get(); // tabella da leggere - const TString80 campo = elabora.get(); - const TString16 codtab = get_str(campo); - const TString80 campotab = elabora.get(); + TExpression expr(campo_orig.after(','), _strexpr); + for (int v = 0; v < expr.numvar(); v++) + { + const char* varname = expr.varname(v); + expr.setvar(v, get_str(varname)); + } + valore = expr.as_string(); + valore.trim(); + } else + if (campo_orig.starts_with("_TAB")) // formato _TAB,,, + { + TToken_string elabora(campo_orig, ','); + const TString4 tab = elabora.get(1); // tabella da leggere + const TString16 codtab = get_str(elabora.get()); + const TString16 campotab = elabora.get(); valore = cache().get(tab, codtab, campotab); - } - else if (str == "FISSO") - valore = elabora.get(); // valore fisso indicato in configurazione + } + else + valore.cut(0); } else valore = get_str(campo_orig); diff --git a/tp/tp0101a.ini b/tp/tp0101a.ini index 401107697..2d018521a 100755 --- a/tp/tp0101a.ini +++ b/tp/tp0101a.ini @@ -1,5 +1,5 @@ [CLIFO] -RAGSOC = TradeName1 +RAGSOC = _STREXPR,LEFT(TradeName1+" "+TradeName2; 50) INDCF = Address CIVCF = LOCALITACF = @@ -129,7 +129,7 @@ CODCAPO = PERCAPO = PERCFATT = CAMPOPROVV = -PERCPROVV = +PERCPROVV = ProvvAgent SEQRIC = CODRICPR1 = CODRICPR2 = diff --git a/tp/tp0102.cpp b/tp/tp0102.cpp index 2a231ed59..cb9cca2bb 100755 --- a/tp/tp0102.cpp +++ b/tp/tp0102.cpp @@ -1,7 +1,6 @@ -#include "../ve/velib.h" - #include "tp0100.h" +#include "../ve/velib.h" #include "../mg/codcorr.h" /////////////////////////////////////////////////////////// @@ -349,13 +348,13 @@ const TString& TPack_ddt::get_codice_iva() iva.set_var("#CODIVA", TVariant(codivani)); if (iva.move_first()) { - const real percent = iva.get("IVAValue").as_real(); - if (percent.is_zero()) + const TVariant& percent = iva.get("IVAValue"); + if (percent.is_empty()) codiva = codivani; } } - if (codiva.empty()) + if (codiva.blank()) { codiva = get_str("IVACode"); iva.set_var("#CODIVA", TVariant(codiva)); @@ -403,7 +402,8 @@ bool TPack_ddt::trasferisci() "PDdT_Row.DefPrice, PDdT_Row.PriceNet, PDdT_Row.PriceNetDef, PDdT_Row.AmountNet, PDdT_Row.AmountNetDef, " "PDdT_Row.Amount, PDdT_Row.AmountDef, PDdT_Row.FlagUMPrice, IVA.IVACode, PDdT_Row.AccountCode, " "PDdT_Row.AccountSubCode, PDdT_Row.WeightETUnit, PDdT_Row.ClassCode, PDdT_Row.SubclassCode, " - "PDdT_Row.DDTRowType, PDdT_Header.StatusFlag, PDdT_Row.Report, Mag_Existing_Article.Height, Mag_Existing_Article.Width, Mag_Existing_Article.Lenght, " + "PDdT_Row.DDTRowType, PDdT_Header.StatusFlag, PDdT_Row.Report, " + "Mag_Existing_Article.ArtType, Mag_Existing_Article.Height, Mag_Existing_Article.Width, Mag_Existing_Article.Lenght, " "(select case when [Modalitą Fornitura Bancali].[Value1] is null then 1 else [Modalitą Fornitura Bancali].[Value1] end) AS FornituraBancali, " "PDdT_Header.InvoicingType, PDdT_Header.DocProvv, PDdT_Header.ReceiptBook\n" "FROM ((((((PDdT_Header LEFT JOIN Customers_Suppliers ON PDdT_Header.CustSuppCode = Customers_Suppliers.CustSuppCode) " @@ -518,8 +518,8 @@ bool TPack_ddt::trasferisci() if (_cust_ref) { - // Aggiungi una riga di descrizione col riferimento cliente se e' cambiato const TString& custref = get_customer_reference(); + // Aggiungi una riga di descrizione col riferimento cliente se e' cambiato if (custref.full() && custref != last_custref) { last_custref = custref; @@ -534,9 +534,11 @@ bool TPack_ddt::trasferisci() const TRectype& art = get_articolo(um, qta, custcode); TString4 rowtype = "01"; // Riga merce + bool bIsMerce = true; if (qta.is_zero()) { rowtype = "05"; // Se la qta e' nulla allora e' una descrizione + bIsMerce = false; } else { @@ -544,7 +546,16 @@ bool TPack_ddt::trasferisci() rowtype = "14"; } TRiga_documento& rdoc = doc->new_row(rowtype); // Crea una riga del tipo appropriato - const TString descr (get_str("ArtDesc")); + TString descr = get_str("ArtDesc"); + + const bool bIsSingleSheet = bIsMerce && get_long("ArtType") == 4; // Foglio singolo? + if (bIsSingleSheet && descr.find('(') < 0) // E' un foglio singolo senza dimensioni? + { + TString80 misure; + misure << get_str("Height") << " x " << get_str("Width"); + if (misure[0] > '0') + descr << " (" << misure << ')'; + } if (descr.len() <= 50) rdoc.put(RDOC_DESCR, descr); @@ -553,9 +564,9 @@ bool TPack_ddt::trasferisci() rdoc.put(RDOC_DESCR, descr.left(50)); rdoc.put(RDOC_DESCLUNGA, "X"); rdoc.put(RDOC_DESCEST, descr.mid(50)); - } - if (rowtype == "01" || rowtype == "14") // Ho creato una riga articolo? + + if (bIsMerce) // Ho creato una riga articolo? { const TString& codart = art.get(ANAMAG_CODART); if (codart.full()) // Esistono righe merce senza articolo @@ -572,7 +583,9 @@ bool TPack_ddt::trasferisci() rdoc.put(RDOC_PERCPROV, get_real_str("Provv")); rdoc.put(RDOC_QTAGG1, get_real_str("WeightETUnit")); - rdoc.zero(RDOC_QTAGG2); // percentuale indetraibilita' CONAI + rdoc.zero(RDOC_QTAGG2); // Azzera percentuale indetraibilita' CONAI + if (bIsSingleSheet) + rdoc.put(RDOC_QTAGG3, get_real_str("Quantity")); const TString& conai_class = get_str("ClassCode"); rdoc.put(RDOC_CODAGG1, conai_class); @@ -588,18 +601,21 @@ bool TPack_ddt::trasferisci() } } + TString info; if (_paper_info) { - TString info; info << art.get(ANAMAG_USER10); if (info.full()) info.insert("\n"); - + TString80 misure; misure << get_str("Height") << 'x' << get_str("Width") << 'x'<< get_str("Lenght"); - if (misure != "0x0x0") + if (misure[0] > '0') info << "\nMISURE: " << misure; - + } + + if (_ref_info) + { TString80 docnum = get_str("CDocNumber"); docnum.trim(); if (docnum.full()) info << "\nNS.ORD: " << docnum << '.' << get_str("CDocRow"); @@ -607,11 +623,25 @@ bool TPack_ddt::trasferisci() const TString& custref = get_customer_reference(); if (custref.full()) info << "\nVS.ORD: " << custref; - - if (info.full()) + } + + if (info.full()) + { + TString descest; + descest << rdoc.get(RDOC_DESCEST) << info; + rdoc.put(RDOC_DESCLUNGA, "X"); + rdoc.put(RDOC_DESCEST, descest); + } + + if (_cms_ref) + { + TString ref = get_str("CustReference").before(' '); // Leggo inizio testata es: "1203 DEL 16 02 2006" + if (ref.full()) { - rdoc.put(RDOC_DESCLUNGA, "X"); - rdoc.put(RDOC_DESCEST, info); + const TString& r_ref = get_str("RowCustReference"); // Leggo dalla riga + if (r_ref.full()) + ref << '/' << r_ref << '/' << art.get(ANAMAG_USER9); + rdoc.put(RDOC_CODCMS, ref); } } } @@ -622,7 +652,7 @@ bool TPack_ddt::trasferisci() TPack_ddt::TPack_ddt() : _art(NULL), _umart(NULL), - _cust_ref(false), _paper_info(false), _cust_code(false) + _cust_ref(false), _paper_info(false), _ref_info(true), _cust_code(false) { } TPack_ddt::~TPack_ddt() diff --git a/vd/Ditta-0001.zip b/vd/Ditta-0001.zip new file mode 100755 index 000000000..e887a9946 Binary files /dev/null and b/vd/Ditta-0001.zip differ diff --git a/vd/Studio_Comuni.zip b/vd/Studio_Comuni.zip new file mode 100755 index 000000000..6945d9473 Binary files /dev/null and b/vd/Studio_Comuni.zip differ diff --git a/vd/dopd.des b/vd/dopd.des new file mode 100755 index 000000000..c5faa33e1 --- /dev/null +++ b/vd/dopd.des @@ -0,0 +1,72 @@ +[FieldDescr] +B0 = Cambio prezzi +B1 = Sottocosto +B2 = Cambio omaggi +B3 = Cambio sconti +B4 = +B5 = +B6 = +B7 = +B8 = +B9 = +COD = OPD +CODTAB = Codice (8U) Utente +D0 = +D1 = +D2 = +D3 = +D4 = +FPC = +I0 = +I1 = +I10 = +I11 = +I12 = +I13 = +I14 = +I2 = +I3 = +I4 = +I5 = +I6 = +I7 = +I8 = +I9 = +R0 = Max. Scontrino +R1 = Max. Abbuono +R10 = +R11 = +R12 = +R13 = +R14 = +R15 = +R16 = +R17 = +R18 = +R19 = +R2 = Max. Sconto +R20 = +R21 = +R22 = +R23 = +R24 = +R3 = +R4 = +R5 = +R6 = +R7 = +R8 = +R9 = +S0 = +S1 = +S10 = +S11 = +S2 = +S3 = +S4 = +S5 = +S6 = +S7 = +S8 = +S9 = + diff --git a/vd/drpd.des b/vd/drpd.des new file mode 100755 index 000000000..0432b1671 --- /dev/null +++ b/vd/drpd.des @@ -0,0 +1,72 @@ +[FieldDescr] +B0 = +B1 = +B2 = +B3 = +B4 = +B5 = +B6 = +B7 = +B8 = +B9 = +COD = RPD +CODTAB = Codice (3UZ) +D0 = +D1 = +D2 = +D3 = +D4 = +FPC = +I0 = +I1 = +I10 = +I11 = +I12 = +I13 = +I14 = +I2 = +I3 = +I4 = +I5 = +I6 = +I7 = +I8 = +I9 = +R0 = +R1 = +R10 = +R11 = +R12 = +R13 = +R14 = +R15 = +R16 = +R17 = +R18 = +R19 = +R2 = +R20 = +R21 = +R22 = +R23 = +R24 = +R3 = +R4 = +R5 = +R6 = +R7 = +R8 = +R9 = +S0 = Descrizione +S1 = +S10 = +S11 = +S2 = +S3 = +S4 = +S5 = +S6 = +S7 = +S8 = +S9 = + diff --git a/vd/dstd.des b/vd/dstd.des new file mode 100755 index 000000000..796472ee8 --- /dev/null +++ b/vd/dstd.des @@ -0,0 +1,72 @@ +[FieldDescr] +B0 = +B1 = +B2 = +B3 = +B4 = +B5 = +B6 = +B7 = +B8 = +B9 = +COD = STD +CODTAB = Codice (4UZ) +D0 = +D1 = +D2 = +D3 = +D4 = +FPC = +I0 = +I1 = +I10 = +I11 = +I12 = +I13 = +I14 = +I2 = +I3 = +I4 = +I5 = +I6 = +I7 = +I8 = +I9 = +R0 = +R1 = +R10 = +R11 = +R12 = +R13 = +R14 = +R15 = +R16 = +R17 = +R18 = +R19 = +R2 = +R20 = +R21 = +R22 = +R23 = +R24 = +R3 = +R4 = +R5 = +R6 = +R7 = +R8 = +R9 = +S0 = Descrizione +S1 = +S10 = +S11 = +S2 = +S3 = +S4 = +S5 = +S6 = +S7 = +S8 = +S9 = + diff --git a/vd/dtdt.des b/vd/dtdt.des new file mode 100755 index 000000000..914f9235c --- /dev/null +++ b/vd/dtdt.des @@ -0,0 +1,72 @@ +[FieldDescr] +B0 = +B1 = +B2 = +B3 = +B4 = +B5 = +B6 = +B7 = +B8 = +B9 = +COD = TDT +CODTAB = Codice (2 UZ) +D0 = +D1 = +D2 = +D3 = +D4 = +FPC = +I0 = +I1 = +I10 = +I11 = +I12 = +I13 = +I14 = +I2 = +I3 = +I4 = +I5 = +I6 = +I7 = +I8 = +I9 = +R0 = +R1 = +R10 = +R11 = +R12 = +R13 = +R14 = +R15 = +R16 = +R17 = +R18 = +R19 = +R2 = +R20 = +R21 = +R22 = +R23 = +R24 = +R3 = +R4 = +R5 = +R6 = +R7 = +R8 = +R9 = +S0 = Descrizione +S1 = +S10 = +S11 = +S2 = +S3 = +S4 = Condizione +S5 = Valore +S6 = +S7 = +S8 = +S9 = + diff --git a/vd/dtrd.des b/vd/dtrd.des new file mode 100755 index 000000000..0f156ae46 --- /dev/null +++ b/vd/dtrd.des @@ -0,0 +1,72 @@ +[FieldDescr] +B0 = +B1 = +B2 = +B3 = +B4 = +B5 = +B6 = +B7 = +B8 = +B9 = +COD = TRD +CODTAB = Codice (8Z) progressivo +D0 = Data +D1 = +D2 = +D3 = +D4 = +FPC = +I0 = +I1 = +I10 = +I11 = +I12 = +I13 = +I14 = +I2 = +I3 = +I4 = +I5 = +I6 = +I7 = +I8 = +I9 = +R0 = Cassa Iniziale +R1 = Totalizzatore 1 +R10 = Differenza +R11 = +R12 = +R13 = +R14 = +R15 = +R16 = +R17 = +R18 = +R19 = +R2 = Totalizzatore 2 +R20 = +R21 = +R22 = +R23 = +R24 = +R3 = Totalizzatore 3 +R4 = Totalizzatore 4 +R5 = Totalizzatore 5 +R6 = Totalizzatore 6 +R7 = Totalizzatore 7 +R8 = Totalizzatore 8 +R9 = Cassa finale +S0 = +S1 = +S10 = +S11 = +S2 = +S3 = +S4 = +S5 = +S6 = Ora inizio +S7 = Ora Fine +S8 = +S9 = + diff --git a/vd/f157.dir b/vd/f157.dir new file mode 100755 index 000000000..80ddf091d --- /dev/null +++ b/vd/f157.dir @@ -0,0 +1,3 @@ +157 +0 +$turni|0|0|296|0|Turni di cassa||| diff --git a/vd/f157.trr b/vd/f157.trr new file mode 100755 index 000000000..667831217 --- /dev/null +++ b/vd/f157.trr @@ -0,0 +1,28 @@ +157 +24 +CODCASSA|9|3|0|Codice Cassa +ANNO|2|4|0|Anno +PROGR|3|7|0|Progressivo +USERNAME|1|8|0|Utente +DATA|5|8|0|Data Turno +INIZIO|3|6|0|Ora inizio +FINE|3|6|0|Ora Fine +CASSAINI|4|18|3|Cassa Iniziale +INC01|4|18|3|Incasso tipo 01 +INC02|4|18|3|Incasso tipo 02 +INC03|4|18|2|Incasso tipo 03 +INC04|4|18|3|Incasso tipo 04 +INC05|4|18|3|Incasso tipo 05 +INC06|4|18|3|Incasso tipo 06 +INC07|4|18|3|Incasso tipo 07 +INC08|4|18|3|Incasso tipo 08 +SOSPESI|4|18|3|Sospesi +RESTI|4|18|3|Resti +CASSAFIN|4|18|3|Cassa Finale +DIFF|4|18|3|Differenza di cassa +FNDOC|3|7|0|Primo Scontrino +LNDOC|3|7|0|Ultimo Scontrino +NUMSCONTR|3|4|0|Numero scontrini +CHIUSO|8|1|0|Turno chiuso +1 +CODCASSA+ANNO+PROGR| diff --git a/vd/scontr.ini b/vd/scontr.ini new file mode 100755 index 000000000..b611d2432 --- /dev/null +++ b/vd/scontr.ini @@ -0,0 +1,206 @@ +[MAIN] +TYPE=Scontrino fiscale +CAMPICALC=TOTMER|TOTPRE|SPESE|SPESINC|SPESIMB|SPESTRA|BOLLI|IMPONIBILI|IMPOSTE|TOTDOC|SCONTOD|SCONTOT|OMAGGI|TOTPROVV +CALCOLI=* +TOTPROVV = +TIPOCF= +[PROFILO] +OCCASEDIT = 3 +OCFPI = 1 +COFI = 3 +STATOPAIV = 3 +PAIVA = 3 +GOLEM = 3 +GRRECAPITO = 3 +INDCF = 1 +CIVCF = 1 +LOCALITACF = 1 +CAPCF = 1 +PROVCOM = 1 +COMCF = 1 +DENCOM = 1 +STATOCF = 1 +DESSTATOCF = 1 +CODVAL1 = 3 +CODVAL2 = 3 +NOME_VAL1 = 3 +NOME_VAL2 = 3 +CONTROEURO = 3 +CAMBIO = 3 +DATA_CAMBIO1 = 3 +DATA_CAMBIO2 = 3 +CODLIN = 3 +DESLIN = 3 +CODPAG = 4 +DESCODPAG = 3 +GRSCADENZE = 3 +DATAINSC = 3 +DATASCAD1 = 1 +DATASCAD2 = 1 +DATASCAD3 = 1 +DATASCAD4 = 1 +DATASCAD5 = 1 +CODABIA = 4 +CODCABA = 4 +DESBANAPP = 3 +IBAN = 3 +IBAN_STATO = 3 +IBAN_CHECK = 3 +BBAN = 3 +BBAN_CIN = 3 +BBAN_ABI = 3 +BBAN_CAB = 3 +BBAN_CONTO = 3 +CODABIP = 3 +CODCABP = 3 +DESBANPRE = 3 +CATVEN = 3 +DESCATVEN = 1 +CODLIST1 = 3 +CODLIST2 = 3 +DESLIST = 1 +CODCONT1 = 3 +CODCONT2 = 3 +DESCONT = 1 +CODCAMP = 3 +DESCAMP = 1 +SCONTOPERC = 3 +GRINDSPED = 3 +CODINDSP = 3 +RAGSOCSP = 1 +INDSP = 1 +CIVSP = 1 +LOCALITASP = 1 +CAPSP = 1 +COMSP = 1 +DENCOMSP = 1 +PROVCOMSP = 1 +STATOSP = 1 +DESSTATOSP = 1 +DATADOCRIF = 3 +NUMDOCRIF = 2 +CODAG = 3 +DESAG = 3 +CODZON = 3 +DESZON = 3 +CODSPMEZZO = 3 +DESSPMEZZO = 3 +CODPORTO = 3 +DESPORTO = 3 +CODNOTESP1 = 3 +DESNOTESP1 = 3 +CODNOTESP2 = 3 +DESNOTESP2 = 3 +CAUSTRASP = 3 +DENCAUSTRASP = 3 +CODVETT1 = 3 +CODVETT2 = 0 +CODVETT3 = 0 +NOMEVETT1 = 3 +NOMEVETT2 = 0 +NOMEVETT3 = 0 +NCOPIE = 0 +IMPPAGATO = 3 +ACCSALDO = 3 +DOC1 = 0 +DOC2 = 0 +DOC3 = 0 +IMPNETTI = 0 +RAGGREFF = 3 +SPESEINC = 3 +ADDBOLLI = 3 +CODNOTE = 3 +NOTECLI = 3 +CAUSMAG = 4 +CAUSMAGC = 1 +DESCRMAG = 3 +DESCRMAGC = 1 +CODCMS = 3 +DESCRCMS = 3 +FASCMS = 3 +DESCRFAS = 3 +BLANK = 1 +[DEFAULT] +[SHEET] +NCOLS=19 +1=105 +2=106 +3=107 +4=108 +5=109 +6=110 +7=111 +8=112 +9=113 +10=120 +11=121 +12=124 +13=103 +14=104 +15=127 +16=128 +17=129 +18=102 +19=101 +[RIGHE] +NTIPIRIGA=* +[HANDLERS] +NHANDLER=0 +[PROFILOGRUPPO] +101 = 0 +100 = 3 +200 = 3 +300 = 3 +400 = 3 +500 = 3 +600 = 3 +700 = 3 +800 = 3 +810 = 3 +820 = 3 +830 = 3 +900 = 3 +1000 = 3 +1100 = 3 +1200 = 3 +1210 = 3 +1300 = 3 +1400 = 3 +1500 = 3 +1600 = 0 +1800 = 3 +1900 = 3 +2200 = 0 +2300 = 3 +2400 = 3 +2500 = 3 +2900 = 3 +3000 = 3 +4000 = 3 +[ORDINEGRUPPI] +NGROUPS=25 +1=100 +2=2500 +3=200 +4=300 +5=400 +6=500 +7=600 +8=700 +9=2400 +10=2300 +11=800 +12=810 +13=820 +14=830 +15=900 +16=1100 +17=1200 +18=1210 +19=1300 +20=1400 +21=1800 +22=1900 +23=1000 +24=2900 +25=3000 diff --git a/vd/scontr.msk b/vd/scontr.msk new file mode 100755 index 000000000..f4fdb8ff6 --- /dev/null +++ b/vd/scontr.msk @@ -0,0 +1,742 @@ +TO "" 0 -4 0 4 +BU 402 10 2 +BE +PR -19 -3 "~Chiudi ~Turno" +ME EXIT,27 +EN +BU 401 10 2 +BE +PR -29 -3 "Chiudi ~Scontr." +EN +BU 403 10 2 +BE +PR -39 -3 "~Da Fatturare" +EN +BU 18 10 2 +BE +PR -49 -3 "~Sospendi" +ME EXIT,20082 +EN +BU 404 10 2 +BE +PR -59 -3 "S~ospesi" +EN +BU 17 10 2 +BE +PR -69 -3 "~Elimina" +ME EXIT,127 +PI 104 +PI 154 +EN +BU 24 10 2 +BE +PR -79 -3 "" +ME EXIT,20082 +EN +BU 2 10 2 +BE +PR -89 -3 "~Annulla" +ME EXIT,27 +PI 102 +EN +BU 9 10 2 +BE +PR -99 -3 "~Fine" +ME EXIT,20334 +PI 114 +PI 164 +EN +BU 405 10 2 +BE +PR -19 -1 "~Permessi" +EN +BU 411 10 2 +BE +PR -29 -1 "Funz.1" +EN +BU 412 10 2 +BE +PR -39 -1 "Funz.2" +EN +BU 413 10 2 +BE +PR -49 -1 "Funz.3" +EN +BU 414 10 2 +BE +PR -59 -1 "Funz.4" +EN +BU 415 10 2 +BE +PR -69 -1 "Funz.5" +EN +BU 416 10 2 +BE +PR -79 -1 "Funz.6" +EN +BU 417 10 2 +BE +PR -89 -1 "Funz.7" +EN +BU 418 10 2 +BE +PR -99 -1 "Funz.8" +EN +EN +PA "Scontrino" -1 -1 0 0 +ST 102 4 +BE +PR 2 0 "Esercizio " +FI ANNO +FL "D" +KE 1 +EN +ST 103 1 +BE +PR 19 0 "Provvisorio " +FI PROVV +FL "D" +KE 1 +EN +ST 101 4 +BE +PR 36 0 "Numerazione " +FI CODNUM +FL "DU" +KE 1 +EN +ST 172 4 +BE +FI TIPODOC +PR 54 0 "Documento " +FL "DU" +EN +NU 104 6 +BE +PR 70 0 "Numero " +FI NDOC +FL "DR" +KE 1 +EN +DA 106 +BE +PR 2 1 "Data " +FI DATADOC +FL "D" +EN +ST 105 1 +BE +PR 19 1 "Stato " +FI STATO +FL "DG" +EN +ST 111 3 +BE +PR 28 1 "Valuta " +FL "U" +CH NORMAL +FI CODVAL +US %VAL +IN CODTAB 111 +DI "Codice" CODTAB +DI "Descrizione@50" S0 +DI "Cambio@15" S4 +DI "Data valuta" D0 +OU 111 CODTAB +HE "Inserisci il codice della valuta" +WA "Codice valuta non trovato" +EN +LI 175 30 +BE +PR 2 2 "Tipo riga da aggiungere " +EN +SPREADSHEET 500 0 -2 +BE +PR 2 3 "" +IT "Lordo@5" +IT "Tipo riga@2" +IT "Mag. @3" +IT "Dep.@2" +IT "Codice Articolo@20" +IT "Codice\nLivello 1@9" +IT "Codice\nLivello 2@9" +IT "Codice\nLivello 3@9" +IT "Codice\nLivello 4@9" +IT "Descrizione@50" +IT "UM@2" +IT "Quantita'@11" +IT "Prezzo@18" +IT "Quantita'\nEvasa@11" +IT "Evasa@1" +IT "Tara@15" +IT "Peso Netto@15" +IT "N.Colli@7" +IT "Da evadere@1" +IT "Sconto@25" +IT "Perc.\nProvv.@5" +IT "Imp.Fisso unitario@1" +IT "Importo Fisso@18" +IT "Codice\nIVA@4" +IT "Addebito IVA@1" +IT "Aspetto beni@3" +IT "Causale\nMagazzino@12" +IT "Magazzino\nCollegato@9" +IT "Deposito\nCollegato@9" +IT "Data\nconsegna@10" +IT "Cod. Art. Mag.@20" +IT "Controllato@11" +IT "Quantita'\nagg. 1@13" +IT "Quantita'\nagg. 2@13" +IT "Quantita'\nagg. 3@13" +IT "Quantita'\nagg. 4@13" +IT "Quantita'\nagg. 5@13" +IT "Impianto@8" +IT "Linea@5" +IT "Codice\ncommessa@20" +IT "Fase\ncommessa@10" +EN +CU 708 15 +BE +PR 2 -1 "Imponibile " +FI IMPONIBILI +FL "D" +EN +CU 709 15 +BE +PR 30 -1 "Imposta " +FI IMPOSTE +FL "D" +EN +CU 610 15 +BE +PR 55 -1 "Totale " +FI TOTDOC +FL "D" +EN +EN +ENDMASK +PA "" -1 -1 76 21 +BO 101 +BE +PR 2 1 "Lordo " +EN +ST 102 2 +BE +PR 2 2 "Tipo riga " +US %TRI +IN CODTAB 102 +OU 254 S0 +CH REQUIRED +FL "DG" +FI TIPORIGA +EN +ST 254 25 +BE +PR 22 2 "" +FL "D" +EN +ST 103 3 +BE +PR 2 3 "Magazzino " +US MAG SE CODTAB[4,5]=="" +IN CODTAB 103 +DI "Codice" CODTAB +DI "Descrizione@50" S0 +OU 103 CODTAB +OU 250 S0 +WA "Magazzino assente" +FL "U" +KE 1 +CH NORMAL +FI CODMAG[1,3] +EN +ST 250 50 +BE +PR 22 3 "" +FL "D" +EN +ST 104 2 +BE +PR 2 4 "Deposito " +US MAG SE (CODTAB[1,3]==#103) && (CODTAB[4,5]!="") +IN CODTAB[1,3] 103 +IN CODTAB[4,5] 104 +DI "Codice mag." CODTAB[1,3] +DI "Codice dep." CODTAB[4,5] +DI "Descrizione@50" S0 +OU 103 CODTAB[1,3] +OU 104 CODTAB[4,5] +OU 251 S0 +ME DIRTY,103|9,103 +CH NORMAL +WA "Deposito assente" +FL "U" +KE 1 +FI CODMAG[4,5] +EN +ST 251 50 +BE +PR 22 4 "" +FL "D" +EN +ST 105 20 +BE +PR 2 6 "Articolo " +US 47 KE 1 +IN CODART 105 +DI "Codice@20" CODART +DI "Descrizione@50" DESCR +OU 105 CODART +WA "Articolo assente" +FL "U" +FI CODART +ADD RU ve2 -3 +EN +ST 131 20 +BE +PR 50 50 "" +FI CODARTMAG +FL "G" +EN +BO 132 +BE +PR 51 50 "" +FI CHECKED +FL "D" +EN +ST 106 10 +BE +PR 37 6 "" +FL "U" +US GCG +JO FCG AL 500 INTO CODTAB==CODTAB[1,1] +IN CODTAB[1,1] "1" +IN CODTAB[2,] 106 +DI "Livello@20" 500@->S0 +DI "Gruppo@10" CODTAB[2,] +DI "Descrizione@30" S0 +OU 106 CODTAB[2,] +ME 0 RESET,107|RESET,108|RESET,109 +ME ENABLE,107 +CH NORMAL +EN +ST 107 6 +BE +PR 50 6 "" +FL "U" +US GCG +JO FCG AL 500 INTO CODTAB==CODTAB[1,1] +IN CODTAB[1,1] "2" +IN CODTAB[2,] 107 +DI "Livello@20" 500@->S0 +DI "Gruppo@10" CODTAB[2,] +DI "Descrizione@30" S0 +OU 107 CODTAB[2,] +ME 0 RESET,108|RESET,109 +ME ENABLE,108 +CH NORMAL +EN +ST 108 6 +BE +PR 59 6 "" +FL "U" +US GCG +JO FCG AL 500 INTO CODTAB==CODTAB[1,1] +IN CODTAB[1,1] "3" +IN CODTAB[2,] 108 +DI "Livello@20" 500@->S0 +DI "Gruppo@10" CODTAB[2,] +DI "Descrizione@30" S0 +OU 108 CODTAB[2,] +ME 0 RESET,109 +ME ENABLE,109 +CH NORMAL +EN +ST 109 6 +BE +PR 67 6 "" +FL "U" +US GCG +JO FCG AL 500 INTO CODTAB==CODTAB[1,1] +IN CODTAB[1,1] "4" +IN CODTAB[2,] 109 +DI "Livello@20" 500@->S0 +DI "Gruppo@10" CODTAB[2,] +DI "Descrizione@30" S0 +OU 109 CODTAB[2,] +CH NORMAL +EN +ST 262 8 +BE +PR 2 6 "Codice " +FL "U" +US 55 +IN CODICE 262 +DI "Codice" CODICE +DI "Descrizione@50" DESCR +OU 110 DESCR +OU 262 CODICE +CH NORMAL +ADD RU ve0 -5 +EN +ZO 110 50 +BE +PR 2 7 "Descrizione " +CO ALL 262 +ADD RU ve0 -5 +FI DESCR +EN +ST 111 2 +BE +PR 2 9 "U.M. " +US 49 KE 2 +JO %UMS INTO CODTAB=UM +IN CODART 131 SE +IN UM 111 +DI "Codice@20" UM +DI "Descrizione@50" %UMS->S0 +OU 111 UM +FI UMQTA +FLAG "U" +CH REQUIRED +EN +ST 211 2 +BE +PR 2 9 "U.M. " +US %UMS +IN CODTAB 211 +DI "Codice" CODTAB +DI "Descrizione@50" S0 +OU 211 CODTAB +FI UMQTA +FLAG "U" +CH NORMAL +EN +NU 112 13 5 +BE +PR 21 9 "Qta' " +FI QTA +EN +NU 212 6 2 +BE +PR 21 9 "Spesa % " +FL "H" +FI QTA +EN +CURRENCY 113 18 +BE +PR 42 9 "Prezzo " +FL "U" +FI PREZZO +EN +NU 114 13 5 +BE +PR 15 10 "Qta' evasa " +FI QTAEVASA +EN +BO 115 +BE +PR 42 10 "Saldata " +FI RIGAEVASA +EN +DA 130 +BE +PR 53 10 "Consegna " +FI DATACONS +EN +NU 118 7 +BE +PR 2 12 "N.Colli " +FI NCOLLI +EN +NU 116 15 2 +BE +PR 22 12 "Tara " +FI TARA +EN +NU 117 15 2 +BE +PR 46 12 "Peso netto " +FI PNETTO +EN +BO 119 +BE +PR 68 12 "Da evadere " +FI DAEVADERE +EN +ST 120 25 +BE +PR 2 13 "Sconto " +FI SCONTO +EN +NU 121 5 2 +BE +PR 42 13 "Perc.Provv. " +FI PERCPROV +EN +BO 122 +BE +PR 2 14 "Importo provv.unitario" +FI IMPFISUN +EN +CURRENCY 123 18 +BE +PR 42 14 "Imp.Provv. " +FI IMPFISSO +EN +ST 124 4 +BE +PR 2 15 "Cod. IVA " +US %IVA +IN CODTAB 124 +DI "Codice@20" CODTAB +DI "Descrizione@50" S0 +OU 124 CODTAB +OU 252 S0 +FL "U" +VA 19 1 2 +CH NORMAL +FI CODIVA +EN +ST 252 50 +BE +PR 22 15 "" +US %IVA KE 2 +IN S0 252 +DI "Descrizione@50" S0 +DI "Codice@20" CODTAB +OU 124 CODTAB +OU 252 S0 +EN +BO 125 +BE +PR 2 16 "Addebito IVA" +FI ADDIVA +EN +ST 126 2 +BE +PR 2 17 "Asp. Beni " +US %ABE +IN CODTAB 126 +DI "Codice@20" CODTAB +DI "Descrizione@50" S0 +OU 126 CODTAB +OU 253 S0 +FL "UZ" +CH NORMAL +FI ASPBENI +EN +ST 253 50 +BE +PR 22 17 "" +FL "D" +EN +ST 127 5 +BE +PR 2 18 "Caus.mag. " +US %CAU +IN CODTAB 127 +DI "Codice@20" CODTAB +DI "Descrizione@50" S0 +OU 127 CODTAB +OU 255 S0 +FL "U" +CH NORMAL +FI CAUSMAG +EN +ST 255 50 +BE +PR 22 18 "" +FL "D" +EN +BU 1 10 2 +BE +PR -14 -1 "" +EN +BU 2 10 2 +BE +PR -24 -1 "" +EN +BU 17 10 2 +BE +PR -34 -1 "Elimina" +ME EXIT,127 +EN +BU 100 10 2 +BE +PR -44 -1 "~Collega" +PI 117 +EN +EN +PA "Pag.2" -1 -1 76 21 +ST 128 3 +BE +PR 2 3 "Mag.colleg. " +CO US 103 +IN CODTAB 128 +DI "Codice" CODTAB +DI "Descrizione@50" S0 +OU 128 CODTAB +OU 256 S0 +WA "Magazzino assente" +FL "U" +KE 1 +CH NORMAL +FI CODMAGC[1,3] +EN +ST 256 50 +BE +PR 22 3 "" +FL "D" +EN +ST 129 2 +BE +PR 2 4 "Deposito " +US MAG SE (CODTAB[1,3]==#128) && (CODTAB[4,5]!="") +IN CODTAB[1,3] 128 +IN CODTAB[4,5] 129 +DI "Codice mag." CODTAB[1,3] +DI "Codice dep." CODTAB[4,5] +DI "Descrizione@50" S0 +OU 128 CODTAB[1,3] +OU 129 CODTAB[4,5] +OU 257 S0 +ME DIRTY,128|9,128 +CH NORMAL +WA "Deposito assente" +FL "U" +KE 1 +FI CODMAGC[4,5] +EN +ST 257 50 +BE +PR 22 4 "" +FL "D" +EN +NU 133 13 5 +BE +PR 2 6 "Qta' agg.1 " +FI QTAGG1 +EN +NU 134 13 5 +BE +PR 28 6 "2 " +FI QTAGG2 +EN +NU 135 13 5 +BE +PR 44 6 "3 " +FI QTAGG3 +EN +NU 136 13 5 +BE +PR 12 7 "4 " +FI QTAGG4 +EN +NU 137 13 5 +BE +PR 28 7 "5 " +FI QTAGG5 +EN +ST 138 5 +BE +PR 2 9 "Impianto " +US IMP +IN CODTAB 138 +DI "Codice Impianto" CODTAB +DI "Descrizione @50" S0 +OU 138 CODTAB +OU 258 S0 +FI IMPIANTO +FL "U" +CH NORMAL +EN +ST 258 50 +BE +PR 22 9 "" +US IMP KE 2 +IN S0 258 +DI "Descrizione @50" S0 +DI "Codice Impianto" CODTAB +CO OU 138 +CH NORMAL +EN +ST 139 5 +BE +PR 2 10 "Linea " +US LNP +IN CODTAB 139 +DI "Codice Linea" CODTAB +DI "Descrizione @50" S0 +OU 139 CODTAB +OU 259 S0 +FI LINEA +FL "U" +CH NORMAL +EN +ST 259 50 +BE +PR 22 10 "" +US LNP KE 2 +IN S0 259 +DI "Descrizione @50" S0 +DI "Codice Linea" CODTAB +CO OU 139 +CH NORMAL +EN +ST 140 20 +BE +PR 2 11 "Commessa " +US CMS +IN CODTAB 140 +DI "Codice commessa@20" CODTAB +DI "Descrizione @50" S0 +OU 140 CODTAB +OU 260 S0 +FI CODCMS +FL "UZ" +CH NORMAL +EN +ST 260 50 +BE +PR 14 12 "" +US CMS KE 2 +IN S0 260 +DI "Descrizione @50" S0 +DI "Codice commessa@20" CODTAB +CO OU 140 +CH NORMAL +EN +ST 141 10 +BE +PR 2 13 "Fase " +US FSC +IN CODTAB 141 +DI "Codice Fase@10" CODTAB +DI "Descrizione @50" S0 +OU 141 CODTAB +OU 260 S0 +FI FASCMS +FL "UZ" +CH NORMAL +EN +ST 261 50 +BE +PR 14 14 "" +US FAS KE 2 +IN S0 261 +DI "Descrizione @50" S0 +DI "Codice Fase@10" CODTAB +CO OU 141 +CH NORMAL +EN +BU 1 10 2 +BE +PR -14 -1 "" +EN +BU 2 10 2 +BE +PR -24 -1 "" +EN +EN +ENDMASK diff --git a/vd/turni.h b/vd/turni.h new file mode 100755 index 000000000..c07b7bd33 --- /dev/null +++ b/vd/turni.h @@ -0,0 +1,24 @@ +#define TRN_CODCASSA "CODCASSA" +#define TRN_ANNO "ANNO" +#define TRN_PROGR "PROGR" +#define TRN_USERNAME "USERNAME" +#define TRN_DATA "DATA" +#define TRN_INIZIO "INIZIO" +#define TRN_FINE "FINE" +#define TRN_CASSAINI "CASSAINI" +#define TRN_INC01 "INC01" +#define TRN_INC02 "INC02" +#define TRN_INC03 "INC03" +#define TRN_INC04 "INC04" +#define TRN_INC05 "INC05" +#define TRN_INC06 "INC06" +#define TRN_INC07 "INC07" +#define TRN_INC08 "INC08" +#define TRN_SOSPESI "SOSPESI" +#define TRN_RESTI "RESTI" +#define TRN_CASSAFIN "CASSAFIN" +#define TRN_DIFF "DIFF" +#define TRN_FNDOC "FNDOC" +#define TRN_LNDOC "LNDOC" +#define TRN_NUMSCONTR "NUMSCONTR" +#define TRN_CHIUSO "CHIUSO" diff --git a/vd/v0300c.cpp b/vd/v0300c.cpp new file mode 100755 index 000000000..e69de29bb diff --git a/vd/vd0.cpp b/vd/vd0.cpp new file mode 100755 index 000000000..023806a5d --- /dev/null +++ b/vd/vd0.cpp @@ -0,0 +1,33 @@ +#include +#include "vd0.h" + +int main(int argc, char** argv) +{ + const int n = argc > 1 ? argv[1][1]-'0' : 0; + switch (n) + { + case 1: + vd0200(argc, argv); // Stampa Tabella + break; + case 2: + vd0300(argc, argv); // Parametri Ditta + break; + case 3: + vd0400(argc, argv); // Paramentri Stazione + break; + case 4: + vd0500(argc, argv); // Apertura Turno + break; + case 5: + vd0600(argc, argv); // Chiusura Turno + break; + case 6: + vd0700(argc, argv); // Vendita al Banco + break; + case 0: + default: + vd0100(argc, argv); // Tabella + break; + } + return 0; +} \ No newline at end of file diff --git a/vd/vd0.h b/vd/vd0.h new file mode 100755 index 000000000..c93598403 --- /dev/null +++ b/vd/vd0.h @@ -0,0 +1,7 @@ +int vd0100(int argc, char* argv[]); +int vd0200(int argc, char* argv[]); +int vd0300(int argc, char* argv[]); +int vd0400(int argc, char* argv[]); +int vd0500(int argc, char* argv[]); +int vd0600(int argc, char* argv[]); +int vd0700(int argc, char* argv[]); \ No newline at end of file diff --git a/vd/vd0100.cpp b/vd/vd0100.cpp new file mode 100755 index 000000000..5ede495c4 --- /dev/null +++ b/vd/vd0100.cpp @@ -0,0 +1,165 @@ +#include +#include +#include +#include + +#include "vd0.h" +#include "vdtbopd.h" + +#define OPDTAB "OPD" + +#ifndef TTable_application +#define TTable_application Tab_application +#endif + +TTable_application& app() { return (TTable_application&)main_app(); } + +/////////////////////////////////////////////////////////// +// TVendita_dettaglio_tables +/////////////////////////////////////////////////////////// + +class TVendita_dettaglio_tables : public TTable_application +{ + +protected: + virtual TString& get_mask_name(TString& name) const; + virtual TMask* set_mask(TMask* m); + virtual void init_query_mode(TMask& m); + virtual void init_query_insert_mode(TMask& m); + virtual void init_insert_mode(TMask& m); + virtual void init_modify_mode(TMask& m) { init_insert_mode(m);} + virtual bool user_create() ; + + virtual int read(TMask& m); + virtual int write(const TMask& m); + virtual int rewrite(const TMask& m); + virtual bool remove(); + + virtual void ini2mask(TConfig& ini, TMask& m, bool query); + virtual void mask2ini(const TMask& m, TConfig& ini); + +public: + TVendita_dettaglio_tables() {} + virtual ~TVendita_dettaglio_tables() {} +}; + +TString& TVendita_dettaglio_tables::get_mask_name(TString& name) const +{ + name = get_tabname(); + if (name[0] == '%') name.ltrim(1); + name.insert("vdtb", 0); + return name; +} + +TMask* TVendita_dettaglio_tables::set_mask(TMask* m) +{ + if (m == NULL) + { + const TString& tn = get_tabname(); + TString name; get_mask_name(name); + + m = new TMask(name); + } + return TTable_application::set_mask(m); +} + +bool TVendita_dettaglio_tables::user_create() +{ + const TString & tabname = argv(2); + + if (tabname == OPDTAB && user() != dongle().administrator()) + return error_box(FR("L'utente %s non e' abilitato all'esecuzione di questo programma"), (const char*)user()); + return TTable_application::user_create(); +} + +void TVendita_dettaglio_tables::init_query_mode(TMask& m) +{ + if (get_tabname() == OPDTAB) + { + m.show(F_USERTAB); + m.enable(F_USERTAB); + m.hide(F_USER); + m.disable(F_USER); + } +} + + +void TVendita_dettaglio_tables::init_query_insert_mode(TMask& m) +{ + if (get_tabname() == OPDTAB) + { + m.show(F_USER); + m.enable(F_USER); + m.hide(F_USERTAB); + m.disable(F_USERTAB); + } +} + +void TVendita_dettaglio_tables::init_insert_mode(TMask& m) +{ + if (get_tabname() == OPDTAB) + { + m.enable_default(); + const TString & name = cache().get(LF_USER, m.get(F_USERTAB), USR_USERDESC); + + m.set(F_USERDESC, name); + } +} + +int TVendita_dettaglio_tables::read(TMask& m) +{ + const TString& tn = get_tabname(); + const int err = TTable_application::read(m); + + return err; +} + +int TVendita_dettaglio_tables::write(const TMask& m) +{ + const TString& tn = get_tabname(); + const int err = TTable_application::write(m); + + return err; +} + +int TVendita_dettaglio_tables::rewrite(const TMask& m) +{ + const TString& tn = get_tabname(); + const int err = TTable_application::rewrite(m); + + return err; +} + +bool TVendita_dettaglio_tables::remove() +{ + const bool ok = TTable_application::remove(); + + return ok; +} + +void TVendita_dettaglio_tables::ini2mask(TConfig& ini, TMask& m, bool query) +{ + TTable_application::ini2mask(ini, m, query); +} + +void TVendita_dettaglio_tables::mask2ini(const TMask& m, TConfig& ini) +{ + TTable_application::mask2ini(m, ini); +} + +/////////////////////////////////////////////////////////// +// Main +/////////////////////////////////////////////////////////// + +int vd0100(int argc, char* argv[]) +{ + if (argc > 2) + { + TString name; + name << TR("Tabella ") << argv[2]; + TVendita_dettaglio_tables a; + a.run(argc, argv, name); + } + return 0; +} + diff --git a/vd/vd0200.cpp b/vd/vd0200.cpp new file mode 100755 index 000000000..84d47751c --- /dev/null +++ b/vd/vd0200.cpp @@ -0,0 +1,111 @@ +//Programma per stampa report tabelle + +#include +#include +#include +#include +#include +#include "../ba/ba3200.h" +#define F_REPORT 250 + +/////////////////////////////////////////////////////////// +// TMask_print_table +/////////////////////////////////////////////////////////// + +class TMask_print_table : public TAutomask +{ + +protected: + bool on_field_event(TOperable_field& o, TField_event e, long jolly) {return true;} +public: + TMask_print_table(const char * name); + virtual ~TMask_print_table() {} +}; + +TMask_print_table::TMask_print_table(const char * name) + :TAutomask(name) +{ + TEdit_field & f = add_string(F_REPORT, 0, TR("Report "), 2, -3, 20, "B"); + f.set_query_button(new TReport_select(&f, name)); + f.enable_check(); +} + +/////////////////////////////////////////////////////////// +// TTable_report +/////////////////////////////////////////////////////////// + +class TTable_report : public TReport +{ +public: + virtual bool use_mask() { return false;} + + TTable_report() {} + virtual ~TTable_report() {} +}; + +/////////////////////////////////////////////////////////// +// TTable_dettaglio_reporter +/////////////////////////////////////////////////////////// + +class TTable_dettaglio_reporter : public TSkeleton_application +{ +protected: + virtual void main_loop(); + +public: + bool get_rpt_name(TFilename& rptname) const; +}; + + +bool TTable_dettaglio_reporter::get_rpt_name(TFilename& rptname) const +{ + TTable tab(argv(2)); + + rptname = tab.get("COD"); + rptname.insert("vdst", 0); + rptname.ext("rep"); + rptname.lower(); + return rptname.custom_path(); +} + +void TTable_dettaglio_reporter::main_loop() +{ + TFilename rptname; + + if (get_rpt_name(rptname)) + { + + TFilename msk(rptname.name()); msk.ext(""); msk.lower(); + TMask_print_table m(msk); + + while (m.run() == K_ENTER) + { + TTable_report rep; + TReport_book book; + TString name(m.get(F_REPORT)); + + if (name.empty()) + name = rptname; + rep.load(name); + rep.mask2report(m); + book.add(rep); + book.print_or_preview(); + } + } + else + error_box(FR("Manca il file %s"), (const char *)rptname); +} + + +int vd0200(int argc, char* argv[]) +{ + if (argc > 2) + { + TString name; + TTable_dettaglio_reporter app; + + name << TR("Stampa Tabelle ") << argv[2]; + app.run(argc, argv, name); + } + return 0; +} \ No newline at end of file diff --git a/vd/vd0300.cpp b/vd/vd0300.cpp new file mode 100755 index 000000000..6e852a2db --- /dev/null +++ b/vd/vd0300.cpp @@ -0,0 +1,103 @@ +#include + +#include "vdconf.h" +#include "../ve/velib.h" + +class TConf_vendita_ditta : public TConfig_application +{ + static bool check_fields(TMask_field& f, KEY k); + virtual TMask* create_mask(const TFilename& f); + +public: + // @cmember Disabilita la verifica del modulo in chiave + virtual bool check_autorization() const { return false; } + + virtual bool preprocess_config (TMask& mask, TConfig& config); + virtual bool postprocess_config (TMask& mask, TConfig& config); + virtual bool user_create( ); + virtual bool user_destroy( ); + + TConf_vendita_ditta() : TConfig_application( CONFIG_DITTA ){ } + virtual ~TConf_vendita_ditta( ){ } +}; + +bool tipo_handler( TMask_field& f, KEY k) +{ + TMask& m = f.mask(); + + if (f.to_check(k)) + { + TCodice_numerazione cod_num(m.get(FD_CODNUM)); + const TString& tipo = f.get(); + int last = cod_num.ntipi_doc(); + for (int i = 0; i < last; i++ ) + { + const TString16 curtipo(cod_num.tipo_doc(i)); + if (curtipo == tipo) + return true; + } + return f.error_box( TR("Tipo non valido per la numerazione selezionata!")); + } + return true; +} + +bool TConf_vendita_ditta::check_fields(TMask_field& f, KEY k) +{ + return true; +} + +bool TConf_vendita_ditta::preprocess_config (TMask& mask, TConfig& config) +{ + return true; +} + +bool TConf_vendita_ditta::postprocess_config (TMask& mask, TConfig& config) +{ + bool ok = true; + TString_array codes; + + for (int i = 0 ; ok && i< 8; i++) + { + const TString & codpag = mask.get(FD_CODPAG01 + ROW_INC * i); + if (codpag.not_empty()) + { + const int row = codes.find(codpag); + + if (row == -1) + codes.add(codpag); + else + ok = error_box(FR("Il codice %s č gią stato utilņizzato nella riga %d"), (const char *) codpag, row + 1); + } + } + + return ok; +} + +TMask* TConf_vendita_ditta::create_mask(const TFilename& f) +{ + TMask* m = TConfig_application::create_mask(f); + + m->set_handler(FD_TIPODOC, tipo_handler); + return m; +} + +bool TConf_vendita_ditta::user_create( ) +{ + + TConfig conf(CONFIG_DITTA); + + conf.set( "EdMask", "vd0300a", "vd"); + return true; +} + +bool TConf_vendita_ditta::user_destroy( ) +{ + return true; +} + +int vd0300(int argc, char* argv[]) +{ + TConf_vendita_ditta appc; + appc.run(argc, argv, TR("Parametri ditta vendita al banco")); + return 0; +} \ No newline at end of file diff --git a/vd/vd0300a.uml b/vd/vd0300a.uml new file mode 100755 index 000000000..baeac8670 --- /dev/null +++ b/vd/vd0300a.uml @@ -0,0 +1,498 @@ +#include "vdconf.h" + +TOOLBAR "" 0 20 0 2 + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -12 -1 "" +END + +BUTTON DLG_QUIT 10 2 +BEGIN + PROMPT -22 -1 "" +END + +ENDPAGE + +PAGE "Parametri ditta" 1 1 60 14 + +STRING FD_FILIALE 2 +BEGIN + PROMPT 2 2 "Filiale " + FIELD FILIALE + USE FLD + INPUT CODTAB FD_FILIALE + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT FD_FILIALE CODTAB + OUTPUT FD_DESFIL S0 + CHECKTYPE REQUIRED + FLAG "UZ" +END + +STRING FD_DESFIL 50 40 +BEGIN + PROMPT 30 2 "" + USE FLD KEY 2 + INPUT S0 FD_DESFIL + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice" CODTAB + COPY OUTPUT FD_FILIALE +END + +STRING FD_CODNUM 4 +BEGIN + PROMPT 2 4 "Numerazione " + FIELD CODNUM + USE %NUM SELECT I1==4 + INPUT CODTAB FD_CODNUM + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT FD_CODNUM CODTAB + OUTPUT FD_DESNUM S0 + CHECKTYPE REQUIRED + FLAG "UPA" +END + +STRING FD_DESNUM 50 40 +BEGIN + PROMPT 30 4 "" + USE %NUM KEY 2 SELECT I1==4 + INPUT S0 FD_DESNUM + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice" CODTAB + COPY OUTPUT FD_CODNUM +END + +STRING FD_TIPODOC 4 +BEGIN + PROMPT 2 6 "Tipo documento " + FIELD TIPODOC + USE %TIP SELECT I1==4 + INPUT CODTAB FD_TIPODOC + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT FD_TIPODOC CODTAB + OUTPUT FD_DESTIPODOC S0 + CHECKTYPE REQUIRED + FLAG "UP" +END + +STRING FD_DESTIPODOC 50 40 +BEGIN + PROMPT 30 6 "" + HELP "Descrizione tipo documento" + USE %TIP KEY 2 SELECT I1==4 + INPUT S0 FD_DESTIPODOC + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice" CODTAB + COPY OUTPUT FD_TIPODOC +END + +STRING FD_CODLIST 3 +BEGIN + PROMPT 2 8 "Codice listino " + FIELD CODLIST + FLAG "U" + USE LF_CONDV + INPUT TIPO "L" + INPUT CATVEN "" + INPUT COD FD_CODLIST + DISPLAY "Codice" COD + DISPLAY "Descrizione@50" DESCR + OUTPUT FD_CODLIST COD + OUTPUT FD_DESLIST DESCR + CHECKTYPE NORMAL +END + +STRING FD_DESLIST 50 40 +BEGIN + PROMPT 30 8 "" + FLAGS "D" +END + +STRING FD_CODNUMF 4 +BEGIN + PROMPT 2 10 "Numeraz. fatture " + FIELD CODNUMF + USE %NUM SELECT I1==2 + INPUT CODTAB FD_CODNUMF + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT FD_CODNUMF CODTAB + OUTPUT FD_DESNUMF S0 + CHECKTYPE NORMAL + FLAG "UPA" +END + +STRING FD_DESNUMF 50 40 +BEGIN + PROMPT 30 10 "" + USE %NUM KEY 2 SELECT I1==2 + INPUT S0 FD_DESNUMF + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice" CODTAB + COPY OUTPUT FD_CODNUMF +END + +STRING FD_TIPODOCF 4 +BEGIN + PROMPT 2 12 "Tipo doc. fatture " + FIELD TIPODOCF + USE %TIP SELECT I1==2 + INPUT CODTAB FD_TIPODOCF + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT FD_TIPODOCF CODTAB + OUTPUT FD_DESTIPODOCF S0 + CHECKTYPE NORMAL + FLAG "UP" +END + +STRING FD_DESTIPODOCF 50 40 +BEGIN + PROMPT 30 12 "" + HELP "Descrizione tipo documento" + USE %TIP KEY 2 SELECT I1==2 + INPUT S0 FD_DESTIPODOCF + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice" CODTAB + COPY OUTPUT FD_TIPODOCF +END + +BOOLEAN FD_BARPVAR +BEGIN + PROMPT 2 14 "Gestione Barcode a peso variabile" + FIELD BARPVAR +END + +BOOLEAN FD_CODPVAR +BEGIN + PROMPT 2 16 "Gestione codici a peso variabile" + FIELD CODPVAR +END + +ENDPAGE + +PAGE "Pagamenti" 1 1 60 14 + +STRING FD_CODPAG01 4 +BEGIN + PROMPT 2 2 "Pagamento 1 " + FLAGS "U#" + FIELD CODPAG[1] + USE %CPG + INPUT CODTAB FD_CODPAG01 + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT FD_CODPAG01 CODTAB + OUTPUT FD_LABPAG01 S0[1,30] + CHECKTYPE NORMAL + GROUP 1 + MESSAGE EMPTY CLEAR,2@|K_TAB,FD_CODPAG02 + MESSAGE ENABLE,2@ +END + +STRING FD_LABPAG01 30 +BEGIN + PROMPT 30 2 "" + FIELD LABPAG[1] + USE %CPG KEY 2 + INPUT S0 FD_LABPAG01 + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice@10" CODTAB + COPY OUTPUT FD_CODPAG01 + CHECKTYPE SEARCH + GROUP 1 2 +END + +BOOLEAN FD_RESTOPAG01 +BEGIN + PROMPT 70 2 "Resto" + FIELD RESTO[1] + GROUP 1 2 +END + +STRING FD_CODPAG02 4 +BEGIN + PROMPT 2 4 "Pagamento 2 " + FLAGS "U#" + FIELD CODPAG[2] + USE %CPG + INPUT CODTAB FD_CODPAG02 + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT FD_CODPAG02 CODTAB + OUTPUT FD_LABPAG02 S0[1,30] + CHECKTYPE NORMAL + FLAGS "DG" + GROUP 2 + MESSAGE EMPTY CLEAR,3@|K_TAB,FD_CODPAG03 + MESSAGE ENABLE,3@ +END + +STRING FD_LABPAG02 30 +BEGIN + PROMPT 30 4 "" + FIELD LABPAG[2] + USE %CPG KEY 2 + INPUT S0 FD_LABPAG02 + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice@10" CODTAB + COPY OUTPUT FD_CODPAG02 + CHECKTYPE SEARCH + FLAGS "DG" + GROUP 2 3 +END + +BOOLEAN FD_RESTOPAG02 +BEGIN + PROMPT 70 4 "Resto" + FIELD RESTO[2] + FLAGS "DG" + GROUP 2 3 +END + +STRING FD_CODPAG03 4 +BEGIN + PROMPT 2 6 "Pagamento 3 " + FLAGS "U#" + FIELD CODPAG[3] + USE %CPG + INPUT CODTAB FD_CODPAG03 + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT FD_CODPAG03 CODTAB + OUTPUT FD_LABPAG03 S0[1,30] + CHECKTYPE NORMAL + FLAGS "DG" + GROUP 3 + MESSAGE EMPTY CLEAR,4@|K_TAB,FD_CODPAG04 + MESSAGE ENABLE,4@ +END + +STRING FD_LABPAG03 30 +BEGIN + PROMPT 30 6 "" + FIELD LABPAG[3] + USE %CPG KEY 2 + INPUT S0 FD_LABPAG03 + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice@10" CODTAB + COPY OUTPUT FD_CODPAG03 + CHECKTYPE SEARCH + FLAGS "DG" + GROUP 3 4 +END + +BOOLEAN FD_RESTOPAG03 +BEGIN + PROMPT 70 6 "Resto" + FIELD RESTO[3] + FLAGS "DG" + GROUP 3 4 +END + +STRING FD_CODPAG04 4 +BEGIN + PROMPT 2 8 "Pagamento 4 " + FLAGS "U#" + FIELD CODPAG[4] + USE %CPG + INPUT CODTAB FD_CODPAG04 + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT FD_CODPAG04 CODTAB + OUTPUT FD_LABPAG04 S0[1,30] + CHECKTYPE NORMAL + FLAGS "DG" + GROUP 4 + MESSAGE EMPTY CLEAR,5@|K_TAB,FD_CODPAG05 + MESSAGE ENABLE,5@ + +END + +STRING FD_LABPAG04 30 +BEGIN + PROMPT 30 8 "" + FIELD LABPAG[4] + USE %CPG KEY 2 + INPUT S0 FD_LABPAG04 + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice@10" CODTAB + COPY OUTPUT FD_CODPAG04 + CHECKTYPE SEARCH + FLAGS "DG" + GROUP 4 5 +END + +BOOLEAN FD_RESTOPAG04 +BEGIN + PROMPT 70 8 "Resto" + FIELD RESTO[4] + FLAGS "DG" + GROUP 4 5 +END + +STRING FD_CODPAG05 4 +BEGIN + PROMPT 2 10 "Pagamento 5 " + FLAGS "U#" + FIELD CODPAG[5] + USE %CPG + INPUT CODTAB FD_CODPAG05 + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT FD_CODPAG05 CODTAB + OUTPUT FD_LABPAG05 S0[1,30] + CHECKTYPE NORMAL + FLAGS "DG" + GROUP 5 + MESSAGE EMPTY CLEAR,6@|K_TAB,FD_CODPAG06 + MESSAGE ENABLE,6@ +END + +STRING FD_LABPAG05 30 +BEGIN + PROMPT 30 10 "" + FIELD LABPAG[5] + USE %CPG KEY 2 + INPUT S0 FD_LABPAG05 + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice@10" CODTAB + COPY OUTPUT FD_CODPAG05 + CHECKTYPE SEARCH + FLAGS "DG" + GROUP 5 6 +END + +BOOLEAN FD_RESTOPAG05 +BEGIN + PROMPT 70 10 "Resto" + FIELD RESTO[5] + FLAGS "DG" + GROUP 5 6 +END + +STRING FD_CODPAG06 4 +BEGIN + PROMPT 2 12 "Pagamento 6 " + FLAGS "U#" + FIELD CODPAG[6] + USE %CPG + INPUT CODTAB FD_CODPAG06 + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT FD_CODPAG06 CODTAB + OUTPUT FD_LABPAG06 S0[1,30] + CHECKTYPE NORMAL + FLAGS "DG" + GROUP 6 + MESSAGE EMPTY CLEAR,7@|K_TAB,FD_CODPAG07 + MESSAGE ENABLE,7@ + +END + +STRING FD_LABPAG06 30 +BEGIN + PROMPT 30 12 "" + FIELD LABPAG[6] + USE %CPG KEY 2 + INPUT S0 FD_LABPAG06 + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice@10" CODTAB + COPY OUTPUT FD_CODPAG06 + CHECKTYPE SEARCH + FLAGS "DG" + GROUP 6 7 +END + +BOOLEAN FD_RESTOPAG06 +BEGIN + PROMPT 70 12 "Resto" + FIELD RESTO[6] + FLAGS "DG" + GROUP 6 7 +END + +STRING FD_CODPAG07 4 +BEGIN + PROMPT 2 14 "Pagamento 7 " + FLAGS "U#" + FIELD CODPAG[7] + USE %CPG + INPUT CODTAB FD_CODPAG07 + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT FD_CODPAG07 CODTAB + OUTPUT FD_LABPAG07 S0[1,30] + CHECKTYPE NORMAL + FLAGS "DG" + GROUP 7 + MESSAGE EMPTY CLEAR,8@|K_TAB,FD_CODPAG08 + MESSAGE ENABLE,8@ +END + +STRING FD_LABPAG07 30 +BEGIN + PROMPT 30 14 "" + FIELD LABPAG[7] + USE %CPG KEY 2 + INPUT S0 FD_LABPAG07 + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice@10" CODTAB + COPY OUTPUT FD_CODPAG07 + CHECKTYPE SEARCH + FLAGS "DG" + GROUP 7 8 +END + +BOOLEAN FD_RESTOPAG07 +BEGIN + PROMPT 70 14 "Resto" + FIELD RESTO[7] + FLAGS "DG" + GROUP 7 8 +END + +STRING FD_CODPAG08 4 +BEGIN + PROMPT 2 16 "Pagamento 8 " + FLAGS "U#" + FIELD CODPAG[8] + USE %CPG + INPUT CODTAB FD_CODPAG08 + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT FD_CODPAG08 CODTAB + OUTPUT FD_LABPAG08 S0[1,30] + CHECKTYPE NORMAL + FLAGS "DG" + GROUP 8 +END + +STRING FD_LABPAG08 30 +BEGIN + PROMPT 30 16 "" + FIELD LABPAG[8] + USE %CPG KEY 2 + INPUT S0 FD_LABPAG08 + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice@10" CODTAB + COPY OUTPUT FD_CODPAG08 + CHECKTYPE SEARCH + FLAGS "DG" + GROUP 8 +END + +BOOLEAN FD_RESTOPAG08 +BEGIN + PROMPT 70 16 "Resto" + FIELD RESTO[8] + FLAGS "DG" + GROUP 8 +END + +ENDPAGE + +ENDMASK diff --git a/vd/vd0400.cpp b/vd/vd0400.cpp new file mode 100755 index 000000000..88bb0afd0 --- /dev/null +++ b/vd/vd0400.cpp @@ -0,0 +1,49 @@ +#include + +#include "vdconf.h" + +class TConf_vendita_wst : public TConfig_application +{ +public: + // @cmember Disabilita la verifica del modulo in chiave + virtual bool check_autorization() const { return false; } + + virtual bool preprocess_config (TMask& mask, TConfig& config); + virtual bool postprocess_config (TMask& mask, TConfig& config); + virtual bool user_create( ); + virtual bool user_destroy( ); + + TConf_vendita_wst() : TConfig_application( CONFIG_WST ){ } + virtual ~TConf_vendita_wst( ){ } +}; + +bool TConf_vendita_wst::preprocess_config (TMask& mask, TConfig& config) +{ + return true; +} + +bool TConf_vendita_wst::postprocess_config (TMask& mask, TConfig& config) +{ + return true; +} + + +bool TConf_vendita_wst::user_create( ) +{ + TConfig conf(CONFIG_WST); + + conf.set( "EdMask", "vd0400a", "vd"); + return true; +} + +bool TConf_vendita_wst::user_destroy( ) +{ + return true; +} + +int vd0400(int argc, char* argv[]) +{ + TConf_vendita_wst appc; + appc.run(argc, argv, TR("Parametri ditta vendita al banco")); + return 0; +} \ No newline at end of file diff --git a/vd/vd0400a.uml b/vd/vd0400a.uml new file mode 100755 index 000000000..0f33ac2b1 --- /dev/null +++ b/vd/vd0400a.uml @@ -0,0 +1,245 @@ +#include "vdconf.h" + +TOOLBAR "" 0 20 0 2 + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -12 -1 "" +END + +BUTTON DLG_QUIT 10 2 +BEGIN + PROMPT -22 -1 "" +END + +ENDPAGE + +PAGE "Paramentri stazione" 1 1 60 14 + +NUMBER FW_CASSA 3 +BEGIN + PROMPT 2 2 "Numero Cassa " + FIELD NCASSA + USE CAS + INPUT CODTAB FW_CASSA + DISPLAY "Codice " CODTAB + DISPLAY "Descrizione@50 " S0 + OUTPUT FW_CASSA CODTAB + CHECKTYPE REQUIRED + FLAGS "UZ" +END + +NUMBER FW_CASSETTO 3 +BEGIN + PROMPT 2 4 "Numero Cassetto " + FIELD NCASSETTO + FLAGS "Z" +END + +STRING FW_CODLIST 3 +BEGIN + PROMPT 2 6 "Codice listino " + FIELD CODLIST + FLAG "U" + USE LF_CONDV + INPUT TIPO "L" + INPUT CATVEN "" + INPUT COD FW_CODLIST + DISPLAY "Codice" COD + DISPLAY "Descrizione@50" DESCR + OUTPUT FW_CODLIST COD + OUTPUT FW_DESLIST DESCR + CHECKTYPE NORMAL +END + +STRING FW_DESLIST 50 40 +BEGIN + PROMPT 30 6 "" + FLAGS "D" +END + +STRING FW_CODNUMF 4 +BEGIN + PROMPT 2 8 "Numeraz. fatture " + FIELD CODNUMF + USE %NUM SELECT I1==2 + INPUT CODTAB FW_CODNUMF + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT FW_CODNUMF CODTAB + OUTPUT FW_DESNUMF S0 + CHECKTYPE NORMAL + FLAG "UPA" +END + +STRING FW_DESNUMF 50 40 +BEGIN + PROMPT 30 8 "" + USE %NUM KEY 2 SELECT I1==2 + INPUT S0 FW_DESNUMF + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice" CODTAB + COPY OUTPUT FW_CODNUMF +END + +STRING FW_TIPODOCF 4 +BEGIN + PROMPT 2 10 "Tipo doc. fatture " + FIELD TIPODOCF + USE %TIP SELECT I1==2 + INPUT CODTAB FW_TIPODOCF + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT FW_TIPODOCF CODTAB + OUTPUT FW_DESTIPODOCF S0 + CHECKTYPE NORMAL + FLAG "UP" +END + +STRING FW_DESTIPODOCF 50 40 +BEGIN + PROMPT 30 10 "" + HELP "Descrizione tipo documento" + USE %TIP KEY 2 SELECT I1==2 + INPUT S0 FW_DESTIPODOCF + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice" CODTAB + COPY OUTPUT FW_TIPODOCF +END + +NUMBER FW_QTADEF 4 +BEGIN + PROMPT 2 12 "Quantitą default " + FIELD QTADEF +END + +STRING FW_CASSAAPP 20 +BEGIN + PROMPT 2 14 "App.stampa scontr." + FIELD CASSAAPP +END + +ENDPAGE + +PAGE "Tasti veloci" 1 1 60 14 + +GROUPBOX DLG_NULL 78 10 +BEGIN + PROMPT 1 1 "Tasti Veloci" +END + +STRING FW_TVLABEL1 20 +BEGIN + PROMPT 2 2 "1 - Label " + FIELD TVLABEL[1] + MESSAGE EMPTY CLEAR,FW_TVCMD1 + MESSAGE ENABLE,FW_TVCMD1 +END + +STRING FW_TVCMD1 20 +BEGIN + PROMPT 40 2 "Articolo " + FIELD TVCMD[1] +END + +STRING FW_TVLABEL2 20 +BEGIN + PROMPT 2 3 "2 - Label " + FIELD TVLABEL[2] + MESSAGE EMPTY CLEAR,FW_TVCMD2 + MESSAGE ENABLE,FW_TVCMD2 +END + +STRING FW_TVCMD2 20 +BEGIN + PROMPT 40 3 "Articolo " + FIELD TVCMD[2] +END + +STRING FW_TVLABEL3 20 +BEGIN + PROMPT 2 4 "3 - Label " + FIELD TVLABEL[3] + MESSAGE EMPTY CLEAR,FW_TVCMD3 + MESSAGE ENABLE,FW_TVCMD3 +END + +STRING FW_TVCMD3 20 +BEGIN + PROMPT 40 4 "Articolo " + FIELD TVCMD[3] +END + +STRING FW_TVLABEL4 20 +BEGIN + PROMPT 2 5 "4 - Label " + FIELD TVLABEL[4] + MESSAGE EMPTY CLEAR,FW_TVCMD4 + MESSAGE ENABLE,FW_TVCMD4 +END + +STRING FW_TVCMD4 20 +BEGIN + PROMPT 40 5 "Articolo " + FIELD TVCMD[4] +END + +STRING FW_TVLABEL5 20 +BEGIN + PROMPT 2 6 "5 - Label " + FIELD TVLABEL[5] + MESSAGE EMPTY CLEAR,FW_TVCMD5 + MESSAGE ENABLE,FW_TVCMD5 +END + +STRING FW_TVCMD5 20 +BEGIN + PROMPT 40 6 "Articolo " + FIELD TVCMD[5] +END + +STRING FW_TVLABEL6 20 +BEGIN + PROMPT 2 7 "6 - Label " + FIELD TVLABEL[6] + MESSAGE EMPTY CLEAR,FW_TVCMD6 + MESSAGE ENABLE,FW_TVCMD6 +END + +STRING FW_TVCMD6 20 +BEGIN + PROMPT 40 7 "Articolo " + FIELD TVCMD[6] +END + +STRING FW_TVLABEL7 20 +BEGIN + PROMPT 2 8 "7 - Label " + FIELD TVLABEL[7] + MESSAGE EMPTY CLEAR,FW_TVCMD7 + MESSAGE ENABLE,FW_TVCMD7 +END + +STRING FW_TVCMD7 20 +BEGIN + PROMPT 40 8 "Articolo " + FIELD TVCMD[7] +END + +STRING FW_TVLABEL8 20 +BEGIN + PROMPT 2 9 "8 - Label " + FIELD TVLABEL[8] + MESSAGE EMPTY CLEAR,FW_TVCMD8 + MESSAGE ENABLE,FW_TVCMD8 +END + +STRING FW_TVCMD8 20 +BEGIN + PROMPT 40 9 "Articolo " + FIELD TVCMD[8] +END + +ENDPAGE + +ENDMASK diff --git a/vd/vd0500.cpp b/vd/vd0500.cpp new file mode 100755 index 000000000..511afb4cc --- /dev/null +++ b/vd/vd0500.cpp @@ -0,0 +1,41 @@ +#include + +#include "vd0500a.h" +#include "vdlib.h" + +class TApertura_turno_app : public TSkeleton_application +{ +protected: + virtual bool user_create( ); + virtual bool user_destroy( ); + virtual void main_loop(); + +public: + + TApertura_turno_app() { } + virtual ~TApertura_turno_app( ) { } +}; + +bool TApertura_turno_app::user_create() +{ + return true; +} + +bool TApertura_turno_app::user_destroy() +{ + return true; +} + +void TApertura_turno_app::main_loop() +{ + TTurno_vendita t; + + t.apri(false); +} + +int vd0500(int argc, char* argv[]) +{ + TApertura_turno_app appc; + appc.run(argc, argv, TR("Apertura turno")); + return 0; +} \ No newline at end of file diff --git a/vd/vd0500a.h b/vd/vd0500a.h new file mode 100755 index 000000000..ca4182dc0 --- /dev/null +++ b/vd/vd0500a.h @@ -0,0 +1,5 @@ +#ifndef __VD0500A__ + +#define __VD0500A__ + +#endif \ No newline at end of file diff --git a/vd/vd0600.cpp b/vd/vd0600.cpp new file mode 100755 index 000000000..38af962cc --- /dev/null +++ b/vd/vd0600.cpp @@ -0,0 +1,40 @@ +#include + +#include "vd0600a.h" +#include "vdlib.h" + +class TChiusura_turno_app : public TSkeleton_application +{ +public: + virtual bool user_create( ); + virtual void main_loop(); + virtual bool user_destroy( ); + + TChiusura_turno_app() { } + virtual ~TChiusura_turno_app( ) { } +}; + +bool TChiusura_turno_app::user_create( ) +{ + return true; +} + +bool TChiusura_turno_app::user_destroy( ) +{ + return true; +} + +void TChiusura_turno_app::main_loop() +{ + TTurno_vendita t; + + t.chiudi(); + +} + +int vd0600(int argc, char* argv[]) +{ + TChiusura_turno_app appc; + appc.run(argc, argv, TR("Chiusura turno")); + return 0; +} \ No newline at end of file diff --git a/vd/vd0600a.h b/vd/vd0600a.h new file mode 100755 index 000000000..69eb09af5 --- /dev/null +++ b/vd/vd0600a.h @@ -0,0 +1,5 @@ +#ifndef __VD0600A__ + +#define __VD0600A__ + +#endif \ No newline at end of file diff --git a/vd/vd0700.cpp b/vd/vd0700.cpp new file mode 100755 index 000000000..8856f5b99 --- /dev/null +++ b/vd/vd0700.cpp @@ -0,0 +1,997 @@ +#include "vdlib.h" + +#include "../ve/velib.h" +#include "../ve/sconti.h" +#include "../mg/mglib.h" + +#include +#include +#include +#include + +#include "../mg/anamag.h" +#include "../ve/ve0100.h" +#include "../ve/veini.h" +#include "../ve/veuml.h" +#include "../ve/veuml1.h" +#include "../ve/verig.h" + +#include +#include "vd0700a.h" +#include "vd0700b.h" +#include "vdconf.h" +#include "turni.h" + +class TScontrino_mask; + +class TPerms_mask : public TAutomask +{ +public: + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + + TPerms_mask() : TAutomask("vd0700b") {} + virtual ~TPerms_mask() { } +}; + +bool TPerms_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + switch (o.dlg()) + { + case F_PASSWORD: + if (e == fe_modify) + { + const TString & user = get(F_USERNAME); + const TRectype & rec = cache().get(LF_USER, user); + const TString & pwd = rec.get(USR_PASSWORD); + const TString pass = get(F_PASSWORD); + const bool ok = !rec.empty() && pass == decode(pwd); + + enable(DLG_OK, ok); + } + break; + default: + break; + } + + return true; +} + +class TChiusura_scontrino_mask : public TAutomask +{ + int _items; + TString_array _codpag; + TString_array _labpag; + TBit_array _contanti; + TBit_array _resto; + +public: + const TString & codpag(int i); + const TString & labpag(int i); + + bool is_contanti(int i) { return _contanti[i - 1];} + bool has_resto(int i) { return _resto[i - 1];} + real calcola_saldo(); + real calcola_resto(); + void init(TConfig & d); + void update_doc(TScontrino_mask & m, const TTurno_vendita & t, bool chiuso = true); + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + void reset_mask(int ncassa, const TDate & data, const real & cassa_attuale, const TDocumento & doc); + + TChiusura_scontrino_mask() : TAutomask("vd0700a"), _items(0) {} + virtual ~TChiusura_scontrino_mask() {} +}; + +const TString & TChiusura_scontrino_mask::codpag(int i) +{ + i--; + if (i < _items) + return _codpag.row(i); + else + return EMPTY_STRING; +} + +const TString & TChiusura_scontrino_mask::labpag(int i) +{ + i--; + if (i < _items) + return _labpag.row(i); + else + return EMPTY_STRING; +} + +// Definizione della classe dell'applicazione motore +class TScontrino_application : public TMotore_application +{ + TTurno_vendita *_turno; + TOperatore * _cassiere; + TOperatore * _responsabile; + TString8 _filiale; + TString8 _numdoc; + TString8 _tipodoc; + TString8 _codlist; + TString8 _numdocf; + TString8 _tipodocf; + TString80 _cassa_app; + bool _chk_doc; + bool _barcode_peso_var; + bool _peso_var; + int _npag; + int _ncassa; + int _cassetto; + int _def_qta; + TChiusura_scontrino_mask *_chiusura; + TScontrino_mask * _sc_mask; + TString_array _tv_labels; + TString_array _tv_cmds; + +protected: + virtual bool user_create( ); + virtual bool user_destroy( ); + virtual bool menu(MENU_TAG mt); + virtual TMask* get_mask( int mode ); + virtual const char* get_next_key( ); + virtual void init_query_mode(TMask& m); + virtual void init_modify_mode( TMask& m ); + virtual void init_insert_mode( TMask& m ); + virtual bool save_and_new() const { return true; } + virtual bool has_filtered_cursor() const { return false; } + int read( TMask& m ); + void update_doc( const TMask& m ); + int write( const TMask& m ); + int rewrite( const TMask& m ); + virtual TDocumento_mask & edit_mask() const { CHECK( _sc_mask, "Maschera di edit nulla!" ); return (TDocumento_mask &) *_sc_mask; } + bool build_print_file(const TFilename &file); + + // Operazione +public: + TChiusura_scontrino_mask & chiusura() { return *_chiusura;} + virtual void print(); + int ncassa() const { return _ncassa;} + int def_qta() const { return _def_qta;} + const TString & numdoc() const { return _numdoc;} + const TString & codlist() const { return _codlist;} + const TString & numdocf() const { return _numdocf;} + const TString & tipodocf() const { return _tipodocf;} + const TString_array & tv_cmds() const {return _tv_cmds;} + const TString_array & tv_labels() const {return _tv_labels;} + const TOperatore & curr_user() const { return _responsabile != NULL ? *_responsabile : *_cassiere;} + bool set_responsabile(const char * user); + void set_authorizations(TMask & m); + + TTurno_vendita & turno() { return *_turno;} + + TScontrino_application() : _sc_mask(NULL), _turno(NULL), _chiusura(NULL), + _cassiere(NULL), _responsabile(NULL) {} + virtual ~TScontrino_application(); +}; + +inline TScontrino_application& sapp() { return (TScontrino_application &) main_app(); } + +class TScontrino_mask : public TDocumento_mask +{ +protected: + static bool turno_handler( TMask_field& f, KEY key ); + static bool chiudi_handler( TMask_field& f, KEY key ); + static bool sospendi_handler( TMask_field& f, KEY key ); + static bool search_chiusi_handler(TMask_field& f, KEY key); + static bool search_sospesi_handler(TMask_field& f, KEY key); + static bool tasti_veloci_handler(TMask_field& f, KEY key); + static bool perms_handler( TMask_field& f, KEY key ); + static bool ss_notify(TSheet_field& ss, int r, KEY key); + static bool check_perms(TDocumento & doc, TSheet_field & s, TDocumento_mask & m, int nrow); + +public: + virtual bool is_omaggio_enabled() { return sapp().curr_user().can_change_omaggi();} + + TScontrino_mask(const char* tipodoc); + virtual ~TScontrino_mask() {} +}; + +TScontrino_mask::TScontrino_mask(const char* tipodoc) + :TDocumento_mask(tipodoc) +{ + set_handler(DLG_TURNO, turno_handler); + set_handler(DLG_CHIUDI, chiudi_handler); + set_handler(DLG_SAVEREC, sospendi_handler); + set_handler(DLG_RICSOSP, search_sospesi_handler); + set_handler(DLG_RICCHIUSI, search_chiusi_handler); + set_handler(DLG_PERMS, perms_handler); + if (id2pos(F_CODLIST) < 0) + add_string(F_CODLIST, 0, "Listino", 60, 60, 4, "HP"); + for (short id = F_FUNC1; id <= F_FUNC8; id++) + { + const TString & label = sapp().tv_labels().row(id - F_FUNC1); + + if (label.full()) + { + TButton_field & b = (TButton_field &) field(id); + TFilename img(label); + + if (TImage::build_filename(img)) + b.set_bmp(img); + else + b.set_prompt(label); + b.set_handler(tasti_veloci_handler); + } + else + hide(id); + } + sfield(F_SHEET).set_notify( ss_notify ); +} + +bool TScontrino_mask::check_perms(TDocumento & doc, TSheet_field & s, TDocumento_mask & m, int nrow) +{ + bool ok = true; + if (nrow > 0 && nrow <= doc.physical_rows()) + doc[nrow].autosave(s); + if (m.is_calculated_page(m.curr_page())) + m.update_progs(); + + const real totale = doc.totale_doc(); + + if (totale > sapp().curr_user().max_scontrino()) + ok = error_box(FR("Scontrino di valore (%s) superiore al massimo (%s) consentito"), totale.string(), sapp().curr_user().max_scontrino().string()); + + const real abbuono = doc.get_real("SCONTOD"); + + if (ok && abbuono > sapp().curr_user().max_abbuono()) + ok= error_box(FR("Abbuono (%s) superiore al massimo (%s) consentito"), abbuono.string(), sapp().curr_user().max_abbuono().string()); + + if (ok && nrow > 0 && nrow <= doc.physical_rows()) + { + TRiga_documento & riga = doc[nrow]; + + const real qta = riga.get_real(RDOC_QTA); + + if (ok && qta < 0 && !sapp().curr_user().can_resi()) + ok = error_box(TR("Reso non possibile")); + + TString ge; + real psconto; + + scontoexpr2perc(riga.get(RDOC_SCONTO), false, ge, psconto); + psconto = CENTO * (1 - psconto); + if (ok && psconto > sapp().curr_user().max_sconto()) + ok = error_box(FR("Percentuale di sconto (%s) superiore al massimo (%s) consentito"), psconto.string(), sapp().curr_user().max_sconto().string()); + + if (ok && !sapp().curr_user().can_sotto_costo()) + { + const TRectype & anamag = cache().get(LF_ANAMAG, riga.get(RDOC_CODARTMAG)); + const real prezzo = riga.get_real(RDOC_PREZZOL); + real costo = anamag.get_real(ANAMAG_ULTCOS1); + + riga.iva().lordo(costo); + if (!anamag.empty() && prezzo < costo) + ok = error_box(FR("Non e' possibile vendere sottocosto (%s < %s)"), prezzo.string(), costo.string()); + } + } + m.enable(DLG_CHIUDI, ok); + return ok; +} + +bool TScontrino_mask::ss_notify( TSheet_field& ss, int r, KEY key ) +{ + TDocumento_mask& m = (TDocumento_mask&)ss.mask(); + CHECK(&m == &app().curr_mask(), "Cast dal cas"); + + TDocumento& doc = m.doc(); + + switch (key) + { + case K_DEL: + { + const TRiga_documento & riga = doc[r + 1]; + + if (riga.is_omaggio() && !sapp().curr_user().can_change_omaggi()) + return false; + } + break; + case K_CTRL + K_DEL: + { + check_perms(doc, ss, m, 0); + return true; + } + break; + case K_CTRL + K_INS: + { + const int quant = sapp().def_qta(); + if (quant > 0) + { + TRiga_documento& riga = doc[r + 1]; + if (riga.is_merce()) + { + riga.put("QUANT", quant); + riga.autoload(ss); + } + } + } + break; + case K_ENTER: + case K_INS: + { + if (!check_perms(doc, ss, m, r + 1)) + return false; + } + break; + default: + break; + } + + return TDocumento_mask::ss_notify(ss, r, key); +} + +bool TScontrino_mask::turno_handler( TMask_field& f, KEY key ) +{ + if (key == K_SPACE) + return sapp().turno().chiudi(); + return true; +} + +bool TScontrino_mask::chiudi_handler( TMask_field& f, KEY key ) +{ + if (key == K_SPACE) + { + TChiusura_scontrino_mask & mask = sapp().chiusura(); + TTurno_vendita & turno = sapp().turno(); + TScontrino_mask & docmask = (TScontrino_mask &) f.mask(); + TDocumento & doc = docmask.doc(); + + mask.reset_mask(sapp().ncassa(), docmask.get_date(F_DATADOC), turno.cassa_attuale(), doc); + mask.show(-2, sapp().curr_user().can_invoice()); + mask.show(-3, sapp().curr_user().can_invoice()); + if (mask.run() == K_ENTER) + { + do + { + sapp().print(); + } while (yesno_box(TR("Vuoi ristampare lo scontrino"))); + + const real & saldo = mask.get_real(F_SALDO); + const long ndoc = doc.get_long(DOC_NDOC); + + turno.aggiorna(ndoc, saldo); + + const TString & num = sapp().numdocf(); + const TString & tipo = sapp().tipodocf(); + + if (mask.get_bool(F_DAFATT) && num.full() && tipo.full()) + { + TDocumento_mask m(tipo); + TDocumento & fatt = m.doc(); + TFilename ini_file; ini_file.temp(NULL, "ini"); + + fatt.put(DOC_CODNUM, num); + fatt.put(DOC_ANNO, doc.get(DOC_ANNO)); + fatt.put(DOC_PROVV, doc.get(DOC_PROVV)); + fatt.renum_ndoc(); + fatt.copy_contents(doc); + fatt.stato(fatt.tipo().stato_finale_inserimento()); + fatt.put(DOC_TIPODOC, tipo); + fatt.put(DOC_TIPOCF, mask.get(F_TIPOCFC)); + fatt.put(DOC_CODCF, mask.get(F_CODCFC)); + + for (int i = 1; i <= fatt.physical_rows(); i++) + fatt[i].set_original_rdoc_key(doc[i]); + m.doc2mask(); + { + TConfig ini(ini_file, "Transaction"); + char mode[2] = { TM_INTERACTIVE, '\0' }; + + ini.set("Action", TRANSACTION_INSERT); + ini.set("Mode", mode); + sapp().mask2ini(m, ini); + TString_array p; + TString val; + + ini.list_paragraphs(p); + FOR_EACH_ARRAY_ROW(p, rp, par) + { + TAssoc_array & v =ini.list_variables(*par); + + FOR_EACH_ASSOC_STRING(v, obj, key, vr) + { + const TString16 var(key); + if (var == DOC_CODLIST || + var == DOC_CODVAL || + var == DOC_DATACAMBIO || + var == DOC_CAMBIO) + continue; + val = vr; + val.strip("\""); + + if (val.blank()) + ini.remove(var); + } + } + } + + TString cmd("ve0 -1 -i"); cmd << ini_file; + TExternal_app app(cmd); + + app.run(); + + { + TConfig ini(ini_file, "Transaction"); + + if (ini.get("Result") != "OK") + mask.set(F_CODCFC, ""); + } + } + mask.update_doc(docmask, turno); + docmask.stop_run(K_SAVE); + } + else + return false; + } + return true; +} + +static bool chiusi_filter(const TRelation* r) +{ + return r->curr().get("USERNAME") == sapp().turno().user(); +} + +bool TScontrino_mask::sospendi_handler( TMask_field& f, KEY key ) +{ + if (key == K_SPACE) + { + const TTurno_vendita & turno = sapp().turno(); + TScontrino_mask & docmask = (TScontrino_mask &) f.mask(); + TChiusura_scontrino_mask & mask = sapp().chiusura(); + mask.update_doc(docmask, turno, false); + } + return true; +} + +bool TScontrino_mask::search_chiusi_handler(TMask_field& f, KEY key) +{ + if (key == K_SPACE) + { + TScontrino_mask & m = (TScontrino_mask &) f.mask(); + TRectype filtrec(LF_DOC); + + filtrec.put(DOC_PROVV, m.get(F_PROVV)); + filtrec.put(DOC_ANNO, m.get(F_ANNO)); + filtrec.put(DOC_CODNUM, m.get(F_CODNUM)); + + TRelation rel(LF_DOC); + + rel.lfile().set_curr(new TDocumento); + + TCursor cur(&rel, "", 1, &filtrec, &filtrec); + TString80 filt; filt.format("(STATO>=\"%c\")&&(TIPODOC==\"%s\")&&(CODCF==\"\")", m.doc().tipo().stato_bloccato(), (const char *) m.get(F_TIPODOC)); + + cur.setfilter(filt); + cur.set_filterfunction(chiusi_filter); + TCursor_sheet sheet(&cur, "ANNO|CODNUM|NDOC|DATADOC|CODVAL|G1:TOTDOC", + "Documento", + "Anno|Numeraz|Doc.numero|Data\nDocumento@10|Valuta|Totale\nDocumento@18V", + 0, 1); + if (sheet.run() == K_ENTER) + { + const TString16 ndoc = sheet.row(-1).get(2); + TDate oggi(TODAY); + + m.set(F_PROVV, "D"); + f.mask().set(F_ANNO, oggi.year()); + m.set(F_CODNUM, sapp().numdoc()); + m.set(F_NDOC, ndoc); + m.stop_run(K_AUTO_ENTER); + m.enable(DLG_CHIUDI); + } + } + + return true; +} + +static bool sospesi_filter(const TRelation* r) +{ + return r->curr().get_long(TRN_PROGR) == sapp().turno().nturno(); +} + +bool TScontrino_mask::search_sospesi_handler(TMask_field& f, KEY key) +{ + if (key == K_SPACE) + { + TScontrino_mask & m = (TScontrino_mask &) f.mask(); + TRectype filtrec(LF_DOC); + + filtrec.put(DOC_PROVV, m.get(F_PROVV)); + filtrec.put(DOC_ANNO, m.get(F_ANNO)); + filtrec.put(DOC_CODNUM, m.get(F_CODNUM)); + + TRelation rel(LF_DOC); + + rel.lfile().set_curr(new TDocumento); + + TCursor cur(&rel, "", 1, &filtrec, &filtrec); + TString80 filt; filt.format("(STATO<\"%c\")&&(TIPODOC==\"%s\")", m.doc().tipo().stato_bloccato(), (const char *) m.get(F_TIPODOC)); + + cur.setfilter(filt); + cur.set_filterfunction(sospesi_filter); + TCursor_sheet sheet(&cur, "ANNO|CODNUM|NDOC|DATADOC|CODVAL|G1:TOTDOC", + "Documento", + "Anno|Numeraz|Doc.numero|Data\nDocumento@10|Valuta|Totale\nDocumento@18V", + 0, 1); + if (sheet.run() == K_ENTER) + { + const TString16 ndoc = sheet.row(-1).get(2); + TDate oggi(TODAY); + + m.set(F_PROVV, "D"); + f.mask().set(F_ANNO, oggi.year()); + m.set(F_CODNUM, sapp().numdoc()); + m.set(F_NDOC, ndoc); + m.stop_run(K_AUTO_ENTER); + m.enable(DLG_CHIUDI); + } + } + + return true; +} + +bool TScontrino_mask::tasti_veloci_handler(TMask_field& f, KEY key) +{ + if (key == K_SPACE) + { + const TString & cmd = sapp().tv_cmds().row(f.dlg() - F_FUNC1); + + if (cmd.full()) + { + TScontrino_mask & docmask = (TScontrino_mask &) f.mask(); + TSheet_field & sf = docmask.sfield(F_SHEET); + int r = sf.items() == 0 ? 0 : sf.selected() + 1; + + r = sf.insert(r, false, true); + if (r >= 0) + { + TToken_string & row = sf.row(r); + TDocumento & doc = docmask.doc(); + TRiga_documento & rdoc = doc.insert_row(r + 1, docmask.get(F_LBTIPORIGA)); + + rdoc.put(RDOC_CODART, cmd); + rdoc.zero(RDOC_CHECKED); + rdoc.put("QTA", sapp().def_qta()); + rdoc.autoload(sf); + sf.check_row(r); + rdoc.autosave(sf); + sf.force_update(); + sf.select(r); + sf.set_focus(); + sf.set_dirty(); + docmask.ss_notify(sf, r, K_ENTER); + docmask.update_progs(); + } + } + } + + return true; +} + +bool TScontrino_mask::perms_handler( TMask_field& f, KEY key ) +{ + if (key == K_SPACE) + { + TPerms_mask m; + + if (m.run() == K_ENTER) + { + if (sapp().set_responsabile(m.get(F_USERNAME))) + { + sapp().set_authorizations(f.mask()); + f.mask().sfield(F_SHEET).force_update(); + + TString super(m.get(F_USERNAME)) ; + + if (super == sapp().turno().user()) + super.cut(0); + sapp().turno().set_superuser(super); + } + } + } + return true; +} + +void TChiusura_scontrino_mask::init(TConfig & d) +{ + TString8 codpag(d.get("CODPAG", NULL, 1)); + while (codpag.full() && _items <= 8) + { + const int last = _items; + _items++; + _codpag.add(codpag); + const TString & desc = d.get("LABPAG", NULL, _items); + _labpag.add(desc); + field(F_INC01 + _items - 1).set_prompt(desc); + field(F_INC01 + _items - 1).enable(); + + TPagamento p(codpag); + TTipo_pag t = p.tipo_rata(0); + + _resto.set(last, d.get_bool("RESTO", NULL, _items)); + _contanti.set(last, _resto[last] || (t == _rim_dir)); + + codpag = d.get("CODPAG", NULL, _items + 1); + } + for (int i = _items; i < 8; i++) + field(F_INC01 + i).hide(); +} + +void TChiusura_scontrino_mask::update_doc(TScontrino_mask & m, const TTurno_vendita & t, bool chiuso) +{ + TDocumento & doc = m.doc(); + const char stato = doc.tipo().stato_bloccato(); + + doc.put(TRN_CODCASSA, t.ncassa()); + doc.put(TRN_PROGR, t.nturno()); + doc.put(TRN_USERNAME, t.user()); + doc.put("TEMPUSERNAME", t.superuser()); + if (chiuso) + { + doc.stato(stato); + m.set(F_STATO, doc.get(DOC_STATO)); + doc.put(TRN_INC01, get(F_INC01)); + doc.put(TRN_INC02, get(F_INC02)); + doc.put(TRN_INC03, get(F_INC03)); + doc.put(TRN_INC04, get(F_INC04)); + doc.put(TRN_INC05, get(F_INC05)); + doc.put(TRN_INC06, get(F_INC06)); + doc.put(TRN_INC07, get(F_INC07)); + doc.put(TRN_INC08, get(F_INC08)); + doc.put(TRN_RESTI, get(F_RESTO)); + const long codcf = get_long(F_CODCFC); + + if (codcf > 0L) + { + doc.put(DOC_TIPOCF, get(F_TIPOCFC)); + doc.put(DOC_CODCF, codcf); + } + } +} + +real TChiusura_scontrino_mask::calcola_saldo() +{ + real saldo = get_real(F_CASSAINI) - get_real(F_RESTO); + int i = 1; + + for (short id = F_INC01; id <= F_INC08; id++, i++) + if (is_contanti(i)) + saldo += get_real(id); + return saldo; +} + +real TChiusura_scontrino_mask::calcola_resto() +{ + real resto = -get_real(F_TOTDOC); + int i = 1; + + for (short id = F_INC01; id <= F_INC08; id++, i++) + resto += get_real(id); + enable(DLG_OK, resto >= ZERO); + return resto > ZERO ? resto : ZERO; +} + +bool TChiusura_scontrino_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + switch (o.dlg()) + { + case F_INC01: + case F_INC02: + case F_INC03: + case F_INC04: + case F_INC05: + case F_INC06: + case F_INC07: + case F_INC08: + if (e == fe_modify) + { + if (!has_resto(o.dlg() - F_INC01 + 1)) + { + real valore = get_real(o.dlg()); + real residuo = get_real(F_TOTDOC); + int i = 1; + + for (short id = F_INC01; id <= F_INC08; id++, i++) + if (!has_resto(i)) + residuo -= get_real(id); + if (residuo < ZERO) + { + valore += residuo; + if (valore < ZERO) + valore = ZERO; + message_box("Importo senza resto non permesso"); + o.set(valore.string()); + } + } + const real resto = calcola_resto(); + set(F_RESTO, resto); + const real saldo = calcola_saldo(); + set(F_SALDO, saldo); + } + break; + case F_CODCFC: + enable(DLG_OK, field(DLG_OK).enabled() || o.get().full()); + break; + default: + break; + } + return true; +} + +void TChiusura_scontrino_mask::reset_mask(int ncassa, const TDate & data, const real & cassa_attuale, const TDocumento & doc) +{ + const bool aperto = !doc.chiuso(); + + reset(); + set(F_CASSA, ncassa); + set(F_DATA, data); + set(F_TOTDOC, doc.totale_doc()); + if (aperto) + set(F_CASSAINI, cassa_attuale); + + enable(F_SALDO, aperto); + for (short i = F_INC01 ; i<= F_INC08; i++) + if (field(i).shown()) + { + TString f; f.format("INC%02d", i - F_INC01 +1); + + set(i, doc.get(f)); + field(i).enable(aperto); + } + + set(F_RESTO, doc.get(TRN_RESTI)); + + const bool da_fatturare = doc.get(DOC_CODCF).blank(); + + enable(-3, da_fatturare); + disable(DLG_OK); +} + +TScontrino_application::~TScontrino_application() +{ + delete _turno; + delete _chiusura; + if (_sc_mask != NULL) + delete _sc_mask; + if (_cassiere != NULL) + delete _cassiere; + if (_responsabile != NULL) + delete _responsabile; +} + +bool TScontrino_application::set_responsabile(const char * user) +{ + _responsabile = new TOperatore(user); + if (!_responsabile->ok()) + { + delete _responsabile; + _responsabile = NULL; + return false; + } + return true; +} + +TMask* TScontrino_application::get_mask( int mode ) +{ + return _sc_mask; +} + +bool TScontrino_application::user_create( ) +{ + const bool ok = TMotore_application::user_create(); + + TConfig d(CONFIG_DITTA); + + _turno = new TTurno_vendita; + _chiusura = new TChiusura_scontrino_mask; + + _filiale = d.get("FILIALE"); + _numdoc = d.get("CODNUM"); + _tipodoc = d.get("TIPODOC"); + _codlist = d.get("CODLIST"); + _numdocf = d.get("CODNUMF"); + _tipodocf = d.get("TIPODOCF"); + _chk_doc = d.get_bool("CHECKDOC"); + _barcode_peso_var = d.get_bool("BARPVAR"); + _peso_var = d.get_bool("CODPVAR"); + + _chiusura->init(d); + + + TConfig w(CONFIG_WST); + + _ncassa = w.get_int("NCASSA"); + _cassetto = w.get_int("NCASSETTO"); + + TString8 wrk = w.get("CODLIST"); + + if (wrk.full()) + _codlist = wrk; + wrk = w.get("CODNUMF"); + if (wrk.full()) + _numdocf = wrk; + wrk = w.get("TIPODOCF"); + if (wrk.full()) + _tipodocf = wrk; + _cassa_app = w.get("CASSAAPP"); + _def_qta = w.get_int("QTADEF"); + + for (int i = 1; i <= 8; i++) + { + _tv_labels.add(w.get("TVLABEL", "", i)); + _tv_cmds.add(w.get("TVCMD", "", i)); + } + + _sc_mask = new TScontrino_mask(_tipodoc); + + return ok; +} + +bool TScontrino_application::user_destroy() +{ + const bool ok = TMotore_application::user_destroy(); + return ok; +} + +bool TScontrino_application::build_print_file(const TFilename &file) +{ + ofstream f(file); + + if (f) + f <<"Quando cazzo mi dici come si fa ?"; + return f != 0; +} + +bool TScontrino_application::menu(MENU_TAG mt) +{ + return TMotore_application::menu(mt); +} + +void TScontrino_application::print() +{ + if (_cassa_app.full()) + { + TFilename sc_file; + TFilename app(_cassa_app); + TString cmd; cmd; + + sc_file.temp(NULL, "txt"); + build_print_file(sc_file); + cmd << app << " " << sc_file; + + TExternal_app stampa(cmd); + + stampa.run(); + } + else + TMotore_application::print(); +} + +const char* TScontrino_application::get_next_key( ) +{ + TCodice_numerazione cod_num(_numdoc); + + // Se per questa numerazione h abilitata le numerazione automatica + if( cod_num.auto_num()) + { + TLocalisamfile doc(LF_DOC); + TDate oggi(TODAY); + + doc.zero(); + doc.put("CODNUM", cod_num.codice()); + doc.put("ANNO", oggi.year()); + doc.put("PROVV", "D"); + + TRectype cmp_rec(doc.curr()); // record campione + + doc.put( "NDOC", 9999999L ); + if (doc.read(_isgreat) == NOERR) + doc.prev(); + else + doc.last(); + + const long num = ((doc.curr() == cmp_rec) ? doc.get_long( "NDOC" ) : 0) + 1; + + return (format( "%d|%ld", F_NDOC, num)); + } + return ""; +} + +void TScontrino_application::set_authorizations(TMask & m) +{ + TSheet_field & sf = m.sfield(F_SHEET); + const int items = sf.items(); + + sf.enable_column(FR_PREZZO, curr_user().can_change_price()); + sf.enable_column(FR_SCONTO, curr_user().can_change_sconti()); + for (int i = 0; i < items; i++) + sf.check_row(i); + sf.force_update(); + + m.enable(DLG_RICCHIUSI, sapp().curr_user().can_invoice()); +} + +void TScontrino_application::init_query_mode( TMask& m ) +{ + + if (_turno->chiuso()) + if (!_turno->apri()) + exit(0);// verificare + if (_cassiere != NULL) + delete _cassiere; + _cassiere = new TOperatore(_turno->user()); + if (_responsabile != NULL) + { + delete _responsabile; + _responsabile = NULL; + } + _turno->set_superuser(); + set_mode(MODE_INS); + TDate oggi(TODAY); + + m.set(F_PROVV, "D"); + m.set(F_ANNO, oggi.year()); + m.set(F_CODNUM, _numdoc); + m.set(F_TIPODOC, _tipodoc); + m.set(F_DATADOC, oggi); + m.set(F_CODLIST, _codlist); + + + TToken_string key(get_next_key()); + const long numdoc = key.get_long(1); + + m.set(F_NDOC, numdoc); + + TScontrino_mask & dm = (TScontrino_mask &) m; + TDocumento & doc = dm.doc(); + + doc.zero(); + dm.mask2doc(); + + doc.stato(doc.tipo().stato_finale_inserimento()); + m.set(F_STATO, doc.get(DOC_STATO)); + m.enable(DLG_RICSOSP); + m.enable(DLG_CHIUDI, !turno().riaperto()); + set_authorizations(m); +} + +void TScontrino_application::init_insert_mode( TMask& m ) +{ + init_query_mode(m); +} + +void TScontrino_application::init_modify_mode( TMask& m ) +{ + m.disable(DLG_RICCHIUSI); + m.disable(DLG_RICSOSP); + set_authorizations(m); +} + +int TScontrino_application::read( TMask& m ) +{ + return TMotore_application::read(m); +} + +int TScontrino_application::write( const TMask& m ) // C 90 +{ + if (((TScontrino_mask & )m).doc().physical_rows() > 0) + return TMotore_application::write(m); + else + return NOERR; +} + +int TScontrino_application::rewrite( const TMask& m ) // C 90 +{ + TDocumento & doc = ((TDocumento_mask &) m).doc(); + if (doc.chiuso()) + doc.rewrite(); + return TMotore_application::rewrite(m); +} + +int vd0700( int argc, char* argv[]) +{ + TScontrino_application a; + + a.run( argc, argv, TR("Vendita a banco")); + return 0; +} diff --git a/vd/vd0700a.h b/vd/vd0700a.h new file mode 100755 index 000000000..573880620 --- /dev/null +++ b/vd/vd0700a.h @@ -0,0 +1,21 @@ +#define F_TOTDOC 106 +#define F_CASSAINI 107 +#define F_INC01 108 +#define F_INC02 109 +#define F_INC03 110 +#define F_INC04 111 +#define F_INC05 112 +#define F_INC06 113 +#define F_INC07 114 +#define F_INC08 115 +#define F_SOSPESI 116 +#define F_SALDO 117 +#define F_CASSA 118 +#define F_RESTO 119 +#define F_DATA 120 +#define F_TIPOCFC 121 +#define F_CODCFC 122 +#define F_RAGSOCC 123 +#define F_DAFATT 124 + +#define DLG_FATT 200 diff --git a/vd/vd0700a.uml b/vd/vd0700a.uml new file mode 100755 index 000000000..44af30554 --- /dev/null +++ b/vd/vd0700a.uml @@ -0,0 +1,157 @@ +#include "vd0700a.h" + +PAGE "Chiusura Scontrino" -1 -1 0 0 + +NUMBER F_CASSA 3 +BEGIN + PROMPT 2 1 "@bNumero Cassa " + FLAGS "DZ" +END + +DATE F_DATA +BEGIN + PROMPT 42 1 "@bData " + FLAGS "D" +END + +CURRENCY F_TOTDOC 18 +BEGIN + PROMPT 2 3 "Totale scontrino " + FLAGS "D" +END + +CURRENCY F_CASSAINI 18 +BEGIN + PROMPT 42 3 "Cassa " + FLAGS "D" +END + +CURRENCY F_INC01 18 +BEGIN + PROMPT 2 5 "01----------------- " + FLAGS "D" +END + +CURRENCY F_INC02 18 +BEGIN + PROMPT 42 5 "02----------------- " + FLAGS "D" +END + +CURRENCY F_INC03 18 +BEGIN + PROMPT 2 7 "03----------------- " + FLAGS "D" +END + +CURRENCY F_INC04 18 +BEGIN + PROMPT 42 7 "04----------------- " + FLAGS "D" +END + +CURRENCY F_INC05 18 +BEGIN + PROMPT 2 9 "05----------------- " + FLAGS "D" +END + +CURRENCY F_INC06 18 +BEGIN + PROMPT 42 9 "06----------------- " + FLAGS "D" +END + +CURRENCY F_INC07 18 +BEGIN + PROMPT 2 11 "07----------------- " + FLAGS "D" +END + +CURRENCY F_INC08 18 +BEGIN + PROMPT 42 11 "08----------------- " + FLAGS "D" +END + +CURRENCY F_RESTO 18 +BEGIN + PROMPT 2 13 "Resto " + FLAGS "D" +END + +CURRENCY F_SALDO 18 +BEGIN + PROMPT 42 13 "Saldo " + FLAGS "D" + GROUP 1 +END + +BOOEAN F_DAFATT +BEGIN + PROMPT 2 15 "Da fatturare" + MESSAGE FALSE CLEAR,2@ + MESSAGE TRUE ENABLE,2@ + GROUP 3 +END + +LIST F_TIPOCFC 1 11 +BEGIN + PROMPT 2 17 "Tipo " + HELP "Indicare se cliente oppure fornitore" + ITEM "C|Clienti" + ITEM "F|Fornitori" + GROUP 2 +END + +NUMBER F_CODCFC 6 +BEGIN + PROMPT 42 17 "Codice " + USE LF_CLIFO + INPUT TIPOCF F_TIPOCFC SELECT + INPUT CODCF F_CODCFC + DISPLAY "Codice@6R" CODCF + DISPLAY "Sospeso" SOSPESO + DISPLAY "Ragione sociale@50" RAGSOC + DISPLAY "Codice fiscale@16" COFI + DISPLAY "Partita IVA@11" PAIV + OUTPUT F_TIPOCFC TIPOCF + OUTPUT F_CODCFC CODCF + OUTPUT F_RAGSOCC RAGSOC + CHECKTYPE REQUIRED + ADD RUN cg0 -1 + GROUP 2 +END + +STRING F_RAGSOCC 50 +BEGIN + PROMPT 2 19 "Ragione Sociale " + USE LF_CLIFO KEY 2 + INPUT TIPOCF F_TIPOCFC SELECT + INPUT RAGSOC F_RAGSOCC + DISPLAY "Ragione sociale@50" RAGSOC + DISPLAY "Sospeso" SOSPESO + DISPLAY "Codice@R" CODCF + DISPLAY "Codice fiscale@16" COFI + DISPLAY "Partita IVA@11" PAIV + COPY OUTPUT F_CODCFC + CHECKTYPE NORMAL + ADD RUN cg0 -1 + GROUP 2 +END + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -12 -2 "" + FLAGS "D" + GROUP 1 +END + +BUTTON DLG_QUIT 10 2 +BEGIN + PROMPT -22 -2 "" +END + +ENDPAGE + +ENDMASK \ No newline at end of file diff --git a/vd/vd0700b.h b/vd/vd0700b.h new file mode 100755 index 000000000..16b91ae6f --- /dev/null +++ b/vd/vd0700b.h @@ -0,0 +1,3 @@ +#define F_USERNAME 101 +#define F_PASSWORD 102 + diff --git a/vd/vd0700b.uml b/vd/vd0700b.uml new file mode 100755 index 000000000..5bea88285 --- /dev/null +++ b/vd/vd0700b.uml @@ -0,0 +1,38 @@ +#include "vdmask.h" + +PAGE "Permessi" -1 -1 50 6 + +STRING F_USERNAME 8 +BEGIN + PROMPT 2 1 "Utente " + FLAGS "UT" + USE OPD + JOIN LF_USER INTO USERNAME==CODTAB + INPUT CODTAB F_USERNAME + DISPLAY "Utente@8" CODTAB + DISPLAY "Gruppo@8" LF_USER->GROUPNAME + DISPLAY "Descrizione@50" LF_USER->USERDESC + OUTPUT F_USERNAME CODTAB + CHECKTYPE REQUIRED +END + +STRING F_PASSWORD 8 10 +BEGIN + PROMPT 2 3 "Password " + FLAGS "*" +END + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -12 -1 "" + FLAGS "D" +END + +BUTTON DLG_QUIT 10 2 +BEGIN + PROMPT -22 -1 "" +END + +ENDPAGE + +ENDMASK diff --git a/vd/vd1.cpp b/vd/vd1.cpp new file mode 100755 index 000000000..b47c8a918 --- /dev/null +++ b/vd/vd1.cpp @@ -0,0 +1,26 @@ +#include +#include "vd1.h" + +int main(int argc, char** argv) +{ + const int n = argc > 1 ? argv[1][1]-'0' : 0; + switch (n) + { + case 1: + vd1200(argc, argv); // Riepilogo incassi + break; + case 2: + vd1300(argc, argv); // Riepilogo venduto per commessi + break; + case 5: + vd1600(argc, argv); // Riepilogo dettaglio scontrini giornalieri e/o nel periodo + break; + case 6: + vd1700(argc, argv); // Riepilogo dettagli pagamenti + case 0: + default: + vd1100(argc, argv); // Lettura cassa giornaliera + break; + } + return 0; +} diff --git a/vd/vd1.h b/vd/vd1.h new file mode 100755 index 000000000..38492ad0a --- /dev/null +++ b/vd/vd1.h @@ -0,0 +1,6 @@ +int vd1100(int argc, char* argv[]); +int vd1200(int argc, char* argv[]); +int vd1300(int argc, char* argv[]); +int vd1600(int argc, char* argv[]); +int vd1700(int argc, char* argv[]); + diff --git a/vd/vd1100.cpp b/vd/vd1100.cpp new file mode 100755 index 000000000..e3cb838fc --- /dev/null +++ b/vd/vd1100.cpp @@ -0,0 +1,140 @@ +#include +#include +#include +#include +#include + +#include "vd1.h" +#include "vd1100.h" + + +//////////////// +// MASCHERA +//////////////// +class TPrint_today_cashflow_mask : public TAutomask +{ + +protected: + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + +public: + TPrint_today_cashflow_mask(); + virtual ~TPrint_today_cashflow_mask(); +}; + +TPrint_today_cashflow_mask::TPrint_today_cashflow_mask() + : TAutomask("vd1100") //NON si puo' chiamare vd1100a perche' in tal caso la... + //..maschera scatta 2 volte (scatta anche quella omonima del report) +{ +} + +TPrint_today_cashflow_mask::~TPrint_today_cashflow_mask() {} + +bool TPrint_today_cashflow_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + const int id = o.dlg(); + switch (id) + { + case F_CODCASSA: + if (e == fe_init) + { + TConfig conf(CONFIG_WST); + TString cassa = conf.get("NCASSA"); + o.set(cassa); + o.check(STARTING_CHECK); + } + break; + default: + break; + } + return true; +} + + +//////////////////////////////////////////////////////// +// REPORT +//////////////////////////////////////////////////////// +class TPrint_today_cashflow_rep : public TReport +{ + TString_array _tipincasso; + +protected: + virtual bool get_usr_val(const TString& name, TVariant& var) const; + virtual bool use_mask() {return false;} + +public: + TPrint_today_cashflow_rep::TPrint_today_cashflow_rep(); +}; + + +TPrint_today_cashflow_rep::TPrint_today_cashflow_rep() +{ + TConfig conf(CONFIG_DITTA, "vd"); + for (int i = 1;; i++) + { + const TString& lab = conf.get("LABPAG", NULL, i); + if (lab.empty()) + break; + _tipincasso.add(lab, i); + } +} + + +bool TPrint_today_cashflow_rep::get_usr_val(const TString& name, TVariant& var) const +{ + if (name.starts_with("#LABINC0")) + { + const int i = name[8] - '0'; //indicatore del tipo di incasso + //cerca il corrispondente label di incasso nell'array con le labels + const TString* label = (const TString*)_tipincasso.objptr(i); + if (label != NULL) + var = *label; + return true; + } + return TReport::get_usr_val(name, var); +} + + +/////////////////////////////// +// APPLICAZIONE +/////////////////////////////// + +class TPrint_today_cashflow : public TSkeleton_application +{ + +protected: + virtual void main_loop(); + virtual bool create(); + +}; + +void TPrint_today_cashflow::main_loop() +{ + TPrint_today_cashflow_mask mask; + while (mask.run() == K_ENTER) + { + TReport_book book; + TString path = mask.get(F_REPORT); + if (path.empty()) + path = "vd1100a"; + TPrint_today_cashflow_rep rep; + rep.load(path); + + rep.mask2report(mask); + book.add(rep); + book.print_or_preview(); + } +} + +bool TPrint_today_cashflow::create() +{ + return TSkeleton_application:: create(); +} + + +int vd1100(int argc, char* argv[]) +{ + TPrint_today_cashflow a; + a.run(argc, argv, "Lettura cassa giornaliera"); + return 0; +} diff --git a/vd/vd1100.h b/vd/vd1100.h new file mode 100755 index 000000000..eb5263c5b --- /dev/null +++ b/vd/vd1100.h @@ -0,0 +1,5 @@ +//campi maschera vd1100 +#define F_CODCASSA 101 +#define F_CASSA_DESCR 102 +#define F_DATA 103 +#define F_REPORT 104 diff --git a/vd/vd1100.uml b/vd/vd1100.uml new file mode 100755 index 000000000..9a3daa98e --- /dev/null +++ b/vd/vd1100.uml @@ -0,0 +1,54 @@ +#include "vd1100.h" + +TOOLBAR "" 0 20 0 2 + +BUTTON DLG_PRINT 10 2 +BEGIN + PROMPT -12 -1 "" +END + +BUTTON DLG_QUIT 10 2 +BEGIN + PROMPT -22 -1 "" +END + +ENDPAGE + +PAGE "Parametri stampa" 1 1 60 14 + +STRING F_CODCASSA 3 +BEGIN + PROMPT 2 2 "Cassa " + USE CAS + INPUT CODTAB F_CODCASSA + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione @50" S0 + OUTPUT F_CODCASSA CODTAB + OUTPUT F_CASSA_DESCR S0 + FIELD CODCASSA + CHECKTYPE REQUIRED + FLAGS "UZDG" +END + +STRING F_CASSA_DESCR 50 +BEGIN + PROMPT 15 2 "" + FLAGS "D" +END + +DATE F_DATA +BEGIN + PROMPT 2 3 "Data " + FLAGS "A" + FIELD DATA +END + +STRING F_REPORT 256 56 +BEGIN + PROMPT 2 5 "Report " + FLAGS "B" +END + +ENDPAGE + +ENDMASK diff --git a/vd/vd1100a.rep b/vd/vd1100a.rep new file mode 100755 index 000000000..582b1db7a --- /dev/null +++ b/vd/vd1100a.rep @@ -0,0 +1,135 @@ + + + Lettura cassa giornaliera + +
    + + + #CODCASSA + + + + #DATA + + + + + + + + +
    +
    + + + #SYSTEM.RAGSOC + + + + + +
    +
    + +
    + + + #SYSTEM.DATE + + + #PAGE + + +
    +
    + + #LABINC01 + + + #LABINC02 + + + #LABINC03 + + + #LABINC04 + + + #LABINC05 + + + #LABINC06 + + + #LABINC07 + + + #LABINC08 + + + + + + + + + + + + + + #101+#102+#103+#104+#105+#106+#107+#108 + + +
    + USE TURNI +SELECT NUM(ANSI(DATA))=NUM(ANSI(#DATA)) +FROM CODCASSA=#CODCASSA +TO CODCASSA=#CODCASSA + + \ No newline at end of file diff --git a/vd/vd1200.cpp b/vd/vd1200.cpp new file mode 100755 index 000000000..93a045d14 --- /dev/null +++ b/vd/vd1200.cpp @@ -0,0 +1,127 @@ +#include +#include +#include +#include + +#include "../ve/velib07.h" + +#include "vd1.h" +#include "vd1200.h" + + +//////////////// +// MASCHERA +//////////////// +class TPrint_riepilogo_incassi_mask : public TAutomask +{ + +protected: + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + +public: + TPrint_riepilogo_incassi_mask(); + virtual ~TPrint_riepilogo_incassi_mask(); +}; + +TPrint_riepilogo_incassi_mask::TPrint_riepilogo_incassi_mask() + : TAutomask("vd1200") //NON si puo' chiamare vd1200a perche' in tal caso la... + //..maschera scatta 2 volte (scatta anche quella omonima del report) +{ +} + +TPrint_riepilogo_incassi_mask::~TPrint_riepilogo_incassi_mask() {} + +bool TPrint_riepilogo_incassi_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + switch (o.dlg()) + { + case F_CODCASSA: + if (e == fe_init) + { + TConfig conf(CONFIG_WST); + o.set(conf.get("NCASSA")); + o.check(STARTING_CHECK); + } + break; + case F_CODNUM: + if (e == fe_init) + { + TConfig conf(CONFIG_DITTA, "vd"); + o.set(conf.get("CODNUM")); + o.check(STARTING_CHECK); + } + break; + case F_DADATA: + if (e == fe_modify) + { + const TDate dadata(o.get()); + set(F_ANNO, dadata.year()); + } + break; + case F_ADATA: + if (e == fe_close) + { + const TDate adata(o.get()); + const TDate dadata = get(F_DADATA); + if (adata.year() != dadata.year() || adata < dadata) + return error_box(TR("La data finale deve essere maggiore od uguale a quella finale ed appartenere allo stesso anno!")); + } + break; + default: + break; + } + return true; +} + +//////////////////////////////////////////////////////// +// REPORT +//////////////////////////////////////////////////////// +class TPrint_riepilogo_incassi_rep : public TDocument_report +{ +protected: + virtual bool use_mask() {return false;} +}; + + + +/////////////////////////////// +// APPLICAZIONE +/////////////////////////////// +class TPrint_riepilogo_incassi : public TSkeleton_application +{ + +protected: + virtual void main_loop(); + virtual bool create(); + +}; + +void TPrint_riepilogo_incassi::main_loop() +{ + TPrint_riepilogo_incassi_mask mask; + while (mask.run() == K_ENTER) + { + TReport_book book; + TString path = mask.get(F_REPORT); + if (path.empty()) + path = "vd1200a"; + TPrint_riepilogo_incassi_rep rep; + rep.load(path); + + rep.mask2report(mask); + book.add(rep); + book.print_or_preview(); + } +} + +bool TPrint_riepilogo_incassi::create() +{ + return TSkeleton_application:: create(); +} + +int vd1200(int argc, char* argv[]) +{ + TPrint_riepilogo_incassi a; + a.run(argc, argv, "Riepilogo incassi"); + return 0; +} \ No newline at end of file diff --git a/vd/vd1200.h b/vd/vd1200.h new file mode 100755 index 000000000..81c36e66b --- /dev/null +++ b/vd/vd1200.h @@ -0,0 +1,9 @@ +//campi maschera vd1200 +#define F_CODCASSA 101 +#define F_CASSA_DESCR 102 +#define F_DADATA 103 +#define F_ADATA 104 +#define F_CODNUM 105 +#define F_DESNUM 106 +#define F_ANNO 107 +#define F_REPORT 108 diff --git a/vd/vd1200.uml b/vd/vd1200.uml new file mode 100755 index 000000000..18368e128 --- /dev/null +++ b/vd/vd1200.uml @@ -0,0 +1,86 @@ +#include "vd1200.h" + +TOOLBAR "" 0 20 0 2 + +BUTTON DLG_PRINT 10 2 +BEGIN + PROMPT -12 -1 "" +END + +BUTTON DLG_QUIT 10 2 +BEGIN + PROMPT -22 -1 "" +END + +ENDPAGE + +PAGE "Parametri stampa" 1 1 60 14 + +STRING F_CODCASSA 3 +BEGIN + PROMPT 2 2 "Cassa " + USE CAS + INPUT CODTAB F_CODCASSA + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione @50" S0 + OUTPUT F_CODCASSA CODTAB + OUTPUT F_CASSA_DESCR S0 + FIELD CODCASSA + CHECKTYPE REQUIRED + FLAGS "UZG" +END + +STRING F_CASSA_DESCR 50 +BEGIN + PROMPT 15 2 "" + FLAGS "D" +END + +DATE F_DADATA +BEGIN + PROMPT 2 3 "Dalla data " + FLAGS "A" + FIELD DADATA + CHECKTYPE REQUIRED +END + +DATE F_ADATA +BEGIN + PROMPT 2 4 "Alla data " + FLAGS "A" + FIELD ADATA +END + +STRING F_CODNUM 4 +BEGIN + PROMPT 2 5 "Numerazione scontrini " + FLAGS "DG" + USE %NUM + INPUT CODTAB F_CODNUM + OUTPUT F_DESNUM S0 + FIELD CODNUM + CHECKTYPE NORMAL +END + +STRING F_DESNUM 50 35 +BEGIN + PROMPT 30 5 "" + FLAGS "D" +END + +NUMBER F_ANNO 4 +BEGIN + PROMPT 2 6 "" + FLAGD "HDGA" + FIELD ANNO +END + +STRING F_REPORT 256 56 +BEGIN + PROMPT 2 18 "Report " + FLAGS "B" +END + +ENDPAGE + +ENDMASK diff --git a/vd/vd1200a.rep b/vd/vd1200a.rep new file mode 100755 index 000000000..c85c17411 --- /dev/null +++ b/vd/vd1200a.rep @@ -0,0 +1,165 @@ + + + Riepilogo incassi + +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + #SYSTEM.RAGSOC + + + + #CODCASSA + + + + #DADATA + + + + #ADATA + + + + + +
    +
    + DATADOC + MESSAGE RESET,F2.101 +MESSAGE RESET,F2.102 +MESSAGE RESET,F2.103 +MESSAGE RESET,F2.104 +MESSAGE RESET,F2.105 +MESSAGE RESET,F2.106 +MESSAGE RESET,F2.107 +MESSAGE RESET,F2.108 +MESSAGE RESET,F2.109 +
    +
    + +
    + + + #SYSTEM.DATE + + + #PAGE + + +
    +
    + + + + + + + + + + + +
    +
    + + + MESSAGE ADD,F1.101 + + + + MESSAGE ADD,F1.102 + + + + MESSAGE ADD,F1.103 + + + + MESSAGE ADD,F1.104 + + + + MESSAGE ADD,F1.105 + + + + MESSAGE ADD,F1.106 + + + + MESSAGE ADD,F1.107 + +
    + USE DOC +SELECT (NUM(ANSI(DATADOC))E;=NUM(ANSI(#DADATA)))(NUM(ANSI(DATADOC))C;=NUM(ANSI(#ADATA))) +FROM PROVV='D' ANNO=#ANNO CODNUM=#CODNUM +TO PROVV='D' ANNO=#ANNO CODNUM=#CODNUM + + \ No newline at end of file diff --git a/vd/vd1300.cpp b/vd/vd1300.cpp new file mode 100755 index 000000000..d398b1ea1 --- /dev/null +++ b/vd/vd1300.cpp @@ -0,0 +1,109 @@ +#include +#include +#include + +#include "../ve/velib07.h" + +#include "vd1.h" +#include "vd1300.h" + +//////////////// +// MASCHERA +//////////////// +class TPrint_venduto_operatore_mask : public TAutomask +{ + +protected: + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + +public: + TPrint_venduto_operatore_mask(); + virtual ~TPrint_venduto_operatore_mask(); +}; + +TPrint_venduto_operatore_mask::TPrint_venduto_operatore_mask() + : TAutomask("vd1300") //NON si puo' chiamare vd1300a perche' in tal caso la... + //..maschera scatta 2 volte (scatta anche quella omonima del report) +{ +} + +TPrint_venduto_operatore_mask::~TPrint_venduto_operatore_mask() {} + +bool TPrint_venduto_operatore_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + switch (o.dlg()) + { + case F_DADATA: + if (e == fe_modify) + { + const TDate dadata(o.get()); + set(F_ANNO, dadata.year()); + } + break; + case F_ADATA: + if (e == fe_close) + { + const TDate adata(o.get()); + const TDate dadata = get(F_DADATA); + if (adata.year() != dadata.year() || adata < dadata) + return error_box(TR("La data finale deve essere maggiore od uguale a quella finale ed appartenere allo stesso anno!")); + } + break; + default: + break; + } + return true; +} + +//////////////////////////////////////////////////////// +// REPORT +//////////////////////////////////////////////////////// +class TPrint_venduto_operatore_rep : public TDocument_report +{ +protected: + virtual bool use_mask() {return false;} +}; + + + +/////////////////////////////// +// APPLICAZIONE +/////////////////////////////// +class TPrint_venduto_operatore : public TSkeleton_application +{ + +protected: + virtual void main_loop(); + virtual bool create(); + +}; + +void TPrint_venduto_operatore::main_loop() +{ + TPrint_venduto_operatore_mask mask; + while (mask.run() == K_ENTER) + { + TReport_book book; + TString path = mask.get(F_REPORT); + if (path.empty()) + path = "vd1300a"; + TPrint_venduto_operatore_rep rep; + rep.load(path); + + rep.mask2report(mask); + book.add(rep); + book.print_or_preview(); + } +} + +bool TPrint_venduto_operatore::create() +{ + return TSkeleton_application:: create(); +} + +int vd1300(int argc, char* argv[]) +{ + TPrint_venduto_operatore a; + a.run(argc, argv, "Riepilogo venduto per operatore"); + return 0; +} diff --git a/vd/vd1300.h b/vd/vd1300.h new file mode 100755 index 000000000..0f2d618f2 --- /dev/null +++ b/vd/vd1300.h @@ -0,0 +1,9 @@ +//campi maschera vd1300 +#define F_CODNUM 101 +#define F_DESNUM 102 +#define F_OPERATORE 103 +#define F_OPERATORE_DESCR 104 +#define F_DADATA 107 +#define F_ADATA 108 +#define F_ANNO 109 +#define F_REPORT 110 diff --git a/vd/vd1300.uml b/vd/vd1300.uml new file mode 100755 index 000000000..cd286b39a --- /dev/null +++ b/vd/vd1300.uml @@ -0,0 +1,99 @@ +#include "vd1300.h" + +TOOLBAR "" 0 20 0 2 + +BUTTON DLG_PRINT 10 2 +BEGIN + PROMPT -12 -1 "" +END + +BUTTON DLG_QUIT 10 2 +BEGIN + PROMPT -22 -1 "" +END + +ENDPAGE + +PAGE "Parametri stampa" 1 1 60 14 + +STRING F_CODNUM 4 +BEGIN + PROMPT 2 2 "Numerazione scontrini " + FLAGS "UZ" + USE %NUM + INPUT CODTAB F_CODNUM + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_CODNUM CODTAB + OUTPUT F_DESNUM S0 + FIELD CODNUM + CHECKTYPE REQUIRED +END + +STRING F_DESNUM 50 35 +BEGIN + PROMPT 32 2 "" + USE %NUM KEY 2 + INPUT S0 F_DESNUM + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice" CODTAB + COPY OUTPUT F_CODNUM + CHECKTYPE NORMAL +END + +STRING F_OPERATORE 8 +BEGIN + PROMPT 2 4 "Operatore " + USE OPD + INPUT CODTAB F_OPERATORE + DISPLAY "Codice@8" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_OPERATORE CODTAB + OUTPUT F_OPERATORE_DESCR S0 + FIELD USERNAME + CHECKTYPE REQUIRED + FLAGS "UZ" +END + +STRING F_OPERATORE_DESCR 50 +BEGIN + PROMPT 27 4 "" + USE OPD KEY 2 + INPUT S0 F_OPERATORE_DESCR + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice@8" CODTAB + COPY INPUT F_OPERATORE + CHECKTYPE NORMAL +END + +DATE F_DADATA +BEGIN + PROMPT 2 7 "Dalla data " + FLAGS "A" + FIELD DADATA + CHECKTYPE REQUIRED +END + +DATE F_ADATA +BEGIN + PROMPT 2 8 "Alla data " + FLAGS "A" + FIELD ADATA +END + +NUMBER F_ANNO 4 +BEGIN + PROMPT 2 10 "" + FLAGD "HDGA" + FIELD ANNO +END + +STRING F_REPORT 256 56 +BEGIN + PROMPT 2 18 "Report " + FLAGS "B" +END + +ENDPAGE + +ENDMASK diff --git a/vd/vd1300a.rep b/vd/vd1300a.rep new file mode 100755 index 000000000..12342e885 --- /dev/null +++ b/vd/vd1300a.rep @@ -0,0 +1,96 @@ + + + Riepilogo venduto per commessi + +
    + + + + + + + + +
    +
    + + + #SYSTEM.RAGSOC + + + + #USERNAME + + + + MESSAGE TABLEREAD,OPD,#USERNAME,S0 + + + + 2 + #DADATA + + + + 2 + #ADATA + + + + + +
    +
    +
    + + NDOC + + + DATADOC + + + TOTDOC + MESSAGE ADD,F1.103 + + + BASESCONTO + MESSAGE ADD,F1.104 + + + 101@.R3 + + + #104*#105F;100 + MESSAGE ADD,F1.106 + +
    +
    + + + + + + + #SYSTEM.DATE + + + #PAGE + + +
    +
    + + + + + + +
    + USE DOC +SELECT (NUM(ANSI(DATADOC))E;=NUM(ANSI(#DADATA)))(NUM(ANSI(DATADOC))C;=NUM(ANSI(#ADATA)))(101@.R3!='') +JOIN OPD ALIAS 101 INTO CODTAB=#USERNAME +FROM PROVV='D' ANNO=#ANNO CODNUM=#CODNUM +TO PROVV='D' ANNO=#ANNO CODNUM=#CODNUM + + + \ No newline at end of file diff --git a/vd/vd1600.cpp b/vd/vd1600.cpp new file mode 100755 index 000000000..163fb26b4 --- /dev/null +++ b/vd/vd1600.cpp @@ -0,0 +1,144 @@ +#include +#include +#include +#include + +#include "../ve/velib07.h" + +#include "vd1.h" +#include "vd1600.h" + + +//////////////// +// MASCHERA +//////////////// +class TPrint_dettaglio_scontrini_mask : public TAutomask +{ + +protected: + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + +public: + TPrint_dettaglio_scontrini_mask(const char tipo); + virtual ~TPrint_dettaglio_scontrini_mask(); +}; + +TPrint_dettaglio_scontrini_mask::TPrint_dettaglio_scontrini_mask(const char tipo) + : TAutomask("vd1600") //NON si puo' chiamare vd1600a perche' in tal caso la... + //..maschera scatta 2 volte (scatta anche quella omonima del report) +{ //la maschera gestisce i 2 casi di stampa giornaliera e di periodo accendendo e spegnendo i campi + if (tipo == 'G') + { + set_caption(TR("Riepilogo scontrini giornaliero")); + hide(F_ADATA); + disable(F_DADATA); + field(F_DADATA).set_prompt(PR("In data ")); + } + else + { + set_caption(TR("Riepilogo scontrini")); + } +} + +TPrint_dettaglio_scontrini_mask::~TPrint_dettaglio_scontrini_mask() {} + +bool TPrint_dettaglio_scontrini_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + switch (o.dlg()) + { + case F_CODCASSA: + if (e == fe_init) + { + TConfig conf(CONFIG_WST); + o.set(conf.get("NCASSA")); + o.check(STARTING_CHECK); + } + break; + case F_DADATA: + if (e == fe_modify) + { + const TDate dadata(o.get()); + set(F_ANNO, dadata.year()); + } + break; + case F_ADATA: + if (e == fe_close) + { + const TDate adata(o.get()); + const TDate dadata = get(F_DADATA); + if (adata.year() != dadata.year() || adata < dadata) + return error_box(TR("La data finale deve essere maggiore od uguale a quella finale ed appartenere allo stesso anno!")); + } + break; + case F_CODNUM: + if (e == fe_init) + { + TConfig conf(CONFIG_DITTA, "vd"); + o.set(conf.get("CODNUM")); + o.check(STARTING_CHECK); + } + break; + default: + break; + } + return true; +} + +//////////////////////////////////////////////////////// +// REPORT +//////////////////////////////////////////////////////// +class TPrint_dettaglio_scontrini_rep : public TDocument_report +{ +protected: + virtual bool use_mask() {return false;} +}; + + + +/////////////////////////////// +// APPLICAZIONE +/////////////////////////////// +class TPrint_dettaglio_scontrini : public TSkeleton_application +{ + char _tipo; + +protected: + virtual void main_loop(); + virtual bool create(); + +}; + +void TPrint_dettaglio_scontrini::main_loop() +{ + TPrint_dettaglio_scontrini_mask mask(_tipo); + while (mask.run() == K_ENTER) + { + TReport_book book; + TString path = mask.get(F_REPORT); + if (path.empty()) + path = "vd1600a"; + TPrint_dettaglio_scontrini_rep rep; + rep.load(path); + + rep.mask2report(mask); + book.add(rep); + book.print_or_preview(); + } +} + +bool TPrint_dettaglio_scontrini::create() +{ + if (argc()>2) + _tipo = argv(2)[0]; // se c'č, prende il tipo di stampa dalla linea di comando + else + _tipo = 'G'; //per default stampa il giornaliero + + return TSkeleton_application:: create(); +} + +int vd1600(int argc, char* argv[]) +{ + TPrint_dettaglio_scontrini a; + a.run(argc, argv, "Riepilogo dettaglio scontrini"); + return 0; +} diff --git a/vd/vd1600.h b/vd/vd1600.h new file mode 100755 index 000000000..3158e6726 --- /dev/null +++ b/vd/vd1600.h @@ -0,0 +1,9 @@ +//campi maschera vd1600 +#define F_CODCASSA 101 +#define F_CASSA_DESCR 102 +#define F_CODNUM 104 +#define F_ANNO 105 +#define F_DESNUM 106 +#define F_REPORT 107 +#define F_DADATA 108 +#define F_ADATA 109 diff --git a/vd/vd1600.uml b/vd/vd1600.uml new file mode 100755 index 000000000..ee5123377 --- /dev/null +++ b/vd/vd1600.uml @@ -0,0 +1,87 @@ +#include "vd1600.h" + +TOOLBAR "" 0 20 0 2 + +BUTTON DLG_PRINT 10 2 +BEGIN + PROMPT -12 -1 "" +END + +BUTTON DLG_QUIT 10 2 +BEGIN + PROMPT -22 -1 "" +END + +ENDPAGE + +PAGE "Parametri stampa" 1 1 60 14 + +STRING F_CODCASSA 3 +BEGIN + PROMPT 2 2 "Cassa " + USE CAS + INPUT CODTAB F_CODCASSA + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione @50" S0 + OUTPUT F_CODCASSA CODTAB + OUTPUT F_CASSA_DESCR S0 + FIELD CODCASSA + CHECKTYPE REQUIRED + FLAGS "UZ" +END + +STRING F_CASSA_DESCR 50 +BEGIN + PROMPT 15 2 "" + FLAGS "D" +END + +DATE F_DADATA +BEGIN + PROMPT 2 3 "Dalla data " + FLAGS "A" + FIELD DADATA + CHECKTYPE REQUIRED +END + +DATE F_ADATA +BEGIN + PROMPT 30 3 "Alla data " + FLAGS "A" + FIELD ADATA + CHECKTYPE REQUIRED +END + +STRING F_CODNUM 4 +BEGIN + PROMPT 2 4 "Numerazione scontrini " + FLAGS "DG" + USE %NUM + INPUT CODTAB F_CODNUM + OUTPUT F_DESNUM S0 + FIELD CODNUM + CHECKTYPE NORMAL +END + +STRING F_DESNUM 50 35 +BEGIN + PROMPT 30 4 "" + FLAGS "D" +END + +NUMBER F_ANNO 4 +BEGIN + PROMPT 2 6 "" + FLAGD "HDGA" + FIELD ANNO +END + +STRING F_REPORT 256 56 +BEGIN + PROMPT 2 8 "Report " + FLAGS "B" +END + +ENDPAGE + +ENDMASK diff --git a/vd/vd1600a.rep b/vd/vd1600a.rep new file mode 100755 index 000000000..d0f4fbfc8 --- /dev/null +++ b/vd/vd1600a.rep @@ -0,0 +1,116 @@ + + + Riepilogo dettaglio scontrini giorn.F;period. + +
    + + + + + + + + + +
    +
    + + + #SYSTEM.RAGSOC + + + + #CODCASSA + + + + 2 + #DADATA + + + + 2 + #ADATA + + + + + +
    + +
    +
    + + CODART + + + DESCR + + + QTA + MESSAGE ADD,F2.102 + + + + PREZZO + + + SCONTO + + + + NDOC + + + 33.DATADOC + +
    +
    + + + + + + + #SYSTEM.DATE + + + #PAGE + + +
    +
    + + + + + +
    +
    + USE RDOC +SELECT (NUM(ANSI(33.DATADOC))E;=NUM(ANSI(#DADATA)))(NUM(ANSI(33.DATADOC))C;=NUM(ANSI(#ADATA))) +JOIN DOC INTO PROVV=PROVV ANNO=ANNO CODNUM=CODNUM NDOC=NDOC +FROM CODNUM=#CODNUM ANNO=#ANNO PROVV='D' +TO CODNUM=#CODNUM ANNO=#ANNO PROVV='D' + + + \ No newline at end of file diff --git a/vd/vd1700.cpp b/vd/vd1700.cpp new file mode 100755 index 000000000..fbd2e1075 --- /dev/null +++ b/vd/vd1700.cpp @@ -0,0 +1,147 @@ +#include +#include +#include +#include +#include + +#include "vd1.h" +#include "vd1700.h" + + +//////////////// +// MASCHERA +//////////////// +class TPrint_payments_datail_mask : public TAutomask +{ + +protected: + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + +public: + TPrint_payments_datail_mask(); + virtual ~TPrint_payments_datail_mask(); +}; + +TPrint_payments_datail_mask::TPrint_payments_datail_mask() + : TAutomask("vd1700") //NON si puo' chiamare vd1700a perche' in tal caso la... + //..maschera scatta 2 volte (scatta anche quella omonima del report) +{ +} + +TPrint_payments_datail_mask::~TPrint_payments_datail_mask() {} + +bool TPrint_payments_datail_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + const int id = o.dlg(); + switch (id) + { + case F_DADATA: + if (e == fe_modify) + { + const TDate dadata(o.get()); + set(F_ANNO, dadata.year()); + } + break; + case F_ADATA: + if (e == fe_close) + { + const TDate adata(o.get()); + const TDate dadata = get(F_DADATA); + if (adata.year() != dadata.year() || adata < dadata) + return error_box(TR("La data finale deve essere maggiore od uguale a quella finale ed appartenere allo stesso anno!")); + } + break; + default: + break; + } + return true; +} + + +//////////////////////////////////////////////////////// +// REPORT +//////////////////////////////////////////////////////// +class TPrint_payments_datail_rep : public TReport +{ + TString_array _tipincasso; + +protected: + virtual bool get_usr_val(const TString& name, TVariant& var) const; + virtual bool use_mask() {return false;} + +public: + TPrint_payments_datail_rep::TPrint_payments_datail_rep(); +}; + + +TPrint_payments_datail_rep::TPrint_payments_datail_rep() +{ + TConfig conf(CONFIG_DITTA, "vd"); + for (int i = 1;; i++) + { + const TString& lab = conf.get("LABPAG", NULL, i); + if (lab.empty()) + break; + _tipincasso.add(lab, i); + } +} + + +bool TPrint_payments_datail_rep::get_usr_val(const TString& name, TVariant& var) const +{ + if (name.starts_with("#LABINC0")) + { + const int i = name[8] - '0'; //indicatore del tipo di incasso + //cerca il corrispondente label di incasso nell'array con le labels + const TString* label = (const TString*)_tipincasso.objptr(i); + if (label != NULL) + var = *label; + return true; + } + return TReport::get_usr_val(name, var); +} + + +/////////////////////////////// +// APPLICAZIONE +/////////////////////////////// + +class TPrint_payments_datail : public TSkeleton_application +{ + +protected: + virtual void main_loop(); + virtual bool create(); + +}; + +void TPrint_payments_datail::main_loop() +{ + TPrint_payments_datail_mask mask; + while (mask.run() == K_ENTER) + { + TReport_book book; + TString path = mask.get(F_REPORT); + if (path.empty()) + path = "vd1700a"; + TPrint_payments_datail_rep rep; + rep.load(path); + + rep.mask2report(mask); + book.add(rep); + book.print_or_preview(); + } +} + +bool TPrint_payments_datail::create() +{ + return TSkeleton_application:: create(); +} + + +int vd1700(int argc, char* argv[]) +{ + TPrint_payments_datail a; + a.run(argc, argv, "Riepilogo dettagli pagamenti"); + return 0; +} diff --git a/vd/vd1700.h b/vd/vd1700.h new file mode 100755 index 000000000..f675e6edb --- /dev/null +++ b/vd/vd1700.h @@ -0,0 +1,5 @@ +//campi maschera vd1700 +#define F_DADATA 101 +#define F_ADATA 102 +#define F_ANNO 103 +#define F_REPORT 104 diff --git a/vd/vd1700.uml b/vd/vd1700.uml new file mode 100755 index 000000000..2a546c706 --- /dev/null +++ b/vd/vd1700.uml @@ -0,0 +1,49 @@ +#include "vd1700.h" + +TOOLBAR "" 0 20 0 2 + +BUTTON DLG_PRINT 10 2 +BEGIN + PROMPT -12 -1 "" +END + +BUTTON DLG_QUIT 10 2 +BEGIN + PROMPT -22 -1 "" +END + +ENDPAGE + +PAGE "Parametri stampa" 1 1 60 14 + +DATE F_DADATA +BEGIN + PROMPT 2 2 "Dalla data " + FLAGS "A" + FIELD DADATA + CHECKTYPE REQUIRED +END + +DATE F_ADATA +BEGIN + PROMPT 2 3 "Alla data " + FLAGS "A" + FIELD ADATA +END + +NUMBER F_ANNO 4 +BEGIN + PROMPT 2 4 "" + FLAGD "HDGA" + FIELD ANNO +END + +STRING F_REPORT 256 56 +BEGIN + PROMPT 2 5 "Report " + FLAGS "B" +END + +ENDPAGE + +ENDMASK diff --git a/vd/vd1700a.rep b/vd/vd1700a.rep new file mode 100755 index 000000000..01525452f --- /dev/null +++ b/vd/vd1700a.rep @@ -0,0 +1,145 @@ + + + Riepilogo dettagli pagamenti + +
    +
    + + + + #SYSTEM.RAGSOC + + + + #DADATA + + + + #ADATA + + + + + +
    +
    + +
    + + + #SYSTEM.DATE + + + #PAGE + + +
    +
    + + + #LABINC01 + + + #LABINC02 + + + #LABINC03 + + + #LABINC04 + + + #LABINC05 + + + #LABINC06 + + + #LABINC07 + + + #LABINC08 + + + + + + + + + + MESSAGE ADD,F1.200 + + + + MESSAGE ADD,F1.200 + + + MESSAGE ADD,F1.200 + + + MESSAGE ADD,F1.200 + + + MESSAGE ADD,F1.200 + + + MESSAGE ADD,F1.200 + + + + MESSAGE ADD,F1.200 + + + MESSAGE ADD,F1.200 + + + + + +
    + USE TURNI +SELECT NUM(ANSI(DATA))E;=NUM(ANSI(#DADATA))NUM(ANSI(DATA))C;=NUM(ANSI(#ADATA)) + + \ No newline at end of file diff --git a/vd/vdconf.h b/vd/vdconf.h new file mode 100755 index 000000000..f18189124 --- /dev/null +++ b/vd/vdconf.h @@ -0,0 +1,86 @@ + +#define FD_FILIALE 101 +#define FD_CODNUM 102 +#define FD_TIPODOC 103 +#define FD_CODLIST 106 +#define FD_CHECKDOC 107 +#define FD_BARPVAR 108 +#define FD_CODPVAR 109 + +#define ROW_INC 10 +#define FD_CODPAG01 111 +#define FD_LABPAG01 112 +#define FD_RESTOPAG01 113 +#define FD_CODPAG02 121 +#define FD_LABPAG02 122 +#define FD_RESTOPAG02 123 +#define FD_CODPAG03 131 +#define FD_LABPAG03 132 +#define FD_RESTOPAG03 133 +#define FD_CODPAG04 141 +#define FD_LABPAG04 142 +#define FD_RESTOPAG04 143 +#define FD_CODPAG05 151 +#define FD_LABPAG05 152 +#define FD_RESTOPAG05 153 +#define FD_CODPAG06 161 +#define FD_LABPAG06 162 +#define FD_RESTOPAG06 163 +#define FD_CODPAG07 171 +#define FD_LABPAG07 172 +#define FD_RESTOPAG07 173 +#define FD_CODPAG08 181 +#define FD_LABPAG08 182 +#define FD_RESTOPAG08 183 + +#define FD_DESLIST 202 +#define FD_DESNUM 204 +#define FD_DESTIPODOC 205 +#define FD_DESFIL 206 + +#define FD_CODNUMF 207 +#define FD_DESNUMF 208 +#define FD_TIPODOCF 209 +#define FD_DESTIPODOCF 210 + +#define FW_CASSA 101 +#define FW_CASSETTO 102 +#define FW_CODLIST 105 +#define FW_AUTOSAVE 106 +#define FW_QTADEF 107 + +#define FW_TVLABEL1 108 +#define FW_TVCMD1 109 +#define FW_TVLABEL2 110 +#define FW_TVCMD2 111 +#define FW_TVLABEL3 112 +#define FW_TVCMD3 113 +#define FW_TVLABEL4 114 +#define FW_TVCMD4 115 +#define FW_TVLABEL5 116 +#define FW_TVCMD5 117 +#define FW_TVLABEL6 118 +#define FW_TVCMD6 119 +#define FW_TVLABEL7 120 +#define FW_TVCMD7 121 +#define FW_TVLABEL8 122 +#define FW_TVCMD8 123 + +#define FW_DESCAU 201 +#define FW_DESLIST 202 +#define FW_DESPAG 203 + +#define FW_CODNUMF 207 +#define FW_DESNUMF 208 +#define FW_TIPODOCF 209 +#define FW_DESTIPODOCF 210 +#define FW_CASSAAPP 211 + +#define F_FUNC1 411 +#define F_FUNC2 412 +#define F_FUNC3 413 +#define F_FUNC4 414 +#define F_FUNC5 415 +#define F_FUNC6 416 +#define F_FUNC7 417 +#define F_FUNC8 418 diff --git a/vd/vdlib.cpp b/vd/vdlib.cpp new file mode 100755 index 000000000..8ddeaaa81 --- /dev/null +++ b/vd/vdlib.cpp @@ -0,0 +1,473 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "turni.h" +#include "../include/user.h" +#include "vdlib.h" +#include "vdmask.h" +#include "../cg/cgpagame.h" +#include "../ve/velib.h" + + +class TApri_mask : public TAutomask +{ + const TTurno_vendita & _turno; +public: + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + + TApri_mask(const TTurno_vendita & t) : TAutomask("vdlib01"), _turno(t) {} + virtual ~TApri_mask() { } +}; + +bool TApri_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + switch (o.dlg()) + { + case F_USERNAME: + if (e == fe_modify) + set(F_TURNO, "", 0x3); + break; + case F_TURNO: + case F_PASSWORD: + if (e == fe_modify) + { + const TString & user = get(F_USERNAME); + const TRectype & rec = cache().get(LF_USER, user); + const TString & pwd = rec.get(USR_PASSWORD); + const TString pass = get(F_PASSWORD); + const bool ok = !rec.empty() && pass == decode(pwd); + const bool old_turno = get(F_TURNO).full(); + enable(-1, ok && !old_turno); + enable(DLG_OK, ok); + if (old_turno) + clear(-1); + } + break; + case F_SINIZIO: + if (e == fe_close) + { + const TDate & ultima_data = _turno.ultima_data(); + + if (ultima_data == get_date(F_DATA)) + { + const long ora_fine = _turno.ora_fine(); + const long ora_inizio = get_int(F_HINIZIO) * 10000 + get_int(F_MINIZIO) * 100 + get_int(F_SINIZIO); + + if (ora_inizio < ora_fine) + return error_box("Ora inizio %02d:%02d:%02d antecedente alla fine del turno precedente (%02d:%02d:%02d)", + get_int(F_HINIZIO), get_int(F_MINIZIO), get_int(F_SINIZIO), + ora_fine / 10000, (ora_fine / 100) % 100, ora_fine % 100); + } + } + break; + default: + break; + } + + return true; +} + +class TChiudi_mask : public TAutomask +{ + TBit_array _rim; + TTurno_vendita & _turno; + +public: + real calcola_differenza(); + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + + TChiudi_mask(TTurno_vendita & t); + virtual ~TChiudi_mask() {} +}; + +TChiudi_mask::TChiudi_mask(TTurno_vendita & t) + : TAutomask("vdlib02"), _turno(t) +{ + TConfig d(CONFIG_DITTA); + + for (int i = 1; i <= 8; i++) + { + const TString & codpag = d.get("CODPAG", NULL, i); + TReport_field * label = _turno.report().section('B', 1).find_field(100 + i); + TReport_field * value = _turno.report().section('B', 1).find_field(200 + i); + + if (codpag.full()) + { + TPagamento p(codpag); + TTipo_pag t = p.tipo_rata(0); + + _rim.set(i, t == _rim_dir); + + const TString & desc = d.get("LABPAG", NULL, i); + + field(F_INC01 +i -1).set_prompt(desc); + if (label != NULL) + label->set(desc); + if (value != NULL) + value->show(true); + } + else + { + field(F_INC01 + i - 1).hide(); + if (label != NULL) + label->hide(); + if (value != NULL) + value->hide(); + } + } +} + +real TChiudi_mask::calcola_differenza() +{ + real diff = get_real(F_CASSAFIN) - get_real(F_CASSAINI) + get_real(F_RESTI); + + for (short id = F_INC01; id <= F_INC08; id++) + { + const int i = id - F_INC01 + 1; + + if (_rim[i]) + diff -= get_real(id); + } + return diff; +} + +bool TChiudi_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + switch (o.dlg()) + { + case F_PASSWORD: + if (e == fe_modify) + { + const TString & user = get(F_USERNAME); + const TRectype & rec = cache().get(LF_USER, user); + const TString & pwd = rec.get(USR_PASSWORD); + const TString pass = get(F_PASSWORD); + const bool on = !rec.empty() && pass == decode(pwd); + enable(-1, on && !_turno.riaperto()); + enable(DLG_OK, on); + } + break; + case F_SFINE: + if (e == fe_close) + { + const long ora_inizio = _turno.ora_inizio(); + const long ora_fine = get_int(F_HFINE) * 10000 + get_int(F_MFINE) * 100 + get_int(F_SFINE); + + if (ora_fine <= ora_inizio) + return error_box("Ora fine %02d:%02d:%02d antecedente alla inizio del turno (%02d:%02d:%02d)", + get_int(F_HFINE), get_int(F_MFINE), get_int(F_SFINE), + ora_inizio / 10000, (ora_inizio / 100) % 100, ora_inizio % 100); + } + break; + case F_INC01: + case F_INC02: + case F_INC03: + case F_INC04: + case F_INC05: + case F_INC06: + case F_INC07: + case F_INC08: + case F_CASSAFIN: + { + const real diff = calcola_differenza(); + set(F_DIFF, diff); + } + break; + default: + break; + } + + return true; +} + +void TTurno_vendita::leggi(long progr) +{ + bool aperto = false; + + const TString use = format("USE %d\nFROM CODCASSA=%d ANNO=%d\nTO CODCASSA=%d ANNO=%d\n", LF_TURNI, _cassa, _anno, _cassa, _anno); + TISAM_recordset r(use); + + if (progr > 0L) + { + TRectype & rec = r.cursor()->curr(); + + rec.zero(); + rec.put(TRN_CODCASSA, _cassa); + rec.put(TRN_ANNO, _anno); + rec.put(TRN_PROGR, progr); + r.cursor()->read(); + _rec = rec; + return; + } + if (r.items() > 0L) + { + r.move_last(); + _rec = r.cursor()->curr(); + const long fine = _rec.get_long(TRN_FINE); + + progr = _rec.get_long(TRN_PROGR); + aperto = fine == 0L; + } + if (!aperto) + { + _datafine = _rec.get(TRN_DATA); + _orafine = _rec.get_long(TRN_FINE); + progr++; + _rec.zero(); + _rec.put(TRN_CODCASSA, _cassa); + _rec.put(TRN_ANNO, _anno); + _rec.put(TRN_PROGR, progr); + } + else + { + _datafine = TDate(TODAY); + _orafine = 0L; + } +} + +const long TTurno_vendita::ora_inizio() const +{ + return _rec.get_long(TRN_INIZIO); +} + +bool TTurno_vendita::apri(const bool select_prev) +{ + leggi(); + if (aperto()) + return error_box(FR("Turno aperto dall'Utente %s"), (const char *) _rec.get(TRN_USERNAME)); + + TApri_mask m(*this); + TDocumento d('D', _anno, _codnum, 0L); + const long fndoc = d.renum_ndoc(); + const long ora = daytime(); + + m.show(F_TURNO, select_prev); + m.set(F_CASSA, _cassa); + m.set(F_USERNAME, user()); + m.set(F_HINIZIO, ora / 10000); + m.set(F_MINIZIO, (ora / 100) % 100); + m.set(F_SINIZIO, ora % 100); + if (m.run() == K_ENTER) + { + const long idturno = m.get_long(F_TURNO); + + if (idturno > 0L) + { + leggi(idturno); + riapri(); + return true; + } + else + { + const real cassa_ini = m.get_real(F_CASSAINI); + const long ora_inizio = m.get_int(F_HINIZIO) * 10000 + m.get_int(F_MINIZIO) * 100 + m.get_int(F_SINIZIO); + TLocalisamfile f(LF_TURNI); + + _rec.put(TRN_USERNAME, m.get(F_USERNAME)); + _rec.put(TRN_CASSAINI, cassa_ini); + _rec.put(TRN_CASSAFIN, cassa_ini); + _rec.put(TRN_DATA, m.get_date(F_DATA)); + _rec.put(TRN_INIZIO, ora_inizio); + _rec.put(TRN_FNDOC, fndoc); + _err = _rec.write(f); + } + return _err == NOERR; + } + return false; +} + +// @ cmember riapri il turno +bool TTurno_vendita::riapri() +{ + _rec.zero(TRN_CHIUSO); + return true; +} + +// @ cmember chiudi il turno +bool TTurno_vendita::chiudi() +{ + if (!riaperto()) + leggi(); + if (chiuso()) + return error_box(FR("Turno chiuso")); + + TChiudi_mask m(*this); + TArray inc; + real resti, sospesi; + const TString user = _rec.get(TRN_USERNAME); + const long fndoc = _rec.get_long(TRN_FNDOC); + const long lndoc = _rec.get_long(TRN_LNDOC); + const long ora = daytime(); + int numscontr = 0; + + m.set(F_CASSA, _cassa); + m.set(F_DATA, _rec.get(TRN_DATA)); + m.set(F_USERNAME, user); + m.set(F_CASSAINI, _rec.get(TRN_CASSAINI)); + m.set(F_HFINE, ora / 10000); + m.set(F_MFINE, (ora / 100) % 100); + m.set(F_SFINE, ora % 100); + m.set(F_CASSAFIN, _rec.get(TRN_CASSAFIN)); + m.set(F_DIFF, _rec.get(TRN_DIFF)); + + for (int i = 0; i <= 8; i++) + inc.add(ZERO); + + for (long ndoc = fndoc; ndoc <= lndoc; ndoc++) + { + TDocumento d('D', _anno, _codnum, ndoc); + + if (user == d.get(TRN_USERNAME)) + { + if (d.chiuso()) + { + (real &) inc[1] += d.get_real(TRN_INC01); + (real &) inc[2] += d.get_real(TRN_INC02); + (real &) inc[3] += d.get_real(TRN_INC03); + (real &) inc[4] += d.get_real(TRN_INC04); + (real &) inc[5] += d.get_real(TRN_INC05); + (real &) inc[6] += d.get_real(TRN_INC06); + (real &) inc[7] += d.get_real(TRN_INC07); + (real &) inc[8] += d.get_real(TRN_INC08); + } + else + sospesi = d.totale_doc(); + resti += d.get_real(TRN_RESTI); + numscontr++; + } + } + m.set(F_INC01, (real &) inc[1]); + m.set(F_INC02, (real &) inc[2]); + m.set(F_INC03, (real &) inc[3]); + m.set(F_INC04, (real &) inc[4]); + m.set(F_INC05, (real &) inc[5]); + m.set(F_INC06, (real &) inc[6]); + m.set(F_INC07, (real &) inc[7]); + m.set(F_INC08, (real &) inc[8]); + m.set(F_SOSPESI, sospesi); + m.set(F_RESTI, resti); + + const real diff = m.calcola_differenza(); + + m.set(F_DIFF, diff); + + if (m.run() == K_ENTER) + { + TLocalisamfile f(LF_TURNI); + + if (_rec.get(TRN_FINE).blank()) + { + const long ora_fine = m.get_int(F_HFINE) * 10000 + m.get_int(F_MFINE) * 100 + m.get_int(F_SFINE); + _rec.put(TRN_FINE, ora_fine); + } + _rec.put(TRN_CHIUSO, (bool) true); + _rec.put(TRN_INC01, m.get_real(F_INC01)); + _rec.put(TRN_INC02, m.get_real(F_INC02)); + _rec.put(TRN_INC03, m.get_real(F_INC03)); + _rec.put(TRN_INC04, m.get_real(F_INC04)); + _rec.put(TRN_INC05, m.get_real(F_INC05)); + _rec.put(TRN_INC06, m.get_real(F_INC06)); + _rec.put(TRN_INC07, m.get_real(F_INC07)); + _rec.put(TRN_INC08, m.get_real(F_INC08)); + _rec.put(TRN_SOSPESI, m.get_real(F_SOSPESI)); + _rec.put(TRN_CASSAFIN, m.get_real(F_CASSAFIN)); + _rec.put(TRN_DIFF, m.get_real(F_DIFF)); + _rec.put(TRN_LNDOC, ndoc); + _rec.put(TRN_NUMSCONTR, numscontr); + _err = _rec.rewrite(f); + if (_err == NOERR) + { + TReport & rep = report(); + TReport_book book; + TVariant var; + + var = _rec.get(TRN_CODCASSA); + rep.recordset()->set_var("#CODCASSA", var); + var = _rec.get(TRN_ANNO); + rep.recordset()->set_var("#ANNO", var); + var = _rec.get(TRN_PROGR); + rep.recordset()->set_var("#PROGR", var); + + book.add(rep); + book.print(); + return true; + } + else + return error_box(FR("Errore di scrittura turno %d"), _err); + } + return false; +} + +const real TTurno_vendita::cassa_attuale() +{ + if (!riaperto()) + leggi(); + return _rec.get_real(TRN_CASSAFIN); +} + +bool TTurno_vendita::aggiorna(const long ndoc, const real & saldo) +{ + if (!riaperto()) + leggi(); + if (chiuso()) + return error_box(FR("Turno chiuso")); + + TLocalisamfile f(LF_TURNI); + const long fndoc = _rec.get_long(TRN_FNDOC); + const long lndoc = _rec.get_long(TRN_LNDOC); + + if (ndoc < fndoc) + _rec.put(TRN_FNDOC, ndoc); + if (ndoc > lndoc) + _rec.put(TRN_LNDOC, ndoc); + _rec.put(TRN_CASSAFIN, saldo); + + _err = _rec.rewrite(f); + if (_err != NOERR) + return error_box(FR("Errore di scrittura turno %d"), _err); + return true; +} + +bool TTurno_vendita::aperto() const +{ + return _rec.get_long(TRN_INIZIO) > 0L && !_rec.get_bool(TRN_CHIUSO); +} + +const TString & TTurno_vendita::user() const +{ + return _rec.get(TRN_USERNAME); +} + +int TTurno_vendita::nturno() const +{ + return _rec.get_int(TRN_PROGR); +} + +TTurno_vendita::TTurno_vendita() : _rec(LF_TURNI) +{ + { + TConfig w(CONFIG_WST); + + _cassa = w.get_int("NCASSA"); + } + + _anno = TDate(TODAY).year(); + TConfig d(CONFIG_DITTA); + + _codnum = d.get("CODNUM"); + if (_codnum.empty()) + fatal_box(TR("E' necessario configurare il modulo prima di utilizzare questo programma!")); + _rep.load("vdlib02r"); + leggi(); +} + +TOperatore::TOperatore(const char * user) : _rec(LF_TAB) +{ + _rec = cache().get("OPD", user); +} + diff --git a/vd/vdlib.h b/vd/vdlib.h new file mode 100755 index 000000000..c77296a89 --- /dev/null +++ b/vd/vdlib.h @@ -0,0 +1,106 @@ +#ifndef __VDLIB_H +#define __VDLIB_H + +#ifndef __ISAM_H +#include +#endif + +#ifndef __REPORT_H +#include +#endif + +class TTurno_vendita : public TObject +{ + TRectype _rec; + int _err; + int _anno; + TString16 _codnum; + int _cassa; + long _orafine; + TDate _datafine; + TReport _rep; + TString _superuser; + +protected: +// @ cmember leggi il turno + void leggi(long progr = 0L); + +public: +// @ cmember codice di errore + int error() const {return _err;} +// @ cmember data ultimo turno; + const TDate & ultima_data() const {return _datafine;} +// @ cmember ora inizio turno; + const long ora_inizio() const; +// @ cmember ora fine ultimo turno; + const long ora_fine() const {return _orafine;} +// @ cmember turno aperto + bool aperto() const; +// @ cmember turno riaperto + bool riaperto() const {return aperto() && ora_fine() > 0L;} +// @ cmember turno chiuso + bool chiuso() const {return !aperto();} +// @ cmember numero cassa + int ncassa() const {return _cassa;} +// @ cmember operatore + const TString & user() const; +// @ cmember superutente + const TString & superuser() const { return _superuser;} +// @ cmember aggiorna superutente + void set_superuser(const TString & superuser = EMPTY_STRING) { _superuser = superuser; } +// @ cmember numero turno + int nturno() const; +// @ cmember report + TReport & report() {return _rep;} +// @ cmember apri il turno + bool apri(const bool select_prev = true); + // @ cmember riapri il turno + bool riapri(); +// @ cmember chiudi il turno + bool chiudi(); +// @ cmember ritona il valore attuale della cassa + const real cassa_attuale(); +// @ cmember aggiorna cassa finale e riscrive il turno; + bool aggiorna(const long ndoc, const real & saldo); +// @ cmember Costruttore + TTurno_vendita(); +// @ cmember Distruttore + virtual ~TTurno_vendita() {} +}; + +class TOperatore : public TObject +{ + TRectype _rec; + +protected: + +public: + bool ok() const { return !_rec.empty(); } +// @ cmember massimo scontrino + real max_scontrino() const {return _rec.get_real("R0");} +// @ cmember massimo abbuono + real max_abbuono() const {return _rec.get_real("R1");} +// @ cmember puo cambiare prezzi + bool can_change_price() const {return _rec.get_bool("B0");} // +// @ cmember sottocosto + bool can_sotto_costo() const {return _rec.get_bool("B1");} +// @ cmember modifica omaggi + bool can_change_omaggi() const {return _rec.get_bool("B2");} +// @ cmember modifica sconti + bool can_change_sconti() const {return _rec.get_bool("B3");} // +// @ cmember resi + bool can_resi() const {return _rec.get_bool("B4");} +// @ cmember fatturazione + bool can_invoice() const {return _rec.get_bool("B5");} // +// @ cmember massimo sconto + real max_sconto() const {return _rec.get_real("R2");} +// @ cmember Provvigione + real provvigione() const {return _rec.get_real("R3");} + +// @ cmember Costruttore + TOperatore(const char * user); +// @ cmember Distruttore + virtual ~TOperatore() {} +}; + +#endif diff --git a/vd/vdlib01.uml b/vd/vdlib01.uml new file mode 100755 index 000000000..bbb18717f --- /dev/null +++ b/vd/vdlib01.uml @@ -0,0 +1,110 @@ +#include "vdmask.h" + +TOOLBAR "" 0 -3 0 3 + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -12 -11 "" + FLAGS "D" +END + +BUTTON DLG_QUIT 10 2 +BEGIN + PROMPT -22 -11 "" +END + +ENDPAGE + +PAGE "Apertura Turno" 0 0 0 -3 + +NUMBER F_CASSA 3 +BEGIN + PROMPT 2 1 "@bNumero Cassa " + FLAGS "DZ" +END + +DATE F_DATA +BEGIN + PROMPT 42 1 "@bData " + FLAGS "ADG" +END + +NUMBER F_ANNO 4 +BEGIN + PROMPT 2 2 "Anno " + FLAGS "AD" +END + +STRING F_USERNAME 8 +BEGIN + PROMPT 2 3 "Utente " + FLAGS "UT" + USE OPD + JOIN LF_USER INTO USERNAME==CODTAB + INPUT CODTAB F_USERNAME + DISPLAY "Utente@8" CODTAB + DISPLAY "Gruppo@8" LF_USER->GROUPNAME + DISPLAY "Descrizione@50" LF_USER->USERDESC + OUTPUT F_USERNAME CODTAB + CHECKTYPE REQUIRED +END + +STRING F_PASSWORD 8 10 +BEGIN + PROMPT 42 3 "Password " + FLAGS "*" +END + +NUMBER F_TURNO 7 +BEGIN + PROMPT 2 5 "Turno " + FLAGS "ZU" + USE LF_TURNI SELECT (USERNAME==#F_USERNAME)&&(CHIUSO!="") + INPUT CODCASSA F_CASSA SELECT + INPUT ANNO F_ANNO SELECT + INPUT PROGR F_TURNO + DISPLAY "Data@10" DATA + DISPLAY "Inizio : Ora" INIZIO[1,2] + DISPLAY "Minuto" INIZIO[3,4] + DISPLAY "Secondo" INIZIO[5,6] + DISPLAY "Fine : Ora" FINE[1,2] + DISPLAY "Minuto" FINE[3,4] + DISPLAY "Secondo" FINE[5,6] + OUTPUT F_TURNO PROGR + CHECKTYPE NORMAL +END + +NUMBER F_HINIZIO 2 +BEGIN + PROMPT 2 7 "Ora " + FLAGS "ZDU" + NUM_EXPR #F_HINIZIO<24 + GROUP 1 +END + +NUMBER F_MINIZIO 2 +BEGIN + PROMPT 26 7 ":" + FLAGS "ZDU" + NUM_EXPR #F_MINIZIO<60 + GROUP 1 +END + +NUMBER F_SINIZIO 2 +BEGIN + PROMPT 30 7 ":" + FLAGS "ZDU" + NUM_EXPR #F_SINIZIO<60 + GROUP 1 +END + +CURRENCY F_CASSAINI 18 +BEGIN + PROMPT 2 9 "Cassa Iniziale " + FLAGS "D" + GROUP 1 +END + +ENDPAGE + +ENDMASK diff --git a/vd/vdlib02.uml b/vd/vdlib02.uml new file mode 100755 index 000000000..ea4d2606b --- /dev/null +++ b/vd/vdlib02.uml @@ -0,0 +1,149 @@ +#include "vdmask.h" + +TOOLBAR "" 0 -3 0 3 + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -12 -11 "" + FLAGS "D" +END + +BUTTON DLG_QUIT 10 2 +BEGIN + PROMPT -22 -11 "" +END + +ENDPAGE + +PAGE "Chiusura Turno" 0 0 0 -3 + +NUMBER F_CASSA 3 +BEGIN + PROMPT 2 1 "@bNumero Cassa " + FLAGS "DZ" +END + +DATE F_DATA +BEGIN + PROMPT 42 1 "@bData " + FLAGS "D" +END + +STRING F_USERNAME 8 +BEGIN + PROMPT 2 3 "Utente " + FLAGS "UD" +END + +STRING F_PASSWORD 8 10 +BEGIN + PROMPT 42 3 "Password " + FLAGS "*" +END + +NUMBER F_HFINE 2 +BEGIN + PROMPT 2 5 "Ora " + FLAGS "ZDU" + NUM_EXPR #F_HFINE<24 + GROUP 1 +END + +NUMBER F_MFINE 2 +BEGIN + PROMPT 26 5 ":" + FLAGS "ZDU" + NUM_EXPR #F_MFINE<60 + GROUP 1 +END + +NUMBER F_SFINE 2 +BEGIN + PROMPT 30 5 ":" + FLAGS "ZDU" + NUM_EXPR #F_SFINE<60 + GROUP 1 +END + +CURRENCY F_CASSAINI 18 +BEGIN + PROMPT 2 7 "Cassa Inizale " + FLAGS "D" +END + +CURRENCY F_INC01 18 +BEGIN + PROMPT 2 9 "01----------------- " + FLAGS "D" +END + +CURRENCY F_INC02 18 +BEGIN + PROMPT 42 9 "02----------------- " + FLAGS "D" +END + +CURRENCY F_INC03 18 +BEGIN + PROMPT 2 11 "03----------------- " + FLAGS "D" +END + +CURRENCY F_INC04 18 +BEGIN + PROMPT 42 11 "04----------------- " + FLAGS "D" +END + +CURRENCY F_INC05 18 +BEGIN + PROMPT 2 13 "05----------------- " + FLAGS "D" +END + +CURRENCY F_INC06 18 +BEGIN + PROMPT 42 13 "06----------------- " + FLAGS "D" +END + +CURRENCY F_INC07 18 +BEGIN + PROMPT 2 15 "07----------------- " + FLAGS "D" +END + +CURRENCY F_INC08 18 +BEGIN + PROMPT 42 15 "08----------------- " + FLAGS "D" +END + +CURRENCY F_SOSPESI 18 +BEGIN + PROMPT 2 17 "Sospesi " + FLAGS "D" +END + +CURRENCY F_RESTI 18 +BEGIN + PROMPT 42 17 "Resti " + FLAGS "D" +END + +CURRENCY F_CASSAFIN 18 +BEGIN + PROMPT 2 19 "Cassa Finale " + FLAGS "D" + GROUP 1 +END + +CURRENCY F_DIFF 18 +BEGIN + PROMPT 42 19 "Differenza " + FLAGS "D" +END + +ENDPAGE + +ENDMASK \ No newline at end of file diff --git a/vd/vdlib02r.rep b/vd/vdlib02r.rep new file mode 100755 index 000000000..62af3b2a5 --- /dev/null +++ b/vd/vdlib02r.rep @@ -0,0 +1,150 @@ + + + Riepilogo turno + +
    + + + + + + CODCASSA + + + + + + + DATA + +
    +
    +
    +
    + + + + USERNAME + + + + + ROUND((INIZIO F; 10000), 0) + + + + + INIZIO + #THIS @ +100 F; +100 MOD +#THIS ! + + + + + + INIZIO + #THIS @ +100 MOD +#THIS ! + + + + + ROUND((FINE F; 10000), 0) + + + + + FINE + #THIS @ +100 F; +100 MOD +#THIS ! + + + + + + FINE + #THIS @ +100 MOD +#THIS ! + + + + + FNDOC + + + + + LNDOC + + + + CASSAINI + + + + RESTI + + + + CASSAFIN + + + + + + + DIFF + + + + + + + SOSPESI + + + + + + + + + + + INC01 + + + INC02 + + + INC03 + + + INC04 + + + INC05 + + + INC06 + + + INC07 + + + INC08 + +
    +
    +
    + USE TURNI +FROM CODCASSA=#CODCASSA ANNO=#ANNO PROGR=#PROGR +TO CODCASSA=#CODCASSA ANNO=#ANNO PROGR=#PROGR + + \ No newline at end of file diff --git a/vd/vdmask.h b/vd/vdmask.h new file mode 100755 index 000000000..4c8e68e3e --- /dev/null +++ b/vd/vdmask.h @@ -0,0 +1,25 @@ +#define F_USERNAME 101 +#define F_PASSWORD 102 +#define F_DATA 103 +#define F_HINIZIO 104 +#define F_MINIZIO 105 +#define F_SINIZIO 106 +#define F_CASSAINI 107 +#define F_INC01 108 +#define F_INC02 109 +#define F_INC03 110 +#define F_INC04 111 +#define F_INC05 112 +#define F_INC06 113 +#define F_INC07 114 +#define F_INC08 115 +#define F_CASSAFIN 116 +#define F_HFINE 117 +#define F_MFINE 118 +#define F_SFINE 119 +#define F_DIFF 120 +#define F_CASSA 121 +#define F_RESTI 122 +#define F_SOSPESI 123 +#define F_TURNO 124 +#define F_ANNO 125 diff --git a/vd/vdmenu.men b/vd/vdmenu.men new file mode 100755 index 000000000..d2054dce5 --- /dev/null +++ b/vd/vdmenu.men @@ -0,0 +1,62 @@ +[VDMENU_000] +Caption = "Vendita al dettaglio" +Picture = +Module = 38 +Flags = "" +Item_01 = "Tabelle", [VDMENU_010] +Item_02 = "Stampa Tabelle", [VDMENU_020] +Item_03 = "Apertura turno", "vd0 -4", "F" +Item_04 = "Scontrini", "vd0 -6", "F" +Item_05 = "Chiusura turno", "vd0 -5", "F" +Item_06 = "Stampe", [VDMENU_030] +Item_07 = "Elaborazioni differite", [VEMENU_050] +Item_08 = "Servizi", [VEMENU_051] +Item_09 = "Configurazione modulo", [VDMENU_090] + +[VDMENU_010] +Caption = "Tabelle" +Picture = +Module = 0 +Flags = "" +Item_01 = "Statistiche personalizzate", "vd0 -0 %TDT" +Item_02 = "Stagioni", "vd0 -0 %STG" +Item_03 = "Reparti", "vd0 -0 RPD", "F" +Item_04 = "Operatori", "vd0 -0 OPD", "F" +Item_05 = "Filiali", "vd0 -0 FLD", "F" +Item_06 = "Casse", "vd0 -0 CAS", "F" + +[VDMENU_020] +Caption = "Stampa tabelle" +Picture = +Module = 0 +Flags = "" +Item_01 = "Statistiche personalizzate", "vd0 -1 %TDT" +Item_02 = "Stagioni", "vd0 -1 %STG" +Item_03 = "Reparti", "vd0 -1 RPD", "F" +Item_04 = "Operatori", "vd0 -1 OPD", "F" +Item_05 = "Filiali", "vd0 -1 FLD", "F" +Item_06 = "Casse", "vd0 -1 CAS", "F" + +[VDMENU_030] +Caption = "Stampe" +Picture = +Module = 0 +Flags = "" +Item_01 = "Lettura cassa giornaliera", "vd1 -0" +Item_02 = "Riepilogo incassi", "vd1 -1" +Item_03 = "Riepilogo venduto per operatore", "vd1 -2" +Item_04 = "Ricerca scontrini", "" +Item_05 = "Situazione economica cliente", "vd1 -4" +Item_06 = "Riepilogo dettaglio scontrini giornalieri", "vd1 -5 G" +Item_07 = "Riepilogo dettaglio scontrini", "vd1 -5 P" +Item_08 = "Riepilogo dettagli pagamenti", "vd1 -6" +Item_09 = "Riepilogo vendite forzate", "vd1 -7" + + +[VDMENU_090] +Caption = "Configurazione" +Picture = +Module = 0 +Flags = "" +Item_01 = "Configurazione ditta", "vd0 -2", "F" +Item_02 = "Configurazione stazione", "vd0 -3", "F" diff --git a/vd/vdstcas.rep b/vd/vdstcas.rep new file mode 100755 index 000000000..f2f0439aa --- /dev/null +++ b/vd/vdstcas.rep @@ -0,0 +1,46 @@ + + + Stampa tabella casse + +
    + + + #SYSTEM.RAGSOC + + + + + + + + + + + + +
    +
    +
    +
    + + CODTAB + + + S0 + +
    +
    + + + #SYSTEM.DATE + + + #PAGE + + +
    +
    + USE CAS +FROM CODTAB=#FROM +TO CODTAB=#TO + \ No newline at end of file diff --git a/vd/vdstcas.uml b/vd/vdstcas.uml new file mode 100755 index 000000000..56eb8ae7b --- /dev/null +++ b/vd/vdstcas.uml @@ -0,0 +1,41 @@ +#include "../ba/ba3200.h" + +PAGE "Stampa tabella casse" -1 -1 50 8 + +STRING F_INIZIO1 3 +BEGIN + PROMPT 2 2 "Da codice " + FLAGS "UZ" + USE CAS + INPUT CODTAB F_INIZIO1 + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_INIZIO1 CODTAB + FIELD FROM + GROUP 1 +END + +STRING F_FINE1 3 +BEGIN + PROMPT 2 4 "A codice " + FLAGS "UZ" + COPY USE F_INIZIO1 + INPUT CODTAB F_FINE1 + COPY DISPLAY F_INIZIO1 + OUTPUT F_FINE1 CODTAB + FIELD TO + GROUP 2 +END + +BUTTON DLG_OK 10 2 +BEGIN +PROMPT -12 -1 "" +END + +BUTTON DLG_QUIT 10 2 +BEGIN +PROMPT -22 -1 "" +END + +ENDPAGE +ENDMASK diff --git a/vd/vdstfld.rep b/vd/vdstfld.rep new file mode 100755 index 000000000..a28b339d9 --- /dev/null +++ b/vd/vdstfld.rep @@ -0,0 +1,46 @@ + + + Stampa tabella filiali + +
    + + + #SYSTEM.RAGSOC + + + + + + + + + + + + +
    +
    +
    +
    + + CODTAB + + + S0 + +
    +
    + + + #SYSTEM.DATE + + + #PAGE + + +
    +
    + USE FLD +FROM CODTAB=#FROM +TO CODTAB=#TO + \ No newline at end of file diff --git a/vd/vdstfld.uml b/vd/vdstfld.uml new file mode 100755 index 000000000..97bc19468 --- /dev/null +++ b/vd/vdstfld.uml @@ -0,0 +1,41 @@ +#include "../ba/ba3200.h" + +PAGE "Stampa filiali" -1 -1 50 8 + +STRING F_INIZIO1 2 +BEGIN +PROMPT 2 2 "Da codice " +FLAGS "UZ" +USE FLD +INPUT CODTAB F_INIZIO1 +DISPLAY "Codice" CODTAB +DISPLAY "Descrizione@70" S0 +OUTPUT F_INIZIO1 CODTAB +FIELD FROM +GROUP 1 +END + +STRING F_FINE1 2 +BEGIN +PROMPT 2 4 "A codice " +FLAGS "UZ" +COPY USE F_INIZIO1 +INPUT CODTAB F_FINE1 +COPY DISPLAY F_INIZIO1 +OUTPUT F_FINE1 CODTAB +FIELD TO +GROUP 2 +END + +BUTTON DLG_OK 10 2 +BEGIN +PROMPT -12 -1 "" +END + +BUTTON DLG_QUIT 10 2 +BEGIN +PROMPT -22 -1 "" +END + +ENDPAGE +ENDMASK diff --git a/vd/vdstopd.rep b/vd/vdstopd.rep new file mode 100755 index 000000000..d669a5101 --- /dev/null +++ b/vd/vdstopd.rep @@ -0,0 +1,98 @@ + + + Stampa tabella operatori + +
    + + + #SYSTEM.RAGSOC + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    + + CODTAB + + + 2.USERDESC + + + R0 + + + R1 + + + B0 + + + B2 + + + R2 + + + B1 + + + B3 + + + R3 + +
    +
    + + + #SYSTEM.DATE + + + #PAGE + + +
    +
    + USE OPD +JOIN 2 INTO USERNAME==CODTAB +FROM CODTAB=#FROM +TO CODTAB=#TO + \ No newline at end of file diff --git a/vd/vdstopd.uml b/vd/vdstopd.uml new file mode 100755 index 000000000..364d78da2 --- /dev/null +++ b/vd/vdstopd.uml @@ -0,0 +1,41 @@ +#include "../ba/ba3200.h" + +PAGE "Stampa Operatori" -1 -1 50 8 + +STRING F_INIZIO1 8 +BEGIN +PROMPT 2 2 "Da operatore " +FLAGS "UZ" +USE OPD +INPUT CODTAB F_INIZIO1 +DISPLAY "Codice" CODTAB +DISPLAY "Descrizione@70" S0 +OUTPUT F_INIZIO1 CODTAB +FIELD FROM +GROUP 1 +END + +STRING F_FINE1 8 +BEGIN +PROMPT 2 4 "A operatore " +FLAGS "UZ" +COPY USE F_INIZIO1 +INPUT CODTAB F_FINE1 +COPY DISPLAY F_INIZIO1 +OUTPUT F_FINE1 CODTAB +FIELD TO +GROUP 2 +END + +BUTTON DLG_OK 10 2 +BEGIN +PROMPT -12 -1 "" +END + +BUTTON DLG_QUIT 10 2 +BEGIN +PROMPT -22 -1 "" +END + +ENDPAGE +ENDMASK diff --git a/vd/vdstrpd.rep b/vd/vdstrpd.rep new file mode 100755 index 000000000..32977644d --- /dev/null +++ b/vd/vdstrpd.rep @@ -0,0 +1,46 @@ + + + Stampa tabella reparti + +
    + + + #SYSTEM.RAGSOC + + + + + + + + + + + + +
    +
    +
    +
    + + CODTAB + + + S0 + +
    +
    + + + #SYSTEM.DATE + + + #PAGE + + +
    +
    + USE RPD +FROM CODTAB=#FROM +TO CODTAB=#TO + \ No newline at end of file diff --git a/vd/vdstrpd.uml b/vd/vdstrpd.uml new file mode 100755 index 000000000..067de7260 --- /dev/null +++ b/vd/vdstrpd.uml @@ -0,0 +1,41 @@ +#include "../ba/ba3200.h" + +PAGE "Stampa reparti" -1 -1 50 8 + +STRING F_INIZIO1 3 +BEGIN +PROMPT 2 2 "Da codice " +FLAGS "UZ" +USE RPD +INPUT CODTAB F_INIZIO1 +DISPLAY "Codice" CODTAB +DISPLAY "Descrizione@70" S0 +OUTPUT F_INIZIO1 CODTAB +FIELD FROM +GROUP 1 +END + +STRING F_FINE1 3 +BEGIN +PROMPT 2 4 "A codice " +FLAGS "UZ" +COPY USE F_INIZIO1 +INPUT CODTAB F_FINE1 +COPY DISPLAY F_INIZIO1 +OUTPUT F_FINE1 CODTAB +FIELD TO +GROUP 2 +END + +BUTTON DLG_OK 10 2 +BEGIN +PROMPT -12 -1 "" +END + +BUTTON DLG_QUIT 10 2 +BEGIN +PROMPT -22 -1 "" +END + +ENDPAGE +ENDMASK diff --git a/vd/vdststg.rep b/vd/vdststg.rep new file mode 100755 index 000000000..fbd8d0a9e --- /dev/null +++ b/vd/vdststg.rep @@ -0,0 +1,46 @@ + + + Stampa tabella stagioni + +
    + + + #SYSTEM.RAGSOC + + + + + + + + + + + + +
    +
    +
    +
    + + CODTAB + + + S0 + +
    +
    + + + #SYSTEM.DATE + + + #PAGE + + +
    +
    + USE %STG +FROM CODTAB=#FROM +TO CODTAB=#TO + \ No newline at end of file diff --git a/vd/vdststg.uml b/vd/vdststg.uml new file mode 100755 index 000000000..05ecaa01f --- /dev/null +++ b/vd/vdststg.uml @@ -0,0 +1,41 @@ +#include "../ba/ba3200.h" + +PAGE "Stampa stagioni" -1 -1 50 8 + +STRING F_INIZIO1 4 +BEGIN +PROMPT 2 2 "Da codice " +FLAGS "UZ" +USE %STG +INPUT CODTAB F_INIZIO1 +DISPLAY "Codice" CODTAB +DISPLAY "Descrizione@70" S0 +OUTPUT F_INIZIO1 CODTAB +FIELD FROM +GROUP 1 +END + +STRING F_FINE1 4 +BEGIN +PROMPT 2 4 "A codice " +FLAGS "UZ" +COPY USE F_INIZIO1 +INPUT CODTAB F_FINE1 +COPY DISPLAY F_INIZIO1 +OUTPUT F_FINE1 CODTAB +FIELD TO +GROUP 2 +END + +BUTTON DLG_OK 10 2 +BEGIN +PROMPT -12 -1 "" +END + +BUTTON DLG_QUIT 10 2 +BEGIN +PROMPT -22 -1 "" +END + +ENDPAGE +ENDMASK diff --git a/vd/vdsttdt.rep b/vd/vdsttdt.rep new file mode 100755 index 000000000..84ade2b2b --- /dev/null +++ b/vd/vdsttdt.rep @@ -0,0 +1,58 @@ + + + Stampa tabella campi di accumulo + +
    + + + #SYSTEM.RAGSOC + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    + + CODTAB + + + S0 + + + S4 + + + S5 + +
    +
    + + + #SYSTEM.DATE + + + #PAGE + + +
    +
    + USE %TDT +FROM CODTAB=#FROM +TO CODTAB=#TO + \ No newline at end of file diff --git a/vd/vdsttdt.uml b/vd/vdsttdt.uml new file mode 100755 index 000000000..7ef4b63e3 --- /dev/null +++ b/vd/vdsttdt.uml @@ -0,0 +1,41 @@ +#include "../ba/ba3200.h" + +PAGE "Stampa Campi di accumulo" -1 -1 50 8 + +STRING F_INIZIO1 2 +BEGIN +PROMPT 2 2 "Da codice " +FLAGS "UZ" +USE %TDT +INPUT CODTAB F_INIZIO1 +DISPLAY "Codice" CODTAB +DISPLAY "Descrizione@70" S0 +OUTPUT F_INIZIO1 CODTAB +FIELD FROM +GROUP 1 +END + +STRING F_FINE1 2 +BEGIN +PROMPT 2 4 "A codice " +FLAGS "UZ" +COPY USE F_INIZIO1 +INPUT CODTAB F_FINE1 +COPY DISPLAY F_INIZIO1 +OUTPUT F_FINE1 CODTAB +FIELD TO +GROUP 2 +END + +BUTTON DLG_OK 10 2 +BEGIN +PROMPT -12 -1 "" +END + +BUTTON DLG_QUIT 10 2 +BEGIN +PROMPT -22 -1 "" +END + +ENDPAGE +ENDMASK diff --git a/vd/vdtabcom.txt b/vd/vdtabcom.txt new file mode 100755 index 000000000..a510e0734 --- /dev/null +++ b/vd/vdtabcom.txt @@ -0,0 +1,17 @@ +[Header] +Version=199519 +File=4 +Fields=COD,3|CODTAB,25|S0,70|S1,70|S2,70|S3,70|S4,20|S5,20|S6,5|S7,5 +Fields=S8,5|S9,5|S10,5|S11,5|I0,7|I1,7|I2,7|I3,7|I4,7|I5,7 +Fields=I6,7|I7,7|I8,7|I9,7|I10,7|I11,7|I12,7|I13,7|I14,7|R0,18 +Fields=R1,18|R2,18|R3,18|R4,18|R5,18|R6,18|R7,18|R8,18|R9,18|R10,18 +Fields=R11,18|R12,18|R13,18|R14,18|R15,18|R16,18|R17,18|R18,18|R19,18|R20,18 +Fields=R21,18|R22,18|R23,18|R24,18|R25,18|D0,10|D1,10|D2,10|D3,10|D4,10 +Fields=B0,1|B1,1|B2,1|B3,1|B4,1|B5,1|B6,1|B7,1|B8,1|B9,1 +Fields=B10,1|B11,1|B12,1|B13,1|B14,1|B15,1|FPC,1 + +[Data] +FRD|VDIMPLOR|Importo lordo vendita al dettaglio|SOMMA("IMPONIBILE()","(TIPO()=='M'&&(QTA>0))")|||||||||||18||||||||||||||||||||||||||||||||||||||||||||||X|X||||||||||||||| +FRD|VDQTALOR|Quantita' lorda vendita al dettaglio|SOMMA("QTA","(TIPO()=='M'&&(QTA>0))")|||||||||||18||||||||||||||||||||||||||||||||||||||||||||||X| ||||||||||||||| +FRD|VDIMPRES|Importo reso vendita al dettaglio|SOMMA("IMPONIBILE()","(TIPO()=='M'&&(QTA<0))")|||||||||||18||||||||||||||||||||||||||||||||||||||||||||||X|X||||||||||||||| +FRD|VDQTARES|Quantita' resa vendita al dettaglio|SOMMA("-QTA","(TIPO()=='M'&&(QTA<0))")|||||||||||18||||||||||||||||||||||||||||||||||||||||||||||X| ||||||||||||||| diff --git a/vd/vdtbcas.h b/vd/vdtbcas.h new file mode 100755 index 000000000..22cfbbdd6 --- /dev/null +++ b/vd/vdtbcas.h @@ -0,0 +1,21 @@ + + +// campi maschera batbstg.msk + +#define F_CODICE 101 +#define F_DESCR 102 + + + + + + + + + + + + + + + diff --git a/vd/vdtbcas.uml b/vd/vdtbcas.uml new file mode 100755 index 000000000..a098c898a --- /dev/null +++ b/vd/vdtbcas.uml @@ -0,0 +1,48 @@ +#include "vdtbcas.h" + +TOOLBAR "" 0 20 0 2 + +#include + +ENDPAGE + +PAGE "Casse" -1 -1 78 8 + +GROUPBOX DLG_NULL 75 5 +BEGIN + PROMPT 1 1 "" + FLAGS "R" +END + +NUMBER F_CODICE 3 +BEGIN + PROMPT 4 2 "Codice " + HELP "Codice cassa" + FIELD CODTAB + FLAGS "UZ" + KEY 1 + USE CAS + INPUT CODTAB F_CODICE + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione @50" S0 + OUTPUT F_CODICE CODTAB + OUTPUT F_DESCR S0 + CHECKTYPE REQUIRED +END + +STRING F_DESCR 50 +BEGIN + PROMPT 4 4 "Descrizione " + HELP "Descrizione cassa" + FIELD S0 + KEY 2 + USE CAS KEY 2 + INPUT S0 F_DESCR + DISPLAY "Descrizione @50" S0 + DISPLAY "Codice" CODTAB + COPY OUTPUT F_CODICE + CHECKTYPE REQUIRED +END + +ENDPAGE +ENDMASK diff --git a/vd/vdtbfld.h b/vd/vdtbfld.h new file mode 100755 index 000000000..9644e459b --- /dev/null +++ b/vd/vdtbfld.h @@ -0,0 +1,21 @@ + + +// campi maschera batbfld.msk + +#define F_CODICE 101 +#define F_DESCR 102 + + + + + + + + + + + + + + + diff --git a/vd/vdtbfld.uml b/vd/vdtbfld.uml new file mode 100755 index 000000000..3a9ee44c0 --- /dev/null +++ b/vd/vdtbfld.uml @@ -0,0 +1,50 @@ +#include "vdtbfld.h" + +TOOLBAR "" 0 20 0 2 + +#include + +ENDPAGE + +PAGE "Filiali" -1 -1 78 8 + +GROUPBOX DLG_NULL 75 5 +BEGIN + PROMPT 1 1 "" + FLAGS "R" +END + +STRING F_CODICE 2 +BEGIN +PROMPT 4 2 "Codice " +HELP "Codice filiale" +FIELD CODTAB +FLAGS "UZ" +KEY 1 +USE FLD +INPUT CODTAB F_CODICE +DISPLAY "Codice" CODTAB +DISPLAY "Descrizione @70" S0 +OUTPUT F_CODICE CODTAB +OUTPUT F_DESCR S0 +CHECKTYPE REQUIRED +END + +STRING F_DESCR 70 50 +BEGIN +PROMPT 4 4 "Descrizione " +HELP "Descrizione filiale" +FIELD S0 +KEY 2 +USE FLD KEY 2 +INPUT CODTAB F_CODICE +INPUT S0 F_DESCR +DISPLAY "Descrizione @70" S0 +DISPLAY "Codice" CODTAB +OUTPUT F_CODICE CODTAB +OUTPUT F_DESCR S0 +CHECKTYPE REQUIRED +END + +ENDPAGE +ENDMASK diff --git a/vd/vdtbopd.h b/vd/vdtbopd.h new file mode 100755 index 000000000..70c1f9d1e --- /dev/null +++ b/vd/vdtbopd.h @@ -0,0 +1,28 @@ + + +// campi maschera batbopd.msk + +#define F_USERTAB 101 +#define F_USER 102 +#define F_USERDESC 103 +#define F_VALMAX 104 +#define F_ABBMAX 105 +#define F_XCGPRICES 106 +#define F_LOWCOST 107 +#define F_XCGGIFT 108 +#define F_XCGDISCOUNT 109 +#define F_DISCOUNTMAX 110 +#define F_PROVVIGIONE 111 +#define F_RESI 112 +#define F_FATT 113 + + + + + + + + + + + diff --git a/vd/vdtbopd.uml b/vd/vdtbopd.uml new file mode 100755 index 000000000..6f824d79c --- /dev/null +++ b/vd/vdtbopd.uml @@ -0,0 +1,119 @@ +#include "vdtbopd.h" + +TOOLBAR "" 0 20 0 2 + +#include + +ENDPAGE + +PAGE "Operatori" -1 -1 78 8 + +GROUPBOX DLG_NULL 75 5 +BEGIN + PROMPT 1 1 "" + FLAGS "R" +END + +STRING F_USERTAB 8 +BEGIN + PROMPT 2 2 "Operatore " + FLAGS "U" + USE OPD + JOIN LF_USER INTO USERNAME==CODTAB + INPUT CODTAB F_USERTAB + DISPLAY "Utente@8" CODTAB + DISPLAY "Gruppo@8" LF_USER->GROUPNAME + DISPLAY "Descrizione@50" LF_USER->USERDESC + OUTPUT F_USERTAB CODTAB + OUTPUT F_USERDESC LF_USER->USERDESC + KEY 1 + CHECKTYPE REQUIRED + FIELD CODTAB +END + +STRING F_USER 8 +BEGIN + PROMPT 2 2 "Operatore " + FLAGS "UD" + USE LF_USER + INPUT USERNAME F_USER + DISPLAY "Utente@8" USERNAME + DISPLAY "Gruppo@8" GROUPNAME + DISPLAY "Descrizione@50" USERDESC + OUTPUT F_USER USERNAME + OUTPUT F_USERDESC USERDESC + KEY 1 + CHECKTYPE REQUIRED + MESSAGE COPY,F_USERTAB + FIELD CODTAB + ADD RUN ba1 -3 +END + +STRING F_USERDESC 50 +BEGIN + PROMPT 2 4 "Nome " + FLAGS "D" +END + +CURRENCY F_VALMAX 9 +BEGIN + PROMPT 2 6 "Scontrino max." + FIELD R0 +END + +CURRENCY F_ABBMAX 9 +BEGIN + PROMPT 40 6 "Abbuono max. " + FIELD R1 +END + +BOOLEAN F_XCGPRICES +BEGIN + PROMPT 2 8 "Modifica prezzi" + FIELD B0 +END + +BOOLEAN F_LOWCOST +BEGIN + PROMPT 40 8 "Sottocosto" + FIELD B1 +END + +BOOLEAN F_XCGGIFT +BEGIN + PROMPT 2 10 "Modifica omaggi" + FIELD B2 +END + +BOOLEAN F_XCGDISCOUNT +BEGIN + PROMPT 40 10 "Modifica sconti" + FIELD B3 +END + +BOOLEAN F_RESI +BEGIN + PROMPT 2 12 "Resi" + FIELD B4 +END + +BOOLEAN F_FATT +BEGIN + PROMPT 40 12 "Fatturazione" + FIELD B5 +END + +NUMBER F_DISCOUNTMAX 6 2 +BEGIN + PROMPT 2 14 "Sconto max. " + FIELD R2 +END + +NUMBER F_PROVVIGIONE 5 2 +BEGIN + PROMPT 40 14 "% Provvigione " + FIELD R3 +END + +ENDPAGE +ENDMASK diff --git a/vd/vdtbrpd.h b/vd/vdtbrpd.h new file mode 100755 index 000000000..7ba1ea198 --- /dev/null +++ b/vd/vdtbrpd.h @@ -0,0 +1,21 @@ + + +// campi maschera batbrpd.msk + +#define F_CODICE 101 +#define F_DESCR 102 + + + + + + + + + + + + + + + diff --git a/vd/vdtbrpd.uml b/vd/vdtbrpd.uml new file mode 100755 index 000000000..e410e6e2d --- /dev/null +++ b/vd/vdtbrpd.uml @@ -0,0 +1,48 @@ +#include "vdtbrpd.h" + +TOOLBAR "" 0 20 0 2 + +#include + +ENDPAGE + +PAGE "Reparti" -1 -1 78 8 + +GROUPBOX DLG_NULL 75 5 +BEGIN + PROMPT 1 1 "" + FLAGS "R" +END + +STRING F_CODICE 3 +BEGIN +PROMPT 4 2 "Codice " +HELP "Codice reparto" +FIELD CODTAB +FLAGS "UZ" +KEY 1 +USE RPD +INPUT CODTAB F_CODICE +DISPLAY "Codice" CODTAB +DISPLAY "Descrizione @70" S0 +OUTPUT F_CODICE CODTAB +OUTPUT F_DESCR S0 +CHECKTYPE REQUIRED +END + +STRING F_DESCR 70 50 +BEGIN +PROMPT 4 4 "Descrizione " +HELP "Descrizione reparto" +FIELD S0 +KEY 2 +USE RPD KEY 2 +INPUT S0 F_DESCR +DISPLAY "Descrizione @70" S0 +DISPLAY "Codice" CODTAB +COPY OUTPUT F_CODICE +CHECKTYPE REQUIRED +END + +ENDPAGE +ENDMASK diff --git a/vd/vdtbstg.h b/vd/vdtbstg.h new file mode 100755 index 000000000..22cfbbdd6 --- /dev/null +++ b/vd/vdtbstg.h @@ -0,0 +1,21 @@ + + +// campi maschera batbstg.msk + +#define F_CODICE 101 +#define F_DESCR 102 + + + + + + + + + + + + + + + diff --git a/vd/vdtbstg.uml b/vd/vdtbstg.uml new file mode 100755 index 000000000..b9902068b --- /dev/null +++ b/vd/vdtbstg.uml @@ -0,0 +1,48 @@ +#include "vdtbstg.h" + +TOOLBAR "" 0 20 0 2 + +#include + +ENDPAGE + +PAGE "Stagioni" -1 -1 78 8 + +GROUPBOX DLG_NULL 75 5 +BEGIN + PROMPT 1 1 "" + FLAGS "R" +END + +STRING F_CODICE 4 +BEGIN +PROMPT 4 2 "Codice " +HELP "Codice stagione" +FIELD CODTAB +FLAGS "UZ" +KEY 1 +USE %STG +INPUT CODTAB F_CODICE +DISPLAY "Codice" CODTAB +DISPLAY "Descrizione @70" S0 +OUTPUT F_CODICE CODTAB +OUTPUT F_DESCR S0 +CHECKTYPE REQUIRED +END + +STRING F_DESCR 70 50 +BEGIN +PROMPT 4 4 "Descrizione " +HELP "Descrizione stagione" +FIELD S0 +KEY 2 +USE %STG KEY 2 +INPUT S0 F_DESCR +DISPLAY "Descrizione @70" S0 +DISPLAY "Codice" CODTAB +COPY OUTPUT F_CODICE +CHECKTYPE REQUIRED +END + +ENDPAGE +ENDMASK diff --git a/vd/vdtbtdt.h b/vd/vdtbtdt.h new file mode 100755 index 000000000..fd3310771 --- /dev/null +++ b/vd/vdtbtdt.h @@ -0,0 +1,23 @@ + + +// campi maschera batbtdt.msk + +#define F_CODICE 101 +#define F_DESCR 102 +#define F_FORCOND 103 +#define F_FORVAL 104 + + + + + + + + + + + + + + + diff --git a/vd/vdtbtdt.uml b/vd/vdtbtdt.uml new file mode 100755 index 000000000..45835c74c --- /dev/null +++ b/vd/vdtbtdt.uml @@ -0,0 +1,76 @@ +#include "vdtbtdt.h" + +TOOLBAR "" 0 20 0 2 + +#include + +ENDPAGE + +PAGE "Campi di accumulo" -1 -1 78 8 + +GROUPBOX DLG_NULL 75 5 +BEGIN + PROMPT 1 1 "" + FLAGS "R" +END + +STRING F_CODICE 2 +BEGIN + PROMPT 2 2 "Codice " + HELP "Codice campo" + FIELD CODTAB + FLAGS "UZ" + KEY 1 + USE %TDT + INPUT CODTAB F_CODICE + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione @70" S0 + OUTPUT F_CODICE CODTAB + OUTPUT F_DESCR S0 + CHECKTYPE REQUIRED +END + +STRING F_DESCR 70 50 +BEGIN + PROMPT 2 4 "Descrizione " + HELP "Descrizione del campo" + FIELD S0 + KEY 2 + USE %TDT KEY 2 + INPUT CODTAB F_CODICE + INPUT S0 F_DESCR + DISPLAY "Descrizione @70" S0 + DISPLAY "Codice" CODTAB + COPY OUTPUT F_CODICE + CHECKTYPE REQUIRED +END + +STRING F_FORCOND 10 +BEGIN + PROMPT 2 6 "Formula condizione " + FIELD S4 + USE %FRR + CHECKTYPE REQUIRED + INPUT CODTAB F_FORCOND + DISPLAY "Codice@10" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_FORCOND CODTAB + FLAG "UZ" + CHECKTYPE REQUIRED +END + +STRING F_FORVAL 10 +BEGIN + PROMPT 2 8 "Formula valore " + FIELD S5 + USE %FRR + CHECKTYPE REQUIRED + INPUT CODTAB F_FORVAL + DISPLAY "Codice@10" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_FORVAL CODTAB + FLAG "UZ" + CHECKTYPE REQUIRED +END +ENDPAGE +ENDMASK diff --git a/xi/xi.h b/xi/xi.h index e5462cb40..192ab207d 100755 --- a/xi/xi.h +++ b/xi/xi.h @@ -1496,6 +1496,9 @@ XIDLL void xi_bitmap_size_get XVT_CC_ARGS( ( XI_BITMAP* bitmap, short* width, short* height ) ); XIDLL BOOLEAN xi_bitmap_draw_all_on_resize XVT_CC_ARGS( ( XI_BITMAP* bitmap ) ); +XIDLL void xi_aga_field_set_pos( XI_OBJ * xi_obj, int pos ); +XIDLL void xi_lowlevel_focus( XI_OBJ * xi_obj, BOOLEAN set); + #define xi_bitmap_background_set( bitmap, color ) ((bitmap)->background = (color) ) #define xi_bitmap_hcenter_set( bitmap, flag ) ((bitmap)->hcenter = (flag) ) #define xi_bitmap_mode_set( bitmap, m ) ((bitmap)->mode = (m) ) diff --git a/xi/xi2.c b/xi/xi2.c index c34e90243..078886d10 100755 --- a/xi/xi2.c +++ b/xi/xi2.c @@ -473,12 +473,22 @@ xi_find_next_obj( XI_OBJ * focus_obj, XI_NEXT_TYPE tab_type, long c ) return NULL; } +void +xi_aga_field_set_pos( XI_OBJ * xi_obj, int pos ) +{ + if ( xi_obj->type == XIT_FIELD ) + { + STX_DATA *stxp = ( STX_DATA * ) xi_obj->v.field->stx; + + xi_text_selection_set( stxp->xi_text, pos, pos ); + } +} /* xi_lowlevel_focus: inform a control that it is gaining or losing the focus. A control may reset some internal state when this happens. This is not refusable. */ -static void +void xi_lowlevel_focus( XI_OBJ * xi_obj, BOOLEAN set ) { XI_OBJ *itf; diff --git a/xi/xiutils.c b/xi/xiutils.c index fa1ebfc12..1881a9f83 100755 --- a/xi/xiutils.c +++ b/xi/xiutils.c @@ -2678,6 +2678,17 @@ case XIT_ITF: xi_invalidate_rect( xi_get_window( xi_obj ), NULL ); break; } +case XIT_BTN: + { + XinRect rct; + + if ( xi_obj->v.btn->font != NULL ) + XinFontDestroy( xi_obj->v.btn->font ); + XinFontCopy( &xi_obj->v.btn->font, font ); + xi_get_rect( xi_obj, &rct ); + xi_invalidate_rect( xi_get_window( xi_obj->itf ), &rct ); + break; + } case XIT_TEXT: { XinRect rct;