From 12d9315082604acf654260d4b9cc2c2c8f81ae94 Mon Sep 17 00:00:00 2001 From: alex Date: Wed, 2 May 2001 13:40:49 +0000 Subject: [PATCH] Patch level : xx.7.054 Files correlati : Ricompilazione Demo : [ ] Commento : Riportata la versione 1.7 patch 054 aga sul main trunk git-svn-id: svn://10.65.10.50/trunk@9659 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- db/db0.url | 4 +- db/db0100.cpp | 57 +- db/db0500.cpp | 104 +- db/db0500a.uml | 6 +- db/db1.url | 4 +- db/db1100.cpp | 155 ++- db/db1100a.h | 18 +- db/db1100a.uml | 48 +- db/db1300.cpp | 81 +- db/db1300a.h | 15 +- db/db1300a.uml | 33 +- db/db1300b.uml | 9 +- db/db2.url | 5 +- db/dbcv.cpp | 3 + db/dbcv.h | 1 + db/dbcv.url | 5 +- db/dbcv00.cpp | 233 ++-- db/dbcv00a.h | 1 + db/dbcv02.cpp | 342 ++++- db/dbcv02a.h | 4 + db/dbcv02a.uml | 16 +- db/dbcv03.cpp | 884 +++++++++++++ db/dbcv03a.uml | 55 + db/dbcv09.cpp | 222 +++- db/dbcv09.h | 14 +- db/dbcvlib.h | 17 + db/dblib.cpp | 80 +- db/dblib.h | 6 +- ef/dse.frm | 12 +- ef/ef0.url | 6 +- ef/ef0100c.uml | 16 +- ef/ef0101.cpp | 69 +- ef/ef0101.h | 6 +- ef/ef0300.cpp | 71 +- ef/ef0300.h | 1 + ef/ef0300a.uml | 8 +- ef/ef0300b.uml | 6 +- ef/ef0300c.uml | 16 +- ef/ef0300d.uml | 15 +- ef/ef0500.cpp | 101 +- ef/ef0600.cpp | 8 +- m770/770.url | 10 +- m770/770100.cpp | 53 +- m770/770102.cpp | 22 +- m770/770200.cpp | 51 +- m770/770200a.uml | 6 +- m770/771200b.uml | 60 +- m770/771310a.uml | 4 +- m770/771mod.url | 41 +- m770/772mod.url | 29 +- m770/773mod.url | 26 +- m770/774.url | 13 +- m770/775.url | 8 +- m770/775100a.uml | 4 +- m770/776mod.url | 29 +- m770/777.url | 4 +- m770/77cnv.url | 4 +- m770/77lib.h | 2 +- m770/77lib01.cpp | 211 ++-- m770/77sr.cpp | 4 +- m770/77srsc.frm | 10 +- m770/77srsf.frm | 10 +- m770/77srsg.frm | 10 +- m770/77srsl.frm | 4 +- m770/f39.trr | 6 +- m770/f40.trr | 2 +- m770/f41.trr | 46 +- m770/f42.trr | 4 +- m770/f62.trr | 10 +- m770/f63.trr | 10 +- m770/f64.trr | 8 +- m770/f65.trr | 8 +- m770/f89.trr | 6 +- mg/anamag.h | 2 + mg/mg0.url | 2 + mg/mg1.url | 1 + mg/mg1100.cpp | 46 +- mg/mg1100.uml | 12 +- mg/mg1200.cpp | 13 +- mg/mg1400.cpp | 4 +- mg/mg3.url | 1 + mg/mg3100a.frm | 2 +- mg/mg3300.cpp | 73 +- mg/mg3300.h | 3 + mg/mg3300.uml | 19 +- mg/mg3300a.frm | 144 +-- mg/mg3300as.frm | 479 +++++++ mg/mg3300b.frm | 67 +- mg/mg3300bs.frm | 406 ++++++ mg/mg3500.cpp | 30 +- mg/mg3500a.h | 34 + mg/mg4.url | 2 +- mg/mg4100.frm | 12 +- mg/mg4100.uml | 2 +- mg/mg4200.cpp | 336 +++-- mg/mg4200.uml | 2 +- mg/mg4200a.frm | 9 +- mg/mg4200a.h | 61 + mg/mg4200aa.frm | 8 +- mg/mg4200b.frm | 8 +- mg/mg4300.cpp | 12 +- mg/mg4300.frm | 29 +- mg/mglib02.cpp | 12 +- mg/mglib02a.cpp | 40 +- mr/f132.dir | 2 +- mr/f132.trr | 84 +- mr/mr0.url | 18 +- mr/mr0100.cpp | 55 +- mr/mr0400.h | 2 + mr/mr0400a.uml | 25 + mr/mr1.url | 4 +- mr/mr2.url | 10 +- mr/mr2100.cpp | 65 +- mr/mr2100a.h | 1 + mr/mr2100a.uml | 10 +- mr/mr2200.cpp | 51 +- mr/mr2200.h | 3 +- mr/mr2200a.h | 1 + mr/mr2200a.uml | 17 +- mr/mr2201.cpp | 1 + mr/mr2400.cpp | 14 +- mr/mrplib.cpp | 16 +- mr/mrprassi.men | 3 +- mr/mrtbfia.h | 11 + mr/mrtbfia.uml | 93 ++ or/or1.url | 20 +- pr/pr0.url | 2 +- pr/pr0700.cpp | 13 +- pr/pr0700b.h | 1 + pr/pr0700b.uml | 54 +- pr/pr1.url | 1 + pr/pr1300a.frm | 24 +- pr/pr1400.cpp | 20 +- pr/pr1400a.frm | 72 +- pr/prlib.h | 15 +- pr/prlib01.cpp | 11 +- sc/pec.frm | 367 +++--- sc/sc0.url | 1 + sc/sc0100a.uml | 3 - sc/sc0100c.uml | 20 +- sc/sc0100p.uml | 8 +- sc/sc1.url | 3 +- sc/sc2.url | 2 +- sc/sc2100.cpp | 45 +- sc/sc2102.cpp | 6 +- sc/sc2400.cpp | 2 +- sc/sc2400a.uml | 2 +- sc/sc2401.cpp | 12 +- sc/sc2500.cpp | 4 +- sc/sc3.url | 10 +- ve/f47.dir | 2 +- ve/f47.trr | 4 +- ve/listadoc.frm | 91 +- ve/ve0.url | 2 +- ve/ve0100.cpp | 113 +- ve/ve0100.h | 2 - ve/ve0100b.uml | 5 +- ve/ve0200b.uml | 24 +- ve/ve0200f.uml | 2 +- ve/ve1.url | 5 +- ve/ve1100.cpp | 9 +- ve/ve2.url | 2 +- ve/ve2100.cpp | 14 +- ve/ve2400.cpp | 117 +- ve/ve2400.h | 2 + ve/ve2400.uml | 31 +- ve/ve2400a.uml | 12 +- ve/ve2400b.uml | 10 +- ve/ve2400c.uml | 12 +- ve/ve2400d.uml | 7 +- ve/ve2400e.uml | 14 +- ve/ve3.url | 25 + ve/ve3400.cpp | 7 +- ve/ve4.url | 1 + ve/ve5.url | 2 +- ve/ve6.url | 2 +- ve/veconf.h | 3 +- ve/velib.h | 4 +- ve/velib03.cpp | 7 +- ve/velib04.cpp | 2 +- ve/velib04b.cpp | 166 ++- ve/velib05.cpp | 41 +- ve/velib06.cpp | 105 +- ve/velib06a.cpp | 45 +- ve/velib06c.cpp | 1812 +++++++++++++++++++++++++++ ve/velib4bc.cpp | 3115 ++++++++++++++++++++++++++++++++++++++++++++++ ve/vepriv.h | 2 +- ve/verig.uml | 90 +- ve/vetabcom.txt | 4 +- 189 files changed, 10325 insertions(+), 2135 deletions(-) create mode 100755 db/dbcv03.cpp create mode 100755 db/dbcv03a.uml create mode 100755 db/dbcvlib.h create mode 100755 mg/mg3300as.frm create mode 100755 mg/mg3300bs.frm create mode 100755 mg/mg3500a.h create mode 100755 mg/mg4200a.h create mode 100755 mr/mrtbfia.h create mode 100755 mr/mrtbfia.uml create mode 100755 ve/velib06c.cpp create mode 100755 ve/velib4bc.cpp diff --git a/db/db0.url b/db/db0.url index e6f03aa72..c9c3e63a5 100755 --- a/db/db0.url +++ b/db/db0.url @@ -4,8 +4,6 @@ #include - -MENU TASK_MENUBAR - SUBMENU MENU_FILE "~File" +#include diff --git a/db/db0100.cpp b/db/db0100.cpp index efb0357e8..fdea53239 100755 --- a/db/db0100.cpp +++ b/db/db0100.cpp @@ -28,8 +28,8 @@ void TLavorazione_tab::fill_sheet(TSheet_field & sheet) row=cod_linea(j); if (!row.blank()) { - row.add(raw_numpers_linea(j) ,F_LNUMPERS-101); - row.add(raw_produttiv_linea(j).string() ,F_LPRODUTTIV-101); + row.add(raw_numpers_linea(j), F_LNUMPERS-101); + row.add(raw_produttiv_linea(j).string(), F_LPRODUTTIV-101); sheet.check_row(righe); righe++; } @@ -91,8 +91,11 @@ protected: virtual bool user_create(); virtual TString& get_mask_name(TString& name) const; - virtual TMask * set_mask(TMask * _m); + + virtual void ini2sheet(TConfig& ini, TSheet_field &sheet); + virtual void sheet2ini(TSheet_field &sheet,TConfig& ini); + public: void rows2rel(const TMask& m); }; @@ -172,6 +175,54 @@ int TDistinta_tables::rewrite(const TMask& m) return err; } +void TDistinta_tables::ini2sheet(TConfig& ini, TSheet_field &sheet) +{ + if (get_tabname() == "LAV") + { + TString8 para; + for (int i = 0; ; i++) + { + para.format("%d,%d", LF_TAB, i+1); + if (ini.set_paragraph(para)) + { + TToken_string& row = sheet.row(i); + row.add(ini.get("CODLIN"), 0); + row.add(ini.get("CODIMP"), 2); + row.add(ini.get("LNUMPERS"), 3); + row.add(ini.get("LPRODUTTIV"), 4); + sheet.check_row(i); + } + else + break; + } + } +} + +void TDistinta_tables::sheet2ini(TSheet_field& sheet,TConfig& ini) +{ + if (get_tabname() == "LAV") + { + TString8 para; + FOR_EACH_SHEET_ROW(sheet, i, row) + { + para.format("%d,%d", LF_TAB, i+1); + ini.set_paragraph(para); + ini.set("CODLIN", row->get(0)); + ini.set("CODIMP", row->get(2)); + ini.set("LNUMPERS", row->get(3)); + ini.set("LPRODUTTIV", row->get(4)); + } + for ( ; ; i++) + { + para.format("%d,%d", LF_TAB, i+1); + if (ini.set_paragraph(para)) + ini.remove_all(); + else + break; + } + } +} + /////////////////////////////////////////////////////////// // Main program /////////////////////////////////////////////////////////// diff --git a/db/db0500.cpp b/db/db0500.cpp index e55b9243c..b4d8fa3ff 100755 --- a/db/db0500.cpp +++ b/db/db0500.cpp @@ -69,6 +69,10 @@ protected: virtual int write(const TMask& m); virtual int rewrite(const TMask& m); virtual bool remove(); + virtual void ini2sheet(TConfig& ini, TSheet_field &sheet); + virtual void sheet2ini(TSheet_field &sheet,TConfig& ini); + + void load_memo(TMask& m, TToken_string& memo); public: TRelation & relation() {return *_therel;} @@ -555,24 +559,25 @@ void TDistinta_mask::sheetrighe_put(TSheet_field &fld_righe, int item) } } - - void TDistinta_mask::load_um() { // ***************************** // LETTURA SHEET UNITA' DI MISURA - char tree_type=_tree.get_type(get(F_CODICE)); - TSheet_field &units= (TSheet_field &)field(F_UNITA); // prende lo sheet delle unità di misura - if (tree_type=='L') + const char tree_type=_tree.get_type(get(F_CODICE)); + + if (!app().is_transaction()) { - units.destroy(); - } - else - { - app().relation().lfile().put("CODDIST",get(F_CODICE)); - units.record()->read(*units.putkey(app().relation())); - units.autoload(app().relation()); + if (tree_type=='L') + { + units.destroy(); + } + else + { + app().relation().lfile().put("CODDIST",get(F_CODICE)); + units.record()->read(*units.putkey(app().relation())); + units.autoload(app().relation()); + } } units.disable_cell(0, units.cid2index(FU_FC)); const bool virtuale=tree_type!='A' && tree_type !='L'; @@ -1151,6 +1156,25 @@ TMask* TDistinta_app::get_mask(int mode) void TDistinta_app::init_query_mode(TMask& m) { ((TQuery_mask&)m).restart_tree(); + set_search_field(F_CODICE); +} + +void TDistinta_app::load_memo(TMask& m, TToken_string& memo) +{ + TSheet_field& params = m.sfield(F_PARAMS); + params.destroy(); + const int righe = memo.items(); + for (int i = 0; i < righe; i++) + { + TToken_string& row = params.row(i); + memo.get(i, row); + int equal = row.find('='); + if (equal > 0) + row[equal] = SAFE_PIPE_CHR; + row.insert(format(" %c",SAFE_PIPE_CHR),0); + if (_tree.is_global(row.get(1))) + row[0]='G'; + } } int TDistinta_app::read(TMask& m) @@ -1165,28 +1189,32 @@ int TDistinta_app::read(TMask& m) sheet.check_row(nrig); sheet.row(nrig).add(nrig+1, sheet.cid2index(F_SORT0)); } - + TToken_string memo(1024, '\n'); memo = _therel->curr().get("PARAMETRI"); - const int righe = memo.items(); - TSheet_field& params = m.sfield(F_PARAMS); - params.destroy(); - for (int i = 0; i < righe; i++) - { - TToken_string& row = params.row(i); - memo.get(i, row); - int equal = row.find('='); - if (equal > 0) - row[equal] = SAFE_PIPE_CHR; - row.insert(format(" %c",SAFE_PIPE_CHR),0); - if (_tree.is_global(row.get(1))) - row[0]='G'; - } + load_memo(m, memo); } return err; } +void TDistinta_app::ini2sheet(TConfig& ini, TSheet_field& s) +{ + if (s.dlg() == F_PARAMS) + { + const TFixed_string fname("PARAMETRI"); + TFieldref memof(fname, 0); + TToken_string memo(1024, '\n'); + memo = memof.read(ini, "112"); + memo.replace(SAFE_PIPE_CHR, '\n'); + load_memo(s.mask(), memo); + } + else + { + TRelation_application::ini2sheet(ini, s); + } +} + bool TDistinta_app::parms2rel(const TMask& m) { TToken_string memo(1024, '\n'); @@ -1195,7 +1223,7 @@ bool TDistinta_app::parms2rel(const TMask& m) FOR_EACH_SHEET_ROW(parms, r, row) { var = row->get(0); - const char typ = var[0]; + const char typ = var[0]; var = row->get(); if (!var.blank()) { @@ -1222,6 +1250,7 @@ int TDistinta_app::write(const TMask& m) if (err == NOERR) { TSheet_field& f = m.sfield(F_UNITA); // prende lo sheet delle unità di misura + f.record()->renum_key(UMART_CODART, m.get(F_CODICE)); err = f.record()->write(FALSE); } return err; @@ -1234,11 +1263,29 @@ int TDistinta_app::rewrite(const TMask& m) if (err == NOERR) { TSheet_field& f= m.sfield(F_UNITA); // prende lo sheet delle unità di misura + f.record()->renum_key(UMART_CODART, m.get(F_CODICE)); err = f.record()->write(TRUE); } return err; } +void TDistinta_app::sheet2ini(TSheet_field& s, TConfig& ini) +{ + if (s.dlg() == F_PARAMS) + { + parms2rel(s.mask()); + const TFixed_string fname("PARAMETRI"); + TFieldref memof(fname, LF_DIST); + TString memo = memof.read(_therel->curr()); + memo.replace('\n', SAFE_PIPE_CHR); + memof.write(ini, "112", memo); + } + else + { + TRelation_application::sheet2ini(s, ini); + } +} + bool TDistinta_app::remove() { bool ok = TRelation_application::remove(); @@ -1263,7 +1310,6 @@ bool TDistinta_app::remove() return ok; } - /////////////////////////////////////////////////////////// // db0500 gestione distinte /////////////////////////////////////////////////////////// diff --git a/db/db0500a.uml b/db/db0500a.uml index ec6001dcc..a15ed3481 100755 --- a/db/db0500a.uml +++ b/db/db0500a.uml @@ -154,7 +154,7 @@ END STRING F_VAR_IMPIANTO 5 BEGIN - FLAGS "UF" + FLAGS "U" PROMPT 2 5 "Impianto " USE IMP INPUT CODTAB F_VAR_IMPIANTO @@ -167,7 +167,7 @@ END STRING F_VAR_LINEA 5 BEGIN - FLAGS "UF" + FLAGS "U" PROMPT 22 5 "Linea " USE LNP INPUT CODTAB F_VAR_LINEA @@ -176,7 +176,7 @@ BEGIN DISPLAY "Impianto" S6 OUPUT F_VAR_LINEA CODTAB OUPUT F_VAR_IMPIANTO S6 - CHECKTYPE FORCED + CHECKTYPE SEARCH END diff --git a/db/db1.url b/db/db1.url index 093944859..88fdaa09f 100755 --- a/db/db1.url +++ b/db/db1.url @@ -3,7 +3,5 @@ #define QFIRMNAME "A.G.A. Informatica Srl" #include - -MENU TASK_MENUBAR - SUBMENU MENU_FILE "~File" +#include diff --git a/db/db1100.cpp b/db/db1100.cpp index 2779392db..6ac43c2ed 100755 --- a/db/db1100.cpp +++ b/db/db1100.cpp @@ -51,7 +51,9 @@ struct _ParmStruct _vis_art, _vis_lav, _vis_vir, _vis_gho, _fabbisogno, _no_fabbis_fin, _no_zero_ord, _val_magmb, _val_depmb, _newpage, _det_ord_for, - _separate_dist, _separate_giac; + _separate_dist, _separate_giac, + _add_orc, _add_orf, _add_prf, _add_prc, _add_acl, _add_incl, + _normal_disp; char _liv_attenzione; }; @@ -505,23 +507,36 @@ void TArticolo_giacenza_static::calc_ordinato_fornitori(_ParmStruct* p, const ch // ad ogni stampa // Toglie l'ordinato fornitori dalla disponibilita - TString16 annoes(p->_anno_es); - TRecord_array & rmag = mag(annoes); - for (int i = find_mag(annoes, codmag, livello); i > 0; - i = find_mag(annoes, codmag, livello, i)) - _disp -= rmag.row(i).get_real(MAG_ORDF); + if (p->_add_orf) + { + TString16 annoes(p->_anno_es); + TRecord_array & rmag = mag(annoes); + for (int i = find_mag(annoes, codmag, livello); i > 0; + i = find_mag(annoes, codmag, livello, i)) + _disp -= rmag.row(i).get_real(MAG_ORDF); + TEsercizi_contabili ese; + const int prev = ese.pred(atoi(annoes)); // Controllo anche l'anno precedente + if (prev > 0) + { + TString16 oldannoes; oldannoes.format("%04d", prev); + TRecord_array & rmag = mag(oldannoes); + for (int i = find_mag(oldannoes, codmag, livello); i > 0; + i = find_mag(oldannoes, codmag, livello, i)) + _disp -= rmag.row(i).get_real(MAG_ORDF); + } + } // Rimuove eventuali elementi rimasti, anche se questo metodo viene effettivamente chiamato una sola // volta per articolo. _ordinato_fornitori.destroy(); // Azzera l'array... - for (i=0; i <= p->_periods; i++) + for (int i=0; i <= p->_periods; i++) _ordinato_fornitori.add(new real); //Scorre tutte le numerazioni TString_array& a = p->_numerazioni; - for (i = a.last(); i >= 0; i--) + for (i = a.last(); i >= 0; i--) { TToken_string& t = (TToken_string&) a[i]; const int items = t.items(); @@ -535,13 +550,11 @@ void TArticolo_giacenza_static::calc_ordinato_fornitori(_ParmStruct* p, const ch doc.put(DOC_PROVV, "D"); calcola_ordinato_documento(doc); - if (::riporta_ordinato()) - { - doc.put(DOC_CODNUM, t.get(0)); - doc.put(DOC_ANNO, p->_year - 1); - doc.put(DOC_PROVV, "D"); - calcola_ordinato_documento(doc); - } + + doc.put(DOC_CODNUM, t.get(0)); + doc.put(DOC_ANNO, p->_year - 1); + doc.put(DOC_PROVV, "D"); + calcola_ordinato_documento(doc); } else // Se invece vi sono piu' tipi doc. per questa numerazione e' necessario considerare le testate doc. if (items >= 3) @@ -569,32 +582,39 @@ void TArticolo_giacenza_static::calc_ordinato_fornitori(_ParmStruct* p, const ch for (cur = 0L; cur.pos() < cur.items(); ++cur) // Per ogni documento scorre le sue righe calcola_ordinato_documento(cur.curr()); - if (::riporta_ordinato()) - { - from.zero(); - from.put(DOC_CODNUM, t.get(0)); - from.put(DOC_ANNO, p->_year - 1); - from.put(DOC_PROVV, "D"); - to = from; - cur.setregion(from, to); - for (cur = 0L; cur.pos() < cur.items(); ++cur) + from.zero(); + from.put(DOC_CODNUM, t.get(0)); + from.put(DOC_ANNO, p->_year - 1); + from.put(DOC_PROVV, "D"); + to = from; + cur.setregion(from, to); + for (cur = 0L; cur.pos() < cur.items(); ++cur) // Per ogni documento scorre le sue righe - calcola_ordinato_documento(cur.curr()); - } + calcola_ordinato_documento(cur.curr()); } } // Progressivizza gli importi - for (i=2; i <= p->_periods ; i++) + const int periods = p->_periods; + if (periods > 1) { - real& rr = (real&)_ordinato_fornitori[i]; - rr += (real&)_ordinato_fornitori[i-1]; - if (i==p->_periods) - { - real& zz = (real&)_ordinato_fornitori[0]; // Totale... - zz += rr; + for (i=2; i <= periods ; i++) + { + real& rr = (real&)_ordinato_fornitori[i]; + rr += (real&)_ordinato_fornitori[i-1]; + if (i== periods) + { + real& zz = (real&)_ordinato_fornitori[0]; // Totale... + zz += rr; + } } } + else + { + real& rr = (real&)_ordinato_fornitori[1]; + real& zz = (real&)_ordinato_fornitori[0]; // Totale... + zz += rr; + } } real& TArticolo_giacenza_static::static_disp(_ParmStruct* p, const char * codmag, const char * livello) @@ -602,7 +622,47 @@ real& TArticolo_giacenza_static::static_disp(_ParmStruct* p, const char * codmag if (!_calc) { _calc =TRUE; - _disp = disponibilita(p->_anno_es, codmag, livello); + const char * annoes = p->_anno_es; + _disp = ZERO; + + TRecord_array & rmag = mag(annoes); + for (int i = find_mag(annoes, codmag, livello); i > 0; + i = find_mag(annoes, codmag, livello, i)) + { + const TRectype & rec = rmag.row(i); + _disp += rec.get_real(MAG_GIAC); + if (p->_add_orf) + _disp += rec.get_real(MAG_ORDF); + if (p->_add_orc) + _disp -= rec.get_real(MAG_ORDC); + if (p->_add_prf) + _disp += rec.get_real(MAG_PRODFIN); + if (p->_add_prc) + _disp -= rec.get_real(MAG_PRODCOMP); + if (p->_add_acl) + _disp += rec.get_real(MAG_ACL); + if (p->_add_incl) + _disp -= rec.get_real(MAG_INCL); + } + if ((p->_add_orc || p->_add_orf) && !riporta_ordinato()) // Se l-ordinato viene riportato + { + TEsercizi_contabili ese; + const int prev = ese.pred(atoi(annoes)); // Controllo anche l'anno precedente + if (prev > 0) + { + TString16 oldannoes; oldannoes.format("%04d", prev); + const TRecord_array& oldrmag = mag(oldannoes); + for (int i = find_mag(oldannoes, codmag, livello); i > 0; + i = find_mag(oldannoes, codmag, livello, i)) + { + const TRectype& rec = oldrmag.row(i); + if (p->_add_orf) + _disp += rec.get_real(MAG_ORDF); // Sommo l'ordinato fornitori + if (p->_add_orc) + _disp -= rec.get_real(MAG_ORDC); // Sottraggo l'ordinato clienti + } + } + } _umbase = ((TRectype&)(um()[1])).get("UM"); // Calcola ordinato fornitori di questo articolo, suddividendo per periodi @@ -894,14 +954,25 @@ void TExplode_distinta_form::set_explosion_rows(TArray& exp_array) const TString& liv = is_head ? _d->liv() : re.giacenza(); // Il fabbisogno e': nr. componenti di questo articolo per residuo da produrre del padre - - if (_p->_fabbisogno) + + if (_p->_fabbisogno && _p->_explosion == scalare) r = re.last_qta() * res2produce_by_father(re); // In UM locale... else r = re.val() * res2produce_by_father(re); // In UM locale... if (r == ZERO) + { + if (_p->_fabbisogno) // Calcolo disponibilita' + { + // Compone la chiave da cercare nella cache: CODART|CODMAG|LIVELLO + // ovvio che tutti i campi debbono essre paddati alla loro massima lunghezza + // Al TArticolo_cache importa solo del CODART in ricerca... i campi seguenti vengono ignorati + // anche se nel TAssoc_array interno vengono cmq memorizzati come chiave + __key.format("%-20s|%-15s|%-5s", (const char*)re.articolo(), (const char*) liv, (const char*) codmag); + _prodorder.add(__key, ZERO, TRUE); + } continue; // Don't store in _exploded_tree if there's no need + } TRiga_esplosione2print* r2p = NULL; int pos = -1; @@ -923,7 +994,7 @@ void TExplode_distinta_form::set_explosion_rows(TArray& exp_array) r2p = new TRiga_esplosione2print(re, codmag); _exploded_tree.add(r2p,pos); } - + r2p->set_fabbisogno(r + r2p->fabbisogno()); if (_p->_fabbisogno) // Calcolo disponibilita' @@ -1067,6 +1138,7 @@ void TExplode_distinta_form::explode_and_print() _distinta.clear_globals(); _distinta.set_global("_IMPIANTO", _d->imp()); _distinta.set_global("_LINEA", _d->lin()); + _distinta.set_global( "_MAGDEP", _d->mag()); if (!_distinta.set_root(_d->cod(), _d->um(), 1.0, _d->liv())) return; @@ -1704,6 +1776,15 @@ void TEsplosione_distinta_app::main_loop() _parameters._det_ord_for = _mask->get_bool(F_DETORDFOR); _parameters._separate_dist = _mask->get_bool(F_SEPARATE_DIST); _parameters._separate_giac = _mask->get_bool(F_SEPARATE_GIAC); + _parameters._add_orc = _mask->get_bool(F_ORCLI4DISP); + _parameters._add_orf = _mask->get_bool(F_ORFOR4DISP); + _parameters._add_prf = _mask->get_bool(F_INPRF4DISP); + _parameters._add_prc = _mask->get_bool(F_INPRC4DISP); + _parameters._add_incl = _mask->get_bool(F_INCLV4DISP); + _parameters._add_acl = _mask->get_bool(F_ACLV4DISP); + _parameters._normal_disp = _parameters._add_orc && _parameters._add_orf && + _parameters._add_prf && _parameters._add_prc && + _parameters._add_acl && _parameters._add_acl; // Credo che il seguente anno esercizio sia calcolato // in modo abbastanza schifoso, visto che si e' in possesso del solo anno solare diff --git a/db/db1100a.h b/db/db1100a.h index 00acd1c75..c138ec6e4 100755 --- a/db/db1100a.h +++ b/db/db1100a.h @@ -39,14 +39,16 @@ #define F_ORFOR4DISP 137 #define F_INPRF4DISP 138 #define F_INPRC4DISP 139 -#define F_CATVEN_LIST 140 -#define F_CODLIST 141 -#define F_NOIGNORE 142 -#define F_NOZEROORD 143 -#define F_IMPIANTO 144 -#define F_DESCIMP 145 -#define F_LINEA 146 -#define F_DESCLIN 147 +#define F_INCLV4DISP 140 +#define F_ACLV4DISP 141 +#define F_CATVEN_LIST 142 +#define F_CODLIST 143 +#define F_NOIGNORE 144 +#define F_NOZEROORD 145 +#define F_IMPIANTO 146 +#define F_DESCIMP 147 +#define F_LINEA 148 +#define F_DESCLIN 149 #define F_CODDIS 101 #define F_LIV1 102 diff --git a/db/db1100a.uml b/db/db1100a.uml index 2d0ec44ee..072f034eb 100755 --- a/db/db1100a.uml +++ b/db/db1100a.uml @@ -286,19 +286,19 @@ PAGE "Disponibilita'" -1 -1 78 20 BOOLEAN F_FABBISOGNO BEGIN - PROMPT 2 2 "Calcola disponibilita'" - MESSAGE TRUE ENABLE,G_DISPONIB@|"X",F_ORCLI4DISP|"X",F_ORFOR4DISP|"X",F_INPRF4DISP|"X",F_INPRC4DISP + PROMPT 2 1 "Calcola disponibilita'" + MESSAGE TRUE ENABLE,G_DISPONIB@ MESSAGE FALSE CLEAR,G_DISPONIB@|CLEAR,6@ END -GROUPBOX DLG_NULL 50 9 +GROUPBOX DLG_NULL 50 11 BEGIN - PROMPT 2 2 "" + PROMPT 2 1 "" END LIST F_LIVATTENZ 26 BEGIN - PROMPT 3 3 "Segnala giacenza " + PROMPT 3 2 "Segnala giacenza " ITEM " |sotto zero" ITEM "S|sotto scorta minima" // ITEM "R|sotto livello di riordino" @@ -307,48 +307,60 @@ END BOOLEAN F_FABBISOGNO_FIN BEGIN - PROMPT 3 4 "Non calcolare disp. sui finiti" + PROMPT 3 3 "Non calcolare disp. sui finiti" GROUP G_DISPONIB END BOOLEAN F_NOZEROORD BEGIN - PROMPT 3 5 "Non stampare righe con fabbisogno nullo" + PROMPT 3 4 "Non stampare righe con fabbisogno nullo" GROUP G_DISPONIB FLAGS "D" END BOOLEAN F_ORCLI4DISP BEGIN - PROMPT 3 6 "Sottrai l'ordinato clienti" -// GROUP G_DISPONIB + PROMPT 3 5 "Sottrai l'ordinato clienti" + GROUP G_DISPONIB FLAGS "D" END BOOLEAN F_ORFOR4DISP BEGIN - PROMPT 3 7 "Aggiungi l'ordinato fornitori" -// GROUP G_DISPONIB + PROMPT 3 6 "Aggiungi l'ordinato fornitori" FLAGS "D" END BOOLEAN F_INPRF4DISP BEGIN - PROMPT 3 8 "Aggiungi i finiti in produzione" -// GROUP G_DISPONIB + PROMPT 3 7 "Aggiungi i finiti in produzione" FLAGS "D" END BOOLEAN F_INPRC4DISP BEGIN - PROMPT 3 9 "Sottrai i componenti in produzione" -// GROUP G_DISPONIB + PROMPT 3 8 "Sottrai i componenti in produzione" + GROUP G_DISPONIB + FLAGS "D" +END + +BOOLEAN F_ACLV4DISP +BEGIN + PROMPT 3 9 "Aggiungi i componenti a conto lavorazione" + GROUP G_DISPONIB + FLAGS "D" +END + +BOOLEAN F_INCLV4DISP +BEGIN + PROMPT 3 10 "Sottrai i componenti in conto lavorazione" + GROUP G_DISPONIB FLAGS "D" END LISTBOX F_VALORIZZAZIONE 32 BEGIN - PROMPT 3 11 "" + PROMPT 3 12 "" ITEM "0|Non valorizzare" MESSAGE HIDE,G_LISTINO@ ITEM "1|Valorizza Ultimo costo" @@ -375,7 +387,7 @@ END STRING F_CATVEN_LIST 2 BEGIN - PROMPT 3 12 "Cat.vendita " + PROMPT 57 12 "Cat.vendita " USE CVE INPUT CODTAB F_CATVEN_LIST DISPLAY "Codice" CODTAB @@ -389,7 +401,7 @@ END STRING F_CODLIST 3 BEGIN - PROMPT 25 12 "Cod.listino " + PROMPT 39 12 "Cod.listino " USE LF_CONDV SELECT TIPO=="L" INPUT TIPO "L" INPUT CATVEN F_CATVEN_LIST diff --git a/db/db1300.cpp b/db/db1300.cpp index f42448fef..fea93675a 100755 --- a/db/db1300.cpp +++ b/db/db1300.cpp @@ -1,5 +1,8 @@ #include +#include +#include #include +#include #include #include #include @@ -22,7 +25,7 @@ protected: virtual const TRectype& find_head(const TCodice_articolo& art) const; virtual const TRectype* find_child(const TCodice_articolo& art, int child) const; -public: +public: bool add_head(const TCodice_articolo& art); bool add_child(const TRectype& rec); @@ -32,6 +35,8 @@ public: virtual ~TXmas_tree(); }; +HIDDEN bool _ignore_zero = TRUE; + const TRectype& TXmas_tree::find_head(const TCodice_articolo& art) const { const TRectype& rec = _cache_dist->get(art); @@ -73,7 +78,7 @@ void TXmas_tree::add_branch(TDistinta_tree& dt) while (dt.has_father()) { const real qta = dt.last_qta(); - if (qta.is_zero()) + if (::_ignore_zero && qta.is_zero()) break; // Inutile proseguire TCodice_um um; dt.curr_um(um); TCodice_articolo art; dt.curr_code(art); @@ -114,7 +119,7 @@ void TXmas_tree::add_branch(TDistinta_tree& dt) } TXmas_tree::TXmas_tree() -{ +{ _dist = new TIsamtempfile(LF_DIST, NULL, TRUE, TRUE); _cache_dist = new TRecord_cache(_dist); _cache_dist->test_file_changes(TRUE); @@ -194,11 +199,69 @@ class TDisplay_mask : public TAutomask protected: virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + void print_tree(TXmas_tree& tree); public: TDisplay_mask(TAssoc_array& xmas); virtual ~TDisplay_mask() { } -}; +}; + +static bool print_node(TTree& t, void* p, word flags) +{ + TXmas_tree& tree = (TXmas_tree&)t; + TBit_array& righette = *(TBit_array*)p; + const int depth = tree.curr_depth(); + const int tab = (depth-1)*3; + + TString descr; + tree.get_description(descr); + + TPrintrow row; + if (tab >= 0) + row.put("+--", tab); + row.put(descr); + for (int d = 1; d < depth; d++) + if (righette[d]) row.put("!", (d-1)*3); + printer().print(row); + + righette.set(depth, tree.has_rbrother()); + + return FALSE; +} + +void TDisplay_mask::print_tree(TXmas_tree& tree) +{ + TPrinter& p = printer(); + p.resetheader(); + p.resetfooter(); + + TCodice_articolo art; + TString descr; + tree.goto_root(); + tree.curr_code(art); + tree.describe(art, descr); + + TPrintrow header; + header.put("@bSTAMPA IMPLOSIONE "); + header.put(art); + header.put(" - "); + header.put(descr); + + p.setheaderline(0, header); + p.setheaderline(1, NULL); + + TPrintrow footer; + footer.put("Pag.@#", 36); + p.setfooterline(0, NULL); + p.setfooterline(1, footer); + p.setfooterline(2, NULL); + + p.open(); + TBit_array righette; + tree.scan_depth_first(print_node, &righette); + p.formfeed(); + p.close(); +} bool TDisplay_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) { @@ -259,6 +322,15 @@ bool TDisplay_mask::on_field_event(TOperable_field& o, TField_event e, long joll } } break; + case DLG_PRINT: + if (e == fe_button) + { + TXmas_tree* t = (TXmas_tree*)tfield(F_TREE).tree(); + if (t) + print_tree(*t); + return FALSE; // Non chiudere la maschera! + } + break; default: break; } @@ -656,6 +728,7 @@ void TImplosion_mask::implode() { _xmas.destroy(); + _ignore_zero = !get_bool(F_DISPLAY_ZERO); if (get_bool(F_FASTIMPLODE)) { if (get_bool(F_ONLYONE)) diff --git a/db/db1300a.h b/db/db1300a.h index 7cc2d3fd9..27fb0b2e7 100755 --- a/db/db1300a.h +++ b/db/db1300a.h @@ -18,11 +18,12 @@ #define F_MAGAZZINO 103 #define F_DEPOSITO 104 -#define F_USECATMER 220 -#define F_DA_CATMER 221 -#define F_A_CATMER 222 -#define F_DA_ARTICOLO 225 -#define F_AD_ARTICOLO 226 -#define F_FASTIMPLODE 227 -#define F_ONLYONE 228 +#define F_USECATMER 220 +#define F_DA_CATMER 221 +#define F_A_CATMER 222 +#define F_DA_ARTICOLO 225 +#define F_AD_ARTICOLO 226 +#define F_FASTIMPLODE 227 +#define F_ONLYONE 228 +#define F_DISPLAY_ZERO 229 diff --git a/db/db1300a.uml b/db/db1300a.uml index 3139470fc..7540b9e6f 100755 --- a/db/db1300a.uml +++ b/db/db1300a.uml @@ -38,7 +38,7 @@ BEGIN PROMPT 1 8 "@bVariabili d'ambiente" END -SPREADSHEET F_VARS 78 8 +SPREADSHEET F_VARS 78 7 BEGIN PROMPT 1 9 "" ITEM "Impianto" @@ -51,21 +51,38 @@ BEGIN ITEM "Liv. 4@6" END -GROUPBOX DLG_NULL 78 4 +GROUPBOX DLG_NULL 78 6 BEGIN - PROMPT 1 17 "@bProdotti Finiti" + PROMPT 1 16 "@bProdotti Finiti" +END + +BOOLEAN F_FASTIMPLODE +BEGIN + PROMPT 2 17 "Implosione rapida (senza articoli virtuali)" + MESSAGE FALSE HIDE,F_ONLYONE + MESSAGE TRUE SHOW,F_ONLYONE +END + +BOOLEAN F_ONLYONE +BEGIN + PROMPT 50 17 "Solo primo livello" +END + +BOOLEAN F_DISPLAY_ZERO +BEGIN + PROMPT 2 18 "Visualizza le quantitá a zero" END BOOLEAN F_USECATMER BEGIN - PROMPT 2 18 "Per categoria merceologica" + PROMPT 2 19 "Per categoria merceologica" MESSAGE FALSE HIDE,F_DA_CATMER|HIDE,F_A_CATMER MESSAGE TRUE SHOW,F_DA_CATMER|SHOW,F_A_CATMER END STRING F_DA_CATMER 5 BEGIN - PROMPT 42 18 "Da " + PROMPT 42 19 "Da " FLAG "U" USE GMC INPUT CODTAB F_DA_CATMER @@ -77,7 +94,7 @@ END STRING F_A_CATMER 5 BEGIN - PROMPT 58 18 "A " + PROMPT 58 19 "A " FLAG "U" COPY USE F_DA_CATMER INPUT CODTAB F_A_CATMER @@ -88,7 +105,7 @@ END STRING F_DA_ARTICOLO 20 BEGIN - PROMPT 2 19 "Dal " + PROMPT 2 20 "Dal " USE LF_ANAMAG INPUT CODART F_DA_ARTICOLO DISPLAY "Codice@20" CODART @@ -101,7 +118,7 @@ END STRING F_AD_ARTICOLO 20 BEGIN - PROMPT 42 19 "Al " + PROMPT 42 20 "Al " COPY USE F_DA_ARTICOLO INPUT CODART F_AD_ARTICOLO COPY DISPLAY F_DA_ARTICOLO diff --git a/db/db1300b.uml b/db/db1300b.uml index 75d5e8626..e0f0721ee 100755 --- a/db/db1300b.uml +++ b/db/db1300b.uml @@ -4,12 +4,17 @@ TOOLBAR "" 0 -3 0 3 BUTTON F_EXPLODE 10 2 BEGIN - PROMPT -12 -11 "~Lista" + PROMPT -13 -11 "~Lista" +END + +BUTTON DLG_PRINT 10 2 +BEGIN + PROMPT -23 -11 "~Stampa" END BUTTON DLG_QUIT 10 2 BEGIN - PROMPT -22 -11 "" + PROMPT -33 -11 "" END ENDPAGE diff --git a/db/db2.url b/db/db2.url index bcd4d9824..88fdaa09f 100755 --- a/db/db2.url +++ b/db/db2.url @@ -3,8 +3,5 @@ #define QFIRMNAME "A.G.A. Informatica Srl" #include - - -MENU TASK_MENUBAR - SUBMENU MENU_FILE "~File" +#include diff --git a/db/dbcv.cpp b/db/dbcv.cpp index 4cfb31e42..04c116092 100755 --- a/db/dbcv.cpp +++ b/db/dbcv.cpp @@ -11,6 +11,9 @@ int main(int argc, char** argv) dbcv00(argc, argv); break; case 1: dbcv01(argc, argv); break; + case 3: + dbcv03(argc, argv); break; + case 2: default: dbcv02(argc, argv); break; } diff --git a/db/dbcv.h b/db/dbcv.h index 305d35167..373d24b09 100755 --- a/db/dbcv.h +++ b/db/dbcv.h @@ -4,5 +4,6 @@ int dbcv00(int argc, char* argv[]); int dbcv01(int argc, char* argv[]); int dbcv02(int argc, char* argv[]); +int dbcv03(int argc, char* argv[]); #endif diff --git a/db/dbcv.url b/db/dbcv.url index 86c291703..126138917 100755 --- a/db/dbcv.url +++ b/db/dbcv.url @@ -3,9 +3,6 @@ #define QFIRMNAME "A.G.A. Informatica Srl" #include - - -MENU TASK_MENUBAR - SUBMENU MENU_FILE "~File" +#include diff --git a/db/dbcv00.cpp b/db/dbcv00.cpp index 76f588e10..caddc4560 100755 --- a/db/dbcv00.cpp +++ b/db/dbcv00.cpp @@ -8,18 +8,21 @@ #include #include "..\mg\anamag.h" #include "..\mg\mag.h" +#include "..\mg\mglib.h" #include "..\include\doc.h" #include "..\include\rdoc.h" #include "..\ve\velib.h" typedef void (*SET_DOC_FUN)(TImport_file & import,TConfig &trans); -typedef int (*SET_BODYDOC_FUN)(TImport_file & import,TConfig &trans); +typedef int (*SET_BODYDOC_FUN)(TImport_file & import,TConfig &trans, const bool dotrans); typedef const char *(*TIPOCF_FUN)(TImport_file & import); typedef bool (*FILTER_FUN)(TImport_file & import); +typedef bool (*GROUPBRK_FUN)(TImport_file & import); static TExternisamfile *_ithcheck=NULL; static bool _check=TRUE; +#include "dbcvlib.h" class TImporta_mask : public TAutomask { @@ -44,13 +47,14 @@ private: bool read_is_dist(const char *item_code); bool is_ghost(const char *item_code); const char * read_first_um(const char *item_code); + bool creadocs(const char * msg, long firm, TImport_file & imp_file, const char *FieldNumDoc, const char *FieldClifor, const char *FieldDataDoc,const char *FieldGroup1, const char *FieldGroup2, const char *FieldGroup3, - SET_DOC_FUN set_header, SET_BODYDOC_FUN set_body, FILTER_FUN filter , + SET_DOC_FUN set_header, SET_BODYDOC_FUN set_body, FILTER_FUN filter ,GROUPBRK_FUN grp, TIPOCF_FUN tipocf, bool do_ve0=TRUE); - void clear_docs(long firm, const char * num, const TDate *fromdate=NULL, const TDate *todate=NULL); + void clear_docs(long firm, const char * num, const TDate *fromdate=NULL, const TDate *todate=NULL, const long fromnum= 0,const long tonum=-1 ); void change_docs_status(const char * num, const TDate *fromdate, const TDate *todate, int fromstatus, int tostatus); void newums(); @@ -288,7 +292,7 @@ bool TImporta_BPCS ::importa_boms(TMask &m) } } // importa solo gli impianti SEgrate e TrieSte - if (!skip && metodo == 99 && (impianto=="SE" || impianto=="TS" )) + if (!skip && (impianto=="SE" || impianto=="TS" ) /* && metodo == 99 */) { main_imp=impianto; do { @@ -524,17 +528,17 @@ bool TImporta_BPCS ::importa_arts(TMask & m, const bool erase, const bool solo _anamag->put( ANAMAG_CODART,item_code); _anamag->put( ANAMAG_DESCR,items.get("IDESC")); _anamag->put( ANAMAG_DESCRAGG,items.get("IDSCE")); - _anamag->put( ANAMAG_CODFORN, items.get("IVEND")); + _anamag->put( ANAMAG_CODFORN, items.get_long("IVEND")); _anamag->put( ANAMAG_UMP, "KG"); - _anamag->put( ANAMAG_PESO, items.get("IWGHT")); + _anamag->put( ANAMAG_PESO, items.get_real("IWGHT")); // riordino _anamag->put( ANAMAG_RIORDINO , "F"); //_anamag->put( ANAMAG_RIORDINO , items.get("IMRP")=="M" ? "F" : "P" ); - _anamag->put( ANAMAG_GIORNIRIOR, items.get("ILEAD")); - _anamag->put( ANAMAG_LOTTORIOR, items.get("ILOTS")); - _anamag->put( ANAMAG_LOTTOIRIOR, items.get("IIOQ")); + _anamag->put( ANAMAG_GIORNIRIOR, items.get_long("ILEAD")); + _anamag->put( ANAMAG_LOTTORIOR, items.get_real("ILOTS")); + _anamag->put( ANAMAG_LOTTOIRIOR, items.get_real("IIOQ")); // - _anamag->put( ANAMAG_PPCONF , items.get("IFII")); - _anamag->put( ANAMAG_PPCOLLO , items.get("IFII")); + _anamag->put( ANAMAG_PPCONF , items.get_long("IFII")); + _anamag->put( ANAMAG_PPCOLLO , items.get_long("IFII")); TString16 gmc=items.get("IITYP"); switch (gmc[0]) { @@ -564,8 +568,8 @@ bool TImporta_BPCS ::importa_arts(TMask & m, const bool erase, const bool solo } } _anamag->put( ANAMAG_GRMERC,gmc); - _anamag->put( ANAMAG_COSTSTD, items.get("ISCST")); - _anamag->put( ANAMAG_ULTCOS1, items.get("IACST")); + _anamag->put( ANAMAG_COSTSTD, items.get_real("ISCST")); + _anamag->put( ANAMAG_ULTCOS1, items.get_real("IACST")); tmp=items.get("TAXC1"); if (tmp.left(3)=="IVA") tmp=tmp.sub(3); @@ -573,16 +577,16 @@ bool TImporta_BPCS ::importa_arts(TMask & m, const bool erase, const bool solo if (items_ext.get_codice("MSITE")==items.get_codice("IPROD")) { _anamag->put( ANAMAG_CLASSDOG , check_clasdog(items_ext.get_long("MSTDO"))); - _anamag->put( ANAMAG_USER1 , items_ext.get("MSIDR"));// idrati - _anamag->put( ANAMAG_USER2 , items_ext.get("MSANI"));//anidri + _anamag->put( ANAMAG_USER1 , items_ext.get_real("MSIDR"));// idrati + _anamag->put( ANAMAG_USER2 , items_ext.get_real("MSANI"));//anidri _anamag->put( ANAMAG_USER3 , items_ext.get("MSTAL"));//alcool // dimensioni - _anamag->put( ANAMAG_USER4, items_ext.get("MSPLU")); - _anamag->put( ANAMAG_USER5, items_ext.get("MSPAL")); - _anamag->put( ANAMAG_USER6, items_ext.get("MSPPR")); + _anamag->put( ANAMAG_USER4, items_ext.get_long("MSSLU")); + _anamag->put( ANAMAG_USER5, items_ext.get_long("MSSAL")); + _anamag->put( ANAMAG_USER6, items_ext.get_long("MSCPR")); // composizione pallets - _anamag->put( ANAMAG_USER7, items_ext.get("MSCST")); // casse per strato - _anamag->put( ANAMAG_USER8, items_ext.get("MSSTP")); // strati per pallet + _anamag->put( ANAMAG_USER7, items_ext.get_long("MSCST")); // casse per strato + _anamag->put( ANAMAG_USER8, items_ext.get_long("MSSTP")); // strati per pallet } force_write(*_anamag); real smin(items.get("IMIN")); @@ -795,7 +799,7 @@ void TImporta_BPCS ::change_docs_status(const char * num, const TDate *fromdate, TString codnum(num); TLocalisamfile doc(LF_DOC); TDocumento doc_record; - TIndwin info(80,"Cambio stato documenti ",TRUE,FALSE); + TIndwin info(80,"Cambio stato documenti ",TRUE,FALSE); for (int anno=1998; anno<=2000; anno++) { @@ -808,7 +812,6 @@ void TImporta_BPCS ::change_docs_status(const char * num, const TDate *fromdate, doc.get_int(DOC_ANNO) == anno && (doc.get("CODNUM")==codnum || codnum.blank())) { - info.set_text(format("Cambio stato %s n. %ld", num, doc.get_long(DOC_NDOC))); if (info.iscancelled()) return; @@ -818,6 +821,7 @@ void TImporta_BPCS ::change_docs_status(const char * num, const TDate *fromdate, if (!todate || todate->empty() || doc.get_date("DATADOC")<=*todate) if (docstatus == fromstatus) { + info.set_text(format("Cambio stato %s n. %ld", num, doc.get_long(DOC_NDOC))); doc_record = doc.curr(); doc_record.read(_isequal, _lock); doc_record.put(DOC_STATO, tostatus); @@ -828,7 +832,7 @@ void TImporta_BPCS ::change_docs_status(const char * num, const TDate *fromdate, } } -void TImporta_BPCS::clear_docs(long firm, const char * num, const TDate *fromdate, const TDate *todate) +void TImporta_BPCS::clear_docs(long firm, const char * num, const TDate *fromdate, const TDate *todate, const long fromnum,const long tonum ) { TConfig *trans=NULL; long ntransac=0; @@ -839,7 +843,7 @@ void TImporta_BPCS::clear_docs(long firm, const char * num, const TDate *fromdat TString codnum(num); TLocalisamfile doc(LF_DOC); TLocalisamfile rdoc(LF_RIGHEDOC); - for (int anno=1998; anno<=1999; anno++) + for (int anno=1998; anno<=2002; anno++) { TDate docdate(doc.get_date("DATADOC")); doc.put(DOC_PROVV,"D"); @@ -852,6 +856,8 @@ void TImporta_BPCS::clear_docs(long firm, const char * num, const TDate *fromdat { if (!fromdate || fromdate->empty() || doc.get_date("DATADOC")>=*fromdate) if (!todate || todate->empty() || doc.get_date("DATADOC")<=*todate) + if (fromnum<=0 || doc.get_long(DOC_NDOC)>=fromnum ) + if (tonum<=0 || doc.get_long(DOC_NDOC)<=tonum ) { ntransac++; if (ntransac==nblock*100) @@ -888,12 +894,14 @@ void TImporta_BPCS::clear_docs(long firm, const char * num, const TDate *fromdat } } + bool TImporta_BPCS::creadocs(const char * msg, long firm, // ditta TImport_file & imp_file, const char *FieldNumDoc, const char *FieldClifor, const char *FieldDataDoc, const char *FieldGroup1, const char *FieldGroup2, const char *FieldGroup3, - SET_DOC_FUN set_header, SET_BODYDOC_FUN set_body, FILTER_FUN filter , TIPOCF_FUN tipocf, + SET_DOC_FUN set_header, SET_BODYDOC_FUN set_body, FILTER_FUN filter , + GROUPBRK_FUN grpfun, TIPOCF_FUN tipocf, bool do_ve0) { @@ -902,7 +910,13 @@ bool TImporta_BPCS::creadocs(const char * msg, int nblock=1; long ntransac=0; int nrigadoc=0; - + long starting_ndoc=0; + // autonumerazione a partire da ... + if (FieldNumDoc && *FieldNumDoc== '*' && *(FieldNumDoc+1)== '*' ) + { + starting_ndoc = atol(FieldNumDoc+2); + FieldNumDoc = NULL; + } // rimuove le transazioni delete_files("ND_*.ini"); @@ -924,6 +938,8 @@ bool TImporta_BPCS::creadocs(const char * msg, if (filter(imp_file)) { long new_ndoc =FieldNumDoc ? imp_file.get_long(FieldNumDoc) : last_ndoc; + if (new_ndoc <= 0 && starting_ndoc) + new_ndoc = starting_ndoc++ ; long new_clifor=FieldClifor ? imp_file.get_long(FieldClifor) : last_clifor; if (new_clifor==0L && FieldClifor) new_clifor=9999; // cliente generico @@ -931,8 +947,8 @@ bool TImporta_BPCS::creadocs(const char * msg, TString new_group1=FieldGroup1 ? imp_file.get(FieldGroup1) : last_group1; TString new_group2=FieldGroup2 ? imp_file.get(FieldGroup2) : last_group2; TString new_group3=FieldGroup3 ? imp_file.get(FieldGroup3) : last_group3; - if (nrigadoc>99 || (last_ndoc != new_ndoc) || (last_date != new_date ) || (last_clifor != new_clifor )|| - (last_group1 != new_group1 )|| (last_group2 != new_group2 )|| (last_group3 != new_group3 )) + if (nrigadoc>99 || (grpfun && grpfun(imp_file)) || (last_ndoc != new_ndoc) || (last_date != new_date ) || (last_clifor != new_clifor )|| + (last_group1 != new_group1 )|| (last_group2 != new_group2 )|| (last_group3 != new_group3 )) { if (ntransac==nblock*100) { @@ -962,6 +978,8 @@ bool TImporta_BPCS::creadocs(const char * msg, trans->set(DOC_TIPOCF, tipocf(imp_file)); if (new_clifor>0L) { + if (tipocf(imp_file) == "F") + new_clifor = trascode_for(new_clifor); trans->set(DOC_CODCF,new_clifor); // gestione condizione di pagamento @@ -973,11 +991,12 @@ bool TImporta_BPCS::creadocs(const char * msg, trans->set(DOC_PROVV,"D"); set_header(imp_file, *trans); nrigadoc=0; - ntransac++; + last_ndoc=-1L; + ntransac++; } // righe trans->set_paragraph(format("%d,%d",LF_RIGHEDOC, nrigadoc+1)); - nrigadoc += set_body(imp_file, *trans); + nrigadoc += set_body(imp_file, *trans,do_ve0); } imp_file.next(); } @@ -988,10 +1007,14 @@ bool TImporta_BPCS::creadocs(const char * msg, // genera i documenti if (do_ve0) { + + TExternal_app *_gestart=NULL; TString cmd("ve0.exe -1 -i"); cmd << format("ND_%03d*.INI",nblock-1) ; - TExternal_app gestdoc((const char *)cmd); - gestdoc.run(); + if (_gestart==NULL) + _gestart = new TExternal_app((const char *)cmd); + while (_gestart->run()!=0 && yesno_box("Ritento l'esecuzione di ve0.exe ?")) + ; } nblock++; } @@ -1015,7 +1038,7 @@ void set_head_F_ordcli(TImport_file & import, TConfig &trans) round_date(dc,28,TRUE); trans.set(DOC_DATACONS, dc);// stessa data del doc } -int set_body_F_ordcli(TImport_file &import, TConfig &trans) +int set_body_F_ordcli(TImport_file &import, TConfig &trans, const bool dotrans) { TToken_string tmp; trans.set(RDOC_TIPORIGA,"01"); @@ -1025,7 +1048,7 @@ int set_body_F_ordcli(TImport_file &import, TConfig &trans) tmp.add("1"); trans.set(RDOC_PREZZO,cache().get(LF_UMART,tmp).get("PREZZO")); trans.set(RDOC_UMQTA,cache().get(LF_UMART,tmp).get("UM")); - trans.set(RDOC_QTA,import.get_real("FQTY")); + trans.set(RDOC_QTA,import.get("FQTY")); // gia' suddivisa su doc : trans.set(RDOC_DATACONS, import.get_date("FDATE")); tmp=import.get("FPFAC"); tmp << 1; @@ -1052,7 +1075,7 @@ void set_head_R_ordcli(TImport_file & import, TConfig &trans) round_date(dc,28,TRUE); trans.set(DOC_DATACONS, dc);// stessa data del doc } -int set_body_R_ordcli(TImport_file &import, TConfig &trans) +int set_body_R_ordcli(TImport_file &import, TConfig &trans, const bool dotrans) { TToken_string tmp; trans.set(RDOC_TIPORIGA,"01"); @@ -1062,8 +1085,8 @@ int set_body_R_ordcli(TImport_file &import, TConfig &trans) tmp.add("1"); trans.set(RDOC_PREZZO,cache().get(LF_UMART,tmp).get("PREZZO")); trans.set(RDOC_UMQTA,cache().get(LF_UMART,tmp).get("UM")); - trans.set(RDOC_QTA,import.get_real("SQREQ")); - trans.set(RDOC_QTAEVASA,import.get_real("SQFIN")); + trans.set(RDOC_QTA,import.get("SQREQ")); + trans.set(RDOC_QTAEVASA,import.get("SQFIN")); tmp=import.get("SOFAC"); tmp << 1; @@ -1081,7 +1104,7 @@ bool filter_R_ordcli(TImport_file & import) return ok; } -// ordini di produzione +// ordini di produzione firm planned void set_head_F_ordprod(TImport_file & import, TConfig &trans) { trans.set(DOC_ANNO,import.get_date("FRDTE").year()); @@ -1093,15 +1116,15 @@ void set_head_F_ordprod(TImport_file & import, TConfig &trans) dc = rdt; if (dc < today) - if (1 || yesno_box("Data ordine di produzione per l'articolo %s inferiore a quella attuale: posticipo ?",(const char *) import.get("FPROD"))) + if (0 || yesno_box("Data ordine di produzione per l'articolo %s inferiore a quella attuale: posticipo a oggi?",(const char *) import.get("FPROD"))) dc = today; - round_date(dc,28,TRUE); + //round_date(dc,28,TRUE); TDate dd(trans.get(DOC_DATADOC)); if (dc < dd ) trans.set(DOC_DATADOC, dc); trans.set(DOC_DATACONS, dc); } -int set_body_F_ordprod(TImport_file &import, TConfig &trans) +int set_body_F_ordprod(TImport_file &import, TConfig &trans, const bool dotrans) { TToken_string tmp,tmp2; trans.set(RDOC_TIPORIGA,"01"); @@ -1116,7 +1139,7 @@ int set_body_F_ordprod(TImport_file &import, TConfig &trans) codimp2codmagdep(tmp, atoi(import.get("FPBOMM")), tmp2); trans.set(RDOC_IMPIANTO,tmp); trans.set(RDOC_CODMAG,tmp2); - trans.set(RDOC_QTA,import.get_real("FQTY")); + trans.set(RDOC_QTA,import.get("FQTY")); trans.set(RDOC_QTAEVASA,"0"); return 1; } @@ -1142,20 +1165,21 @@ void set_head_R_ordprod(TImport_file & import, TConfig &trans) trans.set(DOC_ANNO,import.get_date("SRDTE").year()); trans.set("CODNUM",(import.get("SOFAC")=="SE") ? "MSP": "TSMP"); trans.set("TIPODOC","ORP"); - TDate today(TODAY),dc(import.get_date("SDDTE")); - TDate rdt(import.get_date("SRSDT")); + TDate today(TODAY), + dc(import.get_date("SDDTE")); // due date : data di consegna + TDate rdt(import.get_date("SRSDT")); // reschedule date if (rdt.ok() && rdt != 99999999L && rdt > dc) dc = rdt; if (dc < today) - if (1 || yesno_box("Data ordine di produzione %ld per l'articolo %s inferiore a quella attuale: posticipo ?",import.get_long("SORD"),(const char *) import.get("SPROD"))) + if (0 || yesno_box("Data ordine di produzione %ld per l'articolo %s inferiore a quella attuale: posticipo a oggi?",import.get_long("SORD"),(const char *) import.get("SPROD"))) dc = today; - round_date(dc,28,TRUE); - TDate dd(trans.get(DOC_DATADOC)); + //round_date(dc,28,TRUE); + TDate dd(trans.get(DOC_DATADOC)); // data documento if (dc < dd ) trans.set(DOC_DATADOC, dc); trans.set(DOC_DATACONS, dc); } -int set_body_R_ordprod(TImport_file &import, TConfig &trans) +int set_body_R_ordprod(TImport_file &import, TConfig &trans, const bool dotrans) { TToken_string tmp,tmp2; trans.set(RDOC_TIPORIGA,"01"); @@ -1186,8 +1210,8 @@ int set_body_R_ordprod(TImport_file &import, TConfig &trans) } real totale = import.get_real("SQREQ"); real evasa = import.get_real("SQFIN"); - trans.set(RDOC_QTA,totale); - trans.set(RDOC_QTAEVASA,evasa); + trans.set(RDOC_QTA,totale.string()); + trans.set(RDOC_QTAEVASA,evasa.string()); add_stdlabors(import.get_codice("SPROD"), import.get_long("SWRKC"), int(import.get_long("SOBOMM"))); return 1; } @@ -1232,12 +1256,12 @@ void set_head_ordacq(TImport_file & import, TConfig &trans) { real cambio=import.get_real("PEXRT"); cambio_fisso(codval,cambio); - trans.set(DOC_CAMBIO,cambio); + trans.set(DOC_CAMBIO,cambio.string()); trans.set(DOC_CODVAL,codval); } } -int set_body_ordacq(TImport_file &import, TConfig &trans) +int set_body_ordacq(TImport_file &import, TConfig &trans, const bool dotrans) { TToken_string tmp,tmp2; trans.set(RDOC_TIPORIGA,"01"); @@ -1256,7 +1280,7 @@ int set_body_ordacq(TImport_file &import, TConfig &trans) trans.set(RDOC_QTAEVASA,import.get("PQREC")); // gestione codice IVA tmp = "F"; - tmp.add(import.get("TVEND")); + tmp.add(import.get("PVEND")); TString8 codiva(cache().get(LF_CFVEN,tmp).get("ASSFIS")); if (codiva.blank()) codiva = cache().get(LF_ANAMAG,tmp).get(ANAMAG_CODIVA); @@ -1410,23 +1434,38 @@ void set_head_bolacq(TImport_file & import, TConfig &trans) trans.set(DOC_CAUSMAG,causmag); trans.set(DOC_NOTE,descrmov); trans.set(DOC_NDOC,numdoc); + + codcli = trascode_for(codcli); + trans.set(DOC_CODCF,codcli == 0L ? "" : format("%ld",codcli)); trans.set(DOC_ANNO,import.get_date("TTDTE").year()); // riferimenti - trans.set(DOC_DOC1,external_refnum(import)); - trans.set(DOC_NUMDOCRIF,import.get("TREF")); - trans.set(DOC_DATADOCRIF,import.get_date("TSDTE")); + trans.set(DOC_DOC1,import.get("TREF")); + trans.set(DOC_NUMDOCRIF,external_refnum(import)); + trans.set(DOC_DATADOCRIF,external_refdate(import)); TString codval = converti_codval(import.get("THCURR")); if (!codval.empty()) { real cambio=import.get_real("THTEXR"); cambio_fisso(codval,cambio); - trans.set(DOC_CAMBIO,cambio); + trans.set(DOC_CAMBIO,cambio.string()); trans.set(DOC_CODVAL,codval); } } -int set_body_bolacq(TImport_file &import, TConfig &trans) +bool set_group_movmag(TImport_file & import) +{ + static TString _prev; + TString newstr = external_refnum(import); + if (_prev != newstr) + { + _prev = newstr; + return TRUE; + } + return FALSE; +} + +int set_body_bolacq(TImport_file &import, TConfig &trans, const bool dotrans) { int extrarow=0; static long _last_ord = -1; @@ -1519,6 +1558,7 @@ int set_body_bolacq(TImport_file &import, TConfig &trans) } trans.set(RDOC_CAUSMAG,causmag); trans.set(RDOC_QTA, qta.string()); + trans.set(RDOC_QTAEVASA, "0"); real price = import.get_real("TPRIC"); if (price.is_zero()) { @@ -1534,7 +1574,7 @@ int set_body_bolacq(TImport_file &import, TConfig &trans) } trans.set(RDOC_PREZZO, price.string()); - if (_ithcheck) + if (_ithcheck && dotrans) { _ithcheck->put("TPROD",import.get("TPROD")); _ithcheck->put("TSEQ",import.get("TSEQ")); @@ -1576,7 +1616,8 @@ void set_head_movmag(TImport_file & import, TConfig &trans) else magno = 28; } - if (import.get("TLOCT")=="CICCA") + if ((import.get("TLOCT")=="CICCA") + || (import.get("TLOCT")=="CMINT")) { import.put("TTYPE", "_L");//conto lavoro cod0 = '_'; // codice fittizio per simulare IL CONTO LAVORO @@ -1682,22 +1723,24 @@ void set_head_movmag(TImport_file & import, TConfig &trans) trans.set(DOC_CAUSMAG,causmag); trans.set(DOC_NOTE,descrmov); trans.set(DOC_NDOC,0L); + if (trans.get(DOC_TIPOCF) == "F") + codcli = trascode_for(codcli); trans.set(DOC_CODCF,codcli == 0L ? "" : format("%ld",codcli)); trans.set(DOC_ANNO,import.get_date("TTDTE").year()); // riferimenti - trans.set(DOC_DOC1,external_refnum(import)); - trans.set(DOC_NUMDOCRIF,import.get("TREF")); - trans.set(DOC_DATADOCRIF,import.get_date("TSDTE")); + trans.set(DOC_DOC1,import.get("TREF")); +// trans.set(DOC_NUMDOCRIF,external_refnum(import)); +// trans.set(DOC_DATADOCRIF,external_refdate(import)); TString codval = converti_codval(import.get("THCURR")); if (!codval.empty()) { real cambio=import.get_real("THTEXR"); cambio_fisso(codval,cambio); - trans.set(DOC_CAMBIO,cambio); + trans.set(DOC_CAMBIO,cambio.string()); trans.set(DOC_CODVAL,codval); } } -int set_body_movmag(TImport_file &import, TConfig &trans) +int set_body_movmag(TImport_file &import, TConfig &trans, const bool dotrans) { int extrarow=0; static long _last_ord = -1; @@ -1725,9 +1768,9 @@ int set_body_movmag(TImport_file &import, TConfig &trans) int terzista = location2method(import.get_long("TLOCT")); if (terzista == 7) { - if (import.get("TCOM").find("PD")>=0) + if (codimp == "PD" || (import.get("TCOM").find("PD")>=0)) codmag = "PD1PF"; - else if (import.get("TCOM").find("PR")>=0) + else if (codimp == "PR" || (import.get("TCOM").find("PR")>=0)) codmag = "PR1PF"; } @@ -1800,7 +1843,7 @@ int set_body_movmag(TImport_file &import, TConfig &trans) if (codiva.blank()) codiva = "20"; trans.set(RDOC_CODIVA, codiva); - if (_ithcheck) + if (_ithcheck && dotrans) { _ithcheck->put("TPROD",import.get("TPROD")); _ithcheck->put("TSEQ",import.get("TSEQ")); @@ -1816,12 +1859,22 @@ bool filter_bolacq(TImport_file & import) TFilename chkname(import.name()); chkname = chkname.path(); chkname.add("ithchk"); - if (chkname.exist()) + chkname.ext("dbf"); + if (!chkname.exist()) _check = FALSE; else { _ithcheck = new TExternisamfile(chkname, TRUE, TRUE); _ithcheck->setkey(1); + _ithcheck->first(); + /*TString tprod; + int tseq ; + while (_ithcheck->eof()) + { + tprod = _ithcheck->get("TPROD"); + tseq = _ithcheck->get_int("TSEQ"); + + }*/ } } if (_ithcheck) @@ -1944,11 +1997,11 @@ bool TImporta_BPCS ::importa_ordacq(TMask & m) { long firm =get_firm(); clear_docs(firm,"SEOF"); - clear_docs(firm,"TSOF"); + // clear_docs(firm,"TSOF"); TImport_file ordacq(m.get(F_PATH),BPCS_ORDACQ); return creadocs("Importazione ordini di acquisto..",firm,ordacq, "PORD","PVEND",NULL,NULL,NULL,NULL, - set_head_ordacq,set_body_ordacq,filter_ordacq, tipocf_for); + set_head_ordacq,set_body_ordacq,filter_ordacq, NULL, tipocf_for); } bool TImporta_BPCS ::importa_ordcli(TMask & m) @@ -1959,12 +2012,12 @@ bool TImporta_BPCS ::importa_ordcli(TMask & m) TImport_file released_orders(m.get(F_PATH),BPCS_SHOPORDS); bool ok = creadocs("Importazione ordini cliente (1)..",firm,released_orders, NULL,"SCUST","SRDTE","SOFAC",NULL,NULL, - set_head_R_ordcli,set_body_R_ordcli,filter_R_ordcli, tipocf_cli); + set_head_R_ordcli,set_body_R_ordcli,filter_R_ordcli, NULL, tipocf_cli); TImport_file firm_orders(m.get(F_PATH),BPCS_FIRMORD); ok = ok && creadocs("Importazione ordini cliente (2)..",firm,firm_orders, NULL,"FPPVND","FRDTE","FPFAC",NULL,NULL, - set_head_F_ordcli,set_body_F_ordcli,filter_F_ordcli, tipocf_cli); + set_head_F_ordcli,set_body_F_ordcli,filter_F_ordcli, NULL, tipocf_cli); return ok; } @@ -1972,17 +2025,25 @@ bool TImporta_BPCS ::importa_ordprod(TMask & m) { long firm =get_firm(); if (yesno_box("Cancello gli ordini MSP?")) - clear_docs(firm,"MSP"); - clear_docs(firm,"SEFA"); + if (noyes_box("Cancello solo gli MSP non confermati (n. >= 900000)?")) + clear_docs(firm,"MSP", NULL, NULL, 900000L); + else + clear_docs(firm,"MSP"); + if (yesno_box("Cancello gli ordini SEFA?")) + clear_docs(firm,"SEFA"); + + bool ok = TRUE; TImport_file released_orders(m.get(F_PATH),BPCS_SHOPORDS); - bool ok = creadocs("Importazione ordini di produzione Segrate (Released)..",firm,released_orders, + ok = ok && creadocs("Importazione ordini di produzione Segrate (Released)..",firm,released_orders, "SORD",NULL,"SRDTE","SOFAC",NULL,NULL, - set_head_R_ordprod,set_body_R_ordprod,filterRordprodSE, tipocf_null); + set_head_R_ordprod,set_body_R_ordprod,filterRordprodSE, NULL, tipocf_null); TImport_file firm_orders(m.get(F_PATH),BPCS_FIRMORD); ok = ok && creadocs("Importazione ordini di produzione Segrate (Firm Planned)..",firm,firm_orders, - NULL,NULL,"FRDTE","FPFAC",NULL,NULL, - set_head_F_ordprod,set_body_F_ordprod,filterFordprodSE, tipocf_null); + "**900000",NULL,"FRDTE","FPFAC",NULL,NULL, + set_head_F_ordprod,set_body_F_ordprod,filterFordprodSE, NULL, tipocf_null); + + return ok; } @@ -2017,7 +2078,7 @@ bool TImporta_BPCS::importa_bolacq(TImport_file &movmag, bool segrate, bool trie } ok &= creadocs("Importazione bolle di acquisto di Segrate..",firm, movmag, NULL,"TVEND","TTDTE", "THRNO","TTYPE","TREF", - set_head_bolacq,set_body_bolacq,filter_bolacqSE, tipocf_for, !testonly); + set_head_bolacq,set_body_bolacq,filter_bolacqSE, set_group_movmag, tipocf_for, !testonly); if (!testonly) { confirm_docs("SEBA",&fromdate,&todate); @@ -2033,7 +2094,7 @@ bool TImporta_BPCS::importa_bolacq(TImport_file &movmag, bool segrate, bool trie } ok &= creadocs("Importazione bolle di acquisto di Trieste..",firm, movmag, NULL,"TVEND","TTDTE", "THRNO","TTYPE","TREF", - set_head_bolacq,set_body_bolacq,filter_bolacqTS, tipocf_for, !testonly); + set_head_bolacq,set_body_bolacq,filter_bolacqTS, set_group_movmag, tipocf_for, !testonly); if (!testonly) { confirm_docs("TSBA",&fromdate,&todate); @@ -2078,8 +2139,8 @@ bool TImporta_BPCS::importa_movmag(TImport_file &movmag, bool segrate, bool trie clear_docs(firm, "SEMM",&fromdate,&todate); } ok &= creadocs("Importazione movimenti magazzino di Segrate..",firm, movmag, - NULL,"TVEND","TTDTE","TTYPE","TREF",NULL, - set_head_movmag,set_body_movmag,filter_movmagSE, tipocf_movmag, !testonly); + NULL,"TVEND","TTDTE","TTYPE",NULL,NULL, + set_head_movmag,set_body_movmag,filter_movmagSE, set_group_movmag, tipocf_movmag, !testonly); if (!testonly) { confirm_docs("SEBE",&fromdate,&todate); @@ -2103,7 +2164,7 @@ bool TImporta_BPCS::importa_movmag(TImport_file &movmag, bool segrate, bool trie } ok &= creadocs("Importazione movimenti magazzino di Trieste..",firm, movmag, NULL,"TVEND","TTDTE","TTYPE","TREF",NULL, - set_head_movmag,set_body_movmag,filter_movmagTS, tipocf_movmag, !testonly); + set_head_movmag,set_body_movmag,filter_movmagTS, set_group_movmag, tipocf_movmag, !testonly); if (!testonly) { confirm_docs("TSBE",&fromdate,&todate); @@ -2200,8 +2261,8 @@ void TImporta_automag_BPCS::main_loop() const TDate &fromdate=(m.get_date(F_MOVMAG_FROMD)); const TDate &todate=(m.get_date(F_MOVMAG_TOD)); - if (importa_bolacq(movmag, m.get_bool(F_MOVMAG_SE),m.get_bool(F_MOVMAG_TS), fromdate, todate, m.get_bool(F_TESTONLY),m.get_bool(F_NOCLEAR))) - importa_movmag(movmag, m.get_bool(F_MOVMAG_SE),m.get_bool(F_MOVMAG_TS), fromdate, todate, m.get_bool(F_TESTONLY),m.get_bool(F_NOCLEAR)); + if (importa_movmag(movmag, m.get_bool(F_MOVMAG_SE),m.get_bool(F_MOVMAG_TS), fromdate, todate, m.get_bool(F_TESTONLY),m.get_bool(F_NOCLEAR))) + importa_bolacq(movmag, m.get_bool(F_MOVMAG_SE),m.get_bool(F_MOVMAG_TS), fromdate, todate, m.get_bool(F_TESTONLY),m.get_bool(F_NOCLEAR)); message_box("Fine importazione"); } diff --git a/db/dbcv00a.h b/db/dbcv00a.h index bbfca33a7..d6cffd3d1 100755 --- a/db/dbcv00a.h +++ b/db/dbcv00a.h @@ -44,4 +44,5 @@ #define G_SERVICE_10 110 #define G_SERVICE_11 114 #define G_SERVICE_12 115 +#define G_SERVICE_13 116 diff --git a/db/dbcv02.cpp b/db/dbcv02.cpp index 909bac0fc..03d170eda 100755 --- a/db/dbcv02.cpp +++ b/db/dbcv02.cpp @@ -336,29 +336,37 @@ bool find_wrongcycle() } class TMov_diff_inv : public TConfig { - int _nriga; + int _nriga; + TDate _al; + bool _use_giac_al; + TArticolo_giacenza_data _art; public: void set_header(const char *imp_filter); int righe () {return _nriga;} bool max_righe () {return _nriga > 99 ;} void locate_bpcs_stock(const TString &codice , int mag , const TString &location, TImport_file &mag_bpcs, real &giac) ; int compare_stocks(TLocalisamfile &mag, const real & bpcs_stock, bool giac); - TMov_diff_inv (int num); + TMov_diff_inv (int num, const char * al, bool giac_al); + ~TMov_diff_inv() {} + } ; -TMov_diff_inv::TMov_diff_inv (int num) : - TConfig (format("ND_%05d.ini",num)) , _nriga(0) +TMov_diff_inv::TMov_diff_inv (int num, const char * al, bool giac_al) : + TConfig (format("ND_%05d.ini",num)) , _nriga(0), _al(al), + _use_giac_al(giac_al), _art() {} void TMov_diff_inv::locate_bpcs_stock(const TString &codice , int mag , const TString &location, TImport_file &mag_bpcs, real & giac) { - int direction = 0; long diff = 0; + +/* + int direction = 0; do { diff = codice.compare(mag_bpcs.get("CODICE")); - if (diff == 0) - diff = mag - mag_bpcs.get_int("MAG"); if (diff == 0) + diff = mag - mag_bpcs.get_int("MAG"); + if (diff == 0) diff = location.compare(mag_bpcs.get("LOC")); if (diff > 0 && direction != -1) { @@ -373,15 +381,24 @@ void TMov_diff_inv::locate_bpcs_stock(const TString &codice , int mag , const TS direction = 0; } } while (diff*direction>0 && direction != 0 ); +*/ + mag_bpcs.zero(); + mag_bpcs.put("MAG", format("%d",mag)); + mag_bpcs.put("LOC", location); + mag_bpcs.put("CODICE", codice); + diff = mag_bpcs.read(_isequal); + if (diff != 0) giac = ZERO; else giac = mag_bpcs.get_real("QTY"); } + int TMov_diff_inv::compare_stocks(TLocalisamfile &mag, const real & val_bpcs, bool giac) { if (!giac) return _nriga; +/* TRectype newmag = mag.curr(); if (mag.read() != NOERR) mag.curr() = newmag; @@ -390,6 +407,33 @@ int TMov_diff_inv::compare_stocks(TLocalisamfile &mag, const real & val_bpcs, bo val = (mag.get_real("VEN")); real diff = (val_bpcs - val); diff.round(3); +*/ + real val; + if (_use_giac_al) + { + _art.read(mag.get("CODART")); + TString16 codmag(mag.get("CODMAG")); + TString16 annoes(mag.get("ANNOES")); + _art.al(_al, codmag); + const int i = _art.find_mag(annoes, codmag); + TRectype & mag1 = _art.mag(annoes)[i]; + val = mag1.get_real("GIAC"); + if (!giac) + val = (mag1.get_real("VEN")); + } + else + { + TRectype newmag = mag.curr(); + if (mag.read() != NOERR) + mag.curr() = newmag; + val = mag.get_real("GIAC"); + if (!giac) + val = (mag.get_real("VEN")); + } + real diff = (val_bpcs - val); + diff.round(3); + + const real piotta = "900000.0"; while (diff >= 0.001 || diff <= -0.001) { @@ -416,7 +460,7 @@ int TMov_diff_inv::compare_stocks(TLocalisamfile &mag, const real & val_bpcs, bo void TMov_diff_inv::set_header(const char * imp_filter) { - TDate today(TODAY); +// TDate today(TODAY); set_paragraph("Transaction"); set("Action","INSERT"); set("Mode","AUTO"); @@ -426,14 +470,20 @@ void TMov_diff_inv::set_header(const char * imp_filter) set("CODNUM",codimp); set("CAUSMAG",""); set("NOTE","\"Differenze inventariali rilevate per confronto con gli archivi di BPCS\""); - set("DATADOC",today.string()); + //set("DATADOC",today.string()); + set("DATADOC",_al.string()); } void sinchro_stock(const TMask & m, const char * imp_filter) { if (!yesno_box(format("Confermi l'allineamento giacenze per %s dal file %s?", imp_filter, BPCS_STOCK))) return ; - TDate today(TODAY); + const bool launch_ve0 = yesno_box("Devo registrare immediatamente i documenti?"); + TDate day(TODAY); + TString16 data(m.get(S_GIAC_AL)); + if (data.not_empty()) + day = data; + const bool use_al = m.get_bool(S_USE_AL); TIndwin info(60,format("Allineamento giacenze per %s...",imp_filter),FALSE,FALSE); TImport_file mag_bpcs(m.get(F_PATH),BPCS_STOCK); TLocalisamfile mag(LF_MAG); @@ -445,7 +495,7 @@ void sinchro_stock(const TMask & m, const char * imp_filter) delete_files("ND_*.ini"); TMov_diff_inv *action; - action = new TMov_diff_inv(movimenti++); + action = new TMov_diff_inv(movimenti++,day, use_al); action->set_header(imp_filter); // Crea i mag di eurocampo eventualemnte mancanti @@ -457,10 +507,11 @@ void sinchro_stock(const TMask & m, const char * imp_filter) nummag = mag_bpcs.get_int("MAG"); num_mag2main_imp(nummag, codimp); if (codimp == imp_filter) - { - imploc2codmagdep(codimp, mag_bpcs.get("LOC"), codmag); + { + TString16 loc = mag_bpcs.get("LOC"); + imploc2codmagdep(codimp, loc, codmag); //num_mag2cod_imp(nummag, codmag); - mag.put("ANNOES", today.year()); + mag.put("ANNOES", day.year()); mag.put("CODART", codart); mag.put("CODMAG", codmag); if (mag.read()!=NOERR) @@ -491,14 +542,14 @@ void sinchro_stock(const TMask & m, const char * imp_filter) if (!skip) { int nriga = 0; - mag.put("ANNOES", today.year()); + mag.put("ANNOES", day.year()); mag.put("CODART", codart); mag.put("NRIGA", ++nriga); mag.setkey(1); while (mag.read()==NOERR) mag.put("NRIGA", ++nriga); mag.zero(' '); - mag.put("ANNOES", today.year()); + mag.put("ANNOES", day.year()); mag.put("CODART", codart); mag.put("NRIGA", nriga); mag.put("CODMAG", codmag); @@ -516,7 +567,7 @@ void sinchro_stock(const TMask & m, const char * imp_filter) mag_bpcs.first(); mag.setkey(1); mag.zero(); - mag.put("ANNOES", today.year()); + mag.put("ANNOES", day.year()); ok = mag.read(_isgteq)==NOERR; // magazzino Eurocampo vs mag BPCS while (ok) @@ -555,13 +606,13 @@ void sinchro_stock(const TMask & m, const char * imp_filter) { if (err != NOERR) break; - if ((/*codimp == "PR" || codimp == "PD" ||*/ codimp == imp_filter )&& nummag>0) + if ((((codimp == "SE1" || codimp == "TS1") && coddep == "07") || codimp == imp_filter ) && nummag>0) { - coddep2location(coddep, codlocation); - /*if (codmag == "SE1" && coddep == "07") + coddep2location(codmag, coddep, codlocation, nummag); + if (codmag == "SE1" && coddep == "07") nummag = 91; if (codmag == "TS1" && coddep == "07") - nummag = 92;*/ + nummag = 92; action->locate_bpcs_stock(codart, nummag, codlocation, mag_bpcs, bpcsstock); action->compare_stocks(mag, bpcsstock, TRUE); /*if (FALSE && nummag < 30) // elimina @@ -570,7 +621,7 @@ void sinchro_stock(const TMask & m, const char * imp_filter) action->compare_stocks(mag, bpcsstock, FALSE); }*/ } - if (codmag == "SE3" || codmag == "TS3" || coddep == "07") + if (codmag == "SE3" || codmag == "TS3" /*|| coddep == "07"*/) { // elimina vecchimagazzini SE3/TS3 e la vecchia codifica del magazzino di padova/parma bpcsstock = ZERO; @@ -578,10 +629,14 @@ void sinchro_stock(const TMask & m, const char * imp_filter) } if (action->max_righe()) { - TExternal_app gestdoc(format("ve0.exe -1 -i%s",(const char *)action->name())); + TString80 filename(action->name()); delete action; - gestdoc.run(); - action = new TMov_diff_inv(movimenti++); + if (launch_ve0) + { + TExternal_app gestdoc(format("ve0.exe -1 -i%s",(const char *)filename)); + gestdoc.run(); + } + action = new TMov_diff_inv(movimenti++, day, use_al); action->set_header(imp_filter); } } @@ -593,9 +648,13 @@ void sinchro_stock(const TMask & m, const char * imp_filter) if (action->righe()) { - TExternal_app gestdoc(format("ve0.exe -1 -i%s",(const char *)action->name())); + TString80 filename(action->name()); delete action; - gestdoc.run(); + if (launch_ve0) + { + TExternal_app gestdoc(format("ve0.exe -1 -i%s",(const char *)filename)); + gestdoc.run(); + } } } @@ -895,7 +954,7 @@ void unify_mags(const TMask & m) int err; TLocalisamfile mag(LF_MAG), rmovmag(LF_RMOVMAG), movmag(LF_MOVMAG); - TProgind info(80,"",FALSE,TRUE); + TProgind info(80,"",TRUE,TRUE); unify_mags_reset_bar(info, "tabella causali mag", caumag.items()); err = caumag.first(); @@ -904,6 +963,8 @@ void unify_mags(const TMask & m) unify_magcode("S10", caumag); err = caumag.next(); info.addstatus(1); + if (info.iscancelled()) + return; } message_box("Modificare a mano la tabella magazzini"); unify_mags_reset_bar(info, "tabella impianti", impianti.items()); @@ -915,6 +976,8 @@ void unify_mags(const TMask & m) unify_magcode("S8", impianti); err = impianti.next(); info.addstatus(1); + if (info.iscancelled()) + return; } unify_mags_reset_bar(info, "tabella linee di produzione", linee.items()); linee.setkey(2); @@ -925,14 +988,18 @@ void unify_mags(const TMask & m) unify_magcode("S8", linee); err = linee.next(); info.addstatus(1); + if (info.iscancelled()) + return; } unify_mags_reset_bar(info, "giacenze", mag.items()); err = mag.first(); while (err==NOERR) { - //unify_magcode("CODMAG", mag); + unify_magcode("CODMAG", mag); err = mag.next(); info.addstatus(1); + if (info.iscancelled()) + return; } unify_mags_reset_bar(info, "movimenti di magazzino", rmovmag.items()); @@ -943,6 +1010,8 @@ void unify_mags(const TMask & m) unify_magcode("CODMAG", rmovmag); err = rmovmag.next(); info.addstatus(1); + if (info.iscancelled()) + return; } TLocalisamfile doc(LF_DOC),rdoc(LF_RIGHEDOC); unify_mags_reset_bar(info, "righe documenti", rdoc.items()); @@ -976,6 +1045,8 @@ void unify_mags(const TMask & m) } err = rdoc.next(); info.addstatus(1); + if (info.iscancelled()) + return; } } @@ -1200,30 +1271,64 @@ void find_wrong_um(const TMask & m) } } if (codeum.blank()) - error_box("Unità di misura nulla per %s", (const char *)coddist); + if (yesno_box("Unità di misura nulla per %s. Aggiungo", (const char *)coddist)) + { + umart.put("CODART",coddist); + umart.put("NRIGA","2"); + umart.put("UM",dist.get("UM")); + umart.put("FC",1); + err = umart.write(); + if (err != NOERR) + warning_box("Errore in scrittura UM"); + } + } } else if (coddist.find("__")>=0) { // variante di prod, probabilmente da esprimere in batch di prod - if (codeum != "BP") + bool chk_ricetta = FALSE; + bool chk_distinta = FALSE; + real bp=ZERO; + if (codeum != "BP") // oh, guarda, la UM non è uguale a batch, caso sospetto! { - // oh, guarda, la UM non è uguale a batch, caso sospetto! - real bp; umart.setkey(2); umart.put("CODART",coddist); umart.put("UM","BP"); if ((err = umart.read())==NOERR) bp = umart.get_real("FC"); umart.setkey(1); - + if (bp.is_zero() || bp == 1.0) + chk_distinta = TRUE; + } + else + { + umart.setkey(2); + umart.put("CODART",coddist); + umart.put("UM","BP"); + if ((err = umart.read())==NOERR) + bp = umart.get_real("FC"); + umart.setkey(1); + umart.put("CODART",coddist); + umart.put("NRIGA","1"); + err = umart.read(); + if (err==NOERR) + if (umart.get("UM")=="KG") + chk_ricetta = TRUE; + else + if (bp == 1.0) + chk_distinta = TRUE; + } + if (chk_distinta) + { real total= ZERO; rdist.zero(); rdist.put("CODDIST", coddist); - if (bp.is_zero() && rdist.read()) + if (rdist.read()) { int newbp=0; - while (bp != 1.0 && coddist == rdist.get("CODDIST")) + while (bp <= 1.0 && coddist == rdist.get("CODDIST") // + && (rdist.get("TIPO")!="V")) { code = rdist.get("CODCOMP"); real expr = rdist.get_real("EXPR"); @@ -1292,7 +1397,7 @@ void find_wrong_um(const TMask & m) umart.put("FC",bp); if ((err = umart.write())!=NOERR) { - // + umart.rewrite(); } dist.put("UM","BP"); err = dist.rewrite(); @@ -1301,6 +1406,41 @@ void find_wrong_um(const TMask & m) warning_box("UM di distinta per %s %s", (const char *)coddist, (const char *)codeum); } } + if (chk_ricetta) + { + real totale_ricetta = ZERO; + rdist.zero(); + rdist.put("CODDIST", coddist); + rdist.read(_isgteq+_nolock); + while (coddist == rdist.get("CODDIST")) + { + code = rdist.get("CODCOMP"); + real expr = rdist.get_real("EXPR"); + if (rdist.get("UM") == "KG") + totale_ricetta = totale_ricetta + expr; + if (rdist.get("UM") == "GR") + totale_ricetta = totale_ricetta + (expr/1000.0); + rdist.next(); + } + if (bp != totale_ricetta && (((bp-totale_ricetta) >0.001 ) || + ((totale_ricetta-bp) >0.001 )) ) + { + TString ts(totale_ricetta.string()); + if ((totale_ricetta == 10000.0 || totale_ricetta == 1000.0 )) + { + if (yesno_box("Batch di produzione per %s a %s; lo porto a %s", + (const char *)coddist, (const char *)bp.string(), (const char *)ts)) + { + umart.put("CODART",coddist); + umart.put("UM","BP"); + umart.put("FC", totale_ricetta); + umart.rewrite(); + } + }// else + // warning_box("Batch di produzione per %s a %s, totale componenti %s", + // (const char *)coddist, (const char *)bp.string(), (const char *)ts); + } + } } info.addstatus(1); err = dist.prev(); @@ -1414,9 +1554,137 @@ bool TService_mask::on_field_event(TOperable_field& o, TField_event e, long joll return TRUE; } + +void converti_magazzino(TLocalisamfile & file, const char *campo, const char *campovecchio , const char *camponuovo) +{ + file.first(); + while (!file.eof()) + { + if (file.get(campo) == campovecchio) + { + file.put(campo,camponuovo); + file.rewrite(); + } + file.next(); + do_events(); + } +} +void uniscimag(const char *campovecchio , const char *camponuovo) +{ + TLocalisamfile file(LF_MAG), nfile(LF_MAG);; + TString codart= ""; + real qentr, qusc, qacq, qven , qrimin, qgiac; + real vqentr, vqusc, vqacq, vqven , vqrimin; + int nriga = 1; + int annoes; + bool done=TRUE; + + file.first(); + while (!file.eof()) + { + if (codart == "") + { + codart = file.get("CODART"); + annoes= file.get_int("ANNOES"); + done = TRUE; + } + if (file.get("CODMAG") == campovecchio) + { + qentr = file.get_real("ENT"); + qusc = file.get_real("USC"); + qacq = file.get_real("ACQ"); + qven = file.get_real("VEN"); + qrimin = file.get_real("RIM"); + vqentr = file.get_real("VALENT"); + vqusc = file.get_real("VALUSC"); + vqacq = file.get_real("VALACQ"); + vqven = file.get_real("VALVEN"); + vqrimin = file.get_real("VALRIM"); + qgiac = file.get_real("GIAC"); + file.put("ENT", ZERO); + file.put("USC", ZERO); + file.put("ACQ",ZERO); + file.put("VEN",ZERO); + file.put("RIM",ZERO); + file.put("VALENT",ZERO); + file.put("VALUSC",ZERO); + file.put("VALACQ",ZERO); + file.put("VALVEN",ZERO); + file.put("VALRIM",ZERO); + file.put("GIAC",ZERO); + // file.remove(); can' remove without renumbering + //file.rewrite(); + done = FALSE; + } + else if (file.get("CODMAG") == camponuovo && !done) + { + qentr += file.get_real("ENT"); + qusc += file.get_real("USC"); + qacq += file.get_real("ACQ"); + qven += file.get_real("VEN"); + qrimin += file.get_real("RIM"); + vqentr += file.get_real("VALENT"); + vqusc += file.get_real("VALUSC"); + vqacq += file.get_real("VALACQ"); + vqven += file.get_real("VALVEN"); + vqrimin += file.get_real("VALRIM"); + qgiac += file.get_real("GIAC"); + file.put("ENT", qentr); + file.put("USC", qusc); + file.put("ACQ",qacq); + file.put("VEN",qven); + file.put("RIM",qrimin); + file.put("VALENT",vqentr); + file.put("VALUSC",vqusc); + file.put("VALACQ",vqacq); + file.put("VALVEN",vqven); + file.put("VALRIM",vqrimin); + file.put("GIAC",qgiac); + file.put("CODMAG",camponuovo); + //file.rewrite(); + done = TRUE; + } + nriga = file. get_int("NRIGA"); + file.next(); + if (file.eof() || codart != file.get("CODART")) + { + if (!done) + { + nfile.zero(); + nfile.put("ENT", qentr); + nfile.put("USC", qusc); + nfile.put("ACQ",qacq); + nfile.put("VEN",qven); + nfile.put("RIM",qrimin); + nfile.put("VALENT",vqentr); + nfile.put("VALUSC",vqusc); + nfile.put("VALACQ",vqacq); + nfile.put("VALVEN",vqven); + nfile.put("VALRIM",vqrimin); + nfile.put("GIAC",qgiac); + nfile.put("CODMAG",camponuovo); + nfile.put("CODART", codart); + nfile.put("ANNOES", codart); + nfile.put("NRIGA", nriga+1); + //nfile.write(); + } + codart = file.get("CODART"); + annoes= file.get_int("ANNOES"); + done = TRUE; + qentr = qusc = qacq = qven = qrimin = vqentr = vqusc = vqacq = vqven = vqrimin = qgiac = ZERO; + } + do_events(); + } +} void TCover_services::main_loop() { + TLocalisamfile rdoc(LF_RIGHEDOC), rmovmag(LF_RMOVMAG), mag(LF_MAG); + //converti_magazzino(rdoc, "CODMAG", "COMSE", "SE1X0"); + //converti_magazzino(rdoc, "CODMAGC", "COMSE", "SE1X0"); + //converti_magazzino(rmovmag, "CODMAG", "COMSE", "SE1X0"); + //uniscimag("COM", "SE1X0"); TService_mask m; + while (m.run()!=K_QUIT); } diff --git a/db/dbcv02a.h b/db/dbcv02a.h index 2c4825d4c..d4dac0954 100755 --- a/db/dbcv02a.h +++ b/db/dbcv02a.h @@ -15,6 +15,8 @@ #define S_LASTBOLLA 202 #define S_MOVMAG_FROMD 203 #define S_MOVMAG_TOD 204 +#define S_GIAC_AL 205 +#define S_USE_AL 206 #define G_ARTICOLI 10 #define G_DISTINTE 20 @@ -24,7 +26,9 @@ #define G_SERVICE_2 102 #define G_SERVICE_3 103 #define G_SERVICE_8 108 +#define G_SERVICE_9 109 #define G_SERVICE_10 110 #define G_SERVICE_11 114 #define G_SERVICE_12 115 +#define G_SERVICE_13 116 diff --git a/db/dbcv02a.uml b/db/dbcv02a.uml index 69e2ed4b3..c0080d0fb 100755 --- a/db/dbcv02a.uml +++ b/db/dbcv02a.uml @@ -1,4 +1,4 @@ -#include "dbcv00a.h" +#include "dbcv02a.h" #define G_ARTICOLI 10 #define G_DISTINTE 20 #define G_MOVMAG 30 @@ -63,7 +63,7 @@ BEGIN ITEM "12|Ricerca errori nel ciclo di lavoro" MESSAGE HIDE, G_SERVICE@ ITEM "13|Allineamento giacenze" - MESSAGE HIDE, G_SERVICE@ + MESSAGE HIDE, G_SERVICE@ |SHOW, G_SERVICE_13@ ITEM "14|Scollegamento mov.mag da documenti" MESSAGE HIDE, G_SERVICE@ ITEM "16|Unifica magazzini terzisti" @@ -104,6 +104,18 @@ BEGIN GROUP G_SERVICE G_SERVICE_10 END +DATE S_GIAC_AL +BEGIN + PROMPT 3 5 "Giacenze al:" + GROUP G_SERVICE G_SERVICE_13 +END + +BOOLEAN S_USE_AL +BEGIN + PROMPT 43 5 "Calcolo le giacenze a questa data" + GROUP G_SERVICE G_SERVICE_13 +END + NUM S_LASTBOLLA 5 BEGIN PROMPT 3 6 "Ultima n.bolla BPCS Cover compresa nel pending " diff --git a/db/dbcv03.cpp b/db/dbcv03.cpp new file mode 100755 index 000000000..2c7b975c5 --- /dev/null +++ b/db/dbcv03.cpp @@ -0,0 +1,884 @@ +#include "dbcv.h" +#include "dbcv09.h" +#include "dbcv00a.h" +#include "dbcv01.h" +#include "printer.h" + +#include +#include +#include +#include "..\mg\anamag.h" +#include "..\mg\mag.h" +#include "..\include\doc.h" +#include "..\include\rdoc.h" +#include "..\ve\velib.h" + +#include "dbcvlib.h" + +class TImpchk_mask : public TAutomask +{ +protected: + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); +public: + TImpchk_mask() :TAutomask("dbcv03a.msk"){} +}; +bool TImpchk_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + return TRUE; +} + +class TImpchk_BPCS : public TSkeleton_application +{ + TLocalisamfile * _dist, *_rdist, * _anamag, *_umart, *_codcorr,*_mag; +private: + void delete_ghosts(); + void delete_arts(); + bool delete_boms(); + int read_last_rdist(const char *item_code); + bool read_is_dist(const char *item_code); + bool is_ghost(const char *item_code); + const char * read_first_um(const char *item_code); + void clear_docs(long firm, const char * num, const TDate *fromdate=NULL, const TDate *todate=NULL); + +protected: + void add_log_row(TPrinter &prn, TPrintrow &oldrow, const char *m); + bool compare_item(TPrinter &prn, TPrintrow &prow, const char * anafield, const TString & impfield); + bool compare_item(TPrinter &prn, TPrintrow &prow, const char * anafield, const real & impfield); + bool compare_item(TPrinter &prn, TPrintrow &prow, const char * anafield, const long impfield); +protected: + virtual bool create(); + virtual bool destroy(); + bool chkimp_boms(TMask &m); + bool cambia_gmc(TMask & m); + bool chkimp_arts(TMask &m); + bool importa_ums_BP(TMask &m); +protected: + virtual void main_loop() ; +}; + +bool TImpchk_BPCS::create() +{ + open_files(LF_TAB, LF_TABCOM, LF_CLIFO, LF_CFVEN, LF_RIGHEDOC, LF_MOVMAG, LF_RMOVMAG, 0); + _dist = new TLocalisamfile(LF_DIST); + _rdist = new TLocalisamfile(LF_RDIST); + _anamag = new TLocalisamfile(LF_ANAMAG); + _umart = new TLocalisamfile(LF_UMART); + _codcorr = new TLocalisamfile(LF_CODCORR); + _mag = new TLocalisamfile(LF_MAG); + return TSkeleton_application::create(); +} +bool TImpchk_BPCS::destroy() +{ + delete _dist; + delete _rdist; + delete _anamag; + delete _umart; + delete _codcorr; + delete _mag; + return TSkeleton_application::destroy(); +} + + +int TImpchk_BPCS::read_last_rdist(const char *item_code) +{ + static TString prevcode=""; + static int nrig=0; + if (prevcode!=item_code) + { + prevcode=item_code; + nrig=0; + _rdist->put("CODDIST",item_code); + int err=_rdist->read(_isgteq); + while (err==NOERR && _rdist->get("CODDIST")==item_code) + { + nrig++; + err=_rdist->next(); + } + } + return ++nrig; +} + +bool TImpchk_BPCS::read_is_dist(const char *item_code) +{ + const TRectype & rec=cache().get(LF_DIST,item_code); + if (!rec.empty()) + return TRUE; + return FALSE; +} +bool TImpchk_BPCS::is_ghost(const char *item_code) +{ + const TRectype & rec=cache().get(LF_DIST,item_code); + if (!rec.empty()) + return rec.get_bool("VIRTUALE") && !rec.get_bool("ARTPROD")&& !rec.get_bool("ARTACQ") ; + return FALSE; +} +const char * TImpchk_BPCS::read_first_um(const char *item_code) +{ + TToken_string key(item_code); + key.add(1); + const TRectype & rec=cache().get(LF_UMART,key); + if (rec.empty()) + error_box("Impossibile trovare l'item %s",item_code); + return rec.get("UM"); +} + +// cancella gli articoli +void TImpchk_BPCS ::delete_arts() +{ + message_box("- cancellazione articoli disabilitata -"); +} + +// cancella le distinte che non sono lavorazioni +bool TImpchk_BPCS ::delete_boms() +{ + message_box("- cancellazione distinte disabilitata -"); + return FALSE; +} + +// elimina i ghost "di servizio" +void TImpchk_BPCS ::delete_ghosts() +{ + message_box("- cancellazione distinte fantasma disabilitata -"); +} + +bool TImpchk_BPCS::chkimp_boms(TMask &m) +{ +return TRUE; + TWait_cursor hourglass; + cache().flush(LF_DIST); + cache().flush(LF_ANAMAG); + cache().flush(LF_UMART); + + TSupport_file morti(LF_DIST, format("%s\\%s",(const char * ) m.get(F_PATH),ANAGRAFICA_MORTI)); + TImport_file boms(m.get(F_PATH), BPCS_DISTINTE); + TProgind info(boms.items(),"Importazione distinte...",TRUE,TRUE); + TToken_string imported_lcode,dead_lcode,skipped_lcode,current_lcode; + TString old_code,item_code,last_code; + TString8 impianto,main_imp; + int bseq=0; + + boms.first(); + while (!boms.eof()) + { + info.addstatus(1); + if (info.iscancelled()) + return FALSE; + // converte ogni distinta ancora valida + old_code=(boms.get_codice("BPROD")); + impianto=(boms.get("BMWHS")); + int metodo(int(boms.get_long("BMBOMM"))); + current_lcode.add(old_code,0); + current_lcode.add(impianto,1); + current_lcode.add(metodo,2); + + const long ddis=boms.get_long("BDDIS"); + bool skip=!((ddis==99999999)||(ddis==9999999)||(ddis==999999)||(ddis==99999)); + if (skipped_lcode==current_lcode || dead_lcode==current_lcode) + skip = TRUE; + if (!skip && m.get_bool(F_CHECKDEADARTS)) + { + morti.put("CODDIST",old_code); + if (morti.read()==NOERR) + { + skip=TRUE; + skipped_lcode=current_lcode; + } + } + if (!skip && atol(boms.get("BDEFF"))zero(); + _dist->put("CODDIST", old_code); + _dist->put("DESCR", descr); + _dist->put("VIRTUALE", " "); + _dist->put("MASTER", "X"); + _dist->put("ARTPROD", "X"); + _dist->put("UM", um_f); + TString varvar("VARIANTE="); + varvar << "_DISTINTA+\"__\"+IF(_IMPIANTO!=\"XT\",_IMPIANTO,_LINEA)" ; + _dist->put("PARAMETRI",varvar); + int err=_dist->write(); + if (err!=_isreinsert) + { + _rdist->zero(); + _rdist->put("CODDIST", old_code); + _rdist->put("NRIG", 1 ); + _rdist->put("TIPO", "V" ); + _rdist->put("CODCOMP", "VARIANTE" ); + _rdist->put("UM", ""); + _rdist->put("EXPR", 1 ); + _rdist->write(); + } + } + } + // figlio + TString son_code=boms.get_codice("BCHLD"); + TString um_s=read_first_um(son_code) ; + const bool son_ghost=is_ghost(son_code); + if (son_ghost) + son_code << "__" << impianto ; + // scrivi la bom + if (last_code!=item_code) + { + if (cache().get(LF_DIST,item_code).empty()) + { + cache().discard(LF_DIST,item_code); + descr << " (impianto " << main_imp << ")"; + _dist->zero(' '); + _dist->put("CODDIST", item_code); + _dist->put("DESCR", descr); + _dist->put("VIRTUALE", "X" ); + _dist->put("ARTPROD", ""); + _dist->put("UM", "BP"); + + if (impianto.left(2)!= "XT") + { + // l'albero della distinte di un impianto e' su qyell'impianto + // i terzisti seguono l'impianto di pianificazione + TString varimp("_IMPIANTO="); + varimp << '"'<< main_imp <<'"'; + _dist->put("PARAMETRI",varimp); + } + _dist->write(); // fallisce se esiste gia' + + _umart->zero(' '); + _umart->put("CODART",item_code); + _umart->put("NRIGA",1); + _umart->put("UM",um_f); + _umart->put("FC","1"); + force_write(*_umart); + } + last_code=item_code; + if (bseq>0 || (impianto != "PD" && impianto != "PR")) + bseq=0; + } + if (impianto == "PD") + bseq--; + else if (impianto != "PR") + bseq++; + if (bseq==0) error_box("Numero riga 0 per %s / %s",(const char *)item_code,(const char *)son_code); + _rdist->zero(' '); + _rdist->put("CODDIST", item_code); + _rdist->put("NRIG", bseq >0 ? bseq : -bseq); + if (son_ghost) + _rdist->put("TIPO", "D"); + else if (son_code=="ACQUA" || son_code=="ACQUADEION") + _rdist->put("TIPO", "L"); + else + _rdist->put("TIPO", "A"); + _rdist->put("CODCOMP", son_code ); + _rdist->put("UM", um_s); + _rdist->put("EXPR", boms.get_real("BQREQ") ); + _rdist->write(); + + imported_lcode=current_lcode; + } while (impianto == "PD"); + } + boms.next(); + } + delete_ghosts(); + return TRUE; +} + +void TImpchk_BPCS::add_log_row(TPrinter &prn, TPrintrow &oldrow, const char *m) +{ + TString mm(m); + if (oldrow.lastpos()) + prn.print(oldrow); + oldrow.reset(); + oldrow.put(mm,4); + prn.print(oldrow); + oldrow.reset(); +} + +bool TImpchk_BPCS::compare_item(TPrinter &prn, TPrintrow &prow, const char * anafield, + const real & impfield) +{ + real r_eurocampo(_anamag->get_real( anafield)); + if (r_eurocampo != impfield && !impfield.is_zero()) + { + if (r_eurocampo.is_zero()) + { + _anamag->put(anafield, impfield); + return TRUE; + } else { + TString messaggio = format("Il campo %s manca dei decimali", anafield); + messaggio << "(" << r_eurocampo << " invece di " << impfield << "\nAggiorno automaticamente?"; + real r_bpcs(impfield); + if (r_bpcs.trunc() == r_eurocampo && yesno_box(messaggio)) + { + _anamag->put(anafield, impfield); + return TRUE; + } + messaggio = anafield; + messaggio << "=" << _anamag->get_real( anafield) << " , " << impfield << " su BPCS"; + add_log_row(prn, prow, messaggio); + } + } + return FALSE; +} + +bool TImpchk_BPCS::compare_item(TPrinter &prn, TPrintrow &prow, const char * anafield, + const TString & impfield) +{ + if (_anamag->get( anafield) != impfield && !impfield.blank()) + if (_anamag->get( anafield).blank()) + { + _anamag->put( anafield, impfield); + return TRUE; + } else { + add_log_row(prn, prow, format ("%s = '%s', '%s'su BPCS", + (const char *) anafield,(const char *)_anamag->get( anafield), (const char *)impfield)); + } + return FALSE; +} + +bool TImpchk_BPCS::compare_item(TPrinter &prn, TPrintrow &prow, const char * anafield, + const long impfield) +{ + if (_anamag->get_long( anafield) != impfield && impfield!=0L) + if (_anamag->get_long( anafield) == 0L) + { + _anamag->put( anafield, impfield); + return TRUE; + } else { + add_log_row(prn, prow, format ("%s = '%ld', '%ld'su BPCS", + (const char *) anafield,_anamag->get_long( anafield), impfield)); + } + return FALSE; +} + +// importa le ums dal file di anagrafica +bool TImpchk_BPCS ::chkimp_arts(TMask & m) +{ + TPrinter prn; + TPrintrow prow; + TWait_cursor hourglass; + cache().flush(LF_ANAMAG); + cache().flush(LF_DIST); + cache().flush(LF_UMART); + + TSupport_file morti(LF_DIST, format("%%%s\\%s",(const char * ) m.get(F_PATH),ANAGRAFICA_MORTI)); + TImport_file items_ext(m.get(F_PATH),BPCS_IMPORTEX); + TImport_file items(m.get(F_PATH),BPCS_ANAGRAFICA); + TString item_code,item_type,tmp; + bool skip; + + TProgind info(items.items(),"Controllo articoli e distinte fantasma...",TRUE,TRUE); + prn.open(); + + items_ext.first(); + items.first(); + while (!items.eof()) + { + info.addstatus(1); + if (info.iscancelled()) + break; + item_type=items.get("IITYP"); + if (items.get("IID")=="IM" && atoi(item_type)!=6) + { + if (item_type!="0") // non fantasma + { + item_code=items.get_codice("IPROD"); + skip=FALSE; + // sincronizza il file dell'anagrafica Importex + while (items_ext.get_codice("MSITE")zero(); + _anamag->put( ANAMAG_CODART,item_code); + bool newart = (_anamag->read()==_iskeynotfound); + if (newart && yesno_box("Articolo %s '%s'non trovato:\n lo metto tra gli articoli da ignorare?", + (const char *)item_code,(const char *)items.get("IDESC"))) + { + morti.put("CODDIST",item_code); + morti.put("DESCR",items.get("IDESC")); + morti.write(); + } + else + { + prow.reset(); + prow.put("Articolo "); + prow.put(item_code); + if (newart) + { + prow.put(" mancante: inserito in automatico"); + prn.print(prow); + + _anamag->put( ANAMAG_DESCR,items.get("IDESC")); + _anamag->put( ANAMAG_DESCRAGG,items.get("IDSCE")); + _anamag->put( ANAMAG_CODFORN, items.get_long("IVEND")); + _anamag->put( ANAMAG_UMP, "KG"); + _anamag->put( ANAMAG_PESO, items.get_real("IWGHT")); + // riordino + _anamag->put( ANAMAG_RIORDINO , "F"); //_anamag->put( ANAMAG_RIORDINO , items.get("IMRP")=="M" ? "F" : "P" ); + _anamag->put( ANAMAG_GIORNIRIOR, items.get_long("ILEAD")); + _anamag->put( ANAMAG_LOTTORIOR, items.get_real("ILOTS")); + _anamag->put( ANAMAG_LOTTOIRIOR, items.get_real("IIOQ")); + // + _anamag->put( ANAMAG_PPCONF , items.get_long("IFII")); + _anamag->put( ANAMAG_PPCOLLO , items.get_long("IFII")); + TString16 gmc=items.get("IITYP"); + switch (gmc[0]) + { + case 'F': + case 'E': + case 'Z': + case 'G': + gmc[0]= 'F'; break; + case 'M': + gmc[0]= 'S'; break; + case 'P': + gmc[0]= 'C'; break; + } + TString16 iclas(items.get("ICLAS")); + if (!iclas.blank()) + { + switch (m.get(F_ICLAS)[0]) + { + case 'S': + complete_gmc(gmc, iclas); + break; + case 'C': + gmc << iclas; + break; + case ' ': + break; + } + } + _anamag->put( ANAMAG_GRMERC,gmc); + _anamag->put( ANAMAG_COSTSTD, items.get_real("ISCST")); + _anamag->put( ANAMAG_ULTCOS1, items.get_real("IACST")); + tmp=items.get("TAXC1"); + if (tmp.left(3)=="IVA") + tmp=tmp.sub(3); + _anamag->put( ANAMAG_CODIVA , tmp); + if (items_ext.get_codice("MSITE")==items.get_codice("IPROD")) + { + _anamag->put( ANAMAG_CLASSDOG , check_clasdog(items_ext.get_long("MSTDO"))); + _anamag->put( ANAMAG_USER1 , items_ext.get_real("MSIDR"));// idrati + _anamag->put( ANAMAG_USER2 , items_ext.get_real("MSANI"));//anidri + _anamag->put( ANAMAG_USER3 , items_ext.get("MSTAL"));//alcool + // dimensioni + _anamag->put( ANAMAG_USER4, items_ext.get_long("MSPLU")); + _anamag->put( ANAMAG_USER5, items_ext.get_long("MSPAL")); + _anamag->put( ANAMAG_USER6, items_ext.get_long("MSPPR")); + // composizione pallets + _anamag->put( ANAMAG_USER7, items_ext.get_long("MSCST")); // casse per strato + _anamag->put( ANAMAG_USER8, items_ext.get_long("MSSTP")); // strati per pallet + } + //_anamag.write(); + real smin(items.get("IMIN")); + if (smin!=ZERO) + { + _mag->zero(); + _mag->put(MAG_SCORTAMIN,smin); + _mag->put(MAG_ANNOES,"1999"); + _mag->put(MAG_CODART,item_code); + _mag->put(MAG_NRIGA,1); + _mag->put(MAG_CODMAG,"SE1PF"); + //force_write(*_mag); + _mag->put(MAG_NRIGA,2); + _mag->put(MAG_CODMAG,"TS1PF"); + //force_write(*_mag); + } + } else { + bool changed=FALSE; + bool different=FALSE; + changed |= compare_item(prn, prow, ANAMAG_DESCR, items.get("IDESC")); + changed |= compare_item(prn, prow, ANAMAG_DESCRAGG, items.get("IDSCE")); + changed |= compare_item(prn, prow, ANAMAG_CODFORN, items.get_long("IVEND")); + if (_anamag->get( ANAMAG_UMP).blank()) + { + _anamag->put( ANAMAG_UMP,"KG"); + changed = TRUE; + } else { + if (_anamag->get( ANAMAG_UMP) != "KG") + add_log_row(prn, prow, format("Unita' di misura del peso insolita: %s",(const char *)_anamag->get( ANAMAG_UMP))); + } + changed |= compare_item(prn, prow, ANAMAG_PESO, items.get_real("IWGHT")); + // riordino + if (_anamag->get( ANAMAG_RIORDINO).blank()) + { + _anamag->put( ANAMAG_RIORDINO,"F"); + changed = TRUE; + } else { + if (_anamag->get( ANAMAG_RIORDINO) != "F") + add_log_row(prn, prow, format("TIpo di riordino insolito: %s",(const char *)_anamag->get( ANAMAG_RIORDINO))); + } + changed |= compare_item(prn, prow, ANAMAG_GIORNIRIOR, items.get_long( "ILEAD")); + changed |= compare_item(prn, prow, ANAMAG_LOTTORIOR, items.get_real( "ILOTS")); + changed |= compare_item(prn, prow, ANAMAG_LOTTOIRIOR, items.get_real( "IIOQ")); + // + changed |= compare_item(prn, prow, ANAMAG_PPCONF, items.get_long("IFII")); + changed |= compare_item(prn, prow, ANAMAG_PPCOLLO, items.get_long("IFII")); + TString8 gmc=items.get("IITYP"); + switch (gmc[0]) + { + case 'F': + case 'E': + case 'Z': + case 'G': + gmc[0]= 'F'; break; + case 'M': + gmc[0]= 'S'; break; + case 'P': + gmc[0]= 'C'; break; + } + TString16 iclas(items.get("ICLAS")); + if (!iclas.blank()) + { + switch (m.get(F_ICLAS)[0]) + { + case 'S': + complete_gmc(gmc, iclas); + break; + case 'C': + gmc << iclas; + break; + case ' ': + break; + } + } + changed |= compare_item(prn, prow, ANAMAG_GRMERC, gmc); + changed |= compare_item(prn, prow, ANAMAG_COSTSTD, items.get_real("ISCST")); + changed |= compare_item(prn, prow, ANAMAG_ULTCOS1, items.get_real("IACST")); + tmp=items.get("TAXC1"); + if (tmp.left(3)=="IVA") + tmp=tmp.sub(3); + changed |= compare_item(prn, prow, ANAMAG_CODIVA, tmp); + + if (items_ext.get_codice("MSITE")==items.get_codice("IPROD")) + { + changed |= compare_item(prn, prow, ANAMAG_CLASSDOG, atol(check_clasdog(items_ext.get_long("MSTDO")))); + changed |= compare_item(prn, prow, ANAMAG_USER1, items_ext.get_real("MSIDR")); + changed |= compare_item(prn, prow, ANAMAG_USER2, items_ext.get_real("MSANI")); + changed |= compare_item(prn, prow, ANAMAG_USER3, items_ext.get("MSTAL")); + // dimensioni + changed |= compare_item(prn, prow, ANAMAG_USER4, items_ext.get_long("MSPLU")); + changed |= compare_item(prn, prow, ANAMAG_USER5, items_ext.get_long("MSPAL")); + changed |= compare_item(prn, prow, ANAMAG_USER6, items_ext.get_long("MSPPR")); + // composizione pallets + changed |= compare_item(prn, prow, ANAMAG_USER7, items_ext.get_long("MSCST")); + changed |= compare_item(prn, prow, ANAMAG_USER8, items_ext.get_long("MSSTP")); + } + //_anamag.write(); + real smin(items.get("IMIN")); + if (smin!=ZERO) + { + _mag->zero(); + _mag->put(MAG_SCORTAMIN,smin); + _mag->put(MAG_ANNOES,"1999"); + _mag->put(MAG_CODART,item_code); + _mag->put(MAG_NRIGA,1); + _mag->put(MAG_CODMAG,"SE1PF"); + //force_write(*_mag); + _mag->put(MAG_NRIGA,2); + _mag->put(MAG_CODMAG,"TS1PF"); + //force_write(*_mag); + } + if (changed) + _anamag->rewrite(); + } + } // inserisco - ignoro + // ******* + // UMS + TString4 um,ums(items.get("IUMS")); + real fc; + int nriga=1; + for (int u=0; u<3; u++) + { + switch (u) + { + case 1: + um=items.get("IUMP"); + fc=items.get_real("IUMCN"); + break; + case 2: + um=items.get("IUMR"); + fc=items.get_real("IUMRC"); + break; + default: + um=ums; + fc=1.0; + } + if (!um.blank() && (u==0 || um!=ums)) + { + _umart->zero(); + _umart->put("CODART",item_code); + _umart->put("NRIGA",nriga); + _umart->put("UM",um); + if (nriga==1) + _umart->put("PREZZO",items.get("ILIST")); + _umart->put("FC",fc); + //force_write(*_umart); + nriga++; + } + } // fine ciclo unita' di misura + long ean=items.get_long("IDRAW"); + if (!m.get(F_EAN).blank()) + { + TString16 eancode=items.get("IDRAW"); + if (ean!=0L || (eancode[0]>='A' && eancode[0]<='Z' && atol(eancode.sub(1))!=0L)) + { + _codcorr->zero(); + _codcorr->put("CODARTALT",eancode); + _codcorr->put("NRIGA",1); + _codcorr->put("TIPO",m.get(F_EAN)); + _codcorr->put("CODART",item_code); + //force_write(*_codcorr); + } + } + } // controllo morti + } // articolo magazzino + } // record type check + items.next(); + } // while + prn.close(); + return TRUE; +} + + +bool TImpchk_BPCS ::cambia_gmc(TMask & m) +{ + TWait_cursor hourglass; + cache().flush(LF_ANAMAG); + cache().flush(LF_DIST); + cache().flush(LF_UMART); + + TImport_file items_ext(m.get(F_PATH),BPCS_IMPORTEX); + TImport_file items(m.get(F_PATH),BPCS_ANAGRAFICA); + TString item_code,item_type,tmp; + TProgind info(items.items(),"Importazione gruppi merceologici e classi doganali",TRUE,TRUE); + items_ext.first(); + items.first(); + while (!items.eof()) + { + info.addstatus(1); + if (info.iscancelled()) + return FALSE; + item_type=items.get("IITYP"); + if (items.get("IID")=="IM" && atoi(item_type)!=6) + { + item_code=items.get_codice("IPROD"); + if (item_type!="0") // fantasma + { + _anamag->zero(); + _anamag->put( ANAMAG_CODART,item_code); + if (_anamag->read()==NOERR) + { + // sincronizza il file dell'anagrafica Importex + while (items_ext.get_codice("MSITE")put( ANAMAG_CLASSDOG , cld); + } + TString16 gmc=items.get("IITYP"); + switch (gmc[0]) + { + case 'F': + case 'E': + case 'Z': + case 'G': + gmc[0]= 'F'; break; // finiti + case 'M': + gmc[0]= 'S'; break; // semilavorati () + case 'P': + gmc[0]= 'C'; break; // componenti (parts) + } + TString16 iclas(items.get("ICLAS")); + if (!iclas.blank()) + { + switch (m.get(F_ICLAS)[0]) + { + case 'S': + complete_gmc(gmc, iclas); + break; + case 'C': + gmc << iclas; + break; + case ' ': + break; + } + } + _anamag->put( ANAMAG_GRMERC,gmc); + _anamag->rewrite(); + } + } + } + items.next(); + } + return TRUE; +} + + +// importa le ums dal file dei divisori +bool TImpchk_BPCS ::importa_ums_BP(TMask & m) +{ +return TRUE; + TWait_cursor hourglass; + cache().flush(LF_UMART); + + TImport_file divisori(m.get(F_PATH),BPCS_DIVISORI); + TProgind info(divisori.items(),"Importazione divisori (batch di produzione)...",TRUE,TRUE); + divisori.first(); + TString item_code,impianto; + while (!divisori.eof()) + { + info.addstatus(1); + if (info.iscancelled()) + return FALSE; + impianto=divisori.get("ICFAC"); + if (impianto=="SE" || impianto == "TS") + { + for (int falsi_terzisti=0;falsi_terzisti<3; falsi_terzisti++) + { + item_code=(divisori.get_codice("ICPROD")); + item_code << "__"; + switch (falsi_terzisti) + { + case 1: + item_code << "PD"; break; + case 2: + item_code << "PR"; break; + default: + item_code << impianto; break; + } + if (read_is_dist(item_code)) + { + _umart->zero(); + _umart->put("CODART",item_code); + _umart->put("NRIGA",2); + _umart->put("UM","BP"); + _umart->put("FC",divisori.get("ICBTCH")); + force_write(*_umart); + } + } + } + divisori.next(); + } + + return TRUE; +} + +void TImpchk_BPCS ::main_loop() +{ + TImpchk_mask m; + while (m.run()!=K_QUIT) + { + bool ok = TRUE; + ok &= chkimp_arts(m); // articoli e distinte virtuali fantasma + ok &= chkimp_boms(m); // distinte non fantasma + ok &= importa_ums_BP(m); + if (ok) + message_box("Operazione conclusa"); + else + message_box("Operazione interrotta"); + } +} + + +int dbcv03(int argc, char* argv[]) +{ + int n = argc > 1 ? (argv[1][1] - '0') : 0; + TImpchk_BPCS dt; + dt.run(argc, argv, "Controllo archivi importati da BPCS"); + + return 0; +} diff --git a/db/dbcv03a.uml b/db/dbcv03a.uml new file mode 100755 index 000000000..ecabe690a --- /dev/null +++ b/db/dbcv03a.uml @@ -0,0 +1,55 @@ +#include "dbcv00a.h" +TOOLBAR "" 0 19 0 0 + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -12 -11 "~OK" + PICTURE BMP_OK +END + +BUTTON DLG_QUIT 10 2 +BEGIN + PROMPT -22 -11 "~Fine" + MESSAGE EXIT,K_QUIT + PICTURE BMP_QUIT + PICTURE BMP_QUITDN +END + +ENDPAGE + +PAGE "Servizi" -1 -1 80 20 + + +STRING DLG_PROFILE 70 +BEGIN + FLAGS "HG" + PROMPT 1 1 "" + PSELECT +END + +STRING F_PATH 40 +BEGIN + PROMPT 1 1 "Percorso dei files DBF di BPCS " +END + +LIST F_ICLAS 35 +BEGIN + PROMPT 3 6 "" + ITEM " |Non caricare il campo ICLAS" + ITEM "S|Carica ICLAS come sotto cat.merc." + ITEM "C|Carica ICLAS come cat.merc." + GROUP G_ARTICOLI +END +LIST F_EAN 30 +BEGIN + PROMPT 3 8 "" + ITEM " |Non caricare i codici EAN" + ITEM "8|Carica codici EAN 8" + ITEM "13|Carica codici EAN 13" + GROUP G_ARTICOLI +END + + +ENDPAGE + +ENDMASK diff --git a/db/dbcv09.cpp b/db/dbcv09.cpp index c3185f45c..8aee91062 100755 --- a/db/dbcv09.cpp +++ b/db/dbcv09.cpp @@ -1,9 +1,10 @@ -#include "dblib.h" +#include "..\db\dblib.h" #include "dbcv09.h" #include "dbcv00a.h" #include #include #include "..\mg\anamag.h" +#include "..\mg\mglib.h" void delete_files(const char *wild) { @@ -77,16 +78,6 @@ long method2location(int method) return -99; // terzista generico } -void coddep2location(const char * coddep, TString & codlocation) -{ - codlocation.cut(0); - if (coddep[0]>='0' && coddep[0]<='9') - codlocation = format("%02d", method2location(atoi(coddep))) ; - else if (coddep == "C0") - codlocation = "CICCA"; -} - - int location2method(long location) { switch (location) @@ -98,7 +89,7 @@ int location2method(long location) case 63: return 4; case 872: return 5; case 66: return 6; - case 1700: return 7; + case 1700: return 7; // Ex COVER case 115: return 8; case 935: return 9; case 911: return 10; @@ -368,27 +359,39 @@ const char * check_clasdog(long stdo) void imploc2codmagdep(TString &codimp,TString &location, TString &codmag) { + int terzista = 0; - if (atoi(location)) - { - terzista = location2method(atoi(location)); - if (terzista == 7) - { - if (codimp=="SE") - codimp = "PR"; - else - codimp = "PD"; - terzista = 0; - } - } codmag = codimp; codmag << 1; - if (location == "CICCA") - codmag << "C0"; - else if (terzista>0) + if (!location.blank()) { - codmag << format("%02d",terzista); - codimp = "XT"; + // must be a terzist.... + if (atoi(location)) + { + terzista = location2method(atoi(location)); + if (terzista == 7) + { + if (codimp!="SE") + { + if (codimp=="SE3") + codmag = "SE1"; + else + codmag = "TS1"; + } + } + } + if (location == "CICCA") + codmag << "C0"; + else if (location == "CMINT") + codmag << "C1"; + else if (location == "COMMEX") + codmag << "X0"; + else if (terzista>0) + { + codmag << format("%02d",terzista); + codimp = "XT"; + } else if (!location.blank()) + error_box("Locazione sconosciuta '%s'",(const char *)location); } else { codmag << "PF"; } @@ -396,14 +399,6 @@ void imploc2codmagdep(TString &codimp,TString &location, TString &codmag) void codimp2codmagdep(TString &codimp,int terzista, TString &codmag) { - if (terzista == 7) - { - if (codimp=="SE") - codimp = "PR"; - else - codimp = "PD"; - terzista = 0; - } codmag = codimp; codmag << 1; if (terzista>0) @@ -413,6 +408,13 @@ void codimp2codmagdep(TString &codimp,int terzista, TString &codmag) } else { codmag << "PF"; } + if (terzista == 7) + { + if (codimp=="SE") + codimp = "PR"; + else + codimp = "PD"; + } } void num_mag2cod_imp(int magno, TString & codimp) @@ -442,8 +444,8 @@ void num_mag2cod_imp(int magno, TString & codimp) int cod_mag2num_mag(TString & codmagdep) { const int terzista = atoi(codmagdep.sub(3)); - if (terzista!=7) - { +// if (terzista!=7) +// { TString codmag = codmagdep.left(3); if (codmag=="SE1") return terzista ? 91 : 26; @@ -453,16 +455,32 @@ int cod_mag2num_mag(TString & codmagdep) if (codmag != "VGG" && codmag != "SE3" && codmag != "TS3") { codmagdep.overwrite("07",3); + if (codmag == "COM") + return 26; if (codmag == "PD1") return 92; if (codmag == "PR1") return 91; - error_box("Che cazzo di magazzino è %s?", (const char *)codmag); + error_box("Che minchia di magazzino è %s?", (const char *)codmag); } - } +// } return -1; } +void coddep2location(const char * codmag, const char * coddep, TString & codlocation, int & nummag) +{ + codlocation.cut(0); + if (coddep[0]>='0' && coddep[0]<='9') + codlocation = format("%02d", method2location(atoi(coddep))) ; + else if (coddep == "C0") + codlocation = "CICCA"; + else if (coddep == "C1") + codlocation = "CMINT"; + else if (coddep == "X0") + codlocation = "COMMEX"; +} + + const TString & converti_codval(const TString & codval) { static TString4 _codval; @@ -922,11 +940,13 @@ void setformulavar() // se non e' un fantasma lo definisce come variante (distinta contenente una riga di tipo variabile) // se e' un finito, anche varianti di sconfezionamento if (ana.get(ANAMAG_GRMERC)[0]=='F') - //varvar << "IF(_IMPIANTO==\"XT\",_LINEA,IF(_LINEA?=\"??9??\",_LINEA,_IMPIANTO))" ; + //varvar << "IF(_IMPIANTO==\"XT\",_LINEA,IF(_LINEA?=\"??9??\",_LINEA,_IMPIANTO))" ; varvar << "IF((_IMPIANTO==\"XT\")||(_LINEA?=\"??9??\"),_LINEA,_IMPIANTO)" ; else varvar << "IF(_IMPIANTO==\"XT\",_LINEA,_IMPIANTO)" ; - if (varvar != dist.get("PARAMETRI")) + if (dist.get("PARAMETRI").blank() || + (varvar != dist.get("PARAMETRI") && + yesno_box("Setto la formula di %s\nattuale:%s;\nnuova :%s",(const char *)cod,(const char *)dist.get("PARAMETRI") ,(const char *)varvar))) { dist.put("PARAMETRI",varvar); dist.rewrite(); @@ -1032,13 +1052,48 @@ int inserisci_articolo(const char * codart, const char * um) art_ini.set("Action","INSERT"); if (um && *um) art_ini.set("Mode","AUTO"); + else + { + // cerca di capire la mejo unit' di misura + switch (*codart) + { + case '0': + case '1': + case '2': + case '3': + case '4': + um = "PZ"; + break; + case '5': + um = "CA"; + break; + case 'U': + switch (*(codart+1)) + { + case '0': + um = "KG"; + break; + case 'K': + if ((*(codart+2)) <= '9') + um = "CA"; + break; + } + break; + } + } art_ini.set("Firm","1"); art_ini.set_paragraph("47"); art_ini.set("CODART",codart); - art_ini.set("DESCR",format("--- descrizione art. %s ---", codart)); + art_ini.set("DESCR",format("*--- descrizione art. %s", codart)); + art_ini.set("CODIVA","20"); art_ini.set_paragraph("49,1"); - art_ini.set("UM",um); - art_ini.set("FC","1.0"); + if (um && *um) + { + art_ini.set("UM",um); + if (strcmp(um,"KG")==0 || strcmp(um,"GR")== 0) + art_ini.set("UMP",um); // unita' di misura del peso + art_ini.set("FC","1.0"); + } } TExternal_app *_gestart=NULL; if (_gestart==NULL) @@ -1066,16 +1121,21 @@ void TImport_file::put(const char *field, const char * val) { _f->put(field,val); } + TString & TImport_file::get(const char *field) { _sbuffer = _f->get(field); return _sbuffer.trim(); -} +} + TString & TImport_file::get_codice(const char *field) { _sbuffer = _f->get(field); _sbuffer.trim(); - + // special computing.... + if (_sbuffer == "U00254G") + _sbuffer = "U00254"; + return _sbuffer; } const real & TImport_file::get_real(const char *field) @@ -1118,9 +1178,9 @@ long TImport_file::items() } -int TImport_file::read() +int TImport_file::read(int mode) { - int err = _f->read(_isgteq); + int err = _f->read(mode); return err; } int TImport_file::write() @@ -1175,20 +1235,7 @@ TSupport_file::~TSupport_file() delete _cache; } -// ************************************** -/* -TTimed_skipbox:: TTimed_skipbox(const char * message,int seconds,int x,int y) - : TTimed_breakbox(message,seconds,x,y) -{ - hide(DLG_OK); - hide(DLG_CANCEL); - add_button(DLG_CANCEL, 0, "~Ignora", -22, -1, 12, 2,"",0); - add_button(DLG_OK, 0, "Im~porta", -12, -1, 12, 2,"",0); -} -TTimed_skipbox::~TTimed_skipbox() -{} -*/ bool number_box(const char * prompt, real & v) { TMask m("Input",1,60,10); @@ -1205,8 +1252,51 @@ const char * external_refnum(TImport_file &import) { static TString _wrk; _wrk=import.get("TCOM"); - while (_wrk[0]<'0' || _wrk[0]>'9') + while (_wrk[0] && (_wrk[0]<'0' || _wrk[0]>'9' || _wrk[0]=='/'|| _wrk[0]=='-'|| _wrk[0]=='.')) _wrk = _wrk.mid(1); int lenextdoc=_wrk.len(); - return lenextdoc > 6 ? _wrk.left(lenextdoc-6): _wrk; -} \ No newline at end of file + if (lenextdoc > 6) + _wrk.cut(lenextdoc-6); + _wrk.trim(); + if (_wrk.len()>7) + _wrk = _wrk.right(7); + if (atol(_wrk)==0L) + return ""; + return _wrk; +} +const char * external_refdate(TImport_file &import) +{ + static TString _wrk; + _wrk=import.get("TCOM"); + while (_wrk[0] && (_wrk[0]<'0' || _wrk[0]>'9' || _wrk[0]=='/'|| _wrk[0]=='-'|| _wrk[0]=='.')) + _wrk = _wrk.mid(1); + if (_wrk.len() < 6) + _wrk.cut(0); + else + { + _wrk = _wrk.right(6); + if (atol(_wrk)==0L) + return ""; + if (_wrk[5]=='9') + _wrk.insert("19",4); + else + _wrk.insert("20",4); + _wrk.insert("-",4); + _wrk.insert("-",2); + } + return _wrk; +} +long trascode_for(const long oldcod) +{ + static TExternisamfile *_trascofor=NULL; + if (_trascofor==NULL) + _trascofor=new TExternisamfile("TRS_FORN",TRUE, TRUE); + _trascofor->put("OLDCODE", oldcod); + if (_trascofor->read()==NOERR) + { + long newcod = _trascofor->get_long("newcode"); + return newcod > 0 ? newcod : oldcod; + } + return oldcod; +} + diff --git a/db/dbcv09.h b/db/dbcv09.h index e79a0c400..490c90104 100755 --- a/db/dbcv09.h +++ b/db/dbcv09.h @@ -41,7 +41,7 @@ public: bool eof(); long items(); int write(); - int read(); + int read(int mode); void zap(bool pack=FALSE); const char *name() {return _f->name();} TImport_file(const char *path, const char * name); @@ -63,23 +63,16 @@ public: }; -class TTimed_skipbox: public TTimed_breakbox -{ -public: - TTimed_skipbox(const char * message,int seconds,int x=40,int y=10); - ~TTimed_skipbox(); -}; - - bool number_box(const char * prompt, real & v); const char * external_refnum(TImport_file &import); +const char * external_refdate(TImport_file &import); void delete_files(const char *wildcard); bool force_write(TLocalisamfile & f); // individua il metodo a partire dalla locazione di magazzino (codice dep) int location2method(long location) ; long method2location(int method) ; -void coddep2location(const char * coddep, TString & codlocation) ; +void coddep2location(const char * codmag, const char * coddep, TString & codlocation, int & nummag) ; // codifica il nome del terzista const char * descr_method(int method) ; // aggiunge le lavorazioni standard @@ -111,4 +104,5 @@ int cod_mag2num_mag(TString & codmag); const TString & converti_codval(const TString & codval); void cambio_fisso(const TString & codval, real & val); int inserisci_articolo(const char * codart, const char * um); +long trascode_for(const long oldcod); diff --git a/db/dbcvlib.h b/db/dbcvlib.h new file mode 100755 index 000000000..65174b0aa --- /dev/null +++ b/db/dbcvlib.h @@ -0,0 +1,17 @@ +#ifndef __DBCVLIB_H +#define __DBCVLIB_H + +#ifndef __MGLIB_H +#include "../mg/mglib.h" +#endif + +// libreria per i movimenti +class TTimed_skipbox: public TTimed_breakbox +{ +public: + TTimed_skipbox(const char * message,int seconds,int x=40,int y=10); + ~TTimed_skipbox(); +}; + +#endif + diff --git a/db/dblib.cpp b/db/dblib.cpp index d367efbdc..e464a5f94 100755 --- a/db/dblib.cpp +++ b/db/dblib.cpp @@ -498,11 +498,73 @@ const char* TDistinta_tree::curr_um(TCodice_um& code) const return code; } -real TDistinta_tree::last_qta() const +real TDistinta_tree::last_qta(bool vis_ghost) const { - _path.get(-2, _tmp); - real val; _tmp.get(5, val); - return val; + const int last = _path.items()-1; + int from = last - 1; + TCodice_articolo art; + TCodice_um um; + real val; + real tot = 1.0; + TQuantita qta; + + if (!vis_ghost) + { + for (int i = from ; i >= 0; i--) + { + _path.get(i, _tmp); + if (_tmp.get_char(6) != 'G') + { + from = i + 1; + break; + } + } + } + if (from < 0) + from = 0; + + for (int i = 0; i <= last; i++) + { + _path.get(i, _tmp); + _tmp.get(5, val); + _tmp.get(0, art); + _tmp.get(4, um); + if (i > 0) + { + qta.set_val(val); + qta.convert2umdist(); + val = qta.val(); + } + qta.set(art, um, ZERO); + int tprec = tot.precision(); + int vprec = val.precision(); + if (tprec + vprec > 15) + { + while (tprec + vprec > 16) + { + if (tprec > vprec) + --tprec; + else + --vprec; + } + tot.round(tprec); + val.round(vprec); + } +#ifdef DBG + TString s(tot.string()); + TString s1(val.string()); +#endif + if (i >= from) + tot *= val; +#ifdef DBG + s = tot.string(); +#endif + if (tot.is_zero()) + break; + } + if (tot.precision() > 15) + tot.round(15); + return tot; } real TDistinta_tree::curr_qta() const @@ -1535,7 +1597,7 @@ static bool explode_callback(TTree& node, void* jolly, word when) if (ep._filter.find(type) < 0) return FALSE; - TRiga_esplosione* er = new TRiga_esplosione(tree); + TRiga_esplosione* er = new TRiga_esplosione(tree, ep._filter.find('G') >= 0); er->set_mat_base(is_leaf); ep._array->add(er); } @@ -1691,13 +1753,13 @@ TLavorazione *TDistinta_tree::find_labor(TRiga_esplosione *l) // TRiga_esplosione /////////////////////////////////////////////////////////// -void TRiga_esplosione::init(const TDistinta_tree& tree) +void TRiga_esplosione::init(const TDistinta_tree& tree, bool vis_ghost) { TCodice_articolo art; tree.curr_code(art); art.trim(); TCodice_um um; tree.curr_um(um); real val = tree.curr_qta(); set(art, um, val); - _last_qta = tree.last_qta(); // Puo' sempre servire anche questa + _last_qta = tree.last_qta(vis_ghost); // Puo' sempre servire anche questa tree.curr_giaclev(_giac); _tipo = tree.curr_type(); _sort = tree.curr_sort(); @@ -1727,9 +1789,9 @@ const char * TRiga_esplosione::father(const char * types) return _tmp_path; } -TRiga_esplosione::TRiga_esplosione(const TDistinta_tree& tree) +TRiga_esplosione::TRiga_esplosione(const TDistinta_tree& tree, bool vis_ghost) { - init(tree); + init(tree, vis_ghost); } TRiga_esplosione::TRiga_esplosione(const TRiga_esplosione& re) diff --git a/db/dblib.h b/db/dblib.h index 2ca0bc963..bceed0920 100755 --- a/db/dblib.h +++ b/db/dblib.h @@ -342,7 +342,7 @@ public: int curr_comp(TString& code) const; long curr_sort() const; const char* curr_um(TCodice_um& code) const; - real last_qta() const; + real last_qta(bool vis_ghost = FALSE) const; real curr_qta() const; int curr_depth() const { return path_depth(_path);} char curr_type() const { return path_type(_path);} @@ -391,7 +391,7 @@ class TRiga_esplosione : public TQuantita protected: virtual TObject* dup() const { return new TRiga_esplosione(*this); } - void init(const TDistinta_tree& tree); + void init(const TDistinta_tree& tree, bool vis_ghost = FALSE); public: const TToken_string& path() const { return _path; } @@ -410,7 +410,7 @@ public: const real& last_qta() const { return _last_qta; } TRiga_esplosione(); - TRiga_esplosione(const TDistinta_tree& tree); + TRiga_esplosione(const TDistinta_tree& tree, bool vis_ghost = FALSE); TRiga_esplosione(const TRiga_esplosione& re); virtual ~TRiga_esplosione() { } }; diff --git a/ef/dse.frm b/ef/dse.frm index dbf48bf4d..d6038a92d 100755 --- a/ef/dse.frm +++ b/ef/dse.frm @@ -203,6 +203,7 @@ BEGIN KEY "Codice valuta" PROMPT 0 0 "" FIELD 31->CODVAL + MESSAGE COPY,FL->4 FLAGS "H" END @@ -231,11 +232,18 @@ BEGIN PROMPT 5 2 "N. DOCUMENTI " END -NUMERO 3 18 +STRINGA 4 3 +BEGIN + KEY "Codice valuta" + PROMPT 0 0 "" + FLAGS "H" +END + +VALUTA 3 18 BEGIN KEY "Totale" PROMPT 115 2 "TOTALE " - PICTURE "###.###.###.###" + DRIVENBY 4 END END diff --git a/ef/ef0.url b/ef/ef0.url index 723392a62..d162431c9 100755 --- a/ef/ef0.url +++ b/ef/ef0.url @@ -1,6 +1,2 @@ #include - -/* ef0 -0 */ -MENU TASK_MENUBAR - SUBMENU MENU_FILE "~File" - +#include diff --git a/ef/ef0100c.uml b/ef/ef0100c.uml index e2c7091b3..d202159a9 100755 --- a/ef/ef0100c.uml +++ b/ef/ef0100c.uml @@ -3,18 +3,19 @@ PAGE "Righe Effetto" -1 -1 76 16 -NUMBER F_IMPEFF 16 2 +CURRENCY F_IMPEFF 16 BEGIN PROMPT 2 1 "Importo effetto " - PICTURE ".2" +// PICTURE ".2" // PICTURE "###.###.###,@@" // NUM_EXPR #F_IMPFATT>=#F_IMPEFF // WARNING "L'importo dell'effetto non puo' superare l'importo della fattura" END -NUMBER F_IMPEFFVAL 15 3 +CURRENCY F_IMPEFFVAL 15 BEGIN PROMPT 2 2 "Imp.effetto val. " + DRIVENBY -F_CODVAL PICTURE ".3" // PICTURE "###.###.###,@@@" // NUM_EXPR #F_IMPFATTVAL>=#F_IMPEFFVAL @@ -75,16 +76,17 @@ BEGIN PROMPT 2 7 "Data fattura " END -NUMBER F_IMPFATT 20 2 +CURRENCY F_IMPFATT 20 BEGIN PROMPT 2 8 "Importo fattura " - PICTURE "###.###.###.###,@@" +// PICTURE "###.###.###.###,@@" END -NUMBER F_IMPFATTVAL 20 3 +CURRENCY F_IMPFATTVAL 20 BEGIN PROMPT 2 9 "Imp. fatt. val " - PICTURE "###.###.###.###,@@@" + DRIVENBY -F_CODVAL +// PICTURE "###.###.###.###,@@@" END NUMBER F_ANNO 4 diff --git a/ef/ef0101.cpp b/ef/ef0101.cpp index 2401d9632..51f4e0182 100755 --- a/ef/ef0101.cpp +++ b/ef/ef0101.cpp @@ -229,45 +229,50 @@ bool TEffetto::fatt(long num) // restituisce i dati relativi alle fatture a cui si riferisce l'effetto // costruendo una TToken_string del tipo // "num_fatt0|data_fatt0|imp_fatt0|num_fatt1|data_fatt1|imp_fatt1|..." -TToken_string* TEffetto::dati_fatt(long num, const bool valuta) +TToken_string& TEffetto::dati_fatt(long num, const bool valuta, TToken_string& dati) { - TToken_string* dati= new TToken_string; - dati->cut(0); - - TLocalisamfile righe_eff(LF_REFFETTI); - righe_eff.put(REFF_NPROGTR, num); - righe_eff.read(); - int items = rows_r(); // prende il numero delle righe dell'effetto - for (int i = 1; i <= items; i++)// le legge tutte - { - dati->add(righe_eff.get(REFF_NFATT));//prende il numero - dati->add(righe_eff.get(REFF_DATAFATT));//prende la data - dati->add(righe_eff.get(valuta ? REFF_IMPFATTVAL : REFF_IMPFATT));//prende l' importo - righe_eff.next();// passa alla riga successiva - } - return dati; + dati.cut(0); + + TLocalisamfile righe_eff(LF_REFFETTI); + righe_eff.put(REFF_NPROGTR, num); + righe_eff.read(); + const int items = rows_r(); // prende il numero delle righe dell'effetto + for (int i = 1; i <= items; i++) // le legge tutte + { + dati.add(righe_eff.get(REFF_NFATT));//prende il numero + dati.add(righe_eff.get(REFF_DATAFATT));//prende la data + dati.add(righe_eff.get(valuta ? REFF_IMPFATTVAL : REFF_IMPFATT));//prende l'importo + righe_eff.next();// passa alla riga successiva + } + return dati; } // restituisce i dati relativi alle fatture a cui si riferisce l'effetto // costruendo una TToken_string del tipo // "codnum_fatt0|num_fatt0|anno_fatt0|codnum_fatt1|num_fatt1|anno_fatt1|..." -TToken_string* TEffetto::altridati_fatt(long num) +TToken_string& TEffetto::altridati_fatt(long num, TToken_string& dati) { - TToken_string* dati= new TToken_string; - dati->cut(0); - - TLocalisamfile righe_eff(LF_REFFETTI); - righe_eff.put(REFF_NPROGTR, num); - righe_eff.read(); - int items = rows_r(); // prende il numero delle righe dell'effetto - for (int i = 1; i <= items; i++)// le legge tutte - { - dati->add(righe_eff.get(REFF_CODNUM));//prende il codice numerazione - dati->add(righe_eff.get(REFF_NFATT));//prende il numero - dati->add(righe_eff.get(REFF_ANNODOC));//prende il numero - righe_eff.next();// passa alla riga successiva - } - return dati; + dati.cut(0); + + TLocalisamfile righe_eff(LF_REFFETTI); + righe_eff.put(REFF_NPROGTR, num); + righe_eff.read(); + const int items = rows_r(); // prende il numero delle righe dell'effetto + TString16 str; + for (int i = 1; i <= items; i++)// le legge tutte + { + str = righe_eff.get(REFF_CODNUM); str.trim(); + dati.add(str);//prende il codice numerazione + + str = righe_eff.get(REFF_NFATT); str.trim(); + dati.add(str);//prende il numero + + str = righe_eff.get(REFF_ANNODOC); str.trim(); + dati.add(str);//prende il numero + + righe_eff.next();// passa alla riga successiva + } + return dati; } const bool TEffetto::in_valuta() const diff --git a/ef/ef0101.h b/ef/ef0101.h index 84ee2f110..fe8775ee8 100755 --- a/ef/ef0101.h +++ b/ef/ef0101.h @@ -3,7 +3,7 @@ #ifndef __RECARRAY_H #include -#endif +#endif #include #include @@ -88,9 +88,9 @@ public: // restituisce true se l'effetto si riferisce ad una sola fattura bool fatt(long num); // restituisce i dati relativi alle fatture a cui si riferisce l'effetto - TToken_string* dati_fatt(long num, const bool valuta = FALSE); + TToken_string& dati_fatt(long num, const bool valuta, TToken_string& dati); // restituisce i dati codnum, ndoc, anno relativi alle fatture a cui si riferisce l'effetto - TToken_string* altridati_fatt(long num); + TToken_string& altridati_fatt(long num, TToken_string& dati); // costruttore di default TEffetto(); // costuisce l'effetto con il record passato diff --git a/ef/ef0300.cpp b/ef/ef0300.cpp index 158395357..1beb17b9c 100755 --- a/ef/ef0300.cpp +++ b/ef/ef0300.cpp @@ -229,8 +229,12 @@ int TVariazione_distinte::read(TMask& m) codice << eff.get_tipo(); codice << '|' << eff.get(EFF_CODCF); riga.add(cache().get(LF_CLIFO, codice, CLI_RAGSOC)); - codice = eff.get(EFF_CODABIP); codice << eff.get(EFF_CODCABP); - riga.add(cache().get("%BAN", codice, "S0")); + codice = eff.get(EFF_CODABI); + TString desc(cache().get("%BAN", codice, "S0")); + codice << eff.get(EFF_CODCAB); + desc << " " << cache().get("%BAN", codice, "S0"); + desc.cut(50); + riga.add(desc); if (eff.fatt(numero))// se l'effetto contiene solo una fattura { // metto i riferimenti al documento ed al numero di rata @@ -251,16 +255,16 @@ int TVariazione_distinte::read(TMask& m) //gestisco il controllo sulla presenza o meno di una valuta const TString16 codval(eff.get(EFF_CODVAL)); if (i == 0) - { - const bool valuta = codval.not_empty() && codval != TCurrency::get_firm_val(); + { + const bool valuta = ::is_true_value(codval); m.set(F_CODVAL, codval); m.enable(F_CODVAL, valuta); } riga.add(codval); - TCurrency soldi(eff.get_real(EFF_IMPORTO)); + const real soldi = eff.get_real(EFF_IMPORTO); riga.add(soldi.string()); - TCurrency soldival(eff.get_real(EFF_IMPORTOVAL), codval); - if (!soldival.get_num().is_zero()) + const real soldival = eff.get_real(EFF_IMPORTOVAL); + if (!soldival.is_zero()) riga.add(soldival.string()); shrighe.row(i) = riga; @@ -458,7 +462,6 @@ void TVariazione_distinte::carica_riba(int tipopag, const bool reset) TString16 codval = app()._msk->get(F_CODVAL); TString16 codtab; - if (codval.empty()) codval = "LIT"; int err, i = 0; err = eff.read(f, tipodist, ndist, nrigadist); @@ -476,10 +479,8 @@ void TVariazione_distinte::carica_riba(int tipopag, const bool reset) const char tipo = eff.get_tipo(); TString16 valuta = eff.get(EFF_CODVAL); - if (valuta.empty()) - valuta = "LIT"; - const bool valuta_ok = valuta == codval; + const bool valuta_ok = ::same_values(valuta, codval); const long numero = eff.get_long(EFF_NPROGTR); if (to_select && valuta_ok && !effetto_aggiunto(numero) && tipo == tipod) @@ -493,8 +494,12 @@ void TVariazione_distinte::carica_riba(int tipopag, const bool reset) codice << tipo << '|' << eff.get(EFF_CODCF); riga.add(cache().get(LF_CLIFO, codice, CLI_RAGSOC)); - codice = eff.get(EFF_CODABIP); codice << eff.get(EFF_CODCABP); - riga.add(cache().get("%BAN", codice, "S0")); + codice = eff.get(EFF_CODABI); + TString desc(cache().get("%BAN", codice, "S0")); + codice << eff.get(EFF_CODCAB); + desc << " " << cache().get("%BAN", codice, "S0"); + desc.cut(50); + riga.add(desc); if (eff.fatt(numero))// se l'effetto contiene solo una fattura { // metto i riferimenti al documento ed al numero di rata @@ -514,11 +519,11 @@ void TVariazione_distinte::carica_riba(int tipopag, const bool reset) } riga.add(valuta); - TCurrency soldi(eff.get_real(EFF_IMPORTO), "_FIRM"); + const real soldi = eff.get_real(EFF_IMPORTO); riga.add(soldi.string()); - TCurrency soldival(eff.get_real(EFF_IMPORTOVAL), codval); - if (!soldival.get_num().is_zero()) + const real soldival = eff.get_real(EFF_IMPORTOVAL); + if (!soldival.is_zero()) riga.add(soldival.string()); sf.row(i) = riga; @@ -582,9 +587,7 @@ bool TVariazione_distinte::imp_aut_handler(TMask_field& f, KEY k) real res = m2.get_real(F_TOTIMPDIST); if (res > ZERO) { // se i due importi sono diversi da zero - TString val = m->get(F_CODVAL); - if (val == "LIT") - val.cut(0); + TString16 val = m->get(F_CODVAL); int items = sf.items(); // cerca se esiste un effetto con importo uguale a quello // da caricare @@ -592,13 +595,12 @@ bool TVariazione_distinte::imp_aut_handler(TMask_field& f, KEY k) { TToken_string& row = sf.row(i); TString16 codval = row.get(sf.cid2index(F_VALUTA)); + codval.trim(); // se la valuta non appare o è lire faccio in modo che vengano // presi gli effetti con valuta inesistente - if (codval == " " || codval == "LIT") - codval.cut(0); - const bool valuta = codval.not_empty(); - const real imp(real::ita2eng(row.get(sf.cid2index(valuta ? F_IMPORTOVAL : F_IMPORTO)))); - if (imp == res && codval == val) + const bool valuta = ::is_true_value(codval); + const real imp(row.get(sf.cid2index(valuta ? F_IMPORTOVAL : F_IMPORTO))); + if (imp == res && ::same_values(codval, val)) { row.add('X', 0); res = ZERO; @@ -610,15 +612,14 @@ bool TVariazione_distinte::imp_aut_handler(TMask_field& f, KEY k) { TToken_string& row = sf.row(i); TString16 codval = row.get(sf.cid2index(F_VALUTA)); - if (codval == " " || codval == "LIT") - codval.cut(0); - const bool valuta = codval.not_empty(); - const real imp(real::ita2eng(row.get(sf.cid2index(valuta ? F_IMPORTOVAL : F_IMPORTO)))); + codval.trim(); + const bool valuta = ::is_true_value(codval) ; + const real imp(row.get(sf.cid2index(valuta ? F_IMPORTOVAL : F_IMPORTO))); // se l'importo, della riga corrente dello sheet, è minore // dell 'importo che si deve caricare e se lo rimane anche // sommato all'importo già selezionato, si procede a rendere // la riga selezionata per il caricamento - if (codval == val && imp <= res) + if (::same_values(codval, val) && imp <= res) { row.add('X',0); res -= imp; @@ -805,7 +806,8 @@ void TVariazione_distinte::calcola_totale() const int items = sf.items(); real impdist; const TString16 codval = m->get(F_CODVAL); - const bool valuta = codval.not_empty() && codval != "LIT"; + const bool valuta = ::is_true_value(codval); + for (int i = 0; i < items; i++) { TToken_string& row = sf.row(i); @@ -814,7 +816,7 @@ void TVariazione_distinte::calcola_totale() if (*row.get(0) != 'X') // valido (not to delete) { - const real imp(row.get(sf.cid2index(valuta ? F_IMPORTOVAL : F_IMPORTO))); + const real imp = row.get(sf.cid2index(valuta ? F_IMPORTOVAL : F_IMPORTO)); impdist += imp; } } @@ -832,7 +834,8 @@ void TVariazione_distinte::calcola() real impsel; const real imp_pres = m->get_real(F_TOTIMP); const TString16 codval = m->get(F_CODVAL); - const bool valuta = codval.not_empty() && codval != "LIT"; + const bool valuta = ::is_true_value(codval); + for (int i = 0; i < items; i++) { TToken_string& row = sf.row(i); @@ -840,7 +843,7 @@ void TVariazione_distinte::calcola() // selezionato if (*row.get(0) == 'X') { - const real imp(real::ita2eng(row.get(sf.cid2index(valuta ? F_IMPORTOVAL : F_IMPORTO)))); + const real imp = row.get(sf.cid2index(valuta ? F_IMPORTOVAL : F_IMPORTO)); impsel += imp; } } @@ -870,6 +873,8 @@ void TVariazione_distinte::aggiungi() app().end_wait(); m2->reset(F_TOTIMPDIST); m2->reset(F_IMPSEL); + const TString16 codval = m->get(F_CODVAL); + m2->set(F_CODVALS, codval); m2->run(); calcola_totale(); } diff --git a/ef/ef0300.h b/ef/ef0300.h index 4e3acd809..ccac5f993 100755 --- a/ef/ef0300.h +++ b/ef/ef0300.h @@ -27,6 +27,7 @@ #define F_SHEET 204 #define F_TOTIMPDIST 205 #define F_IMPSEL 206 +#define F_CODVALS 207 // Identificatori campi per lo spreadsheet Righe Distinta (ef0300b.uml ed ef0300d.uml) #define F_CHECK 101 diff --git a/ef/ef0300a.uml b/ef/ef0300a.uml index 1de0beb26..fbd48dc13 100755 --- a/ef/ef0300a.uml +++ b/ef/ef0300a.uml @@ -90,7 +90,7 @@ BEGIN OUTPUT F_CODABIP CODTAB[1,5] OUTPUT F_CODCABP CODTAB[6,10] OUTPUT F_DENBANP 100@->S0 - CHECKTYPE REQUIRED + CHECKTYPE SEARCH END NUMBER F_CODCABP 5 0 @@ -99,12 +99,14 @@ BEGIN FIELD LF_EFFETTI->CODCABP FLAGS "RZ" COPY ALL F_CODABIP + CHECKTYPE REQUIRED END STRING F_DENBANP 50 BEGIN PROMPT 2 5 "Banca di Presentazione " - USE %BAN KEY 2 + USE %BAN KEY 2 SELECT 100@->CODTAB!="" + JOIN BNP ALIAS 100 INTO CODTAB==CODTAB INPUT S0 F_DENBANP DISPLAY "Denominazione@50" S0 DISPLAY "Codice ABI" CODTAB[1,5] @@ -112,7 +114,7 @@ BEGIN OUTPUT F_CODABIP CODTAB[1,5] OUTPUT F_CODCABP CODTAB[6,10] OUTPUT F_DENBANP S0 - CHECKTYPE REQUIRED + CHECKTYPE NORMAL END LIST F_TIPOPAG 24 diff --git a/ef/ef0300b.uml b/ef/ef0300b.uml index d714c5b4e..4305165f1 100755 --- a/ef/ef0300b.uml +++ b/ef/ef0300b.uml @@ -1,7 +1,7 @@ // DEFINIZIONE MASCHERE, PER RIGHE DISTINTA, PER LA GESTIONE DISTINTE #include "ef0300.h" -PAGE "Righe Distinta" -1 -1 63 14 +PAGE "Righe Distinta" -1 -1 73 14 BOOLEAN F_CHECK BEGIN @@ -22,13 +22,13 @@ BEGIN FLAGS "D" END -STRING F_CLIENTE 50 40 +STRING F_CLIENTE 50 BEGIN PROMPT 2 4 "Cliente " FLAGS "D" END -STRING F_BANCA 50 40 +STRING F_BANCA 50 BEGIN PROMPT 2 5 "Banca d'appoggio " FLAGS "D" diff --git a/ef/ef0300c.uml b/ef/ef0300c.uml index 7ac706f0f..e2f21a0c2 100755 --- a/ef/ef0300c.uml +++ b/ef/ef0300c.uml @@ -42,16 +42,22 @@ BEGIN ITEM "Importo Val." END -NUMBER F_TOTIMPDIST 18 2 +STRING F_CODVALS 3 BEGIN - PROMPT 2 17 "Importo " - PICTURE "###.###.###.###,@@" + PROMPT 2 17 "" + FLAGS "H" END -NUMBER F_IMPSEL 18 2 +CURRENCY F_TOTIMPDIST 18 +BEGIN + PROMPT 2 17 "Importo " + DRIVENBY F_CODVALS +END + +CURRENCY F_IMPSEL 18 BEGIN PROMPT 37 17 "Importo Selezionato " - PICTURE "###.###.###.###,@@" + DRIVENBY F_CODVALS END BUTTON DLG_OK 9 2 diff --git a/ef/ef0300d.uml b/ef/ef0300d.uml index 89c3f82b6..f74f9121b 100755 --- a/ef/ef0300d.uml +++ b/ef/ef0300d.uml @@ -1,7 +1,7 @@ // DEFINIZIONE MASCHERE, PER RIGHE DISTINTA, PER LA GESTIONE DISTINTE #include "ef0300.h" -PAGE "Righe Distinta" -1 -1 63 14 +PAGE "Righe Distinta" -1 -1 73 14 BOOLEAN F_CHECK BEGIN @@ -22,13 +22,13 @@ BEGIN FLAGS "D" END -STRING F_CLIENTE 50 40 +STRING F_CLIENTE 50 BEGIN PROMPT 2 4 "Cliente " FLAGS "D" END -STRING F_BANCA 50 40 +STRING F_BANCA 50 BEGIN PROMPT 2 5 "Banca d'appoggio " FLAGS "D" @@ -62,18 +62,19 @@ BEGIN FLAGS "D" END -STRING F_IMPORTO 18 +CURRENCY F_IMPORTO 18 BEGIN PROMPT 2 10 "Importo " FIELD LF_EFFETTI->IMPORTO - FLAGS "DR" + FLAGS "D" END -STRING F_IMPORTOVAL 18 +CURRENCY F_IMPORTOVAL 18 BEGIN PROMPT 2 11 "Importo Val. " FIELD LF_EFFETTI->IMPORTOVAL - FLAGS "DR" + FLAGS "D" + DRIVENBY F_VALUTA END BUTTON DLG_OK 9 2 diff --git a/ef/ef0500.cpp b/ef/ef0500.cpp index 8094735fc..116e9991d 100755 --- a/ef/ef0500.cpp +++ b/ef/ef0500.cpp @@ -65,7 +65,7 @@ protected: static bool annulla_handler(TMask_field& f, KEY k); public: - int base_no() { return _base_page_no; } + int base_no() const { return _base_page_no; } const TMask& msk() const { return *_msk; } const TRelation& firm_rel() const { return *_firmrel; } @@ -156,6 +156,7 @@ bool TEmissione::create() _rel->add("%BAN", "CODTAB=CODABI+CODCAB", 1, 0, 402); _rel->add(LF_COMUNI, "STATO=STATOCF|COM=COMCF",1,LF_CLIFO); _rel->add(LF_COMUNI, "STATO=STATO|COM=COM", 1, LF_INDSP, 213); + _rel->add("BNP", "CODTAB=CODABIP+CODCABP", 1, 0, 403); _cur = NULL; _msk->set(F_NOMEFILE,RIBAFILENAME); // _trasfile = new TRiba_file(RIBAFILENAME, "riba.ini"); @@ -327,6 +328,16 @@ void TEmissione::footer_ef() TRecord_text rec; *_cur = 0; rec.set_type("EF"); + + if (!_trasfile->tracciato_setif()) + { + TTracciato_record * trec = _trasfile->t_rec("EF"); + const int p1 = trec->get(7).position(); + const int p2 = trec->get(8).position(); + + trec->get(7).set_position(p2); + trec->get(8).set_position(p1); + } _trasfile->autoload(rec, *_cur); _trasfile->write(rec); _trasfile->write_file()->seekp(0, ios::end); @@ -640,7 +651,7 @@ bool TRiba_form::validate(TForm_item &cf, TToken_string &s) long num = effetto.numero(); const bool in_valuta = effetto.in_valuta(); bool condition = (effetto.fatt(num));//TRUE se effetto non raggruppato - TToken_string* dati = effetto.dati_fatt(num, in_valuta); + TToken_string dati; effetto.dati_fatt(num, in_valuta, dati); TString in(s.get()); if (in[0]=='!') { @@ -656,13 +667,13 @@ bool TRiba_form::validate(TForm_item &cf, TToken_string &s) // "!DATIFATT" stampa numero e data fattura delle fatture a cui si riferisce l'effetto if (in == "DATIFATT") { - int elem = dati->items(); + int elem = dati.items(); TString descfatt; for (int i = 0; i < elem; i+=3) { - descfatt << dati->get(i); + descfatt << dati.get(i); descfatt << ' '; - descfatt << dati->get(i+1); + descfatt << dati.get(i+1); descfatt << '\n'; } cf.set(descfatt); @@ -672,7 +683,7 @@ bool TRiba_form::validate(TForm_item &cf, TToken_string &s) { if (condition) { - real importo(dati->get(2)); + real importo(dati.get(2)); cf.set(importo.string()); } } @@ -862,8 +873,8 @@ bool TDistinta_form::validate(TForm_item &cf, TToken_string &s) // "!DATI" numero e data fattura TEffetto effetto(cursor()->file().curr()); //= eff.curr(); long num = effetto.numero(); - TToken_string* dati = effetto.dati_fatt(num); - const int elem = dati->items(); + TToken_string dati; effetto.dati_fatt(num, FALSE, dati); + const int elem = dati.items(); TString80 in(s.get()); // prende il primo parametro, il codice del messaggio if (in[0]=='!') { @@ -874,9 +885,9 @@ bool TDistinta_form::validate(TForm_item &cf, TToken_string &s) TString descfatt; for (int i = 0; i < elem; i+=3) { - descfatt << dati->get(i); + descfatt << dati.get(i); descfatt << ' '; - descfatt << dati->get(i+1); + descfatt << dati.get(i+1); descfatt << '\n'; } cf.set(descfatt); @@ -1082,49 +1093,51 @@ void TRiba_file::validate(TCursor& cur,TRecord_text &rec, TToken_string &s, TStr TString descfatt; if (tracciato_setif()) { - TToken_string* dati = effetto.dati_fatt(num); - int elem = dati->items(); - for (int i = 0; i < elem; i+=3) - { - descfatt << dati->get(i); - descfatt << " "; - descfatt << dati->get(i+1); - descfatt << " "; - } - } - else - { - TToken_string* dati = effetto.altridati_fatt(num); - int elem = dati->items(); - for (int i = 0; i < elem; i+=3) - { - if (i!=0) - descfatt << "/"; - descfatt << dati->get(i); // codnum - descfatt << " "; - descfatt << dati->get(i+1); // numdoc - descfatt << " "; - TString16 anno = dati->get(i+2); // anno (2 cifre) - anno.trim(); - if (anno.len() > 2) - descfatt << anno.right(2); - else - descfatt << anno.rpad(2); - } - } - int l = descfatt.len(); + TToken_string dati; effetto.dati_fatt(num, FALSE, dati); + int elem = dati.items(); + for (int i = 0; i < elem; i+=3) + { + descfatt << dati.get(i); + descfatt << " "; + descfatt << dati.get(i+1); + descfatt << " "; + } + } + else + { + TToken_string dati; effetto.altridati_fatt(num, dati); + int elem = dati.items(); + TString16 str; + for (int i = 0; i < elem; i+=3) + { + if (i!=0) + descfatt << "/"; + str = dati.get(i); str.trim(); // codnum + if (str.not_empty()) descfatt << str << ' '; + + str = dati.get(); str.trim(); // numdoc + if (str.not_empty()) descfatt << str; + + str = dati.get(i); // anno (2 cifre) + str.trim(); + if (str.len() >= 2) + descfatt << ' ' << str.right(2); + } + } + const int l = descfatt.len(); TString in(s.get()); if (in[0]=='!') { in.ltrim(1); if (in == "1") { - valore = descfatt.left(40); - valore.trim(); + valore = descfatt.left(40); + valore.trim(); } if (in == "2") { - valore = descfatt.mid(40, l); + valore = descfatt.mid(40, l); + valore.trim(); } } } diff --git a/ef/ef0600.cpp b/ef/ef0600.cpp index 6a281bf58..f32eb0a73 100755 --- a/ef/ef0600.cpp +++ b/ef/ef0600.cpp @@ -560,17 +560,17 @@ bool TPrint_effetti_app::preprocess_page(int file, int counter) // prendo dall'effetto tutti i dati relativi alle fatture, che // vengono inseriti nella Token_String nell'ordine // NUMERO FATTURA|DATA FATTURA|IMPORTO FATTURA - TToken_string* dati = effetto.dati_fatt(num); - int elem = dati->items(); + TToken_string dati; effetto.dati_fatt(num, FALSE, dati); + int elem = dati.items(); if (elem > 3) { TString descfatt; int j=3; for (int i = 3; i < elem; i+=3) { - descfatt = dati->get(i+1);// prendo la data della fattura + descfatt = dati.get(i+1);// prendo la data della fattura descfatt << " "; - descfatt << dati->get(i);// prendo il numero della fattura + descfatt << dati.get(i);// prendo il numero della fattura _pr.reset(); if (_pr_type == st_scadenza || _pr_type == st_cliente ) _pr.put(descfatt, 111); diff --git a/m770/770.url b/m770/770.url index b6d43c1e8..237219453 100755 --- a/m770/770.url +++ b/m770/770.url @@ -1,12 +1,4 @@ #include - -MENU TASK_MENUBAR - SUBMENU MENU_FILE "~File" - -MENUBAR MENU_BAR(1) - -MENU MENU_BAR(1) - SUBMENU MENU_FILE "~File" - +#include diff --git a/m770/770100.cpp b/m770/770100.cpp index 2e05ae962..0ce17702b 100755 --- a/m770/770100.cpp +++ b/m770/770100.cpp @@ -782,6 +782,8 @@ bool TSchedaPercipienti::check_competenza(TMask_field& f, KEY k) // bool TSchedaPercipienti::check_handler(TMask_field& f, KEY k) { + const int fdec = TCurrency::get_firm_dec(); + if (k == K_ENTER) { TMask& m = f.mask(); @@ -831,8 +833,8 @@ bool TSchedaPercipienti::check_handler(TMask_field& f, KEY k) app()._tot_vers += versato; } - app()._tot_rit.round(0); - app()._tot_vers.round(0); + app()._tot_rit.round(fdec); + app()._tot_vers.round(fdec); // memorizzo i totali ritenute pagate/versate m.set(F_RITOPE, app()._tot_rit); @@ -1778,19 +1780,20 @@ Pag_struct& TSchedaPercipienti::calcola_riga_pag(Pag_struct& s, const real h_PercAssImpInps, const real h_PercCommitInps) { + const int fdec = TCurrency::get_firm_dec(); // azzera struttura di valori calcolati clear_struct(c); // calcolo CPA c.impcpa = (s.compenso * h_PercCassaPrev) / (100.00 + h_PercCassaPrev); - c.impcpa.round(); + c.impcpa.round(fdec); if (s.impcpa == ZERO || force) s.impcpa = c.impcpa; // calcolo imponibile c.imponibile = ((s.compenso - s.impcpa) * h_PercAssImp) / 100.00; - c.imponibile.round(); + c.imponibile.round(fdec); if (s.imponibile == ZERO || force) s.imponibile = c.imponibile; @@ -1800,7 +1803,7 @@ Pag_struct& TSchedaPercipienti::calcola_riga_pag(Pag_struct& s, // calcolo ritenuta lorda c.ritlorda = (s.imponibile * s.perc) / 100.00; - c.ritlorda.round(); + c.ritlorda.round(fdec); s.ritlorda = c.ritlorda; // calcolo totale detrazioni @@ -1820,7 +1823,7 @@ Pag_struct& TSchedaPercipienti::calcola_riga_pag(Pag_struct& s, // calcolo contributo Inps complessivo c.ctssncomp = (((s.compenso * s.alqimp10) / 100.00) * h_PercInps) / 100.00; - c.ctssncomp.round(); + c.ctssncomp.round(fdec); if (s.ctssncomp == ZERO || force) s.ctssncomp = c.ctssncomp; @@ -1829,7 +1832,7 @@ Pag_struct& TSchedaPercipienti::calcola_riga_pag(Pag_struct& s, c.ctssnperc = s.ctssncomp - ((s.ctssncomp * 2) / 3); else c.ctssnperc = s.ctssncomp - ((s.ctssncomp * h_PercCommitInps) / 100.00); - c.ctssnperc.round(); + c.ctssnperc.round(fdec); if (s.ctssnperc == ZERO || force) s.ctssnperc = c.ctssnperc; @@ -1839,7 +1842,7 @@ Pag_struct& TSchedaPercipienti::calcola_riga_pag(Pag_struct& s, // calcolo ritenute utili pagati c.ritutpag = (s.utpagati * s.perc) / 100.00; - c.ritutpag.round(); + c.ritutpag.round(fdec); if (s.ritutpag == ZERO || force) s.ritutpag = c.ritutpag; if (abs(s.ritutpag) > abs(s.ritenuta)) @@ -1875,40 +1878,6 @@ Pag_struct& TSchedaPercipienti::calcola_riga_pag(Pag_struct& s, TSheet_field& TSchedaPercipienti::enable_pag_sheet(TMask& m, const TString& quadro) const { TSheet_field* s = NULL; -// procedura originale -/* TSheet_field& s_C = (TSheet_field&)m.field(F_PAGAMENTI_C); - if (quadro == "C") - { - s_C.show(); - s = &s_C; - } - else s_C.hide(); - - TSheet_field& s_D = (TSheet_field&)m.field(F_PAGAMENTI_D); - if (quadro == "D" || quadro == "D1" || quadro == "E" || quadro == "E1") - { - s_D.show(); - s = &s_D; - } - else s_D.hide(); - - TSheet_field& s_DB = (TSheet_field&)m.field(F_PAGAMENTI_DB); - if (quadro == "DB") - { - s_DB.show(); - s = &s_DB; - } - else s_DB.hide(); - - TSheet_field& s_G = (TSheet_field&)m.field(F_PAGAMENTI_G); - if (quadro == "G") - { - s_G.show(); - s = &s_G; - } - else s_G.hide(); -*/ - TSheet_field& s_C = (TSheet_field&)m.field(F_PAGAMENTI_C); if (quadro == "SC" || quadro == "SE") { diff --git a/m770/770102.cpp b/m770/770102.cpp index 28492b265..2bf1e2d92 100755 --- a/m770/770102.cpp +++ b/m770/770102.cpp @@ -3,8 +3,6 @@ #include "770102.h" #include -HIDDEN TString80 tmp1, tmp2; - void TSchedaPercipienti::init_mask(TMask& m) { update_lasts(m); @@ -265,20 +263,28 @@ void TSchedaPercipienti::load_pag_sheet(const long numvers) continue; const long npag = i; - const int LARGHEZZA_COL = 15; + TString80 dep; + d->add(" "); // 0 spazio per la 'X' di selezione - TString dep(riga.get(token_pos("DATAPAG"))); + + dep = riga.get(token_pos("DATAPAG")); d->add(dep); // 1 data pagamento + comp = riga.get(token_pos("COMPENSO")); - dep = comp.string("."); + const TCurrency soldi_compenso(comp); + dep = soldi_compenso.string(TRUE); dep.right_just(LARGHEZZA_COL); d->add(dep); // 2 compenso + ritpag = riga.get(token_pos("RITENUTA")); - dep = ritpag.string("."); + const TCurrency soldi_ritenuta(ritpag); + dep = soldi_ritenuta.string(TRUE); dep.right_just(LARGHEZZA_COL); d->add(dep); // 3 ritenuta + d->add(i); // 4 numero riga + d->add(nvers); // 5 numero versamento collegato _pags->add(*d); // aggiungo la riga nell'array_sheet @@ -847,8 +853,8 @@ bool TSchedaPercipienti::pag_standard_handler(TMask_field& f, KEY k) // controllo CPA if (name == "IMPCPA") { - if ((d_codqua != "SF" && d_codqua != "SG") && s.impcpa != ZERO) - return f.error_box("CPA valido solo per causali con quadro SF e SG"); + if ((d_codqua != "SC") && s.impcpa != ZERO) + return f.error_box("CPA valido solo per causali con quadro SC"); if (abs(s.impcpa) > abs(s.compenso)) return f.error_box("CPA maggiore del compenso"); } diff --git a/m770/770200.cpp b/m770/770200.cpp index 8ad4c56c3..e27287fc0 100755 --- a/m770/770200.cpp +++ b/m770/770200.cpp @@ -2,13 +2,13 @@ #include #include -#include -#include -#include -#include -#include -#include +#include #include +#include +#include +#include +#include +#include #include "77lib.h" #include "770200a.h" @@ -16,7 +16,7 @@ class TVersa_rit : public TApplication { private: - TLink770 _coll; + TLink770 _coll; real _versato; TRelation* _rel; TCursor* _cur; @@ -27,8 +27,8 @@ class TVersa_rit : public TApplication TLocalisamfile* _perc, *_scperc, *_rpag, *_rver; TAssoc_array _apags; // Estremi versamento - TString16 _data, _serie, _numero; - char _luogo, _tipo; + TString16 _data, _serie, _numero; + char _luogo, _tipo; void add(const long codditta, char tipoa, const long codanagr, const int nprog, TToken_string& rriga); @@ -64,8 +64,8 @@ class TVersa_rit : public TApplication char tipoa,const long codanagr,const int nprog); TCursor* meik_curs(TRelation* rel); bool do_all(); - void build_schede_sheet(const long codditta); - void build_pagam_sheet(const long codditta); + void build_schede_sheet(const long codditta); + void build_pagam_sheet(const long codditta); public: TVersa_rit() {} @@ -90,10 +90,10 @@ bool TVersa_rit::create() // (lo lascio per eventuali prove) // real totdocla = ZERO; // real spesela = ZERO; -// real compensola = ZERO; -// real impostela = ZERO; -// real ritenutela = 70000; -// TToken_string s(80); +// real compensola = ZERO; +// real impostela = ZERO; +// real ritenutela = 70000; +// TToken_string s(80); // s.add(4); // s.add("M"); // s.add("F"); @@ -138,16 +138,16 @@ bool TVersa_rit::create() _sheet_perc = new TCursor_sheet(_cur, - " |TIPOA|CODANAGR|6->RAGSOC", - "Selezione percipienti", + " |TIPOA|CODANAGR|6->RAGSOC", + "Selezione percipienti", "@1|Tipo|Codice|Ragione sociale@50", 8, 3); _schede = new TArray_sheet(3, 3, -3, -3, - "Selezione schede", - "@1|T|Codice|Scheda n.|Data@10|Ragione@50"); + "Selezione schede", + "@1|T|Codice|Scheda n.|Data@10|Ragione@50"); _pagam = new TArray_sheet(3, 3, -3, -3, - "Selezione ritenute da versare", - "@1|T|Codice|Scheda n.|Riga n.|Ritenuta@15"); + "Selezione ritenute da versare", + "@1|T|Codice|Scheda n.|Riga n.|Ritenuta@18R"); _apags.destroy(); dispatch_e_menu (BAR_ITEM(1)); @@ -359,7 +359,8 @@ void TVersa_rit::build_pagam_sheet(const long codditta) while ( (nriga = tpag->get_int()) != 0 ) // le righe partono da 1 { - real da_versare(tpag->get()); // leggo importo rimasto da versare + const real da_versare = tpag->get(); // leggo importo rimasto da versare + const TCurrency k(da_versare); TToken_string rr(100); rr.add(" "); // Spazio per selezionare @@ -368,7 +369,7 @@ void TVersa_rit::build_pagam_sheet(const long codditta) // rr.add(ragsoc); rr.add(nprog); rr.add(nriga); - rr.add(da_versare.string()); + rr.add(k.string(TRUE)); _pagam->add(rr); } } @@ -424,9 +425,9 @@ void TVersa_rit::build_schede_sheet(const long codditta) bool TVersa_rit::do_all() { KEY kp; - long items = 0L; + long items = 0L; - // esecuzione prima maschera: richiesta estremi versamento + // esecuzione prima maschera: richiesta estremi versamento kp = _msk->run(); if (kp != K_ENTER) diff --git a/m770/770200a.uml b/m770/770200a.uml index 95bbc8ab5..a01d851a2 100755 --- a/m770/770200a.uml +++ b/m770/770200a.uml @@ -162,7 +162,7 @@ BEGIN GROUP 1 2 3 4 5 END -NUMBER F_VERSATO 15 +CURRENCY F_VERSATO 15 BEGIN PROMPT 2 10 "Importo versato " PICTURE "." @@ -171,12 +171,12 @@ BEGIN CHECKTYPE REQUIRED END -BUTTON DLG_OK 9 2 +BUTTON DLG_OK 10 2 BEGIN PROMPT -12 -1 "" END -BUTTON DLG_CANCEL 9 2 +BUTTON DLG_CANCEL 10 2 BEGIN PROMPT -22 -1 "" END diff --git a/m770/771200b.uml b/m770/771200b.uml index b5840c67b..c79640467 100755 --- a/m770/771200b.uml +++ b/m770/771200b.uml @@ -200,7 +200,7 @@ BEGIN PROMPT 2 14 "19 Somme assoggettate ai contributi previd.e assist." END -NUMBER F_QASACTRPA LENIMP +CURRENCY F_QASACTRPA LENIMP BEGIN PROMPT STDIMP 14 "" FIELD LF_QUAA->QASACTRPA @@ -212,7 +212,7 @@ BEGIN PROMPT 2 15 "20 Somme assoggettate a C.s.s.n." END -NUMBER F_AIFCSSN49 LENIMP +CURRENCY F_AIFCSSN49 LENIMP BEGIN PROMPT STDIMP 15 "" FIELD LF_QUAA->AIFCSSN @@ -261,7 +261,7 @@ BEGIN PROMPT 2 4 "21 Contributi previdenz.ed assist.obblig.lav.dip." END -NUMBER F_COBBDIP21 LENIMP +CURRENCY F_COBBDIP21 LENIMP BEGIN PROMPT STDIMP 4 "" FIELD LF_QUAA->COBBDIP @@ -273,7 +273,7 @@ BEGIN PROMPT 2 5 "22 Contributi previdenza complementare ex D.Lgs.124/93" END -NUMBER F_QAEXCTRPC LENIMP +CURRENCY F_QAEXCTRPC LENIMP BEGIN PROMPT STDIMP 5 "" FIELD LF_QUAA->QAEXCTRPC @@ -285,7 +285,7 @@ BEGIN PROMPT 2 6 "23 Contributi lavoratore dipendente ex D.Lgs.579/95" END -NUMBER F_QAEXCTRLD LENIMP +CURRENCY F_QAEXCTRLD LENIMP BEGIN PROMPT STDIMP 6 "" FIELD LF_QUAA->QAEXCTRLD @@ -297,7 +297,7 @@ BEGIN PROMPT 2 7 "24 Somme e valori non assoggettati a ritenuta" END -NUMBER QAF_SVNSOGRIT LENIMP +CURRENCY QAF_SVNSOGRIT LENIMP BEGIN PROMPT STDIMP 7 "" FIELD LF_QUAA->NORIT @@ -309,7 +309,7 @@ BEGIN PROMPT 2 8 "25 Erogazioni spese sanitarie (detrazioni importo interno)" END -NUMBER F_QAERGSAN LENIMP +CURRENCY F_QAERGSAN LENIMP BEGIN PROMPT STDIMP 8 "" FIELD LF_QUAA->QAERGSAN @@ -321,7 +321,7 @@ BEGIN PROMPT 2 9 "26 Erogazioni spese sanitarie (detrazioni importo parziale)" END -NUMBER F_ERSPSAN41 LENIMP +CURRENCY F_ERSPSAN41 LENIMP BEGIN PROMPT STDIMP 9 "" FIELD LF_QUAA->ERSPSAN @@ -333,7 +333,7 @@ BEGIN PROMPT 2 10 "27 Premi di assicurazione vita e infortuni" END -NUMBER F_PRASSVI42 LENIMP +CURRENCY F_PRASSVI42 LENIMP BEGIN PROMPT STDIMP 10 "" FIELD LF_QUAA->PRASSVI @@ -345,7 +345,7 @@ BEGIN PROMPT 2 11 "28 Contributi previd.complementare ex art.15,c.8,L.335/95" END -NUMBER F_CONPRECO43 LENIMP +CURRENCY F_CONPRECO43 LENIMP BEGIN PROMPT STDIMP 11 "" FIELD LF_QUAA->CONPRECO @@ -357,7 +357,7 @@ BEGIN PROMPT 2 12 "29 Retribuzioni e pensioni" END -NUMBER F_DENARO LENIMP +CURRENCY F_DENARO LENIMP BEGIN PROMPT STDIMP 12 "" FIELD LF_QUAA->DENARO @@ -369,7 +369,7 @@ BEGIN PROMPT 2 13 "30 Assegni e indennità erogati da enti previdenz.e assist." END -NUMBER F_AIEREP23 LENIMP +CURRENCY F_AIEREP23 LENIMP BEGIN PROMPT STDIMP 13 "" FIELD LF_QUAA->AIENTIPREV @@ -381,7 +381,7 @@ BEGIN PROMPT 2 14 "31 Compensi da terzi" END -NUMBER F_CCTAMMCONT LENIMP +CURRENCY F_CCTAMMCONT LENIMP BEGIN PROMPT STDIMP 14 "" FIELD LF_QUAA->CCTAMMCONT @@ -393,7 +393,7 @@ BEGIN PROMPT 2 15 "32 Imponibile" END -NUMBER F_QAIMPON LENIMP +CURRENCY F_QAIMPON LENIMP BEGIN PROMPT STDIMP 15 "" FIELD LF_QUAA->QAIMPON @@ -405,7 +405,7 @@ BEGIN PROMPT 2 16 "33 Imposta corrispondente al totale imponibile" END -NUMBER F_ICTOTIMP30 LENIMP +CURRENCY F_ICTOTIMP30 LENIMP BEGIN PROMPT STDIMP 16 "" FIELD LF_QUAA->ICTOTIMP @@ -454,7 +454,7 @@ BEGIN PROMPT 2 4 "34 Detrazioni per coniuge a carico" END -NUMBER F_DETCC LENIMP +CURRENCY F_DETCC LENIMP BEGIN PROMPT STDIMP 4 "" FIELD LF_QUAA->DETCC @@ -466,7 +466,7 @@ BEGIN PROMPT 2 5 "35 Detrazioni per figli a carico" END -NUMBER F_DETFC LENIMP +CURRENCY F_DETFC LENIMP BEGIN PROMPT STDIMP 5 "" FIELD LF_QUAA->DETFC @@ -478,7 +478,7 @@ BEGIN PROMPT 2 6 "36 Detrazioni per altri familiari a carico" END -NUMBER F_DETAF LENIMP +CURRENCY F_DETAF LENIMP BEGIN PROMPT STDIMP 6 "" FIELD LF_QUAA->DETAF @@ -490,7 +490,7 @@ BEGIN PROMPT 2 7 "37 Detrazioni per lavoro dipendente" END -NUMBER F_DETLD LENIMP +CURRENCY F_DETLD LENIMP BEGIN PROMPT STDIMP 7 "" FIELD LF_QUAA->DETLD @@ -502,7 +502,7 @@ BEGIN PROMPT 2 8 "38 Detrazioni per oneri" END -NUMBER F_DETO LENIMP +CURRENCY F_DETO LENIMP BEGIN PROMPT STDIMP 8 "" FIELD LF_QUAA->DETO @@ -514,7 +514,7 @@ BEGIN PROMPT 2 9 "39 Totale detrazioni" END -NUMBER F_TOTDET36 LENIMP +CURRENCY F_TOTDET36 LENIMP BEGIN PROMPT STDIMP 9 "" FIELD LF_QUAA->TOTDET @@ -526,7 +526,7 @@ BEGIN PROMPT 2 10 "40 Ammontare delle ritenute dovute" END -NUMBER F_AMMRITDOV LENIMP +CURRENCY F_AMMRITDOV LENIMP BEGIN PROMPT STDIMP 10 "" FIELD LF_QUAA->AMMRITDOV @@ -539,7 +539,7 @@ BEGIN PROMPT 2 11 "41 Ammontare delle ritenute operate da terzi" END -NUMBER F_AMRIOT37 LENIMP +CURRENCY F_AMRIOT37 LENIMP BEGIN PROMPT STDIMP 11 "" FIELD LF_QUAA->AMRIOT @@ -551,7 +551,7 @@ BEGIN PROMPT 2 12 "42 Ammontare delle ritenute operate dal datore lavoro" END -NUMBER F_AMRIODL38 LENIMP +CURRENCY F_AMRIODL38 LENIMP BEGIN PROMPT STDIMP 12 "" FIELD LF_QUAA->AMRIODL @@ -563,7 +563,7 @@ BEGIN PROMPT 2 13 "43 Eccedenza delle ritenute da rimborsare" END -NUMBER F_ECCRITRIMB LENIMP +CURRENCY F_ECCRITRIMB LENIMP BEGIN PROMPT STDIMP 13 "" FIELD LF_QUAA->ECCRITRIMB @@ -575,7 +575,7 @@ BEGIN PROMPT 2 14 "44 Contributo straordinario per l'Europa da trattenere" END -NUMBER F_QACTREURO LENIMP +CURRENCY F_QACTREURO LENIMP BEGIN PROMPT STDIMP 14 "" FIELD LF_QUAA->QACTREURO @@ -629,7 +629,7 @@ BEGIN PROMPT 2 4 "45 Contributi obbligatori a carico del dipendente" END -NUMBER F_COBBDIP44 LENIMP +CURRENCY F_COBBDIP44 LENIMP BEGIN PROMPT STDIMP 4 "" FIELD LF_QUAA->COBBDIP2 @@ -641,7 +641,7 @@ BEGIN PROMPT 2 5 "46 Imponibile" END -NUMBER F_AMMIMP45 LENIMP +CURRENCY F_AMMIMP45 LENIMP BEGIN PROMPT STDIMP 5 "" FIELD LF_QUAA->AMMIMP @@ -653,7 +653,7 @@ BEGIN PROMPT 2 6 "47 Detrazioni d'imposta" END -NUMBER F_DETIMPOS46 LENIMP +CURRENCY F_DETIMPOS46 LENIMP BEGIN PROMPT STDIMP 6 "" FIELD LF_QUAA->DETIMPOS @@ -665,7 +665,7 @@ BEGIN PROMPT 2 7 "48 Ritenuta eseguita" END -NUMBER F_RITESEG47 LENIMP +CURRENCY F_RITESEG47 LENIMP BEGIN PROMPT STDIMP 7 "" FIELD LF_QUAA->RITESEG diff --git a/m770/771310a.uml b/m770/771310a.uml index 5ade1e4e2..40dbd0ab5 100755 --- a/m770/771310a.uml +++ b/m770/771310a.uml @@ -59,8 +59,8 @@ BEGIN INPUT QLAP F_QLANNOPAG DISPLAY "A.P." QLAP DISPLAY "M.P." QLMP - DISPLAY "Ritenute@15" QLRITEFF - DISPLAY "Importo versato" QLRITVER + DISPLAY "Ritenute@15R" QLRITEFF + DISPLAY "Importo versato@R" QLRITVER DISPLAY "L.V." QLLV DISPLAY "T.V." QLTV DISPLAY "C.T." QLCT diff --git a/m770/771mod.url b/m770/771mod.url index 712caa348..d162431c9 100755 --- a/m770/771mod.url +++ b/m770/771mod.url @@ -1,41 +1,2 @@ #include - -MENU TASK_MENUBAR - SUBMENU MENU_FILE "~File" - -MENUBAR MENU_BAR(1) - -MENU MENU_BAR(1) - SUBMENU MENU_FILE "~File" - - -MENUBAR MENU_BAR(2) - -MENU MENU_BAR(2) - SUBMENU MENU_FILE "~File" - - -MENUBAR MENU_BAR(3) - -MENU MENU_BAR(3) - SUBMENU MENU_FILE "~File" - -MENUBAR MENU_BAR(4) - -MENU MENU_BAR(4) - SUBMENU MENU_FILE "~File" - -MENUBAR MENU_BAR(5) - -MENU MENU_BAR(5) - SUBMENU MENU_FILE "~File" - -MENUBAR MENU_BAR(6) - -MENU MENU_BAR(6) - SUBMENU MENU_FILE "~File" - -MENUBAR MENU_BAR(7) - -MENU MENU_BAR(7) - SUBMENU MENU_FILE "~File" +#include diff --git a/m770/772mod.url b/m770/772mod.url index 8ae2c5b75..d162431c9 100755 --- a/m770/772mod.url +++ b/m770/772mod.url @@ -1,29 +1,2 @@ #include - -MENU TASK_MENUBAR - SUBMENU MENU_FILE "~File" - -MENUBAR MENU_BAR(1) - -MENU MENU_BAR(1) - SUBMENU MENU_FILE "~File" - -MENUBAR MENU_BAR(2) - -MENU MENU_BAR(2) - SUBMENU MENU_FILE "~File" - -MENUBAR MENU_BAR(3) - -MENU MENU_BAR(3) - SUBMENU MENU_FILE "~File" - -MENUBAR MENU_BAR(4) - -MENU MENU_BAR(4) - SUBMENU MENU_FILE "~File" - -MENUBAR MENU_BAR(5) - -MENU MENU_BAR(5) - SUBMENU MENU_FILE "~File" +#include diff --git a/m770/773mod.url b/m770/773mod.url index ee694e844..d162431c9 100755 --- a/m770/773mod.url +++ b/m770/773mod.url @@ -1,26 +1,2 @@ #include - -MENU TASK_MENUBAR - SUBMENU MENU_FILE "~File" - -MENUBAR MENU_BAR(1) - -MENU MENU_BAR(1) - SUBMENU MENU_FILE "~File" - -MENUBAR MENU_BAR(2) - -MENU MENU_BAR(2) - SUBMENU MENU_FILE "~File" - -MENUBAR MENU_BAR(3) - -MENU MENU_BAR(3) - SUBMENU MENU_FILE "~File" - -MENUBAR MENU_BAR(4) - -MENU MENU_BAR(4) - SUBMENU MENU_FILE "~File" - - +#include diff --git a/m770/774.url b/m770/774.url index 216b5df76..53ba6f885 100755 --- a/m770/774.url +++ b/m770/774.url @@ -1,14 +1,3 @@ #include +#include -MENU TASK_MENUBAR - SUBMENU MENU_FILE "~File" - -MENUBAR MENU_BAR(1) - -MENU MENU_BAR(1) - SUBMENU MENU_FILE "~File" - -MENUBAR MENU_BAR(2) - -MENU MENU_BAR(2) - SUBMENU MENU_FILE "~File" diff --git a/m770/775.url b/m770/775.url index 2b72ccc80..53ba6f885 100755 --- a/m770/775.url +++ b/m770/775.url @@ -1,9 +1,3 @@ #include +#include -MENU TASK_MENUBAR - SUBMENU MENU_FILE "~File" - -MENUBAR MENU_BAR(1) - -MENU MENU_BAR(1) - SUBMENU MENU_FILE "~File" diff --git a/m770/775100a.uml b/m770/775100a.uml index df78b12f2..6b4e12cc0 100755 --- a/m770/775100a.uml +++ b/m770/775100a.uml @@ -75,12 +75,10 @@ BEGIN FLAGS "D" END -NUMBER F_FATTBIL 15 +CURRENCY F_FATTBIL 15 BEGIN PROMPT 1 14 "Fatture da ricevere " - PICTURE "." FIELD LF_PERC->FATTBIL - FLAGS "R" END ENDPAGE diff --git a/m770/776mod.url b/m770/776mod.url index 5a3c0d973..53ba6f885 100755 --- a/m770/776mod.url +++ b/m770/776mod.url @@ -1,30 +1,3 @@ #include +#include -MENU TASK_MENUBAR - SUBMENU MENU_FILE "~File" - -MENUBAR MENU_BAR(1) - -MENU MENU_BAR(1) - SUBMENU MENU_FILE "~File" - -MENUBAR MENU_BAR(2) - -MENU MENU_BAR(2) - SUBMENU MENU_FILE "~File" - -MENUBAR MENU_BAR(3) - -MENU MENU_BAR(3) - SUBMENU MENU_FILE "~File" - -MENUBAR MENU_BAR(4) - -MENU MENU_BAR(4) - SUBMENU MENU_FILE "~File" - -MENUBAR MENU_BAR(5) - -MENU MENU_BAR(5) - SUBMENU MENU_FILE "~File" - diff --git a/m770/777.url b/m770/777.url index d7be1ab6c..d66f0ddc5 100755 --- a/m770/777.url +++ b/m770/777.url @@ -1,7 +1,5 @@ #include - -MENU TASK_MENUBAR - SUBMENU MENU_FILE "~File" +#include diff --git a/m770/77cnv.url b/m770/77cnv.url index 7f0285a64..53ba6f885 100755 --- a/m770/77cnv.url +++ b/m770/77cnv.url @@ -1,5 +1,3 @@ #include - -MENU TASK_MENUBAR - SUBMENU MENU_FILE "~File" +#include diff --git a/m770/77lib.h b/m770/77lib.h index 21df08655..38874c44d 100755 --- a/m770/77lib.h +++ b/m770/77lib.h @@ -33,7 +33,7 @@ class TSchedaP; #define DITTA_770 "Ditta770" // Arrotonda modificato { 1500 -> 1000 (e non 2000 come in round(-3)) } -const real& round_770(const real& importo); +real round_770(const real& importo); // Cerca di stabilire se il titolare della ditta e' PF o PG char tipo_persona (long codditta); diff --git a/m770/77lib01.cpp b/m770/77lib01.cpp index 001839403..3dcbccad1 100755 --- a/m770/77lib01.cpp +++ b/m770/77lib01.cpp @@ -1,12 +1,15 @@ // 77lib01.cpp #include #include -#include +#include #include -#include +#include #include -#include #include + +#include +#include + #include "scperc.h" #include "perc.h" #include "rver.h" @@ -15,8 +18,7 @@ #include "dipend.h" // per is_erede #include "77lib.h" -HIDDEN real __dep; -HIDDEN TString80 __tmp; +HIDDEN TString __tmp; HIDDEN const char* _build_key(TVersamento& vers); HIDDEN long _codditta_770 = 0L; // La ditta corrente 770 @@ -98,19 +100,32 @@ const char* get_desc_cau(const char* codcau) // // Round adattata per 770 - 1.12.95 // Arrotonda cosi': -// se importo >= 500 importo -> 1000 -// se importo < 500 importo -> 0 +// se importo > 500 importo -> 1000 +// se importo <= 500 importo -> 0 // L'unica differenza con round(-3) e' il comportamento // alle 500 lire. // -const real& round_770(const real& importo) +real round_770(const real& importo) { - __dep = ZERO; - __dep = importo / 1000.00; - __dep = __dep + 0.499; - __dep.trunc(); - __dep *= 1000.00; - return __dep; + const int ndec = TCurrency::get_firm_dec(); + real imp; + if (ndec == 0) + { + imp = importo / 1000.00; + imp = imp + 0.499; + imp.trunc(); + imp *= 1000.00; + /* bel colpo, solo qualche logaritmo naturale in più e poi sarebbe perfetto: bastava + imp = importo - 1.0; + imp.round(-3); + */ + } + else + { + imp = importo; + imp.round(0); + } + return imp; } int conta_tipiper(const long codit, TString& quadro, int* NumFisiche, int* NumNoFisiche) @@ -362,7 +377,7 @@ bool esiste_pag_in_anno(TSchedaP& sch, const int annodic, const TDate& data_da, { int annopag = datapag.year(); if (annocomp) - annopag = annocomp; + annopag = annocomp; if (annopag == annodic) return TRUE; } @@ -561,13 +576,13 @@ int num_quadri_L_agg(const long codditta) // quadri esauriti sul modulo base righe -= rbase; if (righe <= 0) - return 0; - + return 0; + // calcola numero quadri aggiuntivi div_t div_result; div_result = div(righe, ragg); if (div_result.rem) - div_result.quot++; + div_result.quot++; return div_result.quot; } @@ -652,47 +667,47 @@ int num_quadri_N_agg(const long codditta) righes -= rbases; righet -= rbaset; if (righen<=0 && righep<=0 && righeq<=0 && righer<=0 && righes<=0 && righet<=0) - return 0; - + return 0; + // calcola numero quadri aggiuntivi int qagg = 0; div_t div_result; // quadri N div_result = div(righen, raggn); if (div_result.rem) - div_result.quot++; + div_result.quot++; if (div_result.quot > qagg) - qagg = div_result.quot; + qagg = div_result.quot; // quadri P div_result = div(righep, raggp); if (div_result.rem) - div_result.quot++; + div_result.quot++; if (div_result.quot > qagg) - qagg = div_result.quot; + qagg = div_result.quot; // quadri Q div_result = div(righeq, raggq); if (div_result.rem) - div_result.quot++; + div_result.quot++; if (div_result.quot > qagg) - qagg = div_result.quot; + qagg = div_result.quot; // quadri R div_result = div(righer, raggr); if (div_result.rem) - div_result.quot++; + div_result.quot++; if (div_result.quot > qagg) - qagg = div_result.quot; + qagg = div_result.quot; // quadri S div_result = div(righes, raggs); if (div_result.rem) - div_result.quot++; + div_result.quot++; if (div_result.quot > qagg) - qagg = div_result.quot; + qagg = div_result.quot; // quadri T div_result = div(righet, raggt); if (div_result.rem) - div_result.quot++; + div_result.quot++; if (div_result.quot > qagg) - qagg = div_result.quot; + qagg = div_result.quot; return qagg; } @@ -1096,68 +1111,68 @@ bool TVersamento_stampa::find(TVersamento& vers) int Pag_struct::operator==(Pag_struct& s) { if (this->datapag != s.datapag) - return 0; - if (this->imponibile != s.imponibile) - return 0; - if (this->perc != s.perc) - return 0; - if (this->ritenuta != s.ritenuta) - return 0; - if (this->compenso != s.compenso) - return 0; - if (this->netto != s.netto) - return 0; - if (this->numvers != s.numvers) - return 0; - if (this->spesa != s.spesa) - return 0; - if (this->ctssnperc != s.ctssnperc) - return 0; - if (this->ctssncomp != s.ctssncomp) - return 0; - if (this->ritlorda != s.ritlorda) - return 0; - if (this->controbb != s.controbb) - return 0; - if (this->detfamil != s.detfamil) - return 0; - if (this->detlavdip != s.detlavdip) - return 0; - if (this->totdet != s.totdet) - return 0; - if (this->giolavdip != s.giolavdip) - return 0; - if (this->impcpa != s.impcpa) - return 0; - if (this->somregconv != s.somregconv) - return 0; - if (this->alqimp10 != s.alqimp10) - return 0; - if (this->cod10 != s.cod10) - return 0; - if (this->utpagati != s.utpagati) - return 0; - if (this->utspett != s.utspett) - return 0; - if (this->ritutpag != s.ritutpag) - return 0; - if (this->ritutspe != s.ritutspe) - return 0; - if (this->nquote != s.nquote) - return 0; - if (this->somnsrit != s.somnsrit) - return 0; - if (this->ammlordo != s.ammlordo) - return 0; - if (this->quotaprov != s.quotaprov) - return 0; - if (this->impnetto != s.impnetto) - return 0; - if (this->comnetto != s.comnetto) - return 0; - - // strutture uguali - return 1; + return 0; + if (this->imponibile != s.imponibile) + return 0; + if (this->perc != s.perc) + return 0; + if (this->ritenuta != s.ritenuta) + return 0; + if (this->compenso != s.compenso) + return 0; + if (this->netto != s.netto) + return 0; + if (this->numvers != s.numvers) + return 0; + if (this->spesa != s.spesa) + return 0; + if (this->ctssnperc != s.ctssnperc) + return 0; + if (this->ctssncomp != s.ctssncomp) + return 0; + if (this->ritlorda != s.ritlorda) + return 0; + if (this->controbb != s.controbb) + return 0; + if (this->detfamil != s.detfamil) + return 0; + if (this->detlavdip != s.detlavdip) + return 0; + if (this->totdet != s.totdet) + return 0; + if (this->giolavdip != s.giolavdip) + return 0; + if (this->impcpa != s.impcpa) + return 0; + if (this->somregconv != s.somregconv) + return 0; + if (this->alqimp10 != s.alqimp10) + return 0; + if (this->cod10 != s.cod10) + return 0; + if (this->utpagati != s.utpagati) + return 0; + if (this->utspett != s.utspett) + return 0; + if (this->ritutpag != s.ritutpag) + return 0; + if (this->ritutspe != s.ritutspe) + return 0; + if (this->nquote != s.nquote) + return 0; + if (this->somnsrit != s.somnsrit) + return 0; + if (this->ammlordo != s.ammlordo) + return 0; + if (this->quotaprov != s.quotaprov) + return 0; + if (this->impnetto != s.impnetto) + return 0; + if (this->comnetto != s.comnetto) + return 0; + + // strutture uguali + return 1; } // overloading operatore di assegnazione per la struct dei pagamenti @@ -1195,8 +1210,8 @@ Pag_struct& Pag_struct::operator=(TRectype& rec) this->quotaprov = rec.get_real("QUOTAPROV"); this->impnetto = rec.get_real("IMPNETTO"); this->comnetto = rec.get_real("COMNETTO"); - - return *this; + + return *this; } // overloading operatore di assegnazione per la struct dei pagamenti @@ -1227,6 +1242,6 @@ Pag_struct& Pag_struct::operator+=(Pag_struct& s) this->quotaprov += s.quotaprov; this->impnetto += s.impnetto; this->comnetto += s.comnetto; - - return *this; + + return *this; } \ No newline at end of file diff --git a/m770/77sr.cpp b/m770/77sr.cpp index 42eb942e9..23ab75111 100755 --- a/m770/77sr.cpp +++ b/m770/77sr.cpp @@ -48,11 +48,11 @@ bool TStampa_riepilogo::create() { TConfig conf(CONFIG_USER, "77"); - _currfirm = conf.get_long(DITTA_770, "77"); + _currfirm = conf.get_long(DITTA_770); } { TConfig conf(CONFIG_STUDIO, "77"); - _curryear = conf.get_int(ANNO_SEL, "77"); + _curryear = conf.get_int(ANNO_SEL); } _msk->set(F_CODICE,_currfirm); _msk->set(F_ANNO,_curryear); diff --git a/m770/77srsc.frm b/m770/77srsc.frm index b7318da6e..5aa48baa7 100755 --- a/m770/77srsc.frm +++ b/m770/77srsc.frm @@ -70,7 +70,7 @@ BEGIN PROMPT 2 1 "" FIELD CAUSALE END -NUMBER 3 14 +VALUTA 3 14 BEGIN SPECIAL STRINGA INTESTAZIONE "@cTotale" "Tot." SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" @@ -80,7 +80,7 @@ BEGIN FIELD TOTALE PICTURE "###.###.###^^^" END -NUMBER 4 15 +VALUTA 4 15 BEGIN SPECIAL STRINGA INTESTAZIONE "Somme non sogg." "Somme non sogg." SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" @@ -90,7 +90,7 @@ BEGIN FIELD SOMME PICTURE "###.###.###^^^" END -NUMBER 5 15 +VALUTA 5 15 BEGIN SPECIAL STRINGA INTESTAZIONE "Som. Reg. Conv." "Som. Reg. Conv" SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" @@ -100,7 +100,7 @@ BEGIN FIELD SOMREGCONV PICTURE "###.###.###^^^" END -NUMBER 6 14 +VALUTA 6 14 BEGIN SPECIAL STRINGA INTESTAZIONE "@cImponibile" "Imponibile" SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" @@ -110,7 +110,7 @@ BEGIN FIELD IMPONIBILE PICTURE "###.###.###^^^" END -NUMBER 7 14 +VALUTA 7 14 BEGIN SPECIAL STRINGA INTESTAZIONE "@cImporto" "Importo" SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" diff --git a/m770/77srsf.frm b/m770/77srsf.frm index 8e1f4c519..c5e85ba92 100755 --- a/m770/77srsf.frm +++ b/m770/77srsf.frm @@ -67,7 +67,7 @@ KEY "CAUSALE" PROMPT 2 1 "" FIELD CAUSALE END -NUMBER 3 14 +VALUTA 3 14 BEGIN SPECIAL STRINGA INTESTAZIONE "@CImponibile" "Imponibile" SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" @@ -77,7 +77,7 @@ BEGIN FIELD IMPONIBILE PICTURE "###.###.###^^^" END -NUMBER 4 14 +NUMERO 4 6 BEGIN SPECIAL STRINGA INTESTAZIONE "@CAliquota" "Aliquota" SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" @@ -87,7 +87,7 @@ BEGIN FIELD PERC PICTURE "##@,@@" END -NUMBER 5 14 +VALUTA 5 14 BEGIN SPECIAL STRINGA INTESTAZIONE "@CImporto" "Importo" SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" @@ -97,7 +97,7 @@ BEGIN FIELD IMPORTO PICTURE "###.###.###^^^" END -NUMBER 6 14 +VALUTA 6 14 BEGIN SPECIAL STRINGA INTESTAZIONE "@CNetto" "Netto" SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" @@ -107,7 +107,7 @@ BEGIN FIELD NETTO PICTURE "###.###.###^^^" END -NUMBER 7 14 +VALUTA 7 14 BEGIN SPECIAL STRINGA INTESTAZIONE "@CSomme" "Somme" SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" diff --git a/m770/77srsg.frm b/m770/77srsg.frm index e12856f45..f6ea4a8ec 100755 --- a/m770/77srsg.frm +++ b/m770/77srsg.frm @@ -71,7 +71,7 @@ BEGIN PROMPT 2 1 "" FIELD CAUSALE END -NUMBER 3 14 +VALUTA 3 14 BEGIN SPECIAL STRINGA INTESTAZIONE "@CSomme" "Somme" SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" @@ -81,7 +81,7 @@ BEGIN FIELD SOMME PICTURE "###.###.###^^^" END -NUMBER 4 14 +VALUTA 4 14 BEGIN SPECIAL STRINGA INTESTAZIONE "@CAmmontare" "Ammontare" SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" @@ -91,7 +91,7 @@ BEGIN FIELD AMMONTARE PICTURE "###.###.###^^^" END -NUMBER 5 14 +NUMERO 5 6 BEGIN SPECIAL STRINGA INTESTAZIONE "@cAliquota" "Aliquota" SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" @@ -101,7 +101,7 @@ BEGIN FIELD PERC PICTURE "##@,@@" END -NUMBER 6 14 +VALUTA 6 14 BEGIN SPECIAL STRINGA INTESTAZIONE "@CImporto" "Importo" SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" @@ -111,7 +111,7 @@ BEGIN FIELD IMPORTO PICTURE "###.###.###^^^" END -NUMBER 7 14 +VALUTA 7 14 BEGIN SPECIAL STRINGA INTESTAZIONE "@CNetto" "Netto" SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" diff --git a/m770/77srsl.frm b/m770/77srsl.frm index f2f54314e..04bc98f9e 100755 --- a/m770/77srsl.frm +++ b/m770/77srsl.frm @@ -1,6 +1,6 @@ USE 42 -JOIN 9 INTO CODDITTA=CODDITTA -JOIN 6 TO 9 ALIAS 106 INTO TIPOA=TIPOA CODANAGR=CODANAGR +JOIN 9 INTO CODDITTA=CODDITTA +JOIN 6 TO 9 ALIAS 106 INTO TIPOA=TIPOA CODANAGR=CODANAGR END DESCRIPTION diff --git a/m770/f39.trr b/m770/f39.trr index 7d5de26a8..58cf6e730 100755 --- a/m770/f39.trr +++ b/m770/f39.trr @@ -13,13 +13,13 @@ IVA|4|18|2|Iva documento TOTALE|4|18|2|Totale documento FORZATURA|8|1|0|Flag di forzatura controlli TOTRIT|4|18|2|Totale ritenute (collegamento contabilità) -RITSOC|4|18|0|Ritenute sociali (collegamento contabilità) +RITSOC|4|18|2|Ritenute sociali (collegamento contabilità) MESEC|2|2|0|Mese competenza ANNOC|2|4|0|Anno competenza CAUSQUA|7|1|0|Causale quadro FLAGTS|7|1|0|Flag T.S. -RITOPE|4|18|0|Ritenute operate -RITVER|4|18|0|Ritenute versate +RITOPE|4|18|2|Ritenute operate +RITVER|4|18|2|Ritenute versate 2 CODDITTA+TIPOA+CODANAGR+NPROG| CODDITTA+TIPOA+CODANAGR+DATADOC+NPROG| diff --git a/m770/f40.trr b/m770/f40.trr index 249e1247b..e8a789b39 100755 --- a/m770/f40.trr +++ b/m770/f40.trr @@ -8,7 +8,7 @@ NRIGA|2|4|0|Numero progressivo di versamento VERS1015|8|1|0|Versamento 1015 DATAVERS|5|8|0|Data versamento TIPOVERS|1|1|0|Tipo versamento -RITENUTA|4|18|0|Ritenuta versata +RITENUTA|4|18|2|Ritenuta versata LUOVERS|1|1|0|Luogo versamento NUMERO|1|11|0|Numero versamento SERIE|1|5|0|Serie diff --git a/m770/f41.trr b/m770/f41.trr index f453204e7..a042baf76 100755 --- a/m770/f41.trr +++ b/m770/f41.trr @@ -6,34 +6,34 @@ CODANAGR|3|5|0|Codice percipiente NPROG|2|4|0|Numero progressivo di scheda NRIGA|2|4|0|Numero progressivo di pagamento DATAPAG|5|8|0|Data pagamento -IMPONIBILE|4|18|0|Imponibile +IMPONIBILE|4|18|2|Imponibile PERC|4|6|2|Aliquota -RITENUTA|4|18|0|Ritenuta -COMPENSO|4|18|0|Compenso -NETTO|4|18|0|Compenso netto +RITENUTA|4|18|2|Ritenuta +COMPENSO|4|18|2|Compenso +NETTO|4|18|2|Compenso netto NUMVERS|3|5|0|Numero progressivo di versamento collegato -SPESA|4|18|0|Spesa -CTSSNPERC|4|18|0|Contributo 10% percipiente (Dbis) -CTSSNCOMP|4|18|0|Contributo 10% complessivo (Dbis) -RITLORDA|4|18|0|Ritenuta lorda (C) -CONTROBB|4|18|0|Contributi obbligatori (C) -DETFAMIL|4|18|0|Detrazioni familiari (C) -DETLAVDIP|4|18|0|Detrazioni lavoro dipendente (C) -TOTDET|4|18|0|Totale detrazioni (C) +SPESA|4|18|2|Spesa +CTSSNPERC|4|18|2|Contributo 10% percipiente (Dbis) +CTSSNCOMP|4|18|2|Contributo 10% complessivo (Dbis) +RITLORDA|4|18|2|Ritenuta lorda (C) +CONTROBB|4|18|2|Contributi obbligatori (C) +DETFAMIL|4|18|2|Detrazioni familiari (C) +DETLAVDIP|4|18|2|Detrazioni lavoro dipendente (C) +TOTDET|4|18|2|Totale detrazioni (C) GIOLAVDIP|2|3|0|Giorni lavoro dipendente (C) -IMPCPA|4|18|0|Importo CPA (D) -SOMREGCONV|4|18|0|Somme regime convenzionale (D,Dbis) +IMPCPA|4|18|2|Importo CPA (D) +SOMREGCONV|4|18|2|Somme regime convenzionale (D,Dbis) ALQIMP10|4|6|2|Aliquota imponibile contributo 10% (Dbis) COD10|1|1|0|Codice 10% (Dbis) -UTPAGATI|4|18|0|Utili pagati (G) -UTSPETT|4|18|0|Utili spettanti (G) -RITUTPAG|4|18|0|Ritenute utili pagati (G) -RITUTSPE|4|18|0|Ritenute utili spettanti (G) +UTPAGATI|4|18|2|Utili pagati (G) +UTSPETT|4|18|2|Utili spettanti (G) +RITUTPAG|4|18|2|Ritenute utili pagati (G) +RITUTSPE|4|18|2|Ritenute utili spettanti (G) NQUOTE|4|6|2|Numero quote (G) -SOMNSRIT|4|18|0|Somme non soggette a ritenuta (calc) -AMMLORDO|4|18|0|Ammontare lordo corrisposto (calc) -QUOTAPROV|4|18|0|Quota provvigioni (calc) -IMPNETTO|4|18|0|Imponibile al netto delle ritenute (calc) -COMNETTO|4|18|0|Compenso al netto delle ritenute (calc) +SOMNSRIT|4|18|2|Somme non soggette a ritenuta (calc) +AMMLORDO|4|18|2|Ammontare lordo corrisposto (calc) +QUOTAPROV|4|18|2|Quota provvigioni (calc) +IMPNETTO|4|18|2|Imponibile al netto delle ritenute (calc) +COMNETTO|4|18|2|Compenso al netto delle ritenute (calc) 1 CODDITTA+TIPOA+CODANAGR+NPROG+NRIGA| diff --git a/m770/f42.trr b/m770/f42.trr index a82f6cb3d..3da58ecbe 100755 --- a/m770/f42.trr +++ b/m770/f42.trr @@ -11,8 +11,8 @@ QLAB|2|2|0| QLSERIE|1|5|0| QLNUMERO|1|11|0| QLCODQUA|1|2|0| -QLRITEFF|4|18|0| -QLRITVER|4|18|0| +QLRITEFF|4|18|2| +QLRITVER|4|18|2| QLRSS|1|2|0| QLNOTE|1|20|0| 2 diff --git a/m770/f62.trr b/m770/f62.trr index 854762c29..c78d1f625 100755 --- a/m770/f62.trr +++ b/m770/f62.trr @@ -6,12 +6,12 @@ CODANAGR|3|5|0|Codice anagrafica NPROG|2|4|0|Numero progressivo di riga CODCAUS|9|2|0|Codice causale CAUSALE|1|1|0|15 - Causale -TOTALE|4|18|0|16 - Ammontare lordo corrisposto -SOMME|4|18|0|17 - Somme non soggette a ritenuta -IMPONIBILE|4|18|0|19 - Imponibile +TOTALE|4|18|2|16 - Ammontare lordo corrisposto +SOMME|4|18|2|17 - Somme non soggette a ritenuta +IMPONIBILE|4|18|2|19 - Imponibile PERC|4|6|2|Aliquota -IMPORTO|4|18|0|20 - Ritenute operate -SOMREGCONV|4|18|0|18 - Somme non soggette a ritenuta per reg. conv. +IMPORTO|4|18|2|20 - Ritenute operate +SOMREGCONV|4|18|2|18 - Somme non soggette a ritenuta per reg. conv. GENERATA|8|1|0|Riga generata dalle schede 1 CODDITTA+TIPOA+CODANAGR+NPROG| diff --git a/m770/f63.trr b/m770/f63.trr index 4f027bf21..2be9bd91d 100755 --- a/m770/f63.trr +++ b/m770/f63.trr @@ -6,12 +6,12 @@ CODANAGR|3|5|0|Codice anagrafica NPROG|2|4|0|Numero progrssivo riga CODCAUS|9|2|0|Codice causale CAUSALE|7|1|0|11 - Causale -TOTALE|4|18|0|12 - Ammontare lordo corrisposto -QUOTAPRO|4|18|0|14 - Quota provvigioni -SPESEANT|4|18|0|13 - Spese anticipate -IMPONIBILE|4|18|0|15 - Imponibile +TOTALE|4|18|2|12 - Ammontare lordo corrisposto +QUOTAPRO|4|18|2|14 - Quota provvigioni +SPESEANT|4|18|2|13 - Spese anticipate +IMPONIBILE|4|18|2|15 - Imponibile PERC|4|6|2|Aliquota -IMPORTO|4|18|0|16 - Ritenute operate +IMPORTO|4|18|2|16 - Ritenute operate GENERATA|8|1|0|Riga generata dalle schede 1 CODDITTA+TIPOA+CODANAGR+NPROG| diff --git a/m770/f64.trr b/m770/f64.trr index c8143339e..d2dc35416 100755 --- a/m770/f64.trr +++ b/m770/f64.trr @@ -6,11 +6,11 @@ CODANAGR|3|5|0|Codice anagrafico NPROG|2|4|0|Numero progressivo di riga CODCAUS|9|2|0|Codice causale CAUSALE|7|1|0|11 - Causale quadro -IMPONIBILE|4|18|0|12 - Imponibile corrisposto +IMPONIBILE|4|18|2|12 - Imponibile corrisposto PERC|4|6|2|13 - Aliquota -IMPORTO|4|18|0|14 - Ritenute operate -NETTO|4|18|0|15 - Somme corrisposte al netto delle ritenute -SOMME|4|18|0|16 - Somme corrisposte non assoggettate a ritenuta +IMPORTO|4|18|2|14 - Ritenute operate +NETTO|4|18|2|15 - Somme corrisposte al netto delle ritenute +SOMME|4|18|2|16 - Somme corrisposte non assoggettate a ritenuta GENERATA|8|1|0|Riga generata dalle schede 1 CODDITTA+TIPOA+CODANAGR+NPROG| diff --git a/m770/f65.trr b/m770/f65.trr index be33ec3b4..72d36a0e7 100755 --- a/m770/f65.trr +++ b/m770/f65.trr @@ -6,11 +6,11 @@ CODANAGR|3|5|0|Codice anagrafica NPROG|2|4|0|Numero progrssivo i riga CODCAUS|9|2|0|Codice causale CAUSALE|7|1|0|11 - Causale quadro -SOMME|4|18|0|12 - Somme corrisposte -AMMONTARE|4|18|0|13 - Ammontare complessivo dei premi riscossi +SOMME|4|18|2|12 - Somme corrisposte +AMMONTARE|4|18|2|13 - Ammontare complessivo dei premi riscossi PERC|4|6|2|14 - Aliquota -IMPORTO|4|18|0|15 - Ritenute operate -NETTO|4|18|0|16 - Netti corrisposto +IMPORTO|4|18|2|15 - Ritenute operate +NETTO|4|18|2|16 - Netti corrisposto GENERATA|8|1|0|Riga generata dalle schede 1 CODDITTA+TIPOA+CODANAGR+NPROG| diff --git a/m770/f89.trr b/m770/f89.trr index 031e382bb..d606429ff 100755 --- a/m770/f89.trr +++ b/m770/f89.trr @@ -2,8 +2,8 @@ 5 CODDITTA|3|5|0|Codice ditta CODCAUS|1|2|0|Codice causale (Vale solo 'C' o 'D') -COMPENSO|4|18|0|2 - Ammontare complessivo -IMPONIBILE|4|18|0|3 - Ammontare somme soggette a ritenuta -RITENUTA|4|18|0|4 - Ritenute operate +COMPENSO|4|18|2|2 - Ammontare complessivo +IMPONIBILE|4|18|2|3 - Ammontare somme soggette a ritenuta +RITENUTA|4|18|2|4 - Ritenute operate 1 CODDITTA+CODCAUS| diff --git a/mg/anamag.h b/mg/anamag.h index bc2f5df86..667c13b6f 100755 --- a/mg/anamag.h +++ b/mg/anamag.h @@ -47,6 +47,8 @@ #define ANAMAG_VALSTATUN "VALSTATUN" #define ANAMAG_PROV "PROV" #define ANAMAG_PAESE "PAESE" +#define ANAMAG_COLLTYPE "COLLTYPE" +#define ANAMAG_CODMAG "CODMAG" #define ANAMAG_USER1 "USER1" #define ANAMAG_USER2 "USER2" #define ANAMAG_USER3 "USER3" diff --git a/mg/mg0.url b/mg/mg0.url index be5531063..95859f1ac 100755 --- a/mg/mg0.url +++ b/mg/mg0.url @@ -3,3 +3,5 @@ #define QFIRMNAME "A.G.A. Informatica Srl" #include +#include + diff --git a/mg/mg1.url b/mg/mg1.url index be5531063..411a840eb 100755 --- a/mg/mg1.url +++ b/mg/mg1.url @@ -3,3 +3,4 @@ #define QFIRMNAME "A.G.A. Informatica Srl" #include +#include diff --git a/mg/mg1100.cpp b/mg/mg1100.cpp index a900fadaa..6142267c2 100755 --- a/mg/mg1100.cpp +++ b/mg/mg1100.cpp @@ -9,6 +9,7 @@ #include "../ve/veconf.h" #include "mg1100.h" +#include // maschera dell'applicazione "Gestione interattiva movimenti di magazzino" // @@ -90,12 +91,17 @@ TMask_movmag::TMask_movmag(TMov_mag * m_m) ss.set_lines_record(m_m->body()); // setta i campi della maschera // per la pagina giacenze - TSheet_field &fld_righe= (TSheet_field &)field(F_RIGHE); + TSheet_field &fld_righe = sfield(F_RIGHE); + // setta le colonne in base all'abilitazione dei livelli di giacenza + /* livelli_giacenza().set_sheetcolumn(fld_righe,F_LIV1,1); livelli_giacenza().set_sheetcolumn(fld_righe,F_LIV2,2); livelli_giacenza().set_sheetcolumn(fld_righe,F_LIV3,3); livelli_giacenza().set_sheetcolumn(fld_righe,F_LIV4,4); + */ + livelli_giacenza().set_sheet_columns(fld_righe,F_LIV1); + // abilita i controlli for (int l=0; l<4; l++) if (livelli_giacenza().autoinsert(1+l)) @@ -322,7 +328,7 @@ bool TMask_movmag::handle_giacattuale(TMask_field &f, KEY k) { TMask & maskrighe =f.mask(); TMask_movmag &maskmov=(TMask_movmag &)maskrighe.get_sheet()->mask(); - if (k==K_TAB && !maskmov.is_running()) + if (k==K_TAB && (!maskmov.is_running() || f.focusdirty())) { TString codliv; // codici livello @@ -474,16 +480,18 @@ bool TMask_movmag::add_explrows(int r) if (cau.esplodente() && *sheet.cell(r,sheet.cid2index(F_ESPLOSA)) == ' ') { TDistinta_tree distinta; + TArticolo articolo; TArray boom; // ******************************* // c'e' una riga di movimento esplodente non ancora esplosa: // va sostituita con n righe esplose - TString codmag; real prezzo,quant; const char tipo_costo = cau.get("S11")[0]; const int livello = cau.get_int("I0"); const TString codart = sheet.cell(r,sheet.cid2index(F_CODART)); bool ok = distinta.set_root(codart); + const int rigaprec = r - 1; + const bool is_coll = rigaprec >= 0 && *sheet.cell(r, sheet.cid2index(F_AUTOMATICA)) == riga_automatica; if (ok) { distinta.explode(boom, TRUE, RAGGR_EXP_NONE, livello, "A"); @@ -498,10 +506,34 @@ bool TMask_movmag::add_explrows(int r) quant=sheet.row(r).get(sheet.cid2index(F_QUANT)); quant*=riga_esp.val(); nuova_riga.add(quant.string() , sheet.cid2index(F_QUANT)); - if (codmag.not_empty()) - { - nuova_riga.add(codmag.sub(1,3) ,sheet.cid2index(F_CODMAG)); - nuova_riga.add(codmag.sub(4,5) ,sheet.cid2index(F_CODDEP)); + + articolo.read(riga_esp.articolo()); + char coll_type = articolo.get_char(ANAMAG_COLLTYPE); + TString16 codmag; + + if (coll_type == 'M') + { + if (is_coll) + codmag = *sheet.cell(rigaprec, sheet.cid2index(F_CODMAG)); + } + else + if (coll_type == 'F') + { + TString key("F|"); + + key << articolo.get(ANAMAG_CODFORN); + codmag = cache().get(LF_CFVEN, key, CFV_CODMAG); + } + else + if (coll_type == 'A') + codmag = articolo.get(ANAMAG_CODMAG); + if (codmag.not_empty()) + { + const TString16 mag(codmag.left(3)); + const TString16 dep(codmag.mid(3)); + + nuova_riga.add(mag ,sheet.cid2index(F_CODMAG)); + nuova_riga.add(dep ,sheet.cid2index(F_CODDEP)); } articolo.read(riga_esp.articolo()); if (tipo_costo == 'U') diff --git a/mg/mg1100.uml b/mg/mg1100.uml index ff8418269..bb618ff80 100755 --- a/mg/mg1100.uml +++ b/mg/mg1100.uml @@ -347,12 +347,12 @@ BEGIN FLAGS "AI" //USE LF_RMOVMAG KEY NRIG //INPUT NUMREG F_NUMREG - ITEM "@1F" - ITEM "CodArt@F" - ITEM "Liv1@F10" - ITEM "Liv2@F10" - ITEM "Liv3@F10" - ITEM "Liv4@F10" + ITEM "@1" + ITEM "CodArt" + ITEM "Liv1@10" + ITEM "Liv2@10" + ITEM "Liv3@10" + ITEM "Liv4@10" ITEM "Descrizione" ITEM "CodMag" ITEM "CodDep" diff --git a/mg/mg1200.cpp b/mg/mg1200.cpp index 156b343ba..d751d9400 100755 --- a/mg/mg1200.cpp +++ b/mg/mg1200.cpp @@ -30,8 +30,17 @@ bool TMask_buildmov::handle_annoes(TMask_field &fld, KEY k) if (esc!=0) fld.set(esc); } - if (k == K_TAB && fld.focusdirty()) + if (fld.to_check(k) || k == K_ENTER) { + TConfig prassid(CONFIG_DITTA, "Euro"); + TDate adozione = prassid.get("DataAdozione"); + if (adozione.ok()) + { + TEsercizi_contabili esc; + const int anno = esc.date2esc(adozione); + if (mask.get_int(F_ANNOES) < anno) + return fld.error_box("Impossibile effettuare la ricostruzione saldi su\n un esercizio precedente alla data adozione Euro") ; + } if (mask.esercizi.exist(mask.get_int(F_ANNOES))) { const TEsercizio & e=mask.esercizi.esercizio(mask.get_int(F_ANNOES)); @@ -39,7 +48,7 @@ bool TMask_buildmov::handle_annoes(TMask_field &fld, KEY k) { fld.error_box("Il magazzino dell'esercizio indicato risulta chiuso \nImpossibile effettuare la ricostruzione saldi") ; return FALSE; - } + } } } return TRUE; diff --git a/mg/mg1400.cpp b/mg/mg1400.cpp index 9ca13f99f..253dde3b8 100755 --- a/mg/mg1400.cpp +++ b/mg/mg1400.cpp @@ -364,7 +364,7 @@ void TApp_openclose::compila_movimento(TMov_mag& currmov, TArticolo_giacenza& ar // Setta il prezzo al nr di decimali impostati per la valuta corrente currency.set_price(caus == CAUS_A_VAL ? FALSE : TRUE); // Se mov. solo valore (FIFO/LIFO) i decimali devono essere per gl'importi currency.set_num(prezzo); - riga.put(RMOVMAG_PREZZO, currency.string()); + riga.put(RMOVMAG_PREZZO, currency); } } @@ -382,7 +382,7 @@ void TApp_openclose::chiudi_esercizio() TTable esc("ESC"); TTable magazzini("MAG"); - rebuild_balances(_es_to_close); // Cosi' ci assicuriamo che i saldi dell'esercizio vecchio siano a posto +// rebuild_balances(_es_to_close); // Cosi' ci assicuriamo che i saldi dell'esercizio vecchio siano a posto descr1.format(_what == definitiva ? "Apertura esercizio %s" : "Aggiornamento saldi esercizio %s", (const char*) _es_to_open); descr2 << descr1 << " in corso..."; diff --git a/mg/mg3.url b/mg/mg3.url index 7caa303c3..88fdaa09f 100755 --- a/mg/mg3.url +++ b/mg/mg3.url @@ -3,4 +3,5 @@ #define QFIRMNAME "A.G.A. Informatica Srl" #include +#include diff --git a/mg/mg3100a.frm b/mg/mg3100a.frm index ae1c75ee4..20b66f449 100755 --- a/mg/mg3100a.frm +++ b/mg/mg3100a.frm @@ -1189,7 +1189,7 @@ SECTION BODY ODD 0 COLUMNWISE VALUTA 484 12 BEGIN KEY "VALven" - PROMPT 9 1 "" + PROMPT 9 1 ":-)" FLAGS "U" PICTURE "#######,@##" MESSAGE _NUMEXPR,#444/#443 diff --git a/mg/mg3300.cpp b/mg/mg3300.cpp index d23ee7446..51ec981a3 100755 --- a/mg/mg3300.cpp +++ b/mg/mg3300.cpp @@ -18,6 +18,9 @@ class TForm_schedemag : public TForm_stampemg bool _magazzino_chiuso; bool _sottocatmer; bool _sudd_mag; + bool _no_valori; + bool _no_ff; + bool _sintetica; TDate _data_inizio, _data_fine; TToken_string *_rmov_sortexp; @@ -40,6 +43,7 @@ public: void setdett_percatmer(bool sottocat,int livart,int livgiac,bool sudd_mag,bool sudd_dep); void setdett_permag(bool sudd_dep, bool showdett,int livart,int livgiac); void set_date_limite(const int anno, const TDate& d, const TDate& e); + void set_options(bool no_valori, bool no_ff, bool sintetica); const char* descr_tiposcheda() const; const char* nomecampo_scheda() const; @@ -333,9 +337,6 @@ bool TForm_schedemag::validate(TForm_item &cf, TToken_string &s) cf.set(currsaldo.string()); } } -#ifdef DBG - real currsaldo = cf.get(); // Per conoscenza -#endif return TRUE; } @@ -431,10 +432,10 @@ void TForm_schedemag::setdett_percatmer(bool sottocat,int livart,int livgiac,boo h_c.enable(); TForm_subsection &h_a=(TForm_subsection &)find_field('B',odd_page,"HEADER_ARTICOLO"); h_a.enable(); - h_a.set_newpage(livart !=0 && livgiac ==0 && !sudd_mag); + h_a.set_newpage(livart !=0 && livgiac ==0 && !sudd_mag && !_no_ff); TForm_subsection &h_g=(TForm_subsection &)find_field('B',odd_page,"HEADER_GRMOV"); h_g.enable(livart ==0 || livgiac !=0 || sudd_mag); - h_g.set_newpage(livart ==0 || livgiac !=0 || sudd_mag); + h_g.set_newpage(livart ==0 || livgiac !=0 || sudd_mag && !_no_ff); TForm_subsection &h_l=(TForm_subsection &)find_field('B',odd_page,"HEADER_LIVGIAC"); h_l.enable(livelli_giacenza().enabled() && (livgiac !=0 ||livart ==0)); TForm_subsection &h_m=(TForm_subsection &)find_field('B',odd_page,"HEADER_MAG"); @@ -484,14 +485,14 @@ void TForm_schedemag::setdett_perart(bool percatmer,bool sottocatmer,int livart, TForm_subsection &h_a=(TForm_subsection &)find_field('B',odd_page,"HEADER_ARTICOLO"); h_a.enable (livart!=0 && !sudd_mag); - h_a.set_newpage(livart!=0 && !sudd_mag); + h_a.set_newpage(livart!=0 && !sudd_mag && !_no_ff); TForm_subsection &t_a=(TForm_subsection &)find_field('B',odd_page,"TOTALI_GRUPPIART"); t_a.show( livart!=0 && !sudd_mag); // raggruppamento MAX fino alla giacenza TForm_subsection &h_g=(TForm_subsection &)find_field('B',odd_page,"HEADER_GRMOV"); - h_g.enable(livart ==0 || livgiac !=0 || sudd_mag); - h_g.set_newpage(livart ==0 || livgiac !=0 || sudd_mag); + h_g.enable(livart ==0 || livgiac !=0 || sudd_mag); + h_g.set_newpage(!_no_ff && (livart ==0 || livgiac !=0 || sudd_mag)); TForm_subsection &h_l=(TForm_subsection &)find_field('B',odd_page,"HEADER_LIVGIAC"); h_l.enable(livelli_giacenza().enabled() && (livart ==0 || livgiac !=0 )); TForm_subsection &h_m=(TForm_subsection &)find_field('B',odd_page,"HEADER_MAG"); @@ -561,6 +562,28 @@ void TForm_schedemag::set_tiposcheda(const char * tipo) } } +void TForm_schedemag::set_options(bool no_valori, bool no_ff, bool sintetica) +{ + _no_valori = no_valori; + if (_no_valori) + { + ((TForm_item &)find_field('H',odd_page, 8)).hide(); + ((TForm_item &)find_field('H',odd_page, 9)).hide(); + ((TForm_item &)find_field('B',odd_page, 104)).hide(); + + ((TForm_item &)find_field('B',odd_page, 105)).hide(); + ((TForm_item &)find_field('B',odd_page, FF_VALORE_GART)).hide(); + + ((TForm_item &)find_field('B',odd_page, FF_VALORE_MOV)).hide(); + ((TForm_item &)find_field('B',odd_page, 190)).hide(); + + if (name().left(7) == "mg3300a") + ((TForm_item &)find_field('B',odd_page, FF_VALORE_GRMOV)).hide(); + } + _no_ff = no_ff; + _sintetica = sintetica; +} + void TForm_schedemag::set_date_limite(const int anno, const TDate& d, const TDate& e) { TEsercizi_contabili ec; @@ -665,6 +688,7 @@ void TStampa_schede_mag::setprint_permagazzini() { TDate d1(_mask->get(F_DADATA)); TString cond; + cond << "ANSI(" << LF_MOVMAG << "->DATAREG)>=\"" << d1.string(ANSI) << '"'; ((TForm_subsection &)_form->find_field('B',odd_page,"MOVS_INTERESSATI")).setcondition(cond,_strexpr); ((TForm_subsection &)_form->find_field('B',odd_page,"H_MOVS_INTERESSATI")).setcondition(cond,_strexpr); @@ -685,9 +709,7 @@ void TStampa_schede_mag::setprint_permagazzini() // filtering ONLY NEGATIVES if (_mask->get(F_FILTRO)[0]=='N') - { _cur->set_filterfunction(negatives_only, TRUE); - } // prepare cursor to print.... ((TSorted_cursor *)_cur)->change_order(_form->rmov_sortexp()); @@ -697,7 +719,7 @@ void TStampa_schede_mag::setprint_permagazzini() TLocalisamfile *mag=new TLocalisamfile(LF_MAG); mag->setkey(2); TString mag_joinexp; - mag_joinexp << "ANNOES==" << _mask->get(F_ANNOES) << "|CODMAG==CODMAG|CODART==CODART|LIVELLO==LIVGIAC"; + mag_joinexp << "ANNOES==" << _mask->get(F_ANNOES) << "|CODMAG==CODMAG|CODART==CODART|LIVELLO==LIVGIAC"; _cur->relation()->replace(mag,1,mag_joinexp); _cur->setfilter(cfilter,TRUE); _cur->setregion(darec,arec,0x2); @@ -739,9 +761,7 @@ void TStampa_schede_mag::setprint_perarticoli() // filtering ONLY NEGATIVES if (_mask->get(F_FILTRO)[0]=='N') - { - _cur->set_filterfunction(negatives_only); - } + _cur->set_filterfunction(negatives_only); // Imposta i livelli di dettaglio della scheda int tolivelloart=_mask->get_int(F_TOLIVELLOART); @@ -820,22 +840,29 @@ void TStampa_schede_mag::main_loop() _mask->set(F_TOLIVELLOART,livelli_articolo().last_level()); if (dettaglio=='G' && _mask->get_int(F_TOLIVELLOGIAC)==0) _mask->set(F_TOLIVELLOGIAC,livelli_giacenza().last_level()); - if (*_mask->get(F_ORDINE)=='A') - { - _form = new TForm_schedemag("mg3300a", "") ; - // *_mask->get(F_FILTRO) == 'T' ? - // new TForm_schedemag("mg3300aa", "") : - // new TForm_schedemag("mg3300a", "") ; + TString16 frmname; + const bool per_articoli = (*_mask->get(F_ORDINE) == 'A'); + const bool sintetica = _mask->get_bool(F_SINTETICA); + if (per_articoli) + frmname = "mg3300a"; + else + frmname = "mg3300b"; + if (sintetica) + frmname << 's'; + _form = new TForm_schedemag(frmname, "") ; + _form->set_options(_mask->get_bool(F_NO_VALORI), _mask->get_bool(F_NO_FF), + sintetica); + + if (per_articoli) setprint_perarticoli(); - } else if (*_mask->get(F_ORDINE)=='M') { - _form = new TForm_schedemag("mg3300b", ""); + else setprint_permagazzini(); - } _form->set_date_limite(_mask->get_int(F_ANNOES), _mask->get_date(F_DADATA), _mask->get_date(F_ADATA)); _form->print(); delete _form; + _form = NULL; } } // while true return ; diff --git a/mg/mg3300.h b/mg/mg3300.h index cfbce834a..dd5e70a92 100755 --- a/mg/mg3300.h +++ b/mg/mg3300.h @@ -24,6 +24,9 @@ #define F_DETTAGLIODEP 126 #define F_ENABLER 127 #define F_FILTRO 130 +#define F_NO_VALORI 131 +#define F_NO_FF 132 +#define F_SINTETICA 133 #define G_CATMER 1 #define G_CODART 2 diff --git a/mg/mg3300.uml b/mg/mg3300.uml index 57947947d..6565e2e9f 100755 --- a/mg/mg3300.uml +++ b/mg/mg3300.uml @@ -1,5 +1,5 @@ #include "mg3300.h" -PAGE "Stampa Schede di magazzino" -1 -1 78 20 +PAGE "Stampa Schede di magazzino" -1 -1 78 21 LISTBOX F_SCHEDA 30 BEGIN @@ -248,10 +248,23 @@ END BOOL F_SUDDIV_DEPOSITI BEGIN - FLAGS "D" - PROMPT 2 17 "Suddivido per depositi" + PROMPT 2 17 "Suddivido per depositi" END +BOOL F_NO_VALORI +BEGIN + PROMPT 2 18 "Non stampare i valori" +END + +BOOL F_NO_FF +BEGIN + PROMPT 42 16 "Senza salto pagina" +END + +BOOL F_SINTETICA +BEGIN + PROMPT 42 17 "Stampa sintetica" +END BUTTON DLG_OK 10 2 BEGIN diff --git a/mg/mg3300a.frm b/mg/mg3300a.frm index 4cb1bd5a3..6d2cdaaf7 100755 --- a/mg/mg3300a.frm +++ b/mg/mg3300a.frm @@ -34,8 +34,6 @@ END GENERAL BEGIN OFFSET 0 1 -// FONT "Courier New" -// SIZE 12 END SECTION GRAPHIC @@ -53,14 +51,14 @@ SECTION HEADER ODD 5 STRINGA 2 10 BEGIN KEY "Data" - PROMPT 120 1 "Data " + PROMPT 65 1 "Data " MESSAGE _TODAY END NUMERO 3 7 BEGIN KEY "Nr. pagina" - PROMPT 137 1 "Pagina " + PROMPT 81 1 "Pagina " MESSAGE _PAGENO END @@ -85,37 +83,38 @@ SECTION HEADER ODD 5 MESSAGE _USER,TIPOSCHEDA END - STRINGA 5 146 + STRINGA 5 95 BEGIN KEY "Separatore (iniziale)" - PROMPT 1 3 "------------------------------------------------------------------------------------------------------------------------------------------------------" - END + PROMPT 1 3 "-----------------------------------------------------------------------------------------------" + END STRINGA 6 12 BEGIN PROMPT 42 4 "UM" END - NUMBER 7 12 + NUMERO 7 12 BEGIN - PROMPT 47 4 "Quantità" + PROMPT 50 4 "Quantità" END - NUMBER 8 12 + VALUTA 8 12 BEGIN - PROMPT 62 4 "Prezzo" + PROMPT 66 4 "Prezzo" + FLAGS "U" END - NUMBER 9 12 + VALUTA 9 12 BEGIN - PROMPT 78 4 "Valore" + PROMPT 81 4 "Valore" END - STRINGA 5 146 + STRINGA 5 95 BEGIN KEY "Separatore (iniziale)" - PROMPT 1 5 "------------------------------------------------------------------------------------------------------------------------------------------------------" + PROMPT 1 5 "-----------------------------------------------------------------------------------------------" END END SECTION BODY ODD 0 - NUMBER 100 1 + NUMERO 100 1 BEGIN FLAGS "H" MESSAGE RESET,FF_SALDO_GART|RESET,FF_VALORE_GART @@ -154,7 +153,7 @@ SECTION BODY ODD 0 STRINGA 24 50 1 BEGIN KEY "dep" - PROMPT 1 2 "------------------------------------------------------------------------------------------------------------------------------------------------------" + PROMPT 1 2 "-----------------------------------------------------------------------------------------------" END END //HEADER articolo @@ -218,10 +217,10 @@ SECTION BODY ODD 0 END END // HEADER deposito END // HEADER magazzino - STRINGA 24 50 1 + STRINGA 24 95 BEGIN KEY "dep" - PROMPT 1 2 "------------------------------------------------------------------------------------------------------------------------------------------------------" + PROMPT 1 2 "-----------------------------------------------------------------------------------------------" END END // HEADER raggruppamenti di movimenti @@ -299,32 +298,32 @@ SECTION BODY ODD 0 FLAGS "H" MESSAGE _USER,DESCRCAUSALE|COPY,FF_DESCRCAUSALE END - NUMBER FF_QUANTRIGA 12 + NUMERO FF_QUANTRIGA 12 BEGIN FLAGS "H" MESSAGE _NUMEXPR,LF_RMOVMAG->QUANT*349@->FC|_USER,*SEGNOCAUS,Q END SECTION MOVIMENTO_CAUSALE 1 0 0 FILE LF_RMOVMAG GROUP CAUS - NUMBER FF_QUANTRIGA 12 + NUMERO FF_QUANTRIGA 12 BEGIN FLAGS "H" MESSAGE _NUMEXPR,LF_RMOVMAG->QUANT*349@->FC|_USER,*SEGNOCAUS,Q END - NUMBER FF_STAMPASALDOPREC 6 + NUMERO FF_STAMPASALDOPREC 6 BEGIN FLAGS "H" END - NUMBER FF_CANPRINTSALDOPREC 6 + NUMERO FF_CANPRINTSALDOPREC 6 BEGIN FLAGS "H" MESSAGE _USER,CANPRINTSALDOPREC END SECTION MOVS_PRECEDENTI 1 0 0 STREXPR LF_MOVMAG->DATAREG<"" - NUMBER 103 30 + NUMERO 103 30 BEGIN PROMPT 31 1 "Quantita' a saldo prec:" PICTURE "###.##@,@##" @@ -346,39 +345,38 @@ SECTION BODY ODD 0 FIELD LF_RMOVMAG->UM END - NUMBER 104 12 + VALUTA 104 12 BEGIN PROMPT 42 1 "" - PICTURE "###.###.###" + FLAGS "U" FIELD LF_RMOVMAG->PREZZO END - NUMBER 103 12 + NUMERO 103 12 BEGIN PROMPT 31 1 "" PICTURE "###.##@,@##" MESSAGE _NUMEXPR,#FF_QUANTRIGA|ADD,FF_SALDO_MOV END - NUMBER 105 12 + VALUTA 105 12 BEGIN - PROMPT 54 1 "" - PICTURE "###.###.###" + PROMPT 57 1 "" MESSAGE _NUMEXPR,LF_RMOVMAG->QUANT*LF_RMOVMAG->PREZZO|_USER,*SEGNOCAUS,V|ADD,FF_VALORE_MOV END END // sezione movimenti di competenza END // SEZIONE righe movimento di competenza ragg. per causale SECTION STAMPASALDOPREC 1 1 1 NUMEXPR (#FF_STAMPASALDOPREC==0)&&(#FF_CANPRINTSALDOPREC!=0) - NUMBER 100 18 + NUMERO 100 18 BEGIN PROMPT 8 1 "Saldo precedente :" END - NUMBER FF_SALDOPREC 12 + NUMERO FF_SALDOPREC 15 BEGIN PROMPT 46 1 "" - PICTURE "###.##@,@##" + PICTURE "##.###.##@,@##" MESSAGE _USER,SALDOPREC|ADD,FF_SALDO_GRMOV END - NUMBER 101 12 + NUMERO 101 12 BEGIN FLAGS "H" MESSAGE RESET,FF_SALDOPREC |INC,FF_STAMPASALDOPREC @@ -392,7 +390,7 @@ SECTION BODY ODD 0 SECTION TOTALI_MOV 1 1 1 NUMEXPR #FF_SALDO_MOV!=0 SECTION HEADER_MOV 1 1 1 NUMEXPR (#FF_NUMRIGHE==0) - NUMBER FF_NUM_MOV 32 + NUMERO FF_NUM_MOV 32 BEGIN PROMPT 2 1 "Mov. " END @@ -406,16 +404,16 @@ SECTION BODY ODD 0 END STRINGA FF_TIPOCF_MOV 1 BEGIN - PROMPT 60 1 "" + PROMPT 63 1 "" END NUMERO FF_CODCF_MOV 6 BEGIN - PROMPT 62 1 "" + PROMPT 65 1 "" PICTURE "######" END STRINGA FF_CLIFO_MOV 50 BEGIN - PROMPT 70 1 "" + PROMPT 73 1 "" END END // header mov della scheda @@ -432,22 +430,20 @@ SECTION BODY ODD 0 PROMPT 42 1 "" FIELD LF_UMART->UM END - NUMBER FF_SALDO_MOV 12 + NUMERO FF_SALDO_MOV 15 BEGIN PROMPT 46 1 "" - PICTURE "###.##@,@##" + PICTURE "##.###.##@,@##" MESSAGE _USER,ADDQTA,FF_SALDO_GRMOV END - NUMBER FF_VALORE_MOV 15 + VALUTA FF_VALORE_MOV 15 BEGIN - PROMPT 69 1 "" - PICTURE "###.###.###.##@" + PROMPT 72 1 "" MESSAGE _USER,ADDVAL,FF_VALORE_GRMOV END - NUMBER 100 12 + VALUTA 190 12 BEGIN - PROMPT 57 1 "" - PICTURE "###.###.##@" + PROMPT 60 1 "" MESSAGE _NUMEXPR,#FF_VALORE_MOV/#FF_SALDO_MOV|INC,FF_NUMRIGHE END END // totali mov @@ -466,58 +462,21 @@ SECTION BODY ODD 0 FIELD LF_UMART->UM MESSAGE COPY,FF_UM_GART END - NUMBER FF_SALDO_GRMOV 12 + NUMERO FF_SALDO_GRMOV 15 BEGIN PROMPT 46 1 "" - PICTURE "###.##@,@##" + PICTURE "##.###.##@,@##" MESSAGE ADD,FF_SALDO_GART END - NUMBER FF_VALORE_GRMOV 15 + VALUTA FF_VALORE_GRMOV 15 BEGIN - PROMPT 69 1 "" - PICTURE "###.###.###.##@" + PROMPT 72 1 "" MESSAGE ADD,FF_VALORE_GART END END // TOTALI scheda per articolo END // loop RMOVMAG - SECTION TOTALI_MOV_ARTICOLO 1 0 0 GROUP // NUMEXPR #FF_SALDO_MOV!=0 - FLAGS "D" - // da eliminare !!!!!!!!!!! - /* - NUMBER FF_NUM_MOVART 32 - BEGIN - PROMPT 2 1 "Mov. " - END - STRINGA FF_DATA_MOVART 10 - BEGIN - PROMPT 12 1 "del " - END - STRINGA 100 2 - BEGIN - PROMPT 27 1 "" - FIELD LF_UMART->UM - END - NUMBER FF_SALDO_MOVART 12 - BEGIN - PROMPT 31 1 "" - PICTURE "###.##@,@##" - MESSAGE ADD,FF_SALDO_GRMOV - END - NUMBER 100 12 - BEGIN - PROMPT 42 1 "" - PICTURE "###.###.##@" - MESSAGE _NUMEXPR,#FF_VALORE_MOV/#FF_SALDO_MOV - END - NUMBER FF_VALORE_MOVART 12 - BEGIN - PROMPT 54 1 "" - PICTURE "###.###.##@" - MESSAGE ADD,FF_VALORE_GRMOV - END - */ - END // totali mov + END // ragg articolo (codice o catmer) SECTION TOTALI_GRUPPIART 1 1 3 GROUP //PG057 NUMEXPR #FF_SALDO_GART!=0 @@ -530,15 +489,14 @@ SECTION BODY ODD 0 PROMPT 42 1 "" FIELD LF_UMART->UM END - NUMBER FF_SALDO_GART 12 + NUMERO FF_SALDO_GART 15 BEGIN PROMPT 46 1 "" - PICTURE "###.##@,@##" + PICTURE "##.###.##@,@##" END - NUMBER FF_VALORE_GART 15 + VALUTA FF_VALORE_GART 15 BEGIN - PROMPT 69 1 "" - PICTURE "###.###.###.##@" + PROMPT 72 1 "" END END // TOTALI scheda per articolo diff --git a/mg/mg3300as.frm b/mg/mg3300as.frm new file mode 100755 index 000000000..513f0d728 --- /dev/null +++ b/mg/mg3300as.frm @@ -0,0 +1,479 @@ +// form stampa schede per articolo +#include "mg3300.h" +USE LF_ANAMAG +SORT LF_RMOVMAG BY CODART[1,2] NUMREG + USING LF_MOVMAG INTO NUMREG==NUMREG + JOIN TO LF_ANAMAG KEY 2 INTO CODART==CODART +JOIN LF_MAG TO LF_RMOVMAG KEY 2 INTO ANNOES==1990 CODMAG==CODMAG CODART==CODART LIVELLO==LIVGIAC +JOIN LF_MOVMAG TO LF_RMOVMAG INTO NUMREG==NUMREG +//JOIN %CAU TO LF_RMOVMAG ALIAS ALIAS_CAU_RIGHE INTO CODTAB==CODCAUS +//JOIN %CAU TO LF_MOVMAG ALIAS ALIAS_CAU_MOV INTO CODTAB==CODCAUS + +JOIN MAG TO LF_RMOVMAG ALIAS ALIAS_MAG INTO CODTAB==CODMAG[1,3] +JOIN MAG TO LF_RMOVMAG ALIAS ALIAS_DEP INTO CODTAB==CODMAG +JOIN GMC TO LF_ANAMAG ALIAS ALIAS_CATMER INTO CODTAB==GRMERC[1,3] +JOIN GMC TO LF_ANAMAG ALIAS ALIAS_SOTTOCATMER INTO CODTAB==GRMERC[1,5] + +JOIN LF_UMART TO LF_ANAMAG INTO CODART==CODART +JOIN LF_UMART TO LF_RMOVMAG KEY 2 ALIAS 349 INTO CODART==CODART UM==UM + +JOIN LF_CLIFO TO LF_MOVMAG INTO TIPOCF==TIPOCF CODCF==CODCF + +END + +DESCRIPTION +BEGIN + 47->* "Anagrafica articoli" + 109->* "Archivio Giacenze" + MAG->* "Tabella magazzini" + 110->* "Movimenti di magazzino" + 111->* "Righe Movimenti di magazzino" + 49->* "Unità di misura articoli" +END + +GENERAL +BEGIN + OFFSET 0 1 +END + +SECTION GRAPHIC +BEGIN +END + +SECTION HEADER ODD 5 + STRINGA 1 40 1 + BEGIN + KEY "nome ditta" + PROMPT 1 1 "Ditta " + MESSAGE _DITTA, !RAGSOC + END + + STRINGA 2 10 + BEGIN + KEY "Data" + PROMPT 85 1 "Data " + MESSAGE _TODAY + END + + NUMERO 3 7 + BEGIN + KEY "Nr. pagina" + PROMPT 101 1 "Pagina " + MESSAGE _PAGENO + END + + DATA 20 + BEGIN + KEY "Data inizio" + PROMPT 1 2 "Dal " + MESSAGE _USER,DADATA + END + + DATA 21 + BEGIN + KEY "Data fine" + PROMPT 17 2 "Al " + MESSAGE _USER,ADATA + END + + STRINGA 4 45 + BEGIN + KEY "Intestazione stampa" + PROMPT 45 2 "Stampa schede di magazzino :" + MESSAGE _USER,TIPOSCHEDA + END + + STRINGA 5 115 + BEGIN + KEY "Separatore (iniziale)" + PROMPT 1 3 "-------------------------------------------------------------------------------------------------------------------" + END + STRINGA 1 4 + BEGIN + PROMPT 1 4 "Mov." + END + STRINGA 2 3 + BEGIN + PROMPT 11 4 "Del" + END + STRINGA 3 11 + BEGIN + PROMPT 20 4 "Descrizione" + END + STRINGA 6 3 + BEGIN + PROMPT 62 4 "UM" + END + NUMERO 7 12 + BEGIN + PROMPT 66 4 "Quantità" + END + VALUTA 8 12 + BEGIN + PROMPT 82 4 "Prezzo" + FLAGS "U" + END + VALUTA 9 12 + BEGIN + PROMPT 96 4 "Valore" + END + STRINGA 10 5 + BEGIN + PROMPT 110 4 "Caus." + END + STRINGA 5 115 + BEGIN + KEY "Separatore (iniziale)" + PROMPT 1 5 "-------------------------------------------------------------------------------------------------------------------" + END +END + +SECTION BODY ODD 0 + + NUMERO 100 1 + BEGIN + FLAGS "H" + MESSAGE RESET,FF_SALDO_GART|RESET,FF_VALORE_GART + END + + SECTION HEADER_ARTICOLO 1 2 2 NORMAL GROUP + FLAGS "N" + SECTION HEADER_CATMER 1 2 1 GROUP + STRINGA 10 20 1 + BEGIN + KEY "CODICE CATMER" + PROMPT 1 1 "Gruppo merceologico " + MESSAGE _USER,CODCATMER|RESET,FF_STAMPASALDOPREC + END + STRINGA 12 50 1 + BEGIN + KEY "DESCR." + PROMPT 30 1 "" + MESSAGE _USER,CATMER + END + END //HEADER catmer + + STRINGA 10 20 1 + BEGIN + KEY "CODICE articolo" + PROMPT 1 1 "Articolo " + MESSAGE _USER,CODGRUPPOART|RESET,FF_STAMPASALDOPREC + END + + STRINGA 11 50 1 + BEGIN + KEY "DESCR.articolo" + PROMPT 30 1 "" + MESSAGE _USER,GRUPPOART + END + STRINGA 24 115 1 + BEGIN + KEY "dep" + PROMPT 1 2 "-------------------------------------------------------------------------------------------------------------------" + END + END //HEADER articolo + + SECTION GRUPPI_ARTICOLO 1 0 0 FILE LF_ANAMAG BY CODART + SECTION FILE_RMOVMAG 1 1 0 FILE LF_RMOVMAG + SECTION HEADER_GRMOV 1 2 2 NORMAL GROUP + SECTION HEADER_LIVGIACCATMER 1 1 1 GROUP + STRINGA 10 20 1 + BEGIN + KEY "CODICE CATMER" + PROMPT 1 1 "Gruppo merceologico " + MESSAGE _USER,CODCATMER|RESET,FF_STAMPASALDOPREC + END + STRINGA 12 50 1 + BEGIN + KEY "DESCR." + PROMPT 30 1 "" + MESSAGE _USER,CATMER + END + END //HEADER catmer + + STRINGA 10 20 1 + BEGIN + KEY "CODICE articolo" + PROMPT 1 1 "Gruppo " + MESSAGE _USER,CODGRUPPOART|RESET,FF_STAMPASALDOPREC + END + STRINGA 11 50 1 + BEGIN + KEY "DESCR.articolo" + PROMPT 30 1 "" + MESSAGE _USER,GRUPPOART + END + SECTION HEADER_LIVGIAC 2 1 1 GROUP + STRINGA 20 20 1 + BEGIN + KEY "CODICE livello" + PROMPT 1 1 "" + MESSAGE _USER,CODGRUPPOGIAC + END + STRINGA 21 50 1 + BEGIN + KEY "Livello giac" + PROMPT 23 1 "" + MESSAGE _USER,GRUPPOGIAC + END + END + SECTION HEADER_MAG 2 1 1 GROUP + STRINGA 22 50 1 + BEGIN + KEY "mag" + PROMPT 3 1 "Magazzino " + FIELD ALIAS_MAG@->S0 + END + SECTION HEADER_DEP 2 1 1 STR_EXPR ALIAS_MAG@->B0=="X" + STRINGA 23 50 1 + BEGIN + KEY "dep" + PROMPT 5 1 "Deposito " + FIELD ALIAS_DEP@->S0 + END + END // HEADER deposito + END // HEADER magazzino + STRINGA 24 115 + BEGIN + KEY "dep" + PROMPT 1 2 "-------------------------------------------------------------------------------------------------------------------" + END + END // HEADER raggruppamenti di movimenti + + STRINGA 10 + BEGIN + FLAGS "H" + MESSAGE RESET,FF_SALDO_GRMOV|RESET,FF_VALORE_GRMOV + END + + SECTION GRUPPI_RMOVMAG 1 0 0 FILE LF_RMOVMAG GROUP CODART + + SECTION H_MOVS_INTERESSATI 1 0 0 STREXPR LF_MOVMAG->DATAREG>"" + NUMERO 10 + BEGIN + FLAGS "H" + FIELD LF_RMOVMAG->NUMREG + MESSAGE COPY,FF_NUM_MOV + END + NUMERO 11 + BEGIN + FLAGS "H" + FIELD LF_MOVMAG->DATAREG + MESSAGE COPY,FF_DATA_MOV + END + + STRINGA 12 + BEGIN + FLAGS "H" + FIELD LF_MOVMAG->DESCR + MESSAGE COPY,FF_DESCR_MOV + END + + NUMERO 16 + BEGIN + FLAGS "H" + MESSAGE RESET,FF_NUMRIGHE + END + END // header mov + + SECTION MOVIMENTO 1 0 0 FILE LF_RMOVMAG GROUP NUMREG + + NUMERO FF_NUMRIGHE + BEGIN + KEY "Contatore del numero di righe raggruppate" + END + + NUMERO 13 + BEGIN + FLAGS "H" + MESSAGE _USER,CAUSALERIGA|COPY,FF_CAUSALE_RIGA|RESET,FF_SALDO_MOV|RESET,FF_VALORE_MOV + END + NUMERO FF_QUANTRIGA 12 + BEGIN + FLAGS "H" + MESSAGE _NUMEXPR,LF_RMOVMAG->QUANT*349@->FC|_USER,*SEGNOCAUS,Q + END + SECTION MOVIMENTO_CAUSALE 1 0 0 FILE LF_RMOVMAG GROUP CAUS + + NUMERO FF_QUANTRIGA 12 + BEGIN + FLAGS "H" + MESSAGE _NUMEXPR,LF_RMOVMAG->QUANT*349@->FC|_USER,*SEGNOCAUS,Q + END + + NUMERO FF_STAMPASALDOPREC 6 + BEGIN + FLAGS "H" + END + + NUMERO FF_CANPRINTSALDOPREC 6 + BEGIN + FLAGS "H" + MESSAGE _USER,CANPRINTSALDOPREC + END + + SECTION MOVS_PRECEDENTI 1 0 0 STREXPR LF_MOVMAG->DATAREG<"" + NUMERO 103 30 + BEGIN + PROMPT 31 1 "Quantita' a saldo prec:" + PICTURE "###.##@,@##" + MESSAGE _NUMEXPR,#FF_QUANTRIGA|ADD,FF_SALDOPREC + END + END + + SECTION MOVS_INTERESSATI 1 0 0 STREXPR LF_MOVMAG->DATAREG>="" + + STRINGA 100 30 + BEGIN + PROMPT 1 1 "" + MESSAGE _STREXPR,LF_RMOVMAG->CODART+"/"+LF_RMOVMAG->LIVGIAC+":"+LF_RMOVMAG->CODMAG + END + + STRINGA 101 12 + BEGIN + PROMPT 27 1 "" + FIELD LF_RMOVMAG->UM + END + + VALUTA 104 12 + BEGIN + PROMPT 42 1 "" + FLAGS "U" + FIELD LF_RMOVMAG->PREZZO + END + NUMERO 103 12 + BEGIN + PROMPT 31 1 "" + PICTURE "###.##@,@##" + MESSAGE _NUMEXPR,#FF_QUANTRIGA|ADD,FF_SALDO_MOV + END + VALUTA 105 12 + BEGIN + PROMPT 57 1 "" + MESSAGE _NUMEXPR,LF_RMOVMAG->QUANT*LF_RMOVMAG->PREZZO|_USER,*SEGNOCAUS,V|ADD,FF_VALORE_MOV + END + END // sezione movimenti di competenza + END // SEZIONE righe movimento di competenza ragg. per causale + + SECTION STAMPASALDOPREC 1 1 1 NUMEXPR (#FF_STAMPASALDOPREC==0)&&(#FF_CANPRINTSALDOPREC!=0) + NUMERO 100 18 + BEGIN + PROMPT 20 1 "Saldo precedente :" + END + NUMERO FF_SALDOPREC 15 + BEGIN + PROMPT 66 1 "" + PICTURE "##.###.##@,@##" + MESSAGE _USER,SALDOPREC|ADD,FF_SALDO_GRMOV + END + NUMERO 101 12 + BEGIN + FLAGS "H" + MESSAGE RESET,FF_SALDOPREC |INC,FF_STAMPASALDOPREC + END + STRINGA 102 12 + BEGIN + PROMPT 62 1 "" + FIELD LF_UMART->UM + END + END // stampa saldo precedente + SECTION TOTALI_MOV 1 1 1 NUMEXPR #FF_SALDO_MOV!=0 + + STRINGA FF_CAUSALE_RIGA 5 + BEGIN + PROMPT 110 1 "" + END + NUMERO FF_NUM_MOV 6 + BEGIN + PROMPT 1 1 "" + END + STRINGA FF_DATA_MOV 10 + BEGIN + PROMPT 8 1 "" + END + STRINGA FF_DESCR_MOV 40 + BEGIN + PROMPT 20 1 "" + END + + STRINGA 100 2 + BEGIN + PROMPT 62 1 "" + FIELD LF_UMART->UM + END + NUMERO FF_SALDO_MOV 15 + BEGIN + PROMPT 66 1 "" + PICTURE "##.###.##@,@##" + MESSAGE _USER,ADDQTA,FF_SALDO_GRMOV + END + VALUTA FF_VALORE_MOV 15 + BEGIN + PROMPT 92 1 "" + MESSAGE _USER,ADDVAL,FF_VALORE_GRMOV + END + VALUTA 190 12 + BEGIN + PROMPT 80 1 "" + MESSAGE _NUMEXPR,#FF_VALORE_MOV/#FF_SALDO_MOV|INC,FF_NUMRIGHE + END + END // totali mov + + END // loop movimento + END // loop scheda + SECTION TOTALI_GRMOV 1 1 3 GROUP //PG057 NUMEXPR #FF_SALDO_GRMOV!=0 + + STRINGA 100 15 + BEGIN + PROMPT 20 1 "Totale scheda" + END + STRINGA 100 2 + BEGIN + PROMPT 62 1 "" + FIELD LF_UMART->UM + MESSAGE COPY,FF_UM_GART + END + NUMERO FF_SALDO_GRMOV 15 + BEGIN + PROMPT 66 1 "" + PICTURE "##.###.##@,@##" + MESSAGE ADD,FF_SALDO_GART + END + VALUTA FF_VALORE_GRMOV 15 + BEGIN + PROMPT 92 1 "" + MESSAGE ADD,FF_VALORE_GART + END + END // TOTALI scheda per articolo + END // loop RMOVMAG + + + + END // ragg articolo (codice o catmer) + SECTION TOTALI_GRUPPIART 1 1 3 GROUP //PG057 NUMEXPR #FF_SALDO_GART!=0 + STRINGA 100 15 + BEGIN + PROMPT 20 1 "Totale scheda" + END + STRINGA FF_UM_GART 2 + BEGIN + PROMPT 62 1 "" + FIELD LF_UMART->UM + END + NUMERO FF_SALDO_GART 15 + BEGIN + PROMPT 66 1 "" + PICTURE "##.###.##@,@##" + END + VALUTA FF_VALORE_GART 15 + BEGIN + PROMPT 92 1 "" + END + END // TOTALI scheda per articolo + +END // ***** + +SECTION FOOTER ODD 2 + +END + diff --git a/mg/mg3300b.frm b/mg/mg3300b.frm index 60379839c..c7c3adb19 100755 --- a/mg/mg3300b.frm +++ b/mg/mg3300b.frm @@ -48,14 +48,14 @@ SECTION HEADER ODD 5 STRINGA 2 10 BEGIN KEY "Data" - PROMPT 120 1 "Data " + PROMPT 65 1 "Data " MESSAGE _TODAY END NUMERO 3 7 BEGIN KEY "Nr. pagina" - PROMPT 137 1 "Pagina " + PROMPT 81 1 "Pagina " MESSAGE _PAGENO END @@ -80,10 +80,10 @@ SECTION HEADER ODD 5 MESSAGE _USER,TIPOSCHEDA END - STRINGA 5 146 + STRINGA 5 95 BEGIN KEY "Separatore (iniziale)" - PROMPT 1 3 "------------------------------------------------------------------------------------------------------------------------------------------------------" + PROMPT 1 3 "-----------------------------------------------------------------------------------------------" END STRINGA 6 12 BEGIN @@ -91,20 +91,21 @@ SECTION HEADER ODD 5 END NUMBER 7 12 BEGIN - PROMPT 46 4 "Quantità" + PROMPT 50 4 "Quantità" END - NUMBER 8 12 + VALUTA 8 12 BEGIN - PROMPT 62 4 "Prezzo" + PROMPT 66 4 "Prezzo" + FLAGS "U" END NUMBER 9 15 BEGIN - PROMPT 78 4 "Valore" + PROMPT 81 4 "Valore" END - STRINGA 5 146 + STRINGA 5 95 BEGIN KEY "Separatore (iniziale)" - PROMPT 1 5 "------------------------------------------------------------------------------------------------------------------------------------------------------" + PROMPT 1 5 "-----------------------------------------------------------------------------------------------" END END @@ -191,10 +192,10 @@ SECTION BODY ODD 2 END END // HEADER livgiac END //HEADER articolo - STRINGA 24 50 1 + STRINGA 24 95 BEGIN KEY "dep" - PROMPT 1 2 "------------------------------------------------------------------------------------------------------------------------------------------------------" + PROMPT 1 2 "-----------------------------------------------------------------------------------------------" END END // HEADER magazzino @@ -279,11 +280,10 @@ SECTION BODY ODD 2 PROMPT 27 1 "" FIELD LF_RMOVMAG->UM END - - NUMBER 104 12 + VALUTA 104 12 BEGIN PROMPT 42 1 "" - PICTURE "###.###.###" + FLAGS "U" FIELD LF_RMOVMAG->PREZZO END NUMBER 103 12 @@ -292,10 +292,9 @@ SECTION BODY ODD 2 PICTURE "###.##@,@##" MESSAGE _NUMEXPR,#FF_QUANTRIGA|ADD,FF_SALDO_MOV END - NUMBER 105 12 + VALUTA 105 12 BEGIN - PROMPT 54 1 "" - PICTURE "###.###.###" + PROMPT 57 1 "" MESSAGE _NUMEXPR,LF_RMOVMAG->QUANT*LF_RMOVMAG->PREZZO|_USER,*SEGNOCAUS,V|ADD,FF_VALORE_MOV END END // sezione movimento di competenza @@ -306,10 +305,10 @@ SECTION BODY ODD 2 BEGIN PROMPT 8 1 "Saldo precedente :" END - NUMBER FF_SALDOPREC 12 + NUMBER FF_SALDOPREC 15 BEGIN - PROMPT 31 1 "" - PICTURE "###.##@,@##" + PROMPT 46 1 "" + PICTURE "##.###.##@,@##" MESSAGE _USER,SALDOPREC|ADD,FF_SALDO_GART END NUMBER 101 12 @@ -319,7 +318,7 @@ SECTION BODY ODD 2 END STRINGA 102 12 BEGIN - PROMPT 27 1 "" + PROMPT 42 1 "" FIELD LF_UMART->UM END END // stampa saldo precedente @@ -350,22 +349,21 @@ SECTION BODY ODD 2 PROMPT 42 2 "" FIELD LF_UMART->UM END - NUMBER FF_SALDO_MOV 12 + NUMBER FF_SALDO_MOV 15 BEGIN PROMPT 46 2 "" - PICTURE "###.##@,@##" + PICTURE "##.###.##@,@##" MESSAGE _USER,ADDQTA,FF_SALDO_GART END - NUMBER FF_VALORE_MOV 15 + VALUTA FF_VALORE_MOV 15 BEGIN - PROMPT 69 2 "" - PICTURE "###.###.###.##@" + PROMPT 72 2 "" MESSAGE _USER,ADDVAL,FF_VALORE_GART END - NUMBER 100 12 + VALUTA 190 12 BEGIN - PROMPT 57 2 "" - PICTURE "###.###.##@" + PROMPT 60 2 "" + FLAGS "U" MESSAGE _NUMEXPR,#FF_VALORE_MOV/#FF_SALDO_MOV END END // totali mov @@ -382,15 +380,14 @@ SECTION BODY ODD 2 PROMPT 42 1 "" FIELD LF_UMART->UM END - NUMBER FF_SALDO_GART 12 + NUMBER FF_SALDO_GART 15 BEGIN PROMPT 46 1 "" - PICTURE "###.##@,@##" + PICTURE "##.###.##@,@##" END - NUMBER FF_VALORE_GART 15 + VALUTA FF_VALORE_GART 15 BEGIN - PROMPT 69 1 "" - PICTURE "###.###.###.##@" + PROMPT 72 1 "" END END // TOTALI scheda per articolo END // loop RMOVMAG raggruppate diff --git a/mg/mg3300bs.frm b/mg/mg3300bs.frm new file mode 100755 index 000000000..6b056526f --- /dev/null +++ b/mg/mg3300bs.frm @@ -0,0 +1,406 @@ +// form stampa schede per magazzino +#include "mg3300.h" +USE LF_RMOVMAG KEY 2 BY CODMAG CODART LIVGIAC LF_MOVMAG->DATAREG NUMREG +JOIN LF_MAG TO LF_RMOVMAG KEY 2 INTO ANNOES==1996 CODMAG==CODMAG CODART==CODART LIVELLO==LIVGIAC +JOIN LF_ANAMAG TO LF_RMOVMAG INTO CODART==CODART +JOIN LF_MOVMAG TO LF_RMOVMAG INTO NUMREG==NUMREG +JOIN %CAU TO LF_MOVMAG INTO CODTAB==CODCAUS + +JOIN MAG TO LF_RMOVMAG ALIAS 500 INTO CODTAB==CODMAG[1,3] +JOIN MAG TO LF_RMOVMAG ALIAS 501 INTO CODTAB==CODMAG + +JOIN GMC TO LF_ANAMAG ALIAS ALIAS_CATMER INTO CODTAB==GRMERC[1,3] +JOIN GMC TO LF_ANAMAG ALIAS ALIAS_SOTTOCATMER INTO CODTAB==GRMERC[1,5] + +JOIN LF_UMART TO LF_ANAMAG INTO CODART==CODART +JOIN LF_UMART TO LF_RMOVMAG KEY 2 ALIAS 349 INTO CODART==CODART UM==UM +END + +DESCRIPTION +BEGIN + 47->* "Anagrafica articoli" + 109->* "Archivio Giacenze" + MAG->* "Tabella magazzini" + 110->* "Movimenti di magazzino" + 111->* "Righe Movimenti di magazzino" + 49->* "Unità di misura articoli" +END + +GENERAL +BEGIN + OFFSET 0 1 +// FONT "Courier New" +// SIZE 12 +END + +SECTION GRAPHIC +BEGIN +END + +SECTION HEADER ODD 5 + STRINGA 1 40 1 + BEGIN + KEY "nome ditta" + PROMPT 1 1 "Ditta " + MESSAGE _DITTA, !RAGSOC + END + + STRINGA 2 10 + BEGIN + KEY "Data" + PROMPT 85 1 "Data " + MESSAGE _TODAY + END + + NUMERO 3 7 + BEGIN + KEY "Nr. pagina" + PROMPT 101 1 "Pagina " + MESSAGE _PAGENO + END + + DATA 20 + BEGIN + KEY "Data inizio" + PROMPT 1 2 "Dal " + MESSAGE _USER,DADATA + END + + DATA 21 + BEGIN + KEY "Data fine" + PROMPT 17 2 "Al " + MESSAGE _USER,ADATA + END + + STRINGA 4 45 + BEGIN + KEY "Intestazione stampa" + PROMPT 45 2 "Stampa schede di magazzino :" + MESSAGE _USER,TIPOSCHEDA + END + + STRINGA 5 115 + BEGIN + KEY "Separatore (iniziale)" + PROMPT 1 3 "-------------------------------------------------------------------------------------------------------------------" + END + STRINGA 1 4 + BEGIN + PROMPT 1 4 "Mov." + END + STRINGA 2 3 + BEGIN + PROMPT 11 4 "Del" + END + STRINGA 3 11 + BEGIN + PROMPT 20 4 "Descrizione" + END + STRINGA 6 3 + BEGIN + PROMPT 62 4 "UM" + END + NUMERO 7 12 + BEGIN + PROMPT 66 4 "Quantità" + END + VALUTA 8 12 + BEGIN + PROMPT 82 4 "Prezzo" + FLAGS "U" + END + VALUTA 9 12 + BEGIN + PROMPT 96 4 "Valore" + END + STRINGA 10 5 + BEGIN + PROMPT 110 4 "Caus." + END + STRINGA 5 115 + BEGIN + KEY "Separatore (iniziale)" + PROMPT 1 5 "-------------------------------------------------------------------------------------------------------------------" + END +END + +SECTION BODY ODD 2 + + NUMBER 100 1 + BEGIN + FLAGS "H" + MESSAGE RESET,FF_SALDO_GART|RESET,FF_VALORE_GART + END + + SECTION HEADER_MAG 1 2 2 GROUP + FLAGS "N" + STRINGA 22 20 1 + BEGIN + KEY "mag" + PROMPT 1 1 "Magazzino " + FIELD 500@->CODTAB[1,3] + END + STRINGA 22 50 1 + BEGIN + KEY "mag" + PROMPT 15 1 "" + FIELD 500@->S0 + END + SECTION HEADER_DEP 2 0 0 GROUP + SECTION HEADER_DEP_VERO 1 1 1 STR_EXPR 500@->B0=="X" + STRINGA 23 20 1 + BEGIN + KEY "dep" + PROMPT 3 1 "Deposito " + FIELD 501@->CODTAB[4,5] + END + STRINGA 23 50 1 + BEGIN + KEY "dep" + PROMPT 15 1 "" + FIELD 501@->S0 + END + END + END // HEADER deposito + SECTION HEADER_CATMER 1 2 1 GROUP + FLAGS "H" + STRINGA 10 20 1 + BEGIN + KEY "CODICE CATMER" + PROMPT 1 1 "Gruppo merceologico " + MESSAGE _USER,CODCATMER + END + STRINGA 12 50 1 + BEGIN + KEY "DESCR." + PROMPT 30 1 "" + MESSAGE _USER,CATMER + END + END //HEADER catmer + + SECTION HEADER_ARTICOLO 2 1 1 GROUP + STRINGA 10 20 1 + BEGIN + KEY "CODICE articolo" + PROMPT 5 1 "Articolo " + MESSAGE _USER,CODGRUPPOART + END + + STRINGA 11 50 1 + BEGIN + KEY "DESCR.articolo" + PROMPT 30 1 "" + MESSAGE _USER,GRUPPOART + END + SECTION HEADER_LIVGIAC 2 1 1 GROUP + STRINGA 20 20 1 + BEGIN + KEY "CODICE livello" + PROMPT 5 1 "" + MESSAGE _USER,CODGRUPPOGIAC + END + STRINGA 21 50 1 + BEGIN + KEY "Livello giac" + PROMPT 23 1 "" + MESSAGE _USER,GRUPPOGIAC + END + END // HEADER livgiac + END //HEADER articolo + STRINGA 24 115 + BEGIN + KEY "dep" + PROMPT 1 2 "-------------------------------------------------------------------------------------------------------------------" + END + END // HEADER magazzino + + SECTION FILE_RMOVMAG 1 0 0 FILE LF_ANAMAG + + STRINGA 10 + BEGIN + FLAGS "H" + MESSAGE RESET,FF_SALDO_GART|RESET,FF_VALORE_GART|RESET,FF_STAMPASALDOPREC + END + + SECTION GRUPPI_RMOVMAG 1 0 0 FILE LF_RMOVMAG GROUP CODMAG+CODART + SECTION H_MOVS_INTERESSATI 1 0 0 STREXPR LF_MOVMAG->DATAREG>"" + + NUMERO 10 + BEGIN + FLAGS "H" + FIELD LF_RMOVMAG->NUMREG + MESSAGE COPY,FF_NUM_MOV|RESET,FF_SALDO_MOV|RESET,FF_VALORE_MOV + END + NUMERO 11 + BEGIN + FLAGS "H" + FIELD LF_MOVMAG->DATAREG + MESSAGE COPY,FF_DATA_MOV + END + NUMERO 12 + BEGIN + FLAGS "H" + FIELD LF_MOVMAG->DESCR + MESSAGE COPY,FF_DESCR_MOV + END + NUMERO 13 + BEGIN + FLAGS "H" + MESSAGE _USER,CAUSALERIGA|COPY,FF_CAUSALE_RIGA + END + END // header mov + + SECTION MOVIMENTO 1 0 0 FILE LF_RMOVMAG GROUP NUMREG + + NUMBER FF_QUANTRIGA 12 + BEGIN + FLAGS "H" + MESSAGE _NUMEXPR,LF_RMOVMAG->QUANT*349@->FC|_USER,*SEGNOCAUS,Q + END + + NUMBER FF_STAMPASALDOPREC 30 + BEGIN + FLAGS "H" + END + + NUMBER FF_CANPRINTSALDOPREC 6 + BEGIN + FLAGS "H" + MESSAGE _USER,CANPRINTSALDOPREC + END + + SECTION MOVS_PRECEDENTI 1 0 0 STREXPR LF_MOVMAG->DATAREG<"" + NUMBER 103 30 + BEGIN + PROMPT 31 1 "Quantita' a saldo prec:" + PICTURE "###.##@,@##" + MESSAGE _NUMEXPR,#FF_QUANTRIGA|ADD,FF_SALDOPREC + END + END + + SECTION MOVS_INTERESSATI 1 0 0 STREXPR LF_MOVMAG->DATAREG>="" + STRINGA 100 30 + BEGIN + PROMPT 1 1 ">>>" + MESSAGE _STREXPR,LF_RMOVMAG->CODART+" "+LF_RMOVMAG->LIVGIAC+" "+LF_RMOVMAG->CODMAG + END + + STRINGA 101 12 + BEGIN + PROMPT 27 1 "" + FIELD LF_RMOVMAG->UM + END + VALUTA 104 12 + BEGIN + PROMPT 42 1 "" + FLAGS "U" + FIELD LF_RMOVMAG->PREZZO + END + NUMBER 103 12 + BEGIN + PROMPT 31 1 "" + PICTURE "###.##@,@##" + MESSAGE _NUMEXPR,#FF_QUANTRIGA|ADD,FF_SALDO_MOV + END + VALUTA 105 12 + BEGIN + PROMPT 57 1 "" + MESSAGE _NUMEXPR,LF_RMOVMAG->QUANT*LF_RMOVMAG->PREZZO|_USER,*SEGNOCAUS,V|ADD,FF_VALORE_MOV + END + END // sezione movimento di competenza + END // loop movimento + + SECTION STAMPASALDOPREC 1 1 1 NUMEXPR (#FF_STAMPASALDOPREC==0)&&(#FF_CANPRINTSALDOPREC!=0) + NUMBER 100 18 + BEGIN + PROMPT 20 1 "Saldo precedente :" + END + NUMBER FF_SALDOPREC 15 + BEGIN + PROMPT 66 1 "" + PICTURE "##.###.##@,@##" + MESSAGE _USER,SALDOPREC|ADD,FF_SALDO_GART + END + NUMBER 101 12 + BEGIN + FLAGS "H" + MESSAGE RESET,FF_SALDOPREC |INC,FF_STAMPASALDOPREC + END + STRINGA 102 12 + BEGIN + PROMPT 62 1 "" + FIELD LF_UMART->UM + END + END // stampa saldo precedente + + SECTION TOTALI_MOV 1 1 1 NUMEXPR #FF_SALDO_MOV!=0 + STRINGA FF_CAUSALE_RIGA 5 + BEGIN + PROMPT 110 1 "" + END + NUMBER FF_NUM_MOV 6 + BEGIN + PROMPT 1 1 "" + END + STRINGA FF_DATA_MOV 10 + BEGIN + PROMPT 8 1 "" + END + STRINGA FF_DESCR_MOV 40 + BEGIN + PROMPT 20 1 "" + END + STRINGA 100 2 + BEGIN + PROMPT 62 1 "" + FIELD LF_UMART->UM + END + NUMBER FF_SALDO_MOV 15 + BEGIN + PROMPT 66 1 "" + PICTURE "##.###.##@,@##" + MESSAGE _USER,ADDQTA,FF_SALDO_GART + END + VALUTA FF_VALORE_MOV 15 + BEGIN + PROMPT 92 1 "" + MESSAGE _USER,ADDVAL,FF_VALORE_GART + END + VALUTA 190 12 + BEGIN + PROMPT 80 1 "" + FLAGS "U" + MESSAGE _NUMEXPR,#FF_VALORE_MOV/#FF_SALDO_MOV + END + END // totali mov + END // loop scheda + + SECTION TOTALI_GART 1 1 3 GROUP + + STRINGA 100 15 + BEGIN + PROMPT 20 1 "Totale scheda" + END + STRINGA 100 2 + BEGIN + PROMPT 62 1 "" + FIELD LF_UMART->UM + END + NUMBER FF_SALDO_GART 15 + BEGIN + PROMPT 66 1 "" + PICTURE "##.###.##@,@##" + END + VALUTA FF_VALORE_GART 15 + BEGIN + PROMPT 92 1 "" + END + END // TOTALI scheda per articolo + END // loop RMOVMAG raggruppate +END // ***** + +SECTION FOOTER ODD 2 + +END + diff --git a/mg/mg3500.cpp b/mg/mg3500.cpp index c9a541590..7f1fbe679 100755 --- a/mg/mg3500.cpp +++ b/mg/mg3500.cpp @@ -2,22 +2,12 @@ #include "mglib.h" #include "mg3500.h" +#include "mg3500a.h" #include "mg3frm.h" #include "../cg/cglib01.h" // mg3500 Stampa -class TForm_storgiac : public TForm_stampemg -{ - TSorted_cursor * _sortcur; - bool _use_alternate_cursor; -public: - void use_alternate_cursor(const bool b = TRUE) { _use_alternate_cursor = b; } - virtual TCursor* cursor() const ; - TForm_storgiac(const char *name,const char *code) ; - virtual ~TForm_storgiac(); -}; - TForm_storgiac::TForm_storgiac(const char *name,const char *code) : TForm_stampemg(name,code) { @@ -40,23 +30,6 @@ TCursor* TForm_storgiac::cursor() const ///////////////////////////////////////////////////// // Applicazione ///////////////////////////////////////////////////// -class TStampa_storgiac : public TSkeleton_application -{ - TArray * _files; - TStampemg_mask * _mask; - TCursor * _cur; - TForm_storgiac * _form; // to be moved into TPrint_application - -protected: - virtual bool create(); - virtual bool destroy(); - virtual void main_loop(); - -public: - TStampa_storgiac() {} - virtual ~TStampa_storgiac() {}; -}; - bool TStampa_storgiac::create() { _mask = new TStampemg_mask("mg3500"); @@ -183,6 +156,7 @@ void TStampa_storgiac::main_loop() _cur->relation()->replace(new TLocalisamfile(LF_STOMAG),1,joinexp); _cur->setfilter(cfilter,TRUE); _cur->setregion(darec,arec); + set_def_valuta(*_form); _form->print(); delete _form; } diff --git a/mg/mg3500a.h b/mg/mg3500a.h new file mode 100755 index 000000000..e742c9bdf --- /dev/null +++ b/mg/mg3500a.h @@ -0,0 +1,34 @@ +#ifndef __MG3500A_H +#define __MG3500A_H + +class TForm_storgiac : public TForm_stampemg +{ + TSorted_cursor * _sortcur; + bool _use_alternate_cursor; +public: + void use_alternate_cursor(const bool b = TRUE) { _use_alternate_cursor = b; } + virtual TCursor* cursor() const ; + TForm_storgiac(const char *name,const char *code) ; + virtual ~TForm_storgiac(); +}; + +class TStampa_storgiac : public TSkeleton_application +{ + TArray * _files; + TStampemg_mask * _mask; + TCursor * _cur; + TForm_storgiac * _form; // to be moved into TPrint_application + +protected: + virtual bool create(); + virtual bool destroy(); + virtual void main_loop(); + virtual void set_def_valuta(TForm_storgiac & f) {} + +public: + TStampa_storgiac() {} + virtual ~TStampa_storgiac() {}; +}; + +#endif //__MG3500A_H + diff --git a/mg/mg4.url b/mg/mg4.url index 7caa303c3..ef96a5d0a 100755 --- a/mg/mg4.url +++ b/mg/mg4.url @@ -3,4 +3,4 @@ #define QFIRMNAME "A.G.A. Informatica Srl" #include - +#include diff --git a/mg/mg4100.frm b/mg/mg4100.frm index fcf76d204..1992a38cb 100755 --- a/mg/mg4100.frm +++ b/mg/mg4100.frm @@ -110,7 +110,7 @@ END VALUTA 108 BEGIN KEY "valore" - PROMPT 120 4 "Valore" + PROMPT 122 4 "Valore" END STRINGA 100 132 @@ -282,19 +282,19 @@ SECTION BODY ODD 1 PICTURE "####.###,@##" END - VALUTA 107 11 + VALUTA 107 13 BEGIN KEY "prezzo" PROMPT 99 1 "" FLAGS "U" FIELD LF_RMOVMAG->PREZZO - PICTURE "###.###.##@" + PICTURE "#.###.###.##@" END VALUTA 108 14 BEGIN KEY "valore" - PROMPT 112 1 "" + PROMPT 114 1 "" MESSAGE _NUMEXPR,LF_RMOVMAG->PREZZO*LF_RMOVMAG->QUANT*349@->FC|ADD,15 PICTURE "##.###.###.##@" END @@ -310,7 +310,7 @@ SECTION BODY ODD 1 VALUTA 15 17 BEGIN KEY "totale mov" - PROMPT 109 4 "" + PROMPT 111 4 "" MESSAGE ADD,FL->215 PICTURE "#.###.###.###.##@" END @@ -330,7 +330,7 @@ SECTION FOOTER LAST 3 VALUTA 215 17 BEGIN KEY "totale mov" - PROMPT 109 1 "" + PROMPT 111 1 "" PICTURE "#.###.###.###.##@" END END diff --git a/mg/mg4100.uml b/mg/mg4100.uml index dbef7d6d1..0a174df4f 100755 --- a/mg/mg4100.uml +++ b/mg/mg4100.uml @@ -9,7 +9,7 @@ BEGIN INPUT CODTAB F_ANNOES DISPLAY "Esercizio" CODTAB DISPLAY "Dal@12" D0 - DISPLAY "Al@12" D0 + DISPLAY "Al@12" D1 OUTPUT F_ANNOES CODTAB ADD NONE CHECKTYPE NORMAL diff --git a/mg/mg4200.cpp b/mg/mg4200.cpp index 7fbeef851..f11f0272b 100755 --- a/mg/mg4200.cpp +++ b/mg/mg4200.cpp @@ -1,41 +1,15 @@ #include #include #include +#include #include "../cg/cglib01.h" #include "../ve/veconf.h" #include "mglib.h" #include "mg4200.h" +#include "mg4200a.h" #include "mg4frm.h" -#define MAX_VAL_COLUMNS 6 -class TForm_inventario : public TForm_stampemg -{ - int _colonne; - TSorted_cursor *_sortcur; // Cursore sortato: RAGGFIS+CODART usato in stampe per raggr. fisc. - TConfig *conf_ditta; - bool _use_alternate_cursor; - TArticolo_giacenza_loadable * _curr_art; - TString16 _codlist,_catven; // codici listino e cat vendita - bool _giaceff, // flag inventario di giacenza - _valcomp, // flag valorizzzione finiti o componenti - _alladata; // flag di stampa inventario alla data, per utilizzare TArticolo_giacenza_loadable - TTipo_valorizz _valorizz_scelte[MAX_VAL_COLUMNS]; // valorizzazioni delle varie colonne - - TCurrency *_currency; - TArticolo_giacenza_loadable &curr_art(); -public: - virtual TCursor* cursor() const ; - bool genera_intestazione_supplementare(pagetype p, short y); - void set_parametri(const char * codcm,const char * cod,bool giaceff, bool valcomp, bool alladata); - bool valorizzazione(TForm_item &cf, TTipo_valorizz t); - bool validate(TForm_item &cf, TToken_string &s); - void use_alternate_cursor(const bool b = TRUE) { _use_alternate_cursor = b; } - void add_colval(int tipo); - TForm_inventario(const char *name,const char *code) ; - ~TForm_inventario(); -}; - TCursor* TForm_inventario::cursor() const { if (_use_alternate_cursor) // Se e' settata la stampa per ragg. fisc ritorna il cursore appropriato @@ -48,55 +22,63 @@ bool TForm_inventario::validate(TForm_item &cf, TToken_string &s) const TString code(s.get(0)); // prende il primo parametro, il codice del messaggio TString subcode; - if (code=="_USER") { + if (code=="_USER") + { TLocalisamfile & magfile=relation()->lfile(LF_MAG); TRectype & magrec=magfile.curr(); subcode=s.get(); - if (subcode=="GIAC") { - real v=curr_art().giacenza_corretta(magrec,_giaceff,_valcomp); - cf.set(v.string()); - } - if (subcode=="VAL1") { - valorizzazione(cf,_valorizz_scelte[0]); - } - if (subcode=="VAL2"&& _colonne >=2) { - valorizzazione(cf,_valorizz_scelte[1]); - } - if (subcode=="VAL3" && _colonne >=3) { - valorizzazione(cf,_valorizz_scelte[2]); - } - if (subcode=="VAL4" && _colonne >=4) { - valorizzazione(cf,_valorizz_scelte[3]); - } - if (subcode=="VAL5"&& _colonne >=5) { - valorizzazione(cf,_valorizz_scelte[4]); - } - if (subcode=="VAL6" && _colonne >=6) { - valorizzazione(cf,_valorizz_scelte[5]); - } - if (subcode=="NAMEVAL1") { - cf.set(Nome_valorizz[_valorizz_scelte[0]]); - } - if (subcode=="NAMEVAL2"&& _colonne >=2) { - cf.set(Nome_valorizz[_valorizz_scelte[1]]); - } - if (subcode=="NAMEVAL3" && _colonne >=3) { - cf.set(Nome_valorizz[_valorizz_scelte[2]]); - } - if (subcode=="NAMEVAL4" && _colonne >=4) { - cf.set(Nome_valorizz[_valorizz_scelte[3]]); - } - if (subcode=="NAMEVAL5"&& _colonne >=5) { - cf.set(Nome_valorizz[_valorizz_scelte[4]]); - } - if (subcode=="NAMEVAL6" && _colonne >=6) { - cf.set(Nome_valorizz[_valorizz_scelte[5]]); - } - if (subcode=="LINEATOTALI") { - TString l(29*_colonne+12,'-'); - cf.set(l); - } + if (subcode=="GIAC") + { + real v=curr_art().giacenza_corretta(magrec, FALSE,_valcomp); + cf.set(v.string()); + } + else + if (subcode=="VAL1") + valorizzazione(cf,_valorizz_scelte[0]); + else + if (subcode=="VAL2"&& _colonne >=2) + valorizzazione(cf,_valorizz_scelte[1]); + else + if (subcode=="VAL3" && _colonne >=3) + valorizzazione(cf,_valorizz_scelte[2]); + else + if (subcode=="VAL4" && _colonne >=4) + valorizzazione(cf,_valorizz_scelte[3]); + else + if (subcode=="VAL5"&& _colonne >=5) + valorizzazione(cf,_valorizz_scelte[4]); + else + if (subcode=="VAL6" && _colonne >=6) + valorizzazione(cf,_valorizz_scelte[5]); +/* else + if (subcode=="NAMEVAL1") + cf.set(Nome_valorizz[_valorizz_scelte[0]]); + else + if (subcode=="NAMEVAL2"&& _colonne >=2) + cf.set(Nome_valorizz[_valorizz_scelte[1]]); + else + if (subcode=="NAMEVAL3" && _colonne >=3) + cf.set(Nome_valorizz[_valorizz_scelte[2]]); + else + if (subcode=="NAMEVAL4" && _colonne >=4) + cf.set(Nome_valorizz[_valorizz_scelte[3]]); + else + if (subcode=="NAMEVAL5"&& _colonne >=5) + cf.set(Nome_valorizz[_valorizz_scelte[4]]); + else + if (subcode=="NAMEVAL6" && _colonne >=6) + cf.set(Nome_valorizz[_valorizz_scelte[5]]); */ + else + if (subcode=="LINEATOTALI") + { + TString l(29*_colonne+12,'-'); + cf.set(l); + } } + else + if (code == "_ANNO") + cf.set(format("%d", _annoes)); + return TForm_stampemg::validate(cf, s); } @@ -171,33 +153,33 @@ bool TForm_inventario::valorizzazione(TForm_item &cf, TTipo_valorizz t) // arrotonda le valorizzazioni a costo unitario _currency->set_price(TRUE); _currency->set_num(v); - v = _currency->string(); + v = _currency->get_num(); if (t==valorizz_LIFO) { TString codmag(magrec.get(MAG_CODMAG));codmag.left(3); const TString livello(magrec.get(MAG_LIVELLO)); - v=curr_art().LIFO(annoes,codmag,livello, _giaceff,_valcomp); + v=curr_art().LIFO(annoes,codmag,livello, FALSE,_valcomp); } if (t==valorizz_FIFO) { TString codmag(magrec.get(MAG_CODMAG));codmag.left(3); const TString livello(magrec.get(MAG_LIVELLO)); - v=curr_art().FIFO(annoes,codmag,livello, _giaceff,_valcomp); + v=curr_art().FIFO(annoes,codmag,livello, FALSE,_valcomp); } if (t==valorizz_LIFOa) { TString codmag(magrec.get(MAG_CODMAG));codmag.left(3); const TString livello(magrec.get(MAG_LIVELLO)); - v=curr_art().LIFO_annuale(annoes,codmag,livello, _giaceff,_valcomp); + v=curr_art().LIFO_annuale(annoes,codmag,livello, FALSE,_valcomp); } if (t==valorizz_FIFOa) { TString codmag(magrec.get(MAG_CODMAG));codmag.left(3); const TString livello(magrec.get(MAG_LIVELLO)); - v=curr_art().FIFO_annuale(annoes,codmag,livello, _giaceff,_valcomp); + v=curr_art().FIFO_annuale(annoes,codmag,livello, FALSE,_valcomp); } - const real giac_corretta = curr_art().giacenza_corretta(magrec,_giaceff,_valcomp); + const real giac_corretta = curr_art().giacenza_corretta(magrec, FALSE,_valcomp); v= v * giac_corretta ; _currency->set_price(FALSE); _currency->set_num(v); - cf.set(_currency->string()); + cf.set(_currency->get_num().string()); return TRUE; } @@ -234,13 +216,14 @@ bool TForm_inventario::genera_intestazione_supplementare(pagetype p, short y) return TRUE; } -void TForm_inventario::set_parametri(const char * codcatv,const char * codlist,bool giaceff, bool valcomp, bool alladata) +void TForm_inventario::set_parametri(const char * codcatv,const char * codlist,bool giaceff, bool valcomp, bool alladata, int annoes) { _catven=codcatv; _codlist=codlist; _giaceff=giaceff; _valcomp=valcomp; - _alladata=alladata; + _alladata=alladata; + _annoes = annoes; } TForm_inventario::TForm_inventario(const char *name,const char *code) : @@ -408,27 +391,6 @@ bool TStampainv_mask::handle_codlist(TMask_field &fld, KEY k) // STAMPA anagrafiche -class TStampa_inventario : public TSkeleton_application -{ - TArray * _files; - TStampemg_mask * _mask; - TCursor * _cur; - TForm_inventario * _form; // to be moved into TPrint_application - -protected: - virtual bool create(); - virtual bool destroy(); - virtual void main_loop(); - virtual void on_firm_change(); - - void setprint_permagazzini(); - void setprint_perarticoli(); - void setprint_perarticoli_all(); - bool calcola_giacenze(const bool b = TRUE); - -public: - TStampa_inventario() {} -}; void TStampa_inventario ::on_firm_change() { @@ -460,8 +422,69 @@ bool TStampa_inventario::destroy() return TRUE; } +bool TStampa_inventario::crea_tempmag(const bool b) + +{ + const bool valcomp = *_mask->get(F_FIN_COMP)=='C'; + + TIsamtempfile* temp_mag = new TIsamtempfile(LF_MAG, "tmpmag", TRUE, b); + + TRectype darec(LF_ANAMAG), arec(LF_ANAMAG); + darec.put(ANAMAG_CODART, _mask->get(F_DAART)); + arec.put(ANAMAG_CODART, _mask->get(F_AART)); + + TRelation ana_rel(LF_ANAMAG); + TCursor ana_cur(&ana_rel, "", 1, &darec, &arec); + const TRecnotype items = ana_cur.items(); + ana_cur.freeze(); + + const TDate data_limite(_mask->get_date(F_DATALIM)); + TArticolo_giacenza art_giac; + TString16 annoes(_mask->get(F_ANNOES)); + + TString msg; + msg << "Creazione giacenze temporanee anno " << annoes; + + TProgind pi(items, msg, FALSE, TRUE); + + for (ana_cur = 0L; ana_cur.pos() < items; ++ana_cur) + { + art_giac.read(ana_cur.curr()); + + // Scrive i records sul file temporaneo + TRecord_array& mag = art_giac.mag(annoes); + for (int i = mag.last_row(); i > 0 && temp_mag->good(); i = mag.pred_row(i)) + { + TRectype & magrec = (TRectype &) mag.row(i); + + real v=art_giac.giacenza_corretta(magrec, TRUE, valcomp); + magrec.put(MAG_GIAC, v); + temp_mag->write(magrec); + } + pi.addstatus(1L); + } + + // Se il file è ok lo sostituisce all'interno della relazione del form + const bool rt = temp_mag->good(); + if (!rt) + { + error_box("Errore %d in creazione file temporaneo per saldi di magazzino alla data indicata.", temp_mag->status()); + delete temp_mag; + } + else + if (b) // Non sostituire in caso di stampa tutti gli articoli + _form->relation()->replace(temp_mag); + else + delete temp_mag; // in caso di stampa tutti gli articoli, non cancella fisicamente il file; per riaprirlo poi + + return rt; +} + bool TStampa_inventario::calcola_giacenze(const bool b) { + const bool giaceff = *_mask->get(F_REALE_GIAC)=='R'; + const bool valcomp = *_mask->get(F_FIN_COMP)=='C'; + //Scorre l'anagrafica di magazzino e calcola per ognuno la giacenza alla data indicata //Memorizzando i records in un file temporaneo che avrà lo stesso tracciato di LF_MAG TIsamtempfile* temp_mag = new TIsamtempfile(LF_MAG, "tmpmag", TRUE, b); @@ -494,7 +517,16 @@ bool TStampa_inventario::calcola_giacenze(const bool b) // Scrive i records sul file temporaneo TRecord_array& mag = art_giac.mag(annoes); for (int i = mag.last_row(); i > 0 && temp_mag->good(); i = mag.pred_row(i)) - temp_mag->write(mag.row(i)); + { + TRectype & magrec = (TRectype &) mag.row(i); + + if (giaceff) + { + real v=art_giac.giacenza_corretta(magrec, TRUE,valcomp); + magrec.put(MAG_GIAC, v); + } + temp_mag->write(magrec); + } pi.addstatus(1L); } @@ -521,7 +553,7 @@ void TStampa_inventario::setprint_permagazzini() TRectype darec(LF_MAG),arec(LF_MAG); TString cfilter, espr1, espr2; _cur = _form->cursor(); - // setta il filtro sul cursore + // setta il filtro sul cursore if (*_mask->get(F_FILTRO)=='N') cfilter << "(STR(GIAC!=\"0\"))&&" ; if (*_mask->get(F_FILTRO)=='+') @@ -532,6 +564,10 @@ void TStampa_inventario::setprint_permagazzini() cfilter << "(CODART<=" << '"' << _mask->get(F_AART)<< "\")&&" ; if (cfilter.not_empty()) cfilter.cut(cfilter.len()-2); + if (!totdep) + _form->find_field('B',odd_page,"GRUPPI_DEPOSITO").setcondition("CODMAG[1,3]",_strexpr); + else + _form->find_field('B',odd_page,"GRUPPI_DEPOSITO").setcondition("CODMAG[1,5]",_strexpr); switch (subordine) { case 'C': @@ -559,30 +595,34 @@ void TStampa_inventario::setprint_permagazzini() else espr1.format("ANNOES|CODMAG|%d->GRMERC|CODART|LIVELLO", LF_ANAMAG); _form->set_ordering(mg_cat_merc); - espr2.format("CODMAG[1,3]+CODMAG[1,5]+%d->GRMERC[1,3]", LF_ANAMAG); +// espr2.format("CODMAG[1,3]+CODMAG[1,5]+%d->GRMERC[1,3]", LF_ANAMAG); + espr2.format("%d->GRMERC[1,3]", LF_ANAMAG); _form->find_field('B',odd_page,"GRUPPI_CATMER").setcondition(espr2,_strexpr); if (subordine == 'S') { _form->find_field('B',odd_page,"H_SCATMER").show(); _form->find_field('B',odd_page,"TOT_SCATMER").show(); - m1 << _mask->get(F_DASCATMER); if (m1.len() > 3) m1.left_just(5); - m2 << _mask->get(F_ASCATMER); if (m2.len() > 3) m2.left_just(5); + m1 << _mask->get(F_DASCATMER); + m2 << _mask->get(F_ASCATMER); } else - { + { _form->find_field('B',odd_page,"H_SCATMER").hide(); _form->find_field('B',odd_page,"TOT_SCATMER").hide(); } if (m1.not_empty()) { - espr2.format("&&(%d->GRMERC[1,%d]>=\"%s\")", LF_ANAMAG, m1.len(), (const char*)m1); + espr2.format("&&(%d->GRMERC >= \"%s\")", LF_ANAMAG, (const char*)m1); cfilter << espr2; } if (m2.not_empty()) { - espr2.format("&&(%d->GRMERC[1,%d]<=\"%s\")", LF_ANAMAG, m2.len(), (const char*)m2); + espr2.format("&&(%d->GRMERC <= \"%s\")", LF_ANAMAG, (const char*)m2); cfilter << espr2; } +// espr2.format("CODMAG[1,3]+CODMAG[1,5]+%d->GRMERC", LF_ANAMAG); + espr2.format("%d->GRMERC", LF_ANAMAG); + _form->find_field('B',odd_page,"GRUPPI_SCATMER").setcondition(espr2,_strexpr); } break; case 'R': @@ -620,17 +660,13 @@ void TStampa_inventario::setprint_permagazzini() TRUE,_mask->get_bool(F_TOTALIDEPOSITI),_mask->get_bool(F_DETTAGLIODEP)); ((TSorted_cursor *)_cur)->change_order(espr1); - if (!totdep) - _form->find_field('B',odd_page,"GRUPPI_DEPOSITO").setcondition("CODMAG[1,3]",_strexpr); - else - _form->find_field('B',odd_page,"GRUPPI_DEPOSITO").setcondition("CODMAG[1,5]",_strexpr); darec.put("ANNOES",_mask->get(F_ANNOES)); darec.put("CODMAG",_mask->get(F_DAMAG)); arec.put("ANNOES",_mask->get(F_ANNOES)); arec.put("CODMAG",_mask->get(F_AMAG)); _cur->setfilter(cfilter, TRUE); - _cur->setregion(darec,arec,0x2); + _cur->setregion(darec,arec); } // ORDINAMENTO @@ -692,6 +728,8 @@ void TStampa_inventario::setprint_perarticoli() espr2.format("&&(%d->GRMERC<=\"%s\")", LF_ANAMAG, (const char*)m2); cfilter << espr2; } + espr2.format("%d->GRMERC", LF_ANAMAG); + _form->find_field('B',odd_page,"GRUPPI_SCATMER").setcondition(espr2,_strexpr); } else { @@ -758,10 +796,10 @@ void TStampa_inventario::setprint_perarticoli() if (*_mask->get(F_AART)) cfilter << "&&(CODART<=\"" << _mask->get(F_AART) << "\")"; } - arec.put("ANNOES",_mask->get(F_ANNOES)); - arec.put("CODMAG",_mask->get(F_AMAG)); + arec.put("ANNOES",_mask->get(F_ANNOES)); + arec.put("CODMAG", _mask->get(F_AMAG)); _cur->setfilter(cfilter, subordine != 'C'); - _cur->setregion(darec,arec,0x2); + _cur->setregion(darec,arec); } void TStampa_inventario::setprint_perarticoli_all() @@ -772,7 +810,7 @@ void TStampa_inventario::setprint_perarticoli_all() char subordine=*_mask->get(F_ORDINEART); - _cur = _form->cursor(); + _cur = _form->cursor(); if (*_mask->get(F_FILTRO)=='N') filter << "(STR(" << LF_MAG <<"->GIAC!=\"0\"))&&"; if (*_mask->get(F_FILTRO)=='+') @@ -817,10 +855,10 @@ void TStampa_inventario::setprint_perarticoli_all() m2 = _mask->get(F_ACATMER); if (subordine == 'S') { - m1 << _mask->get(F_DASCATMER); - m2 << _mask->get(F_ASCATMER); - m1.trim(); - m2.trim(); + m1.left_just(3) << _mask->get(F_DASCATMER); + m2.left_just(3) << _mask->get(F_ASCATMER); +// m1.trim(); +// m2.trim(); } // Siccome GRMERC e' il primo campo della chiave, se e' settato l'articolo di fine intervallo // ed esso non e' vuoto, mentre la categoria merc. lo e'... la setregion() del cursore non ha effetti, @@ -832,21 +870,25 @@ void TStampa_inventario::setprint_perarticoli_all() darec.put("GRMERC", m1); darec.put("CODART",_mask->get(F_DAART)); arec.put("GRMERC", m2); - arec.put("CODART",_mask->get(F_AART)); + const TString80 aart(_mask->get(F_AART)); + if (aart.not_empty()) + arec.put("CODART", aart); _form->find_field('B',odd_page,"H_CATMER").show(); _form->find_field('B',odd_page,"TOT_CATMER").show(); + _form->set_ordering(mg_cat_merc); if (subordine == 'S') { _form->find_field('B',odd_page,"H_SCATMER").show(); _form->find_field('B',odd_page,"TOT_SCATMER").show(); - } + TString16 espr ; espr.format("%d->GRMERC", LF_ANAMAG); + _form->find_field('B',odd_page,"GRUPPI_SCATMER").setcondition(espr,_strexpr); + } else { _form->find_field('B',odd_page,"H_SCATMER").hide(); _form->find_field('B',odd_page,"TOT_SCATMER").hide(); _form->find_field('B',odd_page,"GRUPPI_SCATMER").setcondition("CODART",_strexpr); } - _form->set_ordering(mg_cat_merc); } break; case 'R': @@ -893,7 +935,7 @@ void TStampa_inventario::setprint_perarticoli_all() TSortedfile *mag; TRelation *rel = NULL; - if (_mask->get_bool(F_ALLADATA)) + if (_mask->get_bool(F_ALLADATA) || *_mask->get(F_REALE_GIAC)=='R') { TIsamtempfile* temp_mag = new TIsamtempfile(LF_MAG, "tmpmag", FALSE, TRUE); // Non crearlo, auto cancella il file rel = new TRelation(temp_mag); @@ -929,6 +971,8 @@ void TStampa_inventario::main_loop() } const bool b = _mask->get_bool(F_ALLADATA); + const bool r = *_mask->get(F_REALE_GIAC)=='R'; + if (*_mask->get(F_ORDINE)=='A') { @@ -940,6 +984,12 @@ void TStampa_inventario::main_loop() delete _form; continue; } + else + if (!b && r && !crea_tempmag(FALSE)) + { + delete _form; + continue; + } setprint_perarticoli_all(); } else @@ -950,6 +1000,12 @@ void TStampa_inventario::main_loop() delete _form; continue; } + else + if (!b && r && !crea_tempmag()) + { + delete _form; + continue; + } setprint_perarticoli(); } } @@ -961,12 +1017,19 @@ void TStampa_inventario::main_loop() delete _form; continue; } + else + if (!b && r && !crea_tempmag()) + { + delete _form; + continue; + } setprint_permagazzini(); } _form->set_parametri(_mask->get(F_CATVENLISTINO), - _mask->get(F_CODLISTINO), - *_mask->get(F_REALE_GIAC)=='R', - *_mask->get(F_FIN_COMP)=='C', b); + _mask->get(F_CODLISTINO), + *_mask->get(F_REALE_GIAC)=='R', + *_mask->get(F_FIN_COMP)=='C', b, + _mask->get_int(F_ANNOES)); _form->add_colval(_mask->get_int(F_VAL1)-1); _form->add_colval(_mask->get_int(F_VAL2)-1); _form->add_colval(_mask->get_int(F_VAL3)-1); @@ -976,7 +1039,16 @@ void TStampa_inventario::main_loop() _form->genera_intestazioni(odd_page, 5); _form->genera_intestazione_supplementare(odd_page, 4); // Nomi valorizzazioni applicate per colonna - + + set_def_valuta(*_form); + const TDate data_limite(_mask->get_date(F_DATALIM)); + if (data_limite.ok()) + { + TForm_item & f = _form->find_field('H',odd_page,4); + TString prompt = f.prompt(); + prompt << " al " << data_limite.string(); + f.set_prompt(prompt); + } _form->print(); delete _form; } diff --git a/mg/mg4200.uml b/mg/mg4200.uml index 6e4d48d64..df6ab264c 100755 --- a/mg/mg4200.uml +++ b/mg/mg4200.uml @@ -57,7 +57,7 @@ BEGIN INPUT CODTAB F_ANNOES DISPLAY "Esercizio" CODTAB DISPLAY "Dal@12" D0 - DISPLAY "Al@12" D0 + DISPLAY "Al@12" D1 OUTPUT F_ANNOES CODTAB ADD NONE CHECKTYPE NORMAL diff --git a/mg/mg4200a.frm b/mg/mg4200a.frm index e9402af11..4012e692e 100755 --- a/mg/mg4200a.frm +++ b/mg/mg4200a.frm @@ -20,9 +20,6 @@ END GENERAL BEGIN OFFSET 0 1 -// Let the user be free to choose the font&size: -// FONT "Courier New" -// SIZE 10 END @@ -55,8 +52,9 @@ END NUMERO 4 32 BEGIN - KEY "Intestazione stampa" - PROMPT 45 2 "Stampa inventario" + KEY "Intestazione stampa" + PROMPT 45 2 "Stampa inventario esercizio " + MESSAGE _ANNO END STRINGA 5 255 @@ -1161,7 +1159,6 @@ SECTION BODY ODD 0 COLUMNWISE BEGIN KEY "COL6" PROMPT 17 1 "" - FLAGS "U" PICTURE "##.###.###.##@" MESSAGE ADD,447 GROUP 3 FG_COL6 diff --git a/mg/mg4200a.h b/mg/mg4200a.h new file mode 100755 index 000000000..ed5229521 --- /dev/null +++ b/mg/mg4200a.h @@ -0,0 +1,61 @@ +#ifndef __MG4200A_H +#define __MG4200A_H + +#define MAX_VAL_COLUMNS 6 + +class TForm_inventario : public TForm_stampemg +{ + int _colonne; + TSorted_cursor *_sortcur; // Cursore sortato: RAGGFIS+CODART usato in stampe per raggr. fisc. + TConfig *conf_ditta; + bool _use_alternate_cursor; + TArticolo_giacenza_loadable * _curr_art; + TString16 _codlist,_catven; // codici listino e cat vendita + bool _giaceff, // flag inventario di giacenza + _valcomp, // flag valorizzzione finiti o componenti + _alladata, // flag di stampa inventario alla data, per utilizzare TArticolo_giacenza_loadable + _pos, // flag di stampa inventario positivi + _notzero; // flag di stampa inventario non zero + int _annoes; + TTipo_valorizz _valorizz_scelte[MAX_VAL_COLUMNS]; // valorizzazioni delle varie colonne + + TCurrency *_currency; + TArticolo_giacenza_loadable &curr_art(); +public: + virtual TCursor* cursor() const ; + + bool genera_intestazione_supplementare(pagetype p, short y); + void set_parametri(const char * codcm,const char * cod,bool giaceff, bool valcomp, bool alladata, int annoes); + bool valorizzazione(TForm_item &cf, TTipo_valorizz t); + bool validate(TForm_item &cf, TToken_string &s); + void use_alternate_cursor(const bool b = TRUE) { _use_alternate_cursor = b; } + void add_colval(int tipo); + TForm_inventario(const char *name,const char *code) ; + ~TForm_inventario(); +}; + +class TStampa_inventario : public TSkeleton_application +{ + TArray * _files; + TStampemg_mask * _mask; + TCursor * _cur; + TForm_inventario * _form; // to be moved into TPrint_application + +protected: + virtual bool create(); + virtual bool destroy(); + virtual void main_loop(); + virtual void on_firm_change(); + + void setprint_permagazzini(); + void setprint_perarticoli(); + void setprint_perarticoli_all(); + bool crea_tempmag(const bool b = TRUE); + bool calcola_giacenze(const bool b = TRUE); + virtual void set_def_valuta(TForm_inventario & f) {} + +public: + TStampa_inventario() {} +}; + +#endif //__MG4200A_H diff --git a/mg/mg4200aa.frm b/mg/mg4200aa.frm index c87e394f9..4d1d54218 100755 --- a/mg/mg4200aa.frm +++ b/mg/mg4200aa.frm @@ -20,9 +20,6 @@ END GENERAL BEGIN OFFSET 0 1 -// Let the user be free to choose the font&size: -// FONT "Courier New" -// SIZE 10 END @@ -55,8 +52,9 @@ END NUMERO 4 32 BEGIN - KEY "Intestazione stampa" - PROMPT 45 2 "Stampa inventario" + KEY "Intestazione stampa" + PROMPT 45 2 "Stampa inventario esercizio " + MESSAGE _ANNO END STRINGA 5 255 diff --git a/mg/mg4200b.frm b/mg/mg4200b.frm index 50d86963d..5ff6d40d5 100755 --- a/mg/mg4200b.frm +++ b/mg/mg4200b.frm @@ -20,9 +20,6 @@ END GENERAL BEGIN OFFSET 0 1 -// FONT "Courier New" -// Let the user be free to choose the font size: -// SIZE 10 END SECTION GRAPHIC @@ -53,8 +50,9 @@ END NUMERO 4 32 BEGIN - KEY "Intestazione stampa" - PROMPT 45 2 "Stampa inventario" + KEY "Intestazione stampa" + PROMPT 45 2 "Stampa inventario esercizio " + MESSAGE _ANNO END STRINGA 5 146 diff --git a/mg/mg4300.cpp b/mg/mg4300.cpp index f6f1df0c1..fe7f8491b 100755 --- a/mg/mg4300.cpp +++ b/mg/mg4300.cpp @@ -79,7 +79,7 @@ static const char * get_cronofield(TVariable_rectype & r); static bool filter_func(const TRelation* r); protected: - void add_mag(TRectype & magrec,const char * codreg); +// void add_mag(TRectype & magrec,const char * codreg); public: void set_parametri(TMask & m); bool can_be_printed(); @@ -371,7 +371,7 @@ void TGiornalemag::set_parametri(TMask & m) cursor()->set_filterfunction(filter_func,TRUE); } - +/* // unused : ora i magazzini hanno l'indicazione esplicita del registro // aggiungeva in un array i vari codici di giornale mag usati void TGiornalemag::add_mag(TRectype & magrec,const char * codreg) @@ -394,7 +394,7 @@ void TGiornalemag::add_mag(TRectype & magrec,const char * codreg) } } } - +*/ bool TGiornalemag::filter_func(const TRelation* r) { @@ -446,7 +446,6 @@ TGiornalemag::TGiornalemag(const char *name,const char *code) : { } - TGiornalemag::~TGiornalemag() { if (_curr_art) delete _curr_art; @@ -470,7 +469,6 @@ TGiornalemag * TGiornalemag::giofrm; TAssoc_array TGiornalemag::_cod_magazzini; int TGiornalemag::_annoes; - // STAMPA giornale class TStampa_giornalemag : public TSkeleton_application { @@ -488,8 +486,6 @@ public: TStampa_giornalemag() {} }; - - bool TStampa_giornalemag::create() { open_files(LF_ANAMAG, LF_MOVMAG, LF_RMOVMAG, LF_TAB, LF_TABCOM, 0); @@ -506,7 +502,7 @@ bool TStampa_giornalemag::destroy() void TStampa_giornalemag::main_loop() { - while (_mask->run() == K_ENTER ) + while (_mask->run() == K_ENTER) { if (_mask->magazz_ini().gestmag(TRUE)) { diff --git a/mg/mg4300.frm b/mg/mg4300.frm index 2c4730145..ea287d902 100755 --- a/mg/mg4300.frm +++ b/mg/mg4300.frm @@ -61,15 +61,15 @@ SECTION HEADER ODD 5 BEGIN PROMPT 42 4 "UM" END - NUMBER 7 12 + NUMERO 7 12 BEGIN PROMPT 46 4 "Quantità" END - NUMBER 8 12 + NUMERO 8 12 BEGIN PROMPT 63 4 "Prezzo" END - NUMBER 9 12 + NUMERO 9 12 BEGIN PROMPT 75 4 "Valore" END @@ -81,7 +81,7 @@ SECTION HEADER ODD 5 END SECTION BODY ODD 2 - NUMBER 100 + NUMERO 100 BEGIN FLAGS "H" MESSAGE RESET,3@ @@ -96,7 +96,7 @@ SECTION BODY ODD 2 SECTION RAGG_CRONOLOGICO 1 0 0 FILE LF_RMOVMAG GROUP CRONO_FIELD - NUMBER 100 + NUMERO 100 BEGIN FLAGS "H" MESSAGE RESET,2@ @@ -140,26 +140,23 @@ SECTION BODY ODD 2 PROMPT 67 1 "" FIELD LF_RMOVMAG->UM END - NUMBER 103 12 + VALUTA 103 12 BEGIN PROMPT 70 1 "" - PICTURE "###.###,@##" MESSAGE _NUMEXPR,LF_RMOVMAG->QUANT*ALIAS_UMRMOV@->FC|_USER,*SEGNOCAUS|ADD,FF_QTARAGGFIS END - NUMBER 105 12 + VALUTA 105 12 BEGIN PROMPT 94 1 "" - PICTURE "###.###.###" MESSAGE _NUMEXPR,LF_RMOVMAG->QUANT*LF_RMOVMAG->PREZZO|_USER,*SEGNOCAUS|ADD,FF_VALTOT END - NUMBER 104 12 + VALUTA 104 12 BEGIN PROMPT 82 1 "" - PICTURE "###.###.###" MESSAGE _NUMEXPR,#105/#103 END END // RAGG FISCALE - NUMBER FF_NUMLINEE 12 + NUMERO FF_NUMLINEE 12 BEGIN FLAGS "H" END @@ -214,22 +211,20 @@ SECTION BODY ODD 2 PROMPT 42 1 "" GROUP 2 END - NUMBER FF_QTARAGGFIS 12 + NUMERO FF_QTARAGGFIS 12 BEGIN PROMPT 45 1 "" PICTURE "###.###,@##" GROUP 2 END - NUMBER FF_VALTOT 12 + VALUTA FF_VALTOT 12 BEGIN PROMPT 70 1 "" - PICTURE "###.###.###" GROUP 2 END - NUMBER 204 12 + VALUTA 204 12 BEGIN PROMPT 58 1 "" - PICTURE "###.###.###" MESSAGE _NUMEXPR,#FF_VALTOT/#FF_QTARAGGFIS GROUP 2 END diff --git a/mg/mglib02.cpp b/mg/mglib02.cpp index 2214c3da9..9bafccc1b 100755 --- a/mg/mglib02.cpp +++ b/mg/mglib02.cpp @@ -608,14 +608,14 @@ bool TArticolo_giacenza::riporta_saldi(const char * oldes, const char* newes, co { currency.set_price(TRUE); currency.set_num(val); - val = currency.string(); + val = currency.get_num(); } val *= rim; // Setta l'importo al nr di decimali fissati per gli importi della valuta corrente currency.set_price(FALSE); currency.set_num(val); - val = currency.string(); + val = currency.get_num(); rec.put(MAG_RIM, rim); rec.put(MAG_VALRIM, val); rec.zero(MAG_ACQ); rec.zero(MAG_VALACQ); rec.zero(MAG_ENT); rec.zero(MAG_VALENT); @@ -1282,7 +1282,7 @@ real TArticolo_giacenza::scorta_minima(const char* codmag, const TRecord_array& rmag = mag(annoes); real sm; - int nmag=0; +// int nmag=0; for (int i = find_mag(annoes, codmag, livello); i > 0; i = find_mag(annoes, codmag, livello, i)) { @@ -1293,11 +1293,11 @@ real TArticolo_giacenza::scorta_minima(const char* codmag, sm += rec.get_real("LIVRIOR"); else sm += rec.get_real("SCORTAMIN"); - nmag++; +// nmag++; } } - if (nmag) - sm = sm / nmag; +// if (nmag) +// sm = sm / nmag; return sm; } diff --git a/mg/mglib02a.cpp b/mg/mglib02a.cpp index f169fa7aa..89c0b2838 100755 --- a/mg/mglib02a.cpp +++ b/mg/mglib02a.cpp @@ -7,6 +7,7 @@ #include "mglib.h" #include "movmag.h" #include "rmovmag.h" +#include #ifndef __CGLIB01_H #include "../cg/cglib01.h" @@ -210,6 +211,8 @@ bool TMov_mag::add_explrows() const const char tipo_costo = cau.get("S11")[0]; const int livello = cau.get_int("I0"); const TString4 umroot(row.get(RMOVMAG_UM)); + const int rigaprec = r - 1; + const bool is_coll = r > 0 && b[r].get_char(RMOVMAG_TIPORIGA) == riga_automatica; // mancano le righe, le inserisco boom.destroy(); bool ok=distinta.set_root(row); @@ -222,7 +225,7 @@ bool TMov_mag::add_explrows() const real prezzo(prezzo_rauto(r)); TRectype * linea_auto; for (int newrow=0; newrow < boom.items() ; newrow++) - { + { TRiga_esplosione & riga_esp=(TRiga_esplosione & )(boom[newrow]); linea_auto = new TRectype(row); linea_auto->put(RMOVMAG_CODART, riga_esp.articolo()); @@ -240,8 +243,28 @@ bool TMov_mag::add_explrows() const linea_auto->put(RMOVMAG_PREZZO, prezzo); linea_auto->put(RMOVMAG_NRIG, r+1+newrow); linea_auto->put(RMOVMAG_ESPLOSA, TRUE); - //linea_auto->put(RMOVMAG_TIPORIGA, (char) riga_automatica); - //linea_auto->put(RMOVMAG_CODCAUS, codcaus); + + char coll_type = articolo.get_char(ANAMAG_COLLTYPE); + TString16 codmag; + + if (coll_type == 'M') + { + if (is_coll) + codmag = b[rigaprec].get(RMOVMAG_CODMAG); + } + else + if (coll_type == 'F') + { + TString key("F|"); + + key << articolo.get(ANAMAG_CODFORN); + codmag = cache().get(LF_CFVEN, key, CFV_CODMAG); + } + else + if (coll_type == 'A') + codmag = articolo.get(ANAMAG_CODMAG); + if (codmag.not_empty()) + linea_auto->put(RMOVMAG_CODMAG, codmag); b.insert_row(linea_auto); added=TRUE; } @@ -488,11 +511,6 @@ int TMov_mag::update_balances() TLine_movmag & line_mov=(TLine_movmag &)lines_to_add[*curr_key]; const TCausale_magazzino& causmag = causale(line_mov.codcaus()); - if (causmag.update_ultcos()) - { - curr_art.update_ultcosti(line_mov.prezzo(),get_date("DATACOMP"), get_long("NUMREG"),nriga++); - curr_art.rewrite(); - } giac_putkey(mag,get(MOVMAG_ANNOES),*curr_key); if (mag.read()!=NOERR) { @@ -501,6 +519,12 @@ int TMov_mag::update_balances() mag.put(MAG_NRIGA,1+curr_art.mag(get(MOVMAG_ANNOES)).rows()); mag.write(); } + if (causmag.update_ultcos()) + { + const real prezzo = curr_art.convert_to_um(line_mov.prezzo(), line_mov.um()); + curr_art.update_ultcosti(prezzo,get_date("DATACOMP"), get_long("NUMREG"),nriga++); + curr_art.rewrite(); + } // modifica questo record (e lo sblocca) update_balances(mag.curr(), line_mov, +1); /*// ottimizzazione :(cerca di sfruttare la lettura fatta per un eventuale saldo vecchio) diff --git a/mr/f132.dir b/mr/f132.dir index cae48b7be..eed1f7eb8 100755 --- a/mr/f132.dir +++ b/mr/f132.dir @@ -1,3 +1,3 @@ 132 0 -$mrprep|0|0|557|0|File report per MRP||| +$mrprep|0|0|723|0|File report per MRP||| diff --git a/mr/f132.trr b/mr/f132.trr index 7325b0d9c..66244d935 100755 --- a/mr/f132.trr +++ b/mr/f132.trr @@ -1,5 +1,5 @@ 132 -47 +53 TIPO|1|1|0|Tipo (H: Testata, R:Riga) RIGA|3|5|0|Tipo riga(' ': plan; 'C': vincolo; 'O': on hand) TIPOCF|1|1|0|Cliente/fornitore @@ -9,44 +9,50 @@ LINEA|1|5|0|Codice linea CODART|1|20|0|Codice articolo LIVELLO|1|15|0|Livello di giacenza UM|1|4|0|Unita di misura -QTAFIRST|4|13|5|Quantita precedente il primo periodo -QTA1|4|13|5|Quantita nel periodo 1 -CMIN1|4|13|5|Capacita minima nel periodo 1 -CMAX1|4|13|5|Capacita massima nel periodo 1 -QTA2|4|13|5|Quantita nel periodo 2 -CMIN2|4|13|5|Capacita minima nel periodo 2 -CMAX2|4|13|5|Capacita massima nel periodo 2 -QTA3|4|13|5|Quantita nel periodo 3 -CMIN3|4|13|5|Capacita minima nel periodo 3 -CMAX3|4|13|5|Capacita massima nel periodo 3 -QTA4|4|13|5|Quantita nel periodo 4 -CMIN4|4|13|5|Capacita minima nel periodo 4 -CMAX4|4|13|5|Capacita massima nel periodo 4 -QTA5|4|13|5|Quantita nel periodo 5 -CMIN5|4|13|5|Capacita minima nel periodo 5 -CMAX5|4|13|5|Capacita massima nel peridoo 5 -QTA6|4|13|5|Quantita nel periodo 6 -CMIN6|4|13|5|Capacita minima nel periodo 6 -CMAX6|4|13|5|Capacita massima nel periodo 6 -QTA7|4|13|5|Quantita nel periodo 7 -CMIN7|4|13|5|Capacita minima nel periodo 7 -CMAX7|4|13|5|Capacita massima nel periodo 7 -QTA8|4|13|5|Quantita nel periodo 8 -CMIN8|4|13|5|Capacita minima nel periodo 8 -CMAX8|4|13|5|Capacita massima nel periodo 8 -QTA9|4|13|5|Quantita nel periodo 9 -CMIN9|4|13|5|Capacita minima nel periodo 9 -CMAX9|4|13|5|Capacita massima nel periodo 9 -QTA10|4|13|5|Quantita nel periodo 10 -CMIN10|4|13|5|Capacita minima nel periodo 10 -CMAX10|4|13|5|Capacita massima nel periodo 10 -QTA11|4|13|5|Quantita nel periodo 11 -CMIN11|4|13|5|Capacita minima nel periodo 11 -CMAX11|4|13|5|Capacita massima nel periodo 11 -QTA12|4|13|5| -CMIN12|4|13|5| -CMAX12|4|13|5| -QTALAST|4|13|5|Quantita successiva l'ultimo periodo +QTAFIRST|4|15|5|Quantita precedente il primo periodo +QTA1|4|15|5|Quantita nel periodo 1 +CMIN1|4|15|5|Capacita minima nel periodo 1 +CMAX1|4|15|5|Capacita massima nel periodo 1 +QTA2|4|15|5|Quantita nel periodo 2 +CMIN2|4|15|5|Capacita minima nel periodo 2 +CMAX2|4|15|5|Capacita massima nel periodo 2 +QTA3|4|15|5|Quantita nel periodo 3 +CMIN3|4|15|5|Capacita minima nel periodo 3 +CMAX3|4|15|5|Capacita massima nel periodo 3 +QTA4|4|15|5|Quantita nel periodo 4 +CMIN4|4|15|5|Capacita minima nel periodo 4 +CMAX4|4|15|5|Capacita massima nel periodo 4 +QTA5|4|15|5|Quantita nel periodo 5 +CMIN5|4|15|5|Capacita minima nel periodo 5 +CMAX5|4|15|5|Capacita massima nel peridoo 5 +QTA6|4|15|5|Quantita nel periodo 6 +CMIN6|4|15|5|Capacita minima nel periodo 6 +CMAX6|4|15|5|Capacita massima nel periodo 6 +QTA7|4|15|5|Quantita nel periodo 7 +CMIN7|4|15|5|Capacita minima nel periodo 7 +CMAX7|4|15|5|Capacita massima nel periodo 7 +QTA8|4|15|5|Quantita nel periodo 8 +CMIN8|4|15|5|Capacita minima nel periodo 8 +CMAX8|4|15|5|Capacita massima nel periodo 8 +QTA9|4|15|5|Quantita nel periodo 9 +CMIN9|4|15|5|Capacita minima nel periodo 9 +CMAX9|4|15|5|Capacita massima nel periodo 9 +QTA10|4|15|5|Quantita nel periodo 10 +CMIN10|4|15|5|Capacita minima nel periodo 10 +CMAX10|4|15|5|Capacita massima nel periodo 10 +QTA11|4|15|5|Quantita nel periodo 11 +CMIN11|4|15|5|Capacita minima nel periodo 11 +CMAX11|4|15|5|Capacita massima nel periodo 11 +QTA12|4|15|5|Quantita nel periodo 12 +CMIN12|4|15|5|Capacita minima nel periodo 12 +CMAX12|4|15|5|Capacita massima nel periodo 12 +QTA13|4|15|5|Quantita nel periodo 13 +CMIN13|4|15|5|Capacita minima nel periodo 13 +CMAX13|4|15|5|Capacita massima nel periodo 13 +QTA14|4|15|5|Quantita nel periodo 14 +CMIN14|4|15|5|Capacita minima nel periodo 14 +CMAX14|4|15|5|Capacita massima nel periodo 14 +QTALAST|4|15|5|Quantita successiva l'ultimo periodo 3 TIPO+IMPIANTO+LINEA+TIPOCF+CODCLI+CODART+LIVELLO| TIPO+TIPOCF+CODCLI+CODART+LIVELLO+IMPIANTO+LINEA|X diff --git a/mr/mr0.url b/mr/mr0.url index 96d83e03f..230f36f6a 100755 --- a/mr/mr0.url +++ b/mr/mr0.url @@ -1,16 +1,6 @@ -#define APPNAME eurocamp -#define QAPPNAME "eurocampo" +#define APPNAME EURO_MR +#define QAPPNAME "EURO_MR" + #include - -/* mr0 -0 Gestione tabelle */ - -MENU TASK_MENUBAR - SUBMENU MENU_FILE "~File" - -/* mr0 -3 Parametri ditta */ -MENUBAR MENU_BAR(1) - -MENU MENU_BAR(1) - SUBMENU MENU_FILE "~File" - +#include diff --git a/mr/mr0100.cpp b/mr/mr0100.cpp index e53f6acb4..71b6c8560 100755 --- a/mr/mr0100.cpp +++ b/mr/mr0100.cpp @@ -114,15 +114,8 @@ bool TMRP_mask::remove_calendar() { const TString& tn = app().get_tabname(); const char tipo = tn[0]; - if (calendar().tipo() != tipo) - { - if (tipo == 'L') - calendar().set(get(F_CODICE), get(F_IMPIANTO)); - else - calendar().set(NULL, get(F_CODICE)); - CHECK(calendar().tipo() == tipo, "Tipo calendario incongruente"); - } - calendar().remove(); + if (calendar().tipo() == tipo) + calendar().remove(); return TRUE; } @@ -162,6 +155,9 @@ protected: 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: void save_calendar(const TMask& m); @@ -209,7 +205,6 @@ void TMRPtables::remove_calendar(const TMask& m) } } - void TMRPtables::read_turni(TMask& m) { TUnita_produttiva up(file().curr()); @@ -223,6 +218,7 @@ void TMRPtables::read_turni(TMask& m) m.set(id+4,up.raw_numpers_turno(t)); } } + void TMRPtables::write_turni(const TMask& m) { TUnita_produttiva & up=(TUnita_produttiva &)file().curr(); @@ -283,6 +279,45 @@ bool TMRPtables::remove() return ok; } +void TMRPtables::ini2mask(TConfig& ini, TMask& m, bool query) +{ + TTable_application::ini2mask(ini, m, query); + + const TString& tn = get_tabname(); + if (tn == "IMP"||tn == "LNP" ) + { + TAssoc_array& vars = ini.list_variables("5"); + TRectype& curr = file().curr(); + FOR_EACH_ASSOC_STRING(vars, obj, key, str) + curr.put(key, str); + read_turni(m); + } +} + +void TMRPtables::mask2ini(const TMask& m, TConfig& ini) +{ + TTable_application::mask2ini(m, ini); + + const TString& tn = get_tabname(); + if (tn == "IMP" || tn == "LNP" ) + { + write_turni(m); + const TRectype& curr = file().curr(); + ini.set_paragraph("5"); + for (int i = curr.items()-1; i >= 0; i--) + { + const char* fname = curr.fieldname(i); + const TString& val = curr.get(fname); + if (!val.blank() && ini.get(fname).empty()) + ini.set(fname, val); + } + } +} + +/////////////////////////////////////////////////////////// +// Main +/////////////////////////////////////////////////////////// + int mr0100(int argc, char* argv[]) { if (argc > 2) diff --git a/mr/mr0400.h b/mr/mr0400.h index c861c72a8..88fcf858a 100755 --- a/mr/mr0400.h +++ b/mr/mr0400.h @@ -43,6 +43,8 @@ #define F_T6NUMPERS 140 #define F_T7NUMPERS 141 #define F_T8NUMPERS 142 +#define F_FORNITORE 143 +#define F_RAGSOC 144 #define F_YEAR 201 #define F_CALENDAR 202 diff --git a/mr/mr0400a.uml b/mr/mr0400a.uml index bbe20b231..0b2027405 100755 --- a/mr/mr0400a.uml +++ b/mr/mr0400a.uml @@ -410,6 +410,31 @@ BEGIN GROUP 8 18 28 38 48 58 68 78 END +NUMBER F_FORNITORE 6 +BEGIN + PROMPT 2 14 "Fornitore di default " + USE LF_CLIFO + INPUT TIPOCF "F" + INPUT CODCF F_FORNITORE + DISPLAY "Codice" CODCF + DISPLAY "Descrizione@50" RAGSOC + OUTPUT F_FORNITORE CODCF + OUTPUT F_RAGSOC RAGSOC + FIELD CODFOR + CHECKTYPE NORMAL +END + +STRING F_RAGSOC 50 30 +BEGIN + PROMPT 33 14 "" + USE LF_CLIFO KEY 2 + INPUT TIPOCF "F" + INPUT RAGSOC F_RAGSOC + DISPLAY "Descrizione@50" RAGSOC + DISPLAY "Codice@16" CODCF + COPY OUTPUT F_FORNITORE + CHECKTYPE SEARCH +END ENDPAGE diff --git a/mr/mr1.url b/mr/mr1.url index b77732e26..82815b619 100755 --- a/mr/mr1.url +++ b/mr/mr1.url @@ -1,10 +1,8 @@ #define APPNAME eurocamp #define QAPPNAME "eurocampo" #include - +#include /* mr1 -0 Generazione MRP Reports */ -MENU TASK_MENUBAR - SUBMENU MENU_FILE "~File" diff --git a/mr/mr2.url b/mr/mr2.url index a839ce9c7..085df8ea5 100755 --- a/mr/mr2.url +++ b/mr/mr2.url @@ -1,19 +1,11 @@ #define APPNAME eurocamp #define QAPPNAME "eurocamp" #include +#include #include "mr2url.h" /* mr2 -0 PLANNING*/ -MENU TASK_MENUBAR - SUBMENU MENU_FILE "~File" - -/* mr2 -1 M.R.P. */ -MENUBAR MENU_BAR(1) - -MENU MENU_BAR(1) - SUBMENU MENU_FILE "~File" - image USER_BMP_CHECK "check.bmp" image USER_BMP_ARROWUP "..\include\darrowu.bmp" image USER_BMP_ARROWDOWN "..\include\darrowd.bmp" diff --git a/mr/mr2100.cpp b/mr/mr2100.cpp index fa3e6b9ec..19309420a 100755 --- a/mr/mr2100.cpp +++ b/mr/mr2100.cpp @@ -202,10 +202,6 @@ TMRP_record& TMRP_line::record(int i) const TMRP_record& TMRP_line::record(const TMRP_time& t) const { -int debug; -if (_codart== "4282UK") -debug = 1; - const int last = last_bucket(); for (int i = 0; i <= last; i++) { @@ -320,7 +316,7 @@ real &TMRP_line::giacenza_attuale(real &g) const TDate d(TODAY); return giacenza_attuale(g, d); } - + real &TMRP_line::giacenza_attuale(real &g, const TDate &d) const { _articolo_giac->read(articolo()); @@ -853,7 +849,7 @@ class TMatResPlanning : public TSkeleton_application TMatResMask* _mask; private: - bool gross2net_logic(TMRP_line &curr_article, int bucket); + bool gross2net_logic(TMRP_line &curr_article, int bucket, bool & sc_used); bool load_gross_requirements(); bool load_planned_orders(); bool explode_articles(); @@ -1845,7 +1841,7 @@ bool TMatResPlanning::load_gross_requirements() TDate date_to = m.get(F_ADATA); const int bucket_to = m.round_date(date_to, TRUE); - const int year_fr = date_fr.year(); + const int year_fr = date_fr.year() - (m.get_bool(F_DOC_YEAR_PREC) ? 1 : 0); const int year_to = date_to.year(); const bool master = m.get(F_ORC_MASTER)[0] == 'M'; // azzera l'array _requirements @@ -2054,7 +2050,7 @@ bool TMatResPlanning::load_planned_orders() TDate date_to = m.get(F_ADATA); const int bucket_to = m.round_date(date_to, TRUE); - const int year_fr = date_fr.year(); + const int year_fr = date_fr.year() - (m.get_bool(F_DOC_YEAR_PREC) ? 1 : 0); const int year_to = date_to.year(); TTable num("%NUM"); @@ -2202,7 +2198,7 @@ bool TMatResPlanning::preprocess_cycle() // ipotesi essenziale per il rescheduling: la chiamata della funzione // deve essere fatta ciclicamente su tutti i bucket di un articolo // prima di passare ad un altro articolo -bool TMatResPlanning::gross2net_logic(TMRP_line &curr_article, int bucket) +bool TMatResPlanning::gross2net_logic(TMRP_line &curr_article, int bucket, bool & sc_used) { const TMatResMask& m = *_mask; @@ -2213,12 +2209,33 @@ bool TMatResPlanning::gross2net_logic(TMRP_line &curr_article, int bucket) // Verifico se esiste gia' un fabbisogno netto real sm,tmpreal = -curr_article.net_requirement(bucket); +#ifdef DBG + TString80 s; +#endif if (tmpreal >= ZERO) // Devo calcolare il fabbisogno netto { tmpreal = curr_article.on_hand(bucket); tmpreal -= curr_article.gross_requirement(bucket); - curr_article.scorta_minima(sm, curr_article.time(bucket).date()); - tmpreal -= sm; +#ifdef DBG + if (curr_article.articolo() == "U01121") + { + s = tmpreal.string(); + tmpreal.round(5); + s = tmpreal.string(); + } + if (curr_article.articolo() == "U00124") + { + s = tmpreal.string(); + tmpreal.round(5); + s = tmpreal.string(); + } +#endif + if (!sc_used) + { + curr_article.scorta_minima(sm, curr_article.time(bucket).date()); + sc_used = TRUE; + tmpreal -= sm; + } } // tmpreal += curr_article.planned_orders(bucket); //planned orders are not added here, but in build orders phase if (!m.get_bool(F_RESCHEDULING)) @@ -2258,13 +2275,9 @@ bool TMatResPlanning::gross2net_logic(TMRP_line &curr_article, int bucket) { TMRP_line& article_son = curr_article.son(o); tmpreal = net_req * curr_article.qta_son(o); + tmpreal.round(5); if (tmpreal > ZERO) { - if (article_son.articolo() == "21014F") - { - const real qta = tmpreal; - } - TMRP_internalref * iref = new TMRP_internalref( &curr_article, bucket, tmpreal); if (xtradays && curr_article.sons()) article_son.add_gross_req(xlead_time, tmpreal, iref); @@ -2300,14 +2313,15 @@ bool TMatResPlanning::net_requirement_cycle() { real curgiac; curr_article.set_on_hand(0, curr_article.giacenza_attuale(curgiac, m.get_date(F_DADATA))); - + bool sc_used = FALSE; + for (int bucket = 0; ok && bucket <= last; bucket = curr_article.next_bucket(bucket)) { // !?!?! la logica gross2net dovrebbe funzionare in termini di intervalli di date // (bucket-utente) piuttosto che di bucket di MRPline (che possono essere più di uno // in un intervallo, altrimenti i ragionamenti di scorte minime e lotti // funzionano in modo sbagliato, perchè approssimano più volte - ok = gross2net_logic(curr_article, bucket); + ok = gross2net_logic(curr_article, bucket, sc_used); if (!ok) break; } @@ -2339,7 +2353,19 @@ bool TMatResPlanning::build_orders() const TRectype& anarec = cache().get(LF_ANAMAG,line.articolo()); const TRectype& distrec = cache().get(LF_DIST,line.articolo()); const bool prod = distrec.get_bool("ARTPROD"); - const long forn = prod ? 0 : anarec.get_long("CODFORN"); +// const long forn = prod ? 0 : anarec.get_long("CODFORN"); + long forn = 0; + if (!prod) + { + TString key; + key << line.codimp(); + key.rpad(5); + key << line.articolo(); + + forn = atol(cache().get("FIA", key, "I0")); + if (forn == 0L) + forn = anarec.get_long("CODFORN"); + } for (int b = line.last_bucket(); b >= 0; b--) { const TMRP_record & rrr = line.record(b); @@ -2957,6 +2983,7 @@ bool TMatResPlanning::emit_orders() testata.put(DOC_CODCF, forn); docf++; } + testata.put(DOC_CAUSMAG, doc->tipo().caus_mov()); docs.add(key, doc); } } diff --git a/mr/mr2100a.h b/mr/mr2100a.h index ef2296f40..9a29052fc 100755 --- a/mr/mr2100a.h +++ b/mr/mr2100a.h @@ -53,6 +53,7 @@ #define F_ALL_ORDERSCHANGES 250 #define F_DISABLESAVE 251 #define F_ALL_MRPLINES 252 +#define F_DOC_YEAR_PREC 253 // campi senza default sul profilo #define F_YEAR 301 diff --git a/mr/mr2100a.uml b/mr/mr2100a.uml index 5b6fe70f1..ffcf47d71 100755 --- a/mr/mr2100a.uml +++ b/mr/mr2100a.uml @@ -145,8 +145,11 @@ BEGIN PROMPT 2 12 "Non suddividere per linee" END - - +BOOLEAN F_DOC_YEAR_PREC +BEGIN + PROMPT 2 14 "Considera i documenti dell'anno precedente" +END + ENDPAGE PAGE "Elabora" -1 -1 80 19 @@ -526,7 +529,8 @@ BOOLEAN F_DATE_SORT_ORDER BEGIN PROMPT 30 5 "Data di consegna" END -BUTTON F_RESORT_ORDINI 10 2 + +BUTTON F_RESORT_ORDINI 10 BEGIN PROMPT 64 4 "Riordina" END diff --git a/mr/mr2200.cpp b/mr/mr2200.cpp index 72a79186b..6238a0042 100755 --- a/mr/mr2200.cpp +++ b/mr/mr2200.cpp @@ -1,6 +1,7 @@ #include "mr2200.h" #include "mr2200a.h" #include "mr2200b.h" +#include class TMSPCheck_mask : public TAutomask { @@ -311,7 +312,8 @@ int TPlanning_mask::bucket(const TDate& date) const if (bucket_mese()) { - bucket = inizio.month() - date.month(); +// bucket = inizio.month() - date.month(); + bucket = date.month() - inizio.month() + (date.year() - inizio.year())*12; if (bucket<0) bucket = -1; } else @@ -490,7 +492,7 @@ bool TPlanning_mask::carica_documenti() TDate date_to = get(F_ADATA); const int bucket_to = round_date(date_to, TRUE); - const int year_fr = date_fr.year(); + const int year_fr = date_fr.year() - (get_bool(F_DOC_YEAR_PREC) ? 1 : 0); const int year_to = date_to.year(); @@ -579,7 +581,7 @@ bool TPlanning_mask::carica_documenti() consegna = datacons; TDate consegna_upper(consegna); int buck = round_date(consegna_upper,tn & _Doc_vincoli) - bucket_fr + 1; - if ((tn & _Doc_vincoli) && consegna_upper>consegna) + if ((tn & _Doc_vincoli) && consegna_upper>consegna && !bucket_mese()) buck--; if (buck < 0) buck = 0; else if (buck > LAST_BUCKET) buck = LAST_BUCKET; @@ -1509,13 +1511,38 @@ bool TPlanning_mask::general_review(bool check_machine, bool check_human, bool u while (nbucket <= upper_buck) { long codclifor = mrpline.codclifor() ; + TString16 codmagdep = mrpline.codmagdep(); + if (is_acq_planning() && codclifor == 0L) { TArticolo art(mrpline.articolo()); codclifor = art.get_long(ANAMAG_CODFORN); + if (codclifor == 0L) + codclifor = _standard_for; + if (codclifor != 0L && codmagdep.empty()) + { + TString16 key; key.format("F|%ld", codclifor); + const TRectype & venrec = cache().get(LF_CFVEN, key); + + codmagdep = venrec.get(CFV_CODMAG); + if (codmagdep.not_empty()) + { + codmagdep.left_just(3); + codmagdep << venrec.get(CFV_CODDEP); + } + } + } + if (codmagdep.empty()) + { + if (codmagdep.empty()) + { + codmagdep = _magazzini.standardmag(); + codmagdep.left_just(3); + codmagdep << _magazzini.standarddep(); + } } TMRP_line* new_article = find_propose(codclifor, mrpline.articolo(), mrpline.livgiac(), - mrpline.codimp() , mrpline.codlin(), mrpline.codmagdep(), mrpline.codmagdep_coll(), TRUE); + mrpline.codimp() , mrpline.codlin(), codmagdep, mrpline.codmagdep_coll(), TRUE); curr_arts = art_per_buck; if (logic == _uniform_logic) curr_arts /= (upper_buck-nbucket+1); @@ -2290,9 +2317,10 @@ int TPlanning_mask::salva_cella(int r, int b, TPlan_docs &doc_rows, TToken_strin const bool number_by_week = get_bool(F_NUMBERBYWEEK); TDate datacons = from + long(bucket_size * (b-1)); + //if (datacons > date_to) // return FALSE; - round_date(datacons,TRUE); + round_date(datacons, !bucket_mese()); TToken_string & row = sf.row(r); TMSP_line &line = *_articles.find(row, TRUE); @@ -2422,7 +2450,15 @@ int TPlanning_mask::salva_cella(int r, int b, TPlan_docs &doc_rows, TToken_strin doc.put(DOC_CODCF, line.codclifor()); } doc.put(DOC_DATADOC, from); - } + + // Calcola codice iva per la riga in base al fornitore o all'articolo + TString16 cod; + cod.format("%c|%ld", get(F_TIPOCF)[0], line.codclifor()); + cod = cache().get(LF_CFVEN, cod, CFV_ASSFIS); + if (cod.empty()) + cod = cache().get(LF_ANAMAG, line.articolo(), ANAMAG_CODIVA); + riga.put(RDOC_CODIVA, cod); + } if (val == ZERO) { line.remove_rigaref(b); @@ -3110,7 +3146,7 @@ void TPlanning_mask::init() { sf.sheet_mask().disable(F_MAGAZZINO); } - + if (!ini.get_bool("GESTIMPIANTI", "mr")) { hide(F_IMPIANTO); @@ -3119,6 +3155,7 @@ void TPlanning_mask::init() sf.sheet_mask().hide(F_DESCIMP); } _week_complete = ini.get_bool("WEEKCOMPLETE", "mr", -1, TRUE); + _standard_for = ini.get_long("CODFOR", "mr"); sfield(F_LINEE).disable(); // sfield(F_TESTE).disable(); diff --git a/mr/mr2200.h b/mr/mr2200.h index 3b513219a..c743d5877 100755 --- a/mr/mr2200.h +++ b/mr/mr2200.h @@ -23,7 +23,8 @@ class TPlanning_mask : public TCalendar_mask friend TSave_mask; friend TPrint_mask; static bool _week_complete; - TMagazzini _magazzini; + TMagazzini _magazzini; + long _standard_for; TDate _start_date; // quantità provenienti dai documenti "ordine": TMSP_constraints _constraints; diff --git a/mr/mr2200a.h b/mr/mr2200a.h index a947b0638..2d91951ad 100755 --- a/mr/mr2200a.h +++ b/mr/mr2200a.h @@ -86,6 +86,7 @@ #define F_CODCONDV 256 #define F_CATVEN_CV 257 #define F_TIPOCF 258 +#define F_DOC_YEAR_PREC 259 // filtri di salvataggio #define F_SAVE_OPT 260 diff --git a/mr/mr2200a.uml b/mr/mr2200a.uml index 5c5968274..b5cc70d9c 100755 --- a/mr/mr2200a.uml +++ b/mr/mr2200a.uml @@ -161,25 +161,34 @@ BEGIN PROMPT 2 11 "Non suddividere per cliente" GROUP G_SCRITTE_CLI END + TEXT DLG_NULL BEGIN FLAG "H" PROMPT 2 11 "Non suddividere per fornitore" GROUP G_SCRITTE_FOR END + TEXT DLG_NULL BEGIN PROMPT 2 12 "Non suddividere per magazzino" END + TEXT DLG_NULL BEGIN PROMPT 2 13 "Non suddividere per impianto" END + TEXT DLG_NULL BEGIN PROMPT 2 14 "Non suddividere per linea" END +TEXT DLG_NULL +BEGIN + PROMPT 2 16 "Considera i documenti dell'anno precedente" +END + BOOLEAN F_NOCLI_IN BEGIN PROMPT 34 11 "" @@ -209,13 +218,19 @@ END TEXT DLG_NULL BEGIN PROMPT 42 10 "@bOutput" -END +END + BOOLEAN F_NOCLI_OUT BEGIN PROMPT 44 11 "" GROUP G_PREPROCESS END +BOOLEAN F_DOC_YEAR_PREC +BEGIN + PROMPT 50 16 "" +END + ENDPAGE PAGE "Elabora" -1 -1 80 19 diff --git a/mr/mr2201.cpp b/mr/mr2201.cpp index 7d5fadc69..09d71c0f4 100755 --- a/mr/mr2201.cpp +++ b/mr/mr2201.cpp @@ -1302,6 +1302,7 @@ TSortable* TPlan_docs::new_obj(const TToken_string& key) const TDocumento* doc = new TDocumento('D', anno, codnum, num); doc->head().put(DOC_TIPODOC, _doc); + doc->head().put(DOC_CAUSMAG, doc->tipo().caus_mov()); return doc; } diff --git a/mr/mr2400.cpp b/mr/mr2400.cpp index 8f4dbbeff..5e39858c5 100755 --- a/mr/mr2400.cpp +++ b/mr/mr2400.cpp @@ -4,6 +4,7 @@ class TOrdAcq_mask : public TPlanning_mask { public: + virtual bool is_acq_planning() { return TRUE;} TOrdAcq_mask(); virtual ~TOrdAcq_mask() { } }; @@ -29,12 +30,13 @@ bool TOrdAcq_app::create() _m = new TOrdAcq_mask(); _m->field(F_MSCHEDULEPLAN).set(" "); _m->disable_page(4); - _m->sfield(F_ARTICOLI).delete_column(F_CODIMP-FIRST_FIELD); - _m->sfield(F_ARTICOLI).delete_column(F_CODLIN-FIRST_FIELD); - _m->set(F_NOIMP_IN,"X"); - _m->hide(F_NOIMP_IN); - _m->set(F_NOLIN_IN,"X"); - _m->hide(F_NOLIN_IN); +// Li facciamo gestire +// _m->sfield(F_ARTICOLI).delete_column(F_CODIMP-FIRST_FIELD); +// _m->sfield(F_ARTICOLI).delete_column(F_CODLIN-FIRST_FIELD); +// _m->set(F_NOIMP_IN,"X"); +// _m->hide(F_NOIMP_IN); +// _m->set(F_NOLIN_IN,"X"); +// _m->hide(F_NOLIN_IN); return TRUE; diff --git a/mr/mrplib.cpp b/mr/mrplib.cpp index 365bb35f7..d44420fa9 100755 --- a/mr/mrplib.cpp +++ b/mr/mrplib.cpp @@ -760,13 +760,23 @@ void TCalendar_win::handler(WINDOW win, EVENT* ep) void TCalendar_win::update() { - TField_window::update(); - const TDate today(TODAY); const int this_year = today.year(); const int this_month = today.month(); const int this_day = today.day(); + RCT rct; xvt_vobj_get_client_rect(win(), &rct); + + TField_window::update(); + if (fexist("calend01.bmp")) + { + TFilename month; month.format("calend%02d.bmp", this_month); + TImage bmp(month); + int x = (rct.right - bmp.width()) / 2; + int y = (rct.bottom - bmp.height()) / 2; + bmp.draw(win(), x, y); + } + _pixmap = TRUE; TString16 str; @@ -779,8 +789,6 @@ void TCalendar_win::update() if (_anno == this_year) set_font(); - RCT rct; xvt_vobj_get_client_rect(win(), &rct); - int i, j; for (i = 1; i <= 31; i++) { diff --git a/mr/mrprassi.men b/mr/mrprassi.men index 84e3f85f7..cb03b5740 100755 --- a/mr/mrprassi.men +++ b/mr/mrprassi.men @@ -24,6 +24,7 @@ Item_01 = "Tabella ordinamenti", "db0 -0 ORD", "F" Item_01 = "Tabella variabili", "db0 -0 VAR", "F" Item_01 = "Tabella impianti", "mr0 -0 IMP", "F" Item_01 = "Tabella linee di produzione", "mr0 -0 LNP", "F" +Item_01 = "Tabella Articoli/Impianti", "mr0 -0 FIA", "F" [PRASSIMR_020] Caption = "Stampa archivi" @@ -48,7 +49,7 @@ Item_01 = "Stampa scheduling per linea", "mr1 -0", "F" Item_01 = "Stampa carico linee", "mr1 -0", "F" Item_01 = "Stampa produzione articoli", "mr1 -0", "F" Item_01 = "Esplosione distinte", "db1 -0", "F" -Item_02 = "Implosione", disabled +Item_02 = "Implosione", disabled [PRASSIMR_030] Caption = "Servizi" diff --git a/mr/mrtbfia.h b/mr/mrtbfia.h new file mode 100755 index 000000000..abe2bcc13 --- /dev/null +++ b/mr/mrtbfia.h @@ -0,0 +1,11 @@ +#ifndef __MRTBIMP_H +#define __MRTBIMP_H + +#define F_CODIMP 101 +#define F_DESC 102 +#define F_CODART 103 +#define F_DESART 104 +#define F_CODFORN 105 +#define F_DESFOR 106 + +#endif diff --git a/mr/mrtbfia.uml b/mr/mrtbfia.uml new file mode 100755 index 000000000..572142a6c --- /dev/null +++ b/mr/mrtbfia.uml @@ -0,0 +1,93 @@ +#include "mrtbfia.h" + +TOOLBAR "TOOLBAR" 0 -2 0 2 +#include +ENDPAGE + +PAGE "Impianti/Articoli" -1 -1 65 15 + +GROUPBOX DLG_NULL 78 6 +BEGIN + PROMPT 1 1 "" +END + +STRING F_CODIMP 5 +BEGIN + PROMPT 2 2 "Impianto " + FLAGS "UZ" + FIELD CODTAB[1,5] + KEY 1 + CHECKTYPE REQUIRED + USE IMP + INPUT CODTAB F_CODIMP + DISPLAY "Codice@5" CODTAB + DISPLAY "Descrizione@60" S0 + OUTPUT F_CODIMP CODTAB[1,5] + OUTPUT F_DESC S0 +END + +STRING F_DESC 50 +BEGIN + PROMPT 2 3 " " + KEY 1 + CHECKTYPE NORMAL + USE IMP KEY 2 + INPUT S0 F_DESC + DISPLAY "Descrizione@60" S0 + DISPLAY "Codice@5" CODTAB + COPY OUTPUT F_CODIMP +END + +STRING F_CODART 20 +BEGIN + PROMPT 2 4 "Articolo " + FIELD CODTAB[6,] + KEY 1 + FLAG "U" + USE LF_ANAMAG + INPUT CODART F_CODART + DISPLAY "Codice@20" CODART + DISPLAY "Descrizione@50" DESCR + OUTPUT F_CODART CODART + OUTPUT F_DESART DESCR + CHECKTYPE REQUIRED +END + +STRING F_DESART 50 +BEGIN + PROMPT 2 5 " " + KEY 1 + USE LF_ANAMAG KEY 2 + INPUT DESCR F_DESART + DISPLAY "Codice@20" CODART + DISPLAY "Descrizione@50" DESCR + COPY OUTPUT F_CODART + CHECKTYPE NORMAL +END + +NUMBER F_CODFORN 6 +BEGIN + PROMPT 1 7 "Codice fornitore " + FIELD I0 + USE LF_CLIFO + INPUT TIPOCF "F" SELECT + INPUT CODCF F_CODFORN + DISPLAY "Codice " CODCF + DISPLAY "Ragione sociale@50" RAGSOC + OUTPUT F_CODFORN CODCF + OUTPUT F_DESFOR RAGSOC + CHECKTYPE NORMAL +END + +STRING F_DESFOR 50 +BEGIN + PROMPT 1 9 "Ragione sociale " + USE LF_CLIFO KEY 2 + INPUT TIPOCF "F" SELECT + INPUT RAGSOC F_DESFOR + DISPLAY "Ragione sociale@50" RAGSOC + DISPLAY "Codice " CODCF + COPY OUTPUT F_CODFORN +END + +ENDPAGE diff --git a/or/or1.url b/or/or1.url index b0848c0b5..d162431c9 100755 --- a/or/or1.url +++ b/or/or1.url @@ -1,20 +1,2 @@ #include - -/* or1 -0 Stampe ordini */ - -MENU TASK_MENUBAR - SUBMENU MENU_FILE "~File" - -/* or1 -1 Stampa dettaglio disponbilita' articoli*/ -MENUBAR MENU_BAR(1) - -MENU MENU_BAR(1) - SUBMENU MENU_FILE "~File" - -/* or1 -2 Stampa statistiche sui tempi di consegna*/ -MENUBAR MENU_BAR(2) - -MENU MENU_BAR(2) - SUBMENU MENU_FILE "~File" - - +#include diff --git a/pr/pr0.url b/pr/pr0.url index c61190ee8..8cfa7a935 100755 --- a/pr/pr0.url +++ b/pr/pr0.url @@ -3,5 +3,5 @@ #define QFIRMNAME "A.G.A. Informatica Srl" #include - #include + diff --git a/pr/pr0700.cpp b/pr/pr0700.cpp index 840447cc7..d5934d106 100755 --- a/pr/pr0700.cpp +++ b/pr/pr0700.cpp @@ -114,6 +114,7 @@ bool TGestione_provv_app::calcola_rate_handler(TMask_field& f, KEY key) ttt.add(""); // Tutti gli altri valori sono a 0 ttt.add(""); ttt.add(""); ttt.add(""); ttt.add(""); ttt.add(""); + ttt.add(rt.codval()); } rs.force_update(); f.set_focusdirty(FALSE); @@ -327,7 +328,8 @@ bool TGestione_provv_app::doc_sheet_notify(TSheet_field& ds, int r, KEY key) ttt.add(rt.pagato().string()); ttt.add(rt.provvpag().string()); ttt.add(rt.saldata() ? "X" : " "); - ttt.add(rt.tipopagpr()); + ttt.add(rt.tipopagpr()); + ttt.add(rt.codval()); } rs.force_update(); } @@ -447,10 +449,13 @@ void TGestione_provv_app::fill_sheet_doc() TToken_string& tt = sf.row(i); tt.add(rd.anno()); tt.add(rd.codnum()); tt.add(rd.ndoc()); tt.add(rd.datadoc()); - tt.add(rd.impdoc().string()); tt.add(rd.impprdoc().string()); - tt.add(rd.impnet().string()); tt.add(rd.codcf()); + tt.add(rd.impdoc().string()); + tt.add(rd.impprdoc().string()); + tt.add(rd.impnet().string()); + tt.add(rd.codcf()); tt.add(rd.codval()); - tt.add(rd.cambio().string()); tt.add(rd.datacam()); + tt.add(rd.cambio().string()); + tt.add(rd.datacam()); } } diff --git a/pr/pr0700b.h b/pr/pr0700b.h index 0e438d9ca..688fa502c 100755 --- a/pr/pr0700b.h +++ b/pr/pr0700b.h @@ -35,5 +35,6 @@ #define F_PROVVPAG 109 #define F_SALDATA 110 #define F_TIPOPAGPR 111 +#define F_CODVAL1 112 #define DLG_ENABLE 401 diff --git a/pr/pr0700b.uml b/pr/pr0700b.uml index df34c82ee..d05b5df53 100755 --- a/pr/pr0700b.uml +++ b/pr/pr0700b.uml @@ -139,7 +139,7 @@ END STRING F_CODVAL 3 BEGIN - PROMPT 2 2 "Codice valuta " + PROMPT 2 4 "Codice valuta " FLAGS "U" USE %VAL INPUT CODTAB F_CODVAL @@ -151,38 +151,40 @@ END NUMBER F_CAMBIO 18 2 BEGIN - PROMPT 25 2 "Cambio " + PROMPT 25 4 "Cambio " END DATE F_DATACAMBIO BEGIN - PROMPT 52 2 "Data cambio " + PROMPT 52 4 "Data cambio " END - + CURRENCY F_IMPDOC 18 BEGIN - PROMPT 2 4 "Importo doc. " + PROMPT 2 6 "Importo doc. " DRIVENBY F_CODVAL END CURRENCY F_IMPPRDOC 18 BEGIN - PROMPT 2 5 "Importo provv. doc. " + PROMPT 2 7 "Importo provv. doc. " + DRIVENBY F_CODVAL NUM_EXPR {IF ((#THIS_FIELD > 0);(#THIS_FIELD <= #F_IMPDOC);(IF ((#THIS_FIELD < 0);(#THIS_FIELD >= #F_IMPDOC);(1))))} WARNING "L'importo della provvigione deve essere minore dell'importo documento" END -CURRENCY F_IMPNETDOC 18 +CURRENCY F_IMPNETDOC 18 BEGIN - PROMPT 2 6 "Base di calcolo " + PROMPT 2 8 "Base di calcolo " + DRIVENBY F_CODVAL NUM_EXPR {IF ((#THIS_FIELD > 0);(#THIS_FIELD <= #F_IMPDOC);(IF ((THIS_FIELD < 0);(#THIS_FIELD >= #F_IMPDOC);(1))))} WARNING "L'importo della base di calcolo deve essere minore dell'importo documento" END NUMBER F_CLIENTE 7 BEGIN - PROMPT 2 8 "Cod. cliente " - USE LF_CLIFO + PROMPT 2 10 "Cod. cliente " + USE LF_CLIFO KEY 1 SELECT TIPOCF=="C" INPUT TIPOCF "C" INPUT CODCF F_CLIENTE DISPLAY "Cod. cliente" CODCF @@ -194,11 +196,11 @@ END STRING F_RAGCLI 50 BEGIN - PROMPT 27 8 "" + PROMPT 27 10 "" FLAGS "D" END -BUTTON DLG_OK 10 2 +BUTTON DLG_OK 9 2 BEGIN PROMPT -13 -1 "" END @@ -246,30 +248,40 @@ BEGIN ITEM "9|Bonifici" END +STRING F_CODVAL1 3 +BEGIN + PROMPT 1 1 "" + FLAGS "UH" +END + CURRENCY F_IMPRATA 18 BEGIN PROMPT 2 4 "Importo rata " - DRIVENBY -F_CODVAL + DRIVENBY F_CODVAL1 +// PICTURE "." END -CURRENCY F_IMPPROVV 18 +CUURENCY F_IMPPROVV 18 BEGIN PROMPT 2 5 "Importo provvigione " - DRIVENBY -F_CODVAL + DRIVENBY F_CODVAL1 +// PICTURE "." END CURRENCY F_PAGATO 18 BEGIN PROMPT 2 6 "Importo rata pagata " - DRIVENBY -F_CODVAL + DRIVENBY F_CODVAL1 +// PICTURE "." FLAGS "D" GROUP 5 END -CURRENCY F_PROVVPAG 18 +CURRENCY F_PROVVPAG 18 BEGIN PROMPT 2 7 "Importo provvigione pagata " - DRIVENBY -F_CODVAL + DRIVENBY F_CODVAL1 +// PICTURE "." FLAGS "D" GROUP 5 END @@ -277,7 +289,8 @@ END CURRENCY F_PAGMAT 18 BEGIN PROMPT 2 8 "Importo pagamento maturato " - PICTURE "." + DRIVENBY F_CODVAL1 +// PICTURE "." NUM_EXPR {IF ((#THIS_FIELD > 0);(#THIS_FIELD <= #F_IMPRATA);(IF ((#THIS_FIELD < 0);(#THIS_FIELD >= #F_IMPRATA);(1))))} WARNING "L'importo pagamento maturato deve essere minore dell'importo della rata" END @@ -285,7 +298,8 @@ END CURRENCY F_PROVVMAT 18 BEGIN PROMPT 2 9 "Importo provvigione maturata " - PICTURE "." + DRIVENBY F_CODVAL1 +// PICTURE "." NUM_EXPR {IF ((#THIS_FIELD > 0);(#THIS_FIELD <= #F_IMPPROVV);(IF ((#THIS_FIELD < 0);(#THIS_FIELD >= #F_IMPPROVV);(1))))} WARNING "L'importo provvigione maturata deve essere minore dell'importo della provvigione" END diff --git a/pr/pr1.url b/pr/pr1.url index 0bbd8d9dd..8cfa7a935 100755 --- a/pr/pr1.url +++ b/pr/pr1.url @@ -4,3 +4,4 @@ #include #include + diff --git a/pr/pr1300a.frm b/pr/pr1300a.frm index 8d3e7e35b..44bd315f4 100755 --- a/pr/pr1300a.frm +++ b/pr/pr1300a.frm @@ -193,7 +193,8 @@ BEGIN PROMPT 5 1 "" DRIVENBY 3 END -NUMBER 105 6 + +NUMERO 105 6 BEGIN SPECIAL STRINGA INTESTAZIONE "@CPerc. prov." "Perc. provv." SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" @@ -201,6 +202,7 @@ BEGIN KEY "IMPORTO" PROMPT 6 1 "" END + VALUTA 106 15 BEGIN SPECIAL STRINGA INTESTAZIONE "@CImporto pagato" "Importo pagato" @@ -210,6 +212,7 @@ BEGIN PROMPT 7 1 "" DRIVENBY 3 END + VALUTA 107 14 BEGIN SPECIAL STRINGA INTESTAZIONE "@CProvvigione pagata" "Provv. pagata" @@ -219,6 +222,7 @@ BEGIN PROMPT 8 1 "" DRIVENBY 3 END + VALUTA 108 15 BEGIN SPECIAL STRINGA INTESTAZIONE "@CImporto maturato" "Importo maturato" @@ -228,6 +232,7 @@ BEGIN PROMPT 9 1 "" DRIVENBY 3 END + VALUTA 109 14 BEGIN SPECIAL STRINGA INTESTAZIONE "@CProvvigione maturata" "Provv. maturata" @@ -320,6 +325,7 @@ SECTION CLIENTI 2 0 0 FILE LF_PROVV GROUP CODAGE BEGIN KEY "IMPORTO rata" PROMPT 4 1 "" + DRIVENBY 3 PICTURE "###.###.###.###" MESSAGE _BASECALCOLO MESSAGE ADD,203 @@ -332,7 +338,7 @@ SECTION CLIENTI 2 0 0 FILE LF_PROVV GROUP CODAGE MESSAGE _NUMEXPR,LF_PROVV->IMPPROVV*#666 MESSAGE ADD,204 END - NUMBER 105 6 + NUMERO 105 6 BEGIN KEY "perc. provv." PROMPT 6 1 "" @@ -411,7 +417,7 @@ SECTION CLIENTI 2 0 0 FILE LF_PROVV GROUP CODAGE MESSAGE _NUMEXPR, LF_PROVV->IMPPROVV*#666 MESSAGE ADD,204 END - NUMBER 105 6 + NUMERO 105 6 BEGIN KEY "perc provv" PROMPT 6 1 "" @@ -478,10 +484,10 @@ SECTION CLIENTI 2 0 0 FILE LF_PROVV GROUP CODAGE MESSAGE ADD,304 GROUP G_TOTDOC END - NUMBER 205 6 + NUMERO 205 6 BEGIN - KEY "PERC" - PROMPT 6 1 "" + KEY "PERCENTUALE" + prompt 6 1 "" PICTURE "##@,@#" MESSAGE _NUMEXPR,#204/#203*100 END @@ -554,7 +560,7 @@ SECTION CLIENTI 2 0 0 FILE LF_PROVV GROUP CODAGE MESSAGE ADD,404 GROUP G_TOTCLI END - NUMBER 305 6 + NUMERO 305 6 BEGIN KEY "IMPORTO" PROMPT 6 1 "" @@ -593,7 +599,7 @@ SECTION CLIENTI 2 0 0 FILE LF_PROVV GROUP CODAGE END // end clienti - NUMERO 401 20 + VALUTA 401 20 BEGIN SPECIAL STRINGA FINCATURA "X " "Fincatura sinistra e destra" PROMPT 1 2 "Totale agente" @@ -617,7 +623,7 @@ END // end clienti PROMPT 5 2 "" GROUP G_TOTAGE END - NUMBER 405 6 + NUMERO 405 6 BEGIN KEY "IMPORTO" PROMPT 6 2 "" diff --git a/pr/pr1400.cpp b/pr/pr1400.cpp index 9f61e1f80..361183113 100755 --- a/pr/pr1400.cpp +++ b/pr/pr1400.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include "provv.h" #include "agenti.h" @@ -44,8 +45,23 @@ bool TForm_stampaprstat::validate(TForm_item& fld, TToken_string& val) fld.set(descr); return TRUE; } - else - return TForm::validate(fld, val); + else + if (code == "_FIRMVALUE") // Per settare la descrizione del range di mesi relativi a questo item + { + TForm & f = fld.form(); + TRectype & rec = f.cursor()->curr(LF_PROVV); + TString16 codval(rec.get("CODVAL")); + if (is_true_value(codval)) + { + TCurrency c(fld.get(), codval, rec.get_real("CAMBIO")); + + c.change_to_firm_val(); + fld.set(c.get_num().string()); + } + return TRUE; + } + else + return TForm::validate(fld, val); } class TStampa_statistiche_app : public TSkeleton_application diff --git a/pr/pr1400a.frm b/pr/pr1400a.frm index ec4fb28e4..532ebb068 100755 --- a/pr/pr1400a.frm +++ b/pr/pr1400a.frm @@ -161,18 +161,20 @@ SECTION PRS 1 0 0 FILE LF_PROVV GROUP CODAGE END VALUTA 201 14 - BEGIN + BEGIN KEY "Fatturato (1)" PROMPT 4 1 "" FIELD LF_PROVV->IMPDOC FLAGS "H" + MESSAGE _FIRMVALUE MESSAGE ADD,F_TOTFAT|ADD,F_FAT1 END VALUTA 301 14 - BEGIN + BEGIN KEY "Provvigione (1)" PROMPT 5 1 "" + MESSAGE _FIRMVALUE FIELD LF_PROVV->IMPPRDOC FLAGS "H" MESSAGE ADD,F_TOTPRO|ADD,F_PRO1 @@ -191,18 +193,20 @@ SECTION PRS 1 0 0 FILE LF_PROVV GROUP CODAGE END VALUTA 202 14 - BEGIN + BEGIN KEY "Fatturato (2)" PROMPT 7 1 "" + MESSAGE _FIRMVALUE FIELD LF_PROVV->IMPDOC FLAGS "H" MESSAGE ADD,F_TOTFAT|ADD,F_FAT2 END VALUTA 302 14 - BEGIN + BEGIN KEY "Provvigione (2)" PROMPT 8 1 "" + MESSAGE _FIRMVALUE FIELD LF_PROVV->IMPPRDOC FLAGS "H" MESSAGE ADD,F_TOTPRO|ADD,F_PRO2 @@ -221,18 +225,20 @@ SECTION PRS 1 0 0 FILE LF_PROVV GROUP CODAGE END VALUTA 203 14 - BEGIN + BEGIN KEY "Fatturato (1)" PROMPT 4 1 "" + MESSAGE _FIRMVALUE FIELD LF_PROVV->IMPDOC FLAGS "H" MESSAGE ADD,F_TOTFAT|ADD,F_FAT3 END VALUTA 303 14 - BEGIN + BEGIN KEY "Provvigione (1)" PROMPT 5 1 "" + MESSAGE _FIRMVALUE FIELD LF_PROVV->IMPPRDOC FLAGS "H" MESSAGE ADD,F_TOTPRO|ADD,F_PRO3 @@ -251,18 +257,20 @@ SECTION PRS 1 0 0 FILE LF_PROVV GROUP CODAGE END VALUTA 204 14 - BEGIN + BEGIN KEY "Fatturato (2)" PROMPT 7 1 "" + MESSAGE _FIRMVALUE FIELD LF_PROVV->IMPDOC FLAGS "H" MESSAGE ADD,F_TOTFAT|ADD,F_FAT4 END VALUTA 304 14 - BEGIN + BEGIN KEY "Provvigione (2)" PROMPT 8 1 "" + MESSAGE _FIRMVALUE FIELD LF_PROVV->IMPPRDOC FLAGS "H" MESSAGE ADD,F_TOTPRO|ADD,F_PRO4 @@ -281,18 +289,20 @@ SECTION PRS 1 0 0 FILE LF_PROVV GROUP CODAGE END VALUTA 205 14 - BEGIN + BEGIN KEY "Fatturato (1)" PROMPT 4 1 "" + MESSAGE _FIRMVALUE FIELD LF_PROVV->IMPDOC FLAGS "H" MESSAGE ADD,F_TOTFAT|ADD,F_FAT5 END VALUTA 305 14 - BEGIN + BEGIN KEY "Provvigione (1)" PROMPT 5 1 "" + MESSAGE _FIRMVALUE FIELD LF_PROVV->IMPPRDOC FLAGS "H" MESSAGE ADD,F_TOTPRO|ADD,F_PRO5 @@ -311,18 +321,20 @@ SECTION PRS 1 0 0 FILE LF_PROVV GROUP CODAGE END VALUTA 206 14 - BEGIN + BEGIN KEY "Fatturato (2)" PROMPT 7 1 "" + MESSAGE _FIRMVALUE FIELD LF_PROVV->IMPDOC FLAGS "H" MESSAGE ADD,F_TOTFAT|ADD,F_FAT6 END VALUTA 306 14 - BEGIN + BEGIN KEY "Provvigione (2)" PROMPT 8 1 "" + MESSAGE _FIRMVALUE FIELD LF_PROVV->IMPPRDOC FLAGS "H" MESSAGE ADD,F_TOTPRO|ADD,F_PRO6 @@ -341,18 +353,20 @@ SECTION PRS 1 0 0 FILE LF_PROVV GROUP CODAGE END VALUTA 207 14 - BEGIN + BEGIN KEY "Fatturato (1)" PROMPT 4 1 "" + MESSAGE _FIRMVALUE FIELD LF_PROVV->IMPDOC FLAGS "H" MESSAGE ADD,F_TOTFAT|ADD,F_FAT7 END VALUTA 307 14 - BEGIN + BEGIN KEY "Provvigione (1)" PROMPT 5 1 "" + MESSAGE _FIRMVALUE FIELD LF_PROVV->IMPPRDOC FLAGS "H" MESSAGE ADD,F_TOTPRO|ADD,F_PRO7 @@ -371,18 +385,20 @@ SECTION PRS 1 0 0 FILE LF_PROVV GROUP CODAGE END VALUTA 208 14 - BEGIN + BEGIN KEY "Fatturato (2)" PROMPT 7 1 "" + MESSAGE _FIRMVALUE FIELD LF_PROVV->IMPDOC FLAGS "H" MESSAGE ADD,F_TOTFAT|ADD,F_FAT8 END VALUTA 308 14 - BEGIN + BEGIN KEY "Provvigione (2)" PROMPT 8 1 "" + MESSAGE _FIRMVALUE FIELD LF_PROVV->IMPPRDOC FLAGS "H" MESSAGE ADD,F_TOTPRO|ADD,F_PRO8 @@ -401,18 +417,20 @@ SECTION PRS 1 0 0 FILE LF_PROVV GROUP CODAGE END VALUTA 209 14 - BEGIN + BEGIN KEY "Fatturato (1)" PROMPT 4 1 "" + MESSAGE _FIRMVALUE FIELD LF_PROVV->IMPDOC FLAGS "H" MESSAGE ADD,F_TOTFAT|ADD,F_FAT9 END VALUTA 309 14 - BEGIN + BEGIN KEY "Provvigione (1)" PROMPT 5 1 "" + MESSAGE _FIRMVALUE FIELD LF_PROVV->IMPPRDOC FLAGS "H" MESSAGE ADD,F_TOTPRO|ADD,F_PRO9 @@ -431,18 +449,20 @@ SECTION PRS 1 0 0 FILE LF_PROVV GROUP CODAGE END VALUTA 210 14 - BEGIN + BEING KEY "Fatturato (2)" PROMPT 7 1 "" + MESSAGE _FIRMVALUE FIELD LF_PROVV->IMPDOC FLAGS "H" MESSAGE ADD,F_TOTFAT|ADD,F_FAT10 END VALUTA 310 14 - BEGIN + BEGIN KEY "Provvigione (2)" PROMPT 8 1 "" + MESSAGE _FIRMVALUE FIELD LF_PROVV->IMPPRDOC FLAGS "H" MESSAGE ADD,F_TOTPRO|ADD,F_PRO10 @@ -461,18 +481,20 @@ SECTION PRS 1 0 0 FILE LF_PROVV GROUP CODAGE END VALUTA 211 14 - BEGIN + BEGIN KEY "Fatturato (1)" PROMPT 4 1 "" + MESSAGE _FIRMVALUE FIELD LF_PROVV->IMPDOC FLAGS "H" MESSAGE ADD,F_TOTFAT|ADD,F_FAT11 END VALUTA 311 14 - BEGIN + BEGIN KEY "Provvigione (1)" PROMPT 5 1 "" + MESSAGE _FIRMVALUE FIELD LF_PROVV->IMPPRDOC FLAGS "H" MESSAGE ADD,F_TOTPRO|ADD,F_PRO11 @@ -491,18 +513,20 @@ SECTION PRS 1 0 0 FILE LF_PROVV GROUP CODAGE END VALUTA 212 14 - BEGIN + BEGIN KEY "Fatturato (2)" PROMPT 7 1 "" + MESSAGE _FIRMVALUE FIELD LF_PROVV->IMPDOC FLAGS "H" MESSAGE ADD,F_TOTFAT|ADD,F_FAT12 END VALUTA 312 14 - BEGIN + BEGIN KEY "Provvigione (2)" PROMPT 8 1 "" + MESSAGE _FIRMVALUE FIELD LF_PROVV->IMPPRDOC FLAGS "H" MESSAGE ADD,F_TOTPRO|ADD,F_PRO12 diff --git a/pr/prlib.h b/pr/prlib.h index 3df590472..264eafe98 100755 --- a/pr/prlib.h +++ b/pr/prlib.h @@ -20,6 +20,7 @@ class TRata : public TSortable bool _saldata; int _nrata,_tipopagpr,_tipopag; char _generata; + TString16 _codval; public: virtual TObject* dup() const { return new TRata(*this); } @@ -36,12 +37,14 @@ public: const bool saldata() const { return _saldata;} const char generata() const { return _generata;} const int tipopagpr()const { return _tipopagpr;} - void set_rata(int n) { _nrata = n; } - void set_tipopag(int t) { _tipopag = t; } - void set_datascad(const TDate& d) { _datascad = d; } - void set_imprata(const real& r) { _imprata = r; } - void set_impprovv(const real& r) { _impprovv = r; } - void set_saldata(bool b = TRUE) { _saldata = b; } + const TString & codval() const { return _codval; } + void set_rata(const int n) { _nrata = n; } + void set_tipopag(const int t) { _tipopag = t; } + void set_datascad(const TDate& d) { _datascad = d; } + void set_imprata(const real& r) { _imprata = r; } + void set_impprovv(const real& r) { _impprovv = r; } + void set_saldata(const bool b = TRUE) { _saldata = b; } + void set_codval(const char * codval) { _codval = codval; } void set_generata(const bool g = TRUE) { _generata = g ? 'D' : ' '; } void set(const TRectype& rec); void set(const TRata& r); diff --git a/pr/prlib01.cpp b/pr/prlib01.cpp index 68ace69a8..9dd7786b1 100755 --- a/pr/prlib01.cpp +++ b/pr/prlib01.cpp @@ -309,9 +309,9 @@ void TRate_doc::set(TToken_string& t) _codnum = t.get(1); _ndoc = t.get_long(2); _datadoc = t.get(3); - _impdoc = t.get(4); - _impprdoc = t.get(5); - _impnetdoc = t.get(6); + _impdoc = real::ita2eng(t.get(4)); + _impprdoc = real::ita2eng(t.get(5)); + _impnetdoc = real::ita2eng(t.get(6)); _codcf = t.get_long(7); _codval = t.get(8); _cambio = t.get(9); @@ -336,7 +336,7 @@ int TRata::compare(const TSortable& s) const void TRata::set(TToken_string& t) { - CHECK(t.items() == 11, "Troppi pochi elementi nella token string"); + CHECK(t.items() == 12, "Troppi pochi elementi nella token string"); _nrata = t.get_int(0); _datascad = t.get(1); _tipopag = t.get_int(2); @@ -348,6 +348,7 @@ void TRata::set(TToken_string& t) _provvpag = t.get(8); _saldata = t.get(9)[0] == 'X' ? TRUE : FALSE; _tipopagpr = t.get_int(10); + _codval = t.get(11); } void TRata::set(const TRectype& rec) @@ -365,6 +366,7 @@ void TRata::set(const TRectype& rec) _nrata = rec.get_int(PROV_NRATA); _generata = rec.get_char(PROV_GENERATA); _tipopagpr = rec.get_int(PROV_TIPOPAGPR); + _codval = rec.get(PROV_CODVAL); } TRata::TRata(const TRectype& rec) @@ -386,6 +388,7 @@ void TRata::set(const TRata& r) _nrata = r._nrata; _generata = r._generata; _tipopagpr = r._tipopagpr; + _codval = r._codval; } int TAgente::read(const char * codice) diff --git a/sc/pec.frm b/sc/pec.frm index 0c9fd4639..3a9ee9344 100755 --- a/sc/pec.frm +++ b/sc/pec.frm @@ -1,6 +1,5 @@ USE 20 JOIN 13 INTO STATO==STATOCF COM==COMCF - END DESCRIPTION BEGIN @@ -21,9 +20,7 @@ KEY "" PROMPT 0 0 "" END END - SECTION HEADER ODD 12 - STRINGA 1 BEGIN KEY "Spettabile/Egregio" @@ -39,7 +36,6 @@ BEGIN KEY "Pagina" PROMPT 73 1 "Pag." END - STRINGA 3 BEGIN KEY "Codice cliente/fornitore" @@ -54,19 +50,19 @@ FIELD RAGSOC END STRINGA 5 BEGIN - KEY "Indirizzo" - PROMPT 2 3 "" - FLAGS "H" - MESSAGE COPY,7 - FIELD INDCF +KEY "Indirizzo" +PROMPT 2 3 "" +FLAGS "H" +MESSAGE COPY,7 +FIELD INDCF END STRINGA 6 BEGIN - KEY "Numero civico" - PROMPT 52 3 "" - FLAGS "H" - MESSAGE APPEND,7 - FIELD CIVCF +KEY "Numero civico" +PROMPT 52 3 "" +FLAGS "H" +MESSAGE APPEND,7 +FIELD CIVCF END STRINGA 7 BEGIN @@ -87,19 +83,19 @@ FIELD LOCALITACF END STRINGA 10 BEGIN - KEY "Comune" - PROMPT 2 5 "" - FLAGS "H" - MESSAGE COPY,12 - FIELD 13->DENCOM +KEY "Comune" +PROMPT 2 5 "" +FLAGS "H" +MESSAGE COPY,12 +FIELD 13->DENCOM END STRINGA 11 BEGIN - KEY "Provincia" - PROMPT 52 5 "" - FLAGS "H" - MESSAGE APPEND,12 - FIELD 13->PROVCOM +KEY "Provincia" +PROMPT 52 5 "" +FLAGS "H" +MESSAGE APPEND,12 +FIELD 13->PROVCOM END STRINGA 12 BEGIN @@ -108,19 +104,19 @@ PROMPT 2 5 "" END STRINGA 13 BEGIN - KEY "Prefisso telefonico" - PROMPT 2 6 "Telefono " - FLAGS "H" - MESSAGE COPY,15 - FIELD PTEL +KEY "Prefisso telefonico" +PROMPT 2 6 "Telefono " +FLAGS "H" +MESSAGE COPY,15 +FIELD PTEL END STRINGA 14 BEGIN - KEY "Telefono" - PROMPT 24 6 "/ " - FLAGS "H" - MESSAGE APPEND,15 - FIELD TEL +KEY "Telefono" +PROMPT 24 6 "/ " +FLAGS "H" +MESSAGE APPEND,15 +FIELD TEL END STRINGA 15 BEGIN @@ -163,263 +159,240 @@ KEY "Flags generali VALUTA|FINCATURA" PROMPT 0 0 "|2|" FLAGS "DH" END - STRINGA 301 BEGIN - KEY "Descrizione saldo partita" - PROMPT 2 1 "*** Saldo partita" - FLAGS "DH" +KEY "Descrizione saldo partita" +PROMPT 2 1 "*** Saldo partita" +FLAGS "DH" END - STRINGA 302 BEGIN - KEY "Descrizione abbuoni" - PROMPT 2 1 "*** Abbuoni" - FLAGS "DH" +KEY "Descrizione abbuoni" +PROMPT 2 1 "*** Abbuoni" +FLAGS "DH" END - STRINGA 303 BEGIN - KEY "Descrizione differenza cambi" - PROMPT 2 1 "*** Differenza cambi" - FLAGS "DH" +KEY "Descrizione differenza cambi" +PROMPT 2 1 "*** Differenza cambi" +FLAGS "DH" END - STRINGA 304 BEGIN - KEY "Ritenute" - PROMPT 2 1 "*** Ritenute" - FLAGS "DH" +KEY "Ritenute" +PROMPT 2 1 "*** Ritenute" +FLAGS "DH" END - STRINGA 400 BEGIN - KEY "Descrizione riporto" - PROMPT 2 1 "*** Riporto" - FLAGS "DH" +KEY "Descrizione riporto" +PROMPT 2 1 "*** Riporto" +FLAGS "DH" END END SECTION BODY ODD 1 COLUMNWISE STRINGA 201 4 BEGIN - KEY "Codice causale" - PROMPT 1 1 "" - FLAGS "H" - SPECIAL STRINGA INTESTAZIONE "Cod." "Codice Causale" - SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" - SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" +KEY "Codice causale" +PROMPT 1 1 "" +FLAGS "H" +SPECIAL STRINGA INTESTAZIONE "Cod." "Codice Causale" +SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" +SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" END STRINGA 202 22 1 BEGIN - KEY "Descrizione" - PROMPT 2 1 "" - SPECIAL STRINGA INTESTAZIONE "Descrizione" "Descrizione" - SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" - SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" +KEY "Descrizione" +PROMPT 1 1 "" +SPECIAL STRINGA INTESTAZIONE "Descrizione" "Descrizione" +SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" +SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" END STRINGA 203 3 BEGIN - KEY "Valuta" - PROMPT 2 1 "" - SPECIAL STRINGA INTESTAZIONE "Val" "Val" - SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" - SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" +KEY "Valuta" +PROMPT 2 1 "" +SPECIAL STRINGA INTESTAZIONE "Val" "Val" +SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" +SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" FLAGS "H" END DATA 205 10 BEGIN - KEY "Data documento" - PROMPT 3 1 "" - SPECIAL STRINGA INTESTAZIONE "Data doc." "Data documento" - SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" - SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" - FORMAT "1444-" +KEY "Data documento" +PROMPT 3 1 "" +SPECIAL STRINGA INTESTAZIONE "Data doc." "Data documento" +SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" +SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" +FORMAT "1444-" END NUMERO 206 8 BEGIN - KEY "Numero protocollo" - PROMPT 4 1 "" - FLAGS "H" - SPECIAL STRINGA INTESTAZIONE "Num prot." "Numero potocollo" - SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" - SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" +KEY "Numero protocollo" +PROMPT 4 1 "" +FLAGS "H" +SPECIAL STRINGA INTESTAZIONE "Num prot." "Numero potocollo" +SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" +SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" END STRINGA 207 8 BEGIN - KEY "Numero documento" - PROMPT 5 1 "" - SPECIAL STRINGA INTESTAZIONE "Num doc." "Numero documento" - SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" - SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" +KEY "Numero documento" +PROMPT 5 1 "" +SPECIAL STRINGA INTESTAZIONE "Num doc." "Numero documento" +SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" +SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" END - -NUMERO 208 15 +VALUTA 208 15 BEGIN - KEY "Totale documento" - PROMPT 6 1 "" - FLAGS "H" - SPECIAL STRINGA INTESTAZIONE "Tot.documento" "Totale documento" - SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" - SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" +KEY "Totale documento" +PROMPT 6 1 "" +FLAGS "H" +DRIVENBY 203 +SPECIAL STRINGA INTESTAZIONE "Tot.documento" "Totale documento" +SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" +SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" END DATA 209 10 BEGIN - KEY "Data scadenza" - PROMPT 7 1 "" - SPECIAL STRINGA INTESTAZIONE "Data scad." "Data scadenza" - SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" - SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" - FORMAT "1444-" +KEY "Data scadenza" +PROMPT 7 1 "" +SPECIAL STRINGA INTESTAZIONE "Data scad." "Data scadenza" +SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" +SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" +FORMAT "1444-" END - VALUTA 210 17 BEGIN - KEY "Dare" - PROMPT 8 1 "" - DRIVENBY 203 - SPECIAL STRINGA INTESTAZIONE "Dare" "Dare" - SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" - SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" +KEY "Dare" +PROMPT 8 1 "" +DRIVENBY 203 +SPECIAL STRINGA INTESTAZIONE "Dare" "Dare" +SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" +SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" END - VALUTA 211 17 BEGIN - KEY "Avere" - PROMPT 9 1 "" - DRIVENBY 203 - SPECIAL STRINGA INTESTAZIONE "Avere" "Avere" - SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" - SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" +KEY "Avere" +PROMPT 9 1 "" +DRIVENBY 203 +SPECIAL STRINGA INTESTAZIONE "Avere" "Avere" +SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" +SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" END - VALUTA 212 17 BEGIN - KEY "Scaduto" - PROMPT 10 1 "" - DRIVENBY 203 - SPECIAL STRINGA INTESTAZIONE "Scaduto" "Scaduto" - SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" - SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" +KEY "Scaduto" +PROMPT 10 1 "" +DRIVENBY 203 +SPECIAL STRINGA INTESTAZIONE "Scaduto" "Scaduto" +SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" +SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" END - VALUTA 213 17 BEGIN - KEY "Esposto" - PROMPT 11 1 "" - DRIVENBY 203 - SPECIAL STRINGA INTESTAZIONE "Esposto" "Esposto" - SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" - SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" +KEY "Esposto" +PROMPT 11 1 "" +DRIVENBY 203 +SPECIAL STRINGA INTESTAZIONE "Esposto" "Esposto" +SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" +SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" END - VALUTA 215 17 BEGIN - KEY "Importi in lire" - PROMPT 12 1 "" - FLAGS "H" - SPECIAL STRINGA INTESTAZIONE "Imp. in lire" "Importi in lire" - SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" - SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" +KEY "Importi in lire" +PROMPT 12 1 "" +FLAGS "H" +SPECIAL STRINGA INTESTAZIONE "Imp. in lire" "Importi in lire" +SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" +SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" END - NUMERO 216 17 BEGIN - KEY "Cambio" - PROMPT 13 1 "" - FLAGS "H" - SPECIAL STRINGA INTESTAZIONE "Cambio" "Cambio" - SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" - SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" - PICTURE "###.###,@@@@@@" +KEY "Cambio" +PROMPT 13 1 "" +FLAGS "H" +SPECIAL STRINGA INTESTAZIONE "Cambio" "Cambio" +SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" +SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" +PICTURE "###.###,@@@@@@" END - DATA 217 10 BEGIN - KEY "Data cambio" - PROMPT 14 1 "" - FLAGS "H" - SPECIAL STRINGA INTESTAZIONE "Data cam." "Data cambio" - SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" - SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" - FORMAT "1444-" +KEY "Data cambio" +PROMPT 14 1 "" +FLAGS "H" +SPECIAL STRINGA INTESTAZIONE "Data cam." "Data cambio" +SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" +SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" +FORMAT "1444-" END - END - SECTION FOOTER ODD 9 - -NUMERO 210 +STRINGA 203 BEGIN - KEY "Dare" - PROMPT 0 1 "" - PICTURE "###.###.###.###" + KEY "Codice Valuta" + FLAGS "H" END - -NUMERO 211 +VALUTA 210 17 BEGIN - KEY "Avere" - PROMPT 0 1 "" - PICTURE "###.###.###.###" +KEY "Dare" +PROMPT 0 1 "" +DRIVENBY 203 END - -NUMERO 212 +VALUTA 211 17 BEGIN - KEY "Scaduto" - PROMPT 0 2 "" - PICTURE "###.###.###.###" +KEY "Avere" +PROMPT 0 1 "" +DRIVENBY 203 END - -NUMERO 213 +VALUTA 212 17 BEGIN - KEY "Esposto" - PROMPT 0 3 "" - PICTURE "###.###.###.###" +KEY "Scaduto" +PROMPT 0 2 "" +DRIVENBY 203 END - -NUMERO 215 +VALUTA 213 17 BEGIN - KEY "Importi in lire" - PROMPT 0 4 "" - PICTURE "###.###.###.###" +KEY "Esposto" +PROMPT 0 3 "" +DRIVENBY 203 END - -NUMERO 219 +VALUTA 215 17 BEGIN - KEY "Importi non assegnati" - PROMPT 0 5 "" - PICTURE "###.###.###.###" +KEY "Importi in lire" +PROMPT 0 4 "" +END +VALUTA 219 17 +BEGIN +KEY "Importi non assegnati" +PROMPT 0 5 "" END - STRINGA 401 BEGIN - KEY "Descrizione totale" - PROMPT 0 1 "Saldo al " +KEY "Descrizione totale" +PROMPT 0 1 "Saldo al " END - STRINGA 402 BEGIN KEY "Descrizione totale scaduto" PROMPT 0 2 "Scaduto al " END - STRINGA 403 BEGIN KEY "Descrizione totale esposto" PROMPT 0 3 "Totale esposto" END - STRINGA 404 BEGIN -KEY "Descrizione totale importi in lire" -PROMPT 0 4 "Totale in lire " +KEY "Descrizione totale importi in lire/euro" +PROMPT 0 4 "Totale importi in " +FLAGS "H" END - STRINGA 405 BEGIN - KEY "Descrizione totale pagamenti non assegnati" - PROMPT 0 5 "Totale pagamenti non assegnati al " +KEY "Descrizione totale pagamenti non assegnati" +PROMPT 0 5 "Totale pagamenti non assegnati al " END - END - END diff --git a/sc/sc0.url b/sc/sc0.url index a8c25c557..53ba6f885 100755 --- a/sc/sc0.url +++ b/sc/sc0.url @@ -1,2 +1,3 @@ #include +#include diff --git a/sc/sc0100a.uml b/sc/sc0100a.uml index 94deea1ff..4082ed51f 100755 --- a/sc/sc0100a.uml +++ b/sc/sc0100a.uml @@ -25,7 +25,6 @@ BEGIN MESSAGE HIDE,1@|SHOW,2@|HIDE,3@ ITEM "F|Fornitore" MESSAGE HIDE,1@|HIDE,2@|SHOW,3@ - FLAGS "P" END NUMBER F_GRUPPO 3 @@ -38,7 +37,6 @@ BEGIN OUTPUT F_GRUPPO GRUPPO CHECKTYPE REQUIRED ADD RUN cg0 -0 - FLAGS "P" END NUMBER F_CONTO 3 @@ -56,7 +54,6 @@ BEGIN OUTPUT F_CONTO CONTO CHECKTYPE REQUIRED ADD RUN cg0 -0 - FLAGS "P" END NUMBER F_SOTTOCONTO 6 diff --git a/sc/sc0100c.uml b/sc/sc0100c.uml index 3920ba047..33b0626a2 100755 --- a/sc/sc0100c.uml +++ b/sc/sc0100c.uml @@ -1,10 +1,10 @@ -#include "sc0100p.uml" - -// Maschera delle rate -#include "../cg/cg21sld.h" -#include "../cg/cg21sld.uml" - -ENDMASK - -// Maschera dello sheet delle rate -#include "../cg/cg21rata.uml" +#include "sc0100p.uml" + +// Maschera delle rate +#include "../cg/cg21sld.h" +#include "../cg/cg21sld.uml" + +ENDMASK + +// Maschera dello sheet delle rate +#include "../cg/cg21rata.uml" diff --git a/sc/sc0100p.uml b/sc/sc0100p.uml index 33cfacf54..bc7e86247 100755 --- a/sc/sc0100p.uml +++ b/sc/sc0100p.uml @@ -379,14 +379,16 @@ BEGIN PROMPT 28 12 "Data cambio " FIELD LF_PARTITE->DATACAM FLAGS "R" - USE CAM + USE CAM + JOIN %VAL ALIAS 104 INTO CODTAB[1,3]=CODTAB[1,3] INPUT CODTAB[1,3] E_VALUTA SELECT INPUT CODTAB[4,11] E_DATACAMBIO DISPLAY "Valuta" CODTAB[1,3] DISPLAY "Data@10" D0 - DISPLAY "Cambio@18" R10 + DISPLAY "Cambio@18R" S4 + DISPLAY "Descrizione@50" 104@->S0 OUTPUT E_DATACAMBIO D0 - OUTPUT E_CAMBIO R10 + OUTPUT E_CAMBIO S4 GROUP 3 CHECKTYPE SEARCH END diff --git a/sc/sc1.url b/sc/sc1.url index 5551b60d9..53ba6f885 100755 --- a/sc/sc1.url +++ b/sc/sc1.url @@ -1,4 +1,3 @@ #include - - +#include diff --git a/sc/sc2.url b/sc/sc2.url index a8c25c557..d162431c9 100755 --- a/sc/sc2.url +++ b/sc/sc2.url @@ -1,2 +1,2 @@ #include - +#include diff --git a/sc/sc2100.cpp b/sc/sc2100.cpp index 321f47432..5681ce4db 100755 --- a/sc/sc2100.cpp +++ b/sc/sc2100.cpp @@ -207,7 +207,7 @@ void TEC_row::reset_uguali() void TEC_row::set_imp(TForm_item& fi, const real& imp, const char* cod_val) const { const TCurrency cur(imp, cod_val); - fi.set(cur.string()); + fi.set(cur.get_num().string()); } TEC_form& TEC_row::form() const @@ -222,8 +222,8 @@ void TEC_row::print_on(TPrint_section& body) TEC_form& form = (TEC_form&)body.form(); const bool show_value = form.in_valuta() && in_valuta(); - const char* cod_valuta = valuta().codice(); - + const char* cod_valuta = show_value ? valuta().codice() : EMPTY_STRING; // Stampa nella valuta della ditta + TForm_item& campo_valuta = body.find_field(PEC_VALUTA); campo_valuta.set(cod_valuta); @@ -801,17 +801,17 @@ void TEC_form::change_magic_footer(const THash_object& o, TString& s) while ((pos = find_magic(s, magic1, magic2)) >= 0) { val.cut(0); - if (magic1 == "DA") + if (magic1 == "DA") // DATA { const TDate& d = magic2 == "SC" ? _dls : _dlo; if (d != eotime) val = d.string(); } else - if (magic1 == "VA") + if (magic1 == "VA") // CODICE VALUTA val = o.key(); else - if (magic1 == "DE") + if (magic1 == "DE") // DESCRIZIONE VALUTA { - val = o.key(); + val = magic2 == "VA" ? o.key() : TCurrency::get_firm_val(); if (val.not_empty()) val = cache().get("%VAL", val).get("S0"); } @@ -887,6 +887,12 @@ void TEC_form::print_total(int riga, const THash_object& o) const bool in_valuta = o.key().not_empty(); TForm_item& dare = foot.find_field(PEC_DARE); TForm_item& avere = foot.find_field(PEC_AVERE); + TForm_item& valuta = foot.find_field(PEC_VALUTA); + + if (in_valuta) + valuta.set(o.key()); + else + valuta.set(""); // TString_array old_pictures;//pictures da ripristinare dopo aver stampato if (dare.x() <= 0 || avere.x() <= 0) @@ -904,7 +910,6 @@ void TEC_form::print_total(int riga, const THash_object& o) if (imp.sezione() == 'D') { - dare.set(imp.valore().string()); avere.set(""); } @@ -940,8 +945,10 @@ void TEC_form::print_total(int riga, const THash_object& o) TForm_item& bimplire = body.find_field(PEC_IMPLIRE); implire.set_x(bimplire.x()); esposto.width() = bimplire.width(); - if (bimplire.shown()) implire.show(); - else implire.hide(); + if (bimplire.shown()) + implire.show(); + else + implire.hide(); } // modify_picture(implire,old_pictures,FALSE); implire.set(t.importo_lire().string()); @@ -1059,9 +1066,13 @@ bool TEC_form::print_game(const TPartita& game) riga.print_on(body); pr.print(body.row(0)); - + + TString16 codval; + if (in_valuta()) + codval = riga.valuta().codice(); + totali().add(riga.importo(), riga.scaduto(), riga.esposto(), - riga.importo_lire(), riga.valuta().codice()); + riga.importo_lire(), codval); saldo += riga.importo(); scaduto += riga.scaduto(); @@ -1075,12 +1086,12 @@ bool TEC_form::print_game(const TPartita& game) saldo.normalize(); const TString & dessaldo = describe(PEC_SALDO); - TString desc(80); - const TValuta & val = righe.row(r-1).valuta(); - - desc = dessaldo; - desc << ' ' << val.codice(); + TString80 desc = dessaldo; + const TValuta& val = righe.row(r-1).valuta(); + if (in_valuta() && val.in_valuta()) // Aggiunge alla descrizione il codice valuta se necessario + desc << ' ' << val.codice(); + TEC_row sld(desc, saldo, val); sld.scaduto(scaduto); diff --git a/sc/sc2102.cpp b/sc/sc2102.cpp index 0287d402c..686c5c347 100755 --- a/sc/sc2102.cpp +++ b/sc/sc2102.cpp @@ -1,4 +1,4 @@ -#include +#include #include "sc2102.h" @@ -19,7 +19,7 @@ void TTotalizer::add(const TImporto& imp, const real& sca, const real& esp, const real& lit, const TString& val) { TString16 codice(val); - if (codice == "LIT") + if (codice == TCurrency::get_firm_val()) codice.cut(0); TObject* obj = objptr(codice); @@ -41,7 +41,7 @@ void TTotalizer::add(const TImporto& imp, const real& sca, void TTotalizer::add(const TImporto& uns, const TString& val) { TString16 codice(val); - if (codice == "LIT") + if (codice == TCurrency::get_firm_val()) codice.cut(0); TObject* obj = objptr(codice); diff --git a/sc/sc2400.cpp b/sc/sc2400.cpp index e3dd53f46..288e2f2fc 100755 --- a/sc/sc2400.cpp +++ b/sc/sc2400.cpp @@ -162,11 +162,11 @@ int TStampaSol_application::print_sol() // E' piu' giusto calcolare il saldo, comprendente i non assegnati. // se il saldo della partita chiude in avere va sommato ad unreferenced const TRiga_partite& sum = game.riga(game.first()); - TString valuta(sum.get(PART_CODVAL)); unreferenced = game.calcola_saldo_al(game.in_valuta() && f.in_valuta(),data_limite_soll, data_limite_scad, data_limite_scad); if (unreferenced.valore() > ZERO && unreferenced.sezione() == 'A') { unreferenced.normalize('A'); //per i non assegnati/anticipi c'e' solo la colonna AVERE + const TString8 valuta = sum.get(PART_CODVAL); form().totali().add(unreferenced,valuta); } } diff --git a/sc/sc2400a.uml b/sc/sc2400a.uml index eb5eb708e..059a5ef66 100755 --- a/sc/sc2400a.uml +++ b/sc/sc2400a.uml @@ -82,7 +82,7 @@ BEGIN CHECKTYPE REQUIRED END -NUMBER F_IMPORMIN 18 +CURRENCY F_IMPORMIN 18 BEGIN PROMPT 2 6 "Importo minimo " END diff --git a/sc/sc2401.cpp b/sc/sc2401.cpp index f2f450278..dcb060889 100755 --- a/sc/sc2401.cpp +++ b/sc/sc2401.cpp @@ -213,9 +213,7 @@ void TESSL_row::print_on(TPrint_section& body) TESSL_form& form = (TESSL_form&)body.form(); const bool show_value = form.in_valuta() && in_valuta(); - const char* cod_valuta = "_FIRM"; - if (show_value) - cod_valuta = valuta().codice(); + const char* cod_valuta = show_value ? valuta().codice() : EMPTY_STRING; TForm_item& campo_valuta = body.find_field(PEC_VALUTA); campo_valuta.set(cod_valuta); @@ -272,7 +270,7 @@ void TESSL_row::print_on(TPrint_section& body) TForm_item& importo_in_lire = body.find_field(PEC_IMPLIRE); //importo_in_lire.set(_importo_lire.string()); - set_imp(importo_in_lire, _importo_lire, "_FIRM"); // In generale va espresso nella valuta della ditta + set_imp(importo_in_lire, _importo_lire, ""); // In generale va espresso nella valuta della ditta TForm_item& scaduto = body.find_field(PEC_SCADUTO); //old_pictures.add(scaduto.picture()); @@ -383,7 +381,7 @@ real TESSL_array::calcola_scaduto(const TRiga_scadenze& rata, bool valuta) const TPartita& game = rata.partita(); const char sezione = game.conto().tipo() == 'C' ? 'D' : 'A'; - TImporto scaduto_rata = rata.importo(TRUE); + TImporto scaduto_rata = rata.importo(valuta); int riga_corrente_scaduto = 0; @@ -464,8 +462,8 @@ TESSL_row& TESSL_array::new_row(const TRiga_partite& row, const TDate& data, con void TESSL_array::add_row(const TRiga_partite& row) { - const bool in_valuta = form().in_valuta() && row.in_valuta();; - real importo_in_lire(ZERO); + const bool in_valuta = form().in_valuta() && row.in_valuta(); + real importo_in_lire; const char sezione = form().sezione_normale(); const TDate data_op(row.get(PART_DATAREG)); diff --git a/sc/sc2500.cpp b/sc/sc2500.cpp index f6fbdb88b..da9e280ed 100755 --- a/sc/sc2500.cpp +++ b/sc/sc2500.cpp @@ -235,7 +235,7 @@ void TConfronta_mask::fill_browse() str.format("%d|%d", g, c); const int indbil = cache().get(LF_PCON, str).get_int(PCN_INDBIL); - sld.ultima_immissione_verifica(annoes, g, c, s, indbil, 1); + sld.ultima_immissione_bilancio(annoes, g, c, s, indbil, 1); const real salc = sld.saldo(); const real salp = calcola_saldo_partite(' ', g, c, s); add_saldo(g, c, s, salc, salp); @@ -295,7 +295,7 @@ void TConfronta_mask::fill_browse() const int indbil = str.get_int(2); if (g == def_grp && c == def_cnt) // Abbiamo trovato il vero conto di default def_conto = i; - sld.ultima_immissione_verifica(annoes, g, c, s, indbil, 1); + sld.ultima_immissione_bilancio(annoes, g, c, s, indbil, 1); const real salc = sld.saldo(); const real salp = calcola_saldo_partite(tipoc, g, c, s, def_conto == i); add_saldo(g, c, s, salc, salp); diff --git a/sc/sc3.url b/sc/sc3.url index 4f2b2f1a7..72e36ad8c 100755 --- a/sc/sc3.url +++ b/sc/sc3.url @@ -1,16 +1,16 @@ #include -MENUBAR MENU_BAR(0) -MENU MENU_BAR(0) -SUBMENU M_FILE "~File" +MENUBAR TASK_MENUBAR + +MENU TASK_MENUBAR +SUBMENU M_FILE "~File" SUBMENU M_EDIT "~Modifica" SUBMENU BAR_ITEM(1) "~Dati" SUBMENU BAR_ITEM(2) "~Testa" SUBMENU BAR_ITEM(3) "~Corpo" SUBMENU BAR_ITEM(4) "~Piede" SUBMENU BAR_ITEM(5) "~Sfondo" -SUBMENU M_HELP "~Help" - +SUBMENU M_HELP "~Help" MENU BAR_ITEM(1) ITEM MENU_ITEM(11) "~Relazione" diff --git a/ve/f47.dir b/ve/f47.dir index cffe58996..1dcd3b753 100755 --- a/ve/f47.dir +++ b/ve/f47.dir @@ -1,3 +1,3 @@ 47 0 -$anamag|0|0|751|0|Anagrafica di magazzino|NART|| +$anamag|0|0|757|0|Anagrafica di magazzino|NART|| diff --git a/ve/f47.trr b/ve/f47.trr index 30e5baef6..ad9901521 100755 --- a/ve/f47.trr +++ b/ve/f47.trr @@ -1,5 +1,5 @@ 47 -65 +67 CODART|1|20|0|Codice Articolo DESCR|1|50|0|Descrizione DESCRAGG|11|10|0|Descrizione aggiuntiva @@ -55,6 +55,8 @@ CONCAR|4|15|5|Peso Carta (Kg) per CONAI CONPLA|4|15|5|Peso Plastica (Kg) per CONAI CONLEG|4|15|5|Peso Legno (Kg) per CONAI CONVET|4|15|5|Peso Vetro (Kg) per CONAI +COLLTYPE|1|1|0|Tipo di collegamento per movimenti con distinta <> Nessuno, dalla riga ovimento della causale collegata, dal ornitore, dall'rticolo +CODMAG|1|5|0|Codice magazzino alternativo per movimenti con distinta USER1|1|20|0|Campo libero 1 USER2|1|20|0|Campo libero 2 USER3|1|20|0|Campo libero 3 diff --git a/ve/listadoc.frm b/ve/listadoc.frm index f447fcd39..7022051bd 100755 --- a/ve/listadoc.frm +++ b/ve/listadoc.frm @@ -227,18 +227,20 @@ BEGIN MESSAGE _STREXPR,"Banca App. "+33->CODABIA+"/"+33->CODCABA+" "+203@->S0 END -NUMERO 14 15 +VALUTA 14 15 BEGIN PROMPT 120 2 "" FLAGS "H" + DRIVENBY 11 FIELD TOTDOC MESSAGE COPY,36|COPY,28 END -NUMERO 15 15 +VALUTA 15 15 BEGIN PROMPT 120 2 "" FLAGS "H" + DRIVENBY 11 MESSAGE _TOTIMPONIBILI,0 MESSAGE COPY,37 END @@ -327,18 +329,19 @@ SECTION RIGHE 3 1 1 FILE LF_RIGHEDOC PICTURE "#########,@@@@@" END - NUMERO 5 15 + VALUTA 5 15 BEGIN PROMPT 84 1 "" FIELD LF_RIGHEDOC->PREZZO - PICTURE "###.###.###" + DRIVENBY 11 + FLAGS "U" END - NUMERO 6 15 + VALUTA 6 15 BEGIN PROMPT 100 1 "" FIELD LF_RIGHEDOC->IMPNN - PICTURE "###.###.###" + DRIVENBY 11 END STRINGA 7 15 @@ -354,11 +357,11 @@ SECTION RIGHE 3 1 1 FILE LF_RIGHEDOC PICTURE "###,@@" END - NUMERO 9 15 + VALUTA 9 15 BEGIN PROMPT 142 1 "" FIELD LF_RIGHEDOC->PROVVR - PICTURE "###.###.###" + DRIVENBY 11 END END // SECTION RIGHE @@ -401,65 +404,65 @@ END // Tabella riepilogativa imponibili per codice IVA -NUMBER 22 18 +VALUTA 22 18 BEGIN KEY "Imponibile 1" - PROMPT 26 5 "" + PROMPT 22 5 "" + DRIVENBY 11 MESSAGE _RIEPILOGOIVA,31,IMP,0 - PICTURE "###.###.###" END STRING 23 4 BEGIN KEY "Codice iva 1" - PROMPT 44 5 "" + PROMPT 42 5 "" MESSAGE _RIEPILOGOIVA,31,COD,0 END -NUMBER 24 18 +VALUTA 24 18 BEGIN KEY "Imposta 1" - PROMPT 49 5 "" + PROMPT 45 5 "" MESSAGE _RIEPILOGOIVA,31,IVA,1 - PICTURE "###.###.###" + DRIVENBY 11 END -NUMBER 25 18 +VALUTA 25 18 BEGIN KEY "Imponibile 2" - PROMPT 78 5 "" + PROMPT 74 5 "" MESSAGE _RIEPILOGOIVA,31,IMP,0 - PICTURE "###.###.###" + DRIVENBY 11 END STRING 26 4 BEGIN KEY "Codice iva 2" - PROMPT 97 5 "" + PROMPT 94 5 "" MESSAGE _RIEPILOGOIVA,31,COD,0 END -NUMBER 27 18 +VALUTA 27 18 BEGIN KEY "Imposta 2" - PROMPT 102 5 "" + PROMPT 98 5 "" MESSAGE _RIEPILOGOIVA,31,IVA,1 - PICTURE "###.###.###" + DRIVENBY 11 END -NUMBER 28 18 +VALUTA 28 18 BEGIN KEY "Totale documento" PROMPT 121 5 "@B" - PICTURE "###.###.###.###" + DRIVENBY 11 END -NUMBER 29 18 +VALUTA 29 18 BEGIN KEY "Imponibile 3" PROMPT 25 6 "" MESSAGE _RIEPILOGOIVA,1,IMP,0 - PICTURE "###.###.###" + DRIVENBY 11 END STRING 30 4 @@ -469,20 +472,20 @@ BEGIN MESSAGE _RIEPILOGOIVA,1,COD,0 END -NUMBER 31 18 +VALUTA 31 18 BEGIN KEY "Imposta 3" PROMPT 49 6 "" MESSAGE _RIEPILOGOIVA,1,IVA,1 - PICTURE "###.###.###" + DRIVENBY 11 END -NUMBER 32 18 +VALUTA 32 18 BEGIN KEY "Imponibile 4" PROMPT 78 6 "" MESSAGE _RIEPILOGOIVA,1,IMP,0 - PICTURE "###.###.###" + DRIVENBY 11 END STRING 33 4 @@ -492,12 +495,12 @@ BEGIN MESSAGE _RIEPILOGOIVA,1,COD,0 END -NUMBER 34 18 +VALUTA 34 18 BEGIN KEY "Imposta 4" PROMPT 102 6 "" MESSAGE _RIEPILOGOIVA,1,IVA,1 - PICTURE "###.###.###" + DRIVENBY 11 END NUMERO 35 1 @@ -507,7 +510,7 @@ BEGIN FLAGS "H" END -NUMBER 36 15 +VALUTA 36 15 BEGIN KEY "Campo nascosto per il calcolo Totale documenti" PROMPT 1 7 "" @@ -515,15 +518,17 @@ BEGIN MESSAGE _LISTADOC,STORE,#1 MESSAGE _LISTADOC,ADDTOT,FL->16 FLAGS "H" + DRIVENBY 11 END -NUMBER 37 15 +VALUTA 37 15 BEGIN KEY "Campo nascosto per il calcolo Totale imponibili" PROMPT 40 7 "" MESSAGE _NUMEXPR,IF(((#12!=0)&&(#35==1));#37*#12;#37) MESSAGE _LISTADOC,ADDTOT,FL->17 FLAGS "H" + DRIVENBY 11 END END //BODY @@ -565,12 +570,11 @@ BEGIN MESSAGE _LISTADOC,CODICE,1 END -NUMERO 6 18 +VALUTA 6 18 BEGIN KEY "Tot. Cod. numerazione 1" PROMPT 65 3 "" MESSAGE _LISTADOC,TOTALE,1 - PICTURE "###.###.###.###" END STRING 7 4 @@ -580,12 +584,11 @@ BEGIN MESSAGE _LISTADOC,CODICE,2 END -NUMERO 8 18 +VALUTA 8 18 BEGIN KEY "Tot. Cod. numerazione 2" PROMPT 65 4 "" MESSAGE _LISTADOC,TOTALE,2 - PICTURE "###.###.###.###" END STRING 9 4 @@ -595,12 +598,11 @@ BEGIN MESSAGE _LISTADOC,CODICE,3 END -NUMERO 10 18 +VALUTA 10 18 BEGIN KEY "Tot. Cod. numerazione 3" PROMPT 65 5 "" MESSAGE _LISTADOC,TOTALE,3 - PICTURE "###.###.###.###" END STRING 11 4 @@ -610,12 +612,11 @@ BEGIN MESSAGE _LISTADOC,CODICE,4 END -NUMERO 12 18 +VALUTA 12 18 BEGIN KEY "Tot. Cod. numerazione 4" PROMPT 65 7 "" MESSAGE _LISTADOC,TOTALE,4 - PICTURE "###.###.###.###" END STRINGA 13 55 @@ -637,18 +638,16 @@ BEGIN PROMPT 25 10 "@BTOTALE IMPONIBILI" END -NUMBER 16 18 +VALUTA 16 18 BEGIN KEY "Totale Generale" PROMPT 65 9 "" - PICTURE "###.###.###.###" END -NUMBER 17 18 +VALUTA 17 18 BEGIN KEY "Totale Imponibili" PROMPT 65 10 "" - PICTURE "###.###.###.###" END END // FOOTER diff --git a/ve/ve0.url b/ve/ve0.url index be5531063..810ffb435 100755 --- a/ve/ve0.url +++ b/ve/ve0.url @@ -2,4 +2,4 @@ #define QAPPNAME "eurocampo" #define QFIRMNAME "A.G.A. Informatica Srl" #include - +#include diff --git a/ve/ve0100.cpp b/ve/ve0100.cpp index 5c7fa3d1e..cd53155f0 100755 --- a/ve/ve0100.cpp +++ b/ve/ve0100.cpp @@ -17,11 +17,17 @@ void TMotore_application::init_query_mode( TMask& m ) { disable_menu_item(M_FILE_PRINT); - _msk->set(F_CODNUM, _codnum); - _msk->field(F_CODNUM).set_focusdirty(TRUE); - _msk->field(F_CODNUM).on_key(K_TAB); - _msk->field(F_CODNUM).set_dirty(FALSE); - _msk->set(F_TIPODOC, _tipodoc, TRUE); + if (_msk->get(F_CODNUM).empty()) + { + _msk->set(F_CODNUM, _codnum); + if (_msk->field(F_TIPODOC).empty()) + { + _msk->field(F_CODNUM).set_focusdirty(TRUE); + _msk->field(F_CODNUM).on_key(K_TAB); + _msk->field(F_CODNUM).set_dirty(FALSE); + _msk->set(F_TIPODOC, _tipodoc, TRUE); + } + } } void TMotore_application::init_insert_mode( TMask& m ) @@ -223,7 +229,7 @@ int TMotore_application::read( TMask& m ) } int TMotore_application::write( const TMask& m ) // C 90 -{ +{ TDocumento& d = (TDocumento&) _rel->curr(); d = ((TDocumento_mask&)m).doc(); return TRelation_application::write(m); @@ -232,23 +238,12 @@ int TMotore_application::write( const TMask& m ) // C 90 int TMotore_application::rewrite( const TMask& m ) // C 90 { TDocumento& d = (TDocumento &) _rel->curr(); + if (d.bloccato()) + return 0; d = ((TDocumento_mask&)m).doc(); return TRelation_application::rewrite(m); } -// Riempie lo sheet con le righe documento specificate nel .ini -void TMotore_application::open_files(int logicnum, ...) -{ - va_list marker; - va_start(marker, logicnum); - while (logicnum > 0) - { - CHECKD(_file.objptr(logicnum) == NULL, "File gia' aperto: ", logicnum); - _file.add(new TLocalisamfile(logicnum), logicnum); - logicnum = va_arg(marker, int); - } -} - void TMotore_application::on_firm_change() { if (_config_ditta != NULL) @@ -266,7 +261,7 @@ bool TMotore_application::user_create( ) LF_MOVMAG, LF_RMOVMAG, LF_MAG, LF_SVRIEP, LF_AGENTI, LF_PERCPROV, LF_ATTIV, LF_CAUSALI, 0); _config_ditta = new TConfig(CONFIG_DITTA); - + // Metto in relazione testata e righe _rel = new TRelation( LF_DOC ); _rel->lfile().set_curr(new TDocumento); @@ -312,40 +307,44 @@ int TMotore_application::stato_corrente( ) void TMotore_application::sheet2ini(TSheet_field &sheet,TConfig& ini) { - if (sheet.dlg()) + // scrive le righe degli sheet associati + TString16 defpar; + TString str(80); + TDocumento_mask &m = (TDocumento_mask &)sheet.mask(); + for (int r = 1; r <= sheet.items(); r++) { - // scrive le righe degli sheet associati - TString16 defpar; - TString str(80); - TDocumento_mask &m = (TDocumento_mask &)sheet.mask(); - for (int r = 1 ; r <= sheet.items(); r++) - { - TString16 defpar = format("%d,%d",LF_RIGHEDOC,r); - const TMask * sm = m.riga_mask(r-1); + defpar.format("%d,%d",LF_RIGHEDOC,r); + const TMask * sm = m.riga_mask(r-1); - for (int sf = 0; sf < sm->fields(); sf++) + for (int sf = 0; sf < sm->fields(); sf++) + { + TMask_field& campo = sm->fld(sf); + if (campo.shown() && campo.field()) { - TMask_field& campo = sm->fld(sf); - if (campo.shown() && campo.field()) - { - str = sheet.row(r-1).get(sheet.cid2index(campo.dlg())); - if (str.empty()) str = " "; - const word field_class = campo.class_id(); - if (field_class == CLASS_MEMO_FIELD || - field_class == CLASS_ZOOM_FIELD) - { - int p; - while ((p = str.find('\n', 0)) >= 0) - { - str.overwrite("\\", p); - str.insert("n", p+1); - } - } - TString16 dbfname=campo.field()->name(); - ini.set(campo.field()->name(), str ,defpar); - } + str = sheet.row(r-1).get(sheet.cid2index(campo.dlg())); + if (str.empty()) str = " "; + const word field_class = campo.class_id(); + if (field_class == CLASS_MEMO_FIELD || + field_class == CLASS_ZOOM_FIELD) + { + int p; + while ((p = str.find('\n', 0)) >= 0) + { + str.overwrite("\\", p); + str.insert("n", p+1); + } + } + campo.field()->write(ini, defpar, str); } } + } + for ( ; ; r++) + { + defpar.format("%d,%d",LF_RIGHEDOC,r); + if (ini.set_paragraph(defpar)) + ini.remove_all(); + else + break; } } @@ -359,17 +358,20 @@ void TMotore_application::ini2mask(TConfig& ini, TMask& msk, bool query) campo.set(str); if (query) - { + { } else { TSheet_field& f = msk.sfield(F_SHEET); + f.destroy(); + TTipo_riga_documento tr; // Scorre tutti i paragrafi delle righe documento TMaskmode oldmode= (TMaskmode)msk.mode(); msk.set_mode(MODE_MOD); + doc().destroy_rows(); // Prima cancello tutto, poi aggiungo le righe for (int i = 1; ini.set_paragraph(format("%d,%d", LF_RIGHEDOC, i)); i++) { // Considera solo i tipi riga validi @@ -382,6 +384,13 @@ void TMotore_application::ini2mask(TConfig& ini, TMask& msk, bool query) TAssoc_array& var = ini.list_variables(); FOR_EACH_ASSOC_STRING(var, obj, key, val) { + if (*val == '"' || *val == '\'') + { + const int len = strlen(val); + *(char*)(val+len-1) = '\0'; + val++; + } + if (stricmp(key, RDOC_DESCR) == 0) // Trattamento speciale per la descrizione { const TString s(esc(val)); @@ -412,10 +421,10 @@ void TMotore_application::ini2mask(TConfig& ini, TMask& msk, bool query) } // solo la insert chiama la post_insert necessaria alla disabilitazione verifichiamo // l'autoload ?? -// f.insert(-1, FALSE); + f.insert(-1, FALSE); // Aggiunge la riga allo sheet rec.autoload(f); - f.check_row(rec.numero()-1); + f.check_row(f.items()-1, 0x2); } } msk.set_mode(oldmode); diff --git a/ve/ve0100.h b/ve/ve0100.h index 020ecae32..b3c3da489 100755 --- a/ve/ve0100.h +++ b/ve/ve0100.h @@ -54,8 +54,6 @@ class TMotore_application : public TRelation_application protected: - void open_files(int logicnum, ...); - void close_files() { _file.destroy(); } virtual void on_firm_change(); // Procedure e funzioni per la gestione degli stati diff --git a/ve/ve0100b.uml b/ve/ve0100b.uml index c90d902fa..7cf32bd78 100755 --- a/ve/ve0100b.uml +++ b/ve/ve0100b.uml @@ -89,7 +89,7 @@ BEGIN DISPLAY "Descrizione@50" S0 OUTPUT F_CODNUM_ELAB CODTAB OUTPUT F_DESNUM_ELAB S0 - CHECKTYPE REQUIRED + CHECKTYPE NORMAL FLAG "U" WARNING "Numerazione assente" GROUP 1 @@ -140,7 +140,7 @@ BEGIN JOIN LF_CLIFO TO LF_DOC INTO TIPOCF==TIPOCF CODCF==CODCF INPUT PROVV F_PROVV_ELAB SELECT INPUT ANNO F_ANNO_ELAB SELECT - INPUT CODNUM F_CODNUM_ELAB SELECT + INPUT CODNUM F_CODNUM_ELAB INPUT NDOC F_NDOC_ELAB DISPLAY "Num." CODNUM DISPLAY "Anno" ANNO @@ -152,6 +152,7 @@ BEGIN DISPLAY "Codice" CODCF DISPLAY "Ragione Sociale@50" LF_CLIFO->RAGSOC OUTPUT F_NDOC_ELAB NDOC + OUTPUT F_CODNUM_ELAB CODNUM CHECKTYPE NORMAL FLAG "R" WARNING "Documento inesistente o incompatibile" diff --git a/ve/ve0200b.uml b/ve/ve0200b.uml index f41036707..d1aad3c7c 100755 --- a/ve/ve0200b.uml +++ b/ve/ve0200b.uml @@ -38,7 +38,7 @@ ITEM "C|Clienti " ITEM "O|Condizioni di vendita" END -GROUPBOX DLG_NULL 78 5 +GROUPBOX DLG_NULL 78 6 BEGIN PROMPT 1 6 "Gestione dati generali" END @@ -47,32 +47,36 @@ BOOLEAN F_GESVAL BEGIN PROMPT 2 7 "Gestione documenti in valuta" FIELD GESVAL +MESSAGE FALSE CLEAR,1@ +MESSAGE TRUE ENABLE,1@ END BOOLEAN F_GESVALAC BEGIN PROMPT 2 8 "Gestione archivio cambi " FIELD GESVALAC +GROUP 1 +END + +BOOLEAN F_CONTROEURO_E +BEGIN +PROMPT 2 9 "Gestione flag controeuro" +FIELD CONTROEURO +GROUP 1 END BOOLEAN F_GESLIN BEGIN -PROMPT 2 9 "Gestione documenti in lingua" +PROMPT 2 10 "Gestione documenti in lingua" FIELD GESLIN END BOOLEAN F_LIVPERART BEGIN - PROMPT 2 11 "Gestione livelli di giacenza legati agli articoli" - FIELD LIVPERART + PROMPT 2 12 "Gestione livelli di giacenza legati agli articoli" + FIELD LIVPERART END -//BOOLEAN F_GESOCCAS -//BEGIN -//PROMPT 2 11 "Gestione archivio clienti occasionali" -//FIELD GESOCCAS -//END - ENDPAGE ENDMASK diff --git a/ve/ve0200f.uml b/ve/ve0200f.uml index 2fd5ae04e..9e49392a4 100755 --- a/ve/ve0200f.uml +++ b/ve/ve0200f.uml @@ -53,7 +53,7 @@ END CURRENCY F_IMPSPINC6 9 BEGIN PROMPT 2 7 "Importo spese per lettere di credito " -FIELD F_IMPSPINC[6] +FIELD IMPSPINC[6] PICTURE "." END diff --git a/ve/ve1.url b/ve/ve1.url index 18f2fcfa1..67d2d79b3 100755 --- a/ve/ve1.url +++ b/ve/ve1.url @@ -2,7 +2,4 @@ #define QAPPNAME "campo" #define QFIRMNAME "A.G.A. Informatica Srl" #include - -MENU TASK_MENUBAR - SUBMENU MENU_FILE "~File" - ITEM BAR_ITEM(1) "~Parametri" +#include diff --git a/ve/ve1100.cpp b/ve/ve1100.cpp index 9265c1703..34223a000 100755 --- a/ve/ve1100.cpp +++ b/ve/ve1100.cpp @@ -212,8 +212,6 @@ TDocumento_form::TDocumento_form(TRectype&/*TDocumentoEsteso**/ doc, TRelation& pr.setfooterhandler(doc_footer_handler); const TPrint_section& foot = section('F'); pr.footerlen(foot.height()); - - set_magic_currency(); } // costruttore per stampa lista documenti (uso convenzionale dei forms) @@ -884,8 +882,8 @@ bool TDocumento_form::validate(TForm_item &cf, TToken_string &s) { _doc->summary_filter(selector); - TString what(s.get()); // cosa deve stampare ? - TString value(_doc->summary_get(what)); // Piglia il valore dalla riga selezionata sullatabellina + TString16 what = s.get(); // cosa deve stampare ? + TString value(_doc->summary_get(what)); // Piglia il valore dalla riga selezionata sulla tabellina what = s.get(); const bool next = what == "1"; // deve cambiare elemento ? @@ -1290,7 +1288,8 @@ behaviour TStampaDoc_application::on_module_change(const TString &modulo, TStrin if (!_interattivo) return skip; // se siamo in interattivo il documento viene saltato... else { // ...altrimenti viene chiesto all'utente il da farsi - int risp= yesnocancel_box("Il modulo di carta è cambiato: inserisci il modulo '%s' e premi 'Sì' per continuare, 'No' per saltare il documento o 'Cancel' per interrompere la stampa", modulo); + int risp= yesnocancel_box("Il modulo di carta è cambiato: inserire il modulo '%s' e premere 'Si' per continuare," + "'No' per saltare il documento o 'Annulla' per interrompere la stampa", (const char*) modulo); behaviour ret; switch (risp) { diff --git a/ve/ve2.url b/ve/ve2.url index cc9a90ccd..67d2d79b3 100755 --- a/ve/ve2.url +++ b/ve/ve2.url @@ -2,4 +2,4 @@ #define QAPPNAME "campo" #define QFIRMNAME "A.G.A. Informatica Srl" #include - +#include diff --git a/ve/ve2100.cpp b/ve/ve2100.cpp index 6d490c523..a516c9ac7 100755 --- a/ve/ve2100.cpp +++ b/ve/ve2100.cpp @@ -241,10 +241,12 @@ bool TTabelle_sconti::user_create() _msk->set_handler(F_R_SGM_A,handle_check); gotcha= TRUE; - const char * rigakey = prassid.get("SCORIGAKEY"); + TString16 rigakey = prassid.get("SCORIGAKEY"); + if (rigakey.empty()) + rigakey = "A"; _msk->set(F_R_TIPO_RIGA, rigakey); - switch (*rigakey) + switch (rigakey[0]) { case 'A' : key_hide(*_msk, F_R_RFA_A); @@ -362,9 +364,9 @@ void TTabelle_sconti::init_query_mode(TMask& m) { break; case 'R': { - const char * rigakey = m.get(F_R_TIPO_RIGA); + TString16 rigakey = m.get(F_R_TIPO_RIGA); - switch (*rigakey) + switch (rigakey[0]) { case 'A' : m.show(F_R_CODART_A); @@ -419,9 +421,9 @@ void TTabelle_sconti::init_query_insert_mode(TMask& m) break; case 'R': { - const char * rigakey = m.get(F_R_TIPO_RIGA); + TString16 rigakey = m.get(F_R_TIPO_RIGA); - switch (*rigakey) + switch (rigakey[0]) { case 'A' : m.show(F_R_CODART); diff --git a/ve/ve2400.cpp b/ve/ve2400.cpp index 7242cca2e..b3efe1ac7 100755 --- a/ve/ve2400.cpp +++ b/ve/ve2400.cpp @@ -55,9 +55,9 @@ class TMask_anamag: public TMask { int add_totali_storico(TString &codmag); bool remove_totali_storico(TString & codmag); void update_totali_storico(TString & codmag); - void update_ordc_ordf(); bool check_totali_storico(); public: + void update_ordc_ordf(); void set_parametered_fields(); void ricalcola_giacenze(); @@ -71,8 +71,8 @@ public: // ****************************** // applicazione -class TAnagrafica_magazzino : public TRelation_application { - +class TAnagrafica_magazzino : public TRelation_application +{ TMask_anamag *_msk; // maschera principale TRelation *_rel; // relazione principale di un solo file (anagrafiche di magazzino) @@ -84,6 +84,8 @@ protected: virtual TRelation *get_relation() const { return _rel; } virtual void init_insert_mode(TMask &); virtual void on_firm_change(); + bool search_on_file(const char * key, int file, int nkey, const char * field); + virtual bool protected_record(TRectype&); virtual int read(TMask& m); void load_um(TMask& m); @@ -91,6 +93,9 @@ protected: virtual int write(const TMask& m); virtual int rewrite(const TMask& m); + virtual void ini2sheet(TConfig& ini, TSheet_field &sheet); + virtual void sheet2ini(TSheet_field &sheet,TConfig& ini); + public: // @cmember Disabilita la verifica del modulo : essendo una anagrafica, va sempre abilitata virtual bool check_autorization() const {return FALSE;} @@ -150,8 +155,8 @@ void TMask_anamag::set_parametered_fields() } // setta i campi della maschera per la pagina giacenze - TSheet_field &fld_stomag= (TSheet_field &)field(F_SHEETSTOMAG); - TSheet_field &fld_giac= (TSheet_field &)field(F_SHEETGIAC); + TSheet_field &fld_stomag= sfield(F_SHEETSTOMAG); + TSheet_field &fld_giac= sfield(F_SHEETGIAC); // disabilita le colonne quando non sono utilizzati i livelli di giacenza for (int i=0; i<4; i++) { @@ -423,7 +428,7 @@ bool TMask_anamag::handle_anno(TMask_field &fld, KEY k) if (k == K_TAB) { - TSheet_field &fld_giac= (TSheet_field &)mask.field(F_SHEETGIAC); + TSheet_field& fld_giac = mask.sfield(F_SHEETGIAC); if (mask.get(F_ANNO).empty() ) { @@ -495,8 +500,10 @@ void TMask_anamag::update_ordc_ordf() bool TMask_anamag::handle_stoanno(TMask_field &fld, KEY k) { - if (k == K_TAB) - { +static bool in_handler = FALSE; + if (k == K_TAB && fld.focusdirty() && !in_handler) + { + in_handler = TRUE; TMask_anamag &mask=(TMask_anamag &)fld.mask(); TSheet_field &fld_stomag= mask.sfield(F_SHEETSTOMAG); @@ -505,12 +512,12 @@ bool TMask_anamag::handle_stoanno(TMask_field &fld, KEY k) fld.error_box("Impossibile dare la composizione delle rimanenze per l'ultimo anno"); mask.reset(F_STOANNO); }*/ - if (mask.get(F_STOANNO).empty() ) +/* if (mask.get(F_STOANNO).empty() ) { mask.set(F_STOANNORIF, mask.esercizi_contabili().last()) ; mask.set(F_STOANNO, mask.get(F_STOANNORIF)); - } - if ( fld.focusdirty() && mask.last_annosto>0 && mask.last_annosto!=fld.mask().get_int(F_STOANNO)) + } */ + if (mask.last_annosto>0 && mask.last_annosto!=fld.mask().get_int(F_STOANNO)) { if ((fld_stomag.dirty() || mask.info_sto_dirty()) && fld_stomag.items()>0 ) @@ -521,20 +528,19 @@ bool TMask_anamag::handle_stoanno(TMask_field &fld, KEY k) fld_stomag.autosave(*mask._rel); fld_stomag.record()->write(TRUE); } - } - mask.field(F_STOANNORIF).set(fld.get()); - mask.last_annosto=mask.get_int(F_STOANNORIF); + } + } // rilegge lo storico relativo a quell'anno ed aggiorna il layout - mask.clear_info_sto(); - fld_stomag.record()->read(*fld_stomag.putkey(*mask._rel)); - fld_stomag.autoload(*mask._rel); - handle_sheetstomag(fld_stomag,K_SPACE); - fld_stomag.force_update(); - } - else - mask.last_annosto=mask.get_int(F_STOANNORIF); + mask.field(F_STOANNORIF).set(fld.get()); + mask.clear_info_sto(); + fld_stomag.record()->read(*fld_stomag.putkey(*mask._rel)); + fld_stomag.autoload(*mask._rel); + handle_sheetstomag(fld_stomag,K_SPACE); + fld_stomag.force_update(); + mask.last_annosto=mask.get_int(F_STOANNORIF); if (fld.focusdirty()) TEsercizi_contabili::update(); + in_handler = FALSE; } return TRUE; @@ -797,7 +803,10 @@ bool TMask_anamag::remove_totali_storico(TString & codmag) bool TMask_anamag::check_totali_storico() { - TSheet_field &s =(TSheet_field &)field(F_SHEETSTOMAG); + TSheet_field &s =(TSheet_field &)field(F_SHEETSTOMAG); + const int annogiac = get_int(F_ANNO); + if (annogiac != last_annosto) + return TRUE; for (int r=0 ; r< s.items() ; r++) { // rintraccia il totale @@ -814,7 +823,7 @@ bool TMask_anamag::check_totali_storico() r++; } return TRUE; -} +} bool TMask_anamag::notify_sheet_giac(TSheet_field &f, int i, KEY k) @@ -876,7 +885,7 @@ bool TMask_anamag::handle_sheet_giac_valgiac(TMask_field &f, KEY k) { q=(m.get_real(F_VRIM)+m.get_real(F_VACQ))/q; TPrice r(q); - f.set(r.string()); + f.set(r.get_num().string()); } } return TRUE; @@ -1267,10 +1276,39 @@ void TAnagrafica_magazzino::on_firm_change() _msk->set_parametered_fields(); } +bool TAnagrafica_magazzino::search_on_file(const char * key, int file, int nkey, const char * field) +{ + TLocalisamfile f(file); + + if (f.empty()) + return FALSE; + else + { + f.setkey(nkey); + f.put(field, key); + f.read(); + return f.get(field) == key; + } +} + +bool TAnagrafica_magazzino::protected_record(TRectype& rec) +{ + const TString art(rec.get(ANAMAG_CODART)); + const TRectype & dist = cache().get(LF_DIST, art); + + if (!dist.empty()) + return TRUE; + else + if (search_on_file(art, LF_RDIST, 2, "CODCOMP")) + return TRUE; + else + return search_on_file(art, LF_RMOVMAG, 2, "CODART"); +} + bool TAnagrafica_magazzino::user_create() { open_files(LF_TAB, LF_TABCOM, LF_ANAMAG, LF_MAG, LF_STOMAG, - LF_UMART, LF_CODCORR, LF_DESLIN, LF_DIST, + LF_UMART, LF_CODCORR, LF_DESLIN, LF_DIST, LF_RDIST, LF_RMOVMAG, LF_CLIFO, LF_PCON, 0); // crea l'oggetto per i parametri di livello giacenza // apre la maschera e dispone gli sheet @@ -1302,6 +1340,7 @@ int TAnagrafica_magazzino::read(TMask& m) // ***************************** // LETTURA SHEET UNITA' DI MISURA load_um(m); + ((TMask_anamag & ) m).update_ordc_ordf(); //chiama la funzione che calcola i totali degli ordinati } return err; } @@ -1372,11 +1411,35 @@ int TAnagrafica_magazzino::rewrite(const TMask& m) void TAnagrafica_magazzino::init_insert_mode(TMask &m) { load_um(m); - TSheet_field &f= (TSheet_field &)m.field(F_SHEETUM); + TSheet_field& f = m.sfield(F_SHEETUM); if (f.items() == 0) f.row(0) = " |1"; // aggiunge una riga allo sheet } +void TAnagrafica_magazzino::ini2sheet(TConfig& ini, TSheet_field &sheet) +{ + switch(sheet.dlg()) + { + case F_SHEETGIAC: + case F_SHEETSTOMAG: + break; // do nothing + default: + TRelation_application::ini2sheet(ini, sheet); + } +} + +void TAnagrafica_magazzino::sheet2ini(TSheet_field &sheet,TConfig& ini) +{ + switch(sheet.dlg()) + { + case F_SHEETGIAC: + case F_SHEETSTOMAG: + break; // do nothing + default: + TRelation_application::sheet2ini(sheet, ini); + } +} + // ************************ // int ve2400(int argc, char* argv[]) diff --git a/ve/ve2400.h b/ve/ve2400.h index 88b0ee63a..804ea1eda 100755 --- a/ve/ve2400.h +++ b/ve/ve2400.h @@ -125,6 +125,8 @@ #define F_SEARCHLAV 260 #define F_CODICELAV 261 #define F_DESCRAGG 262 +#define F_COLLTYPE 263 +#define F_CODMAGAN 264 #define F_USER1 271 #define F_USER2 272 diff --git a/ve/ve2400.uml b/ve/ve2400.uml index 149f10eba..22310497c 100755 --- a/ve/ve2400.uml +++ b/ve/ve2400.uml @@ -23,7 +23,7 @@ BEGIN DISPLAY "Codice@20" CODART DISPLAY "Descrizione@50" DESCR OUTPUT F_CODART CODART - OUTPUT F_DESCR DESCR +// OUTPUT F_DESCR DESCR CHECKTYPE REQUIRED MESSAGE EMPTY ENABLE,F_GCA MESSAGE COPY,G_CODART@|DISABLE,F_GCA @@ -803,6 +803,29 @@ BEGIN ITEM "F|Fornitore" END +LISTBOX F_COLLTYPE 25 +BEGIN + PROMPT 1 7 "Mag.per movim.con distinta " + FIELD LF_ANAMAG->COLLTYPE + ITEM " |da movimento" MESSAGE CLEAR,F_CODMAGAN + ITEM "M|da riga prod.fin/semilav." MESSAGE CLEAR,F_CODMAGAN + ITEM "F|da fornitore" MESSAGE CLEAR,F_CODMAGAN + ITEM "A|da articolo" MESSAGE ENABLE,F_CODMAGAN +END + +STRING F_CODMAGAN 5 +BEGIN + PROMPT 59 7 "Codice mag. " + FIELD LF_ANAMAG->CODMAG + FLAG "U" + USE MAG + INPUT CODTAB F_CODMAGAN + DISPLAY "Codice@10" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT F_CODMAGAN CODTAB + CHECKTYPE NORMAL +END + STRING F_CLASSDOG 8 BEGIN PROMPT 1 8 "Nomenclatura combin. " @@ -1039,13 +1062,13 @@ END NUMBER F_TOT_ORD_FOR 15 5 BEGIN - PROMPT 2 20 "Ordinato fornitori " + PROMPT 2 -1 "Ordinato fornitori " FLAGS "D" END NUMBER F_TOT_ORD_CLI 15 5 BEGIN - PROMPT 38 20 "Ordinato clienti " + PROMPT 38 -1 "Ordinato clienti " FLAGS "D" END ENDPAGE @@ -1069,7 +1092,7 @@ END STRING F_STOANNO 4 BEGIN PROMPT 2 4 "Seleziona l'esercizio " - FLAGS "UP" + FLAGS "U" USE ESC INPUT CODTAB F_STOANNO DISPLAY "Codice@10" CODTAB diff --git a/ve/ve2400a.uml b/ve/ve2400a.uml index bb753baf2..3ccdad314 100755 --- a/ve/ve2400a.uml +++ b/ve/ve2400a.uml @@ -6,7 +6,7 @@ PAGE "Pagina 1" 8 5 65 11 STRING FS_CODUM 2 BEGIN PROMPT 3 2 "Unita' di misura " - FIELD LF_UMART->UM + FIELD UM FLAG "U" USE %UMS INPUT CODTAB FS_CODUM @@ -20,7 +20,7 @@ END NUMBER FS_FCUM 15 5 BEGIN PROMPT 3 4 "Fattore di conversione " - FIELD LF_UMART->FC + FIELD FC CHECKTYPE REQUIRED WARNING "Fattore di conversione obbligatorio" END @@ -28,7 +28,7 @@ END CURRENCY FS_PREZZO 15 BEGIN PROMPT 3 5 "Prezzo netto " - FIELD LF_UMART->PREZZO + FIELD PREZZO FLAGS "U" END @@ -38,17 +38,17 @@ BEGIN FLAGS "U" END -BUTTON DLG_OK 9 2 +BUTTON DLG_OK 10 2 BEGIN PROMPT -13 -1 "" END -BUTTON DLG_CANCEL 9 2 +BUTTON DLG_CANCEL 10 2 BEGIN PROMPT -23 -1 "" END -BUTTON DLG_DELREC 9 2 +BUTTON DLG_DELREC 10 2 BEGIN PROMPT -33 -1 "Elimina" MESSAGE EXIT,K_DEL diff --git a/ve/ve2400b.uml b/ve/ve2400b.uml index 9169488b5..469d85be9 100755 --- a/ve/ve2400b.uml +++ b/ve/ve2400b.uml @@ -5,9 +5,9 @@ PAGE "Pagina 1" 8 5 65 11 STRING FS_CODLIN 1 BEGIN - FLAGS "U" + FLAGS "U" PROMPT 3 2 "Codice lingua " - FIELD LF_DESLIN->CODLIN + FIELD CODLIN USE %LNG INPUT CODTAB FS_CODLIN DISPLAY "Codice" CODTAB @@ -21,15 +21,15 @@ END STRING FS_DESCR 50 BEGIN PROMPT 3 4 "Descrizione " - FIELD LF_DESLIN->DESCR + FIELD DESCR END -BUTTON DLG_OK 9 2 +BUTTON DLG_OK 10 2 BEGIN PROMPT -13 -1 "" END -BUTTON DLG_CANCEL 9 2 +BUTTON DLG_CANCEL 10 2 BEGIN PROMPT -23 -1 "" END diff --git a/ve/ve2400c.uml b/ve/ve2400c.uml index 05ae698e5..70a05dbe0 100755 --- a/ve/ve2400c.uml +++ b/ve/ve2400c.uml @@ -5,9 +5,9 @@ PAGE "Pagina 1" 8 5 65 11 STRING FS_CODARTALT 20 BEGIN - FLAGS "U" + FLAGS "U" PROMPT 3 2 "Codice alternativo " - FIELD LF_CODCORR->CODARTALT + FIELD CODARTALT CHECKTYPE REQUIRED WARNING "Codice alternativo obbligatorio" END @@ -15,7 +15,7 @@ END LISTBOX FS_TIPO 10 BEGIN PROMPT 2 4 "Tipo di codice " - FIELD LF_CODCORR->TIPO + FIELD TIPO ITEM "N|Normale" ITEM "8|EAN8 " ITEM "1|EA13 " @@ -23,17 +23,17 @@ BEGIN ITEM "C|Codabar" END -BUTTON DLG_OK 9 2 +BUTTON DLG_OK 10 2 BEGIN PROMPT -13 -1 "" END -BUTTON DLG_CANCEL 9 2 +BUTTON DLG_CANCEL 10 2 BEGIN PROMPT -23 -1 "" END -BUTTON DLG_DELREC 9 2 +BUTTON DLG_DELREC 10 2 BEGIN PROMPT -33 -1 "Elimina" MESSAGE EXIT,K_DEL diff --git a/ve/ve2400d.uml b/ve/ve2400d.uml index b56e1abd1..b892a1aea 100755 --- a/ve/ve2400d.uml +++ b/ve/ve2400d.uml @@ -1,16 +1,16 @@ TOOLBAR "" 0 -2 0 2 -BUTTON DLG_OK 9 2 +BUTTON DLG_OK 10 2 BEGIN PROMPT -13 -1 "" END -BUTTON DLG_CANCEL 9 2 +BUTTON DLG_CANCEL 10 2 BEGIN PROMPT -23 -1 "" END -BUTTON DLG_DELREC 9 2 +BUTTON DLG_DELREC 10 2 BEGIN PROMPT -33 -1 "Elimina" MESSAGE EXIT,K_DEL @@ -34,7 +34,6 @@ BEGIN OUTPUT H_DESMAG S0 OUTPUT H_GESTGIA B0 CHECKTYPE REQUIRED - END STRING F_CODDEP 2 diff --git a/ve/ve2400e.uml b/ve/ve2400e.uml index 3cc585e34..483ef58b8 100755 --- a/ve/ve2400e.uml +++ b/ve/ve2400e.uml @@ -1,16 +1,16 @@ TOOLBAR "" 0 -2 0 2 -BUTTON DLG_OK 9 2 +BUTTON DLG_OK 10 2 BEGIN PROMPT -13 -1 "" END -BUTTON DLG_CANCEL 9 2 +BUTTON DLG_CANCEL 10 2 BEGIN PROMPT -23 -1 "" END -BUTTON DLG_DELREC 9 2 +BUTTON DLG_DELREC 10 2 BEGIN PROMPT -33 -1 "Elimina" MESSAGE EXIT,K_DEL @@ -32,7 +32,7 @@ STRING F_STOCODMAG 3 BEGIN PROMPT 2 2 "Codice magazzino " FLAGS "U" - FIELD LF_STOMAG->CODMAG + FIELD CODMAG USE MAG INPUT CODTAB F_STOCODMAG DISPLAY "Codice" CODTAB @@ -51,7 +51,7 @@ STRING F_STOANNOES 6 BEGIN PROMPT 2 4 "Codice esercizio " FLAGS "R" - FIELD LF_STOMAG->ANNOES + FIELD ANNOES USE ESC INPUT CODTAB F_STOANNOES DISPLAY "Esercizio @15" CODTAB @@ -66,7 +66,7 @@ END NUMBER F_STOQUANT 15 5 BEGIN PROMPT 2 8 "Quantità " - FIELD LF_STOMAG->QUANT + FIELD QUANT CHECKTYPE REQUIRED MESSAGE CHECK, F_STOVAL WARNING "Indicare la quantità" @@ -75,7 +75,7 @@ END CURRENCY F_STOVALUN 18 BEGIN PROMPT 2 10 "Valore unitario " - FIELD LF_STOMAG->VALORE + FIELD VALORE CHECKTYPE REQUIRED MESSAGE CHECK, F_STOVAL FLAGS "U" diff --git a/ve/ve3.url b/ve/ve3.url index cc9a90ccd..3cc17993a 100755 --- a/ve/ve3.url +++ b/ve/ve3.url @@ -3,3 +3,28 @@ #define QFIRMNAME "A.G.A. Informatica Srl" #include +MENUBAR TASK_MENUBAR + +MENU TASK_MENUBAR + SUBMENU M_FILE "~File" + ITEM BAR_ITEM(1) "~Parametri" + + +MENUBAR MENU_BAR(1) + +MENU MENU_BAR(1) + SUBMENU M_FILE "~File" + ITEM BAR_ITEM(1) "~Parametri" + + +MENUBAR MENU_BAR(2) + +MENU MENU_BAR(2) + SUBMENU M_FILE "~File" + ITEM BAR_ITEM(1) "~Parametri" + +MENUBAR MENU_BAR(3) + +MENU MENU_BAR(3) + SUBMENU M_FILE "~File" + ITEM BAR_ITEM(1) "~Parametri" diff --git a/ve/ve3400.cpp b/ve/ve3400.cpp index da390f048..f957f62cc 100755 --- a/ve/ve3400.cpp +++ b/ve/ve3400.cpp @@ -245,7 +245,9 @@ print_action TStampa_anagrafica_magazzino::postprocess_print(int file, int count printer().formfeed(); return NEXT_PAGE; } -void TStampa_anagrafica_magazzino::process_link(int id, const char *text) { + +void TStampa_anagrafica_magazzino::process_link(int id, const char *text) +{ if (id== _anagr_link_id) { TString body= "1|"; // istanzia la stringa per il corpo del messaggio e gli aggiunge il numero della chiave e il separatore body << text; // aggiunge al corpo del messaggio il codice dell'articolo per riempire la chiave @@ -258,7 +260,8 @@ void TStampa_anagrafica_magazzino::process_link(int id, const char *text) { -int ve3400(int argc, char **argv) { +int ve3400(int argc, char **argv) +{ TStampa_anagrafica_magazzino a; a.run(argc, argv, "Stampa anagrafica magazzino"); diff --git a/ve/ve4.url b/ve/ve4.url index cc9a90ccd..b052351f1 100755 --- a/ve/ve4.url +++ b/ve/ve4.url @@ -3,3 +3,4 @@ #define QFIRMNAME "A.G.A. Informatica Srl" #include +#include diff --git a/ve/ve5.url b/ve/ve5.url index bcf8a9be8..5aa6e4b17 100755 --- a/ve/ve5.url +++ b/ve/ve5.url @@ -2,5 +2,5 @@ #define QAPPNAME "campo" #define QFIRMNAME "A.G.A. Informatica Srl" #include - +#include diff --git a/ve/ve6.url b/ve/ve6.url index cc9a90ccd..67d2d79b3 100755 --- a/ve/ve6.url +++ b/ve/ve6.url @@ -2,4 +2,4 @@ #define QAPPNAME "campo" #define QFIRMNAME "A.G.A. Informatica Srl" #include - +#include diff --git a/ve/veconf.h b/ve/veconf.h index f1f2bea5a..2e8cf43cb 100755 --- a/ve/veconf.h +++ b/ve/veconf.h @@ -56,7 +56,8 @@ #define F_GESVALAC 104 #define F_GESLIN 105 #define F_LIVPERART 106 -#define F_GESOCCAS 107 +#define F_GESOCCAS 107 +#define F_CONTROEURO_E 108 // Campi per ve0200c.uml diff --git a/ve/velib.h b/ve/velib.h index 6f028a47c..4ca787c23 100755 --- a/ve/velib.h +++ b/ve/velib.h @@ -726,7 +726,9 @@ class TDocumento_mask : public TVariable_mask // velib06 TString _std_mag, _std_dep; protected: + void update_progs(); virtual void next_page(int p); + virtual bool stop_run(KEY key); void sconto_testa2mask(); void spese2mask(); @@ -1078,7 +1080,7 @@ protected: // Funzione per aggiungere la riga iva al TAssoc_array _righe_iva error_type add_iva_row(const TBill&, const TRiga_documento&, const int, const real p); // Funzione atomica per aggiungere le righe di spese d'incasso e bolli al TAssoc_array _righe_iva - void calculate_spese(real&, real&, int, bool, bool, const TString & ); + void calculate_spese(real&, real&, int, bool, bool, const TString &, const TDocumento & ); // Funzione per aggiungere le righe di spese d'incasso e bolli al TAssoc_array _righe_iva (chiama calculate_spese()) error_type add_spese_inbo(TDocumento&, const int); // Aggiorna le righe di sconto importo o percentuale diff --git a/ve/velib03.cpp b/ve/velib03.cpp index c3e0ce281..8f0fd7800 100755 --- a/ve/velib03.cpp +++ b/ve/velib03.cpp @@ -1525,7 +1525,7 @@ int TDocumento::write_rewrite(TBaseisamfile & f, bool re) const if (new_doc) { char stato_finale = tipo().stato_finale_inserimento(); - if (stato_finale > ' ') + if (stato() == '\0' && stato_finale > ' ') myself.stato(stato_finale); } else @@ -1611,7 +1611,10 @@ int TDocumento::write_rewrite(TBaseisamfile & f, bool re) const mov.put(MOVMAG_DOCPROVV, get("PROVV")); mov.put(MOVMAG_ANNODOC, get("ANNO"));; mov.put(MOVMAG_CODNUM, get("CODNUM")); - const long numdoc = get_long("NDOC"); + long numdoc = get_long("NDOC"); + if (numdoc <= 0L) + numdoc = myself.renum_ndoc(numdoc); + mov.put(MOVMAG_NUMDOC, numdoc); const long ex_numdoc = get_long("NUMDOCRIF"); if (ex_numdoc == 0) diff --git a/ve/velib04.cpp b/ve/velib04.cpp index 7a6267f0a..f6c254cab 100755 --- a/ve/velib04.cpp +++ b/ve/velib04.cpp @@ -3,7 +3,7 @@ #ifndef __EXECP_H #include -#endif +#endif #ifndef __TABUTIL_H #include diff --git a/ve/velib04b.cpp b/ve/velib04b.cpp index 78b56bc38..ec3397964 100755 --- a/ve/velib04b.cpp +++ b/ve/velib04b.cpp @@ -68,7 +68,7 @@ public: // e verifica la quadratura del movimento. Ritorna TRUE se il movimento e' scrivibile bool movement_ok() ; int recalc_cg_rows(const TString & descr_cr, TCausale* caus = NULL); - TMovimentoPN_VE(bool valuta) : _valuta(valuta) {}; + TMovimentoPN_VE(bool valuta) : _valuta(valuta), _caus(NULL) {}; virtual ~TMovimentoPN_VE() {} }; @@ -386,6 +386,12 @@ bool TMovimentoPN_VE::movement_ok() // ...ed anche il totale documento sulla testata lfile().curr().put(MOV_TOTDOC,tot_imp.valore()); tot_imp.valore() = 0.0; + if (_caus != NULL && _caus->intra()) + { + real totdoc = curr().get(MOV_TOTDOC); + + curr().put(MOV_CORRLIRE, totdoc); + } } if (!tot_imp.is_zero()) @@ -675,7 +681,7 @@ bool TContabilizzazione::load_parameters() _spbo_cod = conf.get("SPBOCODIVA","ve"); _check_prev_cont = conf.get_bool("CHECKPREVCONT","ve"); - + return TRUE; } @@ -955,7 +961,26 @@ error_type TContabilizzazione::compile_head_mov(TDocumento& doc) TCurrency corrlire(corrval); corrval.change_value(codvali, cambioi); corrlire.change_to_firm_val(); - if (codvali != TCurrency::get_firm_val()) + if (::is_true_value(codvali)) + { + mov_rec.put(MOV_CORRLIRE,corrlire.get_num()); + mov_rec.put(MOV_CORRVALUTA,corrval.get_num()); + } + else + mov_rec.put(MOV_CORRLIRE,corrval.get_num()); + } + } + else + { + if (_caus->intra()) + { + TCurrency corrval(totdocval); + TCurrency corrlire(corrval); + + mov_rec.put(MOV_CODVALI,codval); + mov_rec.put(MOV_CAMBIOI,cambio); + corrlire.change_to_firm_val(); + if (::is_true_value(codval)) { mov_rec.put(MOV_CORRLIRE,corrlire.get_num()); mov_rec.put(MOV_CORRVALUTA,corrval.get_num()); @@ -1292,7 +1317,7 @@ error_type TContabilizzazione::add_iva_row(const TBill& conto, const TRiga_docum return no_error; } -void TContabilizzazione::calculate_spese(real& spese, real& sp_iva, int ndec, bool is_incasso, bool is_cli, const TString & codiva_es) +void TContabilizzazione::calculate_spese(real& spese, real& sp_iva, int ndec, bool is_incasso, bool is_cli, const TString & codiva_es, const TDocumento & doc) { char tipo; int gr,co; @@ -1312,10 +1337,20 @@ void TContabilizzazione::calculate_spese(real& spese, real& sp_iva, int ndec, bo key.format("5|%-4s|%c|%3d|%3d|%6ld",(const char*)sp_cod.codice(),tipo,gr,co,so); const bool exists = _righe_iva.is_key(key); TIVA_element& el = (exists ? (TIVA_element&)_righe_iva[key] : el_tmp); - el.imp() = spese; - el.iva() = sp_iva; + el.imp() += spese; + el.iva() += sp_iva; el.ali() = sp_cod.percentuale(); _righe_iva.add(key,el,exists); + if (doc.tipo().calcolo_lordo()) // Si ricorda che calcolo_lordo() e fattura_commerciale sono esclusivi. + { + // Totalizza per ogni codice iva il lordo + const TString16 codiva(sp_cod.codice()); + + if (!_totali_lordi.is_key(codiva)) + _totali_lordi.add(codiva, new real); + real& rl = (real&) _totali_lordi[codiva]; + rl += spese + sp_iva; + } } else _error = spinbo_error; @@ -1334,13 +1369,13 @@ error_type TContabilizzazione::add_spese_inbo(TDocumento& doc, const int ndec) doc.iva_esente(codiva_es); if (sp_incasso != 0.0) - calculate_spese(sp_incasso,iva_sp_incasso,ndec,TRUE,is_cli, codiva_es); + calculate_spese(sp_incasso,iva_sp_incasso,ndec,TRUE,is_cli, codiva_es, doc); // Aggiunge le spese bolli tot_netto += sp_incasso + iva_sp_incasso; sp_bolli = doc.bolli(tot_netto,ndec, _netto); if (sp_bolli != 0) - calculate_spese(sp_bolli, iva_sp_bolli, ndec, FALSE, is_cli, ""); + calculate_spese(sp_bolli, iva_sp_bolli, ndec, FALSE, is_cli, "", doc); return _error; } @@ -1354,7 +1389,7 @@ error_type TContabilizzazione::adjust_sconto_rows(TDocumento& doc) TString16 cod; // Codice IVA corrente TString80 key; real sconto,iva; - const int ndec = doc.in_valuta() ? 3 : 0; + const int ndec = doc.decimals(); if (!_sco_imp_bill.ok() || !_sco_perc_bill.ok()) { @@ -1393,6 +1428,14 @@ error_type TContabilizzazione::adjust_sconto_rows(TDocumento& doc) el.ali() = codiva.percentuale(); el.cod_iva() = cod; _righe_iva.add(key,el,exists); + if (doc.tipo().calcolo_lordo()) // Si ricorda che calcolo_lordo() e fattura_commerciale() sono esclusivi. + { + // Totalizza per ogni codice iva il lordo + if (!_totali_lordi.is_key(cod)) + _totali_lordi.add(cod, new real); + real& rl = (real&) _totali_lordi[cod]; + rl += sconto + iva; + } } } } @@ -1418,7 +1461,7 @@ error_type TContabilizzazione::adjust_iva_rows(TDocumento& doc) const real cambio = doc.cambio(); const bool calcolo_lordo = doc.tipo().calcolo_lordo(); real imponibile; - const int ndec = TCurrency::get_base_dec(); + const int ndec = TCurrency::get_firm_dec(); const TString16 codval(doc.get(DOC_CODVAL)); const exchange_type et = doc.get_bool(DOC_CONTROEURO) ? _exchange_contro : _exchange_base; // Scorre tutti gli elementi della tabella IVA del documento (elementi per codice iva) @@ -1432,23 +1475,39 @@ error_type TContabilizzazione::adjust_iva_rows(TDocumento& doc) imponibile = _totali_lordi.is_key(codiva) ? (real&)_totali_lordi[codiva] : ZERO; iva_g = cod.scorpora(imponibile, doc.decimals()); } - else - iva_g = riep->imposta(); + else + iva_g = riep->imposta(); - TExchange cam(codval, cambio, et); - - iva_g *= cam.get_base_change(); - - if (ndec == 0) + if (in_valuta) { - if (iva_g < ZERO) - iva_g.floor(0); + TCurrency_documento iva(iva_g, doc); + + iva.change_to_firm_val(); + iva_g = iva.get_num(); + } + else + { + if (ndec == 0) + { + TExchange cam(codval, cambio, et); + + iva_g *= cam.get_base_change(); + if (iva_g < ZERO) + iva_g.floor(0); + else + iva_g.ceil(0); + } else - iva_g.ceil(0); + { + TCurrency_documento iva(iva_g); + + iva.change_to_firm_val(); + iva_g = iva.get_value(); + } } - TGeneric_distrib gd_iva(iva_g); // Instanzia il TGeneric_ditrib con la vera Imposta - TGeneric_distrib gd_imp(imponibile); + TGeneric_distrib gd_iva(iva_g, ndec); // Instanzia il TGeneric_ditrib con la vera Imposta + TGeneric_distrib gd_imp(imponibile, ndec); // Adesso scorre tutte le righe IVA contabili con questo codice IVA for (int i = 0; i < items; i++) { @@ -1481,23 +1540,20 @@ error_type TContabilizzazione::adjust_iva_rows(TDocumento& doc) if (tdoc_cont.not_empty()) { real diffval = doc.get_real(tdoc_cont) - doc.totale_doc(); - real difflit = diffval * cambio; difflit.round(0); + TCurrency_documento dv(diffval, doc); + dv.change_to_firm_val(); + real difflit = dv.get_num(); if (!difflit.is_zero()) // Controlla se c'è differenza { TRectype& rigaiva = _movimento->iva(0); TCodiceIVA iva(rigaiva.get(RMI_CODIVA)); + if (_caus->intra()) { const real imponibile = inc_field(rigaiva, RMI_IMPONIBILE, difflit); const real imposta = iva.imposta(imponibile); rigaiva.put(RMI_IMPOSTA, imposta); - - real ritfis = ZERO; - for (int i = 0; i < items; i++) - ritfis += _movimento->iva(i).get_real(RMI_IMPOSTA); - - _movimento->curr().put(MOV_RITFIS, ritfis); } else { @@ -1506,6 +1562,14 @@ error_type TContabilizzazione::adjust_iva_rows(TDocumento& doc) inc_field(rigaiva, RMI_IMPOSTA, diffimp); } } + if (_caus->intra()) + { + real ritfis = ZERO; + for (int i = 0; i < items; i++) + ritfis += _movimento->iva(i).get_real(RMI_IMPOSTA); + + _movimento->curr().put(MOV_RITFIS, ritfis); + } } } @@ -1533,7 +1597,8 @@ error_type TContabilizzazione::create_iva_rows(TDocumento& doc) _righe_iva.get_keys(key_arr); key_arr.sort(); - TIVA_element cur; + TIVA_element cur; + TString16 valuta(doc.valuta()); for (int i = 0, nr = 0; i < items; i++) { @@ -1549,12 +1614,13 @@ error_type TContabilizzazione::create_iva_rows(TDocumento& doc) imponibile = cur.imp(); if (in_valuta) // I documenti vanno sempre contabilizzati in lire { - TCurrency_documento impval(cur.imp(), doc); + TCurrency_documento imponval(cur.imp(), doc); + imponval.change_to_firm_val(); + imponibile = imponval.get_num(); // imponibile in lire + TCurrency_documento impval(cur.iva(), doc); impval.change_to_firm_val(); - imponibile = impval.get_num(); // imponibile in lire - - TCodiceIVA iva(codiva); - imposta = iva.imposta(imponibile); // questa e' l'imposta ricalcolata + + imposta = impval.get_num(); // questa e' l'imposta ricalcolata } else imposta = cur.iva(); @@ -1824,21 +1890,21 @@ error_type TContabilizzazione::write_scadenze(TDocumento& doc) TCurrency_documento totimposte(doc.imposta(TRUE), doc); real imposte; + for (int j = _movimento->iva_items()-1; j >= 0; j--) + imposte += _movimento->iva(j).get_real(RMI_IMPOSTA); if (_caus->iva() == iva_acquisti) // Ricalcola precisamente il totale imposte { - for (int i = _movimento->iva_items()-1; i >= 0; i--) - imposte += _movimento->iva(i).get_real(RMI_IMPOSTA); real ti = imposte; if (in_valuta) cambio.lit2val(ti); totimposte.set_num(ti); } - else - { - TCurrency ti = totimposte; - ti.change_to_firm_val(); - imposte = ti.get_num(); - } +// else +// { +// TCurrency ti = totimposte; +// ti.change_to_firm_val(); +// imposte = ti.get_num(); +// } const TCurrency totimponibili = td - totimposte - totspese; TCurrency_documento anticipo(doc.get_real(DOC_IMPPAGATO), doc); @@ -1852,16 +1918,20 @@ error_type TContabilizzazione::write_scadenze(TDocumento& doc) d.add(totspese.get_num()); const TCurrency_documento pagtotimponibili(totimponibili.get_num() - d.get(), doc); - const TCurrency_documento pagtotimposte (totimposte.get_num() - d.get(), doc); + TCurrency_documento diffiva(d.get(), doc); + const TCurrency_documento pagtotimposte (totimposte.get_num() - diffiva.get_num(), doc); const TCurrency_documento pagtotspese (totspese.get_num() - d.get(), doc); if (in_valuta) { const real change = cambio.cambio(); //real val1 = totimponibili * change; - TCurrency_documento val2(pagtotimposte); val2.change_to_firm_val(); - TCurrency_documento val3(pagtotspese); val3.change_to_firm_val(); - TCurrency_documento val1(td); val1.change_to_firm_val(); val1 -= val2 + val3; + TCurrency val2(imposte); diffiva.change_to_firm_val(); val2 -= diffiva; + TCurrency_documento val3(pagtotspese); val3.change_to_firm_val(); + TCurrency val1(totdoc); + TCurrency_documento ant(anticipo.get_num(), doc); + ant.change_to_firm_val(); + val1 -= ant + val2 + val3; // Cosi' corregge eventuali scompensi di poche lirette pag.set_total_valuta(pagtotimponibili, pagtotimposte, pagtotspese, val1, val2, val3); } @@ -2250,7 +2320,7 @@ error_type TContabilizzazione::compile_rows_anticipo(TDocumento& doc) { TCurrency_documento importo(doc.get_real(DOC_IMPPAGATO), doc); importo.change_to_firm_val(); TLocalisamfile& mov = _anticipo->lfile(); - TDate datareg = mov.get_long(MOV_DATAREG); + TDate datareg = mov.get_date(MOV_DATAREG); TString16 codes = mov.get(MOV_ANNOES); const long numreg = mov.get_long(MOV_NUMREG); TRectype& c_rec = _anticipo->cg(0); diff --git a/ve/velib05.cpp b/ve/velib05.cpp index 448b98f25..7e2c665e1 100755 --- a/ve/velib05.cpp +++ b/ve/velib05.cpp @@ -48,22 +48,29 @@ int TCodice_numerazione::read(const char* codnum) //TDocumentoEsteso ///////////////////////////////////////////////////////////// void TDocumentoEsteso::compile_summary() -{ +{ + const int ndec = decimals(); + _sum_filter = 0; _summary_array.destroy(); - const int ndec = in_valuta() ? 3 : 0; + _summary_table = tabella_iva(); _summary_table.restart(); for (TRiepilogo_iva * ri = (TRiepilogo_iva *) _summary_table.get(); ri != NULL; ri = (TRiepilogo_iva *) _summary_table.get()) { - real imponibile(ri->imponibile()); - real imposta(ri->imposta()); - imponibile.round(ndec); - if (imposta < ZERO) - imposta.floor(ndec); + const real imponibile = ri->imponibile(); + real imposta = ri->imposta(); + if (ndec == 0) + { + if (imposta < ZERO) + imposta.floor(); + else + imposta.ceil(); + } else - imposta.ceil(ndec); + imposta.round(ndec); + ri->imp() = imponibile; ri->imp_spese() = ZERO; ri->iva() = imposta; @@ -140,7 +147,7 @@ void TDocumentoEsteso::summary_set_next() else { TRiepilogo_iva i; - _sum_current = i; // se non esiste il codice azzera l'elemento corrente (non stampera' nulla) + _sum_current = i; // se non esiste il codice azzera l'elemento corrente (non stampera' nulla) } } @@ -180,7 +187,7 @@ void TDocumentoEsteso::scadenze_recalc() real pagato = hh.get(DOC_IMPPAGATO); const bool saldo = hh.get_bool(DOC_ACCSALDO); real totimponibili = totale_doc() - totimposte - totspese;//tot_documento() - totimposte - totspese; - const bool valuta = in_valuta(); + const bool is_in_valuta = in_valuta(); if (saldo || pagato > totale_doc()) { @@ -190,7 +197,7 @@ void TDocumentoEsteso::scadenze_recalc() } else { - TGeneric_distrib d(pagato, valuta ? 3 : 0); + TGeneric_distrib d(pagato, is_in_valuta ? 3 : 0); d.add(totimponibili); d.add(totimposte); @@ -201,23 +208,23 @@ void TDocumentoEsteso::scadenze_recalc() totspese -= d.get(); } - if (valuta) + if (is_in_valuta) { const real change(cambio()); TCurrency_documento val1(totimponibili, *this); val1.change_to_firm_val(); TCurrency_documento val2(totimposte, *this); val2.change_to_firm_val(); TCurrency_documento val3(totspese, *this); val3.change_to_firm_val(); - TString16 codval = this->valuta(); - pag.set_total_valuta( totimponibili, totimposte, totspese, change, val1.get_num(), val2.get_num() ,val3.get_num(), codval); + TString16 codval = valuta(); + pag.set_total_valuta(totimponibili, totimposte, totspese, change, val1.get_num(), val2.get_num() ,val3.get_num(), codval); } else - pag.set_total( totimponibili, totimposte, totspese ); - pag.set_rate_auto(); + pag.set_total(totimponibili, totimposte, totspese); + pag.set_rate_auto(); const int numrate = pag.n_rate( ); real rata; for (int i = 0; i< numrate; i++) { - rata = pag.importo_rata(i, valuta); + rata = pag.importo_rata(i, is_in_valuta); TToken_string t; t.add(pag.data_rata(i)); t.add(rata.string()); diff --git a/ve/velib06.cpp b/ve/velib06.cpp index 2b1a7d070..295f6e7c5 100755 --- a/ve/velib06.cpp +++ b/ve/velib06.cpp @@ -11,6 +11,7 @@ #include "vepriv.h" #include "verig.h" +#include "ve0100.h" #include "ve0100b1.h" #include "ve0100o.h" #include "veuml.h" @@ -120,8 +121,12 @@ TDocumento_mask::TDocumento_mask(const char* td) const bool gesval = cfg.get_bool("GESVAL"); const bool gescambi = cfg.get_bool("GESVALAC"); + if (gesval) { + const bool enable_controeuro = cfg.get_bool("CONTROEURO"); + + enable(F_CONTROEURO, enable_controeuro); show(F_CODVAL, !gescambi); show(F_DATACAMBIO, !gescambi); show(F_NOMEVAL, !gescambi); @@ -134,6 +139,7 @@ TDocumento_mask::TDocumento_mask(const char* td) { disable(F_CODVAL); disable(F_DATACAMBIO); + disable(F_CONTROEURO); disable(F_NOMEVAL); hide(F_CODVAL1); hide(F_DATACAMBIO1); @@ -296,6 +302,29 @@ TCond_vendita& TDocumento_mask::condv() const return *_condv; } +void TDocumento_mask::update_progs() +{ + TWait_cursor hourglass; + + for (int f = id2pos(BASE_PIEDE + 1)-1; f >= 0; f--) + { + const TMask_field& mf = fld(f); + const TFieldref* fr = mf.field(); + if (fr) + _doc.put(fr->name(), mf.get()); + } + + _doc.set_riga_esenzione(); + + for (int i = _last_prog; i > 0; i--) + { + const short id = BASE_PIEDE + i; + const TString& name = field(id).field()->name(); + const TString& val = _doc.get(name); + set(id, val, TRUE); + } +} + void TDocumento_mask::next_page(int p) { const bool was_normal_page = curr_page() < _progs_page; @@ -303,27 +332,14 @@ void TDocumento_mask::next_page(int p) const bool is_calculated_page = curr_page() >= _progs_page; if (was_normal_page && is_calculated_page) - { - TWait_cursor hourglass; + update_progs(); +} - for (int f = id2pos(BASE_PIEDE + 1)-1; f >= 0; f--) - { - const TMask_field& mf = fld(f); - const TFieldref* fr = mf.field(); - if (fr) - _doc.put(fr->name(), mf.get()); - } - - _doc.set_riga_esenzione(); - - for (int i = _last_prog; i > 0; i--) - { - const short id = BASE_PIEDE + i; - const TString& name = field(id).field()->name(); - const TString& val = _doc.get(name); - set(id, val); - } - } +bool TDocumento_mask::stop_run(KEY key) +{ + if (key != K_ESC && key != K_QUIT) + update_progs(); + return TVariable_mask::stop_run(key); } bool TDocumento_mask::on_key(KEY key) @@ -344,6 +360,7 @@ bool TDocumento_mask::on_key(KEY key) (const char*)user()); return TRUE; } + return TVariable_mask::on_key(key); } @@ -884,7 +901,7 @@ bool TDocumento_mask::ss_handler(TMask_field& f, KEY key) if (key == K_ENTER && f.mask().insert_mode()) { TSheet_field& ss = (TSheet_field&)f; - if (ss.items() == 0) + if (!app().is_transaction() && ss.items() == 0) ok = yesno_box("Il documento e' privo di righe:\n" "Si desidera continuare ugualmente?"); } @@ -1232,7 +1249,7 @@ bool TElabora_mask::elabora() { if (out[0] != d) out.rewrite(); - if (in[0] != app_doc) + if (app_doc != in[0]) { in.rewrite(); app_doc = in[0]; @@ -1252,7 +1269,7 @@ bool TElabora_mask::elabora() app_doc = out[0]; update_mask = TRUE; } - if (in[0] != d) + if (d != in[0]) in.rewrite(); } } @@ -1321,6 +1338,9 @@ void TElabora_mask::update_ndoc_filter(bool is_tipo_elaborazione) const TString16 tipo(get(F_TIPODOC_ELAB)); TElaborazione * e = curr_elab(); const bool to_elab = get_bool(F_TYPE); + + if (!field(F_CODNUM_ELAB).empty()) + filter << format("&&(CODNUM==\"%s\")", (const char*)get(F_CODNUM_ELAB)); enable(-1, to_elab /*&& e != NULL*/); @@ -1475,7 +1495,7 @@ bool TElabora_mask::tipo_documento_handler( TMask_field& f, KEY key ) } bool TElabora_mask::codnum_handler( TMask_field& f, KEY key ) -{ +{ if (key != K_ENTER && f.to_check(key, TRUE)) { TElabora_mask & m = (TElabora_mask &) f.mask(); @@ -1510,27 +1530,35 @@ bool TElabora_mask::docrif_handler( TMask_field& f, KEY key ) if (key == K_F9) { TElabora_mask& m = (TElabora_mask&)f.mask(); - TDocumento_mask& mm = *m._main; TRectype filtrec(LF_DOC); filtrec.put(DOC_TIPOCF, m.get(F_TIPOCF_ELAB)); filtrec.put(DOC_CODCF, m.get(F_CODCF_ELAB)); - filtrec.put(DOC_PROVV, mm.get(F_PROVV)); + filtrec.put(DOC_PROVV, m.get(F_PROVV_ELAB)); filtrec.put(DOC_ANNO, m.get(F_ANNO_ELAB)); TRelation rel(LF_DOC); rel.add(LF_CLIFO, "TIPOCF==TIPOCF|CODCF==CODCF"); TSorted_cursor cur(&rel, "TIPOCF|CODCF|PROVV|ANNO|CODNUM|NUMDOCRIF", "", 2, &filtrec, &filtrec); - TString80 f; f.format("CODNUM==\"%s\"", (const char *)m.get(F_CODNUM)); - - cur.setfilter(f); - TToken_string fields = "TIPOCF|CODCF|ANNO|CODNUM|NUMDOCRIF|DATADOCRIF|DOC1|DOC2|DOC3|NDOC|20->RAGSOC"; - TCursor_sheet sheet(&cur, fields, + TString80 flt; + if (!m.field(F_CODNUM_ELAB).empty()) + flt << format("(CODNUM==\"%s\")&&", (const char*)m.get(F_CODNUM_ELAB)); + if (!m.field(F_TIPODOC_ELAB).empty()) + flt << format("(TIPODOC==\"%s\")&&", (const char*)m.get(F_TIPODOC_ELAB)); + flt << "(STATO==\"" << m.get(F_STATODOC_ELAB) << "\")"; + if (!f.empty()) + flt << "&&(NUMDOCRIF==\"" << f.get() << "\")"; + cur.setfilter(flt); + TToken_string fields = "ANNO|CODNUM|TIPODOC|NUMDOCRIF|DATADOCRIF|DOC1|DOC2|DOC3|NDOC|20->RAGSOC"; + TCursor_sheet sheet(&cur, fields, "Documento di riferimento", - "Tipo|Codice|Anno|Numeraz|Docum.Rif.|Data@10|Docum.Rif. 1|Docum.Rif. 2|Docum.Rif. 3|Documento|Ragione Sociale@50", + "Anno|Num.|Tipo|Docum.Rif.|Data@10|Docum.Rif.1|Docum.Rif.2|Docum.Rif.3|Documento|Ragione Sociale@50", 0, 1); if (sheet.run() == K_ENTER) { + const int nrifpos = fields.get_pos("NUMDOCRIF"); + const TString16 nrif = sheet.row(-1).get(nrifpos); + f.set(nrif); const int ndocpos = fields.get_pos("NDOC"); const TString16 ndoc = sheet.row(-1).get(ndocpos); m.set(F_NDOC_ELAB, ndoc); @@ -1564,6 +1592,7 @@ bool TDocumento_mask::elabora_handler( TMask_field& f, KEY key ) if (key == K_SPACE) { TDocumento_mask& m = (TDocumento_mask&)f.mask(); + m.update_progs(); if (m.check_fields()) // Check values { TElabora_mask* selection = new TElabora_mask(&m); // No woman no stack @@ -1608,7 +1637,7 @@ bool TDocumento_mask::elabora_handler( TMask_field& f, KEY key ) bool TDocumento_mask::print_handler( TMask_field& f, KEY key ) { - if (key == K_SPACE) + if (key == K_SPACE) main_app().print(); return TRUE; } @@ -1624,6 +1653,9 @@ void TDocumento_mask::user_set_handler(int fieldid, int index) set_handler( fieldid, totdoc_hndl ); break; case 3: + set_handler( fieldid, numdocrif_hndl ); + break; + case 4: set_handler( fieldid, dummy_hndl ); break; default: @@ -1645,8 +1677,11 @@ bool TDocumento_mask::num_handler( TMask_field& f, KEY key ) TCodice_numerazione cod_num(tabnum.curr()); m.set( F_DESNUM, cod_num.descrizione()); // Propone il primo tipo di documento come default - m.set( F_TIPODOC, cod_num.tipo_doc(0)); - m.send_key( K_TAB, F_TIPODOC ); + if (m.field(F_TIPODOC).empty() || f.focusdirty()) + { + m.set( F_TIPODOC, cod_num.tipo_doc(0)); + m.send_key( K_TAB, F_TIPODOC ); + } // Se per questa numerazione e' abilitata le numerazione provvisoria if (cod_num.num_provv()) { diff --git a/ve/velib06a.cpp b/ve/velib06a.cpp index 791f5c237..1848444f8 100755 --- a/ve/velib06a.cpp +++ b/ve/velib06a.cpp @@ -42,6 +42,43 @@ #define MAX_VIS_RATE 5 +bool numdocrif_hndl( TMask_field& field, KEY key ) + +{ + if (key == K_ENTER) + { + TDocumento_mask & m = (TDocumento_mask &) field.mask(); + const TString16 ndocrif(field.get()); + + TRectype filtrec(LF_DOC); + filtrec.put(DOC_TIPOCF, m.get(F_TIPOCF)); + filtrec.put(DOC_CODCF, m.get(F_CODCF)); + filtrec.put(DOC_PROVV, m.get(F_PROVV)); + filtrec.put(DOC_ANNO, m.get(F_ANNO)); + + TRelation rel(LF_DOC); +// rel.add(LF_CLIFO, "TIPOCF==TIPOCF|CODCF==CODCF"); + TSorted_cursor cur(&rel, "TIPOCF|CODCF|PROVV|ANNO|CODNUM|NUMDOCRIF", "", 2, &filtrec, &filtrec); + TString80 f; f.format("CODNUM==\"%s\"", (const char *)m.get(F_CODNUM)); + + cur.setfilter(f); + + filtrec.put(DOC_CODNUM, m.get(F_CODNUM)); + filtrec.put(DOC_NUMDOCRIF, ndocrif); + cur.curr() = filtrec; + cur.read(_isequal); + + if (cur.file().status() == NOERR) + { + const long numdoc = m.get_long(F_NDOC); + if (numdoc != cur.curr().get_long(DOC_NDOC)) + return yesno_box("il nunero di rifermento %s é giá stati utilizzato\n devo registrare ugualmente", + (const char *)ndocrif); + } + } + return TRUE; +} + bool totdoc_hndl( TMask_field& field, KEY key ) { @@ -62,6 +99,7 @@ bool totdoc_hndl( TMask_field& field, KEY key ) } return TRUE; } + bool ora_hndl( TMask_field& field, KEY key ) { @@ -294,7 +332,7 @@ bool iva_handler( TMask_field& f, KEY key ) } } return TRUE; -} +} bool codmag_handler( TMask_field& f, KEY key ) { @@ -980,7 +1018,10 @@ bool sppr_handler( TMask_field& f, KEY key ) if (pos >= 0) { TMask & mask = row_mask.get_sheet()->mask(); - TSpesa_prest sp; + TEdit_field & e = (TEdit_field &) f; + TRelation * r = e.browse()->cursor()->relation(); + TString16 cod = r->curr().get("COD"); + TSpesa_prest sp(NULL, cod == "SPP" ? 'S' : 'P'); if (sp.read(row_mask.get(FR_CODART)) == NOERR) { const char tipo = sp.tipo(); diff --git a/ve/velib06c.cpp b/ve/velib06c.cpp new file mode 100755 index 000000000..e28dedcb0 --- /dev/null +++ b/ve/velib06c.cpp @@ -0,0 +1,1812 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include "velib.h" +#include "vepriv.h" +#include "verig.h" + +#include "ve0100.h" +#include "ve0100b1.h" +#include "ve0100o.h" +#include "veuml.h" +#include "veuml1.h" +#include "veini.h" + +#include "sconti.h" + +TDocumento_mask::TDocumento_mask(const char* td) + : TVariable_mask(), _progs_page(-1), _last_prog(-1), + _condv(NULL) +{ + CHECK(strlen(td) <= 4, "TDocumento_mask(TipoDocumento) not (MaskName)"); + + { + TMagazzini m; + + _ges_mag = m.gestmag(); + _ges_dep = m.gestdep(); + _std_mag = m.standardmag(); + _std_dep = m.standarddep(); + } + _doc.set_tipo(td); + const TString mname = _doc.tipo().mask_name(); + read_mask(mname, 0, MAX_PAGES); + + int pos = id2pos(BASE_PIEDE + 1); + if (pos >= 0) + { + _progs_page = find_parent_page(fld(pos)); + _last_prog = 0; + while (id2pos(BASE_PIEDE + _last_prog + 1) >= 0) + _last_prog++; + } + + _sheet = &sfield(F_SHEET); + _sheet->set_handler( ss_handler ); + _sheet->set_notify( ss_notify ); + _sheet->set_append(FALSE); + + TList_field& listbox = ( TList_field& )field( F_LBTIPORIGA ); + + TTipo_documento& tdoc = (TTipo_documento&)_doc.tipo(); + TToken_string& keys = (TToken_string&) tdoc.keys_descrs()[0]; + TToken_string& descrs = (TToken_string&) tdoc.keys_descrs()[1]; + listbox.replace_items(keys, descrs); + + configura_sheet(*_sheet); + + ((TVariable_sheet_field*)_sheet)->set_getmask( ss_getmask ); + if (_doc.tipo().clifo_optional()) + { + field(F_CODCF).check_type(CHECK_NORMAL); + field(F_RAGSOC).check_type(CHECK_NORMAL); + } + + set_handler( F_OCCASEDIT, occas_handler ); + set_handler( F_CODCF, clifo_handler ); + set_handler( F_CODPAG, condpag_hndl ); + set_handler( F_DATAINSC, condpag_hndl ); + set_handler( F_CODNOTE, note_hndl ); + set_handler( F_DATADOC, data_hndl ); + set_handler( F_CODLIST, codlist_handler ); + set_handler( F_CODLIST1, codlist_handler ); + set_handler( F_CODCONT, codcont_handler ); + set_handler( F_CODCONT1, codcont_handler ); + set_handler( F_CODCAMP, codcamp_handler ); + set_handler( F_CODVAL, codval_handler ); + set_handler( F_CODVAL1, codval_handler ); + set_handler( F_NUMDOCRIF, datadocrif_handler); + set_handler( F_DATADOCRIF, datadocrif_handler); + set_handler( DLG_ELABORA, elabora_handler ); + set_handler( DLG_PRINT, print_handler ); + + const TString_array& handlers = tdoc.handlers(); + int numhandler = handlers.items(); + + for (int i = 0; i < numhandler; i ++ ) + { + TToken_string& riga = (TToken_string&) handlers[i]; + user_set_handler( riga.get_int( 0 ), riga.get_int( 1 ) ); + } + + _livelli_giac = new TCodgiac_livelli; + + for (i = 4; i > 0; i--) + { + const short pos = _sheet->cid2index(FR_LIV1 + i -1); + if (_livelli_giac->enabled(i)) + { + const TString & header = _livelli_giac->name(i); + const int len = header.len() + 1; + const int f_len = _livelli_giac->code_length(i); + _sheet->set_column_header(pos, header); + _sheet->set_column_width(pos, (len > f_len ? len : f_len) * 8); + } + else + { + _sheet->sheet_mask().hide(FR_LIV1 + i -1); + _sheet->delete_column(pos); + } + } + +// configurazione campi + + TConfig cfg(CONFIG_DITTA, "ve"); + const bool gesval = cfg.get_bool("GESVAL"); + const bool gescambi = cfg.get_bool("GESVALAC"); + + if (gesval) + { + show(F_CODVAL, !gescambi); + show(F_DATACAMBIO, !gescambi); + show(F_NOMEVAL, !gescambi); + show(F_CODVAL1, gescambi); + show(F_DATACAMBIO1, gescambi); + show(F_NOMEVAL1, gescambi); + show(F_CAMBIO); + } + else + { + disable(F_CODVAL); + disable(F_DATACAMBIO); + disable(F_NOMEVAL); + hide(F_CODVAL1); + hide(F_DATACAMBIO1); + hide(F_NOMEVAL1); + disable(F_CAMBIO); + } + + const bool geslin = cfg.get_bool("GESLIN"); + + enable(F_CODLIN, geslin); + enable(F_DESLIN, geslin); + + const bool geslis = cfg.get_bool("GES", "ve", 1); + const bool gesliscatven = cfg.get_bool("GESLISCV"); + + if (geslis) + { + show(F_CODLIST, !gesliscatven); + show(F_CODLIST1, gesliscatven); + } + else + { + disable(F_CODLIST); + hide(F_CODLIST1); + } + + const bool gescontr = cfg.get_bool("GES", "ve", 2); + const bool gescontrcli = cfg.get_bool("GESCONCC"); + + if (gescontr) + { + show(F_CODCONT1, gescontrcli); + show(F_CODCONT, !gescontrcli); + } + else + { + disable(F_CODCONT); + hide(F_CODCONT1); + } + + const bool gesoff = cfg.get_bool("GES", "ve", 3); + enable(F_CODCAMP, gesoff); + + const bool gessco = cfg.get_char("GESSCO") != 'N'; + enable(F_SCONTOPERC, gessco); + + const bool gesage = cfg.get_bool("GESAGE"); + enable(F_CODAG, gesage); + enable(F_DESAG, gesage); + enable(F_CODAGVIS, gesage); + enable(F_DESAGVIS, gesage); + + const bool has_movmag = dongle().active(MGAUT) && _doc.tipo().mov_mag(); + pos = id2pos(F_CAUSMAG); + if (pos >= 0) + fld(pos).show(has_movmag); + pos = id2pos(F_DESCRMAG); + if (pos >= 0) + fld(pos).show(has_movmag); + pos = id2pos(F_CAUSMAGC); + if (pos >= 0) + fld(pos).show(has_movmag); + pos = id2pos(F_DESCRMAGC); + if (pos >= 0) + fld(pos).show(has_movmag); + pos = id2pos(F_CURGIAC); + if (pos >= 0) + fld(pos).show(has_movmag); + pos = id2pos(F_CURDISP); + if (pos >= 0) + fld(pos).show(has_movmag); +} + +TDocumento_mask::~TDocumento_mask() +{ + if (_condv) + delete _condv; + if (_livelli_giac) + delete _livelli_giac; +} + +void TDocumento_mask::configura_sheet(TSheet_field& sheet) +{ + TBit_array to_delete(MAX_COLUMNS); + to_delete.set(); + TTipo_documento& tdoc = (TTipo_documento&) _doc.tipo(); + const TString_array& sheet_columns = tdoc.sheet_columns(); + int ncols = sheet_columns.items(); + + TToken_string colonne; + colonne = "0"; + + for (int i = 0; i < ncols; i ++ ) + { + TToken_string& sheet_col = (TToken_string&) sheet_columns[i]; + const int field_id = sheet_col.get_int(0); + const int coltomove = sheet.cid2index(field_id); + to_delete.reset(coltomove); + + const TString80 descr(sheet_col.get(1)); + if (descr.not_empty() ) + sheet.set_column_header( field_id, descr); + + const int size = sheet_col.get_int(2); + if (size != 0) + sheet.set_column_width( field_id, size); + + if (field_id != FR_LORDO || tdoc.calcolo_lordo()) + colonne.add(field_id); + if (size != 0) + colonne << ',' << size; + } + + if (tdoc.calcolo_lordo()) + to_delete.reset(0L); + else + to_delete.set(0L); + to_delete.reset(1); + + + if (!to_delete[sheet.cid2index(FR_CODDEP)]) + sheet.enable_column(FR_CODDEP, _ges_dep && _ges_mag); + if (!to_delete[sheet.cid2index(FR_CODMAG)]) + sheet.enable_column(FR_CODMAG, _ges_mag); + if (!to_delete[sheet.cid2index(FR_CODDEPC)]) + sheet.enable_column(FR_CODDEPC, _ges_dep && _ges_mag); + if (!to_delete[sheet.cid2index(FR_CODMAGC)]) + sheet.enable_column(FR_CODMAGC, _ges_mag); + to_delete.set(sheet.cid2index(FR_CODARTMAG)); + to_delete.set(sheet.cid2index(FR_CHECKED)); + +/* + const int sconto_col = sheet.cid2index(FR_SCONTO); + if (to_delete[sconto_col] == FALSE) + { + const bool del = tdoc.sconto_riga() == "N"; + to_delete.set(sconto_col, del); + } +*/ + + for ( i = MAX_COLUMNS - 1; i >= 0; i-- ) + if( to_delete[i] ) + { + sheet.enable_column( i + FIRST_FIELD, FALSE); + sheet.delete_column( i + FIRST_FIELD); + } + + if (!sheet.user_saved_columns_order()) + sheet.set_columns_order(&colonne); +} + + +TCond_vendita& TDocumento_mask::condv() const +{ + if (_condv == NULL) + { + TDocumento_mask* myself = (TDocumento_mask*)this; + myself->_condv = new TCond_vendita(myself, NULL); + } + return *_condv; +} + +void TDocumento_mask::update_progs() +{ + TWait_cursor hourglass; + + for (int f = id2pos(BASE_PIEDE + 1)-1; f >= 0; f--) + { + const TMask_field& mf = fld(f); + const TFieldref* fr = mf.field(); + if (fr) + _doc.put(fr->name(), mf.get()); + } + + _doc.set_riga_esenzione(); + + for (int i = _last_prog; i > 0; i--) + { + const short id = BASE_PIEDE + i; + const TString& name = field(id).field()->name(); + const TString& val = _doc.get(name); + set(id, val, TRUE); + } +} + +void TDocumento_mask::next_page(int p) +{ + const bool was_normal_page = curr_page() < _progs_page; + TMask::next_page(p); + const bool is_calculated_page = curr_page() >= _progs_page; + + if (was_normal_page && is_calculated_page) + update_progs(); +} + +bool TDocumento_mask::stop_run(KEY key) +{ + if (key != K_ESC && key != K_QUIT) + update_progs(); + return TVariable_mask::stop_run(key); +} + +bool TDocumento_mask::on_key(KEY key) +{ + if (key == K_SHIFT + K_F12) + { + TRelation r(LF_DOC); + r.curr()=doc(); + if (!doc().bloccato() && ::user_can_write(&r)) + { + TMask_field& stato = field(F_STATO); + stato.enable(); + enable(DLG_SAVEREC); + enable(DLG_DELREC); + } + else + warning_box("L'utente %s non puo' modificare questo documento", + (const char*)user()); + return TRUE; + } + + return TVariable_mask::on_key(key); +} + +void TDocumento_mask::occ2mask() +{ + const TOccasionale& o = doc().occas(); + + reset(F_COFI); + reset(F_PAIVA); + set(F_OCFPI, o.get(OCC_CFPI)); + const TString & ragsoc = o.get(OCC_RAGSOC); + set(F_RAGSOC, ragsoc); + set(F_RAGSOCSP, ragsoc); + const TString & indir = o.get(OCC_INDIR); + set(F_INDCF, indir); + set(F_INDSP, indir); + const TString & civ = o.get(OCC_CIV); + set(F_CIVCF, civ); + set(F_CIVSP, civ); + const TString & cap = o.get(OCC_CAP); + set(F_CAPCF, cap); + set(F_CAPSP, cap); + const TString & com = o.get(OCC_COM); + set(F_COMCF, com); + set( F_COMSP, com); + const TString & stato = o.get(OCC_STATO); + set(F_STATOCF, stato); + set( F_STATOSP, stato); + if (id2pos(F_CODINDSP) >= 0) + reset(F_CODINDSP); + // Sugli occasionali non c'è la località + const TString & localita = o.get(OCC_LOCALITA); + set(F_LOCALITACF, localita); + set(F_LOCALITASP, localita); + check_field(F_COMSP); + check_field(F_STATOSP); +} + +void TDocumento_mask::cli2mask() +{ + TCli_for & c = doc().clifor(); + TOccasionale & o = doc().occas(); + + const bool onload = !is_running(); + const TString16 codval(get(F_CODVAL)); + const TString16 datacambio(get(F_DATACAMBIO1)); + + // Setta i campi che appartengono al file LF_CLIFO + const bool occas = c.occasionale(); + + show(F_OCCASEDIT, occas); + if (!occas) + reset(F_OCFPI); + show(F_OCFPI, occas); + // In forse per l'Occasionale, sicuri per il Normale + show(F_COFI, !occas); + show(F_STATOPAIVA, !occas); + show(F_PAIVA, !occas); + set(F_RAGSOC, c.get(CLI_RAGSOC)); + enable(F_RAGSOC, !occas); + + const TRectype & ven_rec = c.vendite(); + + if(!onload) + { + short pos = id2pos(F_CODVAL); + const TString & codval = c.get(CLI_CODVAL); + + if (pos >= 0) + fld(pos).set(codval); + pos = id2pos(F_CODVAL1); + if (pos >= 0) + fld(pos).set(codval); + pos = id2pos(F_CODLIN); + if (pos >= 0 && fld(pos).active()) + fld(pos).set(c.get(CLI_CODLIN)); + set(F_CODPAG, c.get(CLI_CODPAG)); + set(F_CODABIA, c.get(CLI_CODABI)); + set(F_CODCABA, c.get(CLI_CODCAB)); + // Setta i campi che appartengono al file LF_CFVEN + set(F_CODABIP, ven_rec.get(CFV_CODABIPR)); + set(F_CODCABP, ven_rec.get(CFV_CODCABPR)); + set(F_RAGGR, ven_rec.get(CFV_RAGGDOC)); + set(F_RAGGREFF, ven_rec.get(CFV_RAGGEFF)); + set(F_CODINDSP, ven_rec.get(CFV_CODINDSP)); + set(F_CODAG, ven_rec.get(CFV_CODAG)); + set(F_CODSPMEZZO, ven_rec.get(CFV_CODSPMEZZO)); + set(F_CODPORTO, ven_rec.get(CFV_CODPORTO)); + set(F_CODNOTESP1, ven_rec.get(CFV_CODNOTESP1)); + set(F_CODNOTESP2, ven_rec.get(CFV_CODNOTESP2)); + set(F_CODNOTE, ven_rec.get(CFV_CODNOTE)); + set(F_CODVETT1, ven_rec.get(CFV_CODVETT1)); + set(F_CODVETT2, ven_rec.get(CFV_CODVETT2)); + set(F_CODVETT3, ven_rec.get(CFV_CODVETT3)); + set(F_SPESEINC, ven_rec.get(CFV_PERCSPINC)); + set(F_ADDBOLLI, ven_rec.get(CFV_ADDBOLLI)); + set(F_CATVEN, ven_rec.get(CFV_CATVEN)); + pos = id2pos(F_CODLIST); + const TString & codlist = ven_rec.get(CFV_CODLIST); + if (pos >= 0 && fld(pos).active()) + { + TEdit_field & f = (TEdit_field&) fld(pos); + + f.set(codlist); + f.check(); + f.on_hit(); + } + pos = id2pos(F_CODLIST1); + if (pos >= 0 && fld(pos).active()) + { + TEdit_field & f = (TEdit_field&) fld(pos); + + f.set(codlist); + f.check(); + f.on_hit(); + } + pos = id2pos(F_CODAG); + if (pos >= 0 && fld(pos).active()) + fld(pos).set(ven_rec.get(CFV_CODAG)); + set(F_CODZON, ven_rec.get(CFV_CODZONA)); + set(F_RAGGR, ven_rec.get(CFV_RAGGDOC)); + sconto_testa2mask(); + spese2mask(); + } + enable( F_CODINDSP , !occas); + if (occas) + occ2mask(); + else + { + set(F_COFI, c.get(CLI_COFI)); + set(F_INDCF, c.get(CLI_INDCF)); + set(F_CIVCF, c.get(CLI_CIVCF)); + set(F_STATOPAIVA, c.get(CLI_STATOPAIV)); + set(F_PAIVA, c.get(CLI_PAIV)); + set(F_LOCALITACF, c.get(CLI_LOCCF)); + set(F_CAPCF, c.get(CLI_CAPCF)); + set(F_COMCF, c.get(CLI_COMCF)); + set(F_STATOCF, c.get(CLI_STATOCF)); + check_field( F_CODINDSP ); + } + const TString16 newcodval(get(F_CODVAL)); + const TString16 newdatacambio(get(F_DATACAMBIO1)); + + short pos = id2pos(F_CAMBIO); + if ((pos >= 0) && newcodval.empty()) + fld(pos).reset(); + pos = id2pos(F_CODVAL); + if (pos >= 0 && fld(pos).active()) + fld(pos).check(STARTING_CHECK); + pos = id2pos(F_CODVAL1); + if (pos >= 0 && fld(pos).active()) + fld(pos).check(STARTING_CHECK); + pos = id2pos(F_DATACAMBIO1); + if (pos >= 0 && fld(pos).active() && + (codval != newcodval || datacambio != newdatacambio)) + fld(pos).check(); + check_field(F_COMCF); + check_field(F_STATOCF); + check_field( F_CODPAG ); + pos = id2pos(F_CODLIN); + if (pos >= 0 && fld(pos).active()) + fld(pos).check(); + check_field( F_CODCABA ); + pos = id2pos(F_CODLIST); + if (pos >= 0 && fld(pos).active()) + fld(pos).check(); + pos = id2pos(F_CODLIST1); + if (pos >= 0 && fld(pos).active()) + fld(pos).check(); + check_field( F_CODCABP ); + pos = id2pos(F_CODAG); + if (pos >= 0 && fld(pos).active()) + fld(pos).check(); + check_field( F_CODSPMEZZO ); + check_field( F_CODPORTO ); + check_field( F_CODNOTESP1 ); + check_field( F_CODNOTESP2 ); + check_field( F_CODNOTE ); + check_field( F_CODVETT1 ); + check_field( F_CODVETT2 ); + check_field( F_CODVETT3 ); + check_field( F_CATVEN ); + check_field( F_CODZON ); + + const bool contr_enabled = ven_rec.get_bool(CFV_GESTCONTR); + bool gescontr = FALSE; + if (contr_enabled) + { + TConfig ditta(CONFIG_DITTA, "ve"); + gescontr = ditta.get_bool("GES", "ve", 2); + } + + enable(F_CODCONT1, contr_enabled && gescontr); + enable(F_CODCONT, contr_enabled && gescontr); +} + +void TDocumento_mask::sconto_testa2mask() +{ + TCli_for & c = doc().clifor(); + TConfig ditta(CONFIG_DITTA, "ve"); + const char tipogestione = ditta.get("GESSCO", "ve")[ 0 ]; + switch( tipogestione ) + { + case 'N': // Sconti non gestiti: pussa via! + break; + case 'P': // Percentuale su anagrafica cliente + set( F_SCONTOPERC, c.vendite().get(CFV_SCONTO)); + break; + case 'T': // Gestione tabella sconti + { + const TString16 codsconto(c.vendite().get(CFV_CODSCC)); + + if (codsconto.not_empty()) + { + TTable sconti("%SCC"); + sconti.setkey(1); + sconti.zero(); + sconti.put("CODTAB", codsconto); + if (sconti.read( ) == NOERR) + set(F_SCONTOPERC, sconti.get("S1")); + } + } + break; + case 'A': // Gestione archivio sconti + { + TString16 cod; + const TRectype & ven_rec = c.vendite(); + TLocalisamfile sconti(LF_SCONTI ); + + sconti.setkey(1); + sconti.zero(); + sconti.put("TIPO", "I"); + if(ditta.get_bool("SCOKEY", "ve", 1)) + sconti.put("CODCAT", ven_rec.get(CFV_CATVEN)); + if(ditta.get_bool("SCOKEY", "ve", 2)) + cod.format("%-2s", (const char *)ven_rec.get(CFV_CODSCC)); + else + cod = " "; + if( ditta.get_bool("SCOKEY", "ve", 3)) + cod << format("%-2s", (const char *)ven_rec.get(CFV_CODZONA)); + else + cod << " "; + if( ditta.get_bool("SCOKEY", "ve", 4)) + cod << c.get(CLI_CODPAG); + sconti.put("CODART", cod); + if(sconti.read() == NOERR) + set(F_SCONTOPERC, sconti.get( "SCONTO")); + } + break; + default: + break; + } + return; +} + +void TDocumento_mask::spese2mask() +{ + TSheet_field & sh = (TSheet_field &) field(F_SHEET); + TCli_for & c = doc().clifor(); + + TString16 name("CODSP0"); + TString_array spese; + TRectype & ven_rec = c.vendite(); + for (int i = 1; i <= 4; i++) + { + name.rtrim(1); name << i; + const TString16 s(ven_rec.get(name)); + + if (s.not_empty()) + spese.add(s); + } +// autosave(*_rel); + + doc().put("SPESEUPD", FALSE); + doc().put(DOC_CODVAL, get(F_CODVAL)); + doc().put(DOC_CAMBIO, get(F_CAMBIO)); + doc().put(DOC_CONTROEURO, get(F_CONTROEURO)); + + doc().update_spese_aut(spese, FALSE, &sh); + sh.force_update(); +} + +void TDocumento_mask::reset_masks(const TString& tipo_doc) +{ + static TString16 last_tipo_doc; + + if (tipo_doc != last_tipo_doc) + { + FOR_EACH_ASSOC_OBJECT(_maskriga, h, k, o) + { + TMask* m = (TMask*)o; + m->enable_default(); + if (!_sheet->exist_column(FR_PREZZO)) + m->hide(FR_PREZZO); + } + last_tipo_doc = tipo_doc; + } +} + +void TDocumento_mask::doc2mask(bool reload_clifo) +{ + for (int p = id2pos(BASE_PIEDE + 1)-1; p >= 0; p--) + { + TMask_field& f = fld(p); + const TFieldref* fr = f.field(); + if (fr) + f.set(fr->read(doc())); + } + + if (reload_clifo) + cli2mask(); + + TSheet_field& s = sfield(F_SHEET); + s.destroy( ); + + + const int righe = doc().physical_rows(); + for (int i = 0; i < righe; i++) + { + s.insert(-1, FALSE); + TToken_string& r = s.row(i); + doc()[i+1].autoload(s); + s.check_row(i, 0x2); + } + + reset_masks(get(F_TIPODOC)); + + s.force_update(); +} + +void TDocumento_mask::mask2doc() +{ + for (int p = fields()-1; p >= 0; p--) + { + TMask_field& f = fld(p); + const TFieldref* fr = f.field(); + if (fr) + fr->write(f.get(), doc()); + } +} + +TVariable_mask* TDocumento_mask::riga_mask(int numriga) +{ + const TRiga_documento& riga = doc()[numriga + 1]; + const TTipo_riga_documento& tiporiga = riga.tipo(); + const char* name = tiporiga.mask_name(); + + TVariable_mask* m = (TVariable_mask*)_maskriga.objptr(name); + if (m == NULL) + { + m = new TVariable_mask(name); + + _maskriga.add(name, m); + + TFilename proname(tiporiga.profile_name()); + proname.ext("ini"); + + TConfig pro( proname, "HANDLERS" ); + int numhandler = pro.get_int( "NHANDLER", "HANDLERS" ); + + for( int i = 1; i <= numhandler; i ++ ) + { + TString16 chiave; + chiave.format( "%d", i ); + TToken_string riga = pro.get( chiave, "HANDLERS" ); + row_set_handler( *m, riga.get_int( 0 ), riga.get_int( 1 ) ); + } + + m->set_handler( FR_QTA, qta_handler ); + m->set_handler( FR_UMQTA, um_handler ); + + const int pos = m->id2pos(FR_CODART); + if (pos >= 0) + { + const TMask_field & f = m->field(FR_CODART); + if (f.is_edit()) + { + TBrowse * browse = ((TEdit_field &) f).browse(); + const char tipo_r = tiporiga.tipo(); + + if (browse ) + { + const TCursor * cur = browse->cursor(); + if (cur) + { + const int num = cur->file().num(); + if (num == LF_ANAMAG || num == LF_CODCORR) + { + m->set_handler( FR_CODMAG, codmag_handler ); + m->set_handler( FR_CODMAGC, codmag_coll_handler ); + m->set_handler( FR_CODART, codart_handler ); + m->set_handler( FR_LIV1, liv_handler ); + m->set_handler( FR_LIV2, liv_handler ); + m->set_handler( FR_LIV3, liv_handler ); + m->set_handler( FR_LIV4, liv_handler ); + m->set_handler( FR_UMQTA, umart_handler ); + m->set_handler( FR_CODARTMAG, codartmag_handler ); + m->set_handler( FR_DESCR, descr_handler ); + m->set_handler( FR_QTA, qtaart_handler ); + if (livelli().autoinsert(1)) + m->field(FR_LIV1).check_type(CHECK_NONE); + if (livelli().autoinsert(2)) + m->field(FR_LIV2).check_type(CHECK_NONE); + if (livelli().autoinsert(3)) + m->field(FR_LIV3).check_type(CHECK_NONE); + if (livelli().autoinsert(4)) + m->field(FR_LIV4).check_type(CHECK_NONE); + } + else + if (tipo_r == RIGA_SPESEDOC || tipo_r == RIGA_PRESTAZIONI) + m->set_handler( FR_CODART, sppr_handler ); + } + } + } + } + m->set_handler(FR_QTAEVASA, qta_evasa_handler); + m->set_handler(FR_CAUS, causmag_handler); + + if (m->id2pos(FR_CODIVA) >= 0) + { + m->set_handler(FR_CODIVA, iva_handler); + const TString& tipiva = doc().tipo().tipi_iva_validi(); + if (tipiva.not_empty()) + { + TBrowse& browse = *(m->efield(FR_CODIVA)).browse(); + TString filter = browse.get_filter(); + + bool close_filter = FALSE; + if (filter.not_empty()) + { + filter.insert("("); + filter << ")&&("; + close_filter = TRUE; + } + bool firstor = TRUE; + for (int i = tipiva.len()-1; i >= 0; i--) if (tipiva[i] != ' ') + { + if (firstor) + firstor = FALSE; + else + filter << "||"; + filter << "(S1==\""; + switch(i) + { + case 1: filter << "VE"; break; + case 2: filter << "ES"; break; + case 3: filter << "NI"; break; + case 4: filter << "NS"; break; + default: break; + } + filter << "\")"; + } + if (close_filter) filter << ')'; + browse.set_filter(filter); + } + } + } + + m->set_sheet((TSheet_field *)&(field(F_SHEET))); + + int pos = m->id2pos(FR_PREZZO); + if (pos >= 0) + { + TEditable_field & f =((TEditable_field &) m->fld(pos)); + f.reset_driver(F_CODVAL); + f.add_driver(-F_CODVAL); + } + + pos = m->id2pos(FR_IMPFISSO); + if (pos >= 0) + { + TEditable_field & f =((TEditable_field &) m->fld(pos)); + f.reset_driver(); + f.add_driver(-F_CODVAL); + } + + return m; +} + +void TDocumento_mask::update_giacenza() +{ + if (id2pos(F_CURGIAC)<0) + return; + + TSheet_field& sf = sfield(F_SHEET); + TToken_string& row = sf.row(sf.selected()); + const TString codart = row.get(sf.cid2index(FR_CODARTMAG)); + + real giac, disp; + if (codart.not_empty()) + { + const TString& annoes = get(F_ANNO); + TString16 codmag = row.get(sf.cid2index(FR_CODMAG)); + const TString16 coddep = row.get(sf.cid2index(FR_CODDEP)); + if (!coddep.blank()) + codmag << coddep; + + TString16 livello; + for (int i = 0; i < 4; i++) + { + const char* liv = row.get(sf.cid2index(FR_LIV1+i)); + if (*liv > ' ') + livello << liv; + else + break; + } + + TArticolo_giacenza art(codart); + giac = art.disponibilita(annoes, codmag, livello, TRUE); + disp = art.disponibilita(annoes, codmag, livello, FALSE); + + TLocalisamfile umart(LF_UMART); + umart.setkey(2); + umart.put(UMART_CODART, codart); + umart.put(UMART_UM, row.get(sf.cid2index(FR_UMQTA))); + if (umart.read() == NOERR) + { + real curr_fc = umart.get_real(UMART_FC); + if (curr_fc > ZERO) + { + giac /= curr_fc; + disp /= curr_fc; + } + } + } + + set(F_CURGIAC, giac.string()); + set(F_CURDISP, disp.string()); +} + +/////////////////////////////////////////////////////////// +// Handlers and notifiers +/////////////////////////////////////////////////////////// + +bool TDocumento_mask::ss_handler(TMask_field& f, KEY key) +{ + bool ok = TRUE; + if (key == K_ENTER && f.mask().insert_mode()) + { + + TSheet_field& ss = (TSheet_field&)f; + if (!app().is_transaction() && ss.items() == 0) + ok = yesno_box("Il documento e' privo di righe:\n" + "Si desidera continuare ugualmente?"); + } + return ok; +} + +bool TDocumento_mask::ss_notify( TSheet_field& ss, int r, KEY key ) +{ + TDocumento_mask& m = (TDocumento_mask&)ss.mask(); + TDocumento& doc = m.doc(); + + if ( key == K_ENTER ) // modifica + { + TRiga_documento & riga = doc[r + 1]; + riga.autosave(ss); + } + else + if ( key == K_DEL ) // Cancellazione + { + doc.destroy_row(r + 1, TRUE); + if (r < doc.rows()) + { + TRiga_documento & riga = doc[r + 1]; + if (riga.is_omaggio() && riga.is_generata()) + { + ss.destroy(r + 1); + doc.destroy_row(r + 1, TRUE); + } + } + } + else + if (key == K_INS) // Inserimento + { + if (r < doc.rows()) + { + TRiga_documento & riga = doc[r + 1]; + if (riga.is_omaggio() && riga.is_generata()) + return FALSE; + } + doc.insert_row(r + 1, m.get( F_LBTIPORIGA )); + } + else + if (key == K_CTRL + K_INS) + { + TRiga_documento & riga = doc[r + 1]; + TRectype & ven_rec = doc.clifor().vendite(); + TString16 s(ven_rec.get(CFV_CODMAG)); + if (s.not_empty()) + { + s.left_just(3); + s << ven_rec.get(CFV_CODDEP); + } + else + { + s = m.get(F_CAUSMAG); + if (!s.blank()) + { + const TRectype & c=cache().get("%CAU", s); + if (!c.empty() && !c.get("S10").blank()) + s = c.get("S10"); + else + { + s = m._std_mag; + s.left_just(3); + s << m._std_dep; + } + } + } + riga.put("CODMAG", s); + riga.autoload(ss); + ss.check_row(r); + // ss.select(r, 1); // Ma serve a qualcosa? + } + else + if ( key == K_TAB ) // ingresso nella riga + { + set_curr_um(ss.sheet_mask()); + m.update_giacenza(); + } + + return TRUE; +} + +// Funzione che dato il profilo di riga ottiene la maschera +// Serve per ottenere una maschera diversa per ogni riga +TMask* TDocumento_mask::ss_getmask(int numriga, TMask& fullmask) +{ + TSheet_field* sf = fullmask.get_sheet(); + TDocumento_mask& m = (TDocumento_mask&)sf->mask(); + const TDocumento& doc = m.doc(); + + if (numriga < doc.physical_rows()) + return m.riga_mask(numriga); + else + return &fullmask; +} + +bool TDocumento_mask::occas_code_handler(TMask_field& f, KEY key) +{ + if (key == K_TAB && f.focusdirty()) + { + const char* code = f.get(); + if (*code) + { + TRelation occas(LF_OCCAS); + occas.lfile().put("CFPI", code); + if (occas.read(_isequal) == NOERR) + { + TMask& m = f.mask(); + m.autoload(occas); + m.send_key(K_TAB, O_COMUNE); // Forza decodifica comuni + m.send_key(K_TAB, O_COMUNENAS); + } + } + } + return TRUE; +} + +bool TDocumento_mask::occas_handler( TMask_field& f, KEY key ) +{ + TDocumento_mask & m = (TDocumento_mask &)f.mask(); + if ( key == K_SPACE && m.is_running( ) ) + { + TDocumento& doc = m.doc(); + TOccasionale& occ = doc.occas(); + + TMask occas_mask("ve0100o"); + occas_mask.set_handler( O_CODICE, occas_code_handler ); + + for (int i = occas_mask.fields() - 1; i >= 0; i--) + { + TMask_field & f = occas_mask.fld(i); + const TFieldref * c = f.field(); + if (c) + f.set(c->read(occ)); + } + if (occas_mask.run() != K_ESC) + { + const TString ocfpi(occas_mask.get(O_CODICE)); + doc.put("OCFPI", ocfpi); + m.set(F_OCFPI, ocfpi); + + for (int i = occas_mask.fields() - 1; i >= 0; i--) + { + const TMask_field& f = occas_mask.fld(i); + const TFieldref* c = f.field(); + if (c) + { + const char* val = f.get(); + c->write(val, occ); + } + } + m.occ2mask(); + } + f.set_focus( ); + } + return TRUE; +} + +bool TDocumento_mask::clifo_handler( TMask_field& f, KEY key ) +{ + if (key != K_ENTER && f.to_check(key, TRUE)) + { + TDocumento_mask & m = (TDocumento_mask &) f.mask(); + TDocumento & d = m.doc(); + const TString & val = f.get(); + + TTipo_documento& tdoc = (TTipo_documento&) d.tipo(); + d.put("TIPOCF", tdoc.tipocf()); + d.put("CODCF", atol(val)); + + TCli_for & cli_for = d.clifor(); + cli_for.put(CLI_CODCF, ""); // force reload + + if ( cli_for.get_bool("SOSPESO") ) + return f.error_box( "Il codice '%ld' e' sospeso e non puo' essere utilizzato", atol(val) ); + m.cli2mask(); + if (cli_for.occasionale()) + { + TOccasionale & occas = d.occas(); + if(m.id2pos(F_OCCASEDIT) > 0 && f.to_check(key) && *(occas.codice()) == '\0') + m.send_key( K_SPACE, F_OCCASEDIT ); // Lancia maschera occasionali + } + else + d.zero("OCFPI"); + } + return TRUE; +} + +/////////////////////////////////////////////////////////// +// TElabora_mask +/////////////////////////////////////////////////////////// + +class TElabora_mask : public TMask +{ + TDocumento_mask* _main; + TLista_elaborazioni _elab; + +// @access Protected Member +protected: + TString _art_filter, _liv_filter; + static TElabora_mask* _myself; + static bool article_filter(const TRelation* rel); + +// @access Public Member +public: + void update_list(); + void update_ndoc_filter(bool is_tipo_elaborazione = FALSE); + bool elabora(); + TElaborazione * curr_elab(); + static bool tipo_elaborazione_handler( TMask_field& f, KEY key ); + static bool tipo_documento_handler( TMask_field& f, KEY key ); + static bool codnum_handler( TMask_field& f, KEY key ); + static bool codart_handler( TMask_field& f, KEY key ); + static bool list_elab_handler( TMask_field& f, KEY key ); + static bool docrif_handler( TMask_field& f, KEY key ); + + // @cmember Costruttore (crea la maschera leggendo la descrizione dal file .msk) + TElabora_mask(TDocumento_mask * main_mask); + // @cmember Distruttore + virtual ~TElabora_mask() {} +}; + +TElabora_mask* TElabora_mask::_myself = NULL; + +void TElabora_mask::update_list() +{ + TString_array elabs; + const TString16 tipo(_main->get(F_TIPODOC)); + const TString16 stato(_main->get(F_STATO)); + const TString16 tipo_elab(get(F_TIPODOC_ELAB)); + const TString16 stato_elab(get(F_STATODOC_ELAB)); + const bool from_elab = !get_bool(F_TYPE); + int items = 0; + + bool agg_test = FALSE; + if (from_elab) + items = _elab.select(elabs, tipo, stato,"",""/*tipo_elab, stato_elab*/) ; + else + { + items = _elab.select(elabs, tipo_elab, stato_elab, tipo, stato); + agg_test = _main->sfield(F_SHEET).items() == 0; + } +// set(F_UPDATE_HEADER, agg_test ? "X" : ""); + + const bool ok = items > 0; + + enable(DLG_OK, ok); + enable(F_ELAB, ok); + + TList_field & f = (TList_field &) field(F_ELAB); + TToken_string codes; + TToken_string descrs; + + if (ok) + for (int i = 0; i < items; i++) + { + codes.add(format("%s", (const char *)_elab[elabs.row(i)].codice())); + descrs.add((const char *)_elab[elabs.row(i)].descrizione()); + } + if (codes != f.get_codes()) + f.replace_items(codes, descrs); + const TElaborazione * e = curr_elab(); + if (e && e->tipo() == _consegna_ordini) + show(-GRP_ART); + else + { + reset(-GRP_ART); + hide(-GRP_ART); + } +} + + +/* TLista_elaborazioni TElabora_mask::_elab; */ + +bool TElabora_mask::elabora() +{ + bool update_mask = FALSE; + + TLista_documenti in; + TLista_documenti out; + TDocumento & app_doc = ((TDocumento_mask *)_main)->doc(); + long numdoc = get_long(F_NDOC_ELAB); + bool update_header = get_bool(F_UPDATE_HEADER); + + TDocumento* newdoc = new TDocumento(*get(F_PROVV_ELAB), get_int(F_ANNO_ELAB), get(F_CODNUM_ELAB), numdoc); + TDocumento& d = *newdoc; + + if (numdoc <= 0) + { + TDocumento::copy_data(d.head(), app_doc.head()); + d.put(DOC_TIPODOC, get(F_TIPODOC_ELAB)); + + const TDate datadoc = d.get_date(DOC_DATADOC); + const TDate datainsc = d.get_date(DOC_DATAINSC); + const bool equal = !datainsc.ok() || datadoc == datainsc; + + d.put(DOC_DATADOC, get(F_DATADOC_ELAB)); + if (equal) + d.zero(DOC_DATAINSC); + + const TTipo_documento & t = d.tipo(); + + if (t.mov_mag()) + d.put(DOC_CAUSMAG, t.caus_mov()); + else + d.zero(DOC_CAUSMAG); + } + + if (update_header) + { + const TString16 tipo_doc(app_doc.get(DOC_TIPODOC)); + const TString16 caus_mag(app_doc.get(DOC_CAUSMAG)); + const long movmag = app_doc.get_long(DOC_MOVMAG); + const TDate datadoc = app_doc.get_date(DOC_DATADOC); + const TDate datainsc = app_doc.get_date(DOC_DATAINSC); + + TDocumento::copy_data(app_doc.head(), d.head()); + + app_doc.put(DOC_TIPODOC, tipo_doc); + app_doc.put(DOC_CAUSMAG, caus_mag); + app_doc.put(DOC_MOVMAG, movmag); + app_doc.put(DOC_DATADOC, datadoc); + app_doc.put(DOC_DATAINSC, datainsc); + } + + const bool from_elab = !get_bool(F_TYPE); + TElaborazione * e = curr_elab(); + + if (e == NULL) + return FALSE; + + if (e->tipo() == _consegna_ordini) + { + TParametri_elaborazione& p = e->params(); + p.set("ARTICOLO", get(F_CODART)); + p.set("UM", get(F_UMQTA)); + p.set("QUANTITA", get(F_QTA)); + } + if (from_elab) + { + in.add(app_doc); + out.add(d); + if (e->elabora(in, out, TDate(TODAY), TRUE)) + { + if (out[0] != d) + out.rewrite(); + if (app_doc != in[0]) + { + in.rewrite(); + app_doc = in[0]; + update_mask = TRUE; + } + } + } + else + { + out.add(app_doc); + in.add(d); + if (e->elabora(in, out, TDate(TODAY), TRUE)) + { + if (out[0] != app_doc) + { + out.rewrite(); + app_doc = out[0]; + update_mask = TRUE; + } + if (d != in[0]) + in.rewrite(); + } + TString8 num_in(e->codice_numerazione_iniziale()); + + set(F_CODNUM_ELAB, num_in); + set(F_NDOC_ELAB, ""); + set(F_NUMDOCRIF, ""); + } + if (e->tipo() == _consegna_ordini) + { + TParametri_elaborazione& p = e->params(); + if (p.get("ARTICOLO").not_empty()) + { + real qta = get_real(F_QTA); + if (qta > ZERO) + { + const real qta_evasa = p.get_real("QUANTITA"); + qta -= qta_evasa; + set(F_QTA, qta); + } + } + } + + delete newdoc; + + return update_mask; +} + +TElaborazione * TElabora_mask::curr_elab() +{ + const TString16 cod_elab(get(F_ELAB)); + return cod_elab.not_empty() ? &_elab[cod_elab] : NULL; +} + +bool TElabora_mask::article_filter(const TRelation* rel) +{ + bool yes = FALSE; + TElabora_mask& m = *_myself; + TLocalisamfile rdoc(LF_RIGHEDOC); + rdoc.put(RDOC_CODNUM, rel->curr().get(DOC_CODNUM)); + rdoc.put(RDOC_ANNO, rel->curr().get(DOC_ANNO)); + rdoc.put(RDOC_PROVV, rel->curr().get(DOC_PROVV)); + rdoc.put(RDOC_NDOC, rel->curr().get(DOC_NDOC)); + rdoc.put(RDOC_NRIGA, 1); + int next_riga = 1; + for (int err = rdoc.read(); err == NOERR; err = rdoc.next()) + { + const int nriga = rdoc.get_int(RDOC_NRIGA); + if (nriga != next_riga) + break; + next_riga++; + const bool evasa= rdoc.get_bool(RDOC_RIGAEVASA); + const TString& codart = rdoc.get(RDOC_CODART); + if (!evasa && codart == m._art_filter) + { + const real residuo = rdoc.get_real(RDOC_QTA)-rdoc.get_real(RDOC_QTAEVASA); + if (residuo > ZERO) + { + yes = TRUE; + break; + } + } + } + return yes; +} + +void TElabora_mask::update_ndoc_filter(bool is_tipo_elaborazione) +{ + TString filter(80); + filter.format("(TIPOCF==\"%s\")&&(CODCF==\"%s\")&&(CODVAL==\"%s\")", (const char *)get(F_TIPOCF_ELAB), (const char *)get(F_CODCF_ELAB), (const char *)get(F_CODVAL_ELAB)); + const TString16 tipo(get(F_TIPODOC_ELAB)); + TElaborazione * e = curr_elab(); + const bool to_elab = get_bool(F_TYPE); + + if (!field(F_CODNUM_ELAB).empty()) + filter << format("&&(CODNUM==\"%s\")", (const char*)get(F_CODNUM_ELAB)); + enable(-1, to_elab /*&& e != NULL*/); + + if (!to_elab && is_tipo_elaborazione ) + reset(-1); + + if (e != NULL) + { + if (to_elab) + { + TString8 num_in(e->codice_numerazione_iniziale()); +// TString8 tipo_in1; +// char stato_in1; + + if (tipo.not_empty()) + { + filter << format("&&(TIPODOC==\"%s\")", (const char *)tipo); + const char* stato = get(F_STATODOC_ELAB); + if (stato != 0) + filter << format("&&(STATO==\"%s\")", stato); + else + { + bool almost_one = FALSE; + + for (int i = 0; i < TElaborazione::_max_tipi_doc_elab; i++) + { + const TString16 tipo_in(e->tipo_iniziale(i)); + const char stato_in = e->stato_iniziale(i); + + if (tipo == tipo_in && stato_in > '0') + { + if (almost_one) + filter << "||"; + else + filter << "&&("; + almost_one = TRUE; + + filter << format("(STATO==\"%c\")", stato_in); + } + if (i==0) + { +// tipo_in1=tipo_in; +// stato_in1=stato_in; + set(F_CODNUM_ELAB, num_in); + field(F_CODNUM_ELAB).check(); + set(F_TIPODOC_ELAB , tipo_in); + field(F_TIPODOC_ELAB).check(); + set(F_STATODOC_ELAB, format("%c",stato_in)); + field(F_STATODOC_ELAB).check(); + } + } + if (almost_one) + filter << ')'; + } + } + else + { + bool almost_one = FALSE; + + for (int i = 0; i < TElaborazione::_max_tipi_doc_elab; i++) + { + const TString16 tipo_in(e->tipo_iniziale(i)); + + if (tipo_in.not_empty()) + { + if (almost_one) + filter << "||"; + else + filter << "&&("; + almost_one = TRUE; + filter << format("((TIPODOC==\"%s\")", (const char *)tipo_in); + + const char stato_in = e->stato_iniziale(i); + + if (stato_in > '0') + filter << format("&&(STATO==\"%c\")", stato_in); + filter << ')'; + if (i==0) + { +// tipo_in1=tipo_in; +// stato_in1=stato_in; + set(F_CODNUM_ELAB, num_in); + field(F_CODNUM_ELAB).check(); + set(F_TIPODOC_ELAB , tipo_in); + field(F_TIPODOC_ELAB).check(); + set(F_STATODOC_ELAB, format("%c",stato_in)); + field(F_STATODOC_ELAB).check(); + } + } + } + if (almost_one) + filter << ')'; + } + } + else + if (is_tipo_elaborazione) + { + const TString16 tipo_fin(e->tipo_finale()); + const TString16 stato_fin(e->stato_finale()); + + filter << "&&"; + if (stato_fin != "0") + filter << '('; + filter << format("(TIPODOC==\"%s\")", (const char *)tipo_fin); + if (stato_fin != "0") + filter << format("&&(STATO==\"%s\"))", (const char *)stato_fin); + + const TString16 num_fin(e->codice_numerazione_finale()); + + set(F_CODNUM_ELAB, num_fin); + field(F_CODNUM_ELAB).check(); + set(F_TIPODOC_ELAB, tipo_fin); + field(F_TIPODOC_ELAB).check(); + set(F_STATODOC_ELAB, stato_fin); + field(F_STATODOC_ELAB).check(); + } + } + else + reset(-1); + + TBrowse& brew = *efield(F_NDOC_ELAB).browse(); + brew.set_filter(filter); + + _art_filter = get(F_CODART); + if (_art_filter.not_empty() && to_elab) + brew.cursor()->set_filterfunction(article_filter); + else + brew.cursor()->set_filterfunction(NULL); + +} + +bool TElabora_mask::tipo_elaborazione_handler( TMask_field& f, KEY key ) +{ + if (key == K_SPACE) + { + TElabora_mask & m = (TElabora_mask &) f.mask(); + m.update_list(); + m.update_ndoc_filter(TRUE); + } + return TRUE; +} + +bool TElabora_mask::tipo_documento_handler( TMask_field& f, KEY key ) +{ + if (key != K_ENTER && f.to_check(key, TRUE)) + { + TElabora_mask & m = (TElabora_mask &) f.mask(); + + m.update_list(); + m.update_ndoc_filter(); + } + return TRUE; +} + +bool TElabora_mask::codnum_handler( TMask_field& f, KEY key ) +{ + if (key != K_ENTER && f.to_check(key, TRUE)) + { + TElabora_mask & m = (TElabora_mask &) f.mask(); + + m.update_ndoc_filter(); + } + return TRUE; +} + +bool TElabora_mask::codart_handler( TMask_field& f, KEY key ) +{ + if (key != K_ENTER && f.to_check(key, TRUE)) + { + TElabora_mask & m = (TElabora_mask &) f.mask(); + m.update_ndoc_filter(); + } + return TRUE; +} + +bool TElabora_mask::list_elab_handler( TMask_field& f, KEY key ) +{ + if (key == K_SPACE) + { + TElabora_mask & m = (TElabora_mask &) f.mask(); + m.update_ndoc_filter(TRUE); + } + return TRUE; +} + +bool TElabora_mask::docrif_handler( TMask_field& f, KEY key ) +{ + if (key == K_F9) + { + TElabora_mask& m = (TElabora_mask&)f.mask(); + + TRectype filtrec(LF_DOC); + filtrec.put(DOC_TIPOCF, m.get(F_TIPOCF_ELAB)); + filtrec.put(DOC_CODCF, m.get(F_CODCF_ELAB)); + filtrec.put(DOC_PROVV, m.get(F_PROVV_ELAB)); + filtrec.put(DOC_ANNO, m.get(F_ANNO_ELAB)); + + TRelation rel(LF_DOC); + rel.add(LF_CLIFO, "TIPOCF==TIPOCF|CODCF==CODCF"); + TSorted_cursor cur(&rel, "TIPOCF|CODCF|PROVV|ANNO|CODNUM|NUMDOCRIF", "", 2, &filtrec, &filtrec); + TString80 flt; + if (!m.field(F_CODNUM_ELAB).empty()) + flt << format("(CODNUM==\"%s\")&&", (const char*)m.get(F_CODNUM_ELAB)); + if (!m.field(F_TIPODOC_ELAB).empty()) + flt << format("(TIPODOC==\"%s\")&&", (const char*)m.get(F_TIPODOC_ELAB)); + flt << "(STATO==\"" << m.get(F_STATODOC_ELAB) << "\")"; + if (!f.empty()) + flt << "&&(NUMDOCRIF==\"" << f.get() << "\")"; + cur.setfilter(flt); + TToken_string fields = "ANNO|CODNUM|TIPODOC|NUMDOCRIF|DATADOCRIF|DOC1|DOC2|DOC3|NDOC|20->RAGSOC"; + TCursor_sheet sheet(&cur, fields, + "Documento di riferimento", + "Anno|Num.|Tipo|Docum.Rif.|Data@10|Docum.Rif.1|Docum.Rif.2|Docum.Rif.3|Documento|Ragione Sociale@50", + 0, 1); + if (sheet.run() == K_ENTER) + { + const int nrifpos = fields.get_pos("NUMDOCRIF"); + const TString16 nrif = sheet.row(-1).get(nrifpos); + f.set(nrif); + const int ndocpos = fields.get_pos("NDOC"); + const TString16 ndoc = sheet.row(-1).get(ndocpos); + m.set(F_NDOC_ELAB, ndoc); + const int codnumpos = fields.get_pos("CODNUM"); + const TString16 codnum = sheet.row(-1).get(codnumpos); + m.set(F_CODNUM_ELAB, codnum, TRUE); + } + } + + return TRUE; +} + +TElabora_mask::TElabora_mask(TDocumento_mask * main_mask) + : TMask("ve0100b"), _main(main_mask) +{ + _myself = this; + + set_handler(F_TYPE, tipo_elaborazione_handler); + set_handler(F_TIPODOC_ELAB, tipo_documento_handler); + set_handler(F_STATODOC_ELAB, tipo_documento_handler); + set_handler(F_CODNUM_ELAB, codnum_handler); + set_handler(F_CODART, codart_handler); + set_handler(F_ELAB, list_elab_handler); + set_handler(F_NUMDOCRIF, docrif_handler); + + set(F_ANNO_ELAB, _main->get(F_ANNO)); + set(F_TIPOCF_ELAB, _main->get(F_TIPOCF)); + set(F_CODCF_ELAB, _main->get(F_CODCF)); + set(F_CODVAL_ELAB, _main->get(F_CODVAL)); +} + +bool TDocumento_mask::elabora_handler( TMask_field& f, KEY key ) +{ + if (key == K_SPACE) + { + TDocumento_mask& m = (TDocumento_mask&)f.mask(); + m.update_progs(); + if (m.check_fields()) // Check values + { + TElabora_mask* selection = new TElabora_mask(&m); // No woman no stack + bool update_mask = FALSE; + const char stato_iniziale = m.doc().stato(); + + while (selection->run() != K_ESC) + { + m.mask2doc(); + update_mask |= selection->elabora(); + + if (m.doc().stato() != stato_iniziale) + break; + if (update_mask) + { + m.doc2mask(FALSE); + TSheet_field& ss = m.sfield(F_SHEET); + for (int i = 0; i < ss.items(); i++) + { + m.ss_notify(ss,i,K_TAB); + m.ss_notify(ss,i,K_SPACE); + m.ss_notify(ss,i,K_ENTER); + } + } + } + if (update_mask) + { + m.doc2mask(FALSE); + // Provoca decodifiche necessarie + const int last = m.id2pos(BASE_PIEDE + 1); + for (int p = 0; p < last; p++) + { + TMask_field& f = m.fld(p); + f.check(STARTING_CHECK); + } + } + delete selection; + } + } + return TRUE; +} + +bool TDocumento_mask::print_handler( TMask_field& f, KEY key ) +{ + if (key == K_SPACE) + main_app().print(); + return TRUE; +} + +void TDocumento_mask::user_set_handler(int fieldid, int index) +{ + switch( index ) + { + case 1: + set_handler( fieldid, ora_hndl ); + break; + case 2: + set_handler( fieldid, totdoc_hndl ); + break; + case 3: + set_handler( fieldid, numdocrif_hndl ); + break; + case 4: + set_handler( fieldid, dummy_hndl ); + break; + default: + CHECK( FALSE, "Tentativo di installare un handler non definito" ); + break; + } +} + +bool TDocumento_mask::num_handler( TMask_field& f, KEY key ) +{ + if (key == K_TAB && f.to_check(key, TRUE)) + { + // Ottengo la maschera + TDocumento_mask& m = (TDocumento_mask&)f.mask( ); + + TTable & tabnum = ((TTable &) ((TEdit_field &)f).browse()->cursor()->file()); + if ( tabnum.good()) + { + TCodice_numerazione cod_num(tabnum.curr()); + m.set( F_DESNUM, cod_num.descrizione()); + // Propone il primo tipo di documento come default + if (m.field(F_TIPODOC).empty() || f.focusdirty()) + { + m.set( F_TIPODOC, cod_num.tipo_doc(0)); + m.send_key( K_TAB, F_TIPODOC ); + } + // Se per questa numerazione e' abilitata le numerazione provvisoria + if (cod_num.num_provv()) + { + // Setta di default la numerazione provvisoria + m.set( F_PROVV, "P" ); + // Abilita il campo per la selezione della numerazione + m.enable( F_PROVV ); + } + else // Altrimenti ... + { + // Setta la numerazione a definitiva + m.set( F_PROVV, "D" ); + // Disabilita il campo per la selezione della numerazione + m.disable( F_PROVV ); + } + } + else + { + m.set( F_DESNUM, "" ); + m.set( F_TIPODOC, "" ); + } + } + return TRUE; +} + +bool TDocumento_mask::tip_handler( TMask_field& f, KEY key ) +{ + TDocumento_mask& m = (TDocumento_mask&)f.mask( ); + if ( key == K_TAB && m.is_running() && m.get(F_TIPODOC).not_empty()) + { + TCodice_numerazione cod_num(m.get(F_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( "Tipo non valido per la numerazione selezionata!" ); + } + return TRUE; +} + +bool TDocumento_mask::codlist_handler( TMask_field& f, KEY key ) +{ + if (key == K_TAB && f.focusdirty()) + { + TLocalisamfile & list = ((TEdit_field &) f).browse()->cursor()->file(); + const TDate datadoc(f.mask().get(F_DATADOC)); + const TDate datascad(list.get_date("VALFIN")); + + if (datascad.ok() && datadoc > datascad) + { + const TString16 codsucc(list.get("CODLISSUCC")); + + if (codsucc.empty()) + return error_box("Listino scaduto il %s", datascad.string()); + else + { + f.set(codsucc); + f.set_focusdirty(); + ((TEdit_field &)f).check(); + } + } + } + return TRUE; +} + +bool TDocumento_mask::codcont_handler( TMask_field& f, KEY key ) +{ + if (key == K_TAB && f.focusdirty()) + { + TLocalisamfile & cont = ((TEdit_field &) f).browse()->cursor()->file(); + const TDate datadoc(f.mask().get(F_DATADOC)); + const TDate datascad(cont.get_date("VALFIN")); + + if (datascad.ok() && datadoc > datascad) + return error_box("Contratto scaduto il %s", datascad.string()); + } + return TRUE; +} + +bool TDocumento_mask::codcamp_handler( TMask_field& f, KEY key ) +{ + if (key == K_TAB && f.focusdirty()) + { + TLocalisamfile & camp = ((TEdit_field &) f).browse()->cursor()->file(); + const TDate datadoc(f.mask().get(F_DATADOC)); + const TDate datascad(camp.get_date("VALFIN")); + + if (datascad.ok() && datadoc > datascad) + return error_box("Offerta scaduta il %s", datascad.string()); + } + return TRUE; +} + +/* +bool TDocumento_mask::controeuro_handler( TMask_field& f, KEY key ) +{ + TMask & m = f.mask(); + + if (m.is_running() && key == K_SPACE) + { + const real cambio_euro = TCurrency::get_euro_change(); + const real val = cambio_euro / m.get_real(F_CAMBIO); + + m.set(F_CAMBIO, val); + } + return TRUE; +} +*/ + +bool TDocumento_mask::codval_handler( TMask_field& f, KEY key ) +{ + if (key == K_TAB && f.focusdirty()) + { + TSheet_field& righe = f.mask().sfield(F_SHEET); + righe.force_update(); + } + return TRUE; +} + + diff --git a/ve/velib4bc.cpp b/ve/velib4bc.cpp new file mode 100755 index 000000000..2d22075f5 --- /dev/null +++ b/ve/velib4bc.cpp @@ -0,0 +1,3115 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "../mg/anamag.h" + + +#include "velib.h" +#include "../cg/cg2101.h" +#include "../cg/cg2103.h" +#include "../cg/cgsaldac.h" +#include "../cg/cglib02.h" + +/////////////////////////////////////////////////////////// +// TContabilizzazione +/////////////////////////////////////////////////////////// + +// TMovimentoPN_VE +// Classe derivata da TMovimentoPN per calcolare automaticamente le righe contabili +// una volta settate le righe iva e la riga di totale documento +// Sostanzialmente di tratta di aggiungere un metodo in piu' : +// recalc_cg_rows(), liberamente ispirato alla notify_iva() in cg2102.cpp + +class TMovimentoPN_VE : public TMovimentoPN +{ + TCausale * _caus; + bool _valuta; + +protected: + // simula il K_SPACE di iva_notify + void create_row(int i, const TString & descr_cr); + // simula il K_ENTER di iva_notify + void enter_row(int i, const TString & descr_cr); + // verifica se si tratta di iva indetraibile + bool detraibile(TRectype& rec) const ; + // cerca la prima tra quelle di contabilita' che corrisponde al tipo indicato + int type2pos(char tipo); + // Trova nelle righe contabili un conto nelle righe di tipo prescelto + int bill2pos(const TBill& conto, char tipo); + // trasforma un real in TImporto, in base al tipo riga + TImporto real2imp(const real& r, char row_type); + // setta il record delle righe di contabilita' + int set_cg_rec(int n, const TImporto& imp, TBill& conto, const char* desc, char tipo); + // aggiunge l'importo indicato alla n-esima riga di contabilita' + bool add_cg_rec(int n, const TImporto& imp); + // Legge l'importo della riga n e lo ritorna col segno dovuto + TImporto get_cg_imp(int n); + // Setta l'importo della riga n + void set_cg_imp(int n, const TImporto& imp); + // verifica se il movimento e' quadrato oppure ha qualche maledetto sbilancio + // ritorna TRUE, ovviamente, se everything's alright. +public: + // ricalcola le righe di contabilita' dalle righe iva presenti + // e verifica la quadratura del movimento. Ritorna TRUE se il movimento e' scrivibile + bool movement_ok() ; + int recalc_cg_rows(const TString & descr_cr, TCausale* caus = NULL); + TMovimentoPN_VE(bool valuta) : _valuta(valuta), _caus(NULL) {}; + virtual ~TMovimentoPN_VE() {} +}; + +TImporto TMovimentoPN_VE::real2imp(const real& r, char row_type) +{ + CHECK(_caus,"Orgggssbb..._caus pointer is NULL!"); + bool dare; + if (row_type == 'S') + { + dare = _caus->sezione_ritsoc() == 'D'; + } + else + if (row_type == 'F') + { + dare = _caus->sezione_ritsoc() == 'D'; + } + else + { + dare = _caus->sezione_clifo() == 'D'; + if (row_type != 'T' && row_type != 'F') + dare = !dare; + } + + TImporto importo(dare ? 'D' : 'A', r); + return importo; +} + +bool TMovimentoPN_VE::detraibile(TRectype& rec) const +{ + CHECK(_caus,"Orgggssbb..._caus pointer is NULL!"); + if (_caus->iva() == iva_vendite) + return TRUE; + + if (rec.get_int(RMI_TIPODET) != 0) + return FALSE; + + const int annodoc = curr().get_date(MOV_DATADOC).year(); + const bool prorata100 = _caus->reg().prorata100(annodoc); + return !prorata100; // Se prorata = 100% e' indetraibile +} + +int TMovimentoPN_VE::bill2pos(const TBill& conto, char tipo) +{ + const int items = cg_items(); + for (int i = 0; i < items; i++) + { + TRectype& s = cg(i); + const char t = s.get_char(RMV_ROWTYPE); + if (t == tipo) + { + TBill c; + const int gr = s.get_int(RMV_GRUPPO); + const int co = s.get_int(RMV_CONTO); + const long so = s.get_long(RMV_SOTTOCONTO); + c.set(gr,co,so); + if (c == conto) + return i; + } + } + return -1; +} + +int TMovimentoPN_VE::type2pos(char tipo) +{ + const int items = cg_items(); + for (int i = 0; i < items; i++) + { + TRectype& s = cg(i); + const char t = s.get_char(RMV_ROWTYPE); + if (t == tipo) + return i; + } + return -1; +} + +void TMovimentoPN_VE::set_cg_imp(int n, const TImporto& imp) +{ + TRectype& rec = cg(n); + rec.put(RMV_SEZIONE,imp.sezione()); + rec.put(RMV_IMPORTO,imp.valore()); +} + +TImporto TMovimentoPN_VE::get_cg_imp(int n) +{ + TRectype& rec = cg(n); + TImporto importo; + const char sez = rec.get_char(RMV_SEZIONE); + const real valore(rec.get_real(RMV_IMPORTO)); + importo.set(sez,valore); + return importo; +} + +bool TMovimentoPN_VE::add_cg_rec(int n, const TImporto& imp) +{ + TImporto tot(get_cg_imp(n)); + tot += imp; + //tot.normalize(); + set_cg_imp(n, tot); + return tot.is_zero(); +} + +int TMovimentoPN_VE::set_cg_rec(int n, const TImporto& imp, TBill& conto, + const char* desc, char tipo) +{ + const bool insert = n < 0; + if (insert) n = cg_items(); // Questa e' la prima riga di contabilita' vuota e disponibile + TRectype& rec = cg(n); + + if (insert) + { + TRectype& head = lfile().curr(); + const int annoes = head.get_int(MOV_ANNOES); + const long numreg = head.get_long(MOV_NUMREG); + TDate datareg(head.get_date(MOV_DATAREG)); + rec.put(RMV_ANNOES,annoes); + rec.put(RMV_NUMREG,numreg); + rec.put(RMV_DATAREG,datareg); + } + rec.put(RMV_SEZIONE,imp.sezione()); + rec.put(RMV_IMPORTO,imp.valore()); + rec.put(RMV_TIPOC,conto.tipo()); + rec.put(RMV_GRUPPO,conto.gruppo()); + rec.put(RMV_CONTO,conto.conto()); + rec.put(RMV_SOTTOCONTO,conto.sottoconto()); + rec.put(RMV_DESCR, desc); + + if (tipo == 'T') // Calcolo contropartita + { + TRectype& irec = iva(0); + const char t = irec.get_char(RMI_TIPOC); + const int gr = irec.get_int(RMI_GRUPPO); + const int co = irec.get_int(RMI_CONTO); + const long so = irec.get_long(RMI_SOTTOCONTO); + rec.put(RMV_TIPOCC,t); + rec.put(RMV_GRUPPOC,gr); + rec.put(RMV_CONTOC,co); + rec.put(RMV_SOTTOCONTOC,so); + } + else + { + int pos = -1; + if (tipo == 'F') + { + pos = type2pos('D'); + if (pos == -1) + pos = type2pos('N'); + } + else + pos = type2pos('T'); + if (pos >= 0) + { + TRectype& crec = cg(pos); + const char t = crec.get_char(RMV_TIPOC); + const int gr = crec.get_int(RMV_GRUPPO); + const int co = crec.get_int(RMV_CONTO); + const long so = crec.get_long(RMV_SOTTOCONTO); + rec.put(RMV_TIPOCC,t); + rec.put(RMV_GRUPPOC,gr); + rec.put(RMV_CONTOC,co); + rec.put(RMV_SOTTOCONTOC,so); + } + } + + rec.put(RMV_ROWTYPE,tipo); + return n; +} + +void TMovimentoPN_VE::create_row(int i, const TString & descr_cr) +{ + CHECK(_caus,"Orgggssbb..._caus pointer is NULL!"); + TRectype& cur = iva(i); + real oldimp = cur.get_real(RMI_IMPONIBILE); + real oldiva = cur.get_real(RMI_IMPOSTA); + + if (oldiva.is_zero() && _caus->corrispettivi()) // In caso di corrispettivi ... + { + const TString4 zanicchi(cur.get(RMI_CODIVA)); // Codice IVA + const TCodiceIVA i(zanicchi); + oldiva = i.scorpora(oldimp); // ... scorpora imposta dall'imponibile + } + + const char tipod = detraibile(cur) ? 'D' : 'N'; + + if (type2pos(tipod) < 0 && !oldiva.is_zero()) + { + const int ri = tipod == 'D' ? 3 : 4; // Calcola riga causale per l'IVA + TBill c; _caus->bill(ri, c); + if (c.ok()) + { + const TString80 d(_caus->desc_agg(ri)); + set_cg_rec(-1, real2imp(ZERO, 'I'), c, d, tipod); + } + else + if (ri == 4) // Se non esiste il conto IVA indetraibile ... + { // ... somma imponibile e imposta + oldimp += oldiva; + oldiva = 0.0; + } + } + + TBill oldconto; + const int gr = cur.get_int(RMI_GRUPPO); + const int co = cur.get_int(RMI_CONTO); + const long so = cur.get_long(RMI_SOTTOCONTO); + oldconto.set(gr,co,so); + if (oldconto.ok()) + { + if (bill2pos(oldconto, 'I') < 0) + { + const TString d(_caus->desc_agg(2)); + + set_cg_rec(-1, real2imp(ZERO, 'I'), oldconto, d.empty() ? descr_cr: d, 'I'); + } + } +} + +void TMovimentoPN_VE::enter_row(int i, const TString & descr_cr) +{ + CHECK(_caus,"Orgggssbb..._caus pointer is NULL!"); + TRectype& cur = iva(i); + real imponibile = cur.get_real(RMI_IMPONIBILE); + real imposta = cur.get_real(RMI_IMPOSTA); + + if (imposta.is_zero() && _caus->corrispettivi()) // In caso di corrispettivi ... + { + const TString4 zanicchi(cur.get(RMI_CODIVA)); + const TCodiceIVA i(zanicchi); + imposta = i.scorpora(imponibile); // ... scorpora imposta dall'imponibile + } + + TBill conto; + const char t = cur.get_char(RMI_TIPOC); + const int gr = cur.get_int(RMI_GRUPPO); + const int co = cur.get_int(RMI_CONTO); + const long so = cur.get_long(RMI_SOTTOCONTO); + conto.set(gr,co,so,t); + + int newpos = bill2pos(conto, 'I'); // Riga in cui andra' l'imponibile + + const bool detrarre = detraibile(cur); // Determina se IVA detraibile + + // Calcola riga causale col conto opportuno + const int ri = detrarre ? RIGA_IVA_DETRAIBILE : RIGA_IVA_NON_DETRAIBILE; + TBill contoiva; _caus->bill(ri, contoiva); + + if (ri == 4 && !contoiva.ok()) // Se non c'e' il conto IVA indetraibile ... + { // ... somma imponibile e imposta + imponibile += imposta; + imposta = 0.0; + } + + // Aggiorna conto sulla riga contabile + if (newpos < 0) // conto non esistente: da inserire + { + const TImporto val(real2imp(imponibile, 'I')); + if (conto.ok() && !val.is_zero()) // Se c'e' imponibile ... + { // crea una nuova riga contabile + const TString d(_caus->desc_agg(2)); + set_cg_rec(-1, val, conto, d.empty() ? descr_cr : d, 'I'); + } + } + else + { + TImporto val(real2imp(imponibile, 'I')); + add_cg_rec(newpos, val); + } + cur.put(RMI_RIGAIMP, newpos+1); // Aggiorna riferimento alla riga contabile + + // Aggiorna conto IVA sulla riga contabile + + const char tipod = detrarre ? 'D' : 'N'; + int newposiva = type2pos(tipod); + + if (newposiva < 0) + { + if (!imposta.is_zero()) // Se c'e' imposta ... + { // ... crea nuova riga per l'IVA + const TImporto val(real2imp(imposta, 'I')); + const TString d(_caus->desc_agg(ri)); + newposiva = set_cg_rec(-1, val, contoiva, d, tipod); + } + } + else + { + const TImporto val(real2imp(imposta, 'I')); + add_cg_rec(newposiva, val); + } +} + +bool TMovimentoPN_VE::movement_ok() +{ + TImporto tot_imp; + TImporto imp; + + // Se siamo in valuta, forzera' la riga totale documento a cio' che si ottiene dalla somma + // delle singole righe per evitare sbilanci nel movimento di 2,3,4,5 lire dovuti agli arrotondamenti + const int max = cg_items(); + for (int i = 0; i < max; i++) + { + if (i == 0 && _valuta) + continue; + TRectype& r = cg(i); + const char sez = r.get_char(RMV_SEZIONE); + const real val(r.get_real(RMV_IMPORTO)); + imp.set(sez,val); + tot_imp+=imp; + } + + if (_valuta) + { + TRectype& r = cg(0); + // Setta la riga di totale documento... + r.put(RMV_IMPORTO,tot_imp.valore()); + r.put(RMV_SEZIONE,tot_imp.sezione() == 'D' ? 'A' : 'D'); // Sezione contraria + // ...ed anche il totale documento sulla testata + lfile().curr().put(MOV_TOTDOC,tot_imp.valore()); + tot_imp.valore() = 0.0; + if (_caus != NULL && _caus->intra()) + { + real totdoc = curr().get(MOV_TOTDOC); + + curr().put(MOV_CORRLIRE, totdoc); + } + } + + if (!tot_imp.is_zero()) + return FALSE; + return TRUE; +} + +int TMovimentoPN_VE::recalc_cg_rows(const TString & descr_cr, TCausale* caus) +{ + const int righe = iva_items(); + bool external_caus = TRUE; + TRectype& head = lfile().curr(); + + if (caus == NULL) + { + external_caus = FALSE; + TString16 codcau(head.get(MOV_CODCAUS)); + int year = head.get_int(MOV_ANNOIVA); + _caus = new TCausale (codcau,year); + } + else + _caus = caus; + for (int i=0; iintra() && _caus->iva() == iva_acquisti) + { + TBill c; _caus->bill(8, c); + ok = c.ok(); + if (ok) + { + const TString80 d(_caus->desc_agg(8)); + const char rowtype = 'F'; + set_cg_rec(-1, real2imp(head.get_real(MOV_RITFIS), rowtype), c, d, rowtype); + } + else + return 2; + } + + if (_caus->tipomov() == 1) // Elimina eventuali righe vuote dalle fatture + { + for (int c = cg_items()-1; c >= 0; c--) + { + const TImporto imp = get_cg_imp(c); + if (imp.is_zero()) + destroy_cg_row(c); + } + } + + if (!external_caus) + { + delete _caus; + _caus = NULL; + } + return ok && movement_ok() ? 0 : 1; +} + +// TIVA_element +// classe di elementi da memorizzare nel TAssoc_array (vedi sotto) _righe_iva +class TIVA_element : public TObject +{ + real _imp; + real _iva; + real _ali; // Andrebbe eliminato: basta _cod_iva (Guy was here) + TString4 _cod_iva; + +public: + real& imp() { return _imp;} // Imponibile + real& iva() { return _iva;} // Iva + real& ali() { return _ali;} // Aliquota % + TString& cod_iva() { return _cod_iva;} + void zero() { _imp = _iva = _ali = ZERO; _cod_iva.cut(0); } + virtual TObject* dup() const { return new TIVA_element(*this); } + TIVA_element& operator = (TIVA_element& a); + TIVA_element() { zero(); } + ~TIVA_element() {}; +}; + +TIVA_element& TIVA_element::operator=(TIVA_element& a) +{ + _imp = a.imp(); _iva = a.iva(); _ali = a.ali(); + _cod_iva = a.cod_iva(); + return *this; +} + +// Parametri da leggere all'inizio dell'elaborazione tramite load_parameters() +static TBill _sco_perc_bill, _sco_imp_bill, // Conti per gli sconti a percentuale ed importi (dalla configurazione) + _spin_billa, _spin_billv, + _spbo_billa, _spbo_billv; +static TBill _co_cliente, // conto clifo per movimento d'anticipo + _co_controp; // conto di contropartita per il movimetno d'anticipo + +static bool _nump_cfg; // se TRUE prende il numero rif. partita dal numero protocollo +static bool _sc_enabled; // se TRUE il saldaconto di ditta e' abilitato +static bool _in_enabled; // se TRUE l'intra e' abilitato +static TToken_string* _search_seq = NULL; + // Sequenza di ricerca del conto costo/ricavo la correttezza dell'ordinamento + // va controllata nel programma di modifica parametri: + // "" = fine ordinamento + // CF = cliente fornitore + // CA = causale + // AR = articolo (costo/ricavo) + // GM = gruppo merceologico + // SM = sottogruppo merceologico + // RF = raggruppamento fiscale + // CV = categoria di vendita + // CC = categoria contabile + // Gli utlimi 6 fanno parte della ricerca per costi ricavi, in particolare AR,GM,SM e RF + // non possono essere interrotti da CV o CC. Ad es. CA|CF|AR|CV|GM|CC|RF non e' valida come stringa + // di ricerca. +static TString16 _ivasto; // Codice IVA per storno articoli Omaggio +static bool _contsclor; // Contabilizza sconti al netto o al lordo (sconti suddiviso per ogni contropartita) +//static bool _loaded = FALSE;// Flag per evitare di caricare i parametri più di una volta + +static TEsercizi_contabili _esc; // Per sapere a quale esercizio appartiene il documento +static TCausale *_caus = NULL; // causale del documento corrente +static TMovimentoPN_VE *_movimento = NULL; // Movimento di prima nota documento vendita +static TMovimentoPN *_anticipo = NULL; // Movimento di prima nota relativamente all'anticipo indicato sul documento + +TContabilizzazione::TContabilizzazione(const char* cod) + : TElaborazione(cod), _auto_data(FALSE), _nump_iva(2) +{ + _fcaus = new TLocalisamfile(LF_CAUSALI); + _frcaus = new TLocalisamfile(LF_RCAUSALI);// Per far andare TCausale + _attiv = new TLocalisamfile(LF_ATTIV); // Altrimenti TRegistro non va! + _part = new TLocalisamfile(LF_PARTITE); + _scad = new TLocalisamfile(LF_SCADENZE); + _pags = new TLocalisamfile(LF_PAGSCA); // Per far funzionare TPartita + _intra = new TLocalisamfile(LF_INTRA); + _rintra = new TLocalisamfile(LF_RINTRA); + _occas = new TLocalisamfile(LF_OCCAS); + _docfile = new TLocalisamfile(LF_DOC); + _rdocfile = new TLocalisamfile(LF_RIGHEDOC); // Per far funzionare TDocumento,TPartita ecc.. + _anamag = new TLocalisamfile(LF_ANAMAG); + _saldi = new TLocalisamfile(LF_SALDI); + + _cpg = new TTable("%CPG"); + _tri = new TTable("%TRI"); + _val = new TTable("%VAL"); + _prs = new TTable("PRS"); + _spp = new TTable("SPP"); + _caa = new TTable("CAA"); + _cra = new TTable("CRA"); + _gmc = new TTable("GMC"); + _rfa = new TTable("RFA"); + _cve = new TTable("CVE"); + _cco = new TTable("CCO"); + _clifo = new TRelation(LF_CLIFO); + _clifo->add(LF_CFVEN,"TIPOCF=TIPOCF|CODCF=CODCF"); + + _can_write = TRUE; + _error = no_error; + _total_docs = 0L; + _caus = NULL; +} + +TContabilizzazione::TContabilizzazione(const TRectype& rec) + : TElaborazione(rec), _auto_data(FALSE), _nump_iva(2), _viswin(NULL) +{ + _fcaus = new TLocalisamfile(LF_CAUSALI); + _frcaus = new TLocalisamfile(LF_RCAUSALI);// Per far andare TCausale + _attiv = new TLocalisamfile(LF_ATTIV); // Altrimenti TRegistro non va! + _part = new TLocalisamfile(LF_PARTITE); + _scad = new TLocalisamfile(LF_SCADENZE); + _pags = new TLocalisamfile(LF_PAGSCA); // Per far funzionare TPartita + _intra = new TLocalisamfile(LF_INTRA); + _rintra = new TLocalisamfile(LF_RINTRA); + _occas = new TLocalisamfile(LF_OCCAS); + _docfile = new TLocalisamfile(LF_DOC); + _rdocfile = new TLocalisamfile(LF_RIGHEDOC); // Per far funzionare TDocumento,TPartita ecc.. + _anamag = new TLocalisamfile(LF_ANAMAG); + _saldi = new TLocalisamfile(LF_SALDI); + + _cpg = new TTable("%CPG"); + _tri = new TTable("%TRI"); + _val = new TTable("%VAL"); + _prs = new TTable("PRS"); + _spp = new TTable("SPP"); + _caa = new TTable("CAA"); + _cra = new TTable("CRA"); + _gmc = new TTable("GMC"); + _rfa = new TTable("RFA"); + _cve = new TTable("CVE"); + _cco = new TTable("CCO"); + _clifo = new TRelation(LF_CLIFO); + _clifo->add(LF_CFVEN,"TIPOCF=TIPOCF|CODCF=CODCF"); + + _can_write = TRUE; + _error = no_error; + _total_docs = 0L; + _caus = NULL; +} + +TContabilizzazione::~TContabilizzazione() +{ + delete _clifo; + delete _cpg; + delete _tri; + delete _val; + delete _gmc; + delete _rfa; + delete _cve; + delete _cco; + delete _prs; + delete _spp; + delete _caa; + delete _cra; + delete _anamag; + delete _saldi; + delete _fcaus; + delete _frcaus; + delete _attiv; + delete _part; + delete _scad; + delete _pags; + delete _intra; + delete _rintra; + delete _occas; + delete _docfile; + delete _rdocfile; +} + +bool TContabilizzazione::load_parameters() +{ +// if (_loaded) +// return TRUE; + + TConfig conf(CONFIG_DITTA, "ve"); + + _search_seq = new TToken_string((const char*)conf.get("RICERCACR","ve")); + + // costruisce la stringa che controlla la ricerca del conto costo/ricavo + // Attenzione! non esegue alcun controllo di consistenza sulla corretta sequenza + // presuppone che il programma di configurazione abbia generato correttamente + // il tutto. + + if (_search_seq->items() == 0) + { + error_box("Non e' abilitata alcuna ricerca per il conto di costo/ricavo in configurazione."); + return FALSE; + } + _sc_enabled = conf.get_bool("GesSal","cg"); + _in_enabled = main_app().has_module(INAUT, CHK_DONGLE); + _nump_cfg = conf.get_bool("RifPro","cg"); + + int gr,co; + long so; + + gr = conf.get_int("SCOPRCODCON","ve",1); + co = conf.get_int("SCOPRCODCON","ve",2); + so = conf.get_long("SCOPRCODCON","ve",3); + _sco_perc_bill.set(gr,co,so); + + gr = conf.get_int("SCOIMCODCON","ve",1); + co = conf.get_int("SCOIMCODCON","ve",2); + so = conf.get_long("SCOIMCODCON","ve",3); + _sco_imp_bill.set(gr,co,so); + + _contsclor = conf.get_bool("CONTSCLOR","ve"); + + _ivasto = conf.get("IVASTO","ve"); + + gr = conf.get_int("SPINCODCONA","ve",1); + co = conf.get_int("SPINCODCONA","ve",2); + so = conf.get_long("SPINCODCONA","ve",3); + _spin_billa.set(gr,co,so); + + gr = conf.get_int("SPINCODCONV","ve",1); + co = conf.get_int("SPINCODCONV","ve",2); + so = conf.get_long("SPINCODCONV","ve",3); + _spin_billv.set(gr,co,so); + + gr = conf.get_int("SPBOCODCONA","ve",1); + co = conf.get_int("SPBOCODCONA","ve",2); + so = conf.get_long("SPBOCODCONA","ve",3); + _spbo_billa.set(gr,co,so); + + gr = conf.get_int("SPBOCODCONV","ve",1); + co = conf.get_int("SPBOCODCONV","ve",2); + so = conf.get_long("SPBOCODCONV","ve",3); + _spbo_billv.set(gr,co,so); + + _spin_cod = conf.get("SPINCODIVA","ve"); + _spbo_cod = conf.get("SPBOCODIVA","ve"); + + _check_prev_cont = conf.get_bool("CHECKPREVCONT","ve"); + + +// _loaded = TRUE; + + return TRUE; +} + +bool TContabilizzazione::test_swap() +{ + const char sez = _caus->sezione_clifo(); + const bool s = (_caus->reg().iva() == iva_vendite) ^ (sez == 'D'); + return s; +} + + +error_type TContabilizzazione::get_next_reg_num(long& nr) +{ + // reperisce l'ultimo numero di registrazione disponibile + _error = no_error; + TLocalisamfile& mov = _movimento->lfile(); + nr = 1L; + if (mov.last() == NOERR) + { + nr += mov.get_long(MOV_NUMREG); + if (nr <= 0) // Quando mai succede? + _error = nr_reg_error; + } + return _error; +} + +error_type TContabilizzazione::compile_head_mov(TDocumento& doc) +// Compila la testata +{ + TLocalisamfile& mov = _movimento->lfile(); + TRectype& mov_rec = mov.curr(); + + // Reperisce la data documento + TDate datadoc(doc.data()); + const bool acquisto = doc.get_char(DOC_TIPOCF) == 'F'; +/* Richiesta ritirata il 13-01-2000 + if (acquisto) + { + TDate datarif(doc.get(DOC_DATADOCRIF)); + if (datarif.ok()) + datadoc = datarif; + } +*/ + if (!datadoc.ok()) + { + _error = datadoc_error; + return _error; + } + + // reperisce la data di registrazione, che e' anche la data di competenza ed + // eventualmente la data74ter se nel registro della causale vi e' scritta l'informazione + // sulle agenzie di viaggio. + // se si e' specificata la data automatica prende invece la data del documento + TDate data_reg(_auto_data ? datadoc : _data_reg); + + // reperisce il codice anno esercizio, + int cod_es = _esc.date2esc(data_reg); + if (cod_es <= 0) + { + _error = nr_es_error; + return _error; + } + + // reperisce l'ultimo numero di registrazione disponibile + long numreg; + _error = get_next_reg_num(numreg); + if (_error != no_error) + return _error; + + TCodice_numerazione cod_num(doc.numerazione()); + // calcola il numero documento aggiungendo l'eventuale prefisso/postfisso. + TString16 numdoc(cod_num.complete_num(doc.numero())); + if (acquisto) + { + TString16 numdocrif(doc.get(DOC_NUMDOCRIF)); + if (numdocrif.not_empty()) + numdoc = numdocrif; + } + + if (numdoc.empty() || cod_num.status() != NOERR) + { + _error = nr_doc_error; + return _error; + } + numdoc.upper(); // Il numero documento e' uppercase! + + // Istanzia la causale del documento corrente... + const TTipo_documento& tipo = doc.tipo(); + TString16 codcaus(tipo.causale()); + + TToken_string key; + key.add(doc.get(DOC_TIPOCF)); + key.add(doc.get(DOC_CODCF)); + + const TRectype & cfven = cache().get(LF_CFVEN, key); + const TString16 caus_cli(cfven.get(CFV_CODCAUS)); + + if (caus_cli.not_empty()) + codcaus = caus_cli; + + _caus = new TCausale(codcaus,data_reg.year()); + if (!_caus->ok()) + { + _error = caus_error; + return _error; + } + + if (doc.in_valuta() && !_caus->valuta()) + { + _error = cauval_error; + return _error; + } + + // per reperire il tipo documento ed il tipo movimento + // reperisce la descrizione dal tipo documento e la completa con la data documento ed il + // numero documento + TString80 descr(tipo.riferimento()); + if (descr.empty()) descr = tipo.descrizione(); + + const TString16 rif = doc.get(DOC_NUMDOCRIF); + const bool use_rif = _caus->iva() == iva_acquisti && rif.not_empty(); + if (use_rif) + { + descr << " n. " << rif; + const TString & data_rif = doc.get(DOC_DATADOCRIF); + descr << " del " << data_rif; + } + else + { + descr << " n. " << doc.numero(); + descr << " del " << datadoc.string(); + } + + // Codice registro IVA + TRegistro& registro = _caus->reg(); + if (!registro.ok()) + { + _error = register_error; + return _error; + } + + long ult_prot; + if (_nump_iva == 1) // Reperisce l'ultimo numero di protocollo dal registro IVA + { + ult_prot = registro.protocol() + 1; + if (ult_prot <= 0) + { + _error = ultprot_error; + return _error; + } + } + else // oppure dal numero di documento + ult_prot = doc.numero(); + // Reperisce la valuta + TDate datacam(doc.get_date(DOC_DATACAMBIO)); + TString16 codval(doc.valuta()); + real cambio(doc.cambio()); + codval.trim(); + if (!doc.in_valuta()) + { + codval = ""; + cambio = ZERO; + } + if (codval.not_empty()) + { + _val->put("CODTAB",codval); + if (_val->read() != NOERR) + { + _error = val_error; + return _error; + } + } + // Reperisce il cambio + if ((cambio != ZERO && codval.empty()) || + cambio == ZERO && codval.not_empty()) + { + _error = change_error; + return _error; + } + + // Dati del cliente... + TString16 tipocf(doc.get(DOC_TIPOCF)); + long codcf = doc.get_long(DOC_CODCF); + TString80 occas; + { + TLocalisamfile& cli_file = _clifo->lfile(); + cli_file.put(CLI_TIPOCF,tipocf); cli_file.put(CLI_CODCF,codcf); + if (_clifo->read(_isequal) == NOERR) // posiziona il cliente una volta per tutte + { + if (cli_file.get_bool(CLI_OCCAS)) + { + occas = doc.get(DOC_OCFPI); + TLocalisamfile ocf(LF_OCCAS); + ocf.put(OCC_CFPI,occas); + if (ocf.read() != NOERR) + { + _error = clifo_error; + return _error; + } + } + } + else + { + _error = clifo_error; + return _error; + } + } + + // Codice pagamento + TString16 codpag(doc.get(DOC_CODPAG)); + if (sc_enabled() || codpag.not_empty()) // La condizione di pagamento va controllata + { // se e' abilitato il saldaconto o se e' stata inserita + _cpg->put("CODTAB",codpag); + if (_cpg->read() != NOERR) + { + _error = codpag_error; + return _error; + } + } + + // Mo' riempie il record della incornata (testata) + mov_rec.zero(); + mov_rec.put(MOV_ANNOES,cod_es); mov_rec.put(MOV_NUMREG,numreg); + mov_rec.put(MOV_DATAREG,data_reg); mov_rec.put(MOV_DATACOMP,data_reg); + if (use_rif) + { + mov_rec.put(MOV_NUMDOC, rif); + const TString & data_rif = doc.get(DOC_DATADOCRIF); + mov_rec.put(MOV_DATADOC,data_rif); + } + else + { + mov_rec.put(MOV_DATADOC,datadoc); + mov_rec.put(MOV_NUMDOC,numdoc); + } + mov_rec.put(MOV_TIPODOC,_caus->tipo_doc()); + if (registro.agenzia_viaggi()) mov_rec.put(MOV_DATA74TER,data_reg); + mov_rec.put(MOV_CODCAUS,_caus->codice()); mov_rec.put(MOV_DESCR,descr); + mov_rec.put(MOV_TIPOMOV,char(_caus->tipomov()+'0')); mov_rec.put(MOV_ANNOIVA,data_reg.year()); + mov_rec.put(MOV_REG,registro.name()); + mov_rec.put(MOV_PROTIVA,ult_prot); mov_rec.put(MOV_CODVAL,codval); + mov_rec.put(MOV_CAMBIO,cambio); mov_rec.put(MOV_TIPO,tipocf); + mov_rec.put(MOV_DATACAM,datacam); + mov_rec.put(MOV_CODCF,codcf); mov_rec.put(MOV_OCFPI,occas); + mov_rec.put(MOV_CODPAG,codpag); + TCurrency_documento totdocval(doc.totale_doc(), doc); + if (_caus->iva() == iva_acquisti) + { + const TString16 tdoc_cont(doc.tipo().totale_doc_cont()); + if (tdoc_cont.not_empty()) + totdocval.set_num(doc.get_real(tdoc_cont)); + + if (_caus->intra()) + { + TCurrency_documento imposta(doc.imposta(), doc); + totdocval -= imposta; + + imposta.change_to_firm_val(); + mov_rec.put(MOV_RITFIS, imposta.get_num()); + + TString16 codvali(_clifo->lfile().get("VALINTRA")); + real cambioi = cambio; + if (codvali.not_empty() && codvali != codval) + { + mov_rec.put(MOV_CODVALI,codvali); + TExchange c(codvali); + cambioi = c.get_base_change(); + mov_rec.put(MOV_CAMBIOI, cambioi); + } + else + { + mov_rec.put(MOV_CODVALI,codval); + mov_rec.put(MOV_CAMBIOI,cambio); + codvali = codval; + } + TCurrency corrval(totdocval); + TCurrency corrlire(corrval); + corrval.change_value(codvali, cambioi); + corrlire.change_to_firm_val(); + if (::is_true_value(codvali)) + { + mov_rec.put(MOV_CORRLIRE,corrlire.get_num()); + mov_rec.put(MOV_CORRVALUTA,corrval.get_num()); + } + else + mov_rec.put(MOV_CORRLIRE,corrval.get_num()); + } + } + else + { + if (_caus->intra()) + { + TCurrency corrval(totdocval); + TCurrency corrlire(corrval); + + mov_rec.put(MOV_CODVALI,codval); + mov_rec.put(MOV_CAMBIOI,cambio); + corrlire.change_to_firm_val(); + if (::is_true_value(codval)) + { + mov_rec.put(MOV_CORRLIRE,corrlire.get_num()); + mov_rec.put(MOV_CORRVALUTA,corrval.get_num()); + } + else + mov_rec.put(MOV_CORRLIRE,corrval.get_num()); + } + } + if (doc.in_valuta()) + { + TCurrency totdoclit(totdocval); + totdoclit.change_to_firm_val(); + mov_rec.put(MOV_TOTDOC,totdoclit.get_num()); + mov_rec.put(MOV_TOTDOCVAL,totdocval.get_num()); + } + else + mov_rec.put(MOV_TOTDOC,totdocval.get_num()); + return _error; +} + +error_type TContabilizzazione::search_costo_ricavo(TBill& conto, const TRiga_documento& r) +{ + const int items = _search_seq->items(); + TLocalisamfile & cli_file = _clifo->lfile(); // YES, arriva qui dentro quando la relazione e' gia' posizionata + const bool is_cli = cli_file.get(CLI_TIPOCF) == "C"; + bool skip_art_related = FALSE; + bool skip_clifo = _clifo->bad(); + TCodiceIVA codiva(r.get(RDOC_CODIVA)); + const char t = r.tipo().tipo(); + int gr,co; + long so; + + switch (t) + { + case 'O': // righe omaggio come articoli spiaccicato identico (avranno imponibile 0) + case 'M': // righe di merce + { + // posiziona l'anagrafica sull'articolo specificato sulla ..iga + _anamag->put(ANAMAG_CODART,r.get(RDOC_CODART)); + if (_anamag->read() != NOERR) // se non trova l'articolo saltera' anche gmc,smc,rfa. + skip_art_related = TRUE; + + TString16 tok; + // Scorre la stringa di ricerca + for (int i=0;good() && iget(i); + if (tok == "CF") + { + if (skip_clifo) continue; + gr = cli_file.get_int(CLI_GRUPPORIC); + co = cli_file.get_int(CLI_CONTORIC); + so = cli_file.get_long(CLI_SOTTOCRIC); + conto.set(gr,co,so); + if (conto.ok()) break; // se lo trova esce (tutti != 0) + } + else + if (tok == "CA") + { + CHECK(_caus,"Causale documento non valida"); + if (_caus->IVA2bill(codiva,conto)) break; // se lo trova esce + } + else + if (tok == "AR") + { + if (skip_art_related) continue; + gr = _anamag->get_int(is_cli ? ANAMAG_GRUPPOV : ANAMAG_GRUPPOA); + co = _anamag->get_int(is_cli ? ANAMAG_CONTOV : ANAMAG_CONTOA); + so = _anamag->get_long(is_cli ? ANAMAG_SOTTOCV : ANAMAG_SOTTOCA); + conto.set(gr,co,so); + if (!conto.ok()) // se il conto non c'e' guarda la categoria acquisti/vendite + { + TTable *t = is_cli ? _cra : _caa; + + t->put("CODTAB",_anamag->get(is_cli ? ANAMAG_CATCONV : ANAMAG_CATCONA)); + if (t->read() == NOERR) + { + gr = atoi(t->get("S1")); + co = atoi(t->get("S2")); + so = atol(t->get("S3")); + conto.set(gr,co,so); + } + } + if (conto.ok()) break; + } + else + if (tok == "GM" || tok == "SM" || tok == "RF") + { + if (skip_art_related) continue; + const bool is_fis = tok == "RF"; + TTable * tab = is_fis ? _rfa : _gmc; + TString16 codtab(_anamag->get(is_fis ? ANAMAG_RAGGFIS : ANAMAG_GRMERC)); + if (tok == "GM" && codtab.len() > 3) + codtab.cut(3); // gli ultimi 2 si riferiscono al sottogruppo. + tab->put("CODTAB",codtab); + if (tab->read() == NOERR) + { + gr = tab->get_int(is_cli ? "I3" : "I0"); + co = tab->get_int(is_cli ? "I4" : "I1"); + so = tab->get_long(is_cli ? "I5" : "I2"); + conto.set(gr,co,so); + } + if (conto.ok()) break; + } + else + if (tok == "CV" || tok == "CC") + { + const bool is_cve = tok == "CV"; + if (is_cve && !is_cli) continue; // se e' un fornitore salta questa condizione + TTable* t = is_cve ? _cve : _cco; + TString16 cod(is_cve ? r.doc().get(DOC_CATVEN) : EMPTY_STRING); + if (cod.empty()) + { + if (skip_clifo) continue; // se non aveva trovato il cliente salta al prossimo + cod = _clifo->lfile(LF_CFVEN).get(is_cve ? CFV_CATVEN : CFV_CODCATC); + } + t->put("CODTAB",cod); + if (t->read() == NOERR) + { + const bool x =(is_cve || is_cli); + gr = t->get_int(x ? "I3" : "I0"); + co = t->get_int(x ? "I4" : "I1"); + so = t->get_long(x ? "I5": "I2"); + conto.set(gr,co,so); + } + if (conto.ok()) break; + } + } + break; // case 'M' + } + case 'P': // righe prestazione + case 'S': // righe spese + { + TTable* tab = t == 'P' ? _prs : _spp; + tab->put("CODTAB",r.get(RDOC_CODART)); + if (tab->read()==NOERR) + { + gr = tab->get_int(is_cli ? "I0" : "I3"); + co = tab->get_int(is_cli ? "I1" : "I4"); + so = tab->get_long(is_cli ? "I2" : "I5"); + conto.set(gr,co,so); + if (!is_cli && !conto.ok()) + { + gr = r.get_int("QTAGG1"); + co = r.get_int("QTAGG2"); + so = r.get_long("QTAGG3"); + conto.set(gr,co,so); + } + } + + if (!conto.find() && t == 'P') // Cerca il conto nella stringa di ricerca (solo per prestazioni) + { + TString16 tok; + // Scorre la stringa di ricerca ma solo per causale o CLI/FO + for (int i=0;good() && iget(i); + if (tok == "CF") + { + if (skip_clifo) continue; + gr = cli_file.get_int(CLI_GRUPPORIC); + co = cli_file.get_int(CLI_CONTORIC); + so = cli_file.get_long(CLI_SOTTOCRIC); + conto.set(gr,co,so); + if (conto.ok()) break; + } + else + if (tok == "CA") + { + CHECK(_caus,"Causale documento non valida"); + if (_caus->IVA2bill(codiva,conto)) break; + } + } + } + break; // case 'P','S' + } + case 'C': + // righe sconti: vengono considerate in adjust_sconto_rows() + case 'D': // righe descrizioni (saltare) + default : + break; + } // end of switch + if (good()) + { + if (conto.ok() == 0 || !conto.find()) + { + _conto_errato = conto; + _error = conto_error; + } + } + return _error; +} + +error_type TContabilizzazione::add_iva_row(const TBill& conto, const TRiga_documento& r, const int ndec, const real p) +// Aggiunge le righe iva all'assoc_array di raggruppamento +{ + TIVA_element el_tmp; + const TCodiceIVA& tiva = r.iva(); + TString16 cod(tiva.codice()); + const char tipo = conto.tipo(); + const int gr = conto.gruppo(); + const int co = conto.conto(); + const long so = conto.sottoconto(); + TString80 key; + const char tipo_r = r.tipo().tipo(); + const bool sconto_lordo = tipo_r != 'C' && _contsclor && _sco_perc_bill.ok(); + bool exists; + int ord=0; + // Ordine con cui vengono immesse le righe IVA: + // merce, omaggi, prestazioni, spese, bolli/spese d'incasso, sconti. + + switch (tipo_r) + { + case 'M': + ord = 1; + break; + case 'O': + ord = 2; + break; + case 'P': + ord = 3; + break; + case 'S': + ord = 4; + break; + default: break; + } + + // Le righe di sconto ad importo o percentuale vanno saltate + if (tipo_r != 'C') + { + key.format("%d|%-4s|%c|%3d|%3d|%6ld",ord,(const char*)cod,tipo,gr,co,so); + exists = _righe_iva.is_key(key); + TIVA_element& el = (exists ? (TIVA_element&)_righe_iva[key] : el_tmp); + + // Casistica sulle righe omaggio: + // quelle che non hanno addebito IVA devono venire scartate, quelle che hanno + // addebito IVA vengono aggiunte normalmente ed in piu' viene aggiunta + // una riga IVA con lo stesso imponibile ma di segno opposto, con un cod. IVA + // speciale per lo storno, proveniente da configurazione + if (tipo_r == 'O') + { + if (_ivasto.empty()) + { + _error = ivasto_error; + return _error; + } + + real imp_om = r.imponibile_omaggio() * p; + imp_om.round(ndec); + + // Aggiunge la riga "normale" + + el.imp() += imp_om; + el.iva() += tiva.imposta(imp_om, ndec);// imposta calcolata sullo sconto + el.ali() = tiva.percentuale(); + el.cod_iva() = tiva.codice(); + _righe_iva.add(key,el,exists); + + // Aggiunge la riga di "compensazione" imponibile (segno meno) + TCodiceIVA tiva_sto(_ivasto); + key.format("%d|%-4s|%c|%3d|%3d|%6ld",ord,(const char*)_ivasto,tipo,gr,co,so); + exists = _righe_iva.is_key(key); + el_tmp.zero(); + + TIVA_element& el_om = (exists ? (TIVA_element&)_righe_iva[key] : el_tmp); + + el_om.cod_iva() = _ivasto; + el_om.imp() += -imp_om; // Note negative sign on the left... + + real iva_om = tiva_sto.imposta(imp_om, ndec);// imposta: dovrebbe essere sempre ZERO; in caso contrario si avra' un movimento NON quadrato + el_om.iva() += iva_om; // Could of Been Should of Been Would of Been + el_om.ali() = tiva_sto.percentuale(); + + _righe_iva.add(key,el_om,exists); + } + else // Any other kind of row... + { + //el.add(r,sconto_lordo,ndec); // Inserisce la riga IVA al netto o al lordo dello sconto + real iimmpp, iivvaa; + if (!sconto_lordo) // Al netto dello sconto + iimmpp = r.imponibile() * p; + else + iimmpp = r.importo(FALSE,FALSE,ndec) * p; // Imponibile della riga al lordo dello sconto + iimmpp.round(ndec); + iivvaa = tiva.imposta(iimmpp,ndec); + + if (!iimmpp.is_zero() || !iivvaa.is_zero()) + { + el.imp() += iimmpp; + el.iva() += iivvaa; + el.ali() = tiva.percentuale(); + el.cod_iva() = tiva.codice(); + _righe_iva.add(key,el,exists); // Le righe di sconto le aggiorna dopo + } + + if (r.doc().tipo().calcolo_lordo()) // Si ricorda che calcolo_lordo() e fattura_commerciale() sono esclusivi. + { + // Totalizza per ogni codice iva il lordo + if (!_totali_lordi.is_key(cod)) + _totali_lordi.add(cod, new real); + real& rl = (real&) _totali_lordi[cod]; + rl += r.imponibile(TRUE); + } + } + } + + if (sconto_lordo) // Se e' settato il flag di contabilizzare anche gli sconti merce + { + real sconto, ivasc; + + sconto = - (r.sconto() * p); // Imponibile dello sconto (positivo, quindi si cambia di segno) + sconto.round(ndec); + + if (sconto != ZERO) // Le righe Omaggio con Addebito IVA hanno comunque sconto ZERO! + { + key.format("6|%-4s|%c|%3d|%3d|%6ld", + (const char*)cod, + _sco_perc_bill.tipo(), + _sco_perc_bill.gruppo(), + _sco_perc_bill.conto(), + _sco_perc_bill.sottoconto()); + + el_tmp.zero(); + exists = _righe_iva.is_key(key); + TIVA_element& el_sc = (exists ? (TIVA_element&)_righe_iva[key] : el_tmp); + el_sc.ali() = tiva.percentuale(); + el_sc.cod_iva() = tiva.codice(); + el_sc.imp() += sconto; + el_sc.iva() += ivasc; + _righe_iva.add(key,el_sc,exists); // Sostituisce od aggiunge la riga relativa allo sconto + } + } + return no_error; +} + +void TContabilizzazione::calculate_spese(real& spese, real& sp_iva, int ndec, bool is_incasso, bool is_cli, const TString & codiva_es, const TDocumento & doc) +{ + char tipo; + int gr,co; + long so; + const TBill& zio = is_incasso ? (is_cli ? _spin_billv : _spin_billa) : (is_cli ? _spbo_billv : _spbo_billa); + TCodiceIVA sp_cod((is_incasso ? (codiva_es.not_empty() ? codiva_es : (const TString &) _spin_cod) : (const TString &) _spbo_cod)); + TIVA_element el_tmp; + TString80 key; + + if (zio.ok()) + { + sp_iva = sp_cod.imposta(spese, ndec); + tipo = zio.tipo(); + gr = zio.gruppo(); + co = zio.conto(); + so = zio.sottoconto(); + key.format("5|%-4s|%c|%3d|%3d|%6ld",(const char*)sp_cod.codice(),tipo,gr,co,so); + const bool exists = _righe_iva.is_key(key); + TIVA_element& el = (exists ? (TIVA_element&)_righe_iva[key] : el_tmp); + el.imp() += spese; + el.iva() += sp_iva; + el.ali() = sp_cod.percentuale(); + _righe_iva.add(key,el,exists); + if (doc.tipo().calcolo_lordo()) // Si ricorda che calcolo_lordo() e fattura_commerciale sono esclusivi. + { + // Totalizza per ogni codice iva il lordo + const TString16 codiva(sp_cod.codice()); + + if (!_totali_lordi.is_key(codiva)) + _totali_lordi.add(codiva, new real); + real& rl = (real&) _totali_lordi[codiva]; + rl += spese + sp_iva; + } + } + else + _error = spinbo_error; +} + +error_type TContabilizzazione::add_spese_inbo(TDocumento& doc, const int ndec) +// Aggiunge le righe di spese incasso/bolli +{ + real tot_netto, sp_incasso, sp_bolli; + real iva_sp_incasso, iva_sp_bolli; + bool is_cli = doc.get(DOC_TIPOCF) == "C"; + // Aggiunge le spese d'incasso + tot_netto = doc.totale_netto(); + sp_incasso = doc.spese_incasso(tot_netto,ndec,_netto); + TString16 codiva_es; + + doc.iva_esente(codiva_es); + if (sp_incasso != 0.0) + calculate_spese(sp_incasso,iva_sp_incasso,ndec,TRUE,is_cli, codiva_es, doc); + + // Aggiunge le spese bolli + tot_netto += sp_incasso + iva_sp_incasso; + sp_bolli = doc.bolli(tot_netto,ndec, _netto); + if (sp_bolli != 0) + calculate_spese(sp_bolli, iva_sp_bolli, ndec, FALSE, is_cli, "", doc); + + return _error; +} + +// Aggiorna le righe di sconto (importo o a percentuale) +error_type TContabilizzazione::adjust_sconto_rows(TDocumento& doc) +{ + TIVA_element el_tmp; + TAssoc_array& aa = doc.tabella_iva(); + TRiepilogo_iva * riep; + TString16 cod; // Codice IVA corrente + TString80 key; + real sconto,iva; + const int ndec = doc.in_valuta() ? 3 : 0; + + if (!_sco_imp_bill.ok() || !_sco_perc_bill.ok()) + { + _error = sconto_error; + return _error; + } + + // Scorre tutti gli elementi della tabella IVA del documento (elementi per codice iva) + for (riep = (TRiepilogo_iva*) aa.first_item(); riep != NULL; riep = (TRiepilogo_iva*) aa.succ_item()) + { + const TCodiceIVA& codiva = riep->cod_iva(); + cod = codiva.codice(); // Codice IVA + for (int i = 0; i < 2; i++) // Ciclo per sconto a percentuale (i == 0) e ad importo (i == 1) + { + //Importo sconto (sconto_perc() o sconto_imp()) + //Calcola ::iva() sullo sconto + //Somma alla riga corrispondente o la crea se non esiste gia' + //I conti per aggiustare l'iva vengono fatti in adjust_iva_rows() + const bool perc = i == 0; + TBill& conto = perc ? _sco_perc_bill : _sco_imp_bill; + sconto = perc ? riep->sconto_perc() : riep->sconto_imp(); + iva = codiva.imposta(sconto, ndec); + if (sconto != ZERO) + { + key.format("6|%-4s|%c|%3d|%3d|%6ld",(const char*)cod, + conto.tipo(), + conto.gruppo(), + conto.conto(), + conto.sottoconto()); + const bool exists = _righe_iva.is_key(key); + // Aggiorna imponibile ed imposta all'elemento relativo + el_tmp.zero(); + TIVA_element& el = exists ? (TIVA_element&)_righe_iva[key] : el_tmp; + el.imp() += sconto; + el.iva() += iva; + el.ali() = codiva.percentuale(); + el.cod_iva() = cod; + _righe_iva.add(key,el,exists); + if (doc.tipo().calcolo_lordo()) // Si ricorda che calcolo_lordo() e fattura_commerciale() sono esclusivi. + { + // Totalizza per ogni codice iva il lordo + if (!_totali_lordi.is_key(cod)) + _totali_lordi.add(cod, new real); + real& rl = (real&) _totali_lordi[cod]; + rl += sconto + iva; + } + } + } + } + return no_error; +} + +static real inc_field(TRectype& rec, const char* field, real diff) +{ + real val = rec.get_real(field); + val += diff; + rec.put(field, val); + return val; +} + +// "Aggiusta" l'imposta sulle righe IVA secondo la tabella interna al documento +// Tratta anche i documenti in valuta. DI solito si tratta di poche lire. +error_type TContabilizzazione::adjust_iva_rows(TDocumento& doc) +{ + TAssoc_array& aa = doc.tabella_iva(); + TRiepilogo_iva * riep; + const int items = _movimento->iva_items();// Numero di righe IVA + const bool in_valuta = doc.in_valuta(); + const real cambio = doc.cambio(); + const bool calcolo_lordo = doc.tipo().calcolo_lordo(); + real imponibile; + const int ndec = TCurrency::get_firm_dec(); + const TString16 codval(doc.get(DOC_CODVAL)); + const exchange_type et = doc.get_bool(DOC_CONTROEURO) ? _exchange_contro : _exchange_base; + // Scorre tutti gli elementi della tabella IVA del documento (elementi per codice iva) + for (riep = (TRiepilogo_iva*) aa.first_item(); riep != NULL; riep = (TRiepilogo_iva*) aa.succ_item()) + { + const TCodiceIVA & cod = riep->cod_iva(); // Codice IVA + const TString16 codiva(cod.codice()); + real iva_g; + if (calcolo_lordo) + { + imponibile = _totali_lordi.is_key(codiva) ? (real&)_totali_lordi[codiva] : ZERO; + iva_g = cod.scorpora(imponibile, doc.decimals()); + } + else + iva_g = riep->imposta(); + + if (in_valuta) + { + TCurrency_documento iva(iva_g, doc); + + iva.change_to_firm_val(); + iva_g = iva.get_num(); + } + else + { + if (ndec == 0) + { + TExchange cam(codval, cambio, et); + + iva_g *= cam.get_base_change(); + if (iva_g < ZERO) + iva_g.floor(0); + else + iva_g.ceil(0); + } + else + { + TCurrency_documento iva(iva_g); + + iva.change_to_firm_val(); + iva_g = iva.get_value(); + } + } + + TGeneric_distrib gd_iva(iva_g, ndec); // Instanzia il TGeneric_ditrib con la vera Imposta + TGeneric_distrib gd_imp(imponibile, ndec); + // Adesso scorre tutte le righe IVA contabili con questo codice IVA + for (int i = 0; i < items; i++) + { + TRectype& ie = _movimento->iva(i); + if (ie.get(RMI_CODIVA) == codiva) // Se il codice IVA e' uguale + { + gd_iva.add(ie.get_real(RMI_IMPOSTA)); // Aggiunge al TGeneric_distrib l'imposta corrente + if (calcolo_lordo) + gd_imp.add(ie.get_real(RMI_IMPONIBILE)); + } + } + // Alla fine per performare tutto il calcolo (Thanx to TGeneric_distrib) si fanno le get + // E le si mettono nel rispettivo record IVA + + for (i = 0; i < items; i++) + { + TRectype& ie = _movimento->iva(i); + if (ie.get(RMI_CODIVA) == codiva) // Se il codice IVA e' uguale + { + ie.put(RMI_IMPOSTA,gd_iva.get()); // Sostituisce l'imposta con quella ricalcolata al fine di avere tutto giusto + if (calcolo_lordo) + ie.put(RMI_IMPONIBILE, gd_imp.get()); + } + } + } // Visto che vengono restituiti nello stesso ordine in cui sono state chiamate le rispettive TGeneric_distrib::add() + + if (_caus->iva() == iva_acquisti && items > 0) + { + const TString16 tdoc_cont(doc.tipo().totale_doc_cont()); + if (tdoc_cont.not_empty()) + { + real diffval = doc.get_real(tdoc_cont) - doc.totale_doc(); + TCurrency_documento dv(diffval, doc); + dv.change_to_firm_val(); + real difflit = dv.get_num(); + if (!difflit.is_zero()) // Controlla se c'è differenza + { + TRectype& rigaiva = _movimento->iva(0); + + TCodiceIVA iva(rigaiva.get(RMI_CODIVA)); + + if (_caus->intra()) + { + const real imponibile = inc_field(rigaiva, RMI_IMPONIBILE, difflit); + const real imposta = iva.imposta(imponibile); + rigaiva.put(RMI_IMPOSTA, imposta); + } + else + { + real diffimp = iva.scorpora(difflit); + inc_field(rigaiva, RMI_IMPONIBILE, difflit); + inc_field(rigaiva, RMI_IMPOSTA, diffimp); + } + } + if (_caus->intra()) + { + real ritfis = ZERO; + for (int i = 0; i < items; i++) + ritfis += _movimento->iva(i).get_real(RMI_IMPOSTA); + + _movimento->curr().put(MOV_RITFIS, ritfis); + } + } + } + + return no_error; +} + +error_type TContabilizzazione::create_iva_rows(TDocumento& doc) +{ + const int items = _righe_iva.items(); + const bool in_valuta = doc.in_valuta(); + TRectype& head = _movimento->curr(); + int gr,co; + long so; + char tipo; + TToken_string key; + TString_array key_arr; + TString16 codiva; + TBill conto; + + const int annoes = head.get_int(MOV_ANNOES); + const long numreg = head.get_long(MOV_NUMREG); + real cambio = head.get_real(MOV_CAMBIO); + real imponibile,imposta; + + _righe_iva.get_keys(key_arr); + key_arr.sort(); + + TIVA_element cur; + TString16 valuta(doc.valuta()); + + for (int i = 0, nr = 0; i < items; i++) + { + key = key_arr.row(i); + cur = (TIVA_element&) _righe_iva[key]; + codiva = key.get(1); + tipo = key.get_char(2); + gr = key.get_int(3); + co = key.get_int(4); + so = atol(key.get(5)); + conto.set(gr,co,so,tipo); + conto.find(); + imponibile = cur.imp(); + if (in_valuta) // I documenti vanno sempre contabilizzati in lire + { + TCurrency_documento imponval(cur.imp(), doc); + imponval.change_to_firm_val(); + imponibile = imponval.get_num(); // imponibile in lire + TCurrency_documento impval(cur.iva(), doc); + impval.change_to_firm_val(); + + imposta = impval.get_num(); // questa e' l'imposta ricalcolata + } + else + imposta = cur.iva(); + if (imponibile != ZERO && codiva.not_empty()) + { + TRectype& rec_iva = _movimento->iva(nr); + rec_iva.put(RMI_ANNOES,annoes); + rec_iva.put(RMI_NUMREG,numreg); + rec_iva.put(RMI_NUMRIG,nr+1); // La numerazione comincia da 1 + rec_iva.put(RMI_CODIVA,codiva); + rec_iva.put(RMI_IMPONIBILE,imponibile); + rec_iva.put(RMI_IMPOSTA,imposta); + rec_iva.put(RMI_TIPOCR,conto.tipo_cr()); + rec_iva.put(RMI_INTRA,_caus->intra()); + rec_iva.put(RMI_TIPOC,conto.tipo()); + rec_iva.put(RMI_GRUPPO,conto.gruppo()); + rec_iva.put(RMI_CONTO,conto.conto()); + rec_iva.put(RMI_SOTTOCONTO,conto.sottoconto()); + nr++; + } + } + return _error; +} + +error_type TContabilizzazione::create_total_doc_row(TDocumento& doc) +// Crea la riga contabile di totale documento +{ + TRectype& rec_cg = _movimento->cg(0); + TRectype& head = _movimento->lfile().curr(); + const int annoes = head.get_int(MOV_ANNOES); + const long numreg = head.get_long(MOV_NUMREG); + TDate datareg(head.get_date(MOV_DATAREG)); + real totdoc(head.get_real(MOV_TOTDOC)); + + TLocalisamfile& cli_file = _clifo->lfile(); + TString16 tipocf(cli_file.get(CLI_TIPOCF)); + const long codcf = cli_file.get_long(CLI_CODCF); + int gruppo = 0, conto = 0; + + TString16 catven(doc.get(DOC_CATVEN)); + + if (search_clifo_bill(catven) == no_error) + { + gruppo = _co_cliente.gruppo(); + conto = _co_cliente.conto(); + } + else + { + _conto_errato = _co_cliente; + _error = conto_error; + } + + TString descr = head.get(MOV_DESCR);// La descrizione della riga di totale documento la prende dalla testata + + TConto contro; + if (_movimento->iva_items()) + { + TRectype& first_iva_row = _movimento->iva(0); + contro.get(first_iva_row); + } + + rec_cg.put(RMV_ANNOES,annoes);rec_cg.put(RMV_NUMREG,numreg); + const char sezione = _caus->sezione(1); + rec_cg.put(RMV_NUMRIG,1); rec_cg.put(RMV_SEZIONE, sezione); // qui + rec_cg.put(RMV_DATAREG,datareg); rec_cg.put(RMV_TIPOC,tipocf); + rec_cg.put(RMV_GRUPPO,gruppo);rec_cg.put(RMV_CONTO,conto); + rec_cg.put(RMV_SOTTOCONTO,codcf); rec_cg.put(RMV_DESCR,descr); + contro.put(rec_cg, TRUE); + rec_cg.put(RMV_IMPORTO,totdoc); rec_cg.put(RMV_ROWTYPE,"T"); + + return _error; +} + +error_type TContabilizzazione::compile_rows_mov(TDocumento& doc) +// Compila le righe +{ + TString16 tiporiga, codiva1, codiva2; + const int rows = doc.rows(); + const int ndec = doc.decimals(); + const bool fat_com = doc.tipo().fattura_commerciale(); + + static TString_array tabella_ripartizione; + + if (fat_com && tabella_ripartizione.items() == 0) + { + TConfig cnf(CONFIG_STUDIO); + for (int k = 1; k <= MAX_IVA_SLICES; k++) + { + TToken_string* tt = new TToken_string(); + tt->add(cnf.get("EXCLUDE_PERC", "ve", k)); + tt->add(cnf.get("EXCLUDE_IVA", "ve", k)); + tabella_ripartizione.add(tt); + } + } + + _righe_iva.destroy(); // resetta l'assoc_array delle righe di iva + _totali_lordi.destroy();// resetta l'assoc_array dei totali lordi + for (int i=1; good() && i<=rows; i++) // browse all this fucked document rows + { + TRiga_documento& r = doc[i]; + tiporiga = r.get(RDOC_TIPORIGA); + _tri->put("CODTAB",tiporiga); + if (_tri->read() == NOERR) // controlla l'esistenza della riga + { + TBill conto; + const char tipo = r.tipo().tipo(); + // Le righe omaggio senza addebito IVA vanno saltate + const bool riga_omaggio = r.get_bool(RDOC_ADDIVA) && tipo == 'O'; + if ((tipo != 'D' && tipo != 'C') || riga_omaggio) + { + search_costo_ricavo(conto,r); // l'errore eventuale viene settato qui dentro + if (good()) + { + if (fat_com) + { + codiva2 = r.get(RDOC_CODIVA); // Save... + for (int j=0; j < MAX_IVA_SLICES; j++) + { + real perc = tabella_ripartizione.row(j).get(0); + + perc /= 100.0; + codiva1 = tabella_ripartizione.row(j).get(1); + if (perc == ZERO || codiva1.trim().empty()) + continue; + + r.put(RDOC_CODIVA, codiva1); + add_iva_row(conto, r, ALL_DECIMALS, perc); + } + r.put(RDOC_CODIVA, codiva2); //Restore + } + else + add_iva_row(conto, r, ALL_DECIMALS, 1.0); + } + } + } + else + _error = row_type_error; + } + + if (good() && _righe_iva.items() == 0) + _error = no_rows_error; + + // Crea le righe per le spese d'incasso e bolli + if (good()) + add_spese_inbo(doc,ndec); + + // Aggiorna le righe di sconto (sconto ad importo o percentuale) + if (good()) + adjust_sconto_rows(doc); + + // Crea le righe di IVA + if (good()) + create_iva_rows(doc); + + // Controlla che le imposte per ogni aliquota ed eventualmente corregge le imposte stesse sulle righe + if (good()) + adjust_iva_rows(doc); + + // Crea la riga di totale documento + if (good()) + create_total_doc_row(doc); + // crea le righe di contabilita' + if (good()) + { + const TString descr_cr(doc.clifor().get(CLI_RAGSOC)); + + switch (_movimento->recalc_cg_rows(descr_cr, _caus)) + { + case 1 : + _error = movement_error; + break; + case 2 : + _error = cau_ritintra_error; + break; + default : + break; + } + } + return _error; +} + +error_type TContabilizzazione::change_doc_status(TDocumento& doc) +// Cambia lo stato del documento +{ + doc.stato(get_char("S4")); + if (doc.rewrite() != NOERR) + _error = chg_stat_error; + return _error; +} + +error_type TContabilizzazione::write_scadenze(TDocumento& doc) +// Scrive le scadenze. Liberamente tratto da cg2104.cpp. +{ + TRectype& head = _movimento->curr(); + const long nreg = head.get_long(MOV_NUMREG); + +// const real change(head.get_real(MOV_CAMBIO)); + int anno = head.get_int(MOV_ANNOIVA); + TString16 numpart = doc.get(DOC_NUMDOCRIF); + + if (numpart.blank()) + { + numpart = head.get(_nump_cfg ? MOV_PROTIVA : MOV_NUMDOC); + } + else + { + TDate ddr = doc.get(DOC_DATADOCRIF); + if (ddr.ok()) + anno = ddr.year(); + } + + TPartita* newgame = NULL; + if (anno > 0 && !numpart.blank()) + { + const int tmov = _caus->tipomov(); + const TString80 desc(head.get(MOV_DESCR)); + const TString4 codcaus(_caus->codice()); + const TString4 v(head.get(MOV_CODVAL)); + const TDate d(head.get_date(MOV_DATACAM)); + const real c(head.get_real(MOV_CAMBIO)); + const TValuta cambio(v, d, c); // verificare + const TString8 agente(doc.get(DOC_CODAG)); + const int ndec = doc.decimals(); + const char sezione = _movimento->cg(0).get_char(RMV_SEZIONE); // Dare/Avere + +/* const char tipocf = head.get_char(MOV_TIPO); + const long codcf = head.get_long(MOV_CODCF); + const TBill clifo(0,0,codcf,tipocf); + newgame = new TPartita(clifo, anno, numpart); */ + newgame = new TPartita(_co_cliente, anno, numpart); + newgame->allinea(); // Rispettare sempre l'allineamento del numero partita! + + int row = 0; + if (tmov == tm_fattura) + row = newgame->prima_fattura(nreg); // Riga fattura di questo movimento + TRiga_partite& partita = row <= 0 ? newgame->new_row() : newgame->riga(row); + const int nuova_riga = partita.get_int(PART_NRIGA); + + // put data on partita + partita.put(PART_TIPOMOV, tmov); + partita.put(PART_NREG, nreg); + partita.put(PART_NUMRIG, 1); + partita.put(PART_DATAREG, head.get_date(MOV_DATAREG)); + partita.put(PART_DATADOC, head.get_date(MOV_DATADOC)); + partita.put(PART_NUMDOC, head.get(MOV_NUMDOC)); + partita.put(PART_DESCR, desc); + partita.put(PART_CODCAUS, codcaus); + partita.put(PART_REG, _caus->reg().name()); + partita.put(PART_PROTIVA, head.get_long(MOV_PROTIVA)); + partita.put(PART_SEZ, sezione); + + const real totdoc(head.get(MOV_TOTDOC)); + const real totdocval(head.get(MOV_TOTDOCVAL)); + const bool in_valuta = cambio.in_valuta(); + const TCurrency_documento td((in_valuta ? totdocval : totdoc) * (test_swap() ? -1 : 1), doc); + + partita.put(PART_IMPTOTDOC, totdoc); + + cambio.put(partita); + if (in_valuta) + partita.put(PART_IMPTOTVAL,totdocval); + + if (partita.is_fattura()) + { + TPagamento& pag = doc.pagamento(); + const TCurrency_documento totspese(doc.spese(), doc); + TCurrency_documento totimposte(doc.imposta(TRUE), doc); + + real imposte; + for (int j = _movimento->iva_items()-1; j >= 0; j--) + imposte += _movimento->iva(j).get_real(RMI_IMPOSTA); + if (_caus->iva() == iva_acquisti) // Ricalcola precisamente il totale imposte + { + real ti = imposte; + if (in_valuta) + cambio.lit2val(ti); + totimposte.set_num(ti); + } +// else +// { +// TCurrency ti = totimposte; +// ti.change_to_firm_val(); +// imposte = ti.get_num(); +// } + + const TCurrency totimponibili = td - totimposte - totspese; + TCurrency_documento anticipo(doc.get_real(DOC_IMPPAGATO), doc); + + if (anticipo.abs() < td.abs()) + { + TGeneric_distrib d(anticipo.get_num(), ndec); + + d.add(totimponibili.get_num()); + d.add(totimposte.get_num()); + d.add(totspese.get_num()); + + const TCurrency_documento pagtotimponibili(totimponibili.get_num() - d.get(), doc); + TCurrency_documento diffiva(d.get(), doc); + const TCurrency_documento pagtotimposte (totimposte.get_num() - diffiva.get_num(), doc); + const TCurrency_documento pagtotspese (totspese.get_num() - d.get(), doc); + + if (in_valuta) + { + const real change = cambio.cambio(); + //real val1 = totimponibili * change; + TCurrency val2(imposte); diffiva.change_to_firm_val(); val2 -= diffiva; + TCurrency_documento val3(pagtotspese); val3.change_to_firm_val(); + TCurrency val1(totdoc); + TCurrency_documento ant(anticipo.get_num(), doc); + ant.change_to_firm_val(); + val1 -= ant + val2 + val3; + // Cosi' corregge eventuali scompensi di poche lirette + pag.set_total_valuta(pagtotimponibili, pagtotimposte, pagtotspese, val1, val2, val3); + } + else + pag.set_total( pagtotimponibili, pagtotimposte, pagtotspese); + pag.set_rate_auto( ); + } + else + pag.zap_rate(); + + if (!anticipo.is_zero()) + { + pag.add_rata(); + + TDate first_date(doc.data()); + TDate first_scad(pag.data_rata(0)); + + if (first_date == first_scad) + pag.set_datarata(0, ++first_scad); // Sposta in avanti la data della prima scadenza di un giorno. + + // Shift delle rate verso il basso + for (int k=pag.n_rate()-1; k>0; k--) + pag.rata(k) = pag.rata(k-1); + + // Sostituisce la prima rata con quella dell'anticipo + + // Se l'anticipo è più grande del totale, si crea una riga di scadenza + // con l'importo del totale doc. + if (anticipo.abs() >= td.abs()) + anticipo = td; + + TCurrency_documento anticipo_base(anticipo); anticipo_base.change_to_firm_val(); + + // Crea una rimessa diretta con la data del documento per il valore dell'anticipo + pag.set_rata(0, in_valuta ? anticipo.get_num() : ZERO, anticipo_base.get_num(), first_date, 1, "", FALSE); + } + + real imponibile, imponibile_val; + for (int i = pag.n_rate()-1; i >= 0; i--) + { + if (in_valuta) + imponibile_val += pag.tval_rata(i); + imponibile += pag.tlit_rata(i); + } + partita.put(PART_IMPORTO, imponibile); + partita.put(PART_IMPORTOVAL, imponibile_val); + partita.put(PART_IMPOSTA, imposte); + partita.put(PART_SPESE, totspese.get_num()); + + partita.elimina_rata(-1); // Elimina tutte le rate eventuali + const TString8 abipr(doc.get(DOC_CODABIP)), cabpr(doc.get(DOC_CODCABP)), + abi(doc.get(DOC_CODABIA)), cab(doc.get(DOC_CODCABA)); + + const int nr = pag.n_rate(); + const TString16 codpag(head.get(MOV_CODPAG)); + for (i = 0; i < nr; i++) + { + TRiga_scadenze& scadenza = partita.new_row(); + + scadenza.put(SCAD_CODPAG, codpag); // Codice pagamento + scadenza.put(SCAD_CODAG, agente); // Codice agente + + scadenza.put(SCAD_DATASCAD, pag.data_rata(i)); // Data scadenza + scadenza.put(SCAD_IMPORTO, pag.tlit_rata(i)); // Importo + if (in_valuta) + scadenza.put(SCAD_IMPORTOVAL, pag.tval_rata(i)); // Importo in valuta + scadenza.put(SCAD_TIPOPAG, pag.tipo_rata(i)); // Tipo pagamento + scadenza.put(SCAD_ULTCLASS, pag.ulc_rata(i)); // Ulteriore classificazione + scadenza.put(SCAD_CODABIPR, abipr); // Ns ABI + scadenza.put(SCAD_CODCABPR, cabpr); // Ns CAB + scadenza.put(SCAD_CODABI, abi); // Vs ABI + scadenza.put(SCAD_CODCAB, cab); // Vs CAB + // scadenza.put(SCAD_DESCR, ????); // Note + } + } // if fattura + else if (doc.is_nota_credito()) + { + TImporto residuoval(sezione, doc.totale_doc()); + partita.put(PART_DATAPAG, doc.get(DOC_DATADOC)); + partita.put(PART_TIPOPAG, doc.pagamento().tipo_rata(0)); + + // Attenzione: le note di credito possono avere in testata valori negativi! Qui vanno positivi. + partita.put(PART_IMPTOTDOC, abs(totdoc)); + partita.put(PART_IMPTOTVAL, abs(totdocval)); + + // Attenzione: l'importo giusto viene poi aggiornato dalla modifica pagamento + partita.zero(PART_IMPORTO); + partita.zero(PART_IMPORTOVAL); + + const TDate datadocrif = doc.get_date(DOC_DATADOCRIF); + const TString16 numdocrif = doc.get(DOC_NUMDOCRIF); + for (int p = newgame->prima_fattura(); p > 0 && p < nuova_riga; p++) + { + const TRiga_partite& fatt = newgame->riga(p); + const TDate datadoc = fatt.get(PART_DATADOC); + const TString16 numdoc = fatt.get(PART_NUMDOC); + if (datadoc.year() == datadocrif.year() && numdoc == numdocrif) + break; + } + if (p > 0 && p < nuova_riga) + { + TPagamento& pag = doc.pagamento(); + + TCurrency_documento totdoc(abs(totdoc), doc); + TCurrency_documento totspese(abs(doc.spese()), doc); + TCurrency_documento totimposte(abs(doc.imposta(TRUE)), doc); + TCurrency_documento totimponibili = totdoc - totspese - totimposte; + if (in_valuta) + { + TCurrency_documento val2(totimposte); val2.change_to_firm_val(); + TCurrency_documento val3(totspese); val3.change_to_firm_val(); + TCurrency_documento val1(totdoc); val1.change_to_firm_val(); val1 -= val2+val3; + // Cosi' corregge eventuali scompensi di poche lirette + pag.set_total_valuta(totimponibili, totimposte, totspese, val1, val2, val3); + } + else + pag.set_total(totimponibili, totimposte, totspese); + pag.set_rate_auto(); + + const TRiga_partite& fatt = newgame->riga(p); + for (int r = 1; r <= fatt.rate() && r <= pag.n_rate(); r++) + { + const TRiga_scadenze& rata = fatt.rata(r); + const real imprata = rata.residuo(FALSE).valore(); + const real imprataval = rata.residuo(TRUE).valore(); + real importo_rata_lit = pag.importo_rata(r-1, FALSE); + real importo_rata_val = in_valuta ? pag.importo_rata(r-1, TRUE) : importo_rata_lit; + real delta_lit = importo_rata_lit - imprata; + real delta_val = in_valuta ? importo_rata_val - imprataval : ZERO; + // Controlla se l'importo della nota di credito supera quello della fattura + if (delta_lit > ZERO || delta_val > ZERO) + { + // Detrae l'eccedenza dalla rata corrente e la sposta nella rata successiva + importo_rata_lit -= delta_lit; + importo_rata_val -= delta_val; + + if (r == pag.n_rate()) + { + // Crea eventuale ultima rata mancante + pag.add_rata(); + } + else + { + // Incrementa importo rata + delta_lit += pag.importo_rata(r, FALSE); + delta_val += pag.importo_rata(r, TRUE); + } + const TDate oggi(TODAY); + const int tiporata = pag.tipo_rata(r-1); + pag.set_rata(r, delta_val, delta_lit, oggi, tiporata, "", FALSE); + } + if (!importo_rata_lit.is_zero() || (in_valuta && !importo_rata_val.is_zero())) + { + TRectype pag = newgame->pagamento(p, r, nuova_riga); + pag.put(PAGSCA_IMPORTO, importo_rata_lit); + if (in_valuta) + { + pag.put(PAGSCA_IMPORTOVAL, importo_rata_val); + residuoval -= TImporto(sezione, importo_rata_val); + } + else + residuoval -= TImporto(sezione, importo_rata_lit); + + pag.put(PAGSCA_ACCSAL, "A"); + newgame->modifica_pagamento(pag, cambio, TRUE); + } + } + } + + if (!residuoval.is_zero()) + { + // Pagamento non assegnato + TRectype unpag = newgame->pagamento(TPartita::UNASSIGNED, 0, nuova_riga); + if (in_valuta) + { + unpag.put(PAGSCA_IMPORTOVAL, residuoval.valore()); + cambio.val2lit(residuoval); //verificare + unpag.put(PAGSCA_IMPORTO, residuoval.valore()); + } + else + unpag.put(PAGSCA_IMPORTO, residuoval.valore()); + unpag.put(PAGSCA_ACCSAL, "A"); + newgame->modifica_pagamento(unpag, cambio, TRUE); + } + } + } + + if (newgame != NULL) // Se non ho cancellato il numero partita ... + { + if (!newgame->write()) // Salva nuova partita + //error_box("Si e' verificato un errore scrivendo le scadenze del documento."); + _error = write_part_error; + delete newgame; + } + + return _error; +} + +error_type TContabilizzazione::write_all(TDocumento& doc) +// Scrive il movimento e le scadenze, gestendo la rinumerazione se il movimento e' gia presente +{ + // N.B: _error non viene settato, per non stampare il messaggio di errore 2 volte. + // basta solo ritornare qualcosa di != da no_error, per evitare le operazioni successive + // a write_all + TRectype& head = _movimento->lfile().curr(); + long numreg = head.get_long(MOV_NUMREG); + if (test_swap()) + { + const real totdoc = -head.get_real(MOV_TOTDOC); + const real totdocval = -head.get_real(MOV_TOTDOCVAL); + + head.put(MOV_TOTDOC, totdoc); + head.put(MOV_TOTDOCVAL, totdocval); + + const int items = _movimento->iva_items(); + + for (int i = items - 1 ; i >= 0; i--) + { + TRectype & rec_iva = _movimento->iva(i); + + const real imponibile = -rec_iva.get_real(RMI_IMPONIBILE); + const real imposta = -rec_iva.get_real(RMI_IMPOSTA); + + rec_iva.put(RMI_IMPONIBILE, imponibile); + rec_iva.put(RMI_IMPOSTA, imposta); + } + } + while (_movimento->write() == _isreinsert) + head.put(MOV_NUMREG,++numreg); + if (_movimento->status() != NOERR) + { + error_box("Errore %d scrivendo il movimento %ld.",_movimento->status(),numreg); + return generic_error; + } + if (sc_enabled()) + write_scadenze(doc); + + return no_error; +} + +error_type TContabilizzazione::compile_head_anticipo(TDocumento& doc) +{ + TString descr; + TString16 codcaus = doc.tipo().caus_anticipo(); + long nr = 1L; + TDate datareg(_movimento->lfile().get_date(MOV_DATAREG)); + + if (get_next_reg_num(nr) != no_error) + return nr_reg_error; + + if (!_caus->read(codcaus,datareg.year())) + return caus_ant_error; + + _anticipo = new TMovimentoPN; + TRectype& head = _anticipo->lfile().curr(); + head = _movimento->lfile().curr(); // Copia tutti i campi... + head.put(MOV_NUMREG,nr); + head.zero(MOV_DATA74TER); + head.put(MOV_TIPODOC,_caus->tipo_doc()); + head.put(MOV_CODCAUS,_caus->codice()); + descr = doc.get_bool(DOC_ACCSALDO) ? "Saldo fattura" : "Acconto fattura"; + descr << " n. " << doc.numero(); + descr << " del " << doc.get_date(DOC_DATADOC).string(); + head.put(MOV_DESCR,descr); + head.put(MOV_TIPOMOV,char(_caus->tipomov()+'0')); + head.zero(MOV_REG); + head.zero(MOV_PROTIVA); + head.zero(MOV_CODPAG); + head.zero(MOV_CORRLIRE); + head.zero(MOV_CORRVALUTA); + TString codval = head.get(MOV_CODVALI); +// real cambio = head.get_real(MOV_CAMBIOI); + head.zero(MOV_CODVALI); + head.zero(MOV_CAMBIOI); + if (sc_enabled()) + { + TCurrency_documento p(doc.get_real(DOC_IMPPAGATO), doc); + TCurrency_documento plit(p); p.change_to_firm_val(); + if (doc.in_valuta()) + { + head.put(MOV_TOTDOC,plit.get_num()); + head.put(MOV_TOTDOCVAL,p.get_num()); + } + else + { + head.put(MOV_TOTDOC,p.get_num()); + head.zero(MOV_TOTDOCVAL); + } + } + else + { + head.zero(MOV_TOTDOC); + head.zero(MOV_TOTDOCVAL); + } + return no_error; +} + +char TContabilizzazione::sezione() const +{ + char sezione = ' '; + const char tipoc = _co_cliente.tipo(); + + tipo_movimento tm = (tipo_movimento)_caus->tipomov(); + sezione = _caus->sezione(1); // Usa la sezione della causale + + if (sezione <= ' ') // Se non c'e' la sezione bell'e' ch'e' pronta + { + if (tm == tm_fattura || tm == tm_insoluto) // calcola in base al tipo movimento e + sezione = (tipoc == 'C') ? 'D' : 'A'; // al tipo cliente/fornitore + else + sezione = (tipoc == 'C') ? 'A' : 'D'; + } + return sezione; +} + +error_type TContabilizzazione::search_clifo_bill(TString & catven) +{ + _error = no_error; + TLocalisamfile& clifo = _clifo->lfile(); + const long codcf = clifo.get_long(CLI_CODCF); + const char tipocf = clifo.get_char(CLI_TIPOCF); + _co_cliente.set(0,0,0); + + // Reperisce il conto del cliente nel seguente ordine, appena ne trova uno valido: + // - Categoria vendita + // - file clienti + // - causale + + _cve->put("CODTAB", catven); + if (_cve->read() == NOERR) + _co_cliente.set(_cve->get_int("I1"), _cve->get_int("I2"),codcf,tipocf); + if (!_co_cliente.ok()) + { + _co_cliente.set(clifo.get_int(CLI_GRUPPO),clifo.get_int(CLI_CONTO),codcf,tipocf); + if (!_co_cliente.ok()) // se non e' valido, reperiscilo dalla riga #1 della causale + { + _caus->bill(1,_co_cliente); // conto della riga 1 + _co_cliente.codclifo() = codcf; + if (!_co_cliente.ok()) + _error = clifo_error; + } + } + return _error; +} + +error_type TContabilizzazione::search_counter_bill(TDocumento& doc) +{ + _error = no_error; + // cerca il conto relativo alla riga di causale: + // 1 Rimessa diretta o contanti (banca) riga 2 + // 2 Tratta riga 3 + // 3 Ricevuta bancaria riga 4 + // 4 Cessione riga 5 + // 5 Paghero' riga 6 + // 6 Lettera di credito riga 7 + // 7 Tratta accettata riga 8 + // 8 Rapporti interban. diretti riga 2 + // 9 Bonifici riga 2 + // Se il saldaconto e' attivo prende il conto relativo al tipo pagamento + // Altrimenti sempre la riga 2 + if (sc_enabled()) + { + int tipopag = doc.pagamento().tipo_rata(0); // Quello della prima rata... prolly is right .. ;P + _caus->bill(tipopag>0 && tipopag<8 ? tipopag+1:2,_co_controp); + if (!_co_controp.ok()) + _caus->bill(2,_co_controp); + } + else + _caus->bill(2,_co_controp); + if (!_co_controp.ok()) + _error = counter_p_ant_error; + return _error; +} + +error_type TContabilizzazione::compile_rows_anticipo(TDocumento& doc) +{ + // Per compilare le righe ci si ispira alla contabilizzazione effetti + // per reperire il conto clienti si guarda prima sul record cliente + // e poi al limite la riga della causale + // per il conto di contropartita se non c'e' il saldaconto lo si prende dalla + // seconda riga. Se il saldaconto esiste si consulta la riga relativa al + // tipo di pagamento. + TString16 codpag(doc.get(DOC_CODPAG)); + TString16 catven(doc.get(DOC_CATVEN)); + if (search_clifo_bill(catven) == no_error && search_counter_bill(doc) == no_error) + { + TCurrency_documento importo(doc.get_real(DOC_IMPPAGATO), doc); importo.change_to_firm_val(); + TLocalisamfile& mov = _anticipo->lfile(); + TDate datareg = mov.get_date(MOV_DATAREG); + TString16 codes = mov.get(MOV_ANNOES); + const long numreg = mov.get_long(MOV_NUMREG); + TRectype& c_rec = _anticipo->cg(0); + // setta i valori per la riga cliente + c_rec.put(RMV_ANNOES,codes); + c_rec.put(RMV_DATAREG,datareg); + c_rec.put(RMV_NUMREG,numreg); + c_rec.put(RMV_NUMRIG,1); + c_rec.put(RMV_SEZIONE,_caus->sezione_clifo()); + c_rec.put(RMV_TIPOC,_co_cliente.tipo()); + c_rec.put(RMV_GRUPPO,_co_cliente.gruppo()); + c_rec.put(RMV_CONTO,_co_cliente.conto()); + c_rec.put(RMV_SOTTOCONTO,_co_cliente.sottoconto()); + c_rec.put(RMV_GRUPPOC,_co_controp.gruppo()); + c_rec.put(RMV_CONTOC,_co_controp.conto()); + c_rec.put(RMV_SOTTOCONTOC,_co_controp.sottoconto()); + c_rec.put(RMV_ROWTYPE,sc_enabled() ? "K" : " "); + c_rec.put(RMV_IMPORTO, importo.get_num()); + + TRectype& co_rec = _anticipo->cg(1); + // setta i valori per la riga contropartita + co_rec = c_rec; // Swappa i conti ed il numero di riga + co_rec.put(RMV_NUMRIG,2); + co_rec.put(RMV_TIPOC,""); + co_rec.put(RMV_SEZIONE,_caus->sezione_clifo() == 'A' ? 'D' : 'A'); + co_rec.put(RMV_GRUPPO,_co_controp.gruppo()); + co_rec.put(RMV_CONTO,_co_controp.conto()); + co_rec.put(RMV_SOTTOCONTO,_co_controp.sottoconto()); + co_rec.put(RMV_TIPOCC,_co_cliente.tipo()); + co_rec.put(RMV_GRUPPOC,_co_cliente.gruppo()); + co_rec.put(RMV_CONTOC,_co_cliente.conto()); + co_rec.put(RMV_SOTTOCONTOC,_co_cliente.sottoconto()); + co_rec.put(RMV_ROWTYPE,sc_enabled() ? "I" : " "); + } + return _error; +} + +error_type TContabilizzazione::write_pagamento_anticipo(TDocumento& doc) +{ + TLocalisamfile& mov = _anticipo->lfile(); + const int anno = mov.get_date(MOV_DATAREG).year(); + TString numpart(mov.get(MOV_NUMDOC)); // Nessun controllo se prot.iva o numdoc xche' tanto proviene dal mov precedentemente scritto + TPartita * partita = new TPartita(_co_cliente,anno,numpart); + partita->allinea(); + TRiga_partite& riga_part = partita->new_row(); + // Compila la riga di partita per il pagamento + riga_part.put(PART_TIPOMOV,_caus->tipomov()); + riga_part.put(PART_TIPOPAG, 1 ); // Pagamento in contanti-> tipo 1 + riga_part.put(PART_NREG,mov.get_long(MOV_NUMREG)); + riga_part.put(PART_NUMRIG,1); // Riferimento alla riga 1 del movimento + riga_part.put(PART_DATAREG,mov.get_date(MOV_DATAREG)); + riga_part.put(PART_DATADOC,mov.get_date(MOV_DATADOC)); + riga_part.put(PART_DATAPAG,mov.get_date(MOV_DATADOC)); + riga_part.put(PART_NUMDOC,numpart); // E' lo stesso riferimento + riga_part.put(PART_SEZ,sezione()); + riga_part.put(PART_CODCAUS, _caus->codice()); + + + TCurrency_documento impval(doc.get_real(DOC_IMPPAGATO), doc); + TCurrency_documento imp(impval); imp.change_to_firm_val(); + real cambio = doc.get_real(DOC_CAMBIO); + TString16 val(doc.get(DOC_CODVAL)); + TDate datacam(doc.get_date(DOC_DATACAMBIO)); + const bool valuta = val.not_empty(); + riga_part.put(PART_IMPORTO,imp.get_num()); + riga_part.put(PART_IMPORTOVAL,impval.get_num()); + riga_part.put(PART_IMPTOTDOC,imp.get_num()); + riga_part.put(PART_IMPTOTVAL,impval.get_num()); + riga_part.put(PART_CODVAL,val); + riga_part.put(PART_CAMBIO,cambio); + riga_part.put(PART_DATACAM,doc.get_date(DOC_DATACAMBIO)); + riga_part.put(PART_TIPOCF,_co_cliente.tipo()); + riga_part.put(PART_SOTTOCONTO,_co_cliente.sottoconto()); + riga_part.put(PART_DESCR, mov.get(MOV_DESCR)); + + // Compila la riga di pagamento: + // reperire il numero della riga partita (nrigp) appena aggiunta + int nriga = (int) TPartita::UNASSIGNED, nrigp = riga_part.get_int(PART_NRIGA); + // Cerca la riga di partita con riferimento alla fattura che si sta pagando + for (int r = partita->last(); r > 0; r = partita->pred(r)) + { + TRiga_partite& rpart = partita->riga(r); + if (rpart.is_fattura()) + { + TString16 s1 = rpart.get(PART_NUMDOC); s1.trim(); + TString16 s2 = numpart; s2.trim(); + if (s1 == s2) // Bisogna tener conto dell'allineamento! + { + nriga = r; + break; + } + } + } + + if (nriga == TPartita::UNASSIGNED) + { + delete partita; + return write_part_error; + } + + // Scorre le scadenze di questa fattura, e ne completa il pagamento partendo + // dalla rata piu' vecchia. + TRiga_partite& rpp = partita->riga(nriga); + real abb; + real ipp = (real) (valuta ? impval.get_num() : imp.get_num()); + TValuta tval(val, datacam, cambio); + char old_ap, new_ap; + TImporto old_abb, old_diffcam, new_abb, new_diffcam; + const int nrate = rpp.rate(); + const bool is_saldo_doc = doc.get_bool(DOC_ACCSALDO); + char s_a; + for (int i=1; i<=nrate; i++) + { + TRiga_scadenze& rs = rpp.rata(i); + real res = rs.residuo(valuta).valore(); // Sul residuo da pagare per questa rata + TRectype& riga_pagamento = partita->pagamento(nriga,i,nrigp); // Nuova riga di pagamento + // Compila la riga... e scala l'importo residuo partendo dalla piu' vecchia + // setta i flags di saldato/acconto + // ANNO, NUMPART, NRIGA, NRATA, NRIGP dovrebbero essere gia' compilati + riga_pagamento.put(PAGSCA_TIPOC,_co_cliente.tipo()); + riga_pagamento.put(PAGSCA_SOTTOCONTO,_co_cliente.sottoconto()); + s_a = 'S'; + if (ipp <= ZERO) + ipp = ZERO; + if (res > ipp || i == nrate) // sull'ultima rata mette tutto il resto... + { + res = ipp; + imp = 0.0; + if (!is_saldo_doc) + s_a = 'A'; + } + else + ipp -= res; + riga_pagamento.put(PAGSCA_ACCSAL, s_a); + riga_pagamento.put(valuta ? PAGSCA_IMPORTOVAL : PAGSCA_IMPORTO, res); + + if (valuta) + { +// Guy was here +// riga_pagamento.put(PAGSCA_IMPORTO, ((real)(res*cambio)).round()); + TCurrency_documento impval(res); + impval.change_to_firm_val(); + riga_pagamento.put(PAGSCA_IMPORTO, impval.get_num()); + } + riga_pagamento.put(PAGSCA_TIPOCC,_co_controp.tipo()); + riga_pagamento.put(PAGSCA_GRUPPOC,_co_controp.gruppo()); + riga_pagamento.put(PAGSCA_CONTOC,_co_controp.conto()); + riga_pagamento.put(PAGSCA_SOTTOCONTC,_co_controp.sottoconto()); + + TRectype rp(riga_pagamento); + if (is_saldo_doc) + rp.put(PAGSCA_ACCSAL, 'S'); + + partita->modifica_pagamento(rp, tval, old_ap, old_abb, old_diffcam, new_ap, new_abb, new_diffcam, TRUE); + abb += new_abb.valore(); + } + + // Vediamo se vi sono abbuoni, in questo caso si completa il movimento + // contabile di anticipo, con la riga appropriata, di abbuoni attivi/passivi cambiamo pure la riga relativa + // all'importo cliente, ovvero lo settiamo al valore totale della fattura... ;) + // Dentro new_ap avremo se l'abbuono e' attivo o passivo, in new_abb avremo l'importo + TBill abb_bill; + if (abb != ZERO) + { + // Reperisce il conto di contropartita per gli abbuoni dalla causale: 9 passivi 10 attivi + const int nrigc = new_ap == 'A' ? 10 : 9; + _caus->bill(nrigc, abb_bill); + if (abb_bill.ok()) + { + TRectype& first_row = _anticipo->cg(0); // Riga cli/fo + first_row.put(RMV_IMPORTO, rpp.get_real(PART_IMPTOTDOC)); // Aggiusta l'importo totale + TRectype& abb_row = _anticipo->cg(2); // Riga abbuoni ... + abb_row = first_row; + abb_row.put(RMV_NUMRIG,3); + abb_row.put(RMV_TIPOC,""); + + char ab_sez = 'D'; + const char cf_sez = _caus->sezione_clifo(); + if (cf_sez == 'D' && new_ap == 'P' || + cf_sez == 'A' && new_ap == 'A') + ab_sez = 'A'; + abb_row.put(RMV_SEZIONE, ab_sez); + abb_row.put(RMV_GRUPPO,abb_bill.gruppo()); + abb_row.put(RMV_CONTO,abb_bill.conto()); + abb_row.put(RMV_SOTTOCONTO,abb_bill.sottoconto()); + abb_row.put(RMV_TIPOCC,_co_cliente.tipo()); + abb_row.put(RMV_GRUPPOC,_co_cliente.gruppo()); + abb_row.put(RMV_CONTOC,_co_cliente.conto()); + abb_row.put(RMV_SOTTOCONTOC,_co_cliente.sottoconto()); + abb_row.put(RMV_IMPORTO, abs(abb)); + abb_row.put(RMV_ROWTYPE, new_ap); + } + else + _error = cau_abb_error; + } + + // Infine scrive sta partita... + if (good() && !partita->write()) + //error_box("Si e' verificato un errore scrivendo il pagamento del movimento di anticipo"); + _error = write_part_error; + delete partita; + return _error; +} + +error_type TContabilizzazione::write_anticipo(TDocumento& doc) +{ + // Questo movimento viene scritto solo se e' stato versato un anticipo di pagamento + // Crea 1 testata, 1 riga contabile e la relativa riga di pagamento sulla partita a cui fa riferimento + // La testata e' praticamente la stessa del movimento appena scritto, tranne che per il numero di + // protocollo, il numero di registrazione la descrizione, i totali in lire/valuta, + // la condizione pagamento... + _error = no_error; + + _error = compile_head_anticipo(doc); + if (_error == no_error) + { + // Una volta compilata la testa... compila le righe... + if (_anticipo) + { + _error = compile_rows_anticipo(doc); + if (_error == no_error) + { + // Scrive il movimento... gestendo la rinumerazione + if (sc_enabled()) + // ... il pagamento vero e proprio, scrivendo la partita e modificando + // il movimento se vi sono abbuoni + write_pagamento_anticipo(doc); + + TLocalisamfile& head = _anticipo->lfile(); + long numreg = head.get_long(MOV_NUMREG); + while (_anticipo->write() == _isreinsert) + head.put(MOV_NUMREG,++numreg); + + if (_anticipo->status() != NOERR) + { + error_box("Errore %d scrivendo il movimento di anticipo pagamento %ld.",_anticipo->status(),numreg); + return generic_error; + } + aggiorna_saldi(FALSE); + } + delete _anticipo; + _anticipo = NULL; + } + } + + return _error; +} + +error_type TContabilizzazione::write_intra(TDocumento& doc) +{ + // Scrive il movimento INTRA raggruppando per NATURA+NOMENCLATURA+CONSEGNA+TRASPORTO+PAESE+PAESEORIG+PROV + // Siccome NATURA, CONSEGNA, TRASPORTO e PAESE sono relativi alla testata del documento, + // il raggruppamento effettivo viene fatto solo per NOMENCLATURA+PAESEORIG+PROV + // NB: per i profani (come me :P) NOMENCLATURA COMBINATA e CLASSE DOGANALE sono la medesima cosa. + + TLocalisamfile& intra = *_intra; + + // Un po' di cache... + TDB_cache& cchh = cache(); + TRecord_array rintra(LF_RINTRA, "NUMRIG"); + TAssoc_array righe; + + const TRectype& rm = _movimento->lfile().curr(); + const TString16 codvali(rm.get(MOV_CODVALI)); + const real cambioi = rm.get_real(MOV_CAMBIOI); + const TRectype& por_rec = cchh.get("%POR", doc.get(DOC_CODPORTO)); + const TString16 consegna(por_rec.get("S3")); // condizioni di consegna + const int trasporto = por_rec.get_int("I0"); // tipo di trasporto... + const int natura = doc.tipo().get_int("I2"); // natura della transazione, valida per tutte le righe del documento + const long numreg = rm.get_long(MOV_NUMREG); + TString16 nomenclatura, paeseorig, provincia, paese, codmag, commag; + real totale_righe; + const real cambio = doc.cambio(); + const bool is_val = doc.in_valuta(); + const bool is_cessione = rm.get(MOV_TIPO)=="C"; + + paese = _clifo->lfile().get(CLI_STATOPAIV); // Paese del cliente/fornitore... + + // Scorre le righe documento (prendendo solamente quelle relative agli articoli veri e propri) + // Effettuando il raggruppamento in un comodo TAssoc_array + TToken_string key; + const int items = doc.physical_rows(); + int numrig = 1; + for (int i=1; i<=items; i++) + { + const TRiga_documento& rr = doc[i]; + if (rr.is_articolo()) + { + key = ""; + codmag = rr.get(RDOC_CODMAG); + const TRectype& rec_anamag = cchh.get(LF_ANAMAG, rr.get(RDOC_CODARTMAG)); + commag = cchh.get("MAG", codmag, "S5"); // Comune del magazzino + nomenclatura = rec_anamag.get(ANAMAG_CLASSDOG); + paeseorig = !is_cessione ? rec_anamag.get(ANAMAG_PAESE) : EMPTY_STRING; // Campo solo per Acquisti + provincia = is_cessione ? rec_anamag.get(ANAMAG_PROV) : cchh.get(LF_COMUNI, commag, "PROVCOM"); + key.add(nomenclatura); + key.add(paeseorig); + key.add(provincia); + + TRectype* rc = (TRectype*) righe.objptr(key); + if (rc == NULL) + { + rc = new TRectype(LF_RINTRA); + rc->put("NUMREG", numreg); + rc->put("NUMRIG", numrig++); + rc->put("NATURA", natura); + rc->put("CONSEGNA", consegna); + rc->put("TRASPORTO", trasporto); + rc->put("UMS", cchh.get("%NOC", nomenclatura, "S5")); + rc->put("NOMENCL", nomenclatura); + rc->put("PAESE", paese); + rc->put("PAESEORIG", paeseorig); + rc->put("PROV", provincia); + righe.add(key, rc); + } + const real qta = rr.quantita(); + TCurrency_documento imp_val(rr.exist("VALINTRA") ? rr.get_real("VALINTRA") :rr.importo(TRUE, FALSE), doc); + TCurrency_documento imp(imp_val); imp.change_to_firm_val(); + imp_val.change_value(codvali, cambioi); + real ammlire = rc->get_real("AMMLIRE"); + real ammvaluta = rc->get_real("AMMVALUTA"); + real massakg = rc->get_real("MASSAKG"); + real massaums = rc->get_real("MASSAUMS"); + real valstat = rc->get_real("VALSTAT"); + + ammlire += imp.get_num(); + ammvaluta += is_val ? imp_val.get_num() : ZERO; + massakg += qta * rec_anamag.get_real(ANAMAG_MASSANUN); + massaums += qta * rec_anamag.get_real(ANAMAG_UNSUPPUN); + if (rr.exist("VALSTAT")) + valstat += rr.get_real("VALSTAT"); + else + valstat += qta * rec_anamag.get_real(ANAMAG_VALSTATUN); + TCurrency_documento vstat(valstat, doc); + vstat.change_value(codvali, cambioi); + + rc->put("AMMLIRE", ammlire); + rc->put("AMMVALUTA", ammvaluta); + rc->put("MASSAKG", massakg); + rc->put("MASSAUMS", massaums); + rc->put("VALSTAT", vstat.get_num()); + + totale_righe += is_val ? imp_val.get_num() : imp.get_num(); + } + } + + // Copia il contenuto dell'assoc nel record array + TRectype* rc = new TRectype(LF_RINTRA); + rc->put("NUMREG", numreg); + rintra.set_key(rc); + for(rc = (TRectype*) righe.first_item(); rc != NULL; rc = (TRectype*) righe.succ_item()) + rintra.add_row(rc); + // Testa (de coccio...) + intra.zero(); + intra.put("NUMREG", numreg); + intra.put("DATAREG", rm.get_date(MOV_DATAREG)); + intra.put("TIPOMOV", is_cessione ? 'C' : 'A'); // 'C' cessione 'A' acquisto + intra.put("TIPOCF", rm.get(MOV_TIPO)); + intra.put("CODCF", rm.get_long(MOV_CODCF)); + intra.put("TOTDOC", rm.get_real(MOV_TOTDOC)); + intra.put("TOTDOCIMM", totale_righe); + intra.put("CODVAL", codvali); + intra.put("CAMBIO", cambioi); + if (intra.write() == _isdupkey) // Sebbene non debba succedere, si effettua una riscrittura + intra.rewrite(); + + // righe! + if (intra.status() != NOERR || rintra.write(TRUE) != NOERR) // Forza la riscrittura se necessario + _error = intra_mov_error; + + return _error; +} + +void TContabilizzazione::aggiorna_saldi(bool n) +{ + TMovimentoPN* mv = n ? (TMovimentoPN*) _movimento : _anticipo; + + CHECK(mv, "Movimento non valido passato ad aggiorna_saldi()"); + + TLocalisamfile& mov = mv->lfile(); + + const TDate datareg(mov.get_date(MOV_DATAREG)); + + tiposal tsal = normale; + if (_caus->read(mov.get(MOV_CODCAUS),datareg.year())) + tsal = _caus->apertura() ? apertura : + (_caus->chiusura() ? chiusura : normale); + + TSaldo_agg _saldo; + + _saldo.reset(); // Inizializza saldi + _saldo.set_movprovv(FALSE); + _saldo.set_tipo_saldo(tsal); + _saldo.set_anno_es(mov.get_int(MOV_ANNOES)); + _saldo.set_num_ulmov(mov.get_long(MOV_NUMREG)); + _saldo.set_data_ulmov(datareg); + _saldo.set_movimentato(TRUE); + + const int cgitems = mv->cg_items(); + for (int i = 0; i < cgitems; i++) + { + const TRectype& r = mv->cg(i); + TImporto import(r.get_char("SEZIONE"), r.get_real("IMPORTO")); + if (!import.is_zero()) + { + TBill conto; conto.get(r); + _saldo.aggiorna(conto, import, TRUE); + } + } + + _saldo.registra(); +} + +void TContabilizzazione::display_error(TDocumento& doc) +{ + TToken_string msg(256, '.'); + const TString16 numerazione = doc.numerazione(); + const long numero = doc.numero(); + const TString16 causale = _caus == NULL ? "" : _caus->codice(); + + switch (_error) + { + case nr_es_error: + msg.format("Rilevato un codice esercizio errato contabilizzando il documento %s/%ld." + "Verificare l'esistenza e la correttezza della tabella esercizi e della data del documento.",(const char*)numerazione,numero); + break; + case nr_reg_error: + msg.format("Rilevato un numero di registrazione errato contabilizzando il documento %s/%ld." + "Verificare l'integrita' del file movimenti.",(const char*)numerazione,numero); + break; + case nr_doc_error: + msg.format("Rilevato un numero di documento errato contabilizzando il documento %s/%ld." + "Verificare il numero documento e il codice numerazione inseriti in tabella.",(const char*)numerazione,numero); + break; + case chg_stat_error: + msg.format("Rilevato un errore cambiando lo stato al documento %s/%ld." + "Verificare l'integrita' del file documenti.",(const char*)numerazione,numero); + break; + case clifo_error: + msg.format("Rilevato un errore caricando le informazioni del Cli/Fo sul documento %s/%ld." + "Verificare l'esistenza delle informazioni inserite sul file documenti e Cli/Fo.",(const char*)numerazione,numero); + break; + case ultprot_error: + msg.format("Rilevato un numero di protocollo IVA errato relativamente al documento %s/%ld." + "Verificare le informazioni inserite sul registro %s/%d.",(const char*)numerazione,numero, + (const char*) _caus->reg().name(),_caus->reg().year()); + break; + case datadoc_error: + msg.format("Rilevato una data documento vuota relativamente al documento %s/%ld." + "Verificare l'informazione inserita.",(const char*)numerazione,numero); + break; + case caus_ant_error: + msg.format("Rilevato un errore caricando la causale per anticipo pagamento relativamente al documento %s/%ld." + "Verificare l'esistenza del codice causale '%s'.",(const char*)numerazione,numero,(const char*)causale); + break; + case counter_p_ant_error: + msg.format("Rilevato un errore cercando il conto di contropartita per il movimento di anticipo relativamente al documento %s/%ld." + "Verificare l'esistenza e la correttezza della causale '%s'.",(const char*)numerazione,numero,(const char*)causale); + break; + case caus_error: + msg.format("Rilevato un errore caricando la causale relativamente al documento %s/%ld." + "Verificare l'esistenza del codice causale '%s' e del relativo registro.", + (const char*)numerazione,numero,(const char*)causale); + break; + case cauval_error: + msg.format("Il documento %s/%ld risulta essere in valuta mentre la causale non la supporta." + "Verificare la correttezza della causale '%s'.",(const char*)numerazione,numero,(const char*)causale); + break; + case ivasto_error: + msg.format("Impossibile determinare il codice IVA di storno per articoli omaggio relativamente al documento %s/%ld." + "Verificare la configurazione contabilizzazione.",(const char*)numerazione,numero); + break; + case register_error: + msg.format("Rilevato un errore caricando il registro relativamente al documento %s/%ld." + "Verificare la correttezza della causale '%s' e relativo registro.",(const char*)numerazione,numero,(const char*)causale); + break; + case change_error: + msg.format("Rilevato un cambio senza valuta relativamente al documento %s/%ld." + "Verificare la correttezza delle informazioni inserite.",(const char*)numerazione,numero); + break; + case val_error: + msg.format("Rilevato un codice valuta inesistente relativamente al documento %s/%ld." + "Verificare la correttezza della informazione inserita.",(const char*)numerazione,numero); + break; + case codpag_error: + msg.format("Rilevato un codice pagamento non esistente relativamente al documento %s/%ld." + "Verificare l'esistenza del codice pagamento inserito.",(const char*)numerazione,numero); + break; + case row_type_error: + msg.format("Rilevato un codice tipo riga non esistente relativamente al documento %s/%ld." + "Verificare l'esistenza dei vari codici riga inseriti.",(const char*)numerazione,numero); + break; + case no_rows_error: + msg.format("Nessuna riga iva contabile e' stata trovata relativamente al documento %s/%ld." + "Verificare l'esistenza dei vari codici riga inseriti.",(const char*)numerazione,numero); + break; + case cau_ritintra_error: + msg.format("Conto per il'IVA intracomunitaria errato o mancante." + "Verificarlo sulla causale alla voce ritenute fiscali.\n"); + break; + case conto_error: + msg.format("Rilevato un conto di costo/ricavo inesistente relativamente al documento %s/%ld." + "Verificare l'esistenza del conto %c %d %d %ld associato alle righe.", + (const char*)numerazione,numero, + _conto_errato.tipo(), _conto_errato.gruppo(), _conto_errato.conto(), _conto_errato.sottoconto()); + break; + case sconto_error: + msg.format("Non sono stati impostati i conti per la contabilizzazione degli sconti relativamente al documento %s/%ld." + "Verificare i parametri in configurazione contabilizzazione.",(const char*)numerazione,numero); + break; + case spinbo_error: + msg.format("Non sono stati impostati i conti per la contabilizzazione delle spese incasso e bolli relativamente al documento %s/%ld." + "Verificare i parametri in configurazione contabilizzazione.",(const char*)numerazione,numero); + break; + case movement_error: + msg.format("Rilevato uno sbilancio nel movimento relativamente al documento %s/%ld." + "Verificare la correttezza degli importi delle righe.",(const char*)numerazione,numero); + break; + case write_error: + msg.format("Rilevato un errore in scrittura movimento relativamente al documento %s/%ld." + "Verificare la consistenza dei files.",(const char*)numerazione,numero); + break; + case write_part_error: + msg.format("Rilevato un errore in scrittura partite relativamente al documento %s/%ld." + "Verificare la consistenza dei files.",(const char*)numerazione,numero); + break; + case cau_abb_error: + msg.format("Mancano i conti per gli abbuoni nella causale indicata per il pagamento anticipo relativamente al documento %s/%ld." + "Verificare la correttezza della causale.",(const char*)numerazione,numero); + break; + case intra_mov_error: + msg.format("Si è verificato un errore nella scrittura del movimento intracomunitario relativamente al documento %s/%ld." + "Verificare la consistenza dei files relativi ai movimenti intracomunitari.",(const char*)numerazione,numero); + break; + case cont_seq_error: + msg.format("Il documento precedente al %s/%ld non e' stato contabilizzato.\n" + "E' necessario contabilizzare tutti i documenti in sequenza.", + (const char*)numerazione, numero); + break; + default: // errori generici o non indicati vengono visualizzati nel punto dell'errore + //msg.format("E' stato rilevato un errore generico contabilizzando il documento %s/%ld.", + // (const char*)numerazione,numero); + break; + } + + if (_viswin) + { + TString riga; + FOR_EACH_TOKEN(msg, line) + { + if (*line) + { + riga = riga.empty() ? "*** " : " "; + riga << line << '.'; + _viswin->add_line(riga); + } + } + } + else + error_box(msg); + _error = no_error; // reset error, as any other one would do, so you can show me the other ones. + _can_write = FALSE; // But from now on u cannot write anymore. U must exit this program and repair errors occurred. +} + +bool TContabilizzazione::sc_enabled() const +{ + bool rt = _sc_enabled; + if (_caus != NULL) rt &= _caus->saldaconto(); + if (_clifo != NULL) rt &= !_clifo->lfile().get_bool(CLI_OCCAS); // Saldaconto solo se C/F non occasionale + return rt; +} + +bool TContabilizzazione::in_enabled() const +{ + bool rt = _in_enabled; + if (_caus != NULL) rt &= _caus->intra(); + return rt; +} + +bool TContabilizzazione::prev_contabilized(const TDocumento& doc) const +{ + const TString16 codnum = doc.get(DOC_CODNUM); + const int anno = doc.get_int(DOC_ANNO); + const char provv = doc.get_char(DOC_PROVV); + long ndoc = doc.get_long(DOC_NDOC); + + TLocalisamfile documenti(LF_DOC); + TRectype& rec = documenti.curr(); + rec.put(DOC_CODNUM, codnum); + rec.put(DOC_ANNO, anno); + rec.put(DOC_PROVV, provv); + rec.put(DOC_NDOC, ndoc-1); + int err = rec.read(documenti); + if (err != NOERR) + { + rec.zero(); + rec.put(DOC_CODNUM, codnum); + rec.put(DOC_ANNO, anno); + rec.put(DOC_PROVV, provv); + err = rec.read(documenti, _isgteq); + return err == NOERR && rec.same_key(doc.head(), 1); + } + + const TString16 stato_doc = rec.get(DOC_STATO); + const TString16 stato_ok = stato_finale_doc_iniziale(); + return stato_doc == stato_ok; +} + +static void link_handler(int n, const char* descr) +{ + if (n == 0) + { + const char* app = "cg2 -0"; + TString body; body << "1|" << descr; + TMessage msg(app, MSG_LN, body); + msg.send(); + TExternal_app a(app); + a.run(); + } +} + +bool TContabilizzazione::elabora(TLista_documenti& doc_in, TLista_documenti& /* doc_out */, + const TDate& data_elab, bool interattivo) +{ + TString msg; + + _error = no_error; + _total_docs = 0L; + _caus = NULL; + _data_reg = data_elab; + + if (interattivo) + { + _auto_data = TRUE; + _nump_iva = 1; + } + + _esc.update(); + _cpg->setkey(1); // Setta per sicurezza la chiave 1 nel caso l'elaborazione sia invocata da VE0 + + if (!load_parameters()) // Carica i parametri dalla configurazione + return FALSE; + + TPrinter& p = printer(); + p.links().add("Movimento Prima Nota |b|w", 0); + p.setlinkhandler(link_handler); + _viswin = new TViswin(NULL, "Contabilizzazione documenti", FALSE, TRUE, TRUE); + _viswin->open_modal(); + + const clock_t start_time = clock(); + + long txt_scrolled = -1; + const int items = doc_in.items(); // Numero dei documenti in questa elaborazione + + if (items > 0) + { + const bool acquisto = doc_in[0].get_char(DOC_TIPOCF) == 'F'; + if (acquisto) + _check_prev_cont = FALSE; + } + + for (int i = 0; i < items; i++) // Scorriamo tutti i documenti nella lista + { + if (_viswin->frozen()) + break; + + const long txt_pos = _viswin->lines(); + + TDocumento& doc = doc_in[i]; + msg = "Elaborazione documento "; + msg << doc.anno() << ' '; + msg << doc.numerazione() << '/'; + msg << doc.numero(); + _viswin->add_line(msg); + + if (i > 0) + { + const clock_t time = (clock() - start_time) / CLOCKS_PER_SEC; + if (time > 0) + { + TString80 stats; + const int min = int(time / 60L); + const int sec = int(time % 60L); + stats.format(" (docs=%d time=%d:%02d docs/min=%ld)", i, min, sec, long(i*60L)/time); + msg << stats; + } + } + xvt_statbar_set(msg); + do_events(); + + _movimento = new TMovimentoPN_VE(doc.in_valuta()); + + if (_can_write && _check_prev_cont && !prev_contabilized(doc)) + _error = cont_seq_error; + + if (good()) + { + compile_head_mov(doc); + if (good()) + compile_rows_mov(doc); + } + + if (good() && _can_write) + { + if (write_all(doc) == no_error) // Se la scrittura e' andata ok... + { + if (good() && in_enabled()) + write_intra(doc); + + if (doc.get_real(DOC_IMPPAGATO) != ZERO) + if (write_anticipo(doc) != no_error) + _movimento->remove(); // Se si è verificato un errore nella scrittura dell'anticipo rimuove il movimento di prima nota + + if (good()) + { + _total_docs++; + aggiorna_saldi(TRUE); + change_doc_status(doc); + + msg = "Generazione Movimento "; + msg << "$[b,w]" << _movimento->curr().get(MOV_NUMREG) << "$[n,w]"; + msg << " del " << _movimento->curr().get(MOV_DATAREG); + _viswin->add_line(msg); + } + } + } + + if (!good()) + { + display_error(doc); + if (_error == movement_error || !_movimento->movement_ok()) + { + TToken_string str(32, ' '); + msg.format("%24s %24s Conto", "Dare", "Avere"); + _viswin->add_line(msg); + + const int imax = _movimento->cg_items(); + for (int i = 0; i < imax; i++) + { + const TRectype& r = _movimento->cg(i); + const char sez = r.get_char(RMV_SEZIONE); + const TCurrency imp(r.get_real(RMV_IMPORTO)); + if (sez == 'D') + msg.format("%24s %24s", imp.string(TRUE), ""); + else + msg.format("%24s %24s", "", imp.string(TRUE)); + + TBill bill(r); + str.cut(0); + bill.add_to(str, 0, 0x2); + msg << ' ' << str; + _viswin->add_line(msg); + } + } + if (txt_scrolled < 0) + { + txt_scrolled = txt_pos; + _viswin->goto_pos(txt_pos, 0); + do_events(); + } + } + + _viswin->add_line(""); + if (_caus != NULL) + { + delete _caus; + _caus = NULL; + } + delete _movimento; + + // Let's free some valuable space + if (!interattivo) + doc_in.destroy(i, FALSE); + } + _viswin->close_print(); + _viswin->close_modal(); + if (!interattivo) + { + if (_viswin->frozen()) + message_box("Contabilizzazione interrotta dall'utente"); + else + message_box("Contabilizzazione terminata"); + } + _viswin->run(); + delete _viswin; _viswin = NULL; + + return _can_write; // Se non ha riscontrato errori per nessun documento, _can_write = TRUE +} + diff --git a/ve/vepriv.h b/ve/vepriv.h index e48560777..7ad897782 100755 --- a/ve/vepriv.h +++ b/ve/vepriv.h @@ -21,4 +21,4 @@ bool qtaart_handler(TMask_field& f, KEY key); bool qta_handler(TMask_field& f, KEY key); bool qta_evasa_handler(TMask_field& f, KEY key); bool causmag_handler(TMask_field& f, KEY key); -#endif +bool numdocrif_hndl(TMask_field& field, KEY key); diff --git a/ve/verig.uml b/ve/verig.uml index a20ad9516..60f1e712c 100755 --- a/ve/verig.uml +++ b/ve/verig.uml @@ -83,11 +83,11 @@ IFDEF(CH_CODMAG) CHECKTYPE CH_CODMAG ELSEIF CHECKTYPE NORMAL -ENDIF +ENDIF IFDEF(MS_CODMAG) MESSAGE MS_CODMAG ENDIF - FIELD CODMAG[1,3] + FIELD CODMAG[1,3] IFDEF(DI1_CODMAG) DI1_CODMAG DI2_CODMAG @@ -98,7 +98,7 @@ IFDEF(DI1_CODMAG) DI7_CODMAG DI8_CODMAG DI9_CODMAG -ENDIF +ENDIF END IFDEF(FLD_DESMAG) @@ -208,7 +208,7 @@ ENDIF USE LF_CODCORR KEY 2 JOIN LF_ANAMAG INTO CODART==CODART INPUT CODARTALT FR_CODART - DISPLAY "Codice\nalternativo@20" CODARTALT + DISPLAY "Codice\nalternativo@20" CODARTALT DISPLAY "Descrizione@50" LF_ANAMAG->DESCR DISPLAY "Codice@20" CODART OUTPUT FR_CODART CODART @@ -586,8 +586,8 @@ ENDIF IFDEF(FLD_DESCR) STRING 150 8 -BEGIN - PROMPT 2 6 "Codice " +BEGIN + PROMPT 2 6 "Codice " FLAGS "U" USE LF_GOLEM INPUT CODICE 150 @@ -597,7 +597,7 @@ BEGIN OUTPUT 150 CODICE CHECKTYPE NORMAL ADD RUN ve0 -5 -END +END ZOOM FR_DESCR 50 BEGIN @@ -605,7 +605,7 @@ IFDEF(X_DESCR) PROMPT X_DESCR Y_DESCR PR_DESCR ELSEIF PROMPT 2 7 "Descrizione " -ENDIF +ENDIF COPY ALL 150 ADD RUN ve0 -5 IFDEF(MS_DESCR) @@ -819,7 +819,7 @@ ENDIF IFDEF(CH_UMQTA) CHECKTYPE CH_UMQTA ELSEIF - CHECKTYPE NORMAL + CHECKTYPE REQUIRED ENDIF END @@ -884,10 +884,10 @@ ELSEIF ENDIF IFDEF(FLD_PERCSP) FLAGS "H" -ENDIF +ENDIF IFDEF(FL_QTA) FLAGS FL_QTA -ENDIF +ENDIF IFDEF(MS_QTA) MESSAGE MS_QTA ENDIF @@ -909,7 +909,7 @@ IFDEF(FLD_QTA) ENDIF IFDEF(FL_PERCSP) FLAGS FL_PERCSP -ENDIF +ENDIF IFDEF(MS_PERCSP) MESSAGE MS_PERCSP ENDIF @@ -967,7 +967,7 @@ ELSEIF ENDIF IFDEF(FL_QTAEVASA) FLAGS FL_QTAEVASA -ENDIF +ENDIF IFDEF(MS_QTAEVASA) MESSAGE MS_QTAEVASA ENDIF @@ -1000,7 +1000,7 @@ ELSEIF ENDIF IFDEF(FL_DATACONS) FLAGS FL_DATACONS -ENDIF +ENDIF FIELD DATACONS END ENDIF @@ -1013,10 +1013,10 @@ IFDEF(X_NCOLLI) PROMPT X_NCOLLI Y_NCOLLI PR_NCOLLI ELSEIF PROMPT 2 12 "N.Colli " -ENDIF +ENDIF IFDEF(FL_NCOLLI) FLAGS FL_NCOLLI -ENDIF +ENDIF IFDEF(MS_NCOLLI) MESSAGE MS_NCOLLI ENDIF @@ -1036,7 +1036,7 @@ ELSEIF ENDIF IFDEF(FL_TARA) FLAGS FL_TARA -ENDIF +ENDIF IFDEF(MS_TARA) MESSAGE MS_TARA ENDIF @@ -1057,7 +1057,7 @@ ELSEIF ENDIF IFDEF(FL_PNETTO) FLAGS FL_PNETTO -ENDIF +ENDIF IFDEF(MS_PNETTO) MESSAGE MS_PNETTO ENDIF @@ -1090,7 +1090,7 @@ ELSEIF ENDIF IFDEF(FL_SCONTO) FLAGS FL_SCONTO -ENDIF +ENDIF IFDEF(MS_SCONTO) MESSAGE MS_SCONTO ENDIF @@ -1108,7 +1108,7 @@ ELSEIF ENDIF IFDEF(FL_PERCPROV) FLAGS FL_PERCPROV -ENDIF +ENDIF IFDEF(MS_PERCPROV) MESSAGE MS_PERCPROV ENDIF @@ -1129,7 +1129,7 @@ ELSEIF ENDIF IFDEF(FL_IMPFISUN) FLAGS FL_IMPFISUN -ENDIF +ENDIF IFDEF(MS_IMPFISUN) MESSAGE MS_IMPFISUN ENDIF @@ -1170,7 +1170,7 @@ ENDIF FLAGS "U" IFDEF(FL_CODIVA) FLAGS FL_CODIVA -ENDIF +ENDIF VALIDATE ZEROFILL_FUNC 2 IFDEF(CH_CODIVA) CHECKTYPE CH_CODIVA @@ -1199,7 +1199,7 @@ ENDIF OUTPUT FR_DESIVA S0 IFDEF(FL_DESIVA) FLAGS FL_DESIVA -ENDIF +ENDIF IFDEF(MS_DESIVA) MESSAGE MS_DESIVA ENDIF @@ -1236,7 +1236,7 @@ ENDIF FLAGS "UZ" IFDEF(FL_ASPBENI) FLAGS FL_ASPBENI -ENDIF +ENDIF IFDEF(MS_ASPBENI) MESSAGE MS_ASPBENI ENDIF @@ -1278,7 +1278,7 @@ ENDIF FLAGS "U" IFDEF(FL_CAUS) FLAGS FL_CAUS -ENDIF +ENDIF IFDEF(MS_CAUS) MESSAGE MS_CAUS ENDIF @@ -1287,7 +1287,7 @@ IFDEF(CH_CAUS) ELSEIF CHECKTYPE NORMAL ENDIF - FIELD CODCAUS + FIELD CAUSMAG END IFDEF(FLD_DESCRCAUS) @@ -1414,7 +1414,7 @@ ELSEIF ENDIF IFDEF(FL_QTAGG1) FLAGS FL_QTAGG1 -ENDIF +ENDIF IFDEF(MS_QTAGG1) MESSAGE MS_QTAGG1 ENDIF @@ -1422,7 +1422,7 @@ IFDEF(NC_QTAGG1) NUM_CALC NC_QTAGG1 ENDIF FIELD QTAGG1 -END +END ENDIF IFDEF(FLD_QTAGG2) @@ -1435,7 +1435,7 @@ ELSEIF ENDIF IFDEF(FL_QTAGG2) FLAGS FL_QTAGG2 -ENDIF +ENDIF IFDEF(MS_QTAGG2) MESSAGE MS_QTAGG2 ENDIF @@ -1443,7 +1443,7 @@ IFDEF(NC_QTAGG2) NUM_CALC NC_QTAGG2 ENDIF FIELD QTAGG2 -END +END ENDIF IFDEF(FLD_QTAGG3) @@ -1456,7 +1456,7 @@ ELSEIF ENDIF IFDEF(FL_QTAGG3) FLAGS FL_QTAGG3 -ENDIF +ENDIF IFDEF(MS_QTAGG3) MESSAGE MS_QTAGG3 ENDIF @@ -1464,7 +1464,7 @@ IFDEF(NC_QTAGG3) NUM_CALC NC_QTAGG3 ENDIF FIELD QTAGG3 -END +END ENDIF IFDEF(FLD_QTAGG4) @@ -1477,7 +1477,7 @@ ELSEIF ENDIF IFDEF(FL_QTAGG4) FLAGS FL_QTAGG4 -ENDIF +ENDIF IFDEF(MS_QTAGG4) MESSAGE MS_QTAGG4 ENDIF @@ -1485,7 +1485,7 @@ IFDEF(NC_QTAGG1) NUM_CALC NC_QTAGG4 ENDIF FIELD QTAGG4 -END +END ENDIF IFDEF(FLD_QTAGG5) @@ -1498,7 +1498,7 @@ ELSEIF ENDIF IFDEF(FL_QTAGG5) FLAGS FL_QTAGG5 -ENDIF +ENDIF IFDEF(MS_QTAGG5) MESSAGE MS_QTAGG5 ENDIF @@ -1506,7 +1506,7 @@ IFDEF(NC_QTAGG5) NUM_CALC NC_QTAGG5 ENDIF FIELD QTAGG5 -END +END ENDIF IFDEF(FLD_IMPIANTO) @@ -1516,7 +1516,7 @@ IFDEF(X_IMPIANTO) PROMPT X_IMPIANTO Y_IMPIANTO PR_IMPIANTO ELSEIF PROMPT 2 9 "Impianto " -ENDIF +ENDIF USE IMP INPUT CODTAB FR_IMPIANTO DISPLAY "Codice Impianto" CODTAB @@ -1530,7 +1530,7 @@ ELSEIF FLAGS "U" CHECKTYPE NORMAL ENDIF -END +END STRING FR_DESIMP 50 BEGIN @@ -1538,14 +1538,14 @@ IFDEF(X_IMPIANTO) PROMPT 22 Y_IMPIANTO "" ELSEIF PROMPT 22 9 "" -ENDIF +ENDIF USE IMP KEY 2 INPUT S0 FR_DESIMP DISPLAY "Descrizione @50" S0 DISPLAY "Codice Impianto" CODTAB COPY OUTPUT FR_IMPIANTO CHECKTYPE NORMAL -END +END ENDIF IFDEF(FLD_LINEA) @@ -1555,7 +1555,7 @@ IFDEF(X_LINEA) PROMPT X_LINEA Y_LINEA PR_LINEA ELSEIF PROMPT 2 10 "Linea " -ENDIF +ENDIF USE LNP INPUT CODTAB FR_LINEA DISPLAY "Codice Linea" CODTAB @@ -1569,7 +1569,7 @@ ELSEIF FLAGS "U" CHECKTYPE NORMAL ENDIF -END +END STRING FR_DESLNP 50 BEGIN @@ -1577,14 +1577,14 @@ IFDEF(X_LINEA) PROMPT 22 Y_LINEA "" ELSEIF PROMPT 22 10 "" -ENDIF +ENDIF USE LNP KEY 2 INPUT S0 FR_DESLNP DISPLAY "Descrizione @50" S0 DISPLAY "Codice Linea" CODTAB COPY OUTPUT FR_LINEA CHECKTYPE NORMAL -END +END ENDIF #endif @@ -1609,5 +1609,5 @@ END ENDPAGE - + ENDMASK diff --git a/ve/vetabcom.txt b/ve/vetabcom.txt index 8d49e0304..a392278ed 100755 --- a/ve/vetabcom.txt +++ b/ve/vetabcom.txt @@ -18,7 +18,7 @@ ELD|EFF1|generazione effetti||F01 NAC FAA||4||F01|222|F01|4|||5||||||||||||||||| ELD|FAT1|Fatture differite| XXXXXX XXX|B01|FB|3||F01|2|F01|1|||2|||||||||||||||||||||||||||||||||||||||| |X| | | | | | | | | ELD|ORDC|bollettazione ordini||ORC||3|ORC|B01|2|B01|1|||1||1|||||||||||||||||||||||||||||||||||||| | | | | | | | |X| | FRD|BASESCONTO|Importo di riferimento per gli sconti|SOMMA("IMPONIBILE()","(TIPO()!='S')&&(TIPO()!='C')")||||||||||||||||||||||||||0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000||||||X|X| | | | | |X| | | -FRD|BOLLI|Spese bolli|BOLLI(_TOTDOC, 1, 0)||||||||||||||||||||||||||0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000||||||X|X| | | | | |X| | | +FRD|BOLLI|Spese bolli|BOLLI(_TOTDOC, 1)||||||||||||||||||||||||||0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000||||||X|X| | | | | |X| | | FRD|IMPONIBILI|Totale imponibili|IMPONIBILI(1)||||||||||||||||||||||||||0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000||||||X|X| | | | | |X| | | FRD|IMPOSTE|Totale imposte|IMPOSTE(1)||||||||||||||||||||||||||0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000||||||X|X| | | | | |X| | | FRD|OMAGGI|Valore omaggi|SOMMA("PREZZONS*QTA","TIPO()=='O'")||||||||||||||||||||||||||0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000||||||X|X| | | | | |X| | | @@ -27,7 +27,7 @@ FRD|SCONTOT|Totale sconti di testa|-SOMMA("IMPONIBILE()","TIPO()=='C'")||||||||| FRD|SPESE|Totale spese da addebitare|SOMMA("IMPONIBILE()","TIPO()=='S'")||||||||||||||||||||||||||0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000||||||X|X| | | | | |X| | | FRD|SPESGEN|Spese generali in %|SOMMA("IMPONIBILE()","TIPORIGA=='04'")||||||||||||||||||||||||||0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000||||||X|X| | | | | |X| | | FRD|SPESIMB|Spese a quantita' e prezzo|SOMMA("IMPONIBILE()","TIPORIGA=='03'")||||||||||||||||||||||||||0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000||||||X|X| | | | | |X| | | -FRD|SPESINC|Spese incasso|SPESEINC(_TOTDOC,1,0)||||||||||||||||||||||||||0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000||||||X|X| | | | | |X| | | +FRD|SPESINC|Spese incasso|SPESEINC(_TOTDOC,1)||||||||||||||||||||||||||0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000||||||X|X| | | | | |X| | | FRD|SPESTRA|Spese a valore|SOMMA("IMPONIBILE()","TIPORIGA=='02'")||||||||||||||||||||||||||0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000||||||X|X| | | | | |X| | | FRD|TOTDOC|Totale fattura|IMPONIBILI()+IMPOSTE()||||||||||||||||||||||||||0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000||||||X|X| | | | | |X| | | FRD|TOTMER|Totale importi netti merce|SOMMA("IMPONIBILE()","TIPO()=='M'")||||||||||||||||||||||||||0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000|0.00000||||||X|X| | | | | |X| | |