From 046e2c06cbd3eb4fac161a99db720152ba10d4ed Mon Sep 17 00:00:00 2001 From: alex Date: Tue, 6 Mar 2007 16:37:44 +0000 Subject: [PATCH] Patch level : 4.0 649 Ricompilazione Demo : [ ] Commento : Riportata la versione 3.1 patch 848 git-svn-id: svn://10.65.10.50/trunk@14993 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- at/agaat.men | 16 +- at/at0100.cpp | 23 +- at/at1200.cpp | 111 ++- at/at1200a.h | 3 +- at/at1200a.uml | 5 + at/at2600.cpp | 11 +- at/at2700.cpp | 8 +- at/at9.cpp | 2 + at/at9.h | 1 + at/at9400.cpp | 236 ++++++ at/at9400a.uml | 13 + at/bastscs.uml | 16 + at/batbbnz.h | 4 +- at/batbbnz.uml | 41 +- at/batbscs.h | 3 + at/batbscs.rpt | 9 + at/batbscs.uml | 40 ++ gv/f158.dir | 4 +- gv/f158.trr | 8 +- gv/gv0.cpp | 14 + gv/gv0.h | 2 + gv/gv0500.cpp | 741 +++++++++++++++++++ gv/gv0500a.h | 27 + gv/gv0500a.uml | 115 +++ gv/gv0500b.h | 7 + gv/gv0500b.uml | 473 ++++++++++++ gv/gv0600.cpp | 1033 +++++++++++++++++++++++++++ gv/gv0600a.h | 18 + gv/gv0600a.uml | 267 +++++++ gv/gvlib.cpp | 106 +++ gv/gvlib.h | 43 ++ include/array.cpp | 7 + include/array.h | 15 +- include/assoc.cpp | 2 +- include/campo.aut | 2 +- include/causali.h | 1 + include/codeb.c | 12 +- include/controls.cpp | 137 +++- include/controls.h | 8 +- include/date.cpp | 37 +- include/expr.cpp | 2 +- include/image.cpp | 41 +- include/image.h | 7 +- include/isam.cpp | 36 +- include/isamrpc.cpp | 20 + include/isamrpc.h | 1 + include/mask.cpp | 10 +- include/mask.h | 4 - include/maskfld.cpp | 63 +- include/maskfld.h | 17 +- include/msksheet.cpp | 18 +- include/msksheet.h | 4 +- include/netsock.cpp | 211 ++++-- include/netsock.h | 2 + include/prefix.cpp | 96 ++- include/prefix.h | 10 +- include/progind.cpp | 15 +- include/progind.h | 2 + include/recset.cpp | 111 +-- include/recset.h | 2 +- include/relapp.cpp | 97 +-- include/relapp.h | 4 +- include/relation.cpp | 38 +- include/report.cpp | 52 +- include/report.h | 20 +- include/reprint.cpp | 42 +- include/reprint.h | 1 + include/righef24.h | 23 + include/tabapp.cpp | 55 +- include/tabapp.h | 11 +- include/variant.cpp | 22 +- include/varmask.cpp | 2 +- include/varmask.h | 2 +- include/virtkeyb.cpp | 313 ++++++++ include/virtkeyb.h | 62 ++ include/window.cpp | 2 +- ps/indice_programmi.txt | 6 + ps/pd0350_conslinereg.rep | 4 +- ps/pd0350_progart.msk | 44 ++ ps/pd0350_progart.rep | 83 +++ ps/pd0666.cpp | 21 + ps/pd0666.h | 3 + ps/pd0666100.cpp | 319 +++++++++ ps/pd0666100a.h | 6 + ps/pd0666100a.uml | 68 ++ ps/pd0666conf.ini | 4 + ps/pd0777.cpp | 21 + ps/pd0777.h | 3 + ps/pd0777100.cpp | 448 ++++++++++++ ps/pd0777100a.h | 40 ++ ps/pd0777100a.uml | 188 +++++ ps/pd0777100b.h | 7 + ps/pd0777100b.uml | 87 +++ ps/pd0777100c.h | 5 + ps/pd0777100c.uml | 52 ++ ps/pd0777conf.ini | 99 +++ ps/ps0544200.cpp | 86 ++- ps/ps0544200.ini | 39 +- sc/sc2100.cpp | 653 +++++++++++------ sc/sc2100a.uml | 11 +- sc/sc2200.cpp | 44 +- server/indexing.cpp | 275 +++++++ tc/IMPPN.v2006.1.0.doc | Bin 0 -> 1562624 bytes tc/tc0300.cpp | 145 ++++ tc/tc0300a.uml | 223 ++++++ tc/tc0700.cpp | 1422 +++++++++++++++++++++++++++++++++++++ tc/tc0700a.h | 10 + tc/tc0700a.uml | 78 ++ tc/tc0800.cpp | 201 ++++++ tc/tc0800a.h | 13 + tc/tc0800a.uml | 180 +++++ tc/tcconf.h | 20 + tc/tcmenu.men | 36 + tc/tctsi11.uml | 76 ++ tc/tctsiva.uml | 75 ++ tc/tsricl.txt | 1325 ++++++++++++++++++++++++++++++++++ tc/tstab.txt | 166 +++++ tp/tp0100.cpp | 141 +--- tp/tp0100.h | 12 +- tp/tp0100a.h | 3 + tp/tp0100a.rep | 28 - tp/tp0100a.uml | 19 +- tp/tp0101.cpp | 41 +- tp/tp0101a.ini | 4 +- tp/tp0102.cpp | 70 +- vd/Ditta-0001.zip | Bin 0 -> 163596 bytes vd/Studio_Comuni.zip | Bin 0 -> 3894 bytes vd/dopd.des | 72 ++ vd/drpd.des | 72 ++ vd/dstd.des | 72 ++ vd/dtdt.des | 72 ++ vd/dtrd.des | 72 ++ vd/f157.dir | 3 + vd/f157.trr | 28 + vd/scontr.ini | 206 ++++++ vd/scontr.msk | 742 +++++++++++++++++++ vd/turni.h | 24 + vd/v0300c.cpp | 0 vd/vd0.cpp | 33 + vd/vd0.h | 7 + vd/vd0100.cpp | 165 +++++ vd/vd0200.cpp | 111 +++ vd/vd0300.cpp | 103 +++ vd/vd0300a.uml | 498 +++++++++++++ vd/vd0400.cpp | 49 ++ vd/vd0400a.uml | 245 +++++++ vd/vd0500.cpp | 41 ++ vd/vd0500a.h | 5 + vd/vd0600.cpp | 40 ++ vd/vd0600a.h | 5 + vd/vd0700.cpp | 997 ++++++++++++++++++++++++++ vd/vd0700a.h | 21 + vd/vd0700a.uml | 157 ++++ vd/vd0700b.h | 3 + vd/vd0700b.uml | 38 + vd/vd1.cpp | 26 + vd/vd1.h | 6 + vd/vd1100.cpp | 140 ++++ vd/vd1100.h | 5 + vd/vd1100.uml | 54 ++ vd/vd1100a.rep | 135 ++++ vd/vd1200.cpp | 127 ++++ vd/vd1200.h | 9 + vd/vd1200.uml | 86 +++ vd/vd1200a.rep | 165 +++++ vd/vd1300.cpp | 109 +++ vd/vd1300.h | 9 + vd/vd1300.uml | 99 +++ vd/vd1300a.rep | 96 +++ vd/vd1600.cpp | 144 ++++ vd/vd1600.h | 9 + vd/vd1600.uml | 87 +++ vd/vd1600a.rep | 116 +++ vd/vd1700.cpp | 147 ++++ vd/vd1700.h | 5 + vd/vd1700.uml | 49 ++ vd/vd1700a.rep | 145 ++++ vd/vdconf.h | 86 +++ vd/vdlib.cpp | 473 ++++++++++++ vd/vdlib.h | 106 +++ vd/vdlib01.uml | 110 +++ vd/vdlib02.uml | 149 ++++ vd/vdlib02r.rep | 150 ++++ vd/vdmask.h | 25 + vd/vdmenu.men | 62 ++ vd/vdstcas.rep | 46 ++ vd/vdstcas.uml | 41 ++ vd/vdstfld.rep | 46 ++ vd/vdstfld.uml | 41 ++ vd/vdstopd.rep | 98 +++ vd/vdstopd.uml | 41 ++ vd/vdstrpd.rep | 46 ++ vd/vdstrpd.uml | 41 ++ vd/vdststg.rep | 46 ++ vd/vdststg.uml | 41 ++ vd/vdsttdt.rep | 58 ++ vd/vdsttdt.uml | 41 ++ vd/vdtabcom.txt | 17 + vd/vdtbcas.h | 21 + vd/vdtbcas.uml | 48 ++ vd/vdtbfld.h | 21 + vd/vdtbfld.uml | 50 ++ vd/vdtbopd.h | 28 + vd/vdtbopd.uml | 119 ++++ vd/vdtbrpd.h | 21 + vd/vdtbrpd.uml | 48 ++ vd/vdtbstg.h | 21 + vd/vdtbstg.uml | 48 ++ vd/vdtbtdt.h | 23 + vd/vdtbtdt.uml | 76 ++ xi/xi.h | 3 + xi/xi2.c | 12 +- xi/xiutils.c | 11 + 213 files changed, 19036 insertions(+), 870 deletions(-) create mode 100755 at/at9400.cpp create mode 100755 at/at9400a.uml create mode 100755 at/bastscs.uml create mode 100755 at/batbscs.h create mode 100755 at/batbscs.rpt create mode 100755 at/batbscs.uml create mode 100755 gv/gv0.cpp create mode 100755 gv/gv0.h create mode 100755 gv/gv0500.cpp create mode 100755 gv/gv0500a.h create mode 100755 gv/gv0500a.uml create mode 100755 gv/gv0500b.h create mode 100755 gv/gv0500b.uml create mode 100755 gv/gv0600.cpp create mode 100755 gv/gv0600a.h create mode 100755 gv/gv0600a.uml create mode 100755 gv/gvlib.cpp create mode 100755 gv/gvlib.h create mode 100755 include/righef24.h create mode 100755 include/virtkeyb.cpp create mode 100755 include/virtkeyb.h create mode 100755 ps/pd0350_progart.msk create mode 100755 ps/pd0350_progart.rep create mode 100755 ps/pd0666.cpp create mode 100755 ps/pd0666.h create mode 100755 ps/pd0666100.cpp create mode 100755 ps/pd0666100a.h create mode 100755 ps/pd0666100a.uml create mode 100755 ps/pd0666conf.ini create mode 100755 ps/pd0777.cpp create mode 100755 ps/pd0777.h create mode 100755 ps/pd0777100.cpp create mode 100755 ps/pd0777100a.h create mode 100755 ps/pd0777100a.uml create mode 100755 ps/pd0777100b.h create mode 100755 ps/pd0777100b.uml create mode 100755 ps/pd0777100c.h create mode 100755 ps/pd0777100c.uml create mode 100755 ps/pd0777conf.ini create mode 100755 server/indexing.cpp create mode 100755 tc/IMPPN.v2006.1.0.doc create mode 100755 tc/tc0300.cpp create mode 100755 tc/tc0300a.uml create mode 100755 tc/tc0700.cpp create mode 100755 tc/tc0700a.h create mode 100755 tc/tc0700a.uml create mode 100755 tc/tc0800.cpp create mode 100755 tc/tc0800a.h create mode 100755 tc/tc0800a.uml create mode 100755 tc/tcconf.h create mode 100755 tc/tcmenu.men create mode 100755 tc/tctsi11.uml create mode 100755 tc/tctsiva.uml create mode 100755 tc/tsricl.txt create mode 100755 tc/tstab.txt delete mode 100755 tp/tp0100a.rep create mode 100755 vd/Ditta-0001.zip create mode 100755 vd/Studio_Comuni.zip create mode 100755 vd/dopd.des create mode 100755 vd/drpd.des create mode 100755 vd/dstd.des create mode 100755 vd/dtdt.des create mode 100755 vd/dtrd.des create mode 100755 vd/f157.dir create mode 100755 vd/f157.trr create mode 100755 vd/scontr.ini create mode 100755 vd/scontr.msk create mode 100755 vd/turni.h create mode 100755 vd/v0300c.cpp create mode 100755 vd/vd0.cpp create mode 100755 vd/vd0.h create mode 100755 vd/vd0100.cpp create mode 100755 vd/vd0200.cpp create mode 100755 vd/vd0300.cpp create mode 100755 vd/vd0300a.uml create mode 100755 vd/vd0400.cpp create mode 100755 vd/vd0400a.uml create mode 100755 vd/vd0500.cpp create mode 100755 vd/vd0500a.h create mode 100755 vd/vd0600.cpp create mode 100755 vd/vd0600a.h create mode 100755 vd/vd0700.cpp create mode 100755 vd/vd0700a.h create mode 100755 vd/vd0700a.uml create mode 100755 vd/vd0700b.h create mode 100755 vd/vd0700b.uml create mode 100755 vd/vd1.cpp create mode 100755 vd/vd1.h create mode 100755 vd/vd1100.cpp create mode 100755 vd/vd1100.h create mode 100755 vd/vd1100.uml create mode 100755 vd/vd1100a.rep create mode 100755 vd/vd1200.cpp create mode 100755 vd/vd1200.h create mode 100755 vd/vd1200.uml create mode 100755 vd/vd1200a.rep create mode 100755 vd/vd1300.cpp create mode 100755 vd/vd1300.h create mode 100755 vd/vd1300.uml create mode 100755 vd/vd1300a.rep create mode 100755 vd/vd1600.cpp create mode 100755 vd/vd1600.h create mode 100755 vd/vd1600.uml create mode 100755 vd/vd1600a.rep create mode 100755 vd/vd1700.cpp create mode 100755 vd/vd1700.h create mode 100755 vd/vd1700.uml create mode 100755 vd/vd1700a.rep create mode 100755 vd/vdconf.h create mode 100755 vd/vdlib.cpp create mode 100755 vd/vdlib.h create mode 100755 vd/vdlib01.uml create mode 100755 vd/vdlib02.uml create mode 100755 vd/vdlib02r.rep create mode 100755 vd/vdmask.h create mode 100755 vd/vdmenu.men create mode 100755 vd/vdstcas.rep create mode 100755 vd/vdstcas.uml create mode 100755 vd/vdstfld.rep create mode 100755 vd/vdstfld.uml create mode 100755 vd/vdstopd.rep create mode 100755 vd/vdstopd.uml create mode 100755 vd/vdstrpd.rep create mode 100755 vd/vdstrpd.uml create mode 100755 vd/vdststg.rep create mode 100755 vd/vdststg.uml create mode 100755 vd/vdsttdt.rep create mode 100755 vd/vdsttdt.uml create mode 100755 vd/vdtabcom.txt create mode 100755 vd/vdtbcas.h create mode 100755 vd/vdtbcas.uml create mode 100755 vd/vdtbfld.h create mode 100755 vd/vdtbfld.uml create mode 100755 vd/vdtbopd.h create mode 100755 vd/vdtbopd.uml create mode 100755 vd/vdtbrpd.h create mode 100755 vd/vdtbrpd.uml create mode 100755 vd/vdtbstg.h create mode 100755 vd/vdtbstg.uml create mode 100755 vd/vdtbtdt.h create mode 100755 vd/vdtbtdt.uml 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 0000000000000000000000000000000000000000..1b1b6ad6ba7eeee2dd45a521a851e9f07b7ff579 GIT binary patch literal 1562624 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
  • j$j>d|_TS9)SXsKCbtif2zShG`OFzql{HN6n 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≥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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..e887a9946e3be8a163a915ba4ffbcb75cd8189ec GIT binary patch literal 163596 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

    ^Lc=cEDM^#|5f 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 literal 0 HcmV?d00001 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;