Merge branch 'R_10_00' of http://10.65.20.33/sirio/CAMPO/campo into R_10_00
This commit is contained in:
commit
2a0e4a537c
17
lib/.gitignore
vendored
Normal file
17
lib/.gitignore
vendored
Normal 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
|
BIN
lib/AgaLib.lib
BIN
lib/AgaLib.lib
Binary file not shown.
Binary file not shown.
BIN
lib/Uno.lib
BIN
lib/Uno.lib
Binary file not shown.
BIN
lib/cb6.exp
BIN
lib/cb6.exp
Binary file not shown.
BIN
lib/cb6.lib
BIN
lib/cb6.lib
Binary file not shown.
BIN
lib/gfm.exp
BIN
lib/gfm.exp
Binary file not shown.
BIN
lib/gfm.lib
BIN
lib/gfm.lib
Binary file not shown.
BIN
lib/hlw32_mc.lib
BIN
lib/hlw32_mc.lib
Binary file not shown.
BIN
lib/pdflib.exp
BIN
lib/pdflib.exp
Binary file not shown.
BIN
lib/pdflib.lib
BIN
lib/pdflib.lib
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
lib/vedoc.lib
BIN
lib/vedoc.lib
Binary file not shown.
BIN
lib/vedocext.lib
BIN
lib/vedocext.lib
Binary file not shown.
BIN
lib/xi.bsc
BIN
lib/xi.bsc
Binary file not shown.
BIN
lib/xi.exp
BIN
lib/xi.exp
Binary file not shown.
BIN
lib/xi.lib
BIN
lib/xi.lib
Binary file not shown.
BIN
lib/xid.exp
BIN
lib/xid.exp
Binary file not shown.
BIN
lib/xid.lib
BIN
lib/xid.lib
Binary file not shown.
BIN
lib/xvaga.bsc
BIN
lib/xvaga.bsc
Binary file not shown.
BIN
lib/xvaga.exp
BIN
lib/xvaga.exp
Binary file not shown.
BIN
lib/xvaga.lib
BIN
lib/xvaga.lib
Binary file not shown.
BIN
lib/xvapp.lib
BIN
lib/xvapp.lib
Binary file not shown.
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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))
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
|
@ -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()
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user