diff --git a/lib/.gitignore b/lib/.gitignore new file mode 100644 index 000000000..7d1321348 --- /dev/null +++ b/lib/.gitignore @@ -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 diff --git a/lib/AgaLib.lib b/lib/AgaLib.lib deleted file mode 100644 index c4ac0ecf0..000000000 Binary files a/lib/AgaLib.lib and /dev/null differ diff --git a/lib/ServerLib.lib b/lib/ServerLib.lib deleted file mode 100644 index 6dd387d58..000000000 Binary files a/lib/ServerLib.lib and /dev/null differ diff --git a/lib/Uno.lib b/lib/Uno.lib deleted file mode 100644 index 584c6e2eb..000000000 Binary files a/lib/Uno.lib and /dev/null differ diff --git a/lib/cb6.exp b/lib/cb6.exp deleted file mode 100644 index 7efc024e8..000000000 Binary files a/lib/cb6.exp and /dev/null differ diff --git a/lib/cb6.lib b/lib/cb6.lib deleted file mode 100644 index eae1e8ab6..000000000 Binary files a/lib/cb6.lib and /dev/null differ diff --git a/lib/gfm.exp b/lib/gfm.exp deleted file mode 100644 index bee7555c3..000000000 Binary files a/lib/gfm.exp and /dev/null differ diff --git a/lib/gfm.lib b/lib/gfm.lib deleted file mode 100644 index 9a0c91fdf..000000000 Binary files a/lib/gfm.lib and /dev/null differ diff --git a/lib/hlw32_mc.lib b/lib/hlw32_mc.lib deleted file mode 100644 index c0a1902d9..000000000 Binary files a/lib/hlw32_mc.lib and /dev/null differ diff --git a/lib/pdflib.exp b/lib/pdflib.exp deleted file mode 100644 index 13064f3ff..000000000 Binary files a/lib/pdflib.exp and /dev/null differ diff --git a/lib/pdflib.lib b/lib/pdflib.lib deleted file mode 100644 index 0c1b12e23..000000000 Binary files a/lib/pdflib.lib and /dev/null differ diff --git a/lib/pdflib_dll.bsc b/lib/pdflib_dll.bsc deleted file mode 100644 index 2028921da..000000000 Binary files a/lib/pdflib_dll.bsc and /dev/null differ diff --git a/lib/pdflibwrap.lib b/lib/pdflibwrap.lib deleted file mode 100644 index 3851f1b40..000000000 Binary files a/lib/pdflibwrap.lib and /dev/null differ diff --git a/lib/vedoc.lib b/lib/vedoc.lib deleted file mode 100644 index f174616c6..000000000 Binary files a/lib/vedoc.lib and /dev/null differ diff --git a/lib/vedocext.lib b/lib/vedocext.lib deleted file mode 100644 index 5d8bfa873..000000000 Binary files a/lib/vedocext.lib and /dev/null differ diff --git a/lib/xi.bsc b/lib/xi.bsc deleted file mode 100644 index f1b4d5143..000000000 Binary files a/lib/xi.bsc and /dev/null differ diff --git a/lib/xi.exp b/lib/xi.exp deleted file mode 100644 index 5491c02da..000000000 Binary files a/lib/xi.exp and /dev/null differ diff --git a/lib/xi.lib b/lib/xi.lib deleted file mode 100644 index da06f540b..000000000 Binary files a/lib/xi.lib and /dev/null differ diff --git a/lib/xid.exp b/lib/xid.exp deleted file mode 100644 index 1f06ec738..000000000 Binary files a/lib/xid.exp and /dev/null differ diff --git a/lib/xid.lib b/lib/xid.lib deleted file mode 100644 index b91f53864..000000000 Binary files a/lib/xid.lib and /dev/null differ diff --git a/lib/xvaga.bsc b/lib/xvaga.bsc deleted file mode 100644 index d73b3d449..000000000 Binary files a/lib/xvaga.bsc and /dev/null differ diff --git a/lib/xvaga.exp b/lib/xvaga.exp deleted file mode 100644 index d07b9e6d2..000000000 Binary files a/lib/xvaga.exp and /dev/null differ diff --git a/lib/xvaga.lib b/lib/xvaga.lib deleted file mode 100644 index 4647cfa7a..000000000 Binary files a/lib/xvaga.lib and /dev/null differ diff --git a/lib/xvapp.lib b/lib/xvapp.lib deleted file mode 100644 index 431bbe7c0..000000000 Binary files a/lib/xvapp.lib and /dev/null differ diff --git a/src/cg/cg2100.cpp b/src/cg/cg2100.cpp index ecd10ae5f..a2c353069 100755 --- a/src/cg/cg2100.cpp +++ b/src/cg/cg2100.cpp @@ -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; } diff --git a/src/cg/cg2102.cpp b/src/cg/cg2102.cpp index f93bfb3f7..fb293e2d0 100755 --- a/src/cg/cg2102.cpp +++ b/src/cg/cg2102.cpp @@ -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& msk) +void TPrimanota_application::write_righe_iva_f1(TMask& cg_msk, const shared_ptr& msk) { TSheet_field& sf = cg_msk.sfield(F_SHEETIVA); const vector& righe = msk->get_righeiva(); @@ -3867,22 +3867,28 @@ void TPrimanota_application::set_righe_iva_f1(TMask& cg_msk, const shared_ptr& msk) +bool TPrimanota_application::write_scad_f1(const TMask& cg_msk, const shared_ptr& msk) { TSheet_field& sf = cg_msk.sfield(FS_RATESHEET); + int items = sf.items(); const vector& 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& msk) +void TPrimanota_application::write_clifo(TMask& cg_msk, const shared_ptr& msk) { TLocalisamfile clifo(LF_CLIFO); clifo.setkey(5); @@ -3913,6 +3919,7 @@ void TPrimanota_application::set_totale(TMask& cg_msk, const shared_ptrget_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)) diff --git a/src/cg/cg2102.h b/src/cg/cg2102.h index ef9b7ea6b..877060257 100755 --- a/src/cg/cg2102.h +++ b/src/cg/cg2102.h @@ -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& msk); - static bool set_scadenze_f1(const TMask& cg_msk, const shared_ptr& msk); - static void set_clifo(TMask& cg_msk, const shared_ptr& msk); + static void write_righe_iva_f1(TMask& cg_msk, const shared_ptr& msk); + static bool write_scad_f1(const TMask& cg_msk, const shared_ptr& msk); + static void write_clifo(TMask& cg_msk, const shared_ptr& msk); static void set_totale(TMask& cg_msk, const shared_ptr& msk); static void riporta_dati_f1(TMask& cg_msk, const shared_ptr& 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 diff --git a/src/cg/cg2FPPRO.uml b/src/cg/cg2FPPRO.uml index 1aef4bbe9..e5c69926e 100644 --- a/src/cg/cg2FPPRO.uml +++ b/src/cg/cg2FPPRO.uml @@ -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 diff --git a/src/f1/f1lib.cpp b/src/f1/f1lib.cpp index ea595f7bf..645f09fe3 100644 --- a/src/f1/f1lib.cpp +++ b/src/f1/f1lib.cpp @@ -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; } diff --git a/src/f1/f1lib.h b/src/f1/f1lib.h index d217fcd0e..881805a43 100644 --- a/src/f1/f1lib.h +++ b/src/f1/f1lib.h @@ -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(); diff --git a/src/fp/fp0300.cpp b/src/fp/fp0300.cpp index d0e0d28d8..671cc674d 100644 --- a/src/fp/fp0300.cpp +++ b/src/fp/fp0300.cpp @@ -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() diff --git a/src/fp/fplib.h b/src/fp/fplib.h index 98dc27781..7eb4c7646 100644 --- a/src/fp/fplib.h +++ b/src/fp/fplib.h @@ -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); diff --git a/src/fp/fplib01.cpp b/src/fp/fplib01.cpp index 6d9a64aff..dcf5b75d0 100644 --- a/src/fp/fplib01.cpp +++ b/src/fp/fplib01.cpp @@ -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; diff --git a/src/fp/fplib05.cpp b/src/fp/fplib05.cpp index 672fbd1e8..c486b54a0 100644 --- a/src/fp/fplib05.cpp +++ b/src/fp/fplib05.cpp @@ -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); } } diff --git a/src/include/recarray.cpp b/src/include/recarray.cpp index bafdd3ced..f6ef8ac1d 100755 --- a/src/include/recarray.cpp +++ b/src/include/recarray.cpp @@ -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) diff --git a/src/include/recarray.h b/src/include/recarray.h index 2dfb7d425..b49293570 100755 --- a/src/include/recarray.h +++ b/src/include/recarray.h @@ -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);