Merge branch 'R_10_00' of http://10.65.20.33/sirio/CAMPO/campo into R_10_00

This commit is contained in:
Sirio Builder 2019-06-27 16:50:10 +02:00
commit 2a0e4a537c
36 changed files with 294 additions and 108 deletions

17
lib/.gitignore vendored Normal file
View File

@ -0,0 +1,17 @@
/*.pdb
/*.exp
/*.bsc
/AgaLib.lib
/cb6.lib
/gfm.lib
/pdflib.lib
/vedoc.lib
/vedocext.lib
/xi.lib
/xvaga.lib
/xvapp.lib
/ServerLib.lib
/Uno.lib
/hlw32_mc.lib
/pdflibwrap.lib
/xid.lib

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -28,7 +28,9 @@ enum
pro_err = -86552,
pro_noerr = 1,
pro_notsaved = 0,
pro_nofp = -1
pro_nofp = -1,
pro_dataric_err = -2,
pro_numreg_err = -3
};
///////////////////////////////////////////////////////////
@ -1449,7 +1451,9 @@ void TPrimanota_application::write_fppro()
{
// Controllo se la registrazione ha avuto effetto anche su FPPRO allora salvo riferimento sul mov
if (save_fppro() > 0 && !save_dbmov())
message_box(TString("ATTENZIONE:") << " non è stato possibile salvare i riferimenti del documento in ingresso per questo movimento.\n" <<
message_box(
TString("ATTENZIONE:") <<
" non è stato possibile salvare i riferimenti del documento in ingresso per questo movimento.\n" <<
"Movimento registrato senza collegamento ai documenti in ingresso.");
}
@ -1463,10 +1467,44 @@ bool TPrimanota_application::has_tot_doc(TToken_string& fppro_keys)
return tot.full() && real(tot) != 0;
}
int TPrimanota_application::controlli_f1(const TMask& m)
{
if (m.find_by_id(F_PROKEY) != NULL && m.get(F_PROKEY).full() && has_f1_db((TMask*)&m) && fp_db().sq_is_connect() && check_causale(m.get(F_CODCAUS)))
{
TToken_string keys(m.get(F_PROKEY), ';');
const TDate dataoraric = fppro_db().set_keys(keys).get_dataorarioric();
// Devo controllare che la data operazione sia maggiore della data ric
const TDate data_operazione(m.get(F_DATAREG));
if (data_operazione < dataoraric)
return pro_dataric_err;
const int numreg = fppro_db().set_keys(keys).get_numregcont();
if (numreg != 0)
{
const TDate data_documento(m.get(F_DATADOC));
TString msg; msg << "Attenzione il documento " << data_documento.year() << " / " << m.get(F_NUMDOCEXT) <<
" appena registrato e' gia' stato inserito con la registrazione numero " << numreg <<
"\nSe si vuole registrare questo documento elettronico, scollegarlo prima dalla precedente registrazione.";
error_box(msg);
return pro_numreg_err;
}
}
//app().curr_mask().set(FS_RECALC, "");
return pro_noerr;
}
int TPrimanota_application::write(const TMask& m)
{
static int lasterr = NOERR;
switch (controlli_f1(m)) // Solo con F1
{
case pro_dataric_err:
error_box("Attenzione non è possibile registrare una fattura\ncon data operazione minore della data di ricezione.");
case pro_numreg_err:
return _isnowarning;
default: case pro_noerr: break;
}
const long numreg = m.get_long(F_NUMREG);
if (numreg > _lastreg) _lastreg = numreg; // Aggiorna ultima registrazione libera
@ -1569,10 +1607,19 @@ int TPrimanota_application::write(const TMask& m)
return err;
}
int TPrimanota_application::rewrite(const TMask& m)
{
mask2rel(m);
switch (controlli_f1(m)) // Solo con F1
{
case pro_dataric_err:
error_box("Attenzione non è possibile registrare una fattura\ncon data operazione minore della data di ricezione.");
case pro_numreg_err:
return _isnowarning;
default: case pro_noerr: break;
}
const int err = _rel->rewrite(true);
if (err == NOERR)
{
@ -2275,6 +2322,7 @@ void TPrimanota_application::ini2mask(TConfig& ini, TMask& msk, bool query)
//msk.set(F_TOTALE, calcola_imp());
msk.set(F_COLFPPRO, "X");
msk.set(FS_RECALC, "");
set_scad_f1(msk);
}
if (_f1_liq && msk.find_by_id(F_DIFFERITA) != NULL)
{
@ -2285,6 +2333,30 @@ void TPrimanota_application::ini2mask(TConfig& ini, TMask& msk, bool query)
}
}
void TPrimanota_application::set_scad_f1(TMask& m)
{
const TString& cp = m.get(F_CODPAG);
const TString& dt = m.get(F_DATADOC);
set_pagamento(cp, dt);
set_totale_pagamento(false);
TPagamento& pag = pagamento();
if (m.field(FS_RECALC).enabled())
{
m.set(FS_RDIFFER, "1");
m.set(FS_NAMEPAG, pag.name());
m.set(FS_TIPOPR, pag.desc_tpr());
m.set(FS_MCOMM, pag.mese_commerciale() ? "X" : "");
m.set(FS_RECALC, "");
m.set(FS_NRATE, pag.n_rate());
}
pag.set_rate_auto();
TSheet_field& ps = m.sfield(FS_RATESHEET);
pag.set_sheet(ps); // prepara lo sheet
set_banche(m);
_pag_rows = ps.rows_array(); // copia sheet
}
bool TPrimanota_application::save(bool check_dirty)
{
if (_swap_mask == true)
@ -2414,11 +2486,6 @@ int TPrimanota_application::save_fppro()
// Provo a vedere se hanno l'FP: se c'è l'indirizzo controllo che non sia F8 se non c'è non hanno l'FP
if (!has_f1_db(&msk))
return pro_nofp;
if (!fp_db().sq_is_connect())
{
message_box("Attenzione connesione al database non riuscita.\nImpossibile collegarsi ai documenti in entrata.");
return pro_nofp;
}
// Anzitutto guardo la modalita' in cui sono
// Se in modalita' inserimento continuo normalmente o in mod. modifica
@ -2448,9 +2515,8 @@ int TPrimanota_application::save_fppro()
const TDate data_operazione(msk.get(F_DATAREG));
const TDate data_documento(msk.get(F_DATADOC));
const TString& numero_docext = msk.get(F_NUMDOCEXT);
const TString& numero_doc = msk.get(F_NUMDOC);
real tot_doc = msk.get_real(F_TOTALE);
real ritenute = msk.get_real(F_RITFIS);
const real ritenute = msk.get_real(F_RITFIS);
tot_doc += ritenute;
TToken_string fppro_keys(msk.get(F_PROKEY), ';');
const TString& keyprginvio = fppro_keys.get();
@ -2459,35 +2525,25 @@ int TPrimanota_application::save_fppro()
// Controllo che i dati corrispondano a quelli nella fattura in ingresso
TString where_str;
where_str << " (PZ_DATA = \'" << data_documento.date2ansi() << "\'";
if (has_tot_doc(fppro_keys))
where_str << " (PZ_DATA = \'" << data_documento.date2ansi() << "\' AND PQ_IMPTOTDOC = \'" << tot_doc << "\' AND PZ_NUMERO = \'" << (!numero_docext.empty() ? numero_docext : numero_doc) << "\') ";
else
where_str << " (PZ_DATA = \'" << data_documento.date2ansi() << "\' AND PZ_NUMERO = \'" << (!numero_docext.empty() ? numero_docext : numero_doc) << "\') ";
TString& query = TPro_msk::query_fppro(keyprginvio, keyheaderfatt, keybodyfatt, where_str);
where_str << " AND PQ_IMPTOTDOC = \'" << tot_doc << "\'";
if(!numero_docext.empty())
where_str << " AND PZ_NUMERO = \'" << numero_docext << "\'";
where_str << ") ";
TString& query = TPro_msk::query_string();
query << "WHERE PZ_KEYPRGINVIO = '" << keyprginvio << "' AND PZ_KEYHEADERFATT = '" << keyheaderfatt << "' AND PZ_KEYBODYFATT = '" << keybodyfatt << "'";
query << " AND " << where_str;
fp_db().sq_set_exec(query);
if(has_f1_db(&msk) && fp_db().sq_items() != 1)
{
warning_box(TString("Attenzione, ") << "al movimento non è stato abbinato nessun documento elettronico.\n" <<
"Per consentire una corretta archiviazione sostitutiva si consiglia di non confermare la registrazione e di procedere\n" <<
"all'identificazione del fornitore tramite il monitor fatture passive.\n" <<
"Per consentire una corretta archiviazione sostitutiva si consiglia di provvedere al controllo della registrazione e di procedere\n" <<
"all'inserimento dei dati riportati sulla fattura per la corretta identificazione del documento in entrata.\n" <<
"Se possibile utilizzare il 'Riporta documento' o la contabilizzazione dal monitor delle fatture passive per evitare errori.\n"
"In caso di documento escluso dalla fatturazione elettronica ignorate questo messaggio.");
return pro_notsaved;
}
const int numreg = fp_db().sq_get_int("PZ_NUMREGCONT");
if (numreg != 0)
{
TString msg; msg << "Attenzione il documento " << data_documento.year() << " / " << numero_doc <<
" appena registrato e' gia' stato inserito con la registrazione numero " << numreg <<
"\nControllare e nel caso provvedere a correggere l'associazione del movimento ai documenti in ingresso.";
warning_box(msg);
}
// Devo controllare che la data operazione sia maggiore della data ric
const TDate dataoraric = fp_db().sq_get_date("P1_DATAORARIC");
if(data_operazione < dataoraric)
{
error_box("Attenzione non è possibile registrare una fattura\ncon data operazione minore della data di ricezione.");
save_dbmov(true);
return pro_notsaved;
}
@ -2496,13 +2552,17 @@ int TPrimanota_application::save_fppro()
TString update_query;
update_query << "UPDATE FPPRO00F\n" <<
"SET PZ_TIPOCF = 'F', PZ_CLIFOR = \'" << clifor << "\', PZ_DATACONT = \'" << TDate(TODAY).date2ansi() << "\', PZ_NUMREGCONT = \'" << numregcont << "\', PZ_DATAREGCONT = \'" << data_operazione.date2ansi() << "\'\n" <<
"WHERE PZ_KEYPRGINVIO = \'" << keyprginvio << "\' AND PZ_KEYHEADERFATT = \'" << keyheaderfatt << "\' AND PZ_KEYBODYFATT = \'" << keybodyfatt << "\';";
"SET PZ_TIPOCF = 'F', PZ_CLIFOR = \'" << clifor << "\', PZ_DATACONT = \'" << TDate(TODAY).date2ansi() << "\', " <<
"PZ_NUMREGCONT = \'" << numregcont << "\', PZ_DATAREGCONT = \'" << data_operazione.date2ansi() << "\'\n" <<
"WHERE PZ_KEYPRGINVIO = \'" << keyprginvio << "\' AND PZ_KEYHEADERFATT = \'" << keyheaderfatt << "\' AND PZ_KEYBODYFATT = \'" << keybodyfatt << "\';";
fp_db().sq_set_exec(update_query);
const bool saved = fp_db().sq_commit();
if (!saved)
{
error_box("Attenzione non è stato possibile registrare la fattura nel database.");
save_dbmov(true);
}
return saved? pro_noerr : pro_notsaved;
}

View File

@ -1760,7 +1760,7 @@ bool TPrimanota_application::iva_notify(TSheet_field& iva, int r, KEY k)
real pimponibile(pag.imponibile(inv));
pimponibile.round(pag.round(inv));
if (pimposta != imposta || pimponibile != imponibile)
if ((pimposta != imposta || pimponibile != imponibile) && !a.has_f1_db(&m))
a.set_scadenze(m); // Ricalcola rate
}
}
@ -3847,7 +3847,7 @@ bool TPrimanota_application::quadratura_handler(TMask_field& f, KEY key)
return true;
}
void TPrimanota_application::set_righe_iva_f1(TMask& cg_msk, const shared_ptr<TPro_msk>& msk)
void TPrimanota_application::write_righe_iva_f1(TMask& cg_msk, const shared_ptr<TPro_msk>& msk)
{
TSheet_field& sf = cg_msk.sfield(F_SHEETIVA);
const vector<TPro_msk::riga_iva_s>& righe = msk->get_righeiva();
@ -3867,22 +3867,28 @@ void TPrimanota_application::set_righe_iva_f1(TMask& cg_msk, const shared_ptr<TP
}
}
}
bool TPrimanota_application::set_scadenze_f1(const TMask& cg_msk, const shared_ptr<TPro_msk>& msk)
bool TPrimanota_application::write_scad_f1(const TMask& cg_msk, const shared_ptr<TPro_msk>& msk)
{
TSheet_field& sf = cg_msk.sfield(FS_RATESHEET);
int items = sf.items();
const vector<TPro_msk::scadenza_s>& righe = msk->get_scadenze();
int i = 0;
for (auto it = righe.begin(); it != righe.end(); ++it, ++i)
{
TToken_string& row = sf.row(i);
TToken_string& row = app().pags().row(i);
if(i >= items)
pag_notify(sf, i, K_CTRL+K_INS);
pag_notify(sf, i, K_SPACE);
row.add(it->data, cid2index(101));
row.add(it->importo, cid2index(102));
pag_notify(sf, i, K_ENTER);
}
return !righe.empty();
}
void TPrimanota_application::set_clifo(TMask& cg_msk, const shared_ptr<TPro_msk>& msk)
void TPrimanota_application::write_clifo(TMask& cg_msk, const shared_ptr<TPro_msk>& msk)
{
TLocalisamfile clifo(LF_CLIFO);
clifo.setkey(5);
@ -3913,6 +3919,7 @@ void TPrimanota_application::set_totale(TMask& cg_msk, const shared_ptr<TPro_msk
{
totale -= rit;
cg_msk.set(F_RITFIS, rit);
app().add_cgs_ritenute('F');
}
cg_msk.set(F_TOTALE, totale);
}
@ -3923,11 +3930,12 @@ void TPrimanota_application::riporta_dati_f1(TMask& cg_msk, const shared_ptr<TPr
cg_msk.set(F_NUMDOC, msk->get_numdoc().right(7));
cg_msk.set(F_DATADOC, msk->get_datadoc());
if (!cg_msk.get(F_CODCLIFOR).full() && msk->get_numdoc().full())
set_clifo(cg_msk, msk);
set_righe_iva_f1(cg_msk, msk);
write_clifo(cg_msk, msk);
write_righe_iva_f1(cg_msk, msk);
set_totale(cg_msk, msk);
if (set_scadenze_f1(cg_msk, msk))
cg_msk.set(FS_RECALC, "");
cg_msk.set(FS_RECALC, ""); cg_msk.disable(FS_RDIFFER); cg_msk.disable(FS_MCOMM); cg_msk.disable(FS_NRATE);
if(write_scad_f1(cg_msk, msk))
app().set_scad_f1(cg_msk);
}
bool TPrimanota_application::fppro_mask(TMask_field& f, KEY key)
@ -3949,8 +3957,12 @@ bool TPrimanota_application::fppro_mask(TMask_field& f, KEY key)
msk->run();
// Riporto dati FPPRO su maschera Prima Nota (solo se hai F1)
// Se non hai F1 collego senza riportarti i dati (solo le chiavi db)
if(msk->should_bring_back())
if (msk->should_bring_back())
{
riporta_dati_f1(cg_msk, msk);
//TConfig ini("cg2CONTAB0001.ini");
//app().ini2mask(ini, cg_msk, false);
}
cg_msk.set(F_PROKEY, msk->get_fpprokeys());
is_collegato(cg_msk.field(F_COLFPPRO));
cg_msk.set(F_ANNORIF, cg_msk.get(F_ANNOIVA));
@ -4029,8 +4041,6 @@ bool TPro_msk::load_fppro_mask(TMask* msk, KEY k)
row.add(fp_db().sq_get("PZ_TIPOPROT"));
row.add(fp_db().sq_get("PZ_NUMPROT"));
row.add(keys);
}
sf.force_update();
sf.show();
@ -4204,12 +4214,6 @@ void TPro_msk::add_scad(const TDate& date, const real& importo)
_scadenze.insert(_scadenze.end(), { date, importo });
}
TString& TPro_msk::query_fppro(const TString& keyprginvio, const TString& keyheaderfatt, const TString& keybodyfatt,
const TString& where_str)
{
return query_fppro("", "", "", where_str, "", keyprginvio, keyheaderfatt, keybodyfatt, false, false);
}
TString& TPro_msk::query_fppro(const TString& codforn, const TString& date)
{
return query_fppro(codforn, "", "", "", date, "", "", "", true, false);
@ -4271,15 +4275,30 @@ TString& TPro_msk::query_fppro(const TString& codforn, const TString& stato_piva
{
query << " PZ_DATA = '" << TDate(date).date2ansi() << "' ";
if (order)
query << "\nORDER BY P1_DATAORARIC ASC";
query << "\nORDER BY P1_DATAORARIC ASC, PZ_TIPOPROT ASC, PZ_NUMPROT ASC";
query << ";";
}
else
query.cut(0) << query.left(query.len()-6);
{
query.cut(0) << query.left(query.len() - 6);
query << "\nORDER BY P1_DATAORARIC ASC, PZ_TIPOPROT ASC, PZ_NUMPROT ASC;";
}
return query;
}
TString& TPro_msk::query_string()
{
static TString query;
query.cut(0) << "SELECT PZ_CLIFOR, PZ_DATA, CAST(P1_DATAORARIC AS DATE) AS P1_DATAORARIC, P7_TIPODOC, PQ_IMPTOTDOC, PZ_NUMERO, PZ_NUMREGCONT, PZ_TIPOPROT, " <<
"PZ_NUMPROT, P2_FISCIVAPAESE, P2_FISCIVACOD, P2_CODFISCALE, PZ_KEYPRGINVIO, PZ_KEYHEADERFATT, PZ_KEYBODYFATT\n" <<
"FROM PAA0200F \nJOIN FPPRO00F\n" << " ON P2_KEYPRGINVIO = PZ_KEYPRGINVIO AND P2_KEYHEADERFATT = PZ_KEYHEADERFATT AND P2_KEYBODYFATT = PZ_KEYBODYFATT\n" <<
"JOIN PAA0100F \nON P2_KEYPRGINVIO = P1_KEYPRGINVIO AND P2_KEYHEADERFATT = P1_KEYHEADERFATT AND P2_KEYBODYFATT = P1_KEYBODYFATT\n" <<
"JOIN PAA2700F \nON P2_KEYPRGINVIO = PQ_KEYPRGINVIO AND P2_KEYHEADERFATT = PQ_KEYHEADERFATT AND P2_KEYBODYFATT = PQ_KEYBODYFATT\n" <<
"JOIN PAA0700F \nON P7_KEYPRGINVIO = PQ_KEYPRGINVIO AND P7_KEYHEADERFATT = PQ_KEYHEADERFATT AND P7_KEYBODYFATT = PQ_KEYBODYFATT\n";
return query;
}
void TPro_msk::abilita_piva(TMask* msk)
{
if (msk->get_bool(F_ENABSEARCH))

View File

@ -185,9 +185,9 @@ class TPrimanota_application : public TRelation_application
static bool quadratura_handler(TMask_field& f, KEY k); // Bottone quadratura per ATS
static void set_righe_iva_f1(TMask& cg_msk, const shared_ptr<TPro_msk>& msk);
static bool set_scadenze_f1(const TMask& cg_msk, const shared_ptr<TPro_msk>& msk);
static void set_clifo(TMask& cg_msk, const shared_ptr<TPro_msk>& msk);
static void write_righe_iva_f1(TMask& cg_msk, const shared_ptr<TPro_msk>& msk);
static bool write_scad_f1(const TMask& cg_msk, const shared_ptr<TPro_msk>& msk);
static void write_clifo(TMask& cg_msk, const shared_ptr<TPro_msk>& msk);
static void set_totale(TMask& cg_msk, const shared_ptr<TPro_msk>& msk);
static void riporta_dati_f1(TMask& cg_msk, const shared_ptr<TPro_msk>& msk);
// Handlers per aggancio FPPRO
@ -210,6 +210,7 @@ protected: // TApplication
virtual void print();
void dump_rec(TConfig & ini, const TRectype & rec, int row = 0, int pref = 0);
void dump_fatt(TConfig& ini, TPartita & game, int rigafatt, int pref = 0);
void set_scad_f1(TMask& m);
virtual void ini2mask(TConfig& ini, TMask& msk, bool query);
virtual void mask2ini(const TMask& msk, TConfig& ini);
@ -227,6 +228,8 @@ protected: // TApplication
// setta variabili prima del controllo has_f1_db
void set_has_f1_db(TMask* m);
bool has_f1_db(TMask* m);
// Controlli prima di write e rewrite
int controlli_f1(const TMask& m);
virtual bool save(bool check_dirty);
@ -459,11 +462,10 @@ public:
void add_scad(const TDate& date, const real& importo);
bool should_bring_back() const { return _riporta; }
static TString& query_fppro(const TString& keyprginvio, const TString& keyheaderfatt, const TString& keybodyfatt, const TString& where_str);
static TString& query_fppro(const TString& codforn, const TString& date);
static TString& query_fppro(const TString& stato_piva, const TString& piva, const TString& date);
static TString& query_fppro(const TString& codforn, const TString& stato_piva, const TString& piva, const TString& where_str, const TString& date, const TString& keyprginvio, const TString& keyheaderfatt, const TString& keybodyfatt, bool order = true, bool piva_research = false);
static TString& query_string();
static void abilita_piva(TMask* msk);
//bool is_fp();
// Carica documenti FPPRO sulla maschera

View File

@ -91,18 +91,18 @@ SPREADSHEET F_SHEETFPPROS 0 15
BEGIN
PROMPT 0 8 ""
ITEM " "
ITEM "Tipo Doc@7"
ITEM "Data Ricezione"
ITEM "Data Doc."
ITEM "Importo Totale"
ITEM "Ritenute d'acconto"
ITEM "Numero"
ITEM "Paese"
ITEM "P. IVA"
ITEM "Cod. Fiscale"
ITEM "Tipo Protocollo\nin ingresso"
ITEM "Progressivo di ingresso"
ITEM "Chiave FPPRO@80"
ITEM "Tipo Doc@5"
ITEM "Data\nRicezione@8"
ITEM "Data\nDoc.@8"
ITEM "Totale\nDocumento@7"
ITEM "Ritenute\nfiscali@6"
ITEM "Numero@14"
ITEM "Paese@4"
ITEM "P. IVA@10"
ITEM "Cod. Fiscale@14"
ITEM "Tipo Protocollo\nin ingresso@10"
ITEM "Progressivo\ndi ingresso@10"
ITEM "Chiave FPPRO@40"
END
STRING F_NUMEROI 20

View File

@ -155,6 +155,23 @@ TDate TFppro::get_data_first_doc() const
return _db->sq_get_date("DATA");
}
TDate TFppro::get_dataorarioric() const
{
TString query;
query << "SELECT P1_DATAORARIC \nFROM PAA0100F \n" <<
"WHERE P1_KEYPRGINVIO = '" << _keys.prginvio << "' AND P1_KEYHEADERFATT = '" << _keys.headerfatt << "' AND P1_KEYBODYFATT = '" << _keys.bodyfatt << "'";
_db->sq_set_exec(query);
return _db->sq_get_date("P1_DATAORARIC");
}
int TFppro::get_numregcont() const
{
TString query;
query << "SELECT PZ_NUMREGCONT FROM FPPRO00F\n" << where_str();
_db->sq_set_exec(query);
return _db->sq_get_int("PZ_NUMREGCONT");
}
bool TFppro::set_query()
{
if (_keys_setted)
@ -167,8 +184,8 @@ bool TFppro::set_query()
const char* TFppro::where_str() const
{
TString str;
str << " WHERE PZ_KEYPRGINVIO = '" << _keys.prginvio << "' AND PZ_KEYHEADERFATT = '" << _keys.headerfatt << "' AND PZ_KEYBODYFATT = '" << _keys.bodyfatt << "'";
static TString str;
str.cut(0) << " WHERE PZ_KEYPRGINVIO = '" << _keys.prginvio << "' AND PZ_KEYHEADERFATT = '" << _keys.headerfatt << "' AND PZ_KEYBODYFATT = '" << _keys.bodyfatt << "'";
return str;
}

View File

@ -45,20 +45,23 @@ public:
bool check_reg(TToken_string& keys, int numreg);
// Se un mov. registrato non e' collegato all'FPPRO cerco di capire qual'e`
bool guess_the_doc(const TLocalisamfile& mov);
bool guess_the_doc(const TLocalisamfile& mov);
// Getters
void get_keys_fppro();
int get_numreg();
int get_numreg(TToken_string& keys);
TDate get_datareg();
TDate get_datareg(TToken_string& keys);
real get_ritenute() const;
TDate get_data_first_doc() const;
void get_keys_fppro();
int get_numreg();
int get_numreg(TToken_string& keys);
TDate get_datareg();
TDate get_datareg(TToken_string& keys);
real get_ritenute() const;
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);
TFppro();

View File

@ -743,14 +743,13 @@ bool TDoc2Paf::create()
{
open_files(LF_TAB, LF_TABCOM, LF_TABMOD, LF_ANAG,
LF_CLIFO, LF_CFVEN, LF_CFBAN, LF_NDITTE,
LF_DOC, LF_RIGHEDOC, 0);
LF_DOC, LF_RIGHEDOC, LF_CODCORR, LF_ANAMAG, 0);
TRectype cfven(LF_CFVEN);
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."));
return check_tables() && TSkeleton_application::create();
}
bool TDoc2Paf::destroy()

View File

@ -388,7 +388,8 @@ private:
enum TFP_operator { error, eq, neq, gt, ls, gteq, lseq, and, or };
// Etrattori
static void extract_info(const TString& expr, TString& tabella, TString& campo, TToken_string* search);
static void extract_info(const TString& expr, TString& tabella, TString& campo);
static void extract_info(const TString& expr, TString& tabella, TString& campo, TToken_string& search, int& key);
static bool calc_table(const TString& tabella, int& file);
static void split_condition(const TString& cond, TString& cond_sx, TString& cond_dx, TFP_operator& symb);
static TVariant& get_value(const TRectype& rec, const TString& campo);

View File

@ -51,6 +51,7 @@ bool set_connection(SSimple_query& s)
#endif
return ok;
}
SSimple_query& fp_db()
{
static SSimple_query* db = nullptr;
@ -63,6 +64,7 @@ SSimple_query& fp_db()
}
return *db;
}
bool run_fp_psw_mask()
{
static TMask* m;

View File

@ -255,8 +255,6 @@ TFP_custom_cache::TFP_custom_cache()
}
}
/******************************************************************************
* TFP_expression
*******************************************************************************/
@ -364,7 +362,7 @@ bool TFP_expression::check_condition(const TString& cond, TRiga_documento& rdoc)
}
}
void TFP_expression::extract_info(const TString& expr, TString& tabella, TString& campo, TToken_string* search)
void TFP_expression::extract_info(const TString& expr, TString& tabella, TString& campo)
{
// Prendo la stringa pulita della parte sinistra
TString clean_expr = expr.mid(expr.find('(') + 1);
@ -377,13 +375,38 @@ void TFP_expression::extract_info(const TString& expr, TString& tabella, TString
// Trimmare sempre come se non sapessi fare altro nella vita
tabella.cut(0) << info.remove(0); tabella.trim();
campo.cut(0) << info.remove(0); campo.trim();
if (search != nullptr)
}
void TFP_expression::extract_info(const TString& expr, TString& tabella, TString& campo, TToken_string& search, int& key)
{
// Prendo la stringa pulita della parte sinistra
TString clean_expr = expr.mid(expr.find('(') + 1);
// Tolgo eventuali spazi ai lati
clean_expr.trim();
// Tolgo la virgola finale
clean_expr.rtrim(1);
TToken_string info(clean_expr, ',');
// Trimmare sempre come se non sapessi fare altro nella vita
tabella.cut(0) << info.remove(0); tabella.trim();
if(tabella.contains('.'))
{
// Prendo il resto
search->cut(0) << info;
search->trim();
search->restart();
TToken_string app(tabella, '.');
tabella = app.get();
key = atoi(app.get());
}
else
{
key = 1;
}
campo.cut(0) << info.remove(0); campo.trim();
// Prendo il resto e lo devolvo nella ricerca
search.cut(0) << info;
search.trim();
search.restart();
}
bool TFP_expression::calc_table(const TString& tabella, int& file)
@ -549,17 +572,26 @@ TVariant& TFP_expression::parse_var(const TString& str)
TVariant& TFP_expression::parse_read(const TString& str, TRiga_documento& rdoc)
{
TString tabella, campo;
extract_info(str, tabella, campo, nullptr);
extract_info(str, tabella, campo);
return do_read(tabella, campo, rdoc);
}
TVariant& TFP_expression::do_read(const TString& tabella, const TString& campo, TRiga_documento& rdoc)
{
const TDocumento& doc = rdoc.doc();
// Prima di tutto controllo se è una delle tabelle multitracciato che supporto
if(tabella == "%TIP")
{
return get_value(rdoc.doc().tipo(), campo);
return get_value(doc.tipo(), campo);
}
if(tabella == "%NUM")
{
return get_value(doc.codice_numerazione(), campo);
}
if(tabella == "%CPG")
{
return get_value(cache().get("%CPG", doc.get(DOC_CODPAG)), campo);
}
int file;
@ -568,17 +600,19 @@ TVariant& TFP_expression::do_read(const TString& tabella, const TString& campo,
switch (file)
{
case LF_DOC:
return get_value(rdoc.doc(), campo);
return get_value(doc, campo);
case LF_RIGHEDOC:
return get_value(rdoc, campo);
case LF_CLIFO:
return get_value(rdoc.doc().clifor(), campo);
return get_value(doc.clifor(), campo);
case LF_CFVEN:
return get_value(rdoc.doc().clifor().vendite(), campo);
return get_value(doc.clifor().vendite(), campo);
case LF_LETINT:
return get_value(rdoc.doc().clifor().lettera(), campo);
return get_value(doc.clifor().lettera(), campo);
case LF_ANAMAG:
return get_value(rdoc.articolo(), campo);
case LF_CODCORR:
return get_value(cache().get(LF_CODCORR, rdoc.articolo().codice()), campo);
default:
static TVariant null_var(EMPTY_STRING);
return null_var;
@ -588,10 +622,10 @@ TVariant& TFP_expression::do_read(const TString& tabella, const TString& campo,
TVariant& TFP_expression::parse_search(const TString& str, TRiga_documento& rdoc)
{
TString tabella, campo;
TToken_string input_search, search;
int file;
TToken_string input_search("", ';'), search;
int file, key;
extract_info(str, tabella, campo, &input_search);
extract_info(str, tabella, campo, input_search, key);
const bool multi_table = calc_table(tabella, file);
// Parso ogni singolo token della ricerca
@ -602,10 +636,10 @@ TVariant& TFP_expression::parse_search(const TString& str, TRiga_documento& rdoc
if (multi_table)
{
return get_value(cache().get(tabella, search), campo);
return get_value(cache().get(tabella, search, key), campo);
}
else
{
return get_value(cache().get(file, search), campo);
return get_value(cache().get(file, search, key), campo);
}
}

View File

@ -957,13 +957,42 @@ int TDB_cache::build_table_key(const char* table, const char* key, TToken_string
return file;
}
const TRectype& TDB_cache::get(const char* table, const char* key)
const TRectype& TDB_cache::get(const int file, const char* key_tok, const int key)
{
// Prendo la vecchia chiave
const int old_key = rec_cache(file).key_number();
// Setto la nuova chiave
rec_cache(file).set_key(key);
// Poi chiamo la get normale
const TRectype& app = get(file, key_tok);
// Ripristino la vecchia chiave per mantenere la compatibilità con i metodi vecchi
// non vorrei rischiare che altre applicazioni si basano sulla chiave vecchia
rec_cache(file).set_key(old_key);
return app;
}
const TRectype& TDB_cache::get(const char* table, const char* key_tok)
{
TToken_string tabkey;
const int file = build_table_key(table, key, tabkey);
const int file = build_table_key(table, key_tok, tabkey);
return rec_cache(table).get(tabkey);
}
const TRectype& TDB_cache::get(const char* table, const char* key_tok, const int key)
{
TToken_string tabkey;
const int file = build_table_key(table, key_tok, tabkey);
// Per il giro della vecchia chiave guardare get(const int, const char*, const int)
const int old_key = rec_cache(file).key_number();
rec_cache(table).set_key(key);
const TRectype& app = rec_cache(table).get(tabkey);
rec_cache(file).set_key(old_key);
return app;
}
const TRectype& TDB_cache::get(const TRectype& curr)
{
const int num = curr.num(); // Numero logico del file (o tabella)

View File

@ -184,6 +184,7 @@ public:
int io_result();
const int key_number() const
{ return _key; }
void set_key(const int key) { _key = key; }
bool already_loaded(const char* code) const;
bool already_loaded(long code) const;
@ -263,9 +264,11 @@ public:
void flush(int file) { rec_cache(file).flush(); }
void discard(int file);
const TRectype& get(int file, const char* key_tok, const int key);
const TRectype& get(int file, const char* key_tok) { return rec_cache(file).get(key_tok); }
const TRectype& get(int file, long key) { return rec_cache(file).get(key); }
const TRectype& get(const char* table, const char* key_tok);
const TRectype& get(const char* table, const char* key_tok, const int key);
const TRectype& get(const TRectype& key);
const TRectype& get_rec(int file, char c, long n);