Patch level : 12.0 no-patch

Files correlati     : f90.exe f90200a.msk f90104.sql
Commento            :
- F9 ARCHIVIAZIONE SOSTITUTIVA:
- Aggiunto qualche controllo degli errori in piu'.
- Aggiunta tabella per movimenti pronti all'estrazione per poter controllare quale e' stato saltato.
- Corretto aggiornamento stato estrazione DRD
- Modificata diagnostica non tutti i casi ora sono bloccanti, alcuni fanno saltare semplicemente il movimento (si possono poi controllare nel caso)
- In diagnostica controllo se deve essere estratto secondo le cat. documentali.
This commit is contained in:
Simone Palacino 2020-04-14 10:19:04 +02:00
parent e3fe3e0718
commit 2a027fd07e
6 changed files with 196 additions and 94 deletions

View File

@ -20,7 +20,7 @@
#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 102 // Utilizzo questo per controllare la versione attuale delle tabelle e nel caso aggiornarle
#define SQL_VERSION 104 // Utilizzo questo per controllare la versione attuale delle tabelle e nel caso aggiornarle
////////////////////////////////////////////////////////
@ -587,7 +587,7 @@ vector<TToken_string>& TControllo_mask::import_error_list()
static vector<TToken_string> controllo_mov;
controllo_mov.clear();
TF9_dberr dberr;
_tipo_doc_err = dberr.get_errori(_id_estr, controllo_mov);
_tipo_doc_err = TF9_dberr::get_errori(_id_estr, controllo_mov);
return controllo_mov;
}
@ -819,7 +819,8 @@ bool TControllo_mask::on_field_event(TOperable_field& o, TField_event e, long jo
return true;
}
TControllo_mask::TControllo_mask(const char* id_estr, bool esclusi) : TAutomask("f90100b"), _ordin('D'), _verso('A'), _selected_mov(0), _sel_esclusi(false)
TControllo_mask::TControllo_mask(const char* id_estr, bool esclusi)
: TAutomask("f90100b"), _ordin('D'), _verso('A'), _selected_mov(0), _sel_esclusi(false)
{
_id_estr = id_estr;
field(B_ESCL).disable();
@ -1146,7 +1147,7 @@ int TF9_app::estrai()
const bool stampato = recset_get_bool(mov, MOV_REGST);
const TString& numdoc = recset_get_string(mov, MOV_NUMDOC);
// Se definitivo controllo il flag di stampato REGST
if ((flagpro || stampato) && numdoc.full() && caus.reg().iva() == tipo && !escluso) // Controllo anche che non sia escluso
if ((flagpro || stampato) && numdoc.full() && caus.reg().iva() == tipo)
{
clifo.zero();
clifo.put(CLI_TIPOCF, tipo == iva_acquisti ? "F" : "C");
@ -1158,7 +1159,7 @@ int TF9_app::estrai()
t.numreg = recset_get_int (mov, MOV_NUMREG);
t.datareg = recset_get_string(mov, MOV_DATAREG);
t.datadoc = recset_get_string(mov, MOV_DATADOC);
t.codcaus = recset_get_string(mov, MOV_CODCAUS);
t.codcaus = recset_get_string(mov, MOV_CODCAUS, 3);
t.meseliq = recset_get_int (mov, MOV_MESELIQ);
t.numdoc = recset_get_string(mov, MOV_NUMDOC);
t.tot = recset_get_real (mov, MOV_TOTDOC) + recset_get_real(mov, MOV_RITFIS) + recset_get_real(mov, MOV_RITSOC);
@ -1166,6 +1167,11 @@ int TF9_app::estrai()
t.ragsoc = clifo.read() == NOERR ? clifo.get(CLI_RAGSOC) : " ";
t.reg_protiva = TString(recset_get_string(mov, MOV_REG)) << "/" << recset_get_string(mov, MOV_PROTIVA);
t.descr = recset_get_string(mov, MOV_DESCR);
if (escluso)
{
t.estratto = false;
t.descr_estr = movimento_t::escluso;
}
// Effettivo inserimento del movimento
_estrazione->add_mov(t);

View File

@ -3,6 +3,7 @@
#define F9_IVA "F9IVA00K"
#define F9_DRT "F9DRT00K"
#define F9_ERR "F9ERROR"
#define F9_MOVESTR "F9MOVESTR"
// FILE DRD : DRIVER ESTRAZIONE GIORNALE IVA

View File

@ -59,7 +59,7 @@ BEGIN
ITEM "Categoria\nDocumento (Codice)@15"
ITEM "Descrizione\nDocumento@26"
ITEM "Classe Documentale\nSostitutiva@18"
ITEM "Causale per\nSostitutiva (TD01...)@12"
ITEM "Causale per\nSostitutiva (TD01...)@25"
ITEM "Causale\nContabile@8"
ITEM "Tipo Causale\nContabile@8"
ITEM "Tipo Movimento\nContabile@10"

View File

@ -50,7 +50,10 @@ state_fppro TEstrazione::check_fppro(int numreg)
return correct;
TString err(fppro_db().get_last_error());
if (!err.empty())
{
error_box(err.cut(0) << "Errore durante il controllo del movimento n. " << numreg << "\n" << err);
return err_read_db;
}
return reg_with_err;
}
else // Se non ho i riferimenti faccio guessing
@ -110,7 +113,7 @@ TString& TEstrazione::drd_tovalues() const
_head.stato_estr << "', '" << _head.addr_cart << "'";
}
bool TEstrazione::new_extr() const
bool TEstrazione::insert_into_drd() const
{
TString query;
query << "INSERT INTO " F9_DRD " ( " << drd_attr() << " ) \nVALUES ( " << drd_tovalues() << " );";
@ -121,9 +124,25 @@ bool TEstrazione::new_extr() const
return ok;
}
bool TEstrazione::scrivi_testata_su_db() const
bool TEstrazione::insert_into_f9movestr() const
{
return new_extr();
TString query;
query << "INSERT INTO " F9_MOVESTR " (IDESTR, NUMREG, DATAREG, ESTRATTO, DESCR_ERR)\nVALUES ";
for(auto it = _movs.begin(); it != _movs.end(); ++it)
{
query << " ('" << _head.id_estr << "', '" << it->numreg << "', '" << it->datareg.date2ansi() << "', " <<
(it->estratto ? "1" : "0") << ", '" << check_str(it->get_descr_estr()) << "'),\n";
#ifdef DBG
if (TString(check_str(it->get_descr_estr())).empty())
bool simo = true;
#endif
}
query.rtrim(2);
bool ok = fp_db().sq_set_exec(query);
ok = ok && fp_db().sq_commit();
if (!ok)
write_errorsql_log(query);
return ok;
}
bool TEstrazione::export_error_list() const
@ -215,7 +234,7 @@ void TEstrazione::add_mov(const movimento_t& movimento)
_movs.insert(_movs.end(), movimento);
}
void TEstrazione::aggiorna_stato() const
bool TEstrazione::update_drd_stato_estr() const
{
bool ok;
do
@ -225,12 +244,13 @@ void TEstrazione::aggiorna_stato() const
"SET " DRD_STATO " = '" << _head.stato_estr << "'\n" \
"WHERE " DRD_CODSOC " = '" << _head.cod_soc << "'" \
" AND " DRD_ID_EST " = '" << _head.id_estr << "'" \
" AND " DRD_FLAG_PD " = '" << _head.flag_prov << "'";
" AND " DRD_FLAG_PD " = '" << (_head.flag_prov ? "P" : "D") << "'";
ok = fp_db().sq_set_exec(query);
ok = ok && fp_db().sq_commit();
if (!ok)
write_errorsql_log(query);
} while (!ok && yesno_box("Impossibile aggiornare stato dell'estrazione.\nRiprovare?"));
return ok;
}
const char* TEstrazione::diagnostica_mov()
@ -246,33 +266,69 @@ const char* TEstrazione::diagnostica_mov()
{
if (!bar.add_status())
break;
#ifdef DBG
if (it->numreg == 96963)
bool simo = true;
#endif
// Se escluso passo avanti
if (!it->estratto && it->descr_estr == movimento_t::escluso)
continue;
movimento_t& mov_i = *it;
//const int numreg = row.get_int(cid2index(F_NUMREG));
const int numreg = mov_i.numreg;
switch (check_fppro(numreg))
movimento_t& mov_i = *it;
const int numreg = mov_i.numreg;
const state_fppro res = check_fppro(numreg);
switch (res)
{
// OK
case guessed:
ok &= fppro_db().associa_mov(numreg);
//row.add(fppro_db().get_keys_fppro());
case correct:
/*ok &= true;
mov_i.err = false;
mov_i.state = res;
break;*/
// ERRORS
// Errore non bloccante
case not_fa:
ok &= true;
mov_i.state = correct;
mov_i.err = false;
mov_i.state = res;
break;
case not_fa:
mov_i.descr_err = "Non fattura";
mov_i.state = not_fa;
// ERRORI BLOCCANTI
case reg_with_err:
mov_i.descr_err = "Registrazione con errori";
mov_i.state = reg_with_err;
ok &= false;
mov_i.err = true;
mov_i.estratto = false;
mov_i.descr_err = "Errore controllo movimento: associazione movimento con fattura elettronica passiva sbagliato.";
mov_i.state = res;
break;
case err_read_db:
ok &= false;
mov_i.err = true;
mov_i.estratto = false;
mov_i.descr_err = "Errore controllo movimento: errore lettura db.";
mov_i.state = res;
break;
case no_guessed:
ok &= false;
mov_i.err = true; // Mi segno il movimento che ha un problema
mov_i.err = true;
mov_i.estratto = false;
mov_i.descr_err = "Non associato a fattura elettr. abbinamento automatico non riuscito. Abbinare manualmente, o escludere";
mov_i.state = no_guessed;
mov_i.state = res;
default: break;
}
/* Per quelli che hanno passato il primo controllo errori controllo che debba essere estratto
* secondo le categorie documentali. */
if(!mov_i.err && mov_i.estratto)
{
std::shared_ptr<TCategorie_doc::classe_doc> cd = categorie_doc().causcont2cat(mov_i.codcaus);
mov_i.estratto = cd.get();
mov_i.descr_estr = cd ? movimento_t::no_err : movimento_t::no_catdoc;
mov_i.catdoc = cd;
}
}
}
else if (tipo == iva_vendite)
@ -313,7 +369,6 @@ const char* TEstrazione::diagnostica_mov()
}
}
_head.stato_estr = ok ? D_GEST_OK : D_GEST_ERR;
aggiorna_stato();
return _head.stato_estr;
}
@ -333,8 +388,8 @@ result_estr TEstrazione::estrai()
return estr_stop;
}
// Non so come usare questi 18 caaratteri...
// Ci metto un po' di roba anche se sono dati gia' noti in altri campi (I know..) + un numero incrementale.
// 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) << today.date2ansi() << (_head.flag_prov ? "P" : "D") << (!_escluso ? "N" : "X") <<
next_estr_today(_head.tipo_doc);
_head.user = user();
@ -343,9 +398,8 @@ result_estr TEstrazione::estrai()
if (_escluso)
set_dates(); // Se escluso imposto data inizio e fine uguali
// Scrivo record estrazione in stato '01'.
const bool ok = scrivi_testata_su_db();
// Scrivo record estrazione (in stato '01': in diagnostica).
bool ok = insert_into_drd();
if (!ok)
{
TString msg;
@ -357,9 +411,9 @@ result_estr TEstrazione::estrai()
// Faccio partire la diagnostica e mi salvo il nuovo stato.
diagnostica_mov();
ok &= insert_into_f9movestr();
ok &= update_drd_stato_estr();
//_esclusi.clear();
//_esclusi.insert(_esclusi.end(), row);
if (_head.stato_estr == D_GEST_ERR)
{
warning_box("Attenzione l'estrazione ha prodotto degli errori.\n" \
@ -367,12 +421,15 @@ result_estr TEstrazione::estrai()
// Se in errore, esporto lista errori sul db
if (!export_error_list())
warning_box("Errore scrittura db. Controllare log errori.");
return estr_diag_err; // Errore diagnostica gestionale
}
// Se va tutto ben fino a qui, posso andare a scrivere nella
// tabella IVA i movimenti.
return estrazione_iva() ? estr_ok : estr_err_db_iva;
// tabella IVA i movimenti. F9IVA
const result_estr res = estrazione_iva() ? estr_ok : estr_err_db_iva;
return res;
}
bool TEstrazione::estrazione_iva(bool escluso)
@ -486,7 +543,7 @@ TEstrazione::TEstrazione(const TString& ambiente, const bool flag_prov, const ch
_escluso = escluso;
_error_sql = new fstream;
_error_sql = new ofstream;
_error_sql->open("f9_TEstrazione_error_sql.txt");
}
@ -532,10 +589,11 @@ void TF9_dberr::add(const long num)
bool TF9_dberr::send()
{
fp_db().sq_set_exec(_insert);
write_sqlerrlog(_insert);
const bool ok = fp_db().sq_set_exec(_insert) && fp_db().sq_commit();
if(!ok)
write_sqlerrlog(_insert);
_insert.cut(0) << "INSERT INTO " F9_ERR " VALUES ()";
return true;
return ok;
}
void TF9_dberr::del_err(const TString& id_estr, int numreg)
@ -614,7 +672,7 @@ void TCategorie_doc::load_all()
}
}
TCategorie_doc::classe_doc* TCategorie_doc::causcont2cat(const char* caus)
std::shared_ptr<TCategorie_doc::classe_doc> TCategorie_doc::causcont2cat(const char* caus)
{
const TCausale c(caus);
const TString& tipodoc = c.tipo_doc();
@ -645,11 +703,10 @@ TCategorie_doc::classe_doc* TCategorie_doc::causcont2cat(const char* caus)
caus_sost = "TD04";
}
const vector<classe_doc>::iterator it = find(class_sost, caus_sost, op_cee);
classe_doc* cd = nullptr;
std::shared_ptr<classe_doc> cd = nullptr;
if (it != _rows.end())
cd = &*it; // todo: Test it!
cd = std::make_shared<classe_doc>(*it); // Creo una copia e la restituisco. todo: Test it!
return cd;
}

