diff --git a/cd/test/ba0960.txt b/cd/test/ba0960.txt new file mode 100644 index 000000000..d796d4754 --- /dev/null +++ b/cd/test/ba0960.txt @@ -0,0 +1,4 @@ +recdesc\f25.dir +recdesc\f25.trr + +Reverse charge parziale in prima nota diff --git a/cd/test/ba0960a.ini b/cd/test/ba0960a.ini new file mode 100644 index 000000000..ee37f3486 --- /dev/null +++ b/cd/test/ba0960a.ini @@ -0,0 +1,32 @@ +[Main] +Demo=0 + +[ba0] +File(279) = recdesc\f25.dir|X +File(280) = recdesc\f25.trr|X +Patch = 0960 +Versione = 21511200 + +[ba99] +Kill(0) = batbsce.txt|x +Kill(1) = wxmsw240.dll|x +Kill(2) = bastcms.rep|x +Kill(3) = bastcms.msk|x +Kill(4) = bastfsc.msk|x +Kill(5) = bastfsc.rep|x +Kill(6) = bastuue.msk|x +Kill(7) = bastuue.rep|x + +[ba] +Data = 04-05-2020 +Descrizione = Base +Dischi = 1 +Moduli = sy +OEM = +Patch = 960 +PostProcess = bainst -0 BA +PreProcess = +Prezzo(1) = +Prezzo(2) = +Versione = 21511200 + diff --git a/cd/test/ba0960a1.zip b/cd/test/ba0960a1.zip new file mode 100644 index 000000000..283c473e7 Binary files /dev/null and b/cd/test/ba0960a1.zip differ diff --git a/cd/test/cg0960.txt b/cd/test/cg0960.txt new file mode 100644 index 000000000..a6dcb001c --- /dev/null +++ b/cd/test/cg0960.txt @@ -0,0 +1,5 @@ +cg2.exe +cg2100c.msk + +F1: aggiunta forzatura collegamento a fppro in salvataggio per date inferiori alla data ricezione e anche nel caso generale in cui non riconosce esattamente la fattura per i controlli sui totali +Reverse charge parziale in prima nota diff --git a/cd/test/cg0960a.ini b/cd/test/cg0960a.ini new file mode 100644 index 000000000..c82902381 --- /dev/null +++ b/cd/test/cg0960a.ini @@ -0,0 +1,99 @@ +[Main] +Demo=0 + +[cg2] +File(164) = cg2.exe|X +File(167) = cg2100c.msk|X +Patch = 960 +Versione = 21511200 + +[cg99] +Kill(0) = bastpor.rep|x +Kill(1) = batbcam.msk|x +Kill(2) = batbscc.msk|x +Kill(3) = bastnot.msk|x +Kill(4) = cgtbcon.msk|x +Kill(5) = bastdpn.msk|x +Kill(6) = bastpor.msk|x +Kill(7) = bastarb.msk|x +Kill(8) = bastmsp.rep|x +Kill(9) = batbcfi.msk|x +Kill(10) = bastndo.rep|x +Kill(11) = batblia.msk|x +Kill(12) = batbdpn.msk|x +Kill(13) = bastcco.msk|x +Kill(14) = batbpor.msk|x +Kill(15) = batbins.msk|x +Kill(16) = batbleg.msk|x +Kill(17) = batbvet.msk|x +Kill(18) = batbcco.msk|x +Kill(19) = bastver.msk|x +Kill(20) = batbind.msk|x +Kill(21) = batbntb.msk|x +Kill(22) = bastivd.msk|x +Kill(23) = bastcam.msk|x +Kill(24) = bastzon.rep|x +Kill(25) = batbivd.msk|x +Kill(26) = batbtra.msk|x +Kill(27) = batbtit.msk|x +Kill(28) = bastscc.rep|x +Kill(29) = bastarb.rep|x +Kill(30) = bastesc.rep|x +Kill(31) = bastivd.rep|x +Kill(32) = batbndo.msk|x +Kill(33) = batbinl.msk|x +Kill(34) = batblia.msk|x +Kill(35) = bastvet.msk|x +Kill(36) = bastcfi.rep|x +Kill(37) = batbdel.msk|x +Kill(38) = cg2fppro.msk|x +Kill(39) = bastver.rep|x +Kill(40) = bastvet.rep|x +Kill(41) = bastntb.msk|x +Kill(42) = bastleg.msk|x +Kill(43) = batbzon.msk|x +Kill(44) = bastnot.rep|x +Kill(45) = batbnot.msk|x +Kill(46) = bastcam.rep|x +Kill(47) = batbver.msk|x +Kill(48) = batbarb.msk|x +Kill(49) = bastndo.msk|x +Kill(50) = batbcve.msk|x +Kill(51) = batbmsp.msk|x +Kill(52) = bastcve.msk|x +Kill(53) = bastpdb.msk|x +Kill(54) = bastreg.msk|x +Kill(55) = bastdpn.rep|x +Kill(56) = bastreg.rep|x +Kill(57) = batbesc.msk|x +Kill(58) = bastzon.msk|x +Kill(59) = batblbu.msk|x +Kill(60) = bastleg.rep|x +Kill(61) = batbreg.msk|x +Kill(62) = bastesc.msk|x +Kill(63) = bastntb.rep|x +Kill(64) = bastscc.msk|x +Kill(65) = batbpdb.msk|x +Kill(66) = bastpdb.rep|x +Kill(67) = bastcco.rep|x +Kill(68) = bastcve.rep|x +Kill(69) = bastcfi.msk|x +Kill(70) = bastmsp.msk|x + +[cg] +Data = 04-05-2020 +Descrizione = Contabilita' Generale +Dischi = 1 +Edit_19 = cg0 -0 +Edit_20 = cg0 -1 +Edit_26 = cg0 -4 +Edit_5 = cg0 -5 +Moduli = ba +OEM = +Patch = 0960 +PostProcess = bainst -0 CG +PreProcess = +Prezzo(1) = +Prezzo(2) = +Versione = 21511200 + diff --git a/cd/test/cg0960a1.zip b/cd/test/cg0960a1.zip new file mode 100644 index 000000000..5c7da6d67 Binary files /dev/null and b/cd/test/cg0960a1.zip differ diff --git a/src/cg/cg2100.cpp b/src/cg/cg2100.cpp index 99bee7146..c71eaeed7 100755 --- a/src/cg/cg2100.cpp +++ b/src/cg/cg2100.cpp @@ -1489,8 +1489,7 @@ void TPrimanota_application::write_fppro() // Controllo se la registrazione ha avuto effetto anche su FPPRO allora salvo riferimento sul mov if (save_fppro() > 0 && !save_dbmov()) message_box( - TString("ATTENZIONE:") << - " non è stato possibile salvare i riferimenti del documento in ingresso per questo movimento.\n" << + "ATTENZIONE: non e' stato possibile salvare i riferimenti del documento in ingresso per questo movimento.\n" "Movimento registrato senza collegamento ai documenti in ingresso."); } @@ -1577,8 +1576,12 @@ int TPrimanota_application::write(const TMask& m) switch (controlli_f1(m)) // Solo con F1 { - case pro_dataric_err: - error_box("Attenzione non è possibile registrare una fattura\ncon data operazione minore della data di ricezione."); + case pro_dataric_err: + { + const bool forza = noyes_box("Attenzione! La data operazione e' inferiore alla data di ricezione.\nContinuare comunque e forzare il collegamento al doc. elettronico?"); + if (forza) + break; + } case pro_numreg_err: return _isnowarning; default: case pro_noerr: break; @@ -1709,7 +1712,11 @@ int TPrimanota_application::rewrite(const TMask& m) switch (controlli_f1(m)) // Solo con F1 { case pro_dataric_err: - error_box("Attenzione non è possibile registrare una fattura\ncon data operazione minore della data di ricezione."); + { + const bool forza = noyes_box("Attenzione! La data operazione e' inferiore alla data di ricezione.\nContinuare comunque e forzare il collegamento al doc. elettronico?"); + if (forza) + break; + } case pro_numreg_err: return _isnowarning; default: case pro_noerr: break; @@ -2452,6 +2459,7 @@ void TPrimanota_application::ini2mask(TConfig& ini, TMask& msk, bool query) msk.set(FS_RECALC, ""); set_scad_f1(msk); } + } if (_f1_liq && msk.find_by_id(F_DIFFERITA) != nullptr) { @@ -2636,63 +2644,62 @@ void TPrimanota_application::mask2ini(const TMask& msk, TConfig& ini) int TPrimanota_application::save_fppro() { - TMask& msk = curr_mask(); - const KEY last = msk.last_key(); + TMask& msk = curr_mask(); - // Provo a vedere se hanno l'FP: se c'è l'indirizzo controllo che non sia F8 se non c'è non hanno l'FP - if (!has_f1_db(&msk)) - return pro_nofp; + // Provo a vedere se hanno l'FP: se c'è l'indirizzo controllo che non sia F8 se non c'è non hanno l'FP + if (!has_f1_db(&msk)) + return pro_nofp; - // Anzitutto guardo la modalita' in cui sono - // Se in modalita' inserimento continuo normalmente o in mod. modifica - // Guardo se quel documento corrisponde a un doc in FPPRO - // Lancio messaggio di avvertimento pulisco su db e proseguo col salvataggio del documento modificato - if (_mode != MODE_INS) - { - if(_mode == MODE_MOD) - { - TString query; - query << "SELECT COUNT(*) AS COUNT FROM FPPRO00F WHERE PZ_NUMREGCONT = '" << msk.get(F_NUMREG) << "'"; - fp_db().sq_set_exec(query); - if (fp_db().sq_get_int("COUNT") != 0) - { - message_box(TString("Attenzione!") << " E' stato modificato un movimento già collegato a un documento in ingresso."); - clean_fppro(); // Pulisco db - save_dbmov(true); // Svuoto riferimento doc ingresso sul mov e proseguo col regolare salvataggio - } - } - else return pro_notsaved; // In altre modalita' esco senza fare nulla sul db - } - - // Controllo che sto registrando un documento d'acquisto - if (!check_causale(msk.get(F_CODCAUS))) - return pro_notsaved; - - const TDate data_operazione(msk.get(F_DATAREG)); - const TDate data_documento(msk.get(F_DATADOC)); - const TString& numero_docext = msk.get(F_NUMDOCEXT); - real tot_doc = msk.get_real(F_TOTALE); - const real ritfis = msk.get_real(F_RITFIS); - const real ritsoc = msk.get_real(F_RITSOC); - tot_doc = tot_doc + ritfis + ritsoc; - TToken_string fppro_keys(msk.get(F_PROKEY), ';'); - const TString& keyprginvio = fppro_keys.get(); - const TString& keyheaderfatt = fppro_keys.get(); - const TString& keybodyfatt = fppro_keys.get(); + // Anzitutto guardo la modalita' in cui sono + // Se in modalita' inserimento continuo normalmente o in mod. modifica + // Guardo se quel documento corrisponde a un doc in FPPRO + // Lancio messaggio di avvertimento pulisco su db e proseguo col salvataggio del documento modificato + if (_mode != MODE_INS) + { + if(_mode == MODE_MOD) + { + TString query; + query << "SELECT COUNT(*) AS COUNT FROM FPPRO00F WHERE PZ_NUMREGCONT = '" << msk.get(F_NUMREG) << "'"; + fp_db().sq_set_exec(query); + if (fp_db().sq_get_int("COUNT") != 0) + { + message_box("Attenzione! E' stato modificato un movimento gia' collegato a un documento in ingresso."); + clean_fppro(); // Pulisco db + save_dbmov(true); // Svuoto riferimento doc ingresso sul mov e proseguo col regolare salvataggio + } + } + else return pro_notsaved; // In altre modalita' esco senza fare nulla sul db + } + + // Controllo che sto registrando un documento d'acquisto + if (!check_causale(msk.get(F_CODCAUS))) + return pro_notsaved; + + const TDate data_operazione(msk.get(F_DATAREG)); + const TDate data_documento(msk.get(F_DATADOC)); + const TString& numero_docext = msk.get(F_NUMDOCEXT); + real tot_doc = msk.get_real(F_TOTALE); + const real ritfis = msk.get_real(F_RITFIS); + const real ritsoc = msk.get_real(F_RITSOC); + tot_doc = tot_doc + ritfis + ritsoc; + TToken_string fppro_keys(msk.get(F_PROKEY), ';'); + const TString& keyprginvio = fppro_keys.get(); + const TString& keyheaderfatt = fppro_keys.get(); + const TString& keybodyfatt = fppro_keys.get(); - // Controllo che i dati corrispondano a quelli nella fattura in ingresso - TString where_str; - where_str << " (PZ_DATA = \'" << data_documento.date2ansi() << "\'"; - if (has_tot_doc(fppro_keys)) - where_str << " AND PQ_IMPTOTDOC = \'" << tot_doc << "\'"; - if(!numero_docext.empty()) - where_str << " AND PZ_NUMERO = \'" << numero_docext << "\'"; - where_str << ") "; - TString& query = TPro_msk::query_string(); - query << "WHERE PZ_KEYPRGINVIO = '" << keyprginvio << "' AND PZ_KEYHEADERFATT = '" << keyheaderfatt << "' AND PZ_KEYBODYFATT = '" << keybodyfatt << "'"; - query << " AND " << where_str; - - fp_db().sq_set_exec(query); + // Controllo che i dati corrispondano a quelli nella fattura in ingresso + TString where_str; + where_str << " (PZ_DATA = \'" << data_documento.date2ansi() << "\'"; + if (has_tot_doc(fppro_keys)) + where_str << " AND PQ_IMPTOTDOC = \'" << tot_doc << "\'"; + if(!numero_docext.empty()) + where_str << " AND PZ_NUMERO = \'" << numero_docext << "\'"; + where_str << ") "; + TString& query = TPro_msk::query_string(); + query << "WHERE PZ_KEYPRGINVIO = '" << keyprginvio << "' AND PZ_KEYHEADERFATT = '" << keyheaderfatt << "' AND PZ_KEYBODYFATT = '" << keybodyfatt << "'"; + query << " AND " << where_str; + + fp_db().sq_set_exec(query); int items = fp_db().sq_items(); if(items != 1 && has_tot_doc(fppro_keys)) // Controllo se e' sbagliato solo il segno dell'importo { @@ -2705,34 +2712,38 @@ int TPrimanota_application::save_fppro() items = fp_db().sq_items(); } - if(has_f1_db(&msk) && items != 1) - { - warning_box(TString("Attenzione, ") << "al movimento non è stato abbinato nessun documento elettronico.\n" << - "Per consentire una corretta archiviazione sostitutiva si consiglia di provvedere al controllo della registrazione e di procedere\n" << - "all'inserimento dei dati riportati sulla fattura per la corretta identificazione del documento in entrata.\n" << - "Se possibile utilizzare il 'Riporta documento' o la contabilizzazione dal monitor delle fatture passive per evitare errori.\n" - "In caso di documento escluso dalla fatturazione elettronica ignorate questo messaggio."); - save_dbmov(true); - return pro_notsaved; - } + if(has_f1_db(&msk) && items != 1) + { + const bool forza = noyes_box("Attenzione, al movimento non e' stato abbinato nessun documento elettronico.\n" + "Per consentire una corretta archiviazione sostitutiva si consiglia di provvedere al controllo della registrazione e di procedere\n" + "all'inserimento dei dati riportati sulla fattura per la corretta identificazione del documento in entrata.\n" + "Se possibile utilizzare il 'Riporta documento' o la contabilizzazione dal monitor delle fatture passive per evitare errori.\n\n" + "Forzare il collegamento al documento elettronico?\n" + "In caso di documento escluso dalla fatturazione elettronica rispondere 'No'.\n"); + if (!forza) + { + save_dbmov(true); + return pro_notsaved; + } + } - const int numregcont = msk.get_int(F_NUMREG); - const int clifor = msk.get_int(F_CODCLIFOR); + const int numregcont = msk.get_int(F_NUMREG); + const int clifor = msk.get_int(F_CODCLIFOR); - TString update_query; - update_query << "UPDATE FPPRO00F\n" << - "SET PZ_TIPOCF = 'F', PZ_CLIFOR = \'" << clifor << "\', PZ_DATACONT = \'" << TDate(TODAY).date2ansi() << "\', " << - "PZ_NUMREGCONT = \'" << numregcont << "\', PZ_DATAREGCONT = \'" << data_operazione.date2ansi() << "\'\n" << - "WHERE PZ_KEYPRGINVIO = \'" << keyprginvio << "\' AND PZ_KEYHEADERFATT = \'" << keyheaderfatt << "\' AND PZ_KEYBODYFATT = \'" << keybodyfatt << "\';"; + TString update_query; + update_query << "UPDATE FPPRO00F\n" << + "SET PZ_TIPOCF = 'F', PZ_CLIFOR = '" << clifor << "', PZ_DATACONT = '" << TDate(TODAY).date2ansi() << "', " << + "PZ_NUMREGCONT = '" << numregcont << "', PZ_DATAREGCONT = '" << data_operazione.date2ansi() << "'\n" << + "WHERE PZ_KEYPRGINVIO = '" << keyprginvio << "' AND PZ_KEYHEADERFATT = '" << keyheaderfatt << "' AND PZ_KEYBODYFATT = '" << keybodyfatt << "';"; - fp_db().sq_set_exec(update_query); - const bool saved = fp_db().sq_commit(); - if (!saved) - { - error_box("Attenzione non è stato possibile registrare la fattura nel database."); - save_dbmov(true); - } - return saved? pro_noerr : pro_notsaved; + fp_db().sq_set_exec(update_query); + const bool saved = fp_db().sq_commit(); + if (!saved) + { + error_box("Attenzione non e' stato possibile registrare la fattura nel database."); + save_dbmov(true); + } + return saved? pro_noerr : pro_notsaved; } bool TPrimanota_application::save_dbmov(bool clean) const