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/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/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/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