diff --git a/build/f90.vcxproj b/build/f90.vcxproj index ac79b6b4d..b18722be9 100644 --- a/build/f90.vcxproj +++ b/build/f90.vcxproj @@ -209,6 +209,7 @@ + @@ -222,6 +223,11 @@ + + + + + @@ -232,6 +238,9 @@ + + + @@ -247,14 +256,6 @@ true - - - - - - - - diff --git a/build/f90.vcxproj.filters b/build/f90.vcxproj.filters index 9270b4d88..eef1e552e 100644 --- a/build/f90.vcxproj.filters +++ b/build/f90.vcxproj.filters @@ -19,9 +19,6 @@ {28870b23-e896-4312-855b-049305092f1d} - - {95c95f84-ca93-4c2f-b1cf-e94922dfa7ef} - @@ -57,6 +54,21 @@ Headers + + Headers + + + Headers + + + Headers + + + Headers + + + Headers + @@ -80,6 +92,9 @@ Sources + + Sources + @@ -106,6 +121,15 @@ Masks + + Masks + + + Masks + + + Masks + @@ -118,22 +142,6 @@ SQL - - - Recdesc - - - Recdesc - - - - - Recdesc - - - Recdesc - - Menu diff --git a/cd/test/ba1254.txt b/cd/test/ba1254.txt new file mode 100644 index 000000000..89cc0e718 --- /dev/null +++ b/cd/test/ba1254.txt @@ -0,0 +1,4 @@ +recdesc\f23.trr +recdesc\f23.dir + +aggiornata la tabella MOV con un campo nuovo per la gestione dell'archiviazione integrazioni \ No newline at end of file diff --git a/cd/test/ba1254a.ini b/cd/test/ba1254a.ini new file mode 100644 index 000000000..354423d44 --- /dev/null +++ b/cd/test/ba1254a.ini @@ -0,0 +1,32 @@ +[Main] +Demo=0 + +[ba0] +File(286) = recdesc\f23.dir|X +File(287) = recdesc\f23.trr|X +Patch = 1254 +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 = 29-03-2023 +Descrizione = Base +Dischi = 1 +Moduli = sy +OEM = +Patch = 1254 +PostProcess = bainst -0 BA +PreProcess = +Prezzo(1) = +Prezzo(2) = +Versione = 21511200 + diff --git a/cd/test/ba1254a1.zip b/cd/test/ba1254a1.zip new file mode 100644 index 000000000..4e95c2574 Binary files /dev/null and b/cd/test/ba1254a1.zip differ diff --git a/cd/test/ce1254.txt b/cd/test/ce1254.txt new file mode 100644 index 000000000..815dff385 --- /dev/null +++ b/cd/test/ce1254.txt @@ -0,0 +1,3 @@ +ce3.exe + +Il registro cespiti sintetico non arrotondava bene le percentuali di ammortamento diff --git a/cd/test/ce1254a.ini b/cd/test/ce1254a.ini new file mode 100644 index 000000000..af468ccf7 --- /dev/null +++ b/cd/test/ce1254a.ini @@ -0,0 +1,24 @@ +[Main] +Demo=0 + +[ce3] +File(82) = ce3.exe|X +Patch = 1254 +Versione = 21511200 + +[ce99] +Kill(0) = ce3900b.rep|x + +[ce] +Data = 19-07-2022 +Descrizione = Cespiti +Dischi = 1 +Moduli = ba,cg +OEM = +Patch = 1254 +PostProcess = bainst -0 CE +PreProcess = +Prezzo(1) = +Prezzo(2) = +Versione = 21511200 + diff --git a/cd/test/ce1254a1.zip b/cd/test/ce1254a1.zip new file mode 100644 index 000000000..bd8f7bd75 Binary files /dev/null and b/cd/test/ce1254a1.zip differ diff --git a/cd/test/f91254.txt b/cd/test/f91254.txt new file mode 100644 index 000000000..210a9a977 --- /dev/null +++ b/cd/test/f91254.txt @@ -0,0 +1,7 @@ +f90600a.msk +f90600b.msk +f90600d.msk +f90.exe +fpmenu.men + +Primo rilascio dell'archiviazione integrazioni \ No newline at end of file diff --git a/cd/test/f91254a.ini b/cd/test/f91254a.ini new file mode 100644 index 000000000..39b26c8d0 --- /dev/null +++ b/cd/test/f91254a.ini @@ -0,0 +1,23 @@ +[Main] +Demo=0 + +[f90] +File(0) = f90.exe|X +File(10) = fpmenu.men|X +File(14) = f90600a.msk|X +File(15) = f90600b.msk|X +File(16) = f90600d.msk|X +Patch = 1254 +Versione = 21511200 + +[f9] +Data = 29-03-2023 +Descrizione = Archiviazione Sostitutiva +Dischi = 1 +Moduli = fp +OEM = +Patch = 1254 +PostProcess = +PreProcess = +Versione = 21511200 + diff --git a/cd/test/f91254a1.zip b/cd/test/f91254a1.zip new file mode 100644 index 000000000..980973a67 Binary files /dev/null and b/cd/test/f91254a1.zip differ diff --git a/cd/test/fp1254.txt b/cd/test/fp1254.txt new file mode 100644 index 000000000..6ce625473 --- /dev/null +++ b/cd/test/fp1254.txt @@ -0,0 +1,3 @@ +fp0.exe + +Rimossa dalla fatturazione la forzatura di alcune date (DATAPENALE, DATLIMITEPAGAMENTO etc) \ No newline at end of file diff --git a/cd/test/fp1254a.ini b/cd/test/fp1254a.ini new file mode 100644 index 000000000..e2859f2df --- /dev/null +++ b/cd/test/fp1254a.ini @@ -0,0 +1,22 @@ +[Main] +Demo=0 + +[fp0] +File(0) = fp0.exe|X +Patch = 1254 +Versione = 21511200 + +[fp99] +Kill(0) = fppro.msk|x + +[fp] +Data = 28-03-2023 +Descrizione = Fattura Elettronica +Dischi = 1 +Moduli = cg,ve +OEM = +Patch = 1254 +PostProcess = +PreProcess = +Versione = 21511200 + diff --git a/cd/test/fp1254a1.zip b/cd/test/fp1254a1.zip new file mode 100644 index 000000000..8a272015b Binary files /dev/null and b/cd/test/fp1254a1.zip differ diff --git a/src/ba/recdesc/f23.dir b/src/ba/recdesc/f23.dir index 2287f44b9..cab86bd09 100644 --- a/src/ba/recdesc/f23.dir +++ b/src/ba/recdesc/f23.dir @@ -1,3 +1,3 @@ 23 0 -$mov|0|0|634|0|Movimenti di prima nota||| +$mov|0|0|714|0|Movimenti di prima nota||| diff --git a/src/ba/recdesc/f23.trr b/src/ba/recdesc/f23.trr index 3578cf68c..6ed7b0d86 100644 --- a/src/ba/recdesc/f23.trr +++ b/src/ba/recdesc/f23.trr @@ -1,5 +1,5 @@ 23 -67 +68 ANNOES|9|4|0|Codice esercizio NUMREG|3|7|0|Numero di operazione DATAREG|5|8|0|Data operazione @@ -67,6 +67,7 @@ IDDOCSDI|1|20|0|Identificativo documento SDI DATADOCSDI|5|8|0|Data documento SDI COLL_GOLEM|11|10|0|Documenti generici CARTACEI|11|10|0|Documenti cartacei +KEYPAF|1|80|0|Chiavi del PAFW300 [KEYPRGINVIO;KEYHEADERFATT;KEYBODYFATT] 4 NUMREG| DATAREG+NUMREG|X diff --git a/src/f1/f1lib.cpp b/src/f1/f1lib.cpp index c44c4f889..71aae8bb3 100644 --- a/src/f1/f1lib.cpp +++ b/src/f1/f1lib.cpp @@ -218,6 +218,8 @@ bool TFppro::associa_mov(const long numreg) return ok; } + + const TString & TFppro::get_tipoprot() { TString query; diff --git a/src/f1/f1lib.h b/src/f1/f1lib.h index 13cb0a4ca..3bc144e85 100644 --- a/src/f1/f1lib.h +++ b/src/f1/f1lib.h @@ -85,6 +85,7 @@ public: TFppro(TToken_string& keys) : TFppro() { set_keys(keys); } }; + class TProtocollo : TObject { TString _tipoprot; diff --git a/src/f9/f90.cpp b/src/f9/f90.cpp index 4565b9822..73f88e5f5 100644 --- a/src/f9/f90.cpp +++ b/src/f9/f90.cpp @@ -14,6 +14,7 @@ int main(int argc, char** argv) case 2: rt = f90300(argc, argv); break; // Gestione documenti cartacei case 3: rt = f90400(argc, argv); break; // Test classi case 4: rt = f90500(argc, argv); break; // Ripristino archiviazioni + case 5: rt = f90600(argc, argv); break; // Archiviazione Integrazioni } return rt; } diff --git a/src/f9/f90.h b/src/f9/f90.h index dfe558ed3..069a1f6a1 100644 --- a/src/f9/f90.h +++ b/src/f9/f90.h @@ -6,5 +6,6 @@ int f90200(int argc, char* argv[]); int f90300(int argc, char* argv[]); int f90400(int argc, char* argv[]); int f90500(int argc, char* argv[]); +int f90600(int argc, char* argv[]); #endif // _F90_H_ diff --git a/src/f9/f90100.cpp b/src/f9/f90100.cpp index 82746963e..09e916ab7 100644 --- a/src/f9/f90100.cpp +++ b/src/f9/f90100.cpp @@ -1255,8 +1255,6 @@ TApri_estr_msk::TApri_estr_msk() : TAutomask("f90100d.msk"), _provv(true), _tipo } - - //////////////////////////////////////////////////////// // TF9_app //////////////////////////////////////////////////////// diff --git a/src/f9/f90100a.h b/src/f9/f90100a.h index f3e42e0d5..30e334aea 100644 --- a/src/f9/f90100a.h +++ b/src/f9/f90100a.h @@ -4,6 +4,7 @@ #define B_SHOWESTR 203 #define B_SHOWESCL 204 + #define F_SEL 101 #define F_ARCH_B 102 #define F_IDESTR 103 diff --git a/src/f9/f90600.cpp b/src/f9/f90600.cpp new file mode 100644 index 000000000..af69ffee2 --- /dev/null +++ b/src/f9/f90600.cpp @@ -0,0 +1,1187 @@ +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "../ve/velib05.h" +#include "../fe/felib.h" +#include "../f1/f1lib.h" +#include "../fp/fplib.h" + +#include "f901tab.h" +#include "f90600.h" +#include "f90600a.h" +#include "f90600b.h" +#include "f90600c.h" +#include "f90600d.h" + + +#define TABMOD_TABVER "S0" // Campo per la memorizzazione della versione attuale delle tabelle +#define TAB_BASE_VERSION 100 // Versione base delle tabelle +#define SQL_VERSION 104 // Utilizzo questo per controllare la versione attuale delle tabelle e nel caso aggiornarle + +//TConfig_f9_mask + +bool TConfigIntf9_mask::on_key(const KEY key) +{ + if (key == K_SHIFT + K_F12) + { + if (run_fp_psw_mask()) + { + enable(CF_LVLNEW); + } + } + return true; +} + +bool TConfigIntf9_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + switch (o.dlg()) + { + case CF_LVLNEW: + if (e == fe_close) + { + TMask& config_mask = o.mask(); + TString new_lvl = config_mask.get(CF_LVLNEW); + TString old_lvl = config_mask.get(CF_LVLOLD); + + if (new_lvl.empty()) + return o.error_box("Livello Patch non conforme. Impossibile aggiornare"); + + if (new_lvl > old_lvl) + return o.error_box("Per impostare un livello patch superiore dell'attuale\nè sufficente riavviare il programma."); + } + + break; + default: break; + } + return true; +} + +//TArchInt_mask + +bool TArchInt_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + switch (o.dlg()) + { + case DLG_ELABORA: + if (e == fe_button) + open_win_estr(); + fill(); + break; + case DLG_CONFIG: + if (e == fe_button) + open_win_conf(); + break; + case DLG_DELREC: + if (e == fe_button) + delete_pack(); + break; + case B_SHOWESTR: + open_apri_estr_win(); + break; + case DLG_FINDREC: + if (e == fe_button) + controllo_errori(); + break; + + default: break; + } + + return true; +} + +void TArchInt_mask::open_apri_estr_win() +{ + static TString last_fill_id = 0; + TString id; + TToken_string* row_estrazione = nullptr; + FOR_EACH_SHEET_ROW(sfield(S_ELAB), nr, row) + { + if (row->get(0)[0] == 'X') + { + if (TString(row->get(cid2index(F_STATESTR))).starts_with("02")) + { + message_box("Impossibile controllare un pacchetto in stato di errore '02'.\n" + "Usare il 'Controllo Estrazioni' per vedere i movimenti in errore."); + return; + } + row_estrazione = row; + id = row->get(cid2index(F_IDESTR)); + break; + } + } + if (row_estrazione == nullptr) + { + message_box("Selezionare un pacchetto."); + return; + } + + if (last_fill_id != id) + { + _inclusi_msk.set_from_estrazione(*row_estrazione); + + _inclusi_msk.fill_estr(); + _inclusi_msk.fill_res(); + last_fill_id = id; + } + _inclusi_msk.run(); +} + +void TArchInt_mask::fill() const +{ + TString query; + query << "SELECT * FROM " F9_DRD " WHERE " DRD_CODSOC " = '" << F9CONF.get_ambiente() << "' AND " DRD_ID_EST " like 'R%' ORDER BY " << DRD_TIME << " DESC;"; + fp_db().sq_set_exec(query, false); + + TSheet_field& sf = sfield(S_ELAB); + + sf.reset(); + int i = 0; + for (bool ok = fp_db().sq_next(); ok; ok = fp_db().sq_next()) + { + TString tipo; + const int row = sf.set_row_cell(F_ARCH_B, fp_db().sq_get(DRD_STATO) == "09"); + + sf.set_row_cell(F_IDESTR, fp_db().sq_get(DRD_ID_EST), row); + sf.set_row_cell(F_DATAESTR, fp_db().sq_get_date(DRD_TIME), row); + sf.set_row_cell(F_PROV_B, fp_db().sq_get(DRD_FLAG_PD) == "P", row); + sf.set_row_cell(F_TIPODOC, fp_db().sq_get(DRD_TIPODOC), row); + sf.set_row_cell(F_DATADAL, fp_db().sq_get_date(DRD_DATADA), row); + sf.set_row_cell(F_DATAAL, fp_db().sq_get_date(DRD_DATAA), row); + sf.set_row_cell(F_USER, fp_db().sq_get(DRD_UTENTE), row); + + TString s = fp_db().sq_get(DRD_STATO); + s << " - " << TArchiviazioneIntegrazioni::traduci_stato(fp_db().sq_get(DRD_STATO)); + sf.set_row_cell(F_STATESTR, s, row); + sf.set_row_cell(F_DESCR_E, fp_db().sq_get(DRD_DESC), row); + } + sf.force_update(); + +} + +void TArchInt_mask::delete_estr_fld(const TString& idestr) +{ + TFilename dir(F9CONF.get_addr_doc_loc()); + + if (dexist(dir)) + { + dir << SLASH << F9CONF.get_ambiente() << SLASH << idestr << SLASH << "*"; + remove_files(dir, true); + } +} + +void TArchInt_mask::delete_pack(const bool all) +{ + // Se nello sheet non c'e' selezionata alcuna riga viene richiamata col flag all = true + bool flag = false; + TSheet_field& sf = sfield(S_ELAB); + FOR_EACH_SHEET_ROW(sf, nr, row) + { + if (row->get(0)[0] == 'X' || all) + { + flag = true; + const TString id_estr(row->get(cid2index(F_IDESTR))); + TString query; + const TString& codsoc(F9CONF.get_ambiente()); + query << "BEGIN\n" + " DECLARE @flag_prov CHAR(1), @stato CHAR(2);\n\n" + " SELECT @flag_prov = " DRD_FLAG_PD ", @stato = " DRD_STATO "\n" + " FROM " F9_DRD "\n" + " WHERE " DRD_ID_EST " = '" << id_estr << "';\n\n" + " IF (@flag_prov = 'P' OR @stato = '" D_GEST_ERR "' OR @stato = '" IN_DIAGN "' OR @stato = '" D_WA_ERR "' OR @stato = '" D_ERR_SOS "') BEGIN\n" + " DELETE FROM " F9_ERR " WHERE " ERR_CODSOC " = '" << codsoc << "' AND " ERR_IDESTR " = '" << id_estr << "';\n" + " END\n" + " ELSE BEGIN\n" + " SELECT @flag_prov AS FLAG, @stato AS STATO;\n" + " END\n" + "END"; + fp_db().sq_set_exec(query); + // Elimino testata in DRD, solo se provvis. + query.cut(0) << "BEGIN\n" + " DECLARE @flag_prov CHAR(1), @stato CHAR(2);\n\n" + " SELECT @flag_prov = " DRD_FLAG_PD ", @stato = " DRD_STATO "\n" + " FROM " F9_DRD "\n" + " WHERE " DRD_ID_EST " = '" << id_estr << "';\n\n" + " IF (@flag_prov = 'P' OR @stato = '" D_GEST_ERR "' OR @stato = '" IN_DIAGN "' OR @stato = '" D_WA_ERR "' OR @stato = '" D_ERR_SOS "') BEGIN\n" + " DELETE FROM " F9_DRD " WHERE " DRD_CODSOC " = '" << codsoc << "' AND " DRD_ID_EST " = '" << id_estr << "';\n" + " DELETE FROM " F9_IVA " WHERE " IVA_CODSOC " = '" << codsoc << "' AND " IVA_IDLAN " = '" << id_estr << "';\n" + " DELETE FROM " F9_MOVESTR " WHERE " MES_CODSOC " = '" << codsoc << "' AND " MES_IDESTR " = '" << id_estr << "';\n" + " END\n" + " SELECT @flag_prov AS FLAG, @stato AS STATO;\n" + "END"; + fp_db().sq_set_exec(query); + TString stato = fp_db().sq_get("STATO"); + if (fp_db().sq_get("FLAG") != "P" && stato != D_GEST_ERR && stato != IN_DIAGN && stato != D_WA_ERR && stato != D_ERR_SOS && !all) + { + warning_box("E' possibile eliminare solo un'estrazione provvisoria\no in uno degli stati di errore se definitiva (02 - 05 - 08)."); + return; + } + fp_db().sq_commit(); + + // DA VEDERE + delete_estr_fld(id_estr); + + if (!all) + break; + } + } + if (!flag) + { + if (noyes_box("Eliminare tutti i pacchetti provvisori o in stato di errore gestionale?")) + delete_pack(true); + } + fill(); +} + +void TArchInt_mask::controllo_errori() +{ + TString id_estr, stato; + TSheet_field& sf = sfield(S_ELAB); + bool flag = false; + FOR_EACH_SHEET_ROW(sf, nr, row) + { + if (row->get(0)[0] == 'X') + { + id_estr << row->get(cid2index(F_IDESTR)); + stato << row->get(cid2index(F_STATESTR)); + flag = true; + break; + } + } + if (flag) + { + if (stato.cut(2) == D_GEST_ERR) + { + TControlloIntegrazioni_mask controllo(F9CONF.get_ambiente(), id_estr); + controllo.run(); + } + else + warning_box("Impossibile controllare un'estrazione che non e'\nin stato di %s ('" D_GEST_ERR "').", TArchiviazioneIntegrazioni::traduci_stato(D_GEST_ERR)); + } + else + warning_box("Selezionare un'estrazione."); +} + +void TArchInt_mask::open_win_estr() +{ + if (!F9CONF.get_ambiente().full()) + warning_box("Inserire codice ambiente societa' in configurazione"); + else f9Int_app().run_estr_msk(); +} + +void TArchInt_mask::open_win_conf() +{ + TConfigIntf9_mask m("Configurazione Archiviazione Sostitutiva", 1, 70, 30, 55, 5); + + TLocalisamfile tabmod(LF_TABMOD); + tabmod.put("MOD", "F9"); + tabmod.put("COD", "SQL"); + tabmod.put("CODTAB", "VERSION"); + const bool exists = tabmod.read() == NOERR; + int version = exists ? real(tabmod.get(TABMOD_TABVER)).integer() : TAB_BASE_VERSION - 2; + + m.add_button_tool(DLG_OK, "Conferma", TOOL_OK); + m.add_button_tool(DLG_NULL, "", 0); + m.add_button_tool(DLG_QUIT, "Esci", TOOL_QUIT); + + m.add_groupbox(CF_CODGROUP, 0, "Codice Ambiente Societa' (WEBAPP):", 1, 0, 69, 3, ""); + m.add_string(CF_CODSOC, 0, "Codice ambiente ", 4, 1, 10, "", 10); + m.add_groupbox(CF_ADDRGROUP, 0, "Indicare percorso documenti cartacei:", 1, 3, 69, 4, ""); + m.add_string(CF_ADDRDOC, 0, "Server ", 2, 4, 256, "", 40); + m.add_string(CF_ADDRDOCLOC, 0, "Locale ", 2, 5, 256, "", 40); + m.add_groupbox(CF_ESTRGROUP, 0, "Opzioni estrazione", 1, 7, 69, 4, ""); + m.add_boolean(CF_CARTEXP, 0, "Estrai anche documenti cartacei", 2, 8); + m.add_groupbox(CF_LVLGROUP, 0, "Livello Patch Tabelle F9", 1, 11, 69, 4, ""); + m.add_string(CF_LVLOLD, 0, "Livello Attuale", 35, 12, 10, "D", 10); + m.add_string(CF_LVLNEW, 0, "Nuovo Livello ", 2, 12, 10, "D", 10); + m.set_handlers(); + + m.set(CF_CODSOC, F9CONF.get_ambiente()); + m.set(CF_ADDRDOC, F9CONF.get_addr_doc()); + m.set(CF_ADDRDOCLOC, F9CONF.get_addr_doc_loc()); + m.set(CF_CARTEXP, F9CONF.get_has_cartexp()); + m.set(CF_LVLOLD, version); + + + m.disable(CF_LVLOLD); + if (m.run() == K_ENTER) + save_conf(m); + +} + +bool TArchInt_mask::save_conf(TMask& config_mask) +{ + TString old_codsoc = F9CONF.get_ambiente(); + + TString new_lvl = config_mask.get(CF_LVLNEW); + TString old_lvl = config_mask.get(CF_LVLOLD); + + if (config_mask.get(CF_CODSOC).empty()) + warning_box("Codice Ambiente vuoto. Impossibile salvare i dati."); + F9CONF.set_ambiente(config_mask.get(CF_CODSOC)); + F9CONF.set_addr_doc(config_mask.get(CF_ADDRDOC)); + F9CONF.set_addr_doc_loc(config_mask.get(CF_ADDRDOCLOC)); + F9CONF.set_has_cartexp(config_mask.get_bool(CF_CARTEXP)); + + config_mask.close(); + //f9Int_app().edit_wa(old_codsoc); + if (new_lvl.full() && (new_lvl != old_lvl)) + { + TLocalisamfile tabmod(LF_TABMOD); + tabmod.put("MOD", "F9"); + tabmod.put("COD", "SQL"); + tabmod.put("CODTAB", "VERSION"); + tabmod.put("S0", real(new_lvl)); + + if (tabmod.write_rewrite() == NOERR) + { + config_mask.set(CF_LVLOLD, new_lvl); + config_mask.set(CF_LVLNEW, ""); + message_box("Versione impostata!"); + } + else + return error_box("Impossibile aggiornare il livello degli archivi"); + } + return true; +} + +TArchInt_mask::TArchInt_mask() : TAutomask("f90600a") +{ + int i = 0; + // Controllo che esistano delle categorie documentali. + fill(); +} + + +///////////////////////////////////////////////////////// +// Tf9IntEstrai_mask +//////////////////////////////////////////////////////// + +int Tf9IntEstrai_mask::estrai() +{ + const TDate dataini = get_dataini(); + const TDate dataend = get_dataend(); + const char tipodoc = get_tipodoc(); + const bool flagpro = is_provviso(); + TFilename path; + TLog_report log("Log estrazione"); + + //f9_app().get_spotlite_path(path); + + + + // Vero e proprio oggetto estrazione + _estrazione = new TEstrazione( + F9CONF.get_ambiente(), // Codice ambiente + flagpro, // Flag prov. + tipodoc, // Tipo doc. + get_descr(), // Descrizione estrazione + F9CONF.get_addr_doc(), // Cartella documenti + false, // Estrazione di un escluso + path, // Spotlight path + &log, // Log + &dataini, // Data estr. mov dal + &dataend, // Data estr. mov al + F9CONF.get_has_cartexp() // Flag per estrarre anche i doc. cartacei + ); + + const TString& doc_sdi = get(ES_DOCSDI); + + // Leggo i movimenti e li carico nell'estrazione. ///////////// + TString query; + + query = "USE MOV KEY 2"; + query << "\nFROM DATAREG=" << dataini.date2ansi() << "\nTO DATAREG=" << dataend.date2ansi(); + + TISAM_recordset mov(query); + TProgress_monitor* progr = new TProgress_monitor(mov.items(), "Acquisizione movimenti", false); + TLocalisamfile clifo(LF_CLIFO); + const TipoIVA tipo = tipodoc == 'A' ? iva_acquisti : iva_vendite; + int count = 0; + // Prendo tutti i movimenti a partire da una data e li carico tutti fino alla data finale + + TToken_string caus_list = select_causali(doc_sdi, tipodoc); + + for (bool ok = mov.move_first(); progr->add_status() && ok; ok = mov.move_next()) + { + const TString& cod_cau = mov.get_string(MOV_CODCAUS); + if (causale_in_lista(cod_cau, caus_list)) + { + TToken_string elab_f9(mov.get_string(MOV_ELABF9), ';'); // Stringa del campo elaborazione f9 nel file mov + bool escluso = (elab_f9.items() == 3 && elab_f9.get_bool(2)); + const TCausale & caus = cached_causale(mov.get_string(MOV_CODCAUS), mov.get_date(MOV_DATAREG).year()); + const bool stampato = mov.get_bool(MOV_REGST); + const TRegistro& reg = caus.reg(); + const TipoIVA& iva = reg.iva(); + TString numdoc = mov.get_string(MOV_NUMDOCEXT); + long nreg = mov.get_long(MOV_NUMREG); + + if (numdoc.blank()) + numdoc = mov.get_string(MOV_NUMDOC); + // Se definitivo controllo il flag di stampato REGST + if ((flagpro || stampato) && numdoc.full()) + { + // Creo il movimento da inserire e lo inserisco + _estrazione->add_mov(new TMovimento_estr(mov, tipo, escluso)); + ++count; + } + } + } + delete progr; + + _stats = { 0, 0, 0, 0, 0, 0, 0, 0, 0,0,0,0 }; + // Effettiva estrazione. Faccio partire diagnostica e scrittura db. + const result_estr result = _estrazione->estrai_integrazioni(); + + //LAVORO SULLE STAT + int tot; + + tot = (int)_stats.int_match + (int)_stats.int_nomatch + (int)_stats.int_err; + + TString msg; + msg << "Tot. Docs : " << tot << "\n"; + + + msg << "Mov. Integrazione estratti : " << (int)_stats.int_match << "\n"; + msg << "Mov. Integrazione XML non trovato: " << (int)_stats.int_nomatch << "\n"; + msg << "Mov. Integrazione in errore : " << (int)_stats.int_err; + message_box(msg); + + return result; +} + +bool Tf9IntEstrai_mask::causale_in_lista(const TString& cod_cau, TToken_string cau_list) +{ + bool in_list = false; + int a = cau_list.items(); //da rimuovere + for (int i = 0; i < cau_list.items(); i++) + { + TString prov = cau_list.get(i); //dr + if (cod_cau == cau_list.get(i)) + { + in_list = true; + break; + } + } + return in_list; +} + +TToken_string Tf9IntEstrai_mask::select_causali(const TString& tipo_sdi, const char reg) +{ + TCursor cur(new TRelation(LF_CAUSALI)); + TToken_string caus_list; + + const int items = cur.items(); + + for (cur.first_item(); cur.pos() < items; cur.succ_item()) + { + const TRectype& rec = cur.curr(); + + if (reg == 'V') + { + const TString& tipodocsdi = rec.get(CAU_TIPODOCSDI); + if ((tipo_sdi == "T" && tipodocsdi.full()) || tipodocsdi == tipo_sdi) + caus_list.add(rec.get(CAU_CODCAUS)); + } + else if (reg == 'A') + { + if (rec.get(CAU_CODCAUREG).full()) + { + const TCausale & caus_coll = cached_causale(rec.get(CAU_CODCAUREG), get_date(ES_DATAEND).year()); + const TString& tipodocsdi = caus_coll.tipodocsdi(); + if ((tipo_sdi == "T" && tipodocsdi.full()) || tipodocsdi == tipo_sdi) + caus_list.add(rec.get(CAU_CODCAUS)); + } + } + + } + return caus_list; +} + +bool Tf9IntEstrai_mask::estrai_handler(TMask_field& f, KEY key) +{ + Tf9IntEstrai_mask& msk = (Tf9IntEstrai_mask&)f.mask(); + TArchiviazioneIntegrazioni& app = f9Int_app(); + + // Estraggo + const int stato = msk.estrai(); // Main function + + // Gestione risultato estrazione + if (stato == 1) + { + message_box("Estrazione avvenuta con successo!"); + //app.segna_estratti(); + } + if (stato == 0 || stato == -3) + { + warning_box("L'estrazione non e' stata completata. Controllare il log degli errori."); + //if (stato == 0) // Errore scrittura F9IVA, non segno in errore in testata... + //msk.segna_in_errore(); // ... se l'errore e' dovuto alla scrittura sul db. + } + msk.field(ES_DESCR).set(""); + msk.stop_run(K_FORCE_CLOSE); + return true; +} + +Tf9IntEstrai_mask::Tf9IntEstrai_mask() : TMask("Estrazione", 1, 60, 18), _estrazione(nullptr) +{ + add_button_tool(DLG_ELABORA, "Estrai", TOOL_ELABORA); + add_button_tool(DLG_NULL, "", 0); + add_button_tool(DLG_QUIT, "Esci", TOOL_QUIT); + + add_groupbox(ES_DATEGROUP, 0, "Inserire periodo per estrazione:", 1, 0, 59, 3, ""); + add_date(ES_DATAINI, 0, "dal", 4, 1, ""); + add_date(ES_DATAEND, 0, " al", 33, 1, ""); + add_groupbox(ES_FLAGGROUP, 0, "Selezionare tipo di estrazione:", 1, 3, 28, 3, ""); + add_list(ES_FLAGPROV, 0, "Flag provvisorio", 2, 4, 1, "", "P|D", "Provvisorio|Definitivo"); + add_groupbox(ES_TIPOGROUP, 0, "Selezionare documenti da estrarre:", 32, 3, 28, 4, ""); + add_list(ES_TIPODOC, 0, "Tipi documento", 33, 4, 1, "", "A|V", "Acquisti|Vendite"); + add_list(ES_DOCSDI, 0, "Tipi doc SDI", 33, 5, 5, "", "T|TD16|TD17|TD18|TD19|TD28", + "TUTTI|TD16 Integ. rev. chrg|TD17 Integ. servizi estero|TD18 Integ. beni intracom.|TD19 Integ. beni ex art. 17|TD28 Fatt. cartacea S.Marino"); + add_groupbox(ES_DESCGROUP, 0, "Inserire descrizione estrazione:", 1, 7, 59, 3, ""); + add_string(ES_DESCR, 0, "Descrizione", 2, 8, 250, "", 40); + + + set_handler(DLG_ELABORA, estrai_handler); + //set_handler(ES_DATAINI, dataini_handler); + //set_handler(ES_DATAEND, dataend_handler); + + TDate dt(TODAY); dt.set_day(1); dt.set_month(1); + + set(ES_DATAINI, dt); + set(ES_DATAEND, today); +} + + +//////////////////////////////////////////////////////// +// TControlloIntegrazioni_mask +//////////////////////////////////////////////////////// + +void TControlloIntegrazioni_mask::associa() // todo: levare gli ultimi residui del vecchio funzionamento del controllo errori +{ + TToken_string* mov_sel = selected_mov(); + TToken_string* fat_sel = selected_fat(); + if (mov_sel == nullptr || fat_sel == nullptr) + { + warning_box("Selezionare prima un movimento e una fattura elettronica."); + return; + } + TToken_string keys(fat_sel->get(cid2index(F_FPROKEYS)), ';'); + const bool ok = associa_int_ven(mov_sel->get_int(cid2index(F_CNUMREG)), keys); + if (ok) + { + // Tolgo il flag di in errore sul vettore in modo da rifare la fill e non venir piu' contato come da controllare + int count = -1; + + FOR_EACH_ARRAY_ROW(_controllo_mov, r, row) + if (count < _selected_mov && row->get_bool(0)) // Devo saltare tutti quelli che non hanno il flag e contare solo quelli che ce l'hanno + count++; + dberr_del_err(_cod_soc, _id_estr, mov_sel->get_int(cid2index(F_CNUMREG))); + } +} + +bool TControlloIntegrazioni_mask::associa_int_ven(const long numreg, TToken_string key_paf) +{ + TRectype & mov = (TRectype &)cache().get(LF_MOV, numreg); + bool ok = mov.full(); + ok &= key_paf.full(); + + if (ok) // Scrivo sul movimento il riferimento al fppro + { + //mov.put(MOV_IDDOCSDI, fppro_db().get_numdoc()); + //mov.put(MOV_DATADOCSDI, fppro_db().get_datadoc()); + mov.put(MOV_KEYPAF, key_paf); + ok = mov.rewrite() == NOERR; + } + else // Se la scrittura sul db fallisce levo sul movimento il riferimento all'fppro + { + //mov.zero(MOV_IDDOCSDI); + //mov.zero(MOV_DATADOCSDI); + mov.zero(MOV_KEYPAF); + mov.rewrite(); + } + return ok; +} + +TToken_string* TControlloIntegrazioni_mask::selected_mov() +{ + TSheet_field& movs = sfield(S_CONTROLLO); + FOR_EACH_SHEET_ROW(movs, nr, row) + { + if (row->get(0)[0] == 'X') + { + _selected_mov = nr; + return row; + } + } + return nullptr; +} + +TToken_string* TControlloIntegrazioni_mask::selected_fat() const +{ + TSheet_field& fppro = sfield(S_FPPRO); + FOR_EACH_SHEET_ROW(fppro, nr, row) + { + if (row->get(0)[0] == 'X') + return row; + } + return nullptr; +} + +TArray& TControlloIntegrazioni_mask::import_error_list() +{ + _tipo_doc_err = dberr_get_err(_cod_soc, _id_estr, _controllo_mov); + return _controllo_mov; +} + +void TControlloIntegrazioni_mask::fill_sheets() +{ + TSheet_field& sf = sfield(S_CONTROLLO); + + sf.reset(); + if (!_is_escluso) + import_error_list(); + else + _controllo_mov = f9Int_app().esclusi(); + FOR_EACH_ARRAY_ROW(_controllo_mov, r, row) + { + TToken_string& sfrow = sf.row(-1); + if (row->get_bool(0)) + { + sfrow = *row; + sf.set_row_cell(101, false, r); + } + } + sf.force_update(); + // Fill fppro sheet + + fill_pafw300_sheet(); +} + +void TControlloIntegrazioni_mask::fill_pafw300_sheet(bool filter) +{ + TSheet_field& sf = sfield(S_FPPRO); + + sf.reset(); + const char* order; + switch (_ordin) + { + default: + case 'D': order = "P7_DATA"; break; + case 'N': order = "P7_NUMERO"; break; + case 'F': order = "FORNITORE"; break; + case 'R': order = "P2_ANADENOMIN"; break; + case 'P': order = "P2_FISCIVACOD"; break; + } + TString query; + query << "SELECT PQ_KEYPRGINVIO AS KEYPRGINVIO, PQ_KEYHEADERFATT AS KEYHEADERFATT, PQ_KEYBODYFATT AS KEYBODYFATT,\n" << + "PW_TIPODOC AS TIPODOC, P7_DATA AS DATA, P7_NUMERO AS NUMDOC, PQ_IMPTOTDOC AS IMPTOTDOC,\n" << + "PW_RAGSOC AS CLIENTE, " << + "P2_ANADENOMIN AS RAGSOC, P2_FISCIVAPAESE AS STATOPIVA, P2_FISCIVACOD AS PIVA FROM PAF2700F\n" << + "JOIN PAF0700F ON PQ_KEYPRGINVIO = P7_KEYPRGINVIO AND PQ_KEYHEADERFATT = P7_KEYHEADERFATT AND PQ_KEYBODYFATT = P7_KEYBODYFATT\n" << + "JOIN PAF0200F ON PQ_KEYPRGINVIO = P2_KEYPRGINVIO AND PQ_KEYHEADERFATT = P2_KEYHEADERFATT AND PQ_KEYBODYFATT = P2_KEYBODYFATT\n" << + "JOIN PAFW300F ON PQ_KEYPRGINVIO = PW_KEYPRGINVIO AND PQ_KEYHEADERFATT = PW_KEYHEADERFATT AND PQ_KEYBODYFATT = PW_KEYBODYFATT\n" << + "WHERE PW_DATA > '20211201'" << "\n"; + + if (filter) + { + if (!_flt_da_data.empty()) + query << "AND PW_DATA >= '" << _flt_da_data.date2ansi() << "'"; + else + query << "AND PW_DATA >= '20010101'"; + + if (!_flt_a_data.empty()) + query << "AND PW_DATA <= '" << _flt_a_data.date2ansi() << "'\n"; + else + query << "AND PW_DATA <= '" << today.date2ansi() << "'\n"; + + if (!_flt_tipodoc.empty()) + query << "AND PW_TIPODOC = '" << _flt_tipodoc << "'\n"; + if (!_flt_numdoc.empty()) + query << "AND P7_NUMERO like '%" << _flt_numdoc << "%'\n"; + if (!_flt_tot_doc_da.is_zero()) + query << "AND PQ_IMPTOTDOC >= '" << _flt_tot_doc_da << "'\n"; + if (!_flt_tot_doc_a.is_zero()) + query << "AND PQ_IMPTOTDOC <= '" << _flt_tot_doc_a << "'\n"; + if (!_flt_ragsoc.empty()) + query << "AND P2_ANADENOMIN like '%" << _flt_ragsoc << "%'\n"; + if (!_flt_codforn.empty()) + query << "AND PW_RAGSOC = '" << _flt_codforn << "'\n"; + if (!_flt_piva.empty()) + query << "AND P2_FISCIVACOD = '" << _flt_piva << "'\n"; + } + + query << "ORDER BY " << order << " " << (_verso == 'A' ? "ASC" : "DESC") << "\n"; + fp_db().sq_set_exec(query, false); + + for (bool ok = fp_db().sq_next(); ok; ok = fp_db().sq_next()) + { + const int row = sf.set_row_cell(F_FTIPODOC, fp_db().sq_get("TIPODOC")); + + sf.set_row_cell(F_FDATA, fp_db().sq_get_date("DATA"), row); + sf.set_row_cell(F_FNUMDOC, fp_db().sq_get("NUMDOC"), row); + sf.set_row_cell(F_FIMPTOTDOC, fp_db().sq_get("IMPTOTDOC"), row); + sf.set_row_cell(F_FFORNITORE, fp_db().sq_get("CLIENTE"), row); + sf.set_row_cell(F_FRAGSOC, fp_db().sq_get("RAGSOC"), row); + sf.set_row_cell(F_FSTATOPIVA, fp_db().sq_get("STATOPIVA"), row); + sf.set_row_cell(F_FPIVA, fp_db().sq_get("PIVA"), row); + TString s = fp_db().sq_get("KEYPRGINVIO"); + s << ";" << fp_db().sq_get("KEYHEADERFATT") << ";" << fp_db().sq_get("KEYBODYFATT"); + sf.set_row_cell(F_FPROKEYS, s, row); + + } + sf.force_update(); +} + +void TControlloIntegrazioni_mask::open_win_filter() +{ + TMask& m = get_win_filter(); + m.set(F_FLTDATADA, _flt_da_data); + m.set(F_FLTDATAA, _flt_a_data); + + m.run(); + + _flt_da_data = m.get_date(F_FLTDATADA); + _flt_a_data = m.get_date(F_FLTDATAA); + + _flt_tipodoc = m.get(F_FLTTIPODOC); + _flt_numdoc = m.get(F_FLTNUMDOC); + _flt_tot_doc_da = m.get_real(F_FLTTOTDOCDA); + _flt_tot_doc_a = m.get_real(F_FLTTOTDOCA); + + _flt_codforn = m.get(F_FLTCODFORN); + _flt_ragsoc = m.get(F_FLTRAGSOC); + _flt_piva = m.get(F_FLTPIVA); + + //Ordinamento + _ordin = m.get(F_ORDER)[0]; + _verso = m.get(F_VERSO)[0]; + ini_set_string(CONFIG_DITTA, INI_PAR_MOD, "ORDINAM", &_ordin); + ini_set_string(CONFIG_DITTA, INI_PAR_MOD, "VERSO", &_verso); +} + +TMask& TControlloIntegrazioni_mask::get_win_filter() +{ + TMask* m = nullptr; + + if (m == nullptr) + { + m = new TMask("Filtro griglia FPPRO", 1, 65, 36, 60, 2); + + // TOOLBAR + m->add_button_tool(DLG_OK, "Conferma", TOOL_OK); + m->add_button_tool(DLG_NULL, "", 0); + //m->add_button_tool(DLG_QUIT, "Esci", TOOL_QUIT); + + // Filtro Documenti + m->add_groupbox(F_FLTDOCGRP, 0, "@BFiltra sui parametri del documento", 1, 1, 59, 5); + m->add_list(F_FLTTIPODOC, 0, "TIPO DOC. ", 2, 2, 8, "", + "|TD01|TD02|TD03|TD04|TD05|TD06|TD07|TD08|TD10|TD11|TD16|TD17|TD18|TD19|TD20|TD21|TD22|TD23|TD24|TD25|TD26|TD27|TD28", + "|TD01|TD02|TD03|TD04|TD05|TD06|TD07|TD08|TD10|TD11|TD16|TD17|TD18|TD19|TD20|TD21|TD22|TD23|TD24|TD25|TD26|TD27|TD28"); + m->add_string(F_FLTNUMDOC, 0, "NUM.DOC.", 30, 2, 8); + m->add_string(F_FLTTOTDOCDA, 0, "TOT.DOC. DA", 2, 3, 8); + m->add_string(F_FLTTOTDOCA, 0, "A ", 10, 4, 8); + + // Filtro date + m->add_groupbox(F_FLTDATAGRP, 0, "@BFiltra per data documento", 1, 6, 59, 3); + m->add_date(F_FLTDATADA, 0, "DATA DOC. DAL", 2, 7); + m->add_date(F_FLTDATAA, 0, " AL", 30, 7); + + // Filtro per fornitore + m->add_groupbox(F_FLTFORNGRP, 0, "@BFiltra per parametri fornitore", 1, 9, 59, 4); + //m->add_string(F_FLTCODFORN, 0, "CODICE ", 2, 10, 8); + m->add_string(F_FLTPIVA, 0, "P.IVA", 30, 10, 15); + m->add_string(F_FLTRAGSOC, 0, "RAG.SOC.", 2, 11, 48); + + // Ordinatori + m->add_radio(F_ORDER, 0, "@BOrdina per:", 1, 13, 59, "D|N|F|R|P", "DATA|NUMDOC|FORNITORE|RAGSOC|PIVA", "Z"); + m->add_radio(F_VERSO, 0, "@BVerso:", 1, 16, 59, "A|D", "Crescente|Decrescente", "Z"); + + //m->set_handler(DLG_OK, save_conf_handler); + _ordin = ini_get_string(CONFIG_DITTA, INI_PAR_MOD, "ORDINAM", "D")[0]; + _verso = ini_get_string(CONFIG_DITTA, INI_PAR_MOD, "VERSO", "A")[0]; + + m->set(F_FLTDATADA, _flt_da_data); + m->set(F_FLTDATAA, _flt_a_data); + m->set(F_FLTDATAA, _flt_tipodoc); + m->set(F_FLTNUMDOC, _flt_numdoc); + m->set(F_FLTTOTDOCDA, _flt_tot_doc_da); + m->set(F_FLTTOTDOCA, _flt_tot_doc_a); + //m->set(F_FLTCODFORN, _flt_codforn); + m->set(F_FLTPIVA, _flt_piva); + m->set(F_FLTRAGSOC, _flt_ragsoc); + m->set(F_ORDER, &_ordin); + m->set(F_VERSO, &_verso); + + } + return *m; +} + +bool TControlloIntegrazioni_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + switch (o.dlg()) + { + case DLG_USER: + if (e == fe_button && jolly > 0) + { + TSheet_field& sf = sfield(S_CONTROLLO); + TToken_string& row = sf.row(sf.selected()); + TRectype mov(LF_MOV); + mov.put(MOV_NUMREG, row.get(sf.cid2index(F_CNUMREG))); + //if (open_mov(mov)) + //fill(); + } + break; + case B_FILTER_CONF: + if (e == fe_button) + { + open_win_filter(); + fill_pafw300_sheet(true); + field(B_FILTER_OFF).enable(); + field(B_FILTER_ON).disable(); + } + break; + case B_FILTER_ON: + if (e == fe_button) + { + fill_pafw300_sheet(true); + field(B_FILTER_OFF).enable(); + field(B_FILTER_ON).disable(); + } + break; + case B_FILTER_OFF: + if (e == fe_button) + { + fill_pafw300_sheet(false); + field(B_FILTER_ON).enable(); + field(B_FILTER_OFF).disable(); + } + break; + case B_ASSOC: + if (e == fe_button) + { + associa(); + fill_sheets(); // Ricarico gli sheet + } + break; + case B_ESCL: + if (e == fe_button) + { + //conferma_esclusi(); + //fill(); + } + break; + case B_SELESCL: + if (e == fe_button) + { + _sel_esclusi = !_sel_esclusi; + field(B_ASSOC).enable(!_sel_esclusi); + field(B_ESCL).enable(_sel_esclusi); + field(B_ALLESCL).enable(_sel_esclusi); + sfield(S_CONTROLLO).enable_column(cid2index(F_CESCLUDI), _sel_esclusi); + sfield(S_CONTROLLO).force_update(); + } + break; + case B_ALLESCL: + if (e == fe_button) + { + TSheet_field& sf = sfield(S_CONTROLLO); + sf.hide(); + const bool active = *sf.row(0).get(cid2index(F_CESCLUDI)) == 'X'; + FOR_EACH_SHEET_ROW(sf, nr, row) + row->add(active ? " " : "X", cid2index(F_CESCLUDI)); + sf.force_update(); + sf.show(); + } + break; + case S_CONTROLLO: + if (e == fe_init) + sfield(S_CONTROLLO).enable_column(cid2index(F_CESCLUDI), false); + break; + case F_CSEL: + if (e == fe_modify) + //selfatt(o, jolly); + break; + default: break; + } + return true; +} + +TControlloIntegrazioni_mask::TControlloIntegrazioni_mask(const char* codsoc, const char* id_estr, const bool esclusi) + : TAutomask("f90600b"), _ordin('D'), _verso('A'), _selected_mov(0), _sel_esclusi(false) +{ + _cod_soc = codsoc; + _id_estr = id_estr; + field(B_ESCL).disable(); + field(B_ALLESCL).disable(); + _is_escluso = esclusi; + + field(B_FILTER_ON).disable(); + field(B_FILTER_OFF).disable(); + + // Fill controllo sheet + if (!_is_escluso) + import_error_list(); + else + _controllo_mov = f9Int_app().esclusi(); + + _datada = EOTIME; + _dataa = 0L; + FOR_EACH_ARRAY_ROW(_controllo_mov, r, row) + { + if (row->get_bool(0)) + { + const TDate& d = row->get_date(3); + + if (d < _datada) + _datada = d; + if (d > _dataa) + _dataa = d; + } + } + fill_sheets(); +} + + +//////////////////////////////////////////////////////// +// TApri_pacchetto_msk +//////////////////////////////////////////////////////// + +bool TApri_pacchetto_msk::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + switch (o.dlg()) + { + case DLG_USER: + if (e == fe_button) + { + TSheet_field& sf = sfield(S_INCL); + TToken_string& row = sf.row(sf.selected()); + TRectype mov(LF_MOV); + mov.put(MOV_NUMREG, row.get(sf.cid2index(FI_NUMREG))); + //open_mov(mov); + } + break; + case B_ISELESCL: + if (e == fe_button) + //inselect_handler(); + break; + case B_IESCL: + if (e == fe_button) + //inescludi_handler(); + break; + case B_IALLESCL: + if (e == fe_button) + //inall_handler(); + default: break; + } + return true; +} + +void TApri_pacchetto_msk::fill_estr() const +{ + TString query; + query << "SELECT " IVA_SEZIVA ", " IVA_DATADOC ", " IVA_NUMDOC ", " IVA_NPROT "\n" + "FROM " F9_IVA "\n" + "WHERE " IVA_CODSOC " = '" << F9CONF.get_ambiente() << "' AND " IVA_IDLAN " = '" << _idestr << "'"; + // REG + DATAREG + PROTIVA + DATAINC + DATA74TER + NUMREG + + TSQL_recordset rec(""); + fp_db().sq_set_exec(query, false); + TSheet_field& sf = sfield(S_ESCL); + + sf.reset(); + + TProgress_monitor prog(fp_db().sq_items(), "Caricamento dati estrazione..."); + + for (bool ok = fp_db().sq_next(); ok; ok = fp_db().sq_next()) + { + if (!prog.add_status()) + break; + + TString sql; + + sql << "SELECT NUMREG, DATAREG, DATADOC, CODCAUS, TIPODOC, MESELIQ, NUMDOC, TOTDOC, CODCF, REG, PROTIVA, DESCR, ELABF9\n" + "FROM MOV\n" + "WHERE REG = '" << fp_db().sq_get(IVA_SEZIVA) << "' AND DATADOC='" << TDate(fp_db().sq_get_date(IVA_DATADOC)).date2ansi() << "'" + " AND PROTIVA = '" << fp_db().sq_get(IVA_NPROT) << "'"; + rec.set(sql); + rec.move_first(); + + const int row = sf.set_row_cell(FI_NUMREG, rec.get(0).as_string()); // Numreg + + sf.set_row_cell(FI_DATAREG, rec.get(1).as_date(), row); // Data reg + sf.set_row_cell(FI_DATADOC, rec.get(2).as_string(), row); // Data doc + TString codcaus; + + codcaus << rec.get(3).as_string(); + codcaus.lpad(3, '0'); + sf.set_row_cell(FI_CODCAUS, codcaus, row); // Cod caus + sf.set_row_cell(FI_TIPOMOV, rec.get(4).as_string(), row); // Tipo doc + sf.set_row_cell(FI_MESELIQ, rec.get(5).as_string(), row); // Mese liq + sf.set_row_cell(FI_NUMDOC, rec.get(6).as_string(), row); // Num doc + sf.set_row_cell(FI_IMPTOTDOC, rec.get(7).as_string(), row); // Tot doc + sf.set_row_cell(FI_FORN, rec.get(8).as_string(), row); // Clifo + + TToken_string key(_tipodoc == 'A' ? "F" : "C"); + + key.add(rec.get(8).as_string()); + + const TRectype& clifo = cache().get(LF_CLIFO, key); + + sf.set_row_cell(FI_RAGSOC, clifo.get(CLI_RAGSOC), row); // Rag soc + + TString protiva(rec.get(9).as_string()); + + protiva << "/" << rec.get(10).as_string(); + sf.set_row_cell(FI_PROTIVA, protiva, row); // Prot iva + sf.set_row_cell(FI_DESCR, rec.get(11).as_string(), row); // Descr + sf.set_row_cell(FI_IESCLUSO, TToken_string(rec.get(12).as_string(), ';').get_bool(2), row); // Escluso + } + sf.force_update(); +} + +void TApri_pacchetto_msk::fill_res() const +{ + TString query; + query << "SELECT * FROM " F9_MOVESTR "\n" + "INNER JOIN " F9_IVA " ON " IVA_IDLAN " = " MES_IDESTR " AND " IVA_NUMOR " = " MES_NUMREG "\n" + "WHERE " MES_CODSOC " = '" << F9CONF.get_ambiente() << "' AND " MES_IDESTR " = '" << _idestr << "'"; + + fp_db().sq_set_exec(query, false); + TSheet_field& sf = sfield(S_RES); + TProgress_monitor prog(fp_db().sq_items(), "Caricamento dati estrazione..."); + + sf.reset(); + for (bool ok = fp_db().sq_next(); prog.add_status() && ok; ok = fp_db().sq_next()) + { + + TString td = fp_db().sq_get(IVA_CAUSSOS); + const TRectype & mov = cache().get(LF_MOV, fp_db().sq_get(MES_NUMREG)); + const int row = sf.set_row_cell(F_RSEL, fp_db().sq_get_int(MES_ESTR) ? "X" : " "); // Estratto + + sf.set_row_cell(F_RNUMREG, mov.get(MOV_NUMREG), row); // Numreg + sf.set_row_cell(F_RDATAREG, mov.get_date(MOV_DATAREG), row); // Data reg + sf.set_row_cell(F_RDATADOC, mov.get_date(MOV_DATADOC), row); // Data doc + sf.set_row_cell(F_RTIPODOCSDI, td, row); // Tipo Doc SDI + sf.set_row_cell(F_RCODCAUS, mov.get(MOV_CODCAUS), row); // Cod caus + sf.set_row_cell(F_RTIPOMOV, mov.get(MOV_TIPODOC), row); // Tipo doc + sf.set_row_cell(F_RMESELIQ, mov.get_int(MOV_MESELIQ), row); // Mese liq + sf.set_row_cell(F_RNUMDOC, mov.get(MOV_NUMDOC), row); // Num doc + sf.set_row_cell(F_RIMPTOTDOC, mov.get_real(MOV_TOTDOC), row); // Tot doc + sf.set_row_cell(F_RFORN, mov.get_int(MOV_CODCF), row); // Clifo + + TToken_string key(mov.get(MOV_TIPO)); + + key.add(mov.get(MOV_CODCF)); + + const TRectype & clifo = cache().get(LF_CLIFO, key); + + sf.set_row_cell(F_RRAGSOC, clifo.get(CLI_RAGSOC), row); // Rag soc + + TString protiva(mov.get(MOV_REG)); + + protiva << "/" << mov.get(MOV_PROTIVA); + + sf.set_row_cell(F_RPROTIVA, protiva, row); // Prot iva + sf.set_row_cell(F_RDESCR, mov.get(MOV_DESCR), row); // Descr + sf.set_row_cell(F_RDESCRERR, fp_db().sq_get(MES_ERR), row); // Descrizione errore + } + sf.force_update(); +} + +void TApri_pacchetto_msk::set_from_estrazione(TToken_string& row_estrazione) +{ + set(F_IIDESTR, _idestr.cut(0) << row_estrazione.get(cid2index(F_IDESTR))); + set(F_IDATA, _dataestr = row_estrazione.get(cid2index(F_DATAESTR))); + set(F_IPROV, _provv = *row_estrazione.get(cid2index(F_PROV_B)) == 'X'); + set(F_ITIPOD, (_tipodoc = *row_estrazione.get(cid2index(F_TIPODOC))) == 'V' ? "Vendite" : "Acquisti"); + (_statoestr.cut(0) << row_estrazione.get(cid2index(F_STATESTR))).cut(2); + set(F_ISTATOESTR, TString(_statoestr) << " - " << TArchiviazioneIntegrazioni::traduci_stato(_statoestr)); + set(F_IDAL, _datadal = row_estrazione.get(cid2index(F_DATADAL))); + set(F_IAL, _dataal = row_estrazione.get(cid2index(F_DATAAL))); +} + +TApri_pacchetto_msk::TApri_pacchetto_msk() : TAutomask("f90600d.msk"), _provv(true), _tipodoc('A') +{ + field(B_IESCL).disable(); + field(B_IALLESCL).disable(); +} + +//////////////////////////////////////////////////////// +// TArchiviazioneIntegrazioni +//////////////////////////////////////////////////////// + +const char* TArchiviazioneIntegrazioni::traduci_stato(const TString& cod) +{ + static TString stato; + static TString last_cod; + if (last_cod != cod) + { + last_cod = cod; + stato.cut(0); + if (cod == "01") + stato << "in diagnostica"; + else if (cod == "02") + stato << "errore diagnostica gestionale"; + else if (cod == "03") + stato << "diagnostica gestionale passata"; + else if (cod == "04") + stato << "controllo WebApp"; + else if (cod == "05") + stato << "errore diagnostica WebApp"; + else if (cod == "06") + stato << "diagnostica WebApp passata"; + else if (cod == "07") + stato << "in elaborazione da sostitutiva"; + else if (cod == "08") + stato << "errore diagnostica da sostitutiva"; + else if (cod == "09") + stato << "Archiviato"; + } + return (const char*)stato; +} + +void TArchiviazioneIntegrazioni::main_loop() +{ + _msk = new TArchInt_mask; + _estr_msk = new Tf9IntEstrai_mask; + //m.set(1, true); + while (_msk->run() != K_QUIT) {} +} + +bool TArchiviazioneIntegrazioni::create() +{ + open_files(LF_TAB, LF_TABCOM, LF_TABMOD, LF_ANAG, + LF_CLIFO, LF_CFVEN, LF_CFBAN, LF_NDITTE, + LF_DOC, LF_RIGHEDOC, LF_CODCORR, LF_ANAMAG, 0); + + const TRectype cfven(LF_CFVEN); + if (cfven.length(CFV_PADESTIN) != 7) // Nuova lunghezza per privati + return error_box(TR("Database non convertito per fatturazione F.P.")); + + //nel caso checkare qui le tabelle dell f9 + return TSkeleton_application::create(); +} + +bool TArchiviazioneIntegrazioni::destroy() +{ + return TSkeleton_application::destroy(); +} + +int f90600(int argc, char* argv[]) +{ + TArchiviazioneIntegrazioni archInt; + archInt.run(argc, argv, TR("Archiviazione Integrazioni")); + return 0; +} \ No newline at end of file diff --git a/src/f9/f90600.h b/src/f9/f90600.h new file mode 100644 index 000000000..c894922f7 --- /dev/null +++ b/src/f9/f90600.h @@ -0,0 +1,188 @@ +#ifndef _F90600_H_ +#define _F90600_H_ + +#include "mask.h" +#include "execp.h" +#include "f90600a.h" +#include "mov.h" +#include "automask.h" +#include "applicat.h" + +#include "f9lib.h" + +class TConfigIntf9_mask : public TAutomask +{ +protected: + bool on_key(const KEY key); + bool on_field_event(TOperable_field& o, TField_event e, long jolly); + +public: + // @cmember Costruttore (crea la maschera leggendo la descrizione dal file .msk) + TConfigIntf9_mask(const char* filename, int num = 0) : TAutomask(filename, num) {}; + // @cmember Costruttore (crea una maschera vuota con i parametri dati) + TConfigIntf9_mask(const char* title, int pages, int cols, int rows, int xpos = -1, int ypos = -1) : TAutomask(title, pages, cols, rows, xpos, ypos) {}; +}; + +class TApri_pacchetto_msk : public TAutomask +{ + TString _idestr; + TDate _dataestr; + bool _provv; + char _tipodoc; + TString _statoestr; + TDate _datadal; + TDate _dataal; + + bool on_field_event(TOperable_field& o, TField_event e, long jolly) override; + + //bool inall_handler() const; + //bool inescludi_handler() const; + //bool inselect_handler() const; + //void conferma_esclusi() const; +public: + void fill_estr() const; + void fill_res() const; + void set_from_estrazione(TToken_string& row_estrazione); + + TApri_pacchetto_msk(); + ~TApri_pacchetto_msk() {} +}; + +class TArchInt_mask : public TAutomask +{ + + TApri_pacchetto_msk _inclusi_msk; + + bool on_field_event(TOperable_field& o, TField_event e, long jolly) override; + + void load_sheet_causali(const TString& tipo_sel); + + void open_apri_estr_win(); + void fill() const; + void delete_pack(bool all = false); + void delete_estr_fld(const TString& idestr); + void controllo_errori(); + void open_win_estr(); + void open_win_conf(); + bool save_conf(TMask& config_mask); + +public: + + TArchInt_mask(); + ~TArchInt_mask() {} +}; + +class Tf9IntEstrai_mask : public TMask +{ + TEstrazione * _estrazione; // Oggetto estrazione in corso di elaborazione + + void enable_fields(bool en = true); + + TDate get_dataini() const { return get_date(ES_DATAINI); } + TDate get_dataend() const { return get_date(ES_DATAEND); } + char get_tipodoc() const { return get(ES_TIPODOC)[0]; } + TipoIVA get_tipoiva() const { return get_tipodoc() == 'A' ? iva_acquisti : iva_vendite; } + TString get_descr() const { return get(ES_DESCR); } + bool is_provviso() const { return get(ES_FLAGPROV)[0] == 'P'; } + + /* Prepara l'estrazione caricando tutti i movimenti dato un periodo (data registrazione), + * e avvia la procedura di estrazione. + * [See TEstrazione::estrai()]. + */ + int estrai(); + /** Segna su DRD che l'estrazione e' in errore diag. gestionale. */ + //void segna_in_errore() const; + bool causale_in_lista(const TString& cod_cau, TToken_string cau_list); + TToken_string select_causali(const TString& tipo_sdi, const char reg); + + static bool estrai_handler(TMask_field& f, KEY key); + + //static bool enable_handler(TMask_field& f, KEY key); + //static bool dataini_handler(TMask_field& f, KEY key); + //static bool dataend_handler(TMask_field& f, KEY key); + +public: + Tf9IntEstrai_mask(); + ~Tf9IntEstrai_mask() { safe_delete(_estrazione); }; +}; + +class TControlloIntegrazioni_mask : public TAutomask +{ + TArray _controllo_mov; // Usare import_error_list(). + char _ordin; + char _verso; + int _selected_mov; + bool _sel_esclusi; + bool _is_escluso; + TString _cod_soc; + TString _id_estr; + char _tipo_doc_err{}; + TDate _datada; + TDate _dataa; + + //Filter variables + TDate _flt_da_data; + TDate _flt_a_data; + TString4 _flt_tipodoc; + TString16 _flt_numdoc; + real _flt_tot_doc_da; + real _flt_tot_doc_a; + TString16 _flt_codforn; + TString _flt_ragsoc; + TString16 _flt_piva; + + void associa(); + bool associa_int_ven(const long numreg, TToken_string key_paf); + //void conferma_esclusi() const; + + TArray& import_error_list(); + void fill_sheets(); + void fill_pafw300_sheet(bool filter = false); + TMask& get_win_filter(); + void open_win_filter(); + + TToken_string* selected_mov(); + TToken_string* selected_fat() const; + + /** Gestisce la selezione multipla negli sheet di controllo movimenti */ + //void selfatt(TOperable_field& o, long jolly) const; + + bool on_field_event(TOperable_field& o, TField_event e, long jolly) override; +public: + TControlloIntegrazioni_mask(const char* codsoc, const char* id_estr, bool esclusi = false); +}; + +class TArchiviazioneIntegrazioni : public TSkeleton_application +{ + + TArchInt_mask * _msk; + Tf9IntEstrai_mask * _estr_msk; + + TArray _esclusi; // Vettore con i movimenti esclusi + +public: + virtual bool create(); + virtual bool destroy(); + virtual void main_loop(); + + TArray & esclusi() { return _esclusi; } + static const char* traduci_stato(const TString& cod); + + void run_estr_msk() { _estr_msk->run(); } + + TArchiviazioneIntegrazioni() {} +}; + +inline TArchiviazioneIntegrazioni& f9Int_app() +{ + static TArchiviazioneIntegrazioni* app = nullptr; + if (app == nullptr) + app = (TArchiviazioneIntegrazioni*)&main_app(); + return *app; +} + + + + +#endif //_F90600_H_ + diff --git a/src/f9/f90600a.h b/src/f9/f90600a.h new file mode 100644 index 000000000..957679dd2 --- /dev/null +++ b/src/f9/f90600a.h @@ -0,0 +1,69 @@ +// Sheet Pacchetti gia' elaborati +#define S_ELAB 201 +#define F_TEXT 202 +#define B_SHOWESTR 203 +#define B_SHOWESCL 204 + +#define F_SEL 101 +#define F_ARCH_B 102 +#define F_IDESTR 103 +#define F_DATAESTR 104 +#define F_PROV_B 105 +#define F_TIPODOC 106 +#define F_DATADAL 107 +#define F_DATAAL 108 +#define F_USER 109 +#define F_STATESTR 110 +#define F_DESCR_E 111 + +// Campi del vettore _movs per promemoria +// F_SEL 101 +// F_NUMREG 102 +// F_DATAREG 103 +// F_DATADOC 104 +// F_CODCAUS 105 +// F_MESELIQ 106 +// F_NUMDOC 107 +// F_IMPTOTDOC 108 +// F_FORN 109 +// F_RAGSOC 110 +// F_PROTIVA 111 +// F_DESCR 112 +// F_ESCLUDI 113 +// F_ESCLUSO 114 +// F_DESCRERR 115 + +// Campi maschera finestra runtime estrazione +#define ES_DATAINI 501 +#define ES_DATAEND 502 +#define ES_FLAGPROV 503 +#define ES_TIPODOC 504 +#define ES_DATEGROUP 505 +#define ES_FLAGGROUP 506 +#define ES_TIPOGROUP 507 +#define ES_DESCGROUP 508 +#define ES_DESCR 509 +#define ES_DOCSDI 510 + +// Campi maschera configurazione +#define CF_CODGROUP 501 +#define CF_CODSOC 502 +#define CF_ADDRGROUP 503 +#define CF_ADDRDOC 504 +#define CF_ADDRDOCLOC 505 +#define CF_ESTRGROUP 506 +#define CF_CARTEXP 507 +#define CF_LVLGROUP 508 +#define CF_LVLOLD 509 +#define CF_LVLNEW 510 +#define CF_TABLEVEL 511 + + +// Campi maschera descrizione estrazione +#define DES_TEXT 501 +#define DES_GROUP 502 + +// Campi maschera esclusi +#define ESC_BESTR 501 +#define ESC_BEXIT 502 +#define ESC_SSHEE 503 diff --git a/src/f9/f90600a.uml b/src/f9/f90600a.uml new file mode 100644 index 000000000..84dcb50db --- /dev/null +++ b/src/f9/f90600a.uml @@ -0,0 +1,155 @@ +#include "f90600a.h" + +TOOLBAR "topbar" 0 0 0 2 + +BUTTON DLG_ELABORA 2 2 +BEGIN + PROMPT 1 2 "Estrazione" + PICTURE TOOL_ELABORA + FLAGS "" +END + +BUTTON DLG_DELREC 2 2 +BEGIN + PROMPT 1 1 "~Elimina" + PICTURE TOOL_DELREC +END + +BUTTON DLG_CONFIG 2 2 +BEGIN + PROMPT 1 3 "Configurazione" + PICTURE TOOL_CONFIG + FLAGS "" +END + +BUTTON DLG_FINDREC 2 2 +BEGIN + PROMPT 1 4 "Controllo Estr." + PICTURE TOOL_PERMISSIONS + FLAGS "" +END + +BUTTON B_SHOWESTR 2 2 +BEGIN + PROMPT 1 5 "Apri Estr." + PICTURE BMP_EXPORT + FLAGS "" +END + +BUTTON DLG_RECALC +BEGIN + PROMPT 1 6 "Ricarica" + PICTURE TOOL_CONVERT + FLAS "" +END + +BUTTON DLG_NULL 2 2 +BEGIN + PROMPT 1 7 "" + PICTURE 0 +END + +BUTTON B_SHOWESCL 2 2 +BEGIN + PROMPT 1 8 "Mostra esclusi" + PICTURE TOOL_PERMISSIONS +END + +#include +ENDPAGE + +PAGE "Monitor Estrazioni" 0 2 0 0 + +TEXT F_TEXT +BEGIN + PROMPT 0 0 "@BElenco Pacchetti" +END + +SPREADSHEET S_ELAB -1 -1 +BEGIN + PROMPT 0 1 "Elenco pacchetti elaborati" + ITEM "" + ITEM "Archiviato@8" + ITEM "ID Estrazione@14" + ITEM "Data@8" + ITEM "Provv.@4" + ITEM "Tipo@8" + ITEM "dal@8" + ITEM "al@8" + ITEM "Utente@8" + ITEM "Stato estrazione@22" + ITEM "Descrizione@50" +END +ENDPAGE +ENDMASK + + +PAGE "Pacchetti" -1 -1 78 13 + +BOOLEAN F_SEL +BEGIN + PROMPT 1 1 "" +END + +BOOLEAN F_ARCH_B +BEGIN + PROMPT 1 1 "" + FLAGS "D" +END + +STRING F_IDESTR 18 +BEGIN + PROMPT 1 1 "" + FLAGS "D" +END + +BOOLEAN F_PROV_B +BEGIN + PROMPT 1 1 "" + FLAGS "D" +END + +STRING F_DESCR_E 50 +BEGIN + PROMPT 1 1 "" + FLAGS "D" +END + +STRING F_TIPODOC 13 +BEGIN + PROMPT 1 1 "" + FLAGS "D" +END + +DATE F_DATADAL +BEGIN + PROMPT 1 1 "" + FLAGS "D" +END + +DATE F_DATAAL +BEGIN + PROMPT 1 1 "" + FLAGS "D" +END + +STRING F_USER 20 +BEGIN + PROMPT 1 1 "" + FLAGS "D" +END + +STRING F_DATAESTR 19 +BEGIN + PROMPT 1 1 "" + FLAGS "D" +END + +STRING F_STATESTR 38 +BEGIN + PROMPT 1 1 "" + FLAGS "D" +END + +ENDPAGE +ENDMASK \ No newline at end of file diff --git a/src/f9/f90600b.h b/src/f9/f90600b.h new file mode 100644 index 000000000..eda8b0dfd --- /dev/null +++ b/src/f9/f90600b.h @@ -0,0 +1,61 @@ +// Maschera controllo errori in comune con monitor e esclusi +// Sheet Pacchetti gia' elaborati +#define B_ASSOC 202 +#define B_SELESCL 203 +#define B_ESCL 204 +#define B_ALLESCL 205 +#define B_FILTER_CONF 208 +#define B_FILTER_ON 209 +#define B_FILTER_OFF 210 + +// Sheet movimenti da controllare +#define S_CONTROLLO 206 +#define S_FPPRO 207 + +// Cambi maschera ordinamento sheet FPPRO +#define F_ORDER 301 +#define F_VERSO 302 + +//Filtro FPPRO +#define F_FLTDATAGRP 310 +#define F_FLTDATADA 311 +#define F_FLTDATAA 312 +#define F_FLTDOCGRP 313 +#define F_FLTTIPODOC 314 +#define F_FLTNUMDOC 315 +#define F_FLTTOTDOCDA 316 +#define F_FLTTOTDOCA 317 +#define F_FLTFORNGRP 318 +#define F_FLTCODFORN 319 +#define F_FLTRAGSOC 320 +#define F_FLTPIVA 321 + + + +#define F_CSEL 101 +#define F_CNUMREG 102 +#define F_CDATAREG 103 +#define F_CDATADOC 104 +#define F_CCODCAUS 105 +#define F_CMESELIQ 106 +#define F_CNUMDOC 107 +#define F_CIMPTOTDOC 108 +#define F_CFORN 109 +#define F_CRAGSOC 110 +#define F_CPROTIVA 111 +#define F_CDESCR 112 +#define F_CESCLUDI 113 +#define F_CESCLUSO 114 +#define F_CDESCRERR 115 + +// Sheet fatture FPPRO da associare +#define F_FSEL 101 +#define F_FTIPODOC 102 +#define F_FDATA 103 +#define F_FNUMDOC 104 +#define F_FIMPTOTDOC 105 +#define F_FFORNITORE 106 +#define F_FRAGSOC 107 +#define F_FSTATOPIVA 108 +#define F_FPIVA 109 +#define F_FPROKEYS 110 \ No newline at end of file diff --git a/src/f9/f90600b.uml b/src/f9/f90600b.uml new file mode 100644 index 000000000..27b2bdf51 --- /dev/null +++ b/src/f9/f90600b.uml @@ -0,0 +1,316 @@ +#include "f90600b.h" + +TOOLBAR "topbar" 0 0 0 2 + +BUTTON B_ASSOC 2 2 +BEGIN + PROMPT 1 6 "Associa mov." + PICTURE TOOL_SAVEREC + FLAGS "" +END + +BUTTON DLG_NULL 2 2 +BEGIN + PROMPT -1 1 "" + PICTURE 0 +END + +BUTTON B_SELESCL 2 2 +BEGIN + PROMPT 1 8 "Sel. esclusi" + PICTURE TOOL_MULTISEL + FLAGS "" +END + +BUTTON B_ESCL 2 2 +BEGIN + PROMPT 1 7 "Conf. esclusi" + PICTURE TOOL_WARNING + FLAGS "" +END + +BUTTON B_ALLESCL 2 2 +BEGIN + PROMPT 1 7 "Sel. tutti" + PICTURE TOOL_MULTISEL + FLAGS "" +END + +BUTTON DLG_NULL 2 2 +BEGIN + PROMPT -1 1 "" + PICTURE 0 +END + +BUTTON B_FILTER_CONF 2 2 +BEGIN + PROMPT 1 5 "Impostaz. Filtro" + PICTURE TOOL_ELABORA + FLAGS "" +END + +BUTTON B_FILTER_ON 2 2 +BEGIN + PROMPT 1 5 "Filtro ON" + PICTURE TOOL_CHECK + FLAGS "" +END + +BUTTON B_FILTER_OFF 2 2 +BEGIN + PROMPT 1 5 "Filtro OFF" + PICTURE TOOL_CHECK + FLAGS "" +END + +#include +ENDPAGE + +PAGE "Elenco di controllo" -1 -1 78 13 + +TEXT DLG_NULL +BEGIN + PROMPT 0 0 "Movimenti da controllare" +END + +SPREADSHEET S_CONTROLLO -1 10 +BEGIN + PROMPT 0 1 "Movimenti da controllare" + ITEM " " + ITEM "Numero\nReg.@8" + ITEM "Data\nReg.@8" + ITEM "Data\nDoc.@8" + ITEM "Codice\nCaus.@8" + ITEM "Mese\nliquidazione@8" + ITEM "Numero\nDocumento@8" + ITEM "Totale\nDocumento@8" + ITEM "Cliente/\nFornitore@8" + ITEM "Ragione\nSociale@8" + ITEM "Cod. regis./\nprot.IVA@8" + ITEM "Descrizione@8" + ITEM "ESCLUDI@5" + ITEM "ESCLUSO@6" + ITEM "Descrizione\nErrore" +END + +TEXT DLG_NULL +BEGIN + PROMPT 0 12 "Fatture el. in ingresso" +END + +SPREADSHEET S_FPPRO -1 -1 +BEGIN + PROMPT 0 13 "Movimenti da controllare" + ITEM " " + ITEM "Tipo Doc." + ITEM "Data@8" + ITEM "Num. Doc.@12" + ITEM "Tot. Doc.@9" + ITEM "Cliente@20" + ITEM "Fornitore@20" + ITEM "Stato P.IVA" + ITEM "P.IVA@8" + ITEM "Chiavi PAF@60" +END + +ENDPAGE +ENDMASK + + + + +PAGE "Controllo" -1 -1 78 13 + +BOOLEAN F_CSEL +BEGIN + PROMPT 1 1 "" +END + +NUMERIC F_CNUMREG 7 +BEGIN + PROMPT 1 1 "" + FLAGS "D" +END + +DATA F_CDATAREG +BEGIN + PROMPT 1 1 "" + FLAGS "D" +END + +DATA F_CDATADOC +BEGIN + PROMPT 1 1 "" + FLAGS "D" +END + +STRING F_CCODCAUS 3 +BEGIN + PROMPT 1 1 "" + FLAGS "D" +END + +NUMERIC F_CMESELIQ 2 +BEGIN + PROMPT 1 1 "" + FLAGS "D" +END + +STRING F_CNUMDOC 50 +BEGIN + PROMPT 1 1 "" + FLAGS "D" +END + +NUMERIC F_CIMPTOTDOC 15 2 +BEGIN + PROMPT 1 1 "" + FLAGS "D" +END + +NUMERIC F_CFORN 6 +BEGIN + PROMPT 1 1 "" + FLAGS "D" +END + +STRING F_CRAGSOC 80 +BEGIN + PROMPT 1 1 "" + FLAGS "D" +END + +STRING F_CPROTIVA 10 +BEGIN + PROMPT 1 1 "" + FLAGS "D" +END + +STRING F_CDESCR 50 +BEGIN + PROMPT 1 1 "" + FLAGS "D" +END + +BOOLEAN F_CESCLUDI +BEGIN + PROMPT 1 1 "Escludi" + FLAGS "D" +END + +STRING F_CESCLUSO 2 +BEGIN + PROMPT 1 1 "ESCLUSO" + FLAG "D" +END + +STRING F_CDESCRERR 110 +BEGIN + PROMPT 1 1 "DESCRIZIONE ERRORE" + FLAG "D" +END +ENDPAGE + +TOOLBAR "topbar" 0 0 0 2 + +BUTTON DLG_USER 2 2 +BEGIN + PROMPT 1 1 "Collega" + PICTURE TOOL_LINK +END + +BUTTON DLG_NULL 2 2 +BEGIN + PROMPT -1 0 "" + PICTURE 0 +END + +BUTTON DLG_QUIT 2 2 +BEGIN + PROMPT 3 1 "Fine" + MESSAGE EXIT,K_QUIT + PICTURE TOOL_QUIT +END +ENPAGE +ENDMASK + +PAGE "Passive" -1 -1 78 13 + +BOOLEAN F_FSEL +BEGIN + PROMPT 1 1 "" +END + +STRING F_FTIPODOC 4 +BEGIN + PROMPT 1 1 " " + FLAGS "D" +END + +DATA F_FDATA +BEGIN + PROMPT 1 1 " " + FLAGS "D" +END + +STRING F_FNUMDOC 20 +BEGIN + PROMPT 1 1 " " + FLAGS "D" +END + +NUMERIC F_FIMPTOTDOC 15 2 +BEGIN + PROMPT 1 1 " " + FLAGS "D" +END + +STRING F_FFORNITORE 80 +BEGIN + PROMPT 1 1 " " + FLAGS "D" +END + +STRING F_FRAGSOC 80 +BEGIN + PROMPT 1 1 " " + FLAGS "D" +END + +STRING F_FSTATOPIVA 2 +BEGIN + PROMPT 1 1 " " + FLAGS "D" +END + +STRING F_FPIVA 15 +BEGIN + PROMPT 1 1 " " + FLAGS "D" +END + +STRING F_FPROKEYS 80 +BEGIN + PROMPT 1 1 " " + FLAGS "D" +END + +ENDPAGE + +TOOLBAR "topbar" 0 0 0 2 + +BUTTON DLG_NULL 2 2 +BEGIN + PROMPT -1 0 "" + PICTURE 0 +END + +BUTTON DLG_QUIT 2 2 +BEGIN + PROMPT 3 1 "Fine" + MESSAGE EXIT,K_QUIT + PICTURE TOOL_QUIT +END + +ENPAGE +ENDMASK \ No newline at end of file diff --git a/src/f9/f90600c.h b/src/f9/f90600c.h new file mode 100644 index 000000000..6e6486825 --- /dev/null +++ b/src/f9/f90600c.h @@ -0,0 +1,17 @@ +#define S_ESCL 201 +#define F_ETEXT 202 +#define B_ESTRAI 203 + +// Elenco movimenti esclusi +#define FE_SEL 101 +#define FE_NUMREG 102 +#define FE_DATAREG 103 +#define FE_DATADOC 104 +#define FE_CODCAUS 105 +#define FE_MESELIQ 106 +#define FE_NUMDOC 107 +#define FE_IMPTOTDOC 108 +#define FE_FORN 109 +#define FE_RAGSOC 110 +#define FE_PROTIVA 111 +#define FE_DESCR 112 \ No newline at end of file diff --git a/src/f9/f90600d.h b/src/f9/f90600d.h new file mode 100644 index 000000000..fdc217ae6 --- /dev/null +++ b/src/f9/f90600d.h @@ -0,0 +1,48 @@ +#define S_INCL 201 +#define F_ETEXT 202 +#define B_ISELESCL 203 +#define B_IESCL 204 +#define B_IALLESCL 205 +#define F_IIDESTR 206 +#define F_IDATA 207 +#define F_IPROV 208 +#define F_ITIPOD 209 +#define F_ISTATOESTR 210 +#define F_IDAL 211 +#define F_IAL 212 + +#define S_RES 301 + +// Elenco movimenti inclusi +#define FI_SEL 101 +#define FI_NUMREG 102 +#define FI_DATAREG 103 +#define FI_DATADOC 104 +#define FI_CODCAUS 105 +#define FI_TIPOMOV 106 +#define FI_MESELIQ 107 +#define FI_NUMDOC 108 +#define FI_IMPTOTDOC 109 +#define FI_FORN 110 +#define FI_RAGSOC 111 +#define FI_PROTIVA 112 +#define FI_DESCR 113 +#define FI_IESCLUDI 114 +#define FI_IESCLUSO 115 + +// Elenco risultato movimenti (S_RES) +#define F_RSEL 101 +#define F_RNUMREG 102 +#define F_RDATAREG 103 +#define F_RDATADOC 104 +#define F_RTIPODOCSDI 105 +#define F_RCODCAUS 106 +#define F_RTIPOMOV 107 +#define F_RMESELIQ 108 +#define F_RNUMDOC 109 +#define F_RIMPTOTDOC 110 +#define F_RFORN 111 +#define F_RRAGSOC 112 +#define F_RPROTIVA 113 +#define F_RDESCR 114 +#define F_RDESCRERR 115 diff --git a/src/f9/f90600d.uml b/src/f9/f90600d.uml new file mode 100644 index 000000000..75d9455bb --- /dev/null +++ b/src/f9/f90600d.uml @@ -0,0 +1,399 @@ +#include "f90600d.h" + +TOOLBAR "topbar" 0 0 0 2 + +BUTTON DLG_INFO 2 2 +BEGIN + PROMPT 1 1 "Info" + MESSAGE EXIT,K_F2 + PICTURE TOOL_INFO +END + +BUTTON DLG_HELP 2 2 +BEGIN + PROMPT 2 1 "Help" + MESSAGE EXIT,K_F1 + PICTURE TOOL_HELP +END + +BUTTON DLG_NULL 2 2 +BEGIN + PROMPT -1 0 "" + PICTURE 0 +END + +BUTTON B_ISELESCL 2 2 +BEGIN + PROMPT 1 8 "Sel. esclusi" + PICTURE TOOL_MULTISEL + FLAGS "" +END + +BUTTON B_IESCL 2 2 +BEGIN + PROMPT 1 7 "Conf. esclusi" + PICTURE TOOL_WARNING + FLAGS "" +END + +BUTTON B_IALLESCL 2 2 +BEGIN + PROMPT 1 7 "Sel. tutti" + PICTURE TOOL_MULTISEL + FLAGS "" +END + +BUTTON DLG_NULL 2 2 +BEGIN + PROMPT -1 0 "" + PICTURE 0 +END + +BUTTON DLG_QUIT 2 2 +BEGIN + PROMPT 3 1 "Fine" + MESSAGE EXIT,K_QUIT + PICTURE TOOL_QUIT +END +ENDPAGE + +PAGE "Movimenti" 0 2 0 0 + +STRING F_IIDESTR 18 +BEGIN + PROMPT 0 0 "Id estrazione" + FLAGS "D" +END + +DATA F_IDATA +BEGIN + PROMPT 45 0 "Data estrazione " + FLAGS "D" +END + +BOOLEAN F_IPROV +BEGIN + PROMPT 0 1 "Provvisorio" + FLAGS "D" +END + +STRING F_ITIPOD 9 +BEGIN + PROMPT 15 1 "Tipo Documenti" + FLAGS "D" +END + +STRING F_ISTATOESTR 38 +BEGIN + PROMPT 45 1 "Stato estrazione" + FLAGS "D" +END + +DATA F_IDAL +BEGIN + PROMPT 0 2 "Dal" + FLAGS "D" +END + +DATA F_IAL +BEGIN + PROMPT 15 2 "Al" + FLAGS "D" +END + +TEXT F_ETEXT +BEGIN + PROMPT 0 3 "@BMovimenti estratti nel pacchetto:" +END + +SPREADSHEET S_INCL -1 -1 +BEGIN + PROMPT 0 4 "Movimenti estratti" + ITEM " " + ITEM "Numero\nReg.@8" + ITEM "Data\nReg.@8" + ITEM "Data\nDoc.@8" + ITEM "Codice\nCaus.@8" + ITEM "Tipo Doc.@5" + ITEM "Mese\nliquidazione@8" + ITEM "Numero\nDocumento@8" + ITEM "Totale\nDocumento@8" + ITEM "Cliente/\nFornitore@8" + ITEM "Ragione\nSociale@8" + ITEM "Cod. regis./\nprot.IVA@8" + ITEM "Descrizione@8" + ITEM "ESCLUDI@5" + ITEM "ESCLUSO@6" +END + +ENDPAGE + + +PAGE "Risultato estrazione" 0 0 0 0 + +SPREADSHEET S_RES -1 -1 +BEGIN + PROMPT 0 0 "Movimenti" + ITEM "Estratto" + ITEM "Numero\nReg.@8" + ITEM "Data\nReg.@8" + ITEM "Data\nDoc.@8" + ITEM "Tipo Doc\nSDI@9" + ITEM "Codice\nCaus.@8" + ITEM "Tipo Mov.@5" + ITEM "Mese\nliquidazione@8" + ITEM "Numero\nDocumento@8" + ITEM "Totale\nDocumento@8" + ITEM "Cliente/\nFornitore@8" + ITEM "Ragione\nSociale@8" + ITEM "Cod. regis./\nprot.IVA@8" + ITEM "Descrizione@8" + ITEM "Descrizione Estrazione@30" +END + +ENDPAGE +ENDMASK + + + + +PAGE "Mov Inclusi" -1 -1 78 13 + +BOOLEAN FI_SEL +BEGIN + PROMPT 1 1 "" +END + +NUMERIC FI_NUMREG 7 +BEGIN + PROMPT 1 2 "" + FLAGS "D" +END + +DATA FI_DATAREG +BEGIN + PROMPT 1 3 "" + FLAGS "D" +END + +DATA FI_DATADOC +BEGIN + PROMPT 1 4 "" + FLAGS "D" +END + +STRING FI_CODCAUS 3 +BEGIN + PROMPT 1 5 "" + FLAGS "D" +END + +STRING FI_TIPOMOV 3 +BEGIN + PROMPT 1 6 "" + FLAGS "D" +END + +NUMERIC FI_MESELIQ 2 +BEGIN + PROMPT 1 7 "" + FLAGS "D" +END + +STRING FI_NUMDOC 50 +BEGIN + PROMPT 1 8 "" + FLAGS "D" +END + +NUMERIC FI_IMPTOTDOC 15 2 +BEGIN + PROMPT 1 9 "" + FLAGS "D" +END + +NUMERIC FI_FORN 6 +BEGIN + PROMPT 1 10 "" + FLAGS "D" +END + +STRING FI_RAGSOC 80 +BEGIN + PROMPT 1 11 "" + FLAGS "D" +END + +STRING FI_PROTIVA 10 +BEGIN + PROMPT 1 12 "" + FLAGS "D" +END + +STRING FI_DESCR 50 +BEGIN + PROMPT 1 13 "" + FLAGS "D" +END + +LIST FI_IESCLUDI 2 +BEGIN + PROMPT 1 1 "Escludi" + ITEM "|" + ITEM "S|SI" + ITEM "N|NO" + FLAGS "D" +END + +BOOLEAN FI_IESCLUSO +BEGIN + PROMPT 1 1 "ESCLUSO" + FLAG "D" +END + +ENDPAGE + +TOOLBAR "topbar" 0 0 0 2 + +BUTTON DLG_USER 2 2 +BEGIN + PROMPT 1 1 "Collega" + PICTURE TOOL_LINK +END + +BUTTON DLG_NULL 2 2 +BEGIN + PROMPT -1 0 "" + PICTURE 0 +END + +BUTTON DLG_QUIT 2 2 +BEGIN + PROMPT 3 1 "Fine" + MESSAGE EXIT,K_QUIT + PICTURE TOOL_QUIT +END + +ENPAGE +ENDMASK + + + + +PAGE "Risultato estratti" -1 -1 78 13 + +BOOLEAN F_RSEL +BEGIN + PROMPT 1 1 "" + FLAGS "D" +END + +NUMERIC F_RNUMREG 7 +BEGIN + PROMPT 1 2 "" + FLAGS "D" +END + +DATA F_RDATAREG +BEGIN + PROMPT 1 3 "" + FLAGS "D" +END + +DATA F_RDATADOC +BEGIN + PROMPT 1 4 "" + FLAGS "D" +END + +STRING F_RTIPODOCSDI 4 +BEGIN + PROMPT 1 5 "" + FLAGS "D" +END + +STRING F_RCODCAUS 3 +BEGIN + PROMPT 1 6 "" + FLAGS "D" +END + +STRING F_RTIPOMOV 3 +BEGIN + PROMPT 1 7 "" + FLAGS "D" +END + +NUMERIC F_RMESELIQ 2 +BEGIN + PROMPT 1 8 "" + FLAGS "D" +END + +STRING F_RNUMDOC 50 +BEGIN + PROMPT 1 9 "" + FLAGS "D" +END + +NUMERIC F_RIMPTOTDOC 15 2 +BEGIN + PROMPT 1 10 "" + FLAGS "D" +END + +NUMERIC F_RFORN 6 +BEGIN + PROMPT 1 11 "" + FLAGS "D" +END + +STRING F_RRAGSOC 80 +BEGIN + PROMPT 1 12 "" + FLAGS "D" +END + +STRING F_RPROTIVA 10 +BEGIN + PROMPT 1 13 "" + FLAGS "D" +END + +STRING F_RDESCR 50 +BEGIN + PROMPT 1 14 "" + FLAGS "D" +END + +STRING F_RDESCRERR 92 +BEGIN + PROMPT 1 15 "" + FLAGS "D" +END + +ENDPAGE + +TOOLBAR "topbar" 0 0 0 2 + +BUTTON DLG_USER 2 2 +BEGIN + PROMPT 1 1 "Collega" + PICTURE TOOL_LINK +END + +BUTTON DLG_NULL 2 2 +BEGIN + PROMPT -1 0 "" + PICTURE 0 +END + +BUTTON DLG_QUIT 2 2 +BEGIN + PROMPT 3 1 "Fine" + MESSAGE EXIT,K_QUIT + PICTURE TOOL_QUIT +END + +ENPAGE +ENDMASK \ No newline at end of file diff --git a/src/f9/f9lib.h b/src/f9/f9lib.h index 23ca2b181..21f30dfb0 100644 --- a/src/f9/f9lib.h +++ b/src/f9/f9lib.h @@ -66,6 +66,9 @@ struct statistics size_t fv_err; size_t fv_estr; size_t fv_nocatdoc; + size_t int_match; + size_t int_nomatch; + size_t int_err; }; extern statistics _stats; @@ -115,6 +118,15 @@ enum state_fppro err_read_db = 999 // Errore lettura da fppro }; +enum state_estr_int +{ + int_with_err = -1, // Movimento associato male con FPPRO + guessed_int = 100, + no_guessed_int = 0, + err_read_db_int = 999, // Errore lettura da fppro + wrong_keys = -2 +}; + class TF9_config { // todo: controllare che siano sqlsafe @@ -308,7 +320,8 @@ enum err_mov mov_no_filecart, // Il documento cartaceo non ha associato un file, o questo non e' stato trovato. mov_annesso_nexist, // Un annesso obbligatorio e' mancante. mov_nocat_butok, // Non è stata trovata nessuna categoria documentale per il seguente documento. Verra usato il TIPODOCSDI presente nel FPPRO - mov_no_sdi // Nessuno tipo doc SDI abbinato + mov_no_sdi, // Nessuno tipo doc SDI abbinato + mov_nomatch_keys // La chiave del documento salavta in MOV non si matcha con nessun documento elettronico }; class TMovimento_estr : public TObject // aggiungere metodi per TArray @@ -326,6 +339,7 @@ class TMovimento_estr : public TObject // aggiungere metodi per TArray TString _reg_protiva; TString _descr; state_fppro _state; + state_estr_int _state_int; TString _descr_err; // Messaggio di errore visibile dal controllo estrazione. bool _estratto; err_mov _descr_estr; // Messaggio di informazioni visibile dal 'Apri Estr.' @@ -371,6 +385,7 @@ public: void set_err(const char * descr = "", err_mov descr_estr = mov_no_error); void reset_err() { set_err(); } void set_state(state_fppro state) { _state = state; } + void set_state_int(state_estr_int state) { _state_int = state; } void set_descr_estr(err_mov descr_estr) { _descr_estr = descr_estr; } void set_numdoc(const char * numdoc) { _numdoc = numdoc; } void set_estratto(bool estratto) { _estratto = estratto; } @@ -424,12 +439,16 @@ class TEstrazione : public TObject * \return \a not_fa se il movimento passato non è una fattura. */ static state_fppro check_fppro(int numreg); + state_estr_int guess_int(int numreg); + bool checkPAF(TLocalisamfile& mov); + bool checkPAA(TLocalisamfile& mov); + const bool check_keys(TToken_string keys); bool check_periodo_def() const; void copy_file_to_webapp_fld(TMovimento_estr& movimento) const; - void fill_id(const TRectype& clifo, TString& statopaiv, TString& idfisc, TString& paiv, TString& codfis); - TipoIVA get_tipoiva() const { return _head.tipo_doc == 'A' ? iva_acquisti : iva_vendite; } - bool is_doc_xml(const TRectype& mov); - bool load_docs(TMovimento_estr& movimento) { return movimento.load_docs(); } + void fill_id(const TRectype& clifo, TString& statopaiv, TString& idfisc, TString& paiv, TString& codfis); + TipoIVA get_tipoiva() const { return _head.tipo_doc == 'A' ? iva_acquisti : iva_vendite; } + bool is_doc_xml(const TRectype& mov); + bool load_docs(TMovimento_estr& movimento) { return movimento.load_docs(); } // Se il movimento e' di vendita e ha i riferimenti al documento generatore provo a stamparlo con ve, e lo inserisco tra i cartacei F9. // bool stampa_documento(const TMovimento_estr& movimento, TFilename& file); bool grab_pdf_from_spotlite(const TMovimento_estr& movimento, TFilename& file) const; @@ -448,7 +467,7 @@ private: /** Controlla ultimo id estrazione della giornata e in base al tipo di estrazione, * genera il progressivo seguente. Chiamata da \a estrai() e \a estrai_single(). * \return Nuovo id estrazione. */ - TString next_estr_today(char tipo) const; + TString next_estr_today(char tipo, const bool estr_int = false) const; static bool pura_iva(const TRectype& mov); void write_errorsql_log(const TString& query); @@ -465,6 +484,8 @@ public: * \return D_GEST_ERR (02) se la diagnostica ha riportato degli errori. */ const char* diagnostica_mov(); + /** DIAGNOSTICA GESTIONALE SPECIALIZZATA PER TD16/TD17/TD18....*/ + const char* diagnostica_mov_integrazione(); /** Estrazione per pacchetti "normali" (non da esclusi). * Viene chiamata dall'handler estrai_handler: bottone estrai nella maschera estrazione. * @@ -479,6 +500,10 @@ public: * \return true Scrittura sul db senza errori. * \return false Errore scrittura db. */ bool estrazione_iva(bool escluso = false); + + + result_estr TEstrazione::estrai_integrazioni(); + bool estrazione_iva_int(bool escluso = false); bool exist_prov() const; /**< Controllo che esista per questo stesso periodo una estrazione provvisoria. */ /** Controllo se esiste un periodo antecedente a questa estrazione che non e' mai stato estratto definitivamente. */ bool gap_periodo() const; diff --git a/src/f9/f9lib01.cpp b/src/f9/f9lib01.cpp index 628601c4f..7c91e76d8 100644 --- a/src/f9/f9lib01.cpp +++ b/src/f9/f9lib01.cpp @@ -15,7 +15,7 @@ #define MODE_SHEETS 0xC -statistics _stats = { 0, 0, 0, 0, 0, 0, 0, 0, 0 }; +statistics _stats = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; const TString & get_numdoc_exp_fp(const int numreg) { @@ -451,6 +451,129 @@ state_fppro TEstrazione::check_fppro(int numreg) return not_fa; } +state_estr_int TEstrazione::guess_int(int numreg) +{ + TLocalisamfile mov(LF_MOV); + mov.put(MOV_NUMREG, numreg); + if (mov.read() == NOERR) + { + + if (get_tipoiva() == iva_vendite) + { + if (checkPAF(mov)) + return guessed_int; + return no_guessed_int; + } + else if(get_tipoiva() == iva_acquisti) + { + if (checkPAA(mov)) + return guessed_int; + return no_guessed_int; + } + } + return int_with_err; +} + + +bool TEstrazione::checkPAF(TLocalisamfile& mov) +{ + // Prendo il fornitore del mov per controllare la p.iva + long codcf = mov.get_long(MOV_CODCF); + TCli_for forn = cached_clifor('C', mov.get_long(MOV_CODCF)); + + const TString4 statopiva(forn.get(CLI_STATOPAIV)); + + const real tot = mov.get_real(MOV_TOTDOC) + mov.get_real(MOV_RITFIS) + mov.get_real(MOV_RITSOC); + TString numdoc = mov.get(MOV_NUMDOCEXT); + + if (numdoc.blank()) + numdoc = mov.get(MOV_NUMDOC); + // Controllo datadoc - numdoc - totdoc - p.iva + + TString query; + + query << "SELECT PQ_KEYPRGINVIO AS KEYPRGINVIO, PQ_KEYHEADERFATT AS KEYHEADERFATT, PQ_KEYBODYFATT AS KEYBODYFATT, P7_DATA AS DATA,\n" << + "P7_NUMERO AS NUMDOC, PQ_IMPTOTDOC AS IMPTOTDOC, P2_FISCIVAPAESE AS STATOPIVA, P2_FISCIVACOD AS PIVA FROM PAF2700F\n" << + "JOIN PAF0700F ON PQ_KEYPRGINVIO = P7_KEYPRGINVIO AND PQ_KEYHEADERFATT = P7_KEYHEADERFATT AND PQ_KEYBODYFATT = P7_KEYBODYFATT\n" << + "JOIN PAF0200F ON PQ_KEYPRGINVIO = P2_KEYPRGINVIO AND PQ_KEYHEADERFATT = P2_KEYHEADERFATT AND PQ_KEYBODYFATT = P2_KEYBODYFATT\n" << + "WHERE P7_DATA = '" << mov.get_date(MOV_DATADOC).date2ansi() << "' AND \n" << + "(P7_NUMERO = '" << numdoc << "' OR P7_NUMERO LIKE '%" << numdoc << "%') \n"; + if (statopiva.full()) + query << " AND \n" << "P2_FISCIVAPAESE = '" << statopiva << "'"; + query << " AND \n" << "P2_FISCIVACOD = '" << forn.get(CLI_PAIV) << "'"; + if (forn.gruppo_IVA()) + query << " AND \n" "P2_COCAZZO = '" << forn.get(CLI_COFI) << "'"; // cazzo; + if (tot < 0) + query << " AND \n" "(PQ_IMPTOTDOC = " << tot << " OR PQ_IMPTOTDOC = " << abs(tot) << ")"; + else + query << " AND \n" "PQ_IMPTOTDOC = " << tot; + + bool ok = fp_db().sq_set_exec(query); + + if (ok && (fp_db().sq_items() == 1)) + { + TToken_string keys; + keys.separator(';'); + keys = (fp_db().sq_get("KEYPRGINVIO")); + keys.add(fp_db().sq_get("KEYHEADERFATT")); + keys.add(fp_db().sq_get("KEYBODYFATT")); + + mov.put(MOV_KEYPAF, keys); + mov.rewrite(); + + return true; + } + return false; +} + +bool TEstrazione::checkPAA(TLocalisamfile& mov) +{ + // Prendo il fornitore del mov per controllare la p.iva + long codcf = mov.get_long(MOV_CODCF); + TCli_for forn = cached_clifor('F', mov.get_long(MOV_CODCF)); + + const TString4 statopiva(forn.get(CLI_STATOPAIV)); + + const real tot = mov.get_real(MOV_TOTDOC) + mov.get_real(MOV_RITFIS) + mov.get_real(MOV_RITSOC) + mov.get_real(MOV_REVCHARGE); + TString numdoc = mov.get(MOV_IDDOCSDI); + + TString query; + + query << "SELECT PQ_KEYPRGINVIO AS KEYPRGINVIO, PQ_KEYHEADERFATT AS KEYHEADERFATT, PQ_KEYBODYFATT AS KEYBODYFATT, P7_DATA AS DATA,\n" << + "P7_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" << + "WHERE P7_DATA = '" << mov.get_date(MOV_DATADOC).date2ansi() << "' AND \n" << + "(P7_NUMERO = '" << numdoc << "' OR P7_NUMERO LIKE '%" << numdoc << "%') \n"; + if (statopiva.full()) + query << " AND \n" << "P2_FISCIVAPAESE = '" << statopiva << "'"; + query << " AND \n" << "P2_FISCIVACOD = '" << forn.get(CLI_PAIV) << "'"; + if (forn.gruppo_IVA()) + query << " AND \n" "P2_COCAZZO = '" << forn.get(CLI_COFI) << "'"; + if (tot < 0) + query << " AND \n" "(PQ_IMPTOTDOC = " << tot << " OR PQ_IMPTOTDOC = " << abs(tot) << ")"; + else + query << " AND \n" "PQ_IMPTOTDOC = " << tot; + + bool ok = fp_db().sq_set_exec(query); + + if (ok && (fp_db().sq_items() == 1)) + { + //CAPIRE COSA FARE QUI DENTRO + TToken_string keys; + keys.separator(';'); + keys = (fp_db().sq_get("KEYPRGINVIO")); + keys.add(fp_db().sq_get("KEYHEADERFATT")); + keys.add(fp_db().sq_get("KEYBODYFATT")); + + mov.put(MOV_KEYFPPRO, keys); + mov.rewrite(); + + return true; + } + return false; +} + bool TEstrazione::check_periodo_def() const { TString query; @@ -793,15 +916,19 @@ bool TEstrazione::export_error_list() return ok; } -TString TEstrazione::next_estr_today(char tipo) const +TString TEstrazione::next_estr_today(char tipo, const bool estr_int) const { char estr[] = { 0,0,0,0,0,0,0,0,0 }; TString query; - query << "SELECT TOP 1 SUBSTRING(" DRD_ID_EST ", 11, 8) AS IDESTR\n" - "FROM " F9_DRD "\n" - "WHERE " DRD_CODSOC " = '" << _head.cod_soc << "' AND\n" - DRD_ID_EST " LIKE '" << today.date2ansi() << "%'\n" - "ORDER BY IDESTR DESC"; + query << "SELECT TOP 1 SUBSTRING(" DRD_ID_EST ", 11, 8) AS IDESTR\n" + "FROM " F9_DRD "\n" + "WHERE " DRD_CODSOC " = '" << _head.cod_soc << "' AND\n"; + if (estr_int) + query << DRD_ID_EST " LIKE 'R" << today.date2ansi() << "%'\n"; + else + query << DRD_ID_EST " LIKE '" << today.date2ansi() << "%'\n"; + + query << "ORDER BY IDESTR DESC"; fp_db().sq_set_exec(query); const int last_estr = fp_db().sq_items() > 0 ? real(fp_db().sq_get("IDESTR")).integer() : -1; @@ -1046,9 +1173,6 @@ const char* TEstrazione::diagnostica_mov() if (mov_i.estratto()) { - if (mov_i.numreg() == 41400) { - int here = 0; - } if (mov_i.cartaceo()) { TFilename file; @@ -1083,6 +1207,126 @@ const char* TEstrazione::diagnostica_mov() return _head.stato_estr; } +const char* TEstrazione::diagnostica_mov_integrazione() +{ + bool ok = true; + const TipoIVA tipo = get_tipoiva(); + _stats.total = _movs.size(); + + TProgress_monitor bar(_movs.items(), "Controllo stato movimenti"); + FOR_EACH_ARRAY_ITEM(_movs, r, obj) + { + if (bar.add_status()) + { + TMovimento_estr & mov_i = (TMovimento_estr &)*obj; + + // Se gia' escluso passo avanti + + if (!mov_i.estratto() && mov_i.descr_estr() == mov_escluso) + continue; + + const long numreg = mov_i.numreg(); + const TRectype & mov = cache().get(LF_MOV, numreg); + TToken_string keys; + + if(tipo == iva_vendite) + keys = (mov.get(MOV_KEYPAF)); + else if (tipo == iva_acquisti) + keys = (mov.get(MOV_KEYFPPRO)); + + keys.separator(';'); + int i = keys.items(); + + if (keys.full() && (keys.items() == 3)) + { + if (check_keys(keys)) + { + ok &= true; + mov_i.set_estratto(true); + mov_i.set_state_int(guessed_int); + ++_stats.int_match; + continue; + } + else + { + ok &= false; + mov_i.set_state_int(int_with_err); + mov_i.reset_err(); + mov_i.set_err("Chiavi del documento ERRATE", mov_nomatch_keys); + ++_stats.int_nomatch; + continue; + } + } + + if (mov_i.no_err() && mov_i.estratto()) + { + + const long numreg = mov_i.numreg(); + const TRectype & mov = cache().get(LF_MOV, numreg); + + mov_i.set_cartaceo(!is_doc_xml(mov)); + + const state_estr_int res = guess_int(numreg); + + switch (res) + { + case guessed_int: + ok &= true; + mov_i.set_estratto(true); + ++_stats.int_match; + break; + case no_guessed_int: + ok &= false; + mov_i.reset_err(); + mov_i.set_err("Non è stato possibile trovare il documento elettronico da abbinare", mov_notfound_elet); + ++_stats.int_nomatch; + break; + case int_with_err: + ok &= false; + mov_i.set_estratto(false); + ++_stats.int_err; + break; + default: break; + } + + if (mov_i.state() == null_state) + mov_i.set_state_int(res); + + } + } + } + + _head.stato_estr = ok ? D_GEST_OK : D_GEST_ERR; + return _head.stato_estr; +} + +const bool TEstrazione::check_keys(TToken_string keys) +{ + bool res; + TString query; + + if (get_tipoiva() == iva_vendite) + { + query << "SELECT COUNT(PW_KEYBODYFATT) AS CONTA FROM PAFW300F WHERE PW_KEYPRGINVIO = '" << keys.get(0) + << "' AND PW_KEYHEADERFATT = '" << keys.get(1) << "' AND PW_KEYBODYFATT = '" << keys.get(2) << "'"; + } + else if (get_tipoiva() == iva_acquisti) + { + query << "SELECT COUNT(PZ_KEYBODYFATT) AS CONTA FROM FPPRO00F WHERE PZ_KEYPRGINVIO = '" << keys.get(0) + << "' AND PZ_KEYHEADERFATT = '" << keys.get(1) << "' AND PZ_KEYBODYFATT = '" << keys.get(2) << "'"; + } + + fp_db().sq_set_exec(query); + TString query_res = fp_db().sq_get("CONTA"); + + if (query_res == "1") + res = true; + else + res = false; + + return res; +} + result_estr TEstrazione::estrai() { // Se non c'e' nessun movimento non sto nemmeno a scrivere il record di estrazione. @@ -1357,6 +1601,267 @@ bool TEstrazione::estrazione_iva(bool escluso) return stato; } +result_estr TEstrazione::estrai_integrazioni() +{ + // Se non c'e' nessun movimento non sto nemmeno a scrivere il record di estrazione. + // Se estrazione definitiva controllo che il periodo non si sovrapponga alle altre estrazioni def. + // Do' errore ed esco subito. + result_estr res = estr_ok; + if (_movs.empty()) + { + warning_box("Non esistono movimenti estraibili per il periodo selezionato."); + return estr_stop; + } + if (!_escluso && !_head.flag_prov) + { + // Avviso nel caso in cui si stia facendo un'estrazione definitiva di un periodo di cui non si e' mai fatta + // una prova provvisoria. + if (!exist_prov()) + { + if (!noyes_box("Attenzione, non e' mai stata fatta alcuna\nestrazione provvisoria per questo periodo.\nContinuare comunque?")) + return estr_stop; + } + } + // Non so come usare questi 18 caratteri... + // Uso dati anche se gia' noti in altri campi (I know..) + un numero incrementale. + _head.id_estr.cut(0) << 'R' << today.date2ansi() << (_head.flag_prov ? "P" : "D") << next_estr_today(_head.tipo_doc, true); + _head.user = user(); + // Eseguo controllo sui movimenti e segno in testata lo stato + _head.stato_estr = IN_DIAGN; // "01" che verra' quasi subito rimpiazzato dal risultato della diagnostica. + if (_escluso) + set_dates(); // Se escluso imposto data inizio e fine uguali + + // Scrivo record estrazione (in stato '01': in diagnostica). + const bool ok = insert_into_drd(); + + if (!ok) + { + TString msg; + + msg << "Errore database: impossibile scrivere nuova estrazione.\n" + << fp_db().sq_get_text_error(false); + error_box(msg); + return estr_err_db_drd; + } + + // Faccio partire la diagnostica e mi salvo il nuovo stato. + diagnostica_mov_integrazione(); + + + //ARRIVATO QUI + insert_into_f9movestr(); + + if (_head.stato_estr == D_GEST_ERR) + { + warning_box("Attenzione l'estrazione ha prodotto degli errori.\n" + "Controllare e correggere eventuali problemi\ndal Controllo Estrazione."); + // Se in errore, esporto lista errori sul db + if (!export_error_list()) + warning_box("Errore scrittura db. Controllare log errori."); + res = estr_diag_err; // Errore diagnostica gestionale + } + + // Se va tutto ben fino a qui, posso andare a scrivere nella + // tabella IVA i movimenti. F9IVA + if (res == estr_ok) + { + res = estrazione_iva_int() ? estr_ok : estr_err_db_iva; + if (res == estr_err_db_iva) + _head.stato_estr = D_GEST_ERR; + } + update_drd_stato_estr(); + return res; +} + +bool TEstrazione::estrazione_iva_int(bool escluso) +{ + TString statopaiv, idfisc, paiv, codfis; + bool stato = true; + + TProgress_monitor bar(_movs.items(), "Estrazione dati IVA"); + + FOR_EACH_ARRAY_ITEM(_movs, r, obj) + { + TMovimento_estr & mov_i = (TMovimento_estr &)*obj; + + if (bar.add_status() && mov_i.estratto()) + { + const TRectype& mov = cache().get(LF_MOV, mov_i.numreg()); + TToken_string key = mov.get(MOV_TIPO); + + key.add(mov.get(MOV_CODCF)); + + const TRectype& cli = cache().get(LF_CLIFO, key); + const char tipodoc = _head.tipo_doc; + const TCausale & caus = cached_causale(mov.get(MOV_CODCAUS), mov.get_date(MOV_DATAREG).year()); + const TString& name_registro = caus.reg().name();; + fill_id(cli, statopaiv, idfisc, paiv, codfis); + TDate datadoc = mov.get_date(MOV_DATADOC); + TDate datareg = mov.get_date(MOV_DATAREG); + + TIva_insert_prepared_stat iva_query; /////////QUIIIIIII/// + + iva_query.add(IVA_CODSOC, _head.cod_soc, 10); + iva_query.add(IVA_IDLAN, _head.id_estr, 18); + iva_query.add(IVA_FLAG_PD, _head.flag_prov ? 'P' : 'D'); + iva_query.add(IVA_ANNOES, mov.get_int(MOV_ANNOES)); + iva_query.add(IVA_GIVA, tipodoc); + iva_query.add(IVA_TIPOG, name_registro, 10); + + long numdoc = mov.get_long(MOV_NUMDOC); + bool has_xml = !mov_i.err(); //si può fare un controllo migliore + iva_query.add(IVA_DOCXML, has_xml ? 'S' : 'N'); + + iva_query.add(IVA_TIPOCF, mov.get_char(MOV_TIPO)); + iva_query.add(IVA_CODCF, mov.get_long(MOV_CODCF)); + iva_query.add(IVA_NUMOR, mov.get_long(MOV_NUMREG)); + + iva_query.add(IVA_RAGSOC, cli.get(CLI_RAGSOC), 60); + iva_query.add(IVA_IDFISC, idfisc, 30); + iva_query.add(IVA_PIVA, paiv, 28); + iva_query.add(IVA_CODFIS, codfis, 16); + iva_query.add(IVA_CATDOC, mov_i.catdoc(categorie_doc())->catdoc(), 10); + + const TRegistro& reg = cached_registro(mov.get(MOV_REG), mov.get_int(MOV_ANNOIVA)); + + if (reg.iva() == iva_vendite) + { + + int anno = mov.get_int(MOV_DANNO); + TString tipodocsdi; + + if (anno > 0) + { + const char provv = mov.get(MOV_DPROVV)[0]; + const TString& codnum = mov.get(MOV_DCODNUM); + const long ndoc = mov.get_long(MOV_DNDOC); + + TDocumento doc(provv, anno, codnum, ndoc); + iva_query.add(IVA_CAUSSOS, tipo_doc_sdi(doc), 6); + } + else + tipodocsdi = caus.tipodocsdi(); + if (tipodocsdi.blank()) + tipodocsdi = mov_i.catdoc(categorie_doc())->caus_sost(); + + if (tipodocsdi.full()) + iva_query.add(IVA_CAUSSOS, tipodocsdi, 6); + } + else + { + TToken_string key(mov.get((MOV_KEYFPPRO)), ';'); + + if (key.full()) + { + TFppro fppro(key); + const TString& tipodoc = fppro.get_tipodoc(); + + if (tipodoc.full()) + iva_query.add(IVA_CAUSSOS, tipodoc, 6); + else + iva_query.add(IVA_CAUSSOS, mov_i.catdoc(categorie_doc())->caus_sost(), 6); + } + else + iva_query.add(IVA_CAUSSOS, mov_i.catdoc(categorie_doc())->caus_sost(), 6); + } + iva_query.add(IVA_NUMDOC, mov_i.numdoc(), 20); + iva_query.add(IVA_DATADOC, datadoc); + iva_query.add(IVA_SEZIVA, mov.get(MOV_REG), 10); + iva_query.add(IVA_TIPOREG, "", 6); + iva_query.add(IVA_NPROT, mov.get(MOV_PROTIVA), 20); + iva_query.add(IVA_DATPROT, datareg); + + + iva_query.add(IVA_CLASDOC, mov_i.catdoc(categorie_doc())->class_sost(), 10); + iva_query.add(IVA_NOMFD, mov_i.nomefiledoc().name(), 100); + + // Load annessi DA TESTARE... + if (mov_i.allegati()) + { + TString_array & docs = mov_i.documenti_allegati(); + int i = 0; + const int size = docs.items(); + + iva_query.add(IVA_CLASAN1, docs.row(i).get(2), 10); + iva_query.add(IVA_NOMF1, docs.row(i++).get(0), 100); + // HOW DID MY LIFE COME TO THIS?... + if (size > i) + { + iva_query.add(IVA_CLASAN2, docs.row(i).get(2), 10); + iva_query.add(IVA_NOMF2, docs.row(i++).get(0), 100); + } + if (size > i) + { + iva_query.add(IVA_CLASAN3, docs.row(i).get(2), 10); + iva_query.add(IVA_NOMF3, docs.row(i++).get(0), 100); + } + if (size > i) + { + iva_query.add(IVA_CLASAN4, docs.row(i).get(2), 10); + iva_query.add(IVA_NOMF4, docs.row(i++).get(0), 100); + } + if (size > i) + { + iva_query.add(IVA_CLASAN5, docs.row(i).get(2), 10); + iva_query.add(IVA_NOMF5, docs.row(i++).get(0), 100); + } + if (size > i) + { + iva_query.add(IVA_CLASAN6, docs.row(i).get(2), 10); + iva_query.add(IVA_NOMF6, docs.row(i++).get(0), 100); + } + if (size > i) + { + iva_query.add(IVA_CLASAN7, docs.row(i).get(2), 10); + iva_query.add(IVA_NOMF7, docs.row(i++).get(0), 100); + } + if (size > i) + { + iva_query.add(IVA_CLASAN8, docs.row(i).get(2), 10); + iva_query.add(IVA_NOMF8, docs.row(i++), 100); + } + if (size > i) + { + iva_query.add(IVA_CLASAN9, docs.row(i).get(2), 10); + iva_query.add(IVA_NOMF9, docs.row(i++).get(0), 100); + } + } + + iva_query.add(IVA_USERELA, user(), 10); + iva_query.add_getdate(IVA_TIMEELA); + + /* DA VEDERE + if (_head.tipo_doc == 'A' && !mov_i.cartaceo()) + { + TToken_string keys(mov.get(MOV_KEYFPPRO), ';'); + fppro_db().set_keys(keys); + iva_query.add(IVA_TIPPROT, fppro_db().get_tipoprot(), 2); + iva_query.add(IVA_ANNPROT, TVariant(fppro_db().get_annoprot()).as_int()); + iva_query.add(IVA_NUMPROT, fppro_db().get_numprot(), 10); // Non controllo che sia in realta' un numero... + iva_query.add(IVA_TIMERIC, TDate(fppro_db().get_dataoraric())); + } + */ + + TString sql; + + //DA MIGLIORARE IL LOG DI ERRORE + long a = mov_i.numreg(); + + bool ok = iva_query.get(sql); + + if (ok) + ok = fp_db().sq_set_exec(sql); + if (ok) + ok = fp_db().sq_commit(); + if (!ok) + write_errorsql_log(sql); + + stato &= ok; + } + } + return stato; +} + bool TEstrazione::exist_prov() const { TString query; query << "SELECT * FROM " F9_DRD "\n" << diff --git a/src/fp/fplib01.cpp b/src/fp/fplib01.cpp index 70b79be36..37615723b 100644 --- a/src/fp/fplib01.cpp +++ b/src/fp/fplib01.cpp @@ -2921,15 +2921,14 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc) if (!data_scad.empty()) { paf2500f.set("PO_DATASCADENZA", data_scad); // Data scadenza - paf2500f.set("PO_DTLIMANTIC", data_scad); - paf2500f.set("PO_DATADECORRP", data_scad); + //paf2500f.set("PO_DTLIMANTIC", data_scad); + //paf2500f.set("PO_DATADECORRP", data_scad); } TDate decorenza_pagamento = doc.get_date(DOC_DATAINSC); - if (decorenza_pagamento.empty()) - decorenza_pagamento = doc.data(); - - paf2500f.set("PO_DATARIFTERM", decorenza_pagamento); + if (!decorenza_pagamento.empty()) + paf2500f.set("PO_DATARIFTERM", decorenza_pagamento); + paf2500f.set("PO_IMPORTO", value2string(riga_scadenze.get_real())); // valore, false)); // Importo rata paf2500f.set("PO_GESTIONE", stato_paf()); ok &= insert(paf2500f); diff --git a/src/fp/fpmenu.men b/src/fp/fpmenu.men index 06c4672d7..53a5af860 100644 --- a/src/fp/fpmenu.men +++ b/src/fp/fpmenu.men @@ -33,8 +33,9 @@ Picture = Module = f9 Flags = "" Item_01 = "Estrazioni", "f90 -0", "" -Item_02 = "Categorie documentali", "f90 -1", "" -Item_03 = "Gestione file doc. cartacei", "f90 -2", "" -Item_04 = "Ripristino estrazioni", "f90 -4", "" +Item_02 = "Archiviazione integrazioni", "f90 -5", "" +Item_03 = "Categorie documentali", "f90 -1", "" +Item_04 = "Gestione file doc. cartacei", "f90 -2", "" +Item_05 = "Ripristino estrazioni", "f90 -4", "" diff --git a/src/include/mov.h b/src/include/mov.h index c34639e06..b14f2cb7f 100755 --- a/src/include/mov.h +++ b/src/include/mov.h @@ -65,6 +65,7 @@ #define MOV_DATADOCSDI "DATADOCSDI" #define MOV_COLL_GOLEM "COLL_GOLEM" #define MOV_CARTACEI "CARTACEI" +#define MOV_KEYPAF "KEYPAF" #define NUMREG_PROVVISORIO 999999L