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_err = -86552,
pro_noerr = 1, pro_noerr = 1,
pro_notsaved = 0, 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 // Controllo se la registrazione ha avuto effetto anche su FPPRO allora salvo riferimento sul mov
if (save_fppro() > 0 && !save_dbmov()) 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."); "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; 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) int TPrimanota_application::write(const TMask& m)
{ {
static int lasterr = NOERR; 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); const long numreg = m.get_long(F_NUMREG);
if (numreg > _lastreg) _lastreg = numreg; // Aggiorna ultima registrazione libera if (numreg > _lastreg) _lastreg = numreg; // Aggiorna ultima registrazione libera
@ -1569,10 +1607,19 @@ int TPrimanota_application::write(const TMask& m)
return err; return err;
} }
int TPrimanota_application::rewrite(const TMask& m) int TPrimanota_application::rewrite(const TMask& m)
{ {
mask2rel(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); const int err = _rel->rewrite(true);
if (err == NOERR) 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_TOTALE, calcola_imp());
msk.set(F_COLFPPRO, "X"); msk.set(F_COLFPPRO, "X");
msk.set(FS_RECALC, ""); msk.set(FS_RECALC, "");
set_scad_f1(msk);
} }
if (_f1_liq && msk.find_by_id(F_DIFFERITA) != NULL) 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) bool TPrimanota_application::save(bool check_dirty)
{ {
if (_swap_mask == true) 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 // 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)) if (!has_f1_db(&msk))
return pro_nofp; 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 // Anzitutto guardo la modalita' in cui sono
// Se in modalita' inserimento continuo normalmente o in mod. modifica // 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_operazione(msk.get(F_DATAREG));
const TDate data_documento(msk.get(F_DATADOC)); const TDate data_documento(msk.get(F_DATADOC));
const TString& numero_docext = msk.get(F_NUMDOCEXT); 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 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; tot_doc += ritenute;
TToken_string fppro_keys(msk.get(F_PROKEY), ';'); TToken_string fppro_keys(msk.get(F_PROKEY), ';');
const TString& keyprginvio = fppro_keys.get(); 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 // Controllo che i dati corrispondano a quelli nella fattura in ingresso
TString where_str; TString where_str;
where_str << " (PZ_DATA = \'" << data_documento.date2ansi() << "\'";
if (has_tot_doc(fppro_keys)) 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) << "\') "; where_str << " AND PQ_IMPTOTDOC = \'" << tot_doc << "\'";
else if(!numero_docext.empty())
where_str << " (PZ_DATA = \'" << data_documento.date2ansi() << "\' AND PZ_NUMERO = \'" << (!numero_docext.empty() ? numero_docext : numero_doc) << "\') "; where_str << " AND PZ_NUMERO = \'" << numero_docext << "\'";
TString& query = TPro_msk::query_fppro(keyprginvio, keyheaderfatt, keybodyfatt, where_str); 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); fp_db().sq_set_exec(query);
if(has_f1_db(&msk) && fp_db().sq_items() != 1) if(has_f1_db(&msk) && fp_db().sq_items() != 1)
{ {
warning_box(TString("Attenzione, ") << "al movimento non è stato abbinato nessun documento elettronico.\n" << 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" << "Per consentire una corretta archiviazione sostitutiva si consiglia di provvedere al controllo della registrazione e di procedere\n" <<
"all'identificazione del fornitore tramite il monitor fatture passive.\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."); "In caso di documento escluso dalla fatturazione elettronica ignorate questo messaggio.");
return pro_notsaved; save_dbmov(true);
}
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.");
return pro_notsaved; return pro_notsaved;
} }
@ -2496,13 +2552,17 @@ int TPrimanota_application::save_fppro()
TString update_query; TString update_query;
update_query << "UPDATE FPPRO00F\n" << 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" << "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 << "\';"; "WHERE PZ_KEYPRGINVIO = \'" << keyprginvio << "\' AND PZ_KEYHEADERFATT = \'" << keyheaderfatt << "\' AND PZ_KEYBODYFATT = \'" << keybodyfatt << "\';";
fp_db().sq_set_exec(update_query); fp_db().sq_set_exec(update_query);
const bool saved = fp_db().sq_commit(); const bool saved = fp_db().sq_commit();
if (!saved) if (!saved)
{
error_box("Attenzione non è stato possibile registrare la fattura nel database."); error_box("Attenzione non è stato possibile registrare la fattura nel database.");
save_dbmov(true);
}
return saved? pro_noerr : pro_notsaved; 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)); real pimponibile(pag.imponibile(inv));
pimponibile.round(pag.round(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 a.set_scadenze(m); // Ricalcola rate
} }
} }
@ -3847,7 +3847,7 @@ bool TPrimanota_application::quadratura_handler(TMask_field& f, KEY key)
return true; 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); TSheet_field& sf = cg_msk.sfield(F_SHEETIVA);
const vector<TPro_msk::riga_iva_s>& righe = msk->get_righeiva(); 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::write_scad_f1(const TMask& cg_msk, const shared_ptr<TPro_msk>& msk)
bool TPrimanota_application::set_scadenze_f1(const TMask& cg_msk, const shared_ptr<TPro_msk>& msk)
{ {
TSheet_field& sf = cg_msk.sfield(FS_RATESHEET); TSheet_field& sf = cg_msk.sfield(FS_RATESHEET);
int items = sf.items();
const vector<TPro_msk::scadenza_s>& righe = msk->get_scadenze(); const vector<TPro_msk::scadenza_s>& righe = msk->get_scadenze();
int i = 0; int i = 0;
for (auto it = righe.begin(); it != righe.end(); ++it, ++i) 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->data, cid2index(101));
row.add(it->importo, cid2index(102)); row.add(it->importo, cid2index(102));
pag_notify(sf, i, K_ENTER);
} }
return !righe.empty(); 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); TLocalisamfile clifo(LF_CLIFO);
clifo.setkey(5); clifo.setkey(5);
@ -3913,6 +3919,7 @@ void TPrimanota_application::set_totale(TMask& cg_msk, const shared_ptr<TPro_msk
{ {
totale -= rit; totale -= rit;
cg_msk.set(F_RITFIS, rit); cg_msk.set(F_RITFIS, rit);
app().add_cgs_ritenute('F');
} }
cg_msk.set(F_TOTALE, totale); 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_NUMDOC, msk->get_numdoc().right(7));
cg_msk.set(F_DATADOC, msk->get_datadoc()); cg_msk.set(F_DATADOC, msk->get_datadoc());
if (!cg_msk.get(F_CODCLIFOR).full() && msk->get_numdoc().full()) if (!cg_msk.get(F_CODCLIFOR).full() && msk->get_numdoc().full())
set_clifo(cg_msk, msk); write_clifo(cg_msk, msk);
set_righe_iva_f1(cg_msk, msk); write_righe_iva_f1(cg_msk, msk);
set_totale(cg_msk, msk); set_totale(cg_msk, msk);
if (set_scadenze_f1(cg_msk, msk)) cg_msk.set(FS_RECALC, ""); cg_msk.disable(FS_RDIFFER); cg_msk.disable(FS_MCOMM); cg_msk.disable(FS_NRATE);
cg_msk.set(FS_RECALC, ""); if(write_scad_f1(cg_msk, msk))
app().set_scad_f1(cg_msk);
} }
bool TPrimanota_application::fppro_mask(TMask_field& f, KEY key) 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(); msk->run();
// Riporto dati FPPRO su maschera Prima Nota (solo se hai F1) // Riporto dati FPPRO su maschera Prima Nota (solo se hai F1)
// Se non hai F1 collego senza riportarti i dati (solo le chiavi db) // 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); riporta_dati_f1(cg_msk, msk);
//TConfig ini("cg2CONTAB0001.ini");
//app().ini2mask(ini, cg_msk, false);
}
cg_msk.set(F_PROKEY, msk->get_fpprokeys()); cg_msk.set(F_PROKEY, msk->get_fpprokeys());
is_collegato(cg_msk.field(F_COLFPPRO)); is_collegato(cg_msk.field(F_COLFPPRO));
cg_msk.set(F_ANNORIF, cg_msk.get(F_ANNOIVA)); 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_TIPOPROT"));
row.add(fp_db().sq_get("PZ_NUMPROT")); row.add(fp_db().sq_get("PZ_NUMPROT"));
row.add(keys); row.add(keys);
} }
sf.force_update(); sf.force_update();
sf.show(); sf.show();
@ -4204,12 +4214,6 @@ void TPro_msk::add_scad(const TDate& date, const real& importo)
_scadenze.insert(_scadenze.end(), { date, 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) TString& TPro_msk::query_fppro(const TString& codforn, const TString& date)
{ {
return query_fppro(codforn, "", "", "", date, "", "", "", true, false); 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() << "' "; query << " PZ_DATA = '" << TDate(date).date2ansi() << "' ";
if (order) if (order)
query << "\nORDER BY P1_DATAORARIC ASC"; query << "\nORDER BY P1_DATAORARIC ASC, PZ_TIPOPROT ASC, PZ_NUMPROT ASC";
query << ";"; query << ";";
} }
else 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; 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) void TPro_msk::abilita_piva(TMask* msk)
{ {
if (msk->get_bool(F_ENABSEARCH)) 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 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 void write_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 bool write_scad_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_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 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); static void riporta_dati_f1(TMask& cg_msk, const shared_ptr<TPro_msk>& msk);
// Handlers per aggancio FPPRO // Handlers per aggancio FPPRO
@ -210,6 +210,7 @@ protected: // TApplication
virtual void print(); virtual void print();
void dump_rec(TConfig & ini, const TRectype & rec, int row = 0, int pref = 0); 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 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 ini2mask(TConfig& ini, TMask& msk, bool query);
virtual void mask2ini(const TMask& msk, TConfig& ini); virtual void mask2ini(const TMask& msk, TConfig& ini);
@ -227,6 +228,8 @@ protected: // TApplication
// setta variabili prima del controllo has_f1_db // setta variabili prima del controllo has_f1_db
void set_has_f1_db(TMask* m); void set_has_f1_db(TMask* m);
bool 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); virtual bool save(bool check_dirty);
@ -459,11 +462,10 @@ public:
void add_scad(const TDate& date, const real& importo); void add_scad(const TDate& date, const real& importo);
bool should_bring_back() const { return _riporta; } 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& codforn, const TString& date);
static TString& query_fppro(const TString& stato_piva, const TString& piva, 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_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); static void abilita_piva(TMask* msk);
//bool is_fp(); //bool is_fp();
// Carica documenti FPPRO sulla maschera // Carica documenti FPPRO sulla maschera

