Merge remote-tracking branch 'origin/R_10_00' into R_10_00

This commit is contained in:
Mattia Tollari 2019-08-02 11:12:35 +02:00
commit ca14aa4b8f
10 changed files with 715 additions and 483 deletions

View File

@ -159,9 +159,13 @@
<ProjectReference Include="AgaLib.vcxproj">
<Project>{2d38a763-3d74-4338-9362-b891784ec90e}</Project>
</ProjectReference>
<ProjectReference Include="fplib.vcxproj">
<Project>{c575788b-0be4-4f68-b9c9-3c204ec04e07}</Project>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\src\f1\f1lib.cpp" />
<ClCompile Include="..\src\fp\fplib01.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\src\f1\f1lib.h" />

View File

@ -12,6 +12,9 @@
<ClCompile Include="..\src\f1\f1lib.cpp">
<Filter>Sources</Filter>
</ClCompile>
<ClCompile Include="..\src\fp\fplib01.cpp">
<Filter>Sources</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\src\f1\f1lib.h">

View File

@ -186,12 +186,10 @@
<ItemGroup>
<ClCompile Include="..\src\f9\f90.cpp" />
<ClCompile Include="..\src\f9\f90100.cpp" />
<ClCompile Include="..\src\f9\f90101.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\src\f9\f90.h" />
<ClInclude Include="..\src\f9\f90100a.h" />
<ClInclude Include="..\src\f9\f90101.h" />
<ClInclude Include="..\src\f9\f901tab.h" />
</ItemGroup>
<ItemGroup>

View File

@ -27,9 +27,6 @@
<ClInclude Include="..\src\f9\f90100a.h">
<Filter>Headers</Filter>
</ClInclude>
<ClInclude Include="..\src\f9\f90101.h">
<Filter>Headers</Filter>
</ClInclude>
<ClInclude Include="..\src\f9\f901tab.h">
<Filter>Headers</Filter>
</ClInclude>
@ -41,9 +38,6 @@
<ClCompile Include="..\src\f9\f90100.cpp">
<Filter>Sources</Filter>
</ClCompile>
<ClCompile Include="..\src\f9\f90101.cpp">
<Filter>Sources</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<MskCompiler Include="..\src\f9\f90100a.uml">

View File

@ -27,6 +27,7 @@ bool TFppro::check_reg(TToken_string& keys, int numreg)
return get_numreg(keys) == numreg;
}
// todo: da mettere apposto fa ancora schifo
bool TFppro::guess_the_doc(const TLocalisamfile& mov)
{
// Controllo datadoc - numdoc - totdoc - p.iva
@ -35,40 +36,46 @@ bool TFppro::guess_the_doc(const TLocalisamfile& mov)
"\tP7_NUMERO AS NUMDOC, PQ_IMPTOTDOC AS IMPTOTDOC, P2_FISCIVAPAESE AS STATOPIVA, P2_FISCIVACOD AS PIVA FROM PAA2700F\n" <<
"JOIN PAA0700F ON PQ_KEYPRGINVIO = P7_KEYPRGINVIO AND PQ_KEYHEADERFATT = P7_KEYHEADERFATT AND PQ_KEYBODYFATT = P7_KEYBODYFATT\n" <<
"JOIN PAA0200F ON PQ_KEYPRGINVIO = P2_KEYPRGINVIO AND PQ_KEYHEADERFATT = P2_KEYHEADERFATT AND PQ_KEYBODYFATT = P2_KEYBODYFATT\n";
_db->sq_set_exec(query);
_db->sq_set_exec(query, false);
const keys_s keys = { _db->sq_get("KEYPRGINVIO"), _db->sq_get("KEYHEADERFATT"), _db->sq_get("KEYBODYFATT") };
const TDate data = _db->sq_get_date("DATA");
const TString numdoc = _db->sq_get("NUMDOC");
const real imptotdoc(_db->sq_get("IMPTOTDOC"));
const TString4 statopiva = _db->sq_get("STATOPIVA");
const TString piva = _db->sq_get("PIVA");
// Prendo il fornitore del mov per controllare la p.iva
TLocalisamfile clifo(LF_CLIFO);
clifo.put(CLI_TIPOCF, "F");
const TString& codforn = mov.get(MOV_CODCF);
clifo.put(CLI_CODCF, codforn);
clifo.read();
TString cli_statopiva, cli_piva;
cli_statopiva << clifo.get(CLI_STATOPAIV);
cli_piva << clifo.get(CLI_PAIV);
bool ok = data == mov.get_date(MOV_DATAREG);
ok &= numdoc == mov.get(MOV_NUMDOC) || numdoc == mov.get(MOV_NUMDOCEXT);
ok &= imptotdoc == real(mov.get(MOV_TOTDOC));
ok &= cli_statopiva.full() && statopiva == cli_statopiva && piva == cli_piva || !cli_statopiva.full() && piva == cli_piva;
if (ok)
for(bool f = _db->sq_next(); f; f = _db->sq_next())
{
_keys = keys;
const keys_s keys = { _db->sq_get("KEYPRGINVIO"), _db->sq_get("KEYHEADERFATT"), _db->sq_get("KEYBODYFATT") };
const TDate data = _db->sq_get_date("DATA");
const TString numdoc = _db->sq_get("NUMDOC");
const real imptotdoc(_db->sq_get("IMPTOTDOC"));
const TString4 statopiva = _db->sq_get("STATOPIVA");
const TString piva = _db->sq_get("PIVA");
// Prendo il fornitore del mov per controllare la p.iva
TLocalisamfile clifo(LF_CLIFO);
clifo.put(CLI_TIPOCF, "F");
const TString& codforn = mov.get(MOV_CODCF);
clifo.put(CLI_CODCF, codforn);
clifo.read();
TString cli_statopiva, cli_piva;
cli_statopiva << clifo.get(CLI_STATOPAIV);
cli_piva << clifo.get(CLI_PAIV);
bool ok = data == mov.get_date(MOV_DATAREG);
ok = ok && numdoc == mov.get(MOV_NUMDOC) || numdoc == mov.get(MOV_NUMDOCEXT);
ok = ok && imptotdoc == real(mov.get(MOV_TOTDOC));
ok = ok && cli_statopiva.full() && statopiva == cli_statopiva && piva == cli_piva || !cli_statopiva.full() && piva == cli_piva;
if (ok)
{
_keys = keys;
return true;
}
}
return ok;
return false;
}
void TFppro::get_keys_fppro()
const char* TFppro::get_keys_fppro() const
{
static TString keys;
keys.cut(0) << _keys.prginvio << ";" << _keys.headerfatt << ";" << _keys.bodyfatt;
return (const char*)keys;
}
int TFppro::get_numreg()
@ -154,6 +161,31 @@ TFppro& TFppro::set_keys(keys_s keys)
return *this;
}
bool TFppro::associa_mov(const int numreg) const
{
bool ok = false;
TLocalisamfile mov(LF_MOV);
mov.put(MOV_NUMREG, numreg);
if ((ok = mov.read() == NOERR))
{
mov.put(MOV_KEYFPPRO, get_keys_fppro());
if ((ok = mov.rewrite() == NOERR)) // Scrivo sul movimento il riferimento al fppro
{
TString query;
query << "UPDATE FPPRO00F \nSET " <<
"PZ_TIPOCF = 'F', PZ_CLIFOR = '" << mov.get(MOV_CODCF) << "', PZ_NUMREGCONT = '" <<
mov.get(MOV_NUMREG) << "', PZ_DATAREGCONT = '" << mov.get_date(MOV_DATAREG).date2ansi() << "'\n" <<
fppro_db().where_str() << ";";
if (!((ok = _db->sq_set_exec(query) && _db->sq_commit()))) // Se la scrittura sul db fallisce levo sul movimento il riferimento all'fppro
{
mov.put(MOV_KEYFPPRO, "");
mov.rewrite();
}
}
}
return ok;
}
TDate TFppro::get_data_first_doc() const
{
TString query;
@ -401,38 +433,4 @@ bool TF1_log::show_log()
_log = NULL;
}
return true;
}
bool TFppro::set_connection(SSimple_query& s)
{
bool ok = true;
#ifdef DBG
TString ip = fp_settings().get_db_indirizzo();
if (ip.upper() != "TESTCAMPO2012")
{
if (s.sq_connect("TESTCAMPO2012@campo_fp",
"fp",
"fp",
TSDB_MSSQL) != NOERR)
{
warning_box("Impossibile connettersi al DB esterno");
ok = false;
}
}
else
{
#endif
if (s.sq_connect(
fp_settings().get_db_str_con(),
fp_settings().get_db_user(),
fp_settings().get_db_password(),
TSDB_MSSQL) != NOERR)
{
warning_box("Impossibile connettersi al DB esterno");
ok = false;
}
#ifdef DBG
}
#endif
return ok;
}

View File

@ -28,9 +28,9 @@ class TFppro : public TObject
{
struct keys_s
{
const char* prginvio;
const char* headerfatt;
const char* bodyfatt;
TString prginvio;
TString headerfatt;
TString bodyfatt;
};
private:
SSimple_query* _db;
@ -47,23 +47,22 @@ public:
// Se un mov. registrato non e' collegato all'FPPRO cerco di capire qual'e`
bool guess_the_doc(const TLocalisamfile& mov);
// Getters
void get_keys_fppro();
int get_numreg();
int get_numreg(TToken_string& keys);
const char* get_keys_fppro() const;
int get_numreg();
int get_numreg(TToken_string& keys);
TString get_codforn() const;
TDate get_datareg();
TDate get_datareg(TToken_string& keys);
real get_ritenute() const;
TDate get_data_first_doc() const;
TDate get_dataorarioric() const;
int get_numregcont() const;
TDate get_datareg();
TDate get_datareg(TToken_string& keys);
real get_ritenute() const;
TDate get_data_first_doc() const;
TDate get_dataorarioric() const;
int get_numregcont() const;
// Setters
bool set_query();
TFppro& set_keys(TToken_string& keys);
TFppro& set_keys(keys_s keys);
static bool set_connection(SSimple_query& s);
bool associa_mov(int numreg) const;
TFppro();
TFppro(TToken_string& keys) : TFppro() { set_keys(keys); }

View File

@ -6,41 +6,345 @@
#include "mov.h"
#include "f1lib.h"
#include "../fp/fplib.h"
#include "urldefid.h"
#include "f90100.h"
#include "progind.h"
enum state_fppro
SSimple_query& db()
{
correct = 1,
reg_with_err = -1,
not_fa = -10,
guessed = 100,
no_guessed = 0
};
static SSimple_query* db = nullptr;
if (db == nullptr)
{
db = new SSimple_query();
set_connection(*db);
}
return *db;
}
class TMonitor_mask : public TAutomask
////////////////////////////////////////////////////////
// TEstrai_mask
////////////////////////////////////////////////////////
TEstrai_mask::TEstrai_mask() : TMask("Estrazione", 1, 60, 10), _dirty(true)
{
bool _dirty;
state_fppro check_fppro(int numreg) const;
add_button_tool(DLG_ELABORA, "Estrai", TOOL_ELABORA);
//add_button_tool(DLG_FINDREC, "Diagnostica", TOOL_PERMISSIONS);
//add_button_tool(DLG_NULL, "", 0);
//add_button_tool(DLG_EDIT, "Reset", TOOL_EDIT);
add_button_tool(DLG_NULL, "", 0);
add_button_tool(DLG_QUIT, "Esci", TOOL_QUIT);
protected:
void sel_all();
bool diagnosticazzi();
bool estrai();
void load_packs();
bool on_field_event(TOperable_field& o, TField_event e, long jolly) override;
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, 3, "");
add_list(ES_TIPODOC, 0, "Tipi documento", 33, 4, 1, "", "A|V|C", "Acquisti|Vendite|Corrispettivi");
public:
void fill();
void save_all();
void next_page(int p) override;
TMask::set_handler(DLG_ELABORA, estrai_handler);
//TMask::set_handler(DLG_FINDREC, diagnostica_handler);
//TMask::set_handler(DLG_EDIT, enable_handler);
TMask::set_handler(ES_DATAINI, dataini_handler);
TMask::set_handler(ES_DATAEND, dataend_handler);
TMonitor_mask() : TAutomask("f90100a") {}
};
//TMask::enable(DLG_ELABORA, false);
//TMask::enable(DLG_EDIT, false);
state_fppro TMonitor_mask::check_fppro(int numreg) const
TDate dt(TODAY); dt.set_day(1); dt.set_month(1);
#ifdef DBG
dt.set_year(2017);
#endif
set(ES_DATAINI, dt);
set(ES_DATAEND, TDate(TODAY));
}
bool TEstrai_mask::estrai_handler(TMask_field& f, unsigned short key)
{
auto& msk = (TEstrai_mask&)f.mask(); // this
descr_msk().run();
msk._descr.cut(0) << descr_msk().get(DES_TEXT);
app().estrai();
return true;
}
void TEstrai_mask::enable_fields(bool en)
{
enable(ES_DATAINI, en);
enable(ES_DATAEND, en);
enable(ES_FLAGPROV, en);
enable(ES_TIPODOC, en);
//enable(DLG_ELABORA, !en);
//enable(DLG_FINDREC, en);
//enable(DLG_EDIT, !en);
}
bool TEstrai_mask::enable_handler(TMask_field& f, unsigned short key)
{
((TEstrai_mask&)f.mask()).enable_fields();
return true;
}
bool TEstrai_mask::dataini_handler(TMask_field& f, unsigned short key)
{
TMask& msk = f.mask();
if (key == K_TAB)
{
if(msk.get(ES_DATAINI).full() && msk.get(ES_DATAEND).full() && msk.get_date(ES_DATAINI) > msk.get_date(ES_DATAEND))
return f.error_box("La data di inizio non puo' essere maggiore di quella di fine");
}
//msk.enable(DLG_ELABORA, false);
return true;
}
bool TEstrai_mask::dataend_handler(TMask_field& f, unsigned short key)
{
TMask& msk = f.mask();
if (key == K_TAB)
{
if (msk.get(ES_DATAINI).full() && msk.get(ES_DATAEND).full() && msk.get_date(ES_DATAINI) > msk.get_date(ES_DATAEND))
return f.error_box("La data di fine non puo' essere minore di quella di inizio");
}
//msk.enable(DLG_ELABORA, false);
return true;
}
TMask& TEstrai_mask::descr_msk()
{
static TMask* m = nullptr;
if(m == nullptr)
{
m = new TMask("Estrazione", 1, 60, 5);
m->add_button_tool(DLG_OK, "Conferma", TOOL_OK);
m->add_groupbox(DES_GROUP, 0, "Inserire descrizione estrazione:", 1, 0, 59, 3, "");
m->add_string(DES_TEXT, 0, "Descrizione", 4, 1, 250, "", 40);
}
return *m;
}
////////////////////////////////////////////////////////
// TMonitor_mask
////////////////////////////////////////////////////////
bool TMonitor_mask::save_conf_handler(TMask_field& f, unsigned short key)
{
TMask& m = f.mask();
TF9_app& a = app();
a.set_ambiente(m.get(CF_CODSOC));
a.set_addr_doc(m.get(CF_ADDRDOC));
if(a.get_ambiente().full())
ini_set_string(CONFIG_DITTA, "F9", AMBIENTE_F9, a.get_ambiente());
if(a.get_addr_doc().full())
ini_set_string(CONFIG_DITTA, "F9", ADDRCART_F9, a.get_addr_doc());
m.close();
a.edit_wa();
return true;
}
void TMonitor_mask::controllo_errori()
{
}
bool TMonitor_mask::on_key(const KEY key)
{
return true;
}
void TMonitor_mask::open_win_estr()
{
if (!app().get_ambiente().full())
warning_box("Inserire codice ambiente societa' in configurazione");
else app().run_estr_msk();
}
void TMonitor_mask::open_win_conf() const
{
static TMask* m = nullptr;
if (m == nullptr)
{
m = new TMask("Configurazione Archiviazione Sostitutiva", 1, 60, 10);
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, 59, 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, 59, 3, "");
m->add_string(CF_ADDRDOC, 0, "Percorso", 2, 4, 256, "", 40);
m->set_handler(DLG_OK, save_conf_handler);
m->set(CF_CODSOC, ini_get_string(CONFIG_DITTA, PAR_MOD, AMBIENTE_F9));
m->set(CF_ADDRDOC, ini_get_string(CONFIG_DITTA, PAR_MOD, ADDRCART_F9));
}
m->run();
}
bool TMonitor_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
switch (o.dlg())
{
case DLG_ALL:
if(e == fe_button && curr_page() == 1)
//sel_all();
break;
case DLG_ELABORA:
if (e == fe_button)
open_win_estr();
break;
case DLG_CONFIG:
if (e == fe_button)
open_win_conf();
break;
case DLG_FINDREC:
if (e == fe_button)
controllo_errori();
default: break;
}
return true;
}
////////////////////////////////////////////////////////
// TF9_app
////////////////////////////////////////////////////////
void TF9_app::edit_wa() const
{
TString query;
query << "DELETE FROM F9WA00K WHERE true;" <<
"INSERT INTO F9WA00K (F9PCSOC, F9PPCDC0) VALUES (" << _ambiente << ", " << _addr_doc << ");";
}
void TF9_app::load()
{
const TDate dataini = get_dataini();
const TDate dataend = get_dataend();
const char tipodoc = get_tipodoc();
const bool flagpro = is_provviso();
TLocalisamfile mov(LF_MOV);
mov.setkey(2);
mov.put(MOV_DATAREG, dataini);
int items = 0;
for (bool ok = mov.read(); ok && mov.get_date(MOV_DATAREG) <= dataend; ok = mov.next() == NOERR)
items++;
TProgress_monitor progr(items, "Acquisizione movimenti");
int i = 0;
mov.zero();
mov.setkey(2);
mov.put(MOV_DATAREG, dataini);
// Prendo tutti i movimenti a partire da una data e li carico tutti fino alla data finale
for (bool ok = mov.read(); ok && mov.get_date(MOV_DATAREG) <= dataend; ok = mov.next() == NOERR)
{
if (!progr.add_status())
break;
const TipoIVA tipo = tipodoc == 'V' ? iva_vendite : iva_acquisti;
// Se definitivo controllo il flag di stampato REGST
if (mov.get_bool(MOV_REGST) != flagpro && mov.get(MOV_NUMDOC).full() && TCausale(mov.get(MOV_CODCAUS)).reg().iva() == tipo)
{
TToken_string t("", '|');
t.add("");
t.add(mov.get(MOV_NUMREG));
t.add(mov.get(MOV_DATAREG));
t.add(mov.get(MOV_DATADOC));
t.add(mov.get(MOV_CODCAUS));
t.add(mov.get(MOV_MESELIQ));
t.add(mov.get(MOV_NUMDOC));
t.add(mov.get(MOV_PROTIVA));
t.add(mov.get(MOV_DESCR));
_movs.insert(_movs.end(), t);
i++;
}
}
_tot_movs = i;
}
const char* TF9_app::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"; // Deprecated
else if (cod == "02")
stato << "err. diagnostica";
else if (cod == "03")
stato << "diagnostica ok";
else if (cod == "04")
stato << "controllo WA";
else if (cod == "05")
stato << "err. diagn. WA";
else if (cod == "06")
stato << "diagn. WA OK";
else if (cod == "07")
stato << "in elab. sost.";
else if (cod == "08")
stato << "err. diag. sost.";
else if (cod == "09")
stato << "Archiviato";
}
return (const char*)stato;
}
void TF9_app::fill()
{
_ambiente = ini_get_string(CONFIG_DITTA, PAR_MOD, AMBIENTE_F9);
_addr_doc = ini_get_string(CONFIG_DITTA, PAR_MOD, ADDRCART_F9);
TString query;
query << "SELECT * FROM F9DRD00K ORDER BY " << DRD_TIME << ";";
db().sq_set_exec(query, false);
TSheet_field& sf = _msk->sfield(S_ELAB);
sf.hide();
int i = 0;
for(bool ok = db().sq_next(); ok; ok = db().sq_next())
{
TString tipo;
TToken_string& row = sf.row(i++);
row.add(db().sq_get(DRD_STATO) == "09" ? "X" : "");
row.add(db().sq_get(DRD_ID_EST));
row.add(db().sq_get_date(DRD_TIME));
row.add(db().sq_get(DRD_FLAG_PD) == "P" ? "X" : "");
tipo << db().sq_get(DRD_TIPODOC);
if(tipo == "A") tipo << "cquisti";
if(tipo == "V") tipo << "endite";
if(tipo == "C") tipo << "orrispettivi";
row.add(tipo);
row.add(db().sq_get_date(DRD_DATADA));
row.add(db().sq_get_date(DRD_DATAA));
row.add(db().sq_get(DRD_UTENTE));
row.add(traduci_stato(db().sq_get(DRD_STATO)));
row.add(db().sq_get(DRD_DESC));
if(TDate(row.get(cid2index(F_DATAESTR))) == TDate(TODAY))
{
if (TString(row.get(cid2index(F_PROV_B))) == "X")
_last_estr_p = real(TString(row.get(cid2index(F_IDESTR))).ltrim(9)).integer();
else
_last_estr_d = real(TString(row.get(cid2index(F_IDESTR))).ltrim(9)).integer();
}
}
sf.force_update();
sf.show();
}
state_fppro TF9_app::check_fppro(int numreg) const
{
TLocalisamfile mov(LF_MOV);
mov.put(MOV_NUMREG, numreg);
if (mov.read() && check_causale(mov.get(MOV_CODCAUS))) // Controllo subito la causale se no non mi interessa
if (mov.read() == NOERR && check_causale(mov.get(MOV_CODCAUS)))
{
// Controllo se ho i riferimenti all'FPPRO e verifico che sia tutto ok
const TString& keys_fppro = mov.get(MOV_KEYFPPRO);
@ -61,224 +365,163 @@ state_fppro TMonitor_mask::check_fppro(int numreg) const
return not_fa;
}
void TMonitor_mask::sel_all()
// Controlla lo stato delle fatture e per le fatt. acquisto non collegate a fppro cerca di agganciarle
const char * TF9_app::check_stato(TipoIVA tipo)
{
TSheet_field& sf = sfield(S_MOVS);
const char s = sf.row(0).starts_with("X") ? ' ' : 'X';
sf.hide();
FOR_EACH_SHEET_ROW(sf, n, row)
row->add(s, 0);
sf.force_update();
sf.show();
}
bool ok = true;
bool TMonitor_mask::diagnosticazzi()
{
return false;
}
bool TMonitor_mask::estrai()
{
return false;
}
void TMonitor_mask::load_packs()
{
TSheet_field& sf = sfield(S_ELAB);
const TDate from(TFppro::get_data_first_doc());
const TDate to(TODAY);
TLocalisamfile mov(LF_MOV);
mov.setkey(2);
mov.put(MOV_DATAREG, from);
struct movs_s
if (tipo == iva_acquisti)
{
int n_docs{};
TDate first_doc;
TDate last_doc;
};
std::map<TDate, movs_s> elabs;
for(bool ok = mov.read(); ok && mov.get_date(MOV_DATAREG) <= to; ok = mov.next() == NOERR)
{
TDate last_dt_doc;
TDate last_dt_el;
TDate data_el = mov.get_date(MOV_DATAELABF9);
if(data_el.ok())
TProgress_monitor bar(_movs.size(), "Controllo stato movimenti di acquisto");
// Controlli per le fatture di acquisto
for (auto it = _movs.begin(); it != _movs.end(); ++it)
{
auto it = elabs.find(data_el);
if (it != elabs.end())
if (!bar.add_status())
break;
TToken_string& row = *it;
const int numreg = row.get_int(cid2index(F_NUMREG));
switch (app().check_fppro(numreg))
{
elabs[data_el].n_docs++;
last_dt_el = data_el;
last_dt_doc = mov.get_date(MOV_DATAREG);
}
else
{
if (!elabs.empty())
elabs[last_dt_el].last_doc = last_dt_doc;
elabs.insert({ data_el, {1, mov.get_date(MOV_DATAREG), TDate()} });
case guessed:
ok &= fppro_db().associa_mov(numreg);
//row.add(fppro_db().get_keys_fppro());
case correct:
ok &= true;
break;
case not_fa:
case reg_with_err:
case no_guessed:
ok &= false;
row.add("X", 0); // Mi segno il movimento che ha un problema
default: break;
}
}
}
for (auto it = elabs.begin(); it != elabs.end(); ++it)
{
TToken_string& row = sf.row(-1);
row.add(it->first, 1);
row.add(it->second.n_docs);
row.add(it->second.first_doc);
row.add(it->second.last_doc);
}
}
void TMonitor_mask::fill()
{
const TDate dataini = get_date(F_DATAINI);
const TDate dataend = get_date(F_DATAEND);
TSheet_field& sf = sfield(S_MOVS);
TLocalisamfile mov(LF_MOV);
sf.hide();
sf.reset();
mov.setkey(2);
mov.put(MOV_DATAREG, dataini);
int i = 0;
for(bool ok = mov.read(); ok && mov.get_date(MOV_DATAREG) <= dataend; ok = mov.next() == NOERR)
{
if(mov.get_bool(MOV_REGST) && mov.get(MOV_NUMDOC).full())
else if (tipo == iva_vendite) {
for (auto it = _movs.begin(); it != _movs.end(); ++it)
{
TToken_string& row = sf.row(-1);
row.add("");
row.add(mov.get(MOV_NUMREG));
row.add(mov.get(MOV_DATAREG));
row.add(mov.get(MOV_DATADOC));
row.add(mov.get(MOV_CODCAUS));
row.add(mov.get(MOV_MESELIQ));
row.add(mov.get(MOV_NUMDOC));
row.add(mov.get(MOV_PROTIVA));
row.add(mov.get(MOV_DESCR));
i++;
// Controlli per le fatture di vendita
}
}
sf.force_update();
sf.show();
set(F_TOTMOV, i);
sel_all();
return ok ? D_GEST_OK : D_GEST_ERR;
}
void TMonitor_mask::save_all()
TString TF9_app::next_estr_today(const char tipo) const
{
char estr[] = {0,0,0,0,0,0,0,0,0,0};
if(tipo == 'P')
sprintf_s(estr, 10, "%09d", _last_estr_p + 1);
else
sprintf_s(estr, 10, "%09d", _last_estr_d + 1);
return estr;
}
void TMonitor_mask::next_page(int p)
bool TF9_app::check_periodo_def(const drd& head)
{
if (_dirty && p != 1000)
TString query;
// Controllo se ci sono estrazioni (definitive) che si sovrappongono di periodo (con lo stesso tipo) e che non siano in stato di errore
// Nel caso di stato di errore e' invece possibile la ri-estrazione
query << "SELECT *\nFROM F9DRD00K\n" <<
"WHERE '" << head.dal.date2ansi() << "' =< " << DRD_DATAA << " AND '" << head.al.date2ansi() << "' >= " << DRD_DATADA << " AND " <<
DRD_FLAG_PD << " = 'D' AND\n F9RIDAS <> '02' AND F9RIDAS <> '05' AND F9RIDAS <> '08' AND " << DRD_TIPODOC << " = '" << head.tipo_doc << "';";
db().sq_set_exec(query);
return db().sq_items() == 0;
}
bool TF9_app::esporta()
{
const bool ok = new_extr();
fill();
return ok;
}
TString& TF9_app::drd_attr()
{
static TString attr;
attr.cut(0) << DRD_CODSOC << ", " << DRD_ID_EST << ", " << DRD_FLAG_PD << ", " << DRD_DESC <<
", " << DRD_TIPODOC << ", " << DRD_DATADA << ", " << DRD_DATAA << ", " << DRD_UTENTE << ", " << DRD_TIME << ", " <<
DRD_STATO << ", " << DRD_PERC;
return attr;
}
TString& TF9_app::drd_tovalues() const
{
static TString str;
return str.cut(0) << "'" << _head.cod_soc << "', '" << _head.id_estr << "', '" << (_head.flag_prov ? "P" : "D") << "', '" << _head.descr <<
"', '" << _head.tipo_doc << "', '" << _head.dal.date2ansi() << "', '" << _head.al.date2ansi() << "', '" << _head.user << "', CURRENT_TIMESTAMP, '" <<
_head.stato_estr << "', '" << _head.addr_cart << "'";
}
auto TF9_app::new_extr() -> bool
{
TString query;
query << "INSERT INTO " << F9_DRD << " ( " << drd_attr() << " ) \nVALUES ( " << drd_tovalues() << " );";
bool ok = db().sq_set_exec(query);
ok = ok && db().sq_commit();
return ok;
}
int TF9_app::estrai()
{
// Acquisisco i movimenti
load();
if (_movs.empty())
{
fill();
_dirty = false;
warning_box("Non esistono movimenti estraibili per il periodo selezionato.");
return -1;
}
TAutomask::next_page(p);
}
bool TMonitor_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
switch (o.dlg())
const char tipo = _estr_msk->get(ES_FLAGPROV)[0];
_head.flag_prov = is_provviso();
_head.dal = get_dataini();
_head.al = get_dataend();
_head.tipo_doc = get_tipodoc();
if(!_head.flag_prov) // Se estrazione definitiva controllo il periodo che non si sovrapponga alle altre estrazioni def.
{
case F_DATAINI:
if (e == fe_init)
if (!check_periodo_def(_head))
{
#ifdef DBG
TDate d("01-01-2017");
#else
TDate d(TODAY);
d.set_month(1); d.set_day(1);
#endif
o.set(d);
error_box("Attenzione e' stato inserito un periodo che si sovrappone\nad un'estrazione definitiva gia' esistente.");
return -1;
}
break;
case F_DATAEND:
if (e == fe_init)
{
TDate d(TODAY); d.set_month(d.month() - 1); d.set_end_month();
o.set(d);
}
break;
case S_ELAB:
if(e == fe_init)
load_packs();
break;
case DLG_ALL:
if(e == fe_button && curr_page() == 1)
sel_all();
break;
case B_ESTR:
if (e == fe_button)
estrai();
break;
case DLG_FINDREC:
if(e == fe_button && curr_page() == 1)
{
fill();
if(diagnosticazzi());
field(B_ESTR).enable();
}
break;
case DLG_USER:
if (e == fe_button && jolly > 0)
{
TSheet_field& sf = sfield(S_MOVS);
TToken_string& row = sf.row(sf.selected());
TRectype mov(LF_MOV);
mov.put(MOV_NUMREG, row.get(sf.cid2index(F_NUMREG)));
if (mov.edit())
fill();
}
break;
default: break;
}
if (e == fe_modify)
if (o.dlg() >= START_MASK && o.dlg() < END_MASK || o.dlg() >= F_SEL && o.dlg() <= F_DESCR)
field(B_ESTR).disable();
_head.cod_soc = _ambiente;
_head.id_estr.cut(0) << TDate(TODAY).date2ansi() << _estr_msk->get(ES_FLAGPROV) << next_estr_today(tipo);
_head.descr = get_descr();
_head.user = user();
_head.flag_prov = is_provviso();
_head.addr_cart = _addr_doc;
if((e == fe_modify || e >= se_enter) && jolly == 0)
if (o.dlg() >= START_MASK && o.dlg() < END_MASK)
_dirty = true;
_head.stato_estr = check_stato(get_tipoiva());
return true;
}
const bool ok = esporta();
///////////////////////////////////////////////
// TF9_app
///////////////////////////////////////////////
class TF9_app : public TSkeleton_application
{
public:
virtual bool create();
virtual void main_loop();
};
bool TF9_app::create()
{
return TSkeleton_application::create();
if (_head.stato_estr)
warning_box("Attenzione l'estrazione ha prodotto degli errori. \nControllare e correggere eventuali problemi \npremendo il pulsante 'Controllo Estr.'");
_msk->enable(DLG_FINDREC, ok);
return ok ? 1 : false;
}
void TF9_app::main_loop()
{
TMonitor_mask m;
m.field(B_ESTR).disable();
while (m.run() == K_ENTER)
{
}
_msk = new TMonitor_mask();
_estr_msk = new TEstrai_mask();
fill();
while (_msk->run() == K_ENTER){ }
delete _msk;
delete _estr_msk;
}
TF9_app& app()
{
static TF9_app* app = nullptr;
if(app == nullptr)
app = (TF9_app*)&main_app();
return *app;
}
int f90100(int argc, char* argv[])

View File

@ -1,23 +1,19 @@
#define START_MASK 501
#define F_DATAINI 501
#define F_DATAEND 502
#define F_BOXDATE 503
#define F_TOTMOV 504
#define B_ESTR 505
#define END_MASK 599
// Sheet Pacchetti gia' elaborati
#define S_ELAB 201
#define F_TEXT 202
#define F_SELPACK 101
#define F_DATA 102
#define F_NDOCS 103
#define F_PERIOD_DA 104
#define F_PERIOD_A 105
#define S_MOVS 301
#define F_ARCH_B 101
#define F_IDESTR 102
#define F_DATAESTR 103
#define F_PROV_B 104
#define F_TIPODOC 105
#define F_DATADAL 106
#define F_DATAAL 107
#define F_USER 108
#define F_STATESTR 109
#define F_DESCR_E 110
// Campi del vettore _movs
#define F_SEL 101
#define F_NUMREG 102
#define F_DATAREG 103
@ -26,4 +22,23 @@
#define F_MESELIQ 106
#define F_NUMDOC 107
#define F_PROTIVA 108
#define F_DESCR 109
#define F_DESCR 109
// 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 CF_CODGROUP 501
#define CF_CODSOC 502
#define CF_ADDRGROUP 503
#define CF_ADDRDOC 504
#define DES_TEXT 501
#define DES_GROUP 502

View File

@ -8,72 +8,50 @@ BEGIN
PICTURE TOOL_MULTISEL
END
BUTTON B_ESTR 2 2
BUTTON DLG_ELABORA 2 2
BEGIN
PROMPT 1 1 "Estrai"
PROMPT 1 1 "Estrazione"
PICTURE TOOL_ELABORA
FLAGS "D"
FLAGS ""
END
BUTTON DLG_CONFIG 2 2
BEGIN
PROMPT 1 1 "Configurazione"
PICTURE TOOL_CONFIG
FLAGS ""
END
BUTTON DLG_FINDREC 2 2
BEGIN
PROMPT 1 1 "Diagnostica"
PROMPT 1 1 "Controllo Estr."
PICTURE TOOL_PERMISSIONS
FLAGS ""
FLAGS ""
END
#include <helpbar.h>
ENDPAGE
PAGE "Config " 0 2 0 0
PAGE "Monitor Estrazioni" 0 2 0 0
GROUPBOX F_BOXDATE 60 3
TEXT F_TEXT
BEGIN
PROMPT 0 0 "Periodo"
PROMPT 0 1 "@BEstrazioni effettuate:"
END
DATE F_DATAINI
SPREADSHEET S_ELAB -1 -1
BEGIN
PROMPT 1 1 " dal"
END
DATE F_DATAEND
BEGIN
PROMPT 34 1 "Fino al"
END
SPREADSHEET S_ELAB 60 10
BEGIN
PROMPT 0 3 "Elenco pacchetti elaborati"
ITEM " "
ITEM "DATA "
ITEM "NDOCS "
ITEM "PERIOD_DA"
ITEM "PERIOD_A "
END
ENDPAGE
PAGE "Movimenti" 0 2 0 0
SPREADSHEET S_MOVS 0 -3
BEGIN
PROMPT 1 1 "Movimenti stampati"
ITEM ""
ITEM "Numero"
ITEM "Data"
ITEM "Data Doc"
ITEM "Causale"
ITEM "Mese Liq.@7"
ITEM "Documento"
ITEM "Protoc."
ITEM "Descrizione"
END
NUMBER F_TOTMOV 7 0
BEGIN
PROMPT 1 -1 "n. movimenti"
FLAGS "D"
PROMPT 0 2 "Elenco pacchetti elaborati"
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@11"
ITEM "Descrizione@50"
END
ENDPAGE
@ -82,36 +60,65 @@ ENDMASK
PAGE "Pacchetti" -1 -1 78 13
BOOLEAN F_SELPACK
BOOLEAN F_ARCH_B
BEGIN
PROMPT 1 1 "Sel."
END
DATA F_DATA
BEGIN
PROMPT 30 1 "Data"
PROMPT 1 1 ""
FLAGS "D"
END
NUMBER F_NDOCS 6 0
STRING F_IDESTR 18
BEGIN
PROMPT 1 2 "Data"
PROMPT 1 1 ""
FLAGS "D"
END
DATA F_PERIOD_DA
BOOLEAN F_PROV_B
BEGIN
PROMPT 1 3 "Data periodo da"
PROMPT 1 1 ""
FLAGS "D"
END
DATA F_PERIOD_A
STRING F_DESCR_E 50
BEGIN
PROMPT 1 4 "Data periodo a "
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 16
BEGIN
PROMPT 1 1 ""
FLAGS "D"
END
ENDPAGE
@ -133,80 +140,16 @@ END
ENPAGE
ENDMASK
PAGE "Elenco di controllo" -1 -1 78 13
PAGE "Elementi spredsheet" -1 -1 50 3
BOOLEAN F_SEL
SPREADSHEET S_ELAB 60 10
BEGIN
PROMPT 1 0 ""
END
NUMBER F_NUMREG 7
BEGIN
PROMPT 1 1 "Numero "
FLAGS "D"
END
DATE F_DATAREG
BEGIN
PROMPT 1 2 "Data reg."
FLAGS "D"
END
DATE F_DATADOC
BEGIN
PROMPT 1 3 "Data doc."
FLAGS "D"
END
STRING F_CODCAUS 3
BEGIN
PROMPT 1 4 "Causale "
FLAGS "D"
END
NUMBER F_MESELIQ 2
BEGIN
PROMPT 1 5 "Causale "
FLAGS "D"
END
NUMBER F_NUMDOC 7
BEGIN
PROMPT 1 6 "Documento"
FLAGS "D"
END
NUMBER F_PROTIVA 6
BEGIN
PROMPT 1 7 "Protoc."
FLAGS "D"
END
STRING F_DESCR 50
BEGIN
PROMPT 1 8 "Descrizione"
FLAGS "D"
END
ENDPAGE
TOOLBAR "topbar" 0 0 0 2
BUTTON DLG_OK 2 2
BEGIN
PROMPT 1 1 ""
END
BUTTON DLG_USER 2 2
BEGIN
PROMPT 1 1 "Collega"
PICTURE TOOL_LINK
END
BUTTON DLG_CANCEL 2 2
BEGIN
PROMPT 1 1 ""
PROMPT 0 2 "Movimenti da controllare"
ITEM " "
ITEM "DATA "
ITEM "NDOCS "
ITEM "PERIOD_DA"
ITEM "PERIOD_A "
END
ENDPAGE

View File

@ -1,5 +1,11 @@
#pragma once
#define F9_WA "F9WA00K"
#define F9_DRD "F9DRD00K"
#define F9_IVA "F9IVA00K"
#define F9_DRT "F9DRT00K"
// FILE DRD : DRIVER ESTRAZIONE GIORNALE IVA
#define DRD_CODSOC "F9RCSOC" // A(10) [K]
#define DRD_ID_EST "F9RIDES" // A(18) [K]
#define DRD_FLAG_PD "F9RFPDE" // A(1) [K] - { P | D } - Flag provvisorio/definitivo
@ -10,17 +16,21 @@
#define DRD_UTENTE "F9RUTEE" // A(10) - Utente estrazione
#define DRD_TIME "F9RUHES" // T - Data e ora estrazione
#define DRD_STATO "F9RIDAS" // A(2) - { 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 } - Stato estrazione documenti
// 01 = in diagnostica
// 02 = errore diagnostica gestionale
// 03 = diagnostica gestionale ok,
// 04 = in controllo webapp,
// 05 = errore diagnostica webapp,
// 06 = diagnostica webapp ok (se provvisorio si ferma qui)
// 07 = elaborazione presso sostitutiva
// 08 = errore diagnostica sostitutiva
// 09 = Pacchetto archiviazione acquisito
// Stati /////////////////
#define IN_DIAGN "01" // 01 = in diagnostica
#define D_GEST_ERR "02" // 02 = errore diagnostica gestionale
#define D_GEST_OK "03" // 03 = diagnostica gestionale ok,
#define WA_CONTROL "04" // 04 = in controllo webapp,
#define D_WA_ERR "05" // 05 = errore diagnostica webapp,
#define D_WA_OK "06" // 06 = diagnostica webapp ok (se provvisorio si ferma qui)
#define ELAB_SOS "07" // 07 = elaborazione presso sostitutiva
#define D_ERR_SOS "08" // 08 = errore diagnostica sostitutiva
#define ELAB_COMPL "09" // 09 = Pacchetto archiviazione acquisito
//////////////////////////
#define DRD_PERC "F9RPCDC" // A(256) - Perc. copia doc. cartacei WA
// FILE IVA : DOCUMENTI ESTRATTI DAL GIORNALE IVA
#define IVA_CODSOC "F9ICSOC" // A(10) [K] - Codice società
#define IVA_IDLAN "F9IIDLA" // A(18) [K] - ID UNIVOCO DI LANCIO
#define IVA_FLAG_PD "F9IFPDE" // A(1) [K] - Flag Provvisorio / Definitivo
@ -30,34 +40,59 @@
#define IVA_DOCXML "F9IDXML" // A(1) - { S | N } - Documento xml (S=Si, N=No)
#define IVA_TIPOCF "F9ITCFO" // A(1) - { C | F } - Tipo cliente / fornitore (C=Cliente, F=Fornitore)
#define IVA_CODCF "F9ICCFO" // A(10) - Codice cliente / fornitore (In caso di autofattura mettere fornitore originale)
#define IVA_DRSO "F9IDRSO" // A(60) - Ragione sociale
#define IVA_IDFI "F9IIDFI" // A(30) - {Codice ISO + { PIVA (x ita) | CF (x est)}} ID fiscale
#define IVA_PIVA "F9IPIVA" // A(28) - Partiva Iva
#define IVA_CFIS "F9ICFIS" // A(16) - Codice fiscale
#define IVA_CADO "F9ICADO" // A(10) - Categoria documento
#define IVA_CSOS "F9ICSOS" // A(6) - Causale per sostitutiva(da tabella f9drt) (tipo documento fattura (TD01,TD02,TD03 ecc))
#define IVA_NDOC "F9INDOC" // A(20) - Numero Documento
#define IVA_UDOC "F9IUDOC" // D - Data Documento
#define IVA_SIVA "F9ISIVA" // A(10) [K] - sezionale iva
#define IVA_CREG "F9ICREG" // A(6) [K] - Tipo registrazione
#define IVA_NPRI "F9INPRI" // A(20) [K] - n.protocollo iva
#define IVA_UPRI "F9IUPRI" // D [K] - data protocollo iva
#define IVA_FOOA "F9IFOOA" // A(10) - fornitore originale fattura
#define IVA_TROT "F9ITROT" // A(6) - tipo registrazione originale(TR)
#define IVA_NRRO "F9INRRO" // A(20) - n.registrazione originale
#define IVA_URGO "F9IURGO" // D - data registrazione originale
#define IVA_CLDF "F9ICLDF" // A(10) - classe documentale FTV (in base al tipo documento da F9DRT00K)
#define IVA_NMF1 "F9INMF1" // A(100) - nome file DOC (Nome fattura cartacea)
#define IVA_CLDN "F9ICLDN" // A(10) - classe documentale(annesso 1) (in base al tipo documento da F9DRA00K)
#define IVA_NMF2 "F9INMF2" // A(100) - nome file
#define IVA_CLDA "F9ICLDA" // A(10) - classe documentale(annesso 2)
#define IVA_NMF3 "F9INMF3" // A(100) - nome file (Nome documento (senza percorso))
#define IVA_RAGSOC "F9IDRSO" // A(60) - Ragione sociale
#define IVA_IDFISC "F9IIDFI" // A(30) - {Codice ISO + { PIVA (x ita) | CF (x est)}} ID fiscale
#define IVA_PIVA "F9IPIVA" // A(28) - Partiva Iva
#define IVA_CODFIS "F9ICFIS" // A(16) - Codice fiscale
#define IVA_CATDOC "F9ICADO" // A(10) - Categoria documento
#define IVA_CAUSSOS "F9ICSOS" // A(6) - Causale per sostitutiva(da tabella f9drt) (tipo documento fattura (TD01,TD02,TD03 ecc))
#define IVA_NUMDOC "F9INDOC" // A(20) - Numero Documento
#define IVA_DATADOC "F9IUDOC" // D - Data Documento
#define IVA_SELIVA "F9ISIVA" // A(10) [K] - sezionale iva
#define IVA_TIPOREG "F9ICREG" // A(6) [K] - Tipo registrazione
#define IVA_NPROT "F9INPRI" // A(20) [K] - n.protocollo iva
#define IVA_DATPROT "F9IUPRI" // D [K] - data protocollo iva
#define IVA_FORNOR "F9IFOOA" // A(10) - fornitore originale fattura
#define IVA_REGOR "F9ITROT" // A(6) - tipo registrazione originale(TR)
#define IVA_NUMOR "F9INRRO" // A(20) - n.registrazione originale
#define IVA_DATAOR "F9IURGO" // D - data registrazione originale
#define IVA_CLASDOC "F9ICLDF" // A(10) - classe documentale FTV (in base al tipo documento da F9DRT00K)
#define IVA_NOMF1 "F9INMF1" // A(100) - nome file DOC (Nome fattura cartacea)
#define IVA_CLASAN1 "F9ICLDN" // A(10) - classe documentale(annesso 1) (in base al tipo documento da F9DRA00K)
#define IVA_NOMF2 "F9INMF2" // A(100) - nome file 1
#define IVA_CLASAN2 "F9ICLDA" // A(10) - classe documentale(annesso 2)
#define IVA_NOMF3 "F9INMF3" // A(100) - nome file 2 (Nome documento (senza percorso))
#define IVA_CLASAN4 "F9ICLD4" // A(10) - classe documentale(annesso 3)
#define IVA_NOMF4 "F9INMF4" // A(100) - nome file 3
#define IVA_CLASAN5 "F9ICLD5" // A(10) - classe documentale(annesso 4)
#define IVA_NOMF5 "F9INMF5" // A(100) - nome file 4
#define IVA_CLASAN6 "F9ICLD6" // A(10) - classe documentale(annesso 5)
#define IVA_NOMF6 "F9INMF6" // A(100) - nome file 5
#define IVA_CLASAN7 "F9ICLD7" // A(10) - classe documentale(annesso 6)
#define IVA_NOMF7 "F9INMF7" // A(100) - nome file 6
#define IVA_CLASAN8 "F9ICLD8" // A(10) - classe documentale(annesso 7)
#define IVA_NOMF8 "F9INMF8" // A(100) - nome file 7
#define IVA_CLASAN9 "F9ICLD9" // A(10) - classe documentale(annesso 8)
#define IVA_NOMF9 "F9INMF9" // A(100) - nome file 8
#define IVA_CLASA10 "F9ICL10" // A(10) - classe documentale(annesso 9)
#define IVA_NOMF10 "F9INM10" // A(100) - nome file 9
#define IVA_USERELA "F9IUTEE" // A(10) - Utente elaborazione
#define IVA_TIMEELA "F9IUHEL" // D - Data e ora elaborazione
#define IVA_TIMEWEB "F9IUHEW" // D - Data e ora elaborazione WEBAPP
#define IVA_DESCDOC "F9IDDES" // A(30) - Descrizione documento
#define IVA_TIPPROT "F9ITPRT" // A(2) - Tipo protocollo ricezione
#define IVA_NUMPROT "F9IAPRT" // I(4) - Numero protocollo ricezione
#define IVA_ANNPROT "F9INPRT" // I(10) - Anno protocollo ricezione
#define IVA_TIMERIC "F9IURIC" // D - Data/ora ricezione fattura
// FILE DRT : TABELLA CATEGORIE DOCUMENTALI
#define DRT_CODSOC "F9TCSOC" // A(10) [K] - COD.SOCIETÀ
#define DRT_CATDOC "F9TCADO" // A(10) [K] - Categoria documento
#define DRT_DESCR "F9TDES" // A(30) - Descrizione documento
#define DRT_CLASSO "F9TCLDC" // A(10) - classe documentale sostitutiva
#define DRT_CAUSSO "F9TCSOS" // A(6) - causale per sostitutiva(TD01…)
#define DRT_CAUSCON "F9TCAU" // A(6) - causale contabile
#define DRT_TIPOCAU "F9TTCAU" // A(6) - tipo causale contabile
#define DRT_TIMOMOV "F9TTMOV" // A(6) - tipo movimento contabile
#define DRT_OPCEE "F9TFCEE" // A(6) - operatore CEE