View File

@ -36,15 +36,63 @@ enum result_estr
enum state_fppro
{
correct = 1,
reg_with_err = -1,
reg_with_err = -1, // Movimento associato male con FPPRO
not_fa = -10, // Non e' fattura acquisti
guessed = 100,
no_guessed = 0,
null_state = -100
null_state = -100,
err_read_db = 999 // Errore lettura da fppro
};
typedef struct _movimento_t
class TCategorie_doc
{
public:
struct classe_doc
{
TString catdoc;
TString descr;
TString class_sost;
TString caus_sost;
TString causcont;
TString tipocaus;
TString tipomov;
TString opcee;
};
private:
vector<classe_doc> _rows;
vector<classe_doc>::iterator find(const TString& class_sost, const TString& caus_sost, const TString& op_cee);
void load_all();
public:
std::shared_ptr<classe_doc> causcont2cat(const char* caus);
void reload()
{
_rows.clear();
load_all();
}
TCategorie_doc() { load_all(); }
};
inline TCategorie_doc& categorie_doc()
{
static unique_ptr<TCategorie_doc> cd = nullptr;
if (cd == nullptr)
cd = make_unique<TCategorie_doc>();
else
cd->reload();
return *cd;
}
struct movimento_t
{
enum err_mov
{
no_err, // Estratto normalmente
escluso, // Movimento con flag escluso
no_catdoc // Nessuna cat. doc. riconosciuta per questo movimento, o non e' una fattura
};
bool err;
int numreg;
TDate datareg;
@ -57,10 +105,32 @@ typedef struct _movimento_t
TString ragsoc;
TString reg_protiva;
TString descr;
state_fppro state;
state_fppro state{ null_state };
TString descr_err;
bool estratto{ true };
err_mov descr_estr{ no_err };
std::shared_ptr<TCategorie_doc::classe_doc> catdoc;
TString get(int i) const
static const char* err_mov2name(const err_mov descr_estr)
{
switch (descr_estr)
{
case no_err:
return "OK";
case escluso:
return "Il movimemnto e' segnato come escluso. Saltato.";
case no_catdoc:
return "Nessuna categoria documentale riconosciuta per questo movimento, o non e' una fattura.";
default: return "";
}
}
const char* get_descr_estr() const
{
return err_mov2name(descr_estr);
}
TString get(const int i) const
{
TString a;
switch (i)
@ -85,20 +155,20 @@ typedef struct _movimento_t
default: return "";
}
}
} movimento_t;
};
class TEstrazione : public TObject
{
drd _head;
vector<movimento_t> _movs;
fstream* _error_sql;
ofstream* _error_sql;
bool _escluso;
const TString _descr;
/** Aggiorna stato estrazione. Utilizzato ad esempio dopo la diagnostica per riportare
* il nuovo stato sul db.
*/
void aggiorna_stato() const;
bool update_drd_stato_estr() const;
static const char* categoria_doc();
static const char* caus_sos(const TLocalisamfile& mov, TipoIVA acquisti);
/** CHECK RIFERIMENTO FPPRO
@ -117,10 +187,10 @@ class TEstrazione : public TObject
static bool is_doc_xml(const TLocalisamfile& mov);
static TString& drd_attr();
TString& drd_tovalues() const;
bool new_extr() const; /**< See \a scrivi_testata_su_db(). */
bool scrivi_testata_su_db() const; /**< Scrittura testata estrazione. Tabella F9DRD. Chiama \a new_extr(). */
bool export_error_list() const; /**< Esporta sheet controllo fatture sul db. */
TString& drd_tovalues() const;
bool insert_into_drd() const; /**< Scrittura testata estrazione. Tabella F9DRD. */
bool insert_into_f9movestr() const; /**< Scrittura su db dell'elenco di movimenti presi. */
bool export_error_list() const; /**< Esporta sheet controllo fatture sul db. */
/** 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().
@ -199,44 +269,4 @@ public:
TF9_dberr();
};
class TCategorie_doc
{
public:
struct classe_doc
{
TString catdoc;
TString descr;
TString class_sost;
TString caus_sost;
TString causcont;
TString tipocaus;
TString tipomov;
TString opcee;
};
private:
vector<classe_doc> _rows;
vector<classe_doc>::iterator find(const TString& class_sost, const TString& caus_sost, const TString& op_cee);
void load_all();
public:
classe_doc* causcont2cat(const char* caus);
void reload()
{
_rows.clear();
load_all();
}
TCategorie_doc() { load_all(); }
};
inline TCategorie_doc& categorie_doc()
{
static unique_ptr<TCategorie_doc> cd = nullptr;
if(cd == nullptr)
cd = make_unique<TCategorie_doc>();
else
cd->reload();
return *cd;
}
#endif // #ifndef __F901001_H__

8
src/f9/sql/f90104.sql Normal file
View File

@ -0,0 +1,8 @@
CREATE TABLE F9MOVESTR(
IDESTR CHAR(18) NOT NULL,
NUMREG NUMERIC(7,0) NOT NULL,
DATAREG DATE,
ESTRATTO BIT DEFAULT '0' NOT NULL,
DESCR_ERR VARCHAR(1024)
);
ALTER TABLE F9MOVESTR ADD CONSTRAINT F9MOVESTR_PK PRIMARY KEY(IDESTR, NUMREG);