View File

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

View File

@ -155,6 +155,23 @@ TDate TFppro::get_data_first_doc() const
return _db->sq_get_date("DATA"); 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() bool TFppro::set_query()
{ {
if (_keys_setted) if (_keys_setted)
@ -167,8 +184,8 @@ bool TFppro::set_query()
const char* TFppro::where_str() const const char* TFppro::where_str() const
{ {
TString str; static TString str;
str << " WHERE PZ_KEYPRGINVIO = '" << _keys.prginvio << "' AND PZ_KEYHEADERFATT = '" << _keys.headerfatt << "' AND PZ_KEYBODYFATT = '" << _keys.bodyfatt << "'"; str.cut(0) << " WHERE PZ_KEYPRGINVIO = '" << _keys.prginvio << "' AND PZ_KEYHEADERFATT = '" << _keys.headerfatt << "' AND PZ_KEYBODYFATT = '" << _keys.bodyfatt << "'";
return str; return str;
} }

View File

@ -54,11 +54,14 @@ public:
TDate get_datareg(TToken_string& keys); TDate get_datareg(TToken_string& keys);
real get_ritenute() const; real get_ritenute() const;
TDate get_data_first_doc() const; TDate get_data_first_doc() const;
TDate get_dataorarioric() const;
int get_numregcont() const;
// Setters // Setters
bool set_query(); bool set_query();
TFppro& set_keys(TToken_string& keys); TFppro& set_keys(TToken_string& keys);
TFppro& set_keys(keys_s keys); TFppro& set_keys(keys_s keys);
static bool set_connection(SSimple_query& s); static bool set_connection(SSimple_query& s);
TFppro(); TFppro();

View File

@ -743,14 +743,13 @@ bool TDoc2Paf::create()
{ {
open_files(LF_TAB, LF_TABCOM, LF_TABMOD, LF_ANAG, open_files(LF_TAB, LF_TABCOM, LF_TABMOD, LF_ANAG,
LF_CLIFO, LF_CFVEN, LF_CFBAN, LF_NDITTE, 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 if (cfven.length(CFV_PADESTIN) != 7) // Nuova lunghezza per privati
return error_box(TR("Database non convertito per fatturazione F.P.")); return error_box(TR("Database non convertito per fatturazione F.P."));
return check_tables() && TSkeleton_application::create(); return check_tables() && TSkeleton_application::create();
} }
bool TDoc2Paf::destroy() bool TDoc2Paf::destroy()

View File

@ -388,7 +388,8 @@ private:
enum TFP_operator { error, eq, neq, gt, ls, gteq, lseq, and, or }; enum TFP_operator { error, eq, neq, gt, ls, gteq, lseq, and, or };
// Etrattori // 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 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 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); static TVariant& get_value(const TRectype& rec, const TString& campo);

View File

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

View File

@ -255,8 +255,6 @@ TFP_custom_cache::TFP_custom_cache()
} }
} }
/****************************************************************************** /******************************************************************************
* TFP_expression * 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 // Prendo la stringa pulita della parte sinistra
TString clean_expr = expr.mid(expr.find('(') + 1); 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 // Trimmare sempre come se non sapessi fare altro nella vita
tabella.cut(0) << info.remove(0); tabella.trim(); tabella.cut(0) << info.remove(0); tabella.trim();
campo.cut(0) << info.remove(0); campo.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 TToken_string app(tabella, '.');
search->cut(0) << info; tabella = app.get();
search->trim(); key = atoi(app.get());
search->restart();
} }
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) 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) TVariant& TFP_expression::parse_read(const TString& str, TRiga_documento& rdoc)
{ {
TString tabella, campo; TString tabella, campo;
extract_info(str, tabella, campo, nullptr); extract_info(str, tabella, campo);
return do_read(tabella, campo, rdoc); return do_read(tabella, campo, rdoc);
} }
TVariant& TFP_expression::do_read(const TString& tabella, const TString& campo, TRiga_documento& 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 // Prima di tutto controllo se è una delle tabelle multitracciato che supporto
if(tabella == "%TIP") 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; int file;
@ -568,17 +600,19 @@ TVariant& TFP_expression::do_read(const TString& tabella, const TString& campo,
switch (file) switch (file)
{ {
case LF_DOC: case LF_DOC:
return get_value(rdoc.doc(), campo); return get_value(doc, campo);
case LF_RIGHEDOC: case LF_RIGHEDOC:
return get_value(rdoc, campo); return get_value(rdoc, campo);
case LF_CLIFO: case LF_CLIFO:
return get_value(rdoc.doc().clifor(), campo); return get_value(doc.clifor(), campo);
case LF_CFVEN: case LF_CFVEN:
return get_value(rdoc.doc().clifor().vendite(), campo); return get_value(doc.clifor().vendite(), campo);
case LF_LETINT: case LF_LETINT:
return get_value(rdoc.doc().clifor().lettera(), campo); return get_value(doc.clifor().lettera(), campo);
case LF_ANAMAG: case LF_ANAMAG:
return get_value(rdoc.articolo(), campo); return get_value(rdoc.articolo(), campo);
case LF_CODCORR:
return get_value(cache().get(LF_CODCORR, rdoc.articolo().codice()), campo);
default: default:
static TVariant null_var(EMPTY_STRING); static TVariant null_var(EMPTY_STRING);
return null_var; 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) TVariant& TFP_expression::parse_search(const TString& str, TRiga_documento& rdoc)
{ {
TString tabella, campo; TString tabella, campo;
TToken_string input_search, search; TToken_string input_search("", ';'), search;
int file; 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); const bool multi_table = calc_table(tabella, file);
// Parso ogni singolo token della ricerca // Parso ogni singolo token della ricerca
@ -602,10 +636,10 @@ TVariant& TFP_expression::parse_search(const TString& str, TRiga_documento& rdoc
if (multi_table) if (multi_table)
{ {
return get_value(cache().get(tabella, search), campo); return get_value(cache().get(tabella, search, key), campo);
} }
else 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; 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; 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); 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 TRectype& TDB_cache::get(const TRectype& curr)
{ {
const int num = curr.num(); // Numero logico del file (o tabella) const int num = curr.num(); // Numero logico del file (o tabella)

View File

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