diff --git a/build/fp0.vcxproj b/build/fp0.vcxproj index ef011ac6b..e15efcc10 100644 --- a/build/fp0.vcxproj +++ b/build/fp0.vcxproj @@ -235,12 +235,15 @@ true + true true + true true + true diff --git a/cd/test/cg0846.txt b/cd/test/cg0846.txt index 44306a886..39a47c101 100644 --- a/cd/test/cg0846.txt +++ b/cd/test/cg0846.txt @@ -3,3 +3,5 @@ cg2fppro.msk Cambiata icona ricarica fatture su 'Fatture SDI' Aggiunta importazione percent. e natura iva da ini con f1 +Corretta importazione importo totale con ritenute +Corretto calcolo ritenute in maschera fppro diff --git a/cd/test/cg0846a.ini b/cd/test/cg0846a.ini index 406657ada..2deb1f3ca 100644 --- a/cd/test/cg0846a.ini +++ b/cd/test/cg0846a.ini @@ -9,79 +9,79 @@ Patch = 846 Versione = 21511200 [cg99] -Kill(0) = batbmsp.msk|x -Kill(1) = bastcve.rep|x -Kill(2) = batbins.msk|x -Kill(3) = bastscc.rep|x -Kill(4) = batbcam.msk|x -Kill(5) = batbpdb.msk|x -Kill(6) = bastver.msk|x -Kill(7) = batbcco.msk|x -Kill(8) = batbesc.msk|x -Kill(9) = batbdpn.msk|x -Kill(10) = bastndo.msk|x -Kill(11) = bastesc.msk|x -Kill(12) = batbndo.msk|x +Kill(0) = bastndo.msk|x +Kill(1) = batblbu.msk|x +Kill(2) = bastzon.msk|x +Kill(3) = bastesc.msk|x +Kill(4) = bastscc.msk|x +Kill(5) = bastvet.msk|x +Kill(6) = bastcve.msk|x +Kill(7) = batbntb.msk|x +Kill(8) = bastndo.rep|x +Kill(9) = batbvet.msk|x +Kill(10) = batbcve.msk|x +Kill(11) = batbndo.msk|x +Kill(12) = bastpor.msk|x Kill(13) = batbind.msk|x -Kill(14) = bastmsp.msk|x -Kill(15) = bastreg.rep|x +Kill(14) = batbtit.msk|x +Kill(15) = bastntb.rep|x Kill(16) = batbleg.msk|x -Kill(17) = bastpor.msk|x -Kill(18) = batbpor.msk|x -Kill(19) = batbcfi.msk|x +Kill(17) = bastcco.rep|x +Kill(18) = bastmsp.rep|x +Kill(19) = bastreg.rep|x Kill(20) = bastcco.msk|x -Kill(21) = bastmsp.rep|x -Kill(22) = batbtit.msk|x -Kill(23) = batbcve.msk|x -Kill(24) = batbivd.msk|x -Kill(25) = batbscc.msk|x -Kill(26) = bastcfi.rep|x -Kill(27) = batbarb.msk|x -Kill(28) = bastver.rep|x -Kill(29) = bastleg.msk|x -Kill(30) = bastzon.rep|x -Kill(31) = bastleg.rep|x -Kill(32) = bastcam.rep|x -Kill(33) = batblia.msk|x -Kill(34) = batbzon.msk|x -Kill(35) = bastvet.rep|x +Kill(21) = bastmsp.msk|x +Kill(22) = bastnot.msk|x +Kill(23) = batbcam.msk|x +Kill(24) = bastpor.rep|x +Kill(25) = batbpdb.msk|x +Kill(26) = batbins.msk|x +Kill(27) = bastscc.rep|x +Kill(28) = bastvet.rep|x +Kill(29) = bastpdb.msk|x +Kill(30) = batbesc.msk|x +Kill(31) = bastleg.msk|x +Kill(32) = bastivd.msk|x +Kill(33) = batbdpn.msk|x +Kill(34) = bastdpn.rep|x +Kill(35) = batbmsp.msk|x Kill(36) = bastdpn.msk|x -Kill(37) = bastivd.msk|x -Kill(38) = bastarb.rep|x -Kill(39) = bastcam.msk|x -Kill(40) = bastntb.msk|x -Kill(41) = bastivd.rep|x -Kill(42) = bastdpn.rep|x -Kill(43) = bastpdb.msk|x -Kill(44) = batbinl.msk|x -Kill(45) = bastesc.rep|x +Kill(37) = bastcve.rep|x +Kill(38) = bastesc.rep|x +Kill(39) = batbdel.msk|x +Kill(40) = bastver.rep|x +Kill(41) = bastcam.msk|x +Kill(42) = batbreg.msk|x +Kill(43) = bastivd.rep|x +Kill(44) = batbnot.msk|x +Kill(45) = bastntb.msk|x Kill(46) = bastreg.msk|x -Kill(47) = batbreg.msk|x -Kill(48) = bastzon.msk|x -Kill(49) = bastarb.msk|x -Kill(50) = batblia.msk|x -Kill(51) = cgtbcon.msk|x -Kill(52) = batbnot.msk|x -Kill(53) = batbdel.msk|x -Kill(54) = batbvet.msk|x -Kill(55) = batbtra.msk|x +Kill(47) = batbzon.msk|x +Kill(48) = batbtra.msk|x +Kill(49) = bastcfi.msk|x +Kill(50) = bastarb.rep|x +Kill(51) = bastarb.msk|x +Kill(52) = bastpdb.rep|x +Kill(53) = cgtbcon.msk|x +Kill(54) = batbver.msk|x +Kill(55) = batblia.msk|x Kill(56) = bastnot.rep|x -Kill(57) = bastpdb.rep|x -Kill(58) = bastscc.msk|x -Kill(59) = bastcco.rep|x -Kill(60) = batbntb.msk|x -Kill(61) = bastvet.msk|x -Kill(62) = batbver.msk|x -Kill(63) = bastcfi.msk|x -Kill(64) = batblbu.msk|x -Kill(65) = bastntb.rep|x -Kill(66) = bastcve.msk|x -Kill(67) = bastndo.rep|x -Kill(68) = bastnot.msk|x -Kill(69) = bastpor.rep|x +Kill(57) = batbinl.msk|x +Kill(58) = bastver.msk|x +Kill(59) = batbcco.msk|x +Kill(60) = bastcam.rep|x +Kill(61) = bastcfi.rep|x +Kill(62) = batbscc.msk|x +Kill(63) = batbcfi.msk|x +Kill(64) = bastzon.rep|x +Kill(65) = batbivd.msk|x +Kill(66) = batbpor.msk|x +Kill(67) = bastleg.rep|x +Kill(68) = batblia.msk|x +Kill(69) = batbarb.msk|x [cg] -Data = 25-06-2019 +Data = 26-06-2019 Descrizione = Contabilita' Generale Dischi = 1 Moduli = ba diff --git a/cd/test/cg0846a1.zip b/cd/test/cg0846a1.zip index 4af09744c..0939546b8 100644 Binary files a/cd/test/cg0846a1.zip and b/cd/test/cg0846a1.zip differ diff --git a/cd/test/fp0844.txt b/cd/test/fp0844.txt index e0d5027e5..aed7a3c61 100644 --- a/cd/test/fp0844.txt +++ b/cd/test/fp0844.txt @@ -1,3 +1,10 @@ fp0.exe +fp0400a.msk +fp0500a.msk Aggiunta esportazione percentuale e natura iva per f1 +Corretto calcolo ritenute fiscali se piu di una +Aggiunta colonna ritenute fiscali nel monitor passive +Sistemata maschera fp0500 per lo sheet "altri dati gestionali" +Corretta esportazione altri dati gestionali +Corretto controllo tipo documento con tipo causale (TD01 -> FA, TD04 -> NC) diff --git a/cd/test/fp0844a.ini b/cd/test/fp0844a.ini index 343c8163b..3fc491945 100644 --- a/cd/test/fp0844a.ini +++ b/cd/test/fp0844a.ini @@ -3,11 +3,13 @@ Demo=0 [fp1] File(0) = fp0.exe|X -Patch = 0844 +File(4) = fp0400a.msk|X +File(5) = fp0500a.msk|X +Patch = 844 Versione = 21511200 [fp] -Data = 25-06-2019 +Data = 26-06-2019 Descrizione = Fattura Elettronica Dischi = 1 Moduli = cg,ve diff --git a/cd/test/fp0844a1.zip b/cd/test/fp0844a1.zip index ca8687a73..5ec872cce 100644 Binary files a/cd/test/fp0844a1.zip and b/cd/test/fp0844a1.zip differ diff --git a/src/cg/cg2100.cpp b/src/cg/cg2100.cpp index df0a3efde..c1fda8470 100755 --- a/src/cg/cg2100.cpp +++ b/src/cg/cg2100.cpp @@ -28,7 +28,9 @@ enum pro_err = -86552, pro_noerr = 1, pro_notsaved = 0, - pro_nofp = -1 + pro_nofp = -1, + pro_dataric_err = -2, + pro_numreg_err = -3 }; /////////////////////////////////////////////////////////// @@ -1449,7 +1451,9 @@ 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" << + message_box( + TString("ATTENZIONE:") << + " non è stato possibile salvare i riferimenti del documento in ingresso per questo movimento.\n" << "Movimento registrato senza collegamento ai documenti in ingresso."); } @@ -1463,10 +1467,43 @@ bool TPrimanota_application::has_tot_doc(TToken_string& fppro_keys) return tot.full() && real(tot) != 0; } +int TPrimanota_application::controlli_f1(const TMask& m) +{ + if (m.find_by_id(F_PROKEY) != NULL && m.get(F_PROKEY).full() && has_f1_db((TMask*)&m) && fp_db().sq_is_connect() && check_causale(m.get(F_CODCAUS))) + { + TToken_string keys(m.get(F_PROKEY), ';'); + const TDate dataoraric = fppro_db().set_keys(keys).get_dataorarioric(); + // Devo controllare che la data operazione sia maggiore della data ric + const TDate data_operazione(m.get(F_DATAREG)); + if (data_operazione < dataoraric) + return pro_dataric_err; + const int numreg = fppro_db().set_keys(keys).get_numregcont(); + if (numreg != 0) + { + const TDate data_documento(m.get(F_DATADOC)); + TString msg; msg << "Attenzione il documento " << data_documento.year() << " / " << m.get(F_NUMDOCEXT) << + " appena registrato e' gia' stato inserito con la registrazione numero " << numreg << + "\nSe si vuole registrare questo documento in ingresso, scollegarlo prima dalla precedente registrazione."; + error_box(msg); + return pro_numreg_err; + } + } + return pro_noerr; +} + int TPrimanota_application::write(const TMask& m) { static int lasterr = NOERR; + 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_numreg_err: + return _isnowarning; + default: case pro_noerr: break; + } + const long numreg = m.get_long(F_NUMREG); if (numreg > _lastreg) _lastreg = numreg; // Aggiorna ultima registrazione libera @@ -1569,10 +1606,19 @@ int TPrimanota_application::write(const TMask& m) return err; } - int TPrimanota_application::rewrite(const TMask& m) { mask2rel(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_numreg_err: + return _isnowarning; + default: case pro_noerr: break; + } + const int err = _rel->rewrite(true); if (err == NOERR) { @@ -2414,11 +2460,6 @@ int TPrimanota_application::save_fppro() // 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; - if (!fp_db().sq_is_connect()) - { - message_box("Attenzione connesione al database non riuscita.\nImpossibile collegarsi ai documenti in entrata."); - return pro_nofp; - } // Anzitutto guardo la modalita' in cui sono // Se in modalita' inserimento continuo normalmente o in mod. modifica @@ -2448,8 +2489,9 @@ int TPrimanota_application::save_fppro() const TDate data_operazione(msk.get(F_DATAREG)); const TDate data_documento(msk.get(F_DATADOC)); const TString& numero_docext = msk.get(F_NUMDOCEXT); - const TString& numero_doc = msk.get(F_NUMDOC); - const TString& tot_doc = msk.get(F_TOTALE); + real tot_doc = msk.get_real(F_TOTALE); + const real ritenute = msk.get_real(F_RITFIS); + tot_doc += ritenute; TToken_string fppro_keys(msk.get(F_PROKEY), ';'); const TString& keyprginvio = fppro_keys.get(); const TString& keyheaderfatt = fppro_keys.get(); @@ -2457,35 +2499,25 @@ int TPrimanota_application::save_fppro() // 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 << " (PZ_DATA = \'" << data_documento.date2ansi() << "\' AND PQ_IMPTOTDOC = \'" << tot_doc << "\' AND PZ_NUMERO = \'" << (!numero_docext.empty() ? numero_docext : numero_doc) << "\') "; - else - where_str << " (PZ_DATA = \'" << data_documento.date2ansi() << "\' AND PZ_NUMERO = \'" << (!numero_docext.empty() ? numero_docext : numero_doc) << "\') "; - TString& query = TPro_msk::query_fppro(keyprginvio, keyheaderfatt, keybodyfatt, where_str); + 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); if(has_f1_db(&msk) && fp_db().sq_items() != 1) { warning_box(TString("Attenzione, ") << "al movimento non è stato abbinato nessun documento elettronico.\n" << - "Per consentire una corretta archiviazione sostitutiva si consiglia di non confermare la registrazione e di procedere\n" << - "all'identificazione del fornitore tramite il monitor fatture passive.\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."); - return pro_notsaved; - } - const int numreg = fp_db().sq_get_int("PZ_NUMREGCONT"); - if (numreg != 0) - { - TString msg; msg << "Attenzione il documento " << data_documento.year() << " / " << numero_doc << - " appena registrato e' gia' stato inserito con la registrazione numero " << numreg << - "\nControllare e nel caso provvedere a correggere l'associazione del movimento ai documenti in ingresso."; - warning_box(msg); - } - - // Devo controllare che la data operazione sia maggiore della data ric - const TDate dataoraric = fp_db().sq_get_date("P1_DATAORARIC"); - if(data_operazione < dataoraric) - { - error_box("Attenzione non è possibile registrare una fattura\ncon data operazione minore della data di ricezione."); + save_dbmov(true); return pro_notsaved; } @@ -2494,13 +2526,17 @@ int TPrimanota_application::save_fppro() 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 << "\';"; + "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; } diff --git a/src/cg/cg2102.cpp b/src/cg/cg2102.cpp index 8d48a4d59..ccf5ae6c8 100755 --- a/src/cg/cg2102.cpp +++ b/src/cg/cg2102.cpp @@ -4011,22 +4011,24 @@ bool TPro_msk::load_fppro_mask(TMask* msk, KEY k) const bool show_all = msk->get_bool(F_SHOWALL); if (numreg != "0" && !show_all) continue; + TToken_string& row = sf.row(-1); + TToken_string keys(fp_db().sq_get("PZ_KEYPRGINVIO"), ';'); + keys.add(fp_db().sq_get("PZ_KEYHEADERFATT")); keys.add(fp_db().sq_get("PZ_KEYBODYFATT")); + row.add("", 0); row.add(fp_db().sq_get("P7_TIPODOC")); 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(fppro_db().set_keys(keys).get_ritenute()); row.add(fp_db().sq_get("PZ_NUMERO")); row.add(fp_db().sq_get("P2_FISCIVAPAESE")); row.add(fp_db().sq_get("P2_FISCIVACOD")); row.add(fp_db().sq_get("P2_CODFISCALE")); row.add(fp_db().sq_get("PZ_TIPOPROT")); row.add(fp_db().sq_get("PZ_NUMPROT")); - TString fppro_keys; - fppro_keys << fp_db().sq_get("PZ_KEYPRGINVIO") << ";" << fp_db().sq_get("PZ_KEYHEADERFATT") << ";" << fp_db().sq_get("PZ_KEYBODYFATT"); - row.add(fppro_keys); + row.add(keys); } sf.force_update(); sf.show(); @@ -4200,12 +4202,6 @@ void TPro_msk::add_scad(const TDate& date, const real& importo) _scadenze.insert(_scadenze.end(), { date, importo }); } -TString& TPro_msk::query_fppro(const TString& keyprginvio, const TString& keyheaderfatt, const TString& keybodyfatt, - const TString& where_str) -{ - return query_fppro("", "", "", where_str, "", keyprginvio, keyheaderfatt, keybodyfatt, false, false); -} - TString& TPro_msk::query_fppro(const TString& codforn, const TString& date) { return query_fppro(codforn, "", "", "", date, "", "", "", true, false); @@ -4240,7 +4236,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, P7_IMPORTORIT, 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, 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" << @@ -4276,6 +4272,18 @@ TString& TPro_msk::query_fppro(const TString& codforn, const TString& stato_piva return query; } +TString& TPro_msk::query_string() +{ + 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" << + "FROM PAA0200F \nJOIN FPPRO00F\n" << " ON P2_KEYPRGINVIO = PZ_KEYPRGINVIO AND P2_KEYHEADERFATT = PZ_KEYHEADERFATT AND P2_KEYBODYFATT = PZ_KEYBODYFATT\n" << + "JOIN PAA0100F \nON P2_KEYPRGINVIO = P1_KEYPRGINVIO AND P2_KEYHEADERFATT = P1_KEYHEADERFATT AND P2_KEYBODYFATT = P1_KEYBODYFATT\n" << + "JOIN PAA2700F \nON P2_KEYPRGINVIO = PQ_KEYPRGINVIO AND P2_KEYHEADERFATT = PQ_KEYHEADERFATT AND P2_KEYBODYFATT = PQ_KEYBODYFATT\n" << + "JOIN PAA0700F \nON P7_KEYPRGINVIO = PQ_KEYPRGINVIO AND P7_KEYHEADERFATT = PQ_KEYHEADERFATT AND P7_KEYBODYFATT = PQ_KEYBODYFATT\n"; + return query; +} + void TPro_msk::abilita_piva(TMask* msk) { if (msk->get_bool(F_ENABSEARCH)) diff --git a/src/cg/cg2102.h b/src/cg/cg2102.h index ef9b7ea6b..833a627ad 100755 --- a/src/cg/cg2102.h +++ b/src/cg/cg2102.h @@ -227,6 +227,8 @@ protected: // TApplication // setta variabili prima del controllo has_f1_db void set_has_f1_db(TMask* m); bool has_f1_db(TMask* m); + // Controlli prima di write e rewrite + int controlli_f1(const TMask& m); virtual bool save(bool check_dirty); @@ -459,11 +461,10 @@ public: 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); static TString& query_fppro(const TString& stato_piva, const TString& piva, const TString& date); static TString& query_fppro(const TString& codforn, const TString& stato_piva, const TString& piva, const TString& where_str, const TString& date, const TString& keyprginvio, const TString& keyheaderfatt, const TString& keybodyfatt, bool order = true, bool piva_research = false); + static TString& query_string(); static void abilita_piva(TMask* msk); //bool is_fp(); // Carica documenti FPPRO sulla maschera diff --git a/src/f1/f1lib.cpp b/src/f1/f1lib.cpp index 0525543a0..645f09fe3 100644 --- a/src/f1/f1lib.cpp +++ b/src/f1/f1lib.cpp @@ -5,10 +5,10 @@ #include "cg2102.h" #include "execp.h" #include "cfven.h" -#include "../fp/fp0400a.h" #include "reputils.h" -#include "../fp/fplib.h" #include "causali.h" +#include "clifo.h" +#include "../fp/fplib.h" ////////////////////////////////////////////////////////// // TFppro @@ -18,9 +18,7 @@ TFppro& fppro_db() { static TFppro* fppro = nullptr; if (fppro == nullptr) - { fppro = new TFppro(); - } return *fppro; } @@ -37,14 +35,14 @@ bool TFppro::guess_the_doc(const TLocalisamfile& mov) "\tP7_NUMERO AS NUMDOC, PQ_IMPTOTDOC AS IMPTOTDOC, P2_FISCIVAPAESE AS STATOPIVA, P2_FISCIVACOD AS PIVA FROM PAA2700F\n" << "JOIN PAA0700F ON PQ_KEYPRGINVIO = P7_KEYPRGINVIO AND PQ_KEYHEADERFATT = P7_KEYHEADERFATT AND PQ_KEYBODYFATT = P7_KEYBODYFATT\n" << "JOIN PAA0200F ON PQ_KEYPRGINVIO = P2_KEYPRGINVIO AND PQ_KEYHEADERFATT = P2_KEYHEADERFATT AND PQ_KEYBODYFATT = P2_KEYBODYFATT\n"; - fp_db().sq_set_exec(query); + _db->sq_set_exec(query); - const keys_s keys = { fp_db().sq_get("KEYPRGINVIO"), fp_db().sq_get("KEYHEADERFATT"), fp_db().sq_get("KEYBODYFATT") }; - const TDate data = fp_db().sq_get_date("DATA"); - const TString numdoc = fp_db().sq_get("NUMDOC"); - const real imptotdoc(fp_db().sq_get("IMPTOTDOC")); - const TString4 statopiva = fp_db().sq_get("STATOPIVA"); - const TString piva = fp_db().sq_get("PIVA"); + const keys_s keys = { _db->sq_get("KEYPRGINVIO"), _db->sq_get("KEYHEADERFATT"), _db->sq_get("KEYBODYFATT") }; + const TDate data = _db->sq_get_date("DATA"); + const TString numdoc = _db->sq_get("NUMDOC"); + const real imptotdoc(_db->sq_get("IMPTOTDOC")); + const TString4 statopiva = _db->sq_get("STATOPIVA"); + const TString piva = _db->sq_get("PIVA"); // Prendo il fornitore del mov per controllare la p.iva TLocalisamfile clifo(LF_CLIFO); @@ -78,10 +76,10 @@ int TFppro::get_numreg() if (!_is_set) { if (set_query()) - return fp_db().sq_get_int("PZ_NUMREGCONT"); + return _db->sq_get_int("PZ_NUMREGCONT"); return -1; } - return fp_db().sq_get_int("PZ_NUMREGCONT"); + return _db->sq_get_int("PZ_NUMREGCONT"); } int TFppro::get_numreg(TToken_string& keys) @@ -95,31 +93,33 @@ TDate TFppro::get_datareg() if (!_is_set) { if (set_query()) - return fp_db().sq_get_date("PZ_DATAREGCONT"); + return _db->sq_get_date("PZ_DATAREGCONT"); return TDate(); } - return fp_db().sq_get_date("PZ_DATAREGCONT"); + return _db->sq_get_date("PZ_DATAREGCONT"); } TDate TFppro::get_datareg(TToken_string& keys) { - if (set_keys(keys)) + set_keys(keys); + if (_is_set) return get_datareg(); return TDate(); } real TFppro::get_ritenute() const { + real imp = ZERO; 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; + _db->sq_set_exec(query, false); + for(bool ok = _db->sq_next(); ok; ok = _db->sq_next()) + imp += _db->sq_get_real("IMPORTO"); + return imp; } -bool TFppro::set_keys(TToken_string& keys) +TFppro& TFppro::set_keys(TToken_string& keys) { if(keys.items() == 3) { @@ -127,30 +127,49 @@ bool TFppro::set_keys(TToken_string& keys) _keys.headerfatt = keys.get(1); _keys.bodyfatt = keys.get(2); _is_set = false; - return _keys_setted = true; + _keys_setted = true; } - return _keys_setted = false; + _keys_setted = false; + return *this; } -bool TFppro::set_keys(keys_s keys) +TFppro& TFppro::set_keys(keys_s keys) { if(*keys.prginvio != 0 && *keys.headerfatt != 0 && *keys.bodyfatt != 0) { _keys = keys; _is_set = false; - return _keys_setted = true; + _keys_setted = true; } _is_set = false; - return _keys_setted = false; + _keys_setted = false; + return *this; } -TDate TFppro::get_data_first_doc() +TDate TFppro::get_data_first_doc() const { TString query; query << "SELECT min(a.DATA) AS DATA \nFROM( \n\tSELECT P7_DATA as DATA \n" << "\tFROM PAA0700F \n\tUNION \n\tSELECT P7_DATA as DATA \n\tFROM PAF0700F \n) a"; - fp_db().sq_set_exec(query); - return fp_db().sq_get_date("DATA"); + _db->sq_set_exec(query); + return _db->sq_get_date("DATA"); +} + +TDate TFppro::get_dataorarioric() const +{ + TString query; + query << "SELECT P1_DATAORARIC \nFROM PAA0100F \n" << + "WHERE P1_KEYPRGINVIO = '" << _keys.prginvio << "' AND P1_KEYHEADERFATT = '" << _keys.headerfatt << "' AND P1_KEYBODYFATT = '" << _keys.bodyfatt << "'"; + _db->sq_set_exec(query); + return _db->sq_get_date("P1_DATAORARIC"); +} + +int TFppro::get_numregcont() const +{ + TString query; + query << "SELECT PZ_NUMREGCONT FROM FPPRO00F\n" << where_str(); + _db->sq_set_exec(query); + return _db->sq_get_int("PZ_NUMREGCONT"); } bool TFppro::set_query() @@ -158,18 +177,26 @@ bool TFppro::set_query() if (_keys_setted) { _fppro_query.cut(0) << "SELECT * FROM FPPRO00F " << where_str(); - return _is_set = fp_db().sq_set_exec(_fppro_query); + return _is_set = _db->sq_set_exec(_fppro_query); } return _is_set = false; } const char* TFppro::where_str() const { - TString str; - str << " WHERE PZ_KEYPRGINVIO = '" << _keys.prginvio << "' AND PZ_KEYHEADERFATT = '" << _keys.headerfatt << "' AND PZ_KEYBODYFATT = '" << _keys.bodyfatt << "'"; + static TString str; + str.cut(0) << " WHERE PZ_KEYPRGINVIO = '" << _keys.prginvio << "' AND PZ_KEYHEADERFATT = '" << _keys.headerfatt << "' AND PZ_KEYBODYFATT = '" << _keys.bodyfatt << "'"; return str; } +TFppro::TFppro() : _keys({ "\0", "\0", "\0" }), _guess(false), _keys_setted(false), _is_set(false) +{ + _db = new SSimple_query(); + const bool ok = set_connection(*_db); + // Non utilizzo l'autocommit, viene gestito manualmente + if (ok) _db->sq_set_autocommit(false); +} + ////////////////////////////////////////////////////////// // TProtocollo ////////////////////////////////////////////////////////// @@ -366,4 +393,38 @@ bool TF1_log::show_log() _log = NULL; } return true; +} + +bool TFppro::set_connection(SSimple_query& s) +{ + bool ok = true; +#ifdef DBG + TString ip = fp_settings().get_db_indirizzo(); + if (ip.upper() != "TESTCAMPO2012") + { + if (s.sq_connect("TESTCAMPO2012@campo_fp", + "fp", + "fp", + TSDB_MSSQL) != NOERR) + { + warning_box("Impossibile connettersi al DB esterno"); + ok = false; + } + } + else + { +#endif + if (s.sq_connect( + fp_settings().get_db_str_con(), + fp_settings().get_db_user(), + fp_settings().get_db_password(), + TSDB_MSSQL) != NOERR) + { + warning_box("Impossibile connettersi al DB esterno"); + ok = false; + } +#ifdef DBG + } +#endif + return ok; } \ No newline at end of file diff --git a/src/f1/f1lib.h b/src/f1/f1lib.h index b34ce3a9c..881805a43 100644 --- a/src/f1/f1lib.h +++ b/src/f1/f1lib.h @@ -2,9 +2,8 @@ #define _F1LIBH_ #include "strings.h" -#include "config.h" -#include "report.h" #include "reputils.h" +#include "tsdb.h" #define FILE_CONFIG CONFIG_DITTA #define FILE_SECTION "f1" @@ -34,6 +33,7 @@ class TFppro : public TObject const char* bodyfatt; }; private: + SSimple_query* _db; keys_s _keys; bool _guess; bool _keys_setted; @@ -46,20 +46,26 @@ public: bool check_reg(TToken_string& keys, int numreg); // Se un mov. registrato non e' collegato all'FPPRO cerco di capire qual'e` bool guess_the_doc(const TLocalisamfile& mov); + // Getters void get_keys_fppro(); int get_numreg(); 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); + TDate get_data_first_doc() const; + TDate get_dataorarioric() const; + int get_numregcont() const; + // Setters + bool set_query(); + TFppro& set_keys(TToken_string& keys); + TFppro& set_keys(keys_s keys); - 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); } + static bool set_connection(SSimple_query& s); + + TFppro(); + TFppro(TToken_string& keys) : TFppro() { set_keys(keys); } }; class TProtocollo : TObject diff --git a/src/fp/fp0400.cpp b/src/fp/fp0400.cpp index 397842d8f..46c06d7c0 100644 --- a/src/fp/fp0400.cpp +++ b/src/fp/fp0400.cpp @@ -247,6 +247,8 @@ void TPassive_mask::aggiungi_riga(TLocalisamfile& clifo, TSheet_field& sf, TShee const TDate& dataregcont = fp_db().sq_get_date("DATAREGCONT"); const TString& filter_elab = get_fattsel(); const bool is_contab = dataregcont != TDate("20010101"); + TToken_string keys("", ';'); + keys.add(fp_db().sq_get("KEYPROG")); keys.add(fp_db().sq_get("KEYHEAD")); keys.add(fp_db().sq_get("KEYFATT")); clifo.zero(); clifo.put(CLI_TIPOCF, 'F'); @@ -271,6 +273,7 @@ void TPassive_mask::aggiungi_riga(TLocalisamfile& clifo, TSheet_field& sf, TShee row.add(fp_db().sq_get_date("DATA_RIC")); row.add(fp_db().sq_get_date("DATA_DOC")); row.add(fp_db().sq_get("TOT_DOC")); + row.add(fppro_db().set_keys(keys).get_ritenute()); // Decido se mettere o meno il flag if (forn_code == 0) @@ -301,12 +304,10 @@ void TPassive_mask::aggiungi_riga(TLocalisamfile& clifo, TSheet_field& sf, TShee row.add(paa_codpaese, sf.cid2index(S_STATOPAIV)); row.add(paa_piva); row.add(paa_codfisc); - row.add(fp_db().sq_get("ATTACHMENT") != "0" ? "" : "X"); row.add(denom); row.add(TProtocollo(fp_db().sq_get_int("ANNO_PROT"), fp_db().sq_get("TIPO_PROT"), fp_db().sq_get("NUM_PROT"))); - TString key_prot; key_prot << fp_db().sq_get("KEYPROG") << ";" << fp_db().sq_get("KEYHEAD") << ";" << fp_db().sq_get("KEYFATT"); - row.add(key_prot); + row.add(keys); } } @@ -566,10 +567,10 @@ int TPassive_mask::prepara_contab() const TString codcaus(get_codcaus(row->get(2), row->get(10))); TString tipodoc(row->get(sf.cid2index(S_TIPODOCSDI))); - if(tipodoc == "TD01" && !check_causale(codcaus, "FA")) + if(tipodoc == "TD01" && !check_causale(codcaus, "FA", true)) if(!yesno_box("Attenzione, per un documento di tipo TD01 e' stata selezionata \nuna causale diversa da Fattura d'Acquisto.\nProcedere lo stesso con l'esportazione?")) continue; - if(tipodoc == "TD04" && !check_causale(codcaus, "NC")) + if(tipodoc == "TD04" && !check_causale(codcaus, "NC", true)) if(!yesno_box("Attenzione, per un documento di tipo TD04 e' stata selezionata \nuna causale diversa da Nota Credito di Acquisto.\nProcedere lo stesso con l'esportazione?")) continue; n_sel++; @@ -599,7 +600,7 @@ int TPassive_mask::prepara_contab() const real imp = calcola_importo(riva); totdoc.cut(0) << imp; } - real rit = TFppro(keys).get_ritenute(); + real rit = fppro_db().set_keys(keys).get_ritenute(); if(rit != ZERO) { contab_ini.set("TOTDOC", (abs(real(totdoc)) - rit).string()); diff --git a/src/fp/fp0400a.h b/src/fp/fp0400a.h index c7f1bfb45..c786acb81 100644 --- a/src/fp/fp0400a.h +++ b/src/fp/fp0400a.h @@ -30,18 +30,19 @@ #define S_DATARIC 105 #define S_DATADOC 106 #define S_TOTDOC 107 -#define S_FPPRO 108 -#define S_NUMREGCONT 109 -#define S_DATAREGCONT 110 -#define S_FORNITORE 111 -#define S_RAGSOC 112 -#define S_STATOPAIV 113 -#define S_PARIVA 114 -#define S_CODFISC 115 -#define S_ATTACH 116 -#define S_RAGXML 117 -#define S_NPROT 118 -#define S_PROKEY 119 +#define S_TOTRIT 108 +#define S_FPPRO 109 +#define S_NUMREGCONT 110 +#define S_DATAREGCONT 111 +#define S_FORNITORE 112 +#define S_RAGSOC 113 +#define S_STATOPAIV 114 +#define S_PARIVA 115 +#define S_CODFISC 116 +#define S_ATTACH 117 +#define S_RAGXML 118 +#define S_NPROT 119 +#define S_PROKEY 120 #define F_ERR 301 diff --git a/src/fp/fp0400a.uml b/src/fp/fp0400a.uml index 88687f425..9ef3dea02 100644 --- a/src/fp/fp0400a.uml +++ b/src/fp/fp0400a.uml @@ -184,23 +184,24 @@ BEGIN PROMPT 0 4 "" ITEM "" ITEM "Anno" - ITEM "Tipo Doc.\nSDI@6" - ITEM "Numero\nDocumento@18" + ITEM "Tipo Doc.\nSDI@5" + ITEM "Numero\nDocumento@14" ITEM "Data\nRicezione@8" ITEM "Data\nDoc.@8" - ITEM "Totale\nDocumento@12" - ITEM "Fornitore\nassociato@7" - ITEM "Num. Registrazione\ncontabile@12" - ITEM "Data Registrazione\ncontabile@12" - ITEM "Fornitore@7" - ITEM "Ragione Sociale@50" + ITEM "Totale\nDocumento@7" + ITEM "Totale\nritenute@6" + ITEM "Fornitore\nassociato@6" + ITEM "Num. Regis.\ncontabile@8" + ITEM "Data Regis.\ncontabile@8" + ITEM "Fornitore@5" + ITEM "Ragione Sociale@40" ITEM "Stato\nP.IVA@4" ITEM "Partita IVA@10" - ITEM "Cod. Fiscale@16" - ITEM "Allegati@7" - ITEM "Ragione Sociale (XML)@50" - ITEM "Numero Protocollo (in entrata)\n[anno-tipo prot/progressivo]@22" - ITEM "Chiave Prot.@80" + ITEM "Cod. Fiscale@12" + ITEM "Allegati@6" + ITEM "Ragione Sociale (XML)@40" + ITEM "Numero Protocollo (in entrata)\n[anno-tipo prot/progressivo]@20" + ITEM "Chiave Prot.@40" END ENDPAGE @@ -311,6 +312,12 @@ BEGIN FLAGS "D" END +NUMBER S_TOTRIT 10 2 +BEGIN + PROMPT 1 2 "Totale Ritenute" + FLAGS "D" +END + BOOLEAN S_FPPRO BEGIN PROMPT 15 2 "Salvato in FP-PRO"