diff --git a/cd/test/ba0834.txt b/cd/test/ba0834.txt new file mode 100644 index 000000000..83f9a314e --- /dev/null +++ b/cd/test/ba0834.txt @@ -0,0 +1,14 @@ +recdesc\f175.dir +recdesc\f178.dir +recdesc\f177.trr +recdesc\f177.dir +recdesc\f176.trr +recdesc\f179.trr +recdesc\f176.dir +recdesc\f179.dir +recdesc\f175.trr +recdesc\f178.trr +recdesc\f20.trr +recdesc\f20.dir + +Aggiornamento tracciati per personalizzazioni FP \ No newline at end of file diff --git a/cd/test/ba0834a.ini b/cd/test/ba0834a.ini new file mode 100644 index 000000000..a72fc9e84 --- /dev/null +++ b/cd/test/ba0834a.ini @@ -0,0 +1,49 @@ +[Main] +Demo=0 + +[ba1] +Edit_4 = ba3 -0 +Edit_5 = ba3 -0 +Edit_6 = ba4 -1 +File(225) = recdesc\f175.dir|X +File(226) = recdesc\f175.trr|X +File(227) = recdesc\f176.dir|X +File(228) = recdesc\f176.trr|X +File(229) = recdesc\f177.dir|X +File(230) = recdesc\f177.trr|X +File(231) = recdesc\f178.dir|X +File(232) = recdesc\f178.trr|X +File(233) = recdesc\f179.dir|X +File(234) = recdesc\f179.trr|X +Patch = 834 +Versione = 21511200 + +[ba2] +File(380) = recdesc\f20.dir|X +File(381) = recdesc\f20.trr|X +Patch = 834 +Versione = 21511200 + +[ba99] +Kill(0) = wxmsw240.dll|x +Kill(1) = batbsce.txt|x +Kill(2) = bastfsc.rep|x +Kill(3) = bastfsc.msk|x +Kill(4) = bastcms.msk|x +Kill(5) = bastcms.rep|x +Kill(6) = bastuue.rep|x +Kill(7) = bastuue.msk|x + +[ba] +Data = 24-06-2019 +Descrizione = Base +Dischi = 1 +Moduli = sy +OEM = +Patch = 0834 +PostProcess = bainst -0 BA +PreProcess = +Prezzo(1) = +Prezzo(2) = +Versione = 21511200 + diff --git a/cd/test/ba0834a1.zip b/cd/test/ba0834a1.zip new file mode 100644 index 000000000..484d57de1 Binary files /dev/null and b/cd/test/ba0834a1.zip differ diff --git a/cd/test/cg0834.txt b/cd/test/cg0834.txt new file mode 100644 index 000000000..d62df140d --- /dev/null +++ b/cd/test/cg0834.txt @@ -0,0 +1,4 @@ +cg0.exe +cg0200a.msk + +Aggiornamento anagrafica clienti per personalizzazioni FP \ No newline at end of file diff --git a/cd/test/cg0834a.ini b/cd/test/cg0834a.ini new file mode 100644 index 000000000..88bd339c8 --- /dev/null +++ b/cd/test/cg0834a.ini @@ -0,0 +1,98 @@ +[Main] +Demo=0 + +[cg0] +Edit_19 = cg0 -0 +Edit_20 = cg0 -1 +Edit_26 = cg0 -4 +Edit_5 = cg0 -5 +File(0) = cg0.exe|X +File(2) = cg0200a.msk|X +Patch = 834 +Versione = 21511200 + +[cg99] +Kill(0) = bastcve.rep|x +Kill(1) = batbcve.msk|x +Kill(2) = bastscc.rep|x +Kill(3) = batbtra.msk|x +Kill(4) = batbesc.msk|x +Kill(5) = batbivd.msk|x +Kill(6) = bastleg.rep|x +Kill(7) = bastver.rep|x +Kill(8) = bastver.msk|x +Kill(9) = bastcfi.msk|x +Kill(10) = batblbu.msk|x +Kill(11) = batblia.msk|x +Kill(12) = bastarb.rep|x +Kill(13) = bastcco.msk|x +Kill(14) = bastcam.msk|x +Kill(15) = batbpdb.msk|x +Kill(16) = batbleg.msk|x +Kill(17) = bastesc.rep|x +Kill(18) = bastpdb.msk|x +Kill(19) = batbscc.msk|x +Kill(20) = batbind.msk|x +Kill(21) = bastivd.rep|x +Kill(22) = batbdel.msk|x +Kill(23) = bastzon.rep|x +Kill(24) = bastcfi.rep|x +Kill(25) = bastntb.rep|x +Kill(26) = batbarb.msk|x +Kill(27) = bastzon.msk|x +Kill(28) = bastcam.rep|x +Kill(29) = bastmsp.rep|x +Kill(30) = bastscc.msk|x +Kill(31) = batbpor.msk|x +Kill(32) = batbmsp.msk|x +Kill(33) = bastarb.msk|x +Kill(34) = bastpdb.rep|x +Kill(35) = bastivd.msk|x +Kill(36) = bastnot.rep|x +Kill(37) = bastndo.msk|x +Kill(38) = bastcco.rep|x +Kill(39) = bastnot.msk|x +Kill(40) = batbntb.msk|x +Kill(41) = batbtit.msk|x +Kill(42) = batbinl.msk|x +Kill(43) = bastmsp.msk|x +Kill(44) = batbreg.msk|x +Kill(45) = batbcco.msk|x +Kill(46) = bastreg.msk|x +Kill(47) = batbnot.msk|x +Kill(48) = bastesc.msk|x +Kill(49) = batbvet.msk|x +Kill(50) = bastpor.msk|x +Kill(51) = batbdpn.msk|x +Kill(52) = batbzon.msk|x +Kill(53) = batblia.msk|x +Kill(54) = batbcfi.msk|x +Kill(55) = batbndo.msk|x +Kill(56) = bastdpn.msk|x +Kill(57) = bastdpn.rep|x +Kill(58) = bastndo.rep|x +Kill(59) = bastntb.msk|x +Kill(60) = bastvet.rep|x +Kill(61) = bastpor.rep|x +Kill(62) = bastreg.rep|x +Kill(63) = batbver.msk|x +Kill(64) = batbcam.msk|x +Kill(65) = bastvet.msk|x +Kill(66) = bastleg.msk|x +Kill(67) = bastcve.msk|x +Kill(68) = cgtbcon.msk|x +Kill(69) = batbins.msk|x + +[cg] +Data = 24-06-2019 +Descrizione = Contabilita' Generale +Dischi = 1 +Moduli = ba +OEM = +Patch = 834 +PostProcess = bainst -0 CG +PreProcess = +Prezzo(1) = +Prezzo(2) = +Versione = 21511200 + diff --git a/cd/test/cg0834a1.zip b/cd/test/cg0834a1.zip new file mode 100644 index 000000000..cd87dca01 Binary files /dev/null and b/cd/test/cg0834a1.zip differ diff --git a/cd/test/cg0838.txt b/cd/test/cg0838.txt new file mode 100644 index 000000000..2f42b794e --- /dev/null +++ b/cd/test/cg0838.txt @@ -0,0 +1,6 @@ +cg2.exe +cg2fppro.msk + +Aggiunta ritenuta da acconto da F1 +Corretto importo totale con ritenuta +Aggiunto bottone in maschera fppro per solo collegamento senza riporto dati diff --git a/cd/test/cg0838a.ini b/cd/test/cg0838a.ini new file mode 100644 index 000000000..ab116fbac --- /dev/null +++ b/cd/test/cg0838a.ini @@ -0,0 +1,95 @@ +[Main] +Demo=0 + +[cg2] +Edit_23 = cg2 -0 +File(162) = cg2.exe|X +File(176) = cg2fppro.msk|X +Patch = 0838 +Versione = 21511200 + +[cg99] +Kill(0) = batbscc.msk|x +Kill(1) = bastntb.rep|x +Kill(2) = batbpor.msk|x +Kill(3) = bastpdb.msk|x +Kill(4) = bastcfi.rep|x +Kill(5) = bastscc.msk|x +Kill(6) = bastzon.msk|x +Kill(7) = bastarb.msk|x +Kill(8) = batbarb.msk|x +Kill(9) = batbmsp.msk|x +Kill(10) = batbpdb.msk|x +Kill(11) = bastivd.rep|x +Kill(12) = bastcam.msk|x +Kill(13) = batbind.msk|x +Kill(14) = bastesc.rep|x +Kill(15) = bastzon.rep|x +Kill(16) = batbleg.msk|x +Kill(17) = batbdel.msk|x +Kill(18) = batblia.msk|x +Kill(19) = batblbu.msk|x +Kill(20) = bastcco.msk|x +Kill(21) = bastarb.rep|x +Kill(22) = bastntb.msk|x +Kill(23) = bastvet.msk|x +Kill(24) = bastndo.rep|x +Kill(25) = batbcam.msk|x +Kill(26) = bastcve.msk|x +Kill(27) = bastleg.msk|x +Kill(28) = batbvet.msk|x +Kill(29) = batbndo.msk|x +Kill(30) = bastpor.rep|x +Kill(31) = bastesc.msk|x +Kill(32) = batbcfi.msk|x +Kill(33) = bastvet.rep|x +Kill(34) = bastdpn.rep|x +Kill(35) = batbver.msk|x +Kill(36) = bastdpn.msk|x +Kill(37) = bastreg.rep|x +Kill(38) = bastnot.msk|x +Kill(39) = batbcco.msk|x +Kill(40) = batbdpn.msk|x +Kill(41) = bastcco.rep|x +Kill(42) = batbreg.msk|x +Kill(43) = bastpor.msk|x +Kill(44) = batbnot.msk|x +Kill(45) = batblia.msk|x +Kill(46) = bastreg.msk|x +Kill(47) = batbzon.msk|x +Kill(48) = bastmsp.rep|x +Kill(49) = bastivd.msk|x +Kill(50) = batbtit.msk|x +Kill(51) = bastcam.rep|x +Kill(52) = bastpdb.rep|x +Kill(53) = batbntb.msk|x +Kill(54) = bastndo.msk|x +Kill(55) = bastmsp.msk|x +Kill(56) = bastnot.rep|x +Kill(57) = batbinl.msk|x +Kill(58) = batbins.msk|x +Kill(59) = cgtbcon.msk|x +Kill(60) = bastcfi.msk|x +Kill(61) = bastver.msk|x +Kill(62) = batbcve.msk|x +Kill(63) = bastcve.rep|x +Kill(64) = batbivd.msk|x +Kill(65) = batbesc.msk|x +Kill(66) = batbtra.msk|x +Kill(67) = bastscc.rep|x +Kill(68) = bastver.rep|x +Kill(69) = bastleg.rep|x + +[cg] +Data = 25-06-2019 +Descrizione = Contabilita' Generale +Dischi = 1 +Moduli = ba +OEM = +Patch = 838 +PostProcess = bainst -0 CG +PreProcess = +Prezzo(1) = +Prezzo(2) = +Versione = 21511200 + diff --git a/cd/test/cg0838a1.zip b/cd/test/cg0838a1.zip new file mode 100644 index 000000000..c22f30a87 Binary files /dev/null and b/cd/test/cg0838a1.zip differ diff --git a/cd/test/fp0834.txt b/cd/test/fp0834.txt new file mode 100644 index 000000000..d62604c0b --- /dev/null +++ b/cd/test/fp0834.txt @@ -0,0 +1,7 @@ +fp0.exe +fp0500a.msk +fpmenu.men +sql\fp0\fp0110.sql +sql\fp0\fp0108.sql + +Implementazione personalizzazioni FP + aggiornamento esportazione diff --git a/cd/test/fp0834a.ini b/cd/test/fp0834a.ini new file mode 100644 index 000000000..ed5276ab2 --- /dev/null +++ b/cd/test/fp0834a.ini @@ -0,0 +1,23 @@ +[Main] +Demo=0 + +[fp1] +File(0) = fp0.exe|X +File(5) = fp0500a.msk|X +File(10) = fpmenu.men|X +File(11) = sql\fp0\fp0110.sql|X +File(12) = sql\fp0\fp0108.sql|X +Patch = 834 +Versione = 21511200 + +[fp] +Data = 24-06-2019 +Descrizione = Fattura Elettronica +Dischi = 1 +Moduli = cg,ve +OEM = +Patch = 834 +PostProcess = +PreProcess = +Versione = 21511200 + diff --git a/cd/test/fp0834a1.zip b/cd/test/fp0834a1.zip new file mode 100644 index 000000000..e6482c6d8 Binary files /dev/null and b/cd/test/fp0834a1.zip differ diff --git a/cd/test/fp0836.txt b/cd/test/fp0836.txt new file mode 100644 index 000000000..596747327 --- /dev/null +++ b/cd/test/fp0836.txt @@ -0,0 +1,4 @@ +fp0.exe + +Esportazione da f1-fp delle ritenute di acconto +Correzione se importo e' nullo diff --git a/cd/test/fp0836a.ini b/cd/test/fp0836a.ini new file mode 100644 index 000000000..26d63b332 --- /dev/null +++ b/cd/test/fp0836a.ini @@ -0,0 +1,19 @@ +[Main] +Demo=0 + +[fp1] +File(0) = fp0.exe|X +Patch = 0836 +Versione = 21511200 + +[fp] +Data = 25-06-2019 +Descrizione = Fattura Elettronica +Dischi = 1 +Moduli = cg,ve +OEM = +Patch = 836 +PostProcess = +PreProcess = +Versione = 21511200 + diff --git a/cd/test/fp0836a1.zip b/cd/test/fp0836a1.zip new file mode 100644 index 000000000..a3b3ebb25 Binary files /dev/null and b/cd/test/fp0836a1.zip differ diff --git a/cd/test/ve0834.txt b/cd/test/ve0834.txt new file mode 100644 index 000000000..3a2169dab --- /dev/null +++ b/cd/test/ve0834.txt @@ -0,0 +1,4 @@ +ve0.exe +vetbtip.msk + +Aggiornamento tipo documento per personalizzazioni FP \ No newline at end of file diff --git a/cd/test/ve0834a.ini b/cd/test/ve0834a.ini new file mode 100644 index 000000000..f4e79f14a --- /dev/null +++ b/cd/test/ve0834a.ini @@ -0,0 +1,130 @@ +[Main] +Demo=0 + +[ve1] +File(0) = ve0.exe|X +File(225) = vetbtip.msk|X +Patch = 834 +Versione = 21511200 + +[ve99] +Kill(0) = batbimb.msk|x +Kill(1) = batbacr.msk|x +Kill(2) = eftbbnp.msk|x +Kill(3) = bastgmc.rep|x +Kill(4) = bastabe.msk|x +Kill(5) = bastbnp.msk|x +Kill(6) = bastfrd.rep|x +Kill(7) = bastcra.rep|x +Kill(8) = ve7701a.ini|x +Kill(9) = bastgcg.rep|x +Kill(10) = batbstd.msk|x +Kill(11) = batbfca.msk|x +Kill(12) = batbnum.msk|x +Kill(13) = bastfrm.msk|x +Kill(14) = batbfsa.msk|x +Kill(15) = batbgsa.msk|x +Kill(16) = bastfrm.rep|x +Kill(17) = ve7400conf.ini|x +Kill(18) = bastgca.rep|x +Kill(19) = batbbnp.msk|x +Kill(20) = bastctr.rep|x +Kill(21) = batbprv.msk|x +Kill(22) = batbtri.msk|x +Kill(23) = batbcau.msk|x +Kill(24) = basteld.rep|x +Kill(25) = ve7700a.msk|x +Kill(26) = batbgca.msk|x +Kill(27) = efstbnp.rep|x +Kill(28) = ve7200a.msk|x +Kill(29) = basttip.rep|x +Kill(30) = bastcra.msk|x +Kill(31) = bastasf.rep|x +Kill(32) = bastcau.rep|x +Kill(33) = ve7500a.msk|x +Kill(34) = basttag.rep|x +Kill(35) = bastfrr.msk|x +Kill(36) = bastspp.msk|x +Kill(37) = bastums.rep|x +Kill(38) = batbabe.msk|x +Kill(39) = batbprs.msk|x +Kill(40) = batbgmc.msk|x +Kill(41) = bastgca.msk|x +Kill(42) = batbcaa.msk|x +Kill(43) = bastrfa.rep|x +Kill(44) = bastimb.rep|x +Kill(45) = ve7100a.msk|x +Kill(46) = basttri.rep|x +Kill(47) = basteld.msk|x +Kill(48) = batbtip.msk|x +Kill(49) = ve7.exe|x +Kill(50) = bastcau.msk|x +Kill(51) = bastrfc.rep|x +Kill(52) = batbrfc.msk|x +Kill(53) = bastubi.rep|x +Kill(54) = ve7300a.frm|x +Kill(55) = bastgmc.msk|x +Kill(56) = bastabe.rep|x +Kill(57) = batbfid.msk|x +Kill(58) = batbctr.msk|x +Kill(59) = bastums.msk|x +Kill(60) = bastasf.msk|x +Kill(61) = bastfrr.rep|x +Kill(62) = ve7600a.msk|x +Kill(63) = batbspp.msk|x +Kill(64) = batbtag.msk|x +Kill(65) = ve7300a.msk|x +Kill(66) = bastgcg.msk|x +Kill(67) = bastubi.msk|x +Kill(68) = bastnum.rep|x +Kill(69) = bastrfa.msk|x +Kill(70) = batbgcg.msk|x +Kill(71) = ve7400a.ini|x +Kill(72) = bastcaa.msk|x +Kill(73) = batbasf.msk|x +Kill(74) = bastfca.rep|x +Kill(75) = batbmre.msk|x +Kill(76) = baststd.msk|x +Kill(77) = batbspt.msk|x +Kill(78) = batbrfa.msk|x +Kill(79) = bastprs.msk|x +Kill(80) = bastimb.msk|x +Kill(81) = bastrfc.msk|x +Kill(82) = batbpro.msk|x +Kill(83) = bastctr.msk|x +Kill(84) = basttag.msk|x +Kill(85) = batbfrr.msk|x +Kill(86) = batbubi.msk|x +Kill(87) = ve7200a.frm|x +Kill(88) = batbfrd.msk|x +Kill(89) = bastfca.msk|x +Kill(90) = batbfrm.msk|x +Kill(91) = batbcra.msk|x +Kill(92) = bastnum.msk|x +Kill(93) = basttri.msk|x +Kill(94) = batbums.msk|x +Kill(95) = batbeld.msk|x +Kill(96) = efstbnp.msk|x +Kill(97) = bastcaa.rep|x +Kill(98) = bastspp.rep|x +Kill(99) = batbcld.msk|x +Kill(100) = bastfrd.msk|x +Kill(101) = ve7400a.msk|x +Kill(102) = bastbnp.rep|x +Kill(103) = baststd.rep|x +Kill(104) = basttip.msk|x +Kill(105) = bastprs.rep|x + +[ve] +Data = 11-06-2019 +Descrizione = Vendite +Dischi = 1 +Moduli = ba,cg9,pr9,mg9,sv9,in9,ef9 +OEM = +Patch = 834 +PostProcess = bainst -0 VE +PreProcess = +Prezzo(1) = +Prezzo(2) = +Versione = 21511200 + diff --git a/cd/test/ve0834a1.zip b/cd/test/ve0834a1.zip new file mode 100644 index 000000000..5d4312219 Binary files /dev/null and b/cd/test/ve0834a1.zip differ diff --git a/src/cg/cg2100.cpp b/src/cg/cg2100.cpp index 1dff5d08b..312c4fdc5 100755 --- a/src/cg/cg2100.cpp +++ b/src/cg/cg2100.cpp @@ -2268,7 +2268,7 @@ void TPrimanota_application::ini2mask(TConfig& ini, TMask& msk, bool query) } if (_f1_ini && msk.find_by_id(FS_RECALC) != NULL) { - msk.set(F_TOTALE, calcola_imp()); + //msk.set(F_TOTALE, calcola_imp()); msk.set(F_COLFPPRO, "X"); msk.set(FS_RECALC, ""); load_perc_nat(msk, ini); diff --git a/src/cg/cg2100.h b/src/cg/cg2100.h index ae01aa6fb..ac890e3ab 100755 --- a/src/cg/cg2100.h +++ b/src/cg/cg2100.h @@ -222,12 +222,13 @@ #define F_DATAORARICS 103 #define F_DATAS 104 #define F_IMPTOTDOCS 105 -#define F_NUMEROS 106 -#define F_FISCIVAPAESES 107 -#define F_FISCIVACODS 108 -#define F_CODFISCALES 109 -#define F_TIPOPROTS 110 -#define F_PROGRESSS 111 -#define F_KEYFPPROS 112 +#define F_RITENUTE 106 +#define F_NUMEROS 107 +#define F_FISCIVAPAESES 108 +#define F_FISCIVACODS 109 +#define F_CODFISCALES 110 +#define F_TIPOPROTS 111 +#define F_PROGRESSS 112 +#define F_KEYFPPROS 113 #endif diff --git a/src/cg/cg2102.cpp b/src/cg/cg2102.cpp index 6c418fac2..8d48a4d59 100755 --- a/src/cg/cg2102.cpp +++ b/src/cg/cg2102.cpp @@ -3009,7 +3009,7 @@ bool TPrimanota_application::clifo_handler(TMask_field& f, KEY key) const bool ic = ixc->active() && (alleg < 5 || alleg == 7) && paiv.full() && !m.get_bool(F_LIQDIFF); ixc->set(ic ? "X" : ""); } - if(m.get(F_PROKEY).empty()) + if(m.get(F_PROKEY).empty() && app().has_module(F1AUT)) fppro_mask(f, key); } } @@ -3906,16 +3906,15 @@ void TPrimanota_application::set_clifo(TMask& cg_msk, const shared_ptr void TPrimanota_application::set_totale(TMask& cg_msk, const shared_ptr& msk) { real totale = msk->get_totdoc(); - if(totale == 0) + if(totale == ZERO) + totale = app().calcola_imp(); + const real rit = msk->get_ritenute(); + if(rit != ZERO) { - const vector& righe = msk->get_righeiva(); - for(auto it = righe.begin(); it != righe.end(); ++it) - { - totale += it->imponibile; - totale += it->imposta; - } + totale -= rit; + cg_msk.set(F_RITFIS, rit); } - cg_msk.set(F_TOTALE, abs(totale)); + cg_msk.set(F_TOTALE, totale); } void TPrimanota_application::riporta_dati_f1(TMask& cg_msk, const shared_ptr& msk) @@ -3923,7 +3922,7 @@ void TPrimanota_application::riporta_dati_f1(TMask& cg_msk, const shared_ptrget_numdoc()); cg_msk.set(F_NUMDOC, msk->get_numdoc().right(7)); cg_msk.set(F_DATADOC, msk->get_datadoc()); - if (!cg_msk.get(F_CODCLIFOR).full()) + if (!cg_msk.get(F_CODCLIFOR).full() && msk->get_numdoc().full()) set_clifo(cg_msk, msk); set_righe_iva_f1(cg_msk, msk); set_totale(cg_msk, msk); @@ -3950,7 +3949,7 @@ bool TPrimanota_application::fppro_mask(TMask_field& f, KEY key) msk->run(); // Riporto dati FPPRO su maschera Prima Nota (solo se hai F1) // Se non hai F1 collego senza riportarti i dati (solo le chiavi db) - if(app().has_f1_db(&cg_msk)) + if(msk->should_bring_back()) riporta_dati_f1(cg_msk, msk); cg_msk.set(F_PROKEY, msk->get_fpprokeys()); is_collegato(cg_msk.field(F_COLFPPRO)); @@ -4018,6 +4017,7 @@ bool TPro_msk::load_fppro_mask(TMask* msk, KEY k) row.add(TDate(fp_db().sq_get_date("P1_DATAORARIC"))); row.add(TDate(fp_db().sq_get_date("PZ_DATA"))); row.add(fp_db().sq_get("PQ_IMPTOTDOC")); + row.add(fp_db().sq_get("P7_IMPORTORIT")); row.add(fp_db().sq_get("PZ_NUMERO")); row.add(fp_db().sq_get("P2_FISCIVAPAESE")); row.add(fp_db().sq_get("P2_FISCIVACOD")); @@ -4040,7 +4040,7 @@ bool TPro_msk::fppro_handler(TMask_field& f, KEY k) return load; } -bool TPro_msk::fppro_ok_handler(TMask_field& f, KEY k) +bool TPro_msk::riporta_handler(TMask_field& f, KEY k) { if (k != 32) return true; @@ -4049,17 +4049,19 @@ bool TPro_msk::fppro_ok_handler(TMask_field& f, KEY k) //return true; bool ok = false; TSheet_field& sf = msk.sfield(F_SHEETFPPROS); - bool loaded = false; FOR_EACH_SHEET_ROW(sf, nr, row) { - if(!loaded && *row->get(0) == 'X') + if(*row->get(0) == 'X') { //TProtocollo protocollo(TDate(row->get(2)).year(), row->get(9), row->get(10)); app()._pro_mask->set_doc(row->get(cid2index(F_NUMEROS)), row->get(cid2index(F_DATAS)), - row->get(cid2index(F_IMPTOTDOCS)), "", row->get(cid2index(F_KEYFPPROS)), + row->get(cid2index(F_IMPTOTDOCS)), row->get(cid2index(F_RITENUTE)), "", row->get(cid2index(F_KEYFPPROS)), row->get(cid2index(F_FISCIVACODS))); - loaded = true; + if (f.dlg() == DLG_OK) + app()._pro_mask->_riporta = true; + else + app()._pro_mask->_riporta = false; ok = true; break; } @@ -4073,13 +4075,18 @@ bool TPro_msk::fppro_ok_handler(TMask_field& f, KEY k) return true; } +bool TPro_msk::collega_handler(TMask_field& f, KEY k) +{ + return riporta_handler(f, k); +} + bool TPro_msk::piva_handler(TMask_field& f, KEY k) { TMask& msk = f.mask(); bool ok = true; if(k == K_TAB && f.active() && f.focusdirty()) { - ok = load_fppro_mask(&msk, 32); + ok = load_fppro_mask(&msk, K_SPACE); } return ok; } @@ -4090,7 +4097,7 @@ bool TPro_msk::date_handler(TMask_field& f, KEY k) bool ok = true; if (k == K_TAB && f.active() && f.focusdirty()) { - ok = load_fppro_mask(&msk, 32); + ok = load_fppro_mask(&msk, K_SPACE); } return ok; } @@ -4119,7 +4126,7 @@ bool TPro_msk::on_field_event(TOperable_field& o, TField_event e, long jolly) break; case F_SHOWALL: if (e == fe_modify) - load_fppro_mask(this, 32); + load_fppro_mask(this, K_SPACE); break; case F_ENABSEARCH: if (e == fe_modify) @@ -4170,11 +4177,12 @@ void TPro_msk::set_scadenze(const char* fpprokeys) } } -void TPro_msk::set_doc(const char* numero, const char* datadoc, const char* totdoc, const char* protfppro, const char* fpprokeys, const char* piva) +void TPro_msk::set_doc(const char* numero, const char* datadoc, const char* totdoc, const char* ritenute, const char* protfppro, const char* fpprokeys, const char* piva) { _numero = numero; _datadoc = datadoc; - _totdoc = totdoc; + _totdoc = abs(totdoc); + _ritenute = ritenute; _protfppro.sset(protfppro); _fpprokeys = fpprokeys; _piva = piva; @@ -4232,7 +4240,7 @@ TString& TPro_msk::query_fppro(const TString& codforn, const TString& stato_piva } static TString query; - query.cut(0) << "SELECT PZ_CLIFOR, PZ_DATA, CAST(P1_DATAORARIC AS DATE) AS P1_DATAORARIC, P7_TIPODOC, PQ_IMPTOTDOC, PZ_NUMERO, PZ_NUMREGCONT, PZ_TIPOPROT, PZ_NUMPROT, P2_FISCIVAPAESE, P2_FISCIVACOD, P2_CODFISCALE, PZ_KEYPRGINVIO, PZ_KEYHEADERFATT, PZ_KEYBODYFATT\n" << + query.cut(0) << "SELECT PZ_CLIFOR, PZ_DATA, CAST(P1_DATAORARIC AS DATE) AS P1_DATAORARIC, P7_TIPODOC, PQ_IMPTOTDOC, P7_IMPORTORIT, PZ_NUMERO, PZ_NUMREGCONT, PZ_TIPOPROT, PZ_NUMPROT, P2_FISCIVAPAESE, P2_FISCIVACOD, P2_CODFISCALE, PZ_KEYPRGINVIO, PZ_KEYHEADERFATT, PZ_KEYBODYFATT\n" << "FROM PAA0200F\n" << "JOIN FPPRO00F\n" << " ON P2_KEYPRGINVIO = PZ_KEYPRGINVIO AND P2_KEYHEADERFATT = PZ_KEYHEADERFATT AND P2_KEYBODYFATT = PZ_KEYBODYFATT\n" << "JOIN PAA0100F\n" << " ON P2_KEYPRGINVIO = P1_KEYPRGINVIO AND P2_KEYHEADERFATT = P1_KEYHEADERFATT AND P2_KEYBODYFATT = P1_KEYBODYFATT\n" << "JOIN PAA2700F\n" << "ON P2_KEYPRGINVIO = PQ_KEYPRGINVIO AND P2_KEYHEADERFATT = PQ_KEYHEADERFATT AND P2_KEYBODYFATT = PQ_KEYBODYFATT\n" << @@ -4282,10 +4290,13 @@ void TPro_msk::abilita_piva(TMask* msk) } } -TPro_msk::TPro_msk(TMask& cg_msk) : TAutomask("cg2fppro") +TPro_msk::TPro_msk(TMask& cg_msk) : TAutomask("cg2fppro"), _riporta(false) { TMask::set_handler(DLG_CONFIG, fppro_handler); - TMask::set_handler(DLG_LINK, fppro_ok_handler); + TMask::set_handler(DLG_OK, riporta_handler); + if (!app().has_module(F1AUT)) + field(DLG_OK).disable(); + TMask::set_handler(DLG_LINK, collega_handler); TMask::set_handler(F_PIVAS, piva_handler); TMask::set_handler(F_DATESEARCH, date_handler); TMask::set(F_CODCLIFORS, cg_msk.get(F_CODCLIFOR)); diff --git a/src/cg/cg2102.h b/src/cg/cg2102.h index 812cc84c4..634d4a5ec 100755 --- a/src/cg/cg2102.h +++ b/src/cg/cg2102.h @@ -408,17 +408,20 @@ class TPro_msk : public TAutomask TString _numero; TDate _datadoc; real _totdoc; + real _ritenute; TProtocollo _protfppro; TString _fpprokeys; TString _piva; vector _righe_iva; vector _scadenze; + bool _riporta; // Handlers per aggancio FPPRO // Bottone carica documenti in maschera FPPRO static bool fppro_handler(TMask_field& f, KEY k); // Bottone riporta doc FPPRO in testata Prima Nota - static bool fppro_ok_handler(TMask_field& f, KEY k); + static bool riporta_handler(TMask_field& f, KEY k); + static bool collega_handler(TMask_field& f, KEY k); static bool piva_handler(TMask_field& f, KEY k); static bool date_handler(TMask_field& f, KEY k); // Non permette la selezione multipla @@ -440,20 +443,22 @@ public: void set_righeiva(const char* fpprokeys); void set_scadenze(const char* fpprokeys); - void set_doc(const char* numero, const char* datadoc, const char* totdoc, const char* protfppro, const char* fpprokeys, const char* piva); + void set_doc(const char* numero, const char* datadoc, const char* totdoc, const char* ritenute, const char* protfppro, const char* fpprokeys, const char* piva); - TString get_numdoc() const { return _numero; } - TDate get_datadoc() const { return _datadoc; } - real get_totdoc() const { return _totdoc; } - TProtocollo& get_protocollo() { return _protfppro; } - TString get_fpprokeys() const { return _fpprokeys; } + TString get_numdoc() const { return _numero; } + TDate get_datadoc() const { return _datadoc; } + real get_totdoc() const { return _totdoc; } + real get_ritenute() { return _ritenute; } + TProtocollo& get_protocollo() { return _protfppro; } + TString get_fpprokeys() const { return _fpprokeys; } TString get_piva() const { return _piva; } const vector& get_righeiva() { return _righe_iva; } vector& get_scadenze() { return _scadenze; } void add_rigaiva(const real& imponibile, const real& imposta, const real& aliquota, const TString4& natura); void add_scad(const TDate& date, const real& importo); - + bool should_bring_back() const { return _riporta; } + static TString& query_fppro(const TString& keyprginvio, const TString& keyheaderfatt, const TString& keybodyfatt, const TString& where_str); static TString& query_fppro(const TString& codforn, const TString& date); diff --git a/src/cg/cg2FPPRO.uml b/src/cg/cg2FPPRO.uml index 5f8dcfc52..4f1fe1d4f 100644 --- a/src/cg/cg2FPPRO.uml +++ b/src/cg/cg2FPPRO.uml @@ -4,10 +4,16 @@ TOOLBAR "topbar" 0 0 0 2 BUTTON DLG_CONFIG 2 2 BEGIN - PROMPT 3 1 "Ricarica Fatture" + PROMPT 1 1 "Ricarica Fatture" PICTURE TOOL_ELABORA END +BUTTON DLG_OK 2 2 +BEGIN + PROMPT 2 1 "Riporta Documento" + MODULE F1 +END + BUTTON DLG_LINK 2 2 BEGIN PROMPT 3 1 "Collega Documento" @@ -89,6 +95,7 @@ BEGIN ITEM "Data Ricezione" ITEM "Data Doc." ITEM "Importo Totale" + ITEM "Ritenute d'acconto" ITEM "Numero" ITEM "Paese" ITEM "P. IVA" @@ -165,45 +172,51 @@ BEGIN FLAGS "D" END +NUMBER F_RITENUTE 10 3 +BEGIN + PROMPT 1 4 "Ritenute d'acconto" + FLAGS "D" +END + STRING F_NUMEROS 20 BEGIN - PROMPT 1 4 "NUMERO" + PROMPT 1 5 "NUMERO" FLAGS "D" END STRING F_FISCIVAPAESES 2 BEGIN - PROMPT 1 5 "FISCIVAPAESE" + PROMPT 1 6 "FISCIVAPAESE" FLAGS "D" END STRING F_FISCIVACODS 16 BEGIN - PROMPT 1 6 "FISCIVACOD" + PROMPT 1 7 "FISCIVACOD" FLAGS "D" END STRING F_CODFISCALES 16 BEGIN - PROMPT 1 7 "CODFISCALE" + PROMPT 1 8 "CODFISCALE" FLAGS "D" END STRING F_TIPOPROTS 2 BEGIN - PROMPT 1 8 "TIPOPROT" + PROMPT 1 9 "TIPOPROT" FLAGS "D" END NUMBER F_PROGRESSS 10 0 BEGIN - PROMPT 1 9 "PROGRESS" + PROMPT 1 10 "PROGRESS" FLAGS "D" END STRING F_KEYFPPROS 80 BEGIN - PROMPT 1 10 "CHIAVE FPPRO" + PROMPT 1 11 "CHIAVE FPPRO" FLAGS "D" END diff --git a/src/f1/f1lib.cpp b/src/f1/f1lib.cpp index 1c198b0d9..0525543a0 100644 --- a/src/f1/f1lib.cpp +++ b/src/f1/f1lib.cpp @@ -8,6 +8,7 @@ #include "../fp/fp0400a.h" #include "reputils.h" #include "../fp/fplib.h" +#include "causali.h" ////////////////////////////////////////////////////////// // TFppro @@ -107,6 +108,17 @@ TDate TFppro::get_datareg(TToken_string& keys) return TDate(); } +real TFppro::get_ritenute() const +{ + TString query; + query << "SELECT P7_IMPORTORIT AS IMPORTO FROM PAA0700F\n" << + "WHERE P7_KEYPRGINVIO = '" << _keys.prginvio << "' AND P7_KEYHEADERFATT = '" << _keys.headerfatt << "' AND P7_KEYBODYFATT = '" << _keys.bodyfatt << "'"; + fp_db().sq_set_exec(query); + if(fp_db().sq_items() >= 1) + return fp_db().sq_get_real("IMPORTO"); + return ZERO; +} + bool TFppro::set_keys(TToken_string& keys) { if(keys.items() == 3) @@ -306,6 +318,14 @@ bool check_causale(const TString& cod_caus, const TString& tipo_doc, bool acq) return false; } +bool check_caus_has_rit(const TString& cod_caus, bool rit) +{ + TLocalisamfile causali(LF_CAUSALI); + causali.put(CAU_CODCAUS, cod_caus); + causali.read(); + return *causali.get(CAU_M770) != '\0'; +} + void run_cont_ini(bool liq) { static TString run_string; diff --git a/src/f1/f1lib.h b/src/f1/f1lib.h index ee4243678..aaab461d1 100644 --- a/src/f1/f1lib.h +++ b/src/f1/f1lib.h @@ -49,6 +49,7 @@ public: int get_numreg(TToken_string& keys); TDate get_datareg(); TDate get_datareg(TToken_string& keys); + real get_ritenute() const; bool set_query(); bool set_keys(TToken_string& keys); bool set_keys(keys_s keys); @@ -56,7 +57,7 @@ public: static TDate get_data_first_doc(); TFppro() : _keys({"\0", "\0", "\0" }), _guess(false), _keys_setted(false), _is_set(false) { } - + TFppro::TFppro(TToken_string& keys) : TFppro() { set_keys(keys); } }; class TProtocollo : TObject @@ -110,5 +111,6 @@ void set_periodprec(bool flag); bool check_causale(const TString& cod_caus, bool acq = true); // Controlla se il "cod_caus" ha come "tipo_doc" FA o NC (di acquisto) bool check_causale(const TString& cod_caus, const TString& tipo_doc, bool acq = true); +bool check_caus_has_rit(const TString& cod_caus, bool rit); void run_cont_ini(bool liq); #endif \ No newline at end of file diff --git a/src/fp/fp0400.cpp b/src/fp/fp0400.cpp index 18935353a..2138b5509 100644 --- a/src/fp/fp0400.cpp +++ b/src/fp/fp0400.cpp @@ -35,6 +35,12 @@ enum { filtri = 0, elenco_fe = 1, elenco_err = 2 }; // Enum per bottoni toolbar class TPassive_mask : public TAutomask { + struct iva + { + real imponibile; + real imposta; + }; + TLog_report* _log; bool _f1; @@ -61,6 +67,8 @@ protected: void run_cg0(const TString& filename) const; void elenco_prots_sel(TString& string) const; + vector& get_righe_iva(TToken_string& keys) const; + real calcola_importo(vector riva) const; // Gestione F1 int prepara_contab() const; void log_contab(); @@ -195,6 +203,36 @@ void TPassive_mask::elenco_prots_sel(TString& string) const string = ""; } +vector& TPassive_mask::get_righe_iva(TToken_string& keys) const +{ + static vector riva; + riva.clear(); + TString where_q; where_q << "WHERE PL_KEYPRGINVIO = '" << keys.get(0); + where_q << "' AND PL_KEYHEADERFATT = '" << keys.get(); + where_q << "' AND PL_KEYBODYFATT = '" << keys.get() << "'"; + TString query; query << "SELECT PL_IMPONIBILE AS IMPONIBILE, PL_IMPOSTA AS IMPOSTA \nFROM PAA2200F \n" << where_q; + fp_db().sq_set_exec(query, false); + for (bool ok = fp_db().sq_next(); ok; ok = fp_db().sq_next()) + { + TString imponibile = fp_db().sq_get("IMPONIBILE"); + TString imposta = fp_db().sq_get("IMPOSTA"); + if (imponibile.full() || imposta.full()) + riva.insert(riva.end(), { real(imponibile), real(imposta) }); + } + return riva; +} + +real TPassive_mask::calcola_importo(vector riva) const +{ + real tot = ZERO; + for(auto it = riva.begin(); it != riva.end(); ++it) + { + tot += it->imponibile; + tot += it->imposta; + } + return tot; +} + void TPassive_mask::aggiungi_riga(TLocalisamfile& clifo, TSheet_field& sf, TSheet_field& sf_err) { TString denom = fp_db().sq_get("RAG_SOC"); @@ -515,11 +553,15 @@ int TPassive_mask::prepara_contab() const FOR_EACH_SHEET_ROW(sf, n, row) { if (row->starts_with("X")) { + TString prokeys = row->get(sf.cid2index(S_PROKEY)); + TToken_string keys(prokeys, ';'); + TString codcaus(get_codcaus(row->get(2), row->get(10))); + if(!TString(row->get(sf.cid2index(S_NUMREGCONT))).empty()) return n+1000; - TString codcaus(get_codcaus(row->get(2), row->get(10))); if (codcaus.empty()) return no_codcaus; + TString tipodoc(row->get(sf.cid2index(S_TIPODOCSDI))); if(tipodoc == "TD01" && !check_causale(codcaus, "FA")) if(!yesno_box("Attenzione, per un documento di tipo TD01 e' stata selezionata \nuna causale diversa da Fattura d'Acquisto.\nContinuare?")) @@ -528,6 +570,8 @@ int TPassive_mask::prepara_contab() const if(!yesno_box("Attenzione, per un documento di tipo TD04 e' stata selezionata \nuna causale diversa da Nota Credito di Acquisto.\nContinuare?")) return cancel; n_sel++; + + vector& riva = get_righe_iva(keys); TString num; num.format("%04d", n); TFilename newf_ini; #ifndef DBG @@ -536,10 +580,9 @@ int TPassive_mask::prepara_contab() const newf_ini << F1_INIREGCONT << num << ".ini"; #endif TConfig contab_ini(newf_ini, "Transaction"); - TString prokeys = row->get(sf.cid2index(S_PROKEY)); - contab_ini.set("Action", "INSERT"); + // Esporto dati di testata contab_ini.set_paragraph(LF_MOV); // [23] contab_ini.set("CODCAUS", codcaus); contab_ini.set("CODCF", row->get(sf.cid2index(S_FORNITORE))); @@ -547,16 +590,38 @@ int TPassive_mask::prepara_contab() const contab_ini.set("DATADOC", row->get(sf.cid2index(S_DATADOC))); contab_ini.set("NUMDOCEXT", row->get(sf.cid2index(S_NDOC))); contab_ini.set("NUMDOC", TString(row->get(sf.cid2index(S_NDOC))).right(7)); - contab_ini.set("TOTDOC", abs(real(row->get(sf.cid2index(S_TOTDOC)))).string()); + TString totdoc = row->get(sf.cid2index(S_TOTDOC)); + if(totdoc.empty()) + { + real imp = calcola_importo(riva); + totdoc.cut(0) << imp; + } + real rit = TFppro(keys).get_ritenute(); + if(rit != ZERO) + { + contab_ini.set("TOTDOC", (abs(real(totdoc)) - rit).string()); + contab_ini.set("RITFIS", rit.string()); + } + else + contab_ini.set("TOTDOC", abs(real(totdoc)).string()); contab_ini.set("KEYFPPRO", prokeys); + // Esporto righe iva + int i = 1; + for (auto it = riva.begin(); it != riva.end(); ++it) + { + contab_ini.set_paragraph(LF_RMOVIVA, i); + contab_ini.set("IMPONIBILE", it->imponibile.string()); + contab_ini.set("IMPOSTA", it->imposta.string()); + contab_ini.set("NRIGA", i); + i++; + } + // Se ci sono le scadenze esporto anche quelle - TToken_string keys(prokeys, ';'); TString where_q; - where_q << "WHERE PO_KEYPRGINVIO = '" << keys.get() << "'"; + where_q << "WHERE PO_KEYPRGINVIO = '" << keys.get(0) << "'"; where_q << " AND PO_KEYHEADERFATT = '" << keys.get() << "'"; where_q << " AND PO_KEYBODYFATT = '" << keys.get() << "'"; - TString query; query << "SELECT PO_RIGA AS RIGA, PO_DATASCADENZA AS DATA, PO_IMPORTO AS IMPORTO \nFROM PAA2500F \n" << where_q; fp_db().sq_set_exec(query,false); @@ -569,26 +634,7 @@ int TPassive_mask::prepara_contab() const contab_ini.set("NRATA", riga); contab_ini.set("NRIGA", "1"); } - - where_q.cut(0) << "WHERE PL_KEYPRGINVIO = '" << keys.get(0); - where_q << "' AND PL_KEYHEADERFATT = '" << keys.get(); - where_q << "' AND PL_KEYBODYFATT = '" << keys.get() << "'"; - query.cut(0) << "SELECT PL_IMPONIBILE AS IMPONIBILE, PL_IMPOSTA AS IMPOSTA \nFROM PAA2200F \n" << where_q; - fp_db().sq_set_exec(query, false); - int i = 1; - for (bool ok = fp_db().sq_next(); ok; ok = fp_db().sq_next()) - { - TString imponibile = fp_db().sq_get("IMPONIBILE"); - TString imposta = fp_db().sq_get("IMPOSTA"); - if(imponibile.full() || imposta.full()) - { - contab_ini.set_paragraph(LF_RMOVIVA, i); - contab_ini.set("IMPONIBILE", imponibile); - contab_ini.set("IMPOSTA", imposta); - contab_ini.set("NRIGA", i); - i++; - } - } + row->add("", 0); } } @@ -607,7 +653,7 @@ void TPassive_mask::log_contab() TFilename cg_ini; TString msg; TF1_log log; - std::vector doc_saved, doc_canceled, save_numreg, save_protiv; + std::vector doc_saved, doc_canceled, save_numreg, save_protiv, canc_forn; FOR_EACH_SHEET_ROW(sfield(F_DOCS), n, row) { TString num; num.format("%04d", n); @@ -619,23 +665,17 @@ void TPassive_mask::log_contab() if(cg_ini.exist()) { TConfig config(cg_ini, "Transaction"); - TString numdoc; - TString numreg; - TString protiv; if (config.get("Result") == "OK") { - numdoc = config.get(MOV_NUMDOCEXT, "23"); - numreg = config.get(MOV_NUMREG, "23"); - protiv = config.get(MOV_PROTIVA, "23"); - doc_saved.insert(doc_saved.end(), numdoc); - save_numreg.insert(save_numreg.end(), numreg); - save_protiv.insert(save_protiv.end(), protiv); + doc_saved.insert(doc_saved.end(), config.get(MOV_NUMDOCEXT, "23")); + save_numreg.insert(save_numreg.end(), config.get(MOV_NUMREG, "23")); + save_protiv.insert(save_protiv.end(), config.get(MOV_PROTIVA, "23")); } else if(config.get("Result") == "CANCEL") { - numdoc = config.get(MOV_NUMDOCEXT, "23"); - doc_canceled.insert(doc_canceled.end(), numdoc); + doc_canceled.insert(doc_canceled.end(), config.get(MOV_NUMDOCEXT, "23")); + canc_forn.insert(canc_forn.end(), config.get(MOV_CODCF, "23")); } } } @@ -658,12 +698,12 @@ void TPassive_mask::log_contab() { msg.cut(0); if (elem_canc == 1) - msg << "La registrazione del documento n. '" << doc_canceled[0] << "' e' stata annullata."; + msg << "La registrazione del documento n. '" << doc_canceled[0] << "' e' stata annullata. (fornitore n. " << canc_forn[0] << ")"; else msg << "Sono state annullate " << elem_canc << " registrazioni."; if (elem_canc > 1) for (int i = 0; i < elem_canc; i++) - msg << "\n - Documento n. '" << doc_canceled[i] << "'"; + msg << "\n - Documento n. '" << doc_canceled[i] << "'. (fornitore n. " << canc_forn[0] << ")"; TToken_string msg_tok(msg, '\n'); for (int i = 0; i < msg_tok.items(); i++) log.log(LOG_WARN, msg_tok.get()); @@ -687,7 +727,7 @@ void TPassive_mask::contabilizza() break; case no_codcaus: message_box("Attenzione, il fornitore non ha associato nessun codice causale predefinito.\nPrego selezionare un codice causale per la contabilizzazione."); - next_page(1000); + fill(); break; case no_selected: message_box("Selezionare almeno un documento."); @@ -743,7 +783,7 @@ void TPassive_mask::new_forn() { TString query; query << "SELECT PU_PEC AS PEC\n" << "FROM PAA3200F\n" << - "WHERE PU_KEYPRGINVIO = '" << keys.get(); + "WHERE PU_KEYPRGINVIO = '" << keys.get(0); query << "' AND PU_KEYHEADERFATT = '" << keys.get(); query << "' AND PU_KEYBODYFATT = '" << keys.get() << "'"; fp_db().sq_set_exec(query); diff --git a/src/fp/fp0400a.uml b/src/fp/fp0400a.uml index 7afe4e262..88687f425 100644 --- a/src/fp/fp0400a.uml +++ b/src/fp/fp0400a.uml @@ -305,7 +305,7 @@ BEGIN FLAGS "D" END -NUMBER S_TOTDOC 11 3 +NUMBER S_TOTDOC 11 2 BEGIN PROMPT 1 2 "Totale Doc. " FLAGS "D"