diff --git a/src/fp/fp0.cpp b/src/fp/fp0.cpp index d9f0e7f40..180497485 100644 --- a/src/fp/fp0.cpp +++ b/src/fp/fp0.cpp @@ -13,7 +13,9 @@ int main(int argc, char** argv) case 3: rt = fp0400(argc, argv); break; // Monitor fatture passive case 4: rt = fp0500(argc, argv); break; // Customizzazioni FP per utente case 5: rt = fp0600(argc, argv); break; // Da fare + case 6: rt = fp0700(argc, argv); break; //Invio regolarizzazioni INTRA default: rt = fp0100(argc, argv); break; // Configurazione + } return rt; } diff --git a/src/fp/fp0.h b/src/fp/fp0.h index 2bedaf6f5..644ea910d 100644 --- a/src/fp/fp0.h +++ b/src/fp/fp0.h @@ -7,5 +7,6 @@ int fp0300(int argc, char* argv[]); int fp0400(int argc, char* argv[]); int fp0500(int argc, char* argv[]); int fp0600(int argc, char* argv[]); +int fp0700(int argc, char* argv[]); #endif diff --git a/src/fp/fp0700.cpp b/src/fp/fp0700.cpp new file mode 100644 index 000000000..82f2c8513 --- /dev/null +++ b/src/fp/fp0700.cpp @@ -0,0 +1,773 @@ +#include +#include +#include +#include "fplib.h" +#include +#include +#include + +#include "../ve/velib05.h" +#include "../fe/felib.h" + +#include "fp0.h" +#include "fp0700a.h" +#include "fp0100a.h" + +///////////////////////////////////////////////////////////////////////////////////// +// Globals +///////////////////////////////////////////////////////////////////////////////////// + +#define LEN_HFATT 20 +#define LEN_BFATT 50 + +///////////////////////////////////////////////////////////////////////////////////// +// TPAR_mask +///////////////////////////////////////////////////////////////////////////////////// + +class TPAR_mask : public TAutomask +{ +protected: + enum {_codnum, _tipodoc, _dastato, _astato, _tiposdi}; + + void set_filter_changed(); + void set_pronto(); + void connect_keys(); + void export_paf(); + bool on_field_event(TOperable_field& o, TField_event e, long jolly) override; + void next_page(int p) override; + bool on_key(KEY key) override; + bool check_not_empty(); + bool check_full_fields() const; + bool check_doc_filter(const TDocumentoEsteso& td) const; + void set_err_paf(); + void fill(); + void init(); + void force_reload_sheet(); + + void load_all_fields(); + + bool _filter_changed; + bool _enable_chiave_fixer; + +public: + TPAR_mask() : TAutomask("fp0700a"), _filter_changed(true), _enable_chiave_fixer(false) + { + disable(DLG_OK); + disable(DLG_SAVEREC); + disable(DLG_FINDREC); + load_all_fields(); + const TDate data_inizio = get_date_start_new_fatt(); + + } + void save_all_fields() const; +}; + +void TPAR_mask::save_all_fields() const +{ + ini_set_string(CONFIG_DITTA, "fp", "dataini", get(F_DATAINI)); + ini_set_string(CONFIG_DITTA, "fp", "dataend", get(F_DATAEND)); + + // Salvo lo sheet + TFP_selected_docs selected_docs; + selected_docs.save_sheet(sfield(F_CAUSALI_TIPO)); + + // Salvo le impostazioni +/* + set_esp_pri_empty(get_bool(F_SETDEFCOD)); + set_send_all_rifs(get_bool(F_SENDALLRIFS)); + set_esp_est(get_bool(F_SETCODEST)); + set_esp_est_cod(get(F_VALCODEST)); +*/ + +} + +void TPAR_mask::force_reload_sheet() +{ + // Mi sposto nella prima pagina, setto il flag di dirty sul filtro e mi risposto + // Lo faccio perché eliminando la riga direttamente e chiamando la force_update() si crea un bug che cliccando sulla prima riga viene mostrata quella che c'era prima della eliminazione + TAutomask::next_page(0); + set_focus_field(F_DATAINI); + _filter_changed = true; + next_page(1); +} + +void TPAR_mask::load_all_fields() +{ + set(F_DATAINI, ini_get_string(CONFIG_DITTA, "fp", "dataini")); + set(F_DATAEND, ini_get_string(CONFIG_DITTA, "fp", "dataend")); + + const TToken_string s_accepted_docs(ini_get_string(CONFIG_DITTA, "fp", "accepted_docs"), ';'); + // + TSheet_field& sheet = sfield(F_CAUSALI_TIPO); + + TFP_selected_regs selected_regs; + + if (selected_regs.has_selected_regs()) + { + // Super nuova gestione super avanzata! + selected_regs.fill_sheet(sheet); + } + else if(s_accepted_docs.full()) + { + // Nuova gestione avanzata! + FOR_EACH_STR_TOKEN(s_accepted_docs, tok) + { + TToken_string& row = sheet.row(-1); + row.add(tok); + row.add(TTipo_documento(TToken_string(tok).get(1)).tipo_doc_sdi()); + } + } + else + { + // Vecchia gestione ): + const TString& codnum = ini_get_string(CONFIG_DITTA, "fp", "codnum"); + TToken_string tipidocs(ini_get_string(CONFIG_DITTA, "fp", "tipodocs")); + FOR_EACH_STR_TOKEN(tipidocs, tok) + { + TToken_string& row = sheet.row(-1); + row.add(codnum); + row.add(tok); + // Considero 1 e 9 come stati default? + row.add(1); + row.add(9); + row.add(TTipo_documento(tok).tipo_doc_sdi()); + } + } + sheet.force_update(); + sheet.show(); + + /* DA FARE + set(F_SETDEFCOD, get_esp_pri_empty()); + set(F_SENDALLRIFS, get_send_all_rifs()); + set(F_SETCODEST, get_esp_est()); + set(F_VALCODEST, get_esp_est_cod()); + */ + +} + +void TPAR_mask::fill() +{ + // Salvo subito su file le impostazioni di esportazione, in fplib accedo ai file + save_all_fields(); + + TSheet_field& docs = sfield(F_DOCS); + TString_array& sht = docs.rows_array(); + docs.hide(); + + sht.destroy(); + + const TDate dal = get(F_DATAINI); + const TDate al = get(F_DATAEND); + TString filter_selected = get(F_DOCSEL); + + enable(DLG_OK, filter_selected.empty() || filter_selected == "E"); + enable(DLG_SAVEREC, (is_f8() && filter_selected == "X") || filter_selected == "D"); + enable(DLG_FINDREC, filter_selected == "D"); + enable(DLG_PRINT, _enable_chiave_fixer && filter_selected.empty()); + + // Record di controllo per eventuali elaborazioni precedenti + TString hfatt(LEN_HFATT), bfatt(LEN_BFATT); + TPaf_record paf0100f("PAF0100F"); + + TString query; + + query << "USE 33 KEY 3 \n" << + "SELECT 33.TIPOCF==\"C\" \n" << + "JOIN 20 INTO TIPOCF==TIPOCF CODCF==CODCF \n" << + "JOIN 17 TO 33 INTO TIPOCF==TIPOCF CODCF==CODCF \n" << + "JOIN %TIP TO 33 ALIAS 400 INTO CODTAB==TIPODOC \n" << + "FROM DATADOC=#DADATADOC \n" << + "TO DATADOC=#ADATADOC"; + + TISAM_recordset rec(query); + + rec.set_var("#DADATADOC", dal); + rec.set_var("#ADATADOC", al); + + TProgress_monitor pi(rec.items(), nullptr); + + bool first, show, ask = !((show = (first = true))); + int fat_no_cod = 0; + + // Disabilito la colonna del codice ufficio + docs.enable_column(cid2index(S_UFFICIO), false); + const TDate data_inizio = get_date_start_new_fatt(); + + for (bool okc = rec.move_first(); okc; okc = rec.move_next()) + { + if (!pi.add_status()) + break; + const TRectype& doc = rec.cursor()->curr(); + const TTipo_documento& td = cached_tipodoc(doc.get(DOC_TIPODOC)); + + // Controllo che la numerazione sia tra quelle giuste + + // Controllo che il tipo documento sia OK + if(!check_doc_filter(doc)) + continue; + + bool sent = false; + if (chiave_paf(doc, hfatt, bfatt)) + { + if (paf0100f.search(nullptr, hfatt, bfatt) && paf0100f.sq_get("P1_GESTIONE") != " " && paf0100f.sq_get("P1_ERRINT") != "*") + { + if (paf0100f.sq_get("P1_GESTIONE") != filter_selected) + continue; + sent = true; + } + else if (filter_selected.not_empty()) + continue; + } + + TToken_string& row = docs.row(-1); + row = sent ? " " : "X"; + row.add(rec.get(DOC_ANNO).as_int(), 1); + row.add(rec.get(DOC_CODNUM).as_string()); + row.add(rec.get(DOC_TIPODOC).as_string()); + + TString tipodoc = rec.get(DOC_TIPODOCSDI).as_string(); + + if (tipodoc.blank()) + tipodoc = td.tipo_doc_sdi(); + if (today 0) + { + const TRectype& mov = cache().get(LF_MOV, numreg); + split = is_split_payment(mov); + } + } + row.add(split ? "X" : " "); + + const bool attach = !rec.get("COLL_GOLEM").is_empty(); + row.add(attach ? "X" : " "); + + row.add(!td.invio_xml() ? "X" : ""); + } + + docs.force_update(); + docs.show(); + + if (fat_no_cod > 0) + warning_box("Sono state trovate una o più fatture senza codice destinatario né pec"); +} + +void TPAR_mask::set_filter_changed() +{ + _filter_changed = true; +} + +void TPAR_mask::set_pronto() +{ + TString_array& sht = sfield(F_DOCS).rows_array(); + TProgress_monitor pi(sht.items(), "Esportazione Fatture"); + FOR_EACH_ARRAY_ROW(sht, r, riga) + { + if (!pi.add_status()) + break; + + if (!riga->starts_with("X")) + continue; + + static TString campo_hfatt, campo_bfatt, query; + TDocumento doc('D', riga->get_int(xvtil_cid2index(S_ANNO)), EMPTY_STRING, riga->get_long(xvtil_cid2index(S_NUMREG))); + + if (chiave_paf(doc, campo_hfatt, campo_bfatt)) + { + // Come prima cosa controllo che effettivamente la chiave di questo doc sia in giro per il mondo + query.cut(0) << "UPDATE PAF0100F SET P1_GESTIONE = 'P' WHERE P1_KEYHEADERFATT = '" << campo_hfatt << "' AND P1_KEYBODYFATT = '" << campo_bfatt << "'"; + fp_db().sq_set_exec(query); + } + } + + // Committo tutto + fp_db().sq_commit(); + force_reload_sheet(); +} + +void TPAR_mask::connect_keys() +{ + TString_array& sht = sfield(F_DOCS).rows_array(); + TLog_report legno("Allineamento chiavi documento"); + // Non sto a fare 8000 variabili, oggi mi sento a corto di Byte + static TString msg_log; + int updated = 0; + + if (sht.empty()) + { + warning_box("Impossibile allineare le chiavi di uno sheet vuoto!"); + return; + } + + TProgress_monitor pi(sht.items(), "Esportazione Fatture"); + FOR_EACH_ARRAY_ROW(sht, r, riga) + { + if (!pi.add_status()) + break; + + if (!riga->starts_with("X")) + continue; + + TDocumento doc('D', riga->get_int(xvtil_cid2index(S_ANNO)), EMPTY_STRING, riga->get_long(xvtil_cid2index(S_NUMREG))); + static TString campo_hfatt, campo_bfatt, query; + if (chiave_paf(doc, campo_hfatt, campo_bfatt)) + { + // Come prima cosa controllo che effettivamente la chiave di questo doc sia in giro per il mondo + query.cut(0) << "SELECT * FROM PAF0100F WHERE P1_KEYHEADERFATT = '" << campo_hfatt << "' AND P1_KEYBODYFATT = '" << campo_bfatt << "'"; + if(fp_db().sq_set_exec(query)) + { + msg_log.cut(0) << "Il documento " << campo_bfatt << " è già presente nel DB, verrà saltato"; + legno.log(9000, msg_log); + continue; + } + + // Provo a cercare il documento nel paf07 come un vero uomo + query.cut(0) << "SELECT P7_KEYPRGINVIO, P7_KEYHEADERFATT, P7_KEYBODYFATT FROM PAF0700F WHERE P7_KEYHEADERFATT = '" << campo_hfatt + << "' AND P7_TIPODOC = '" << tipo_doc_sdi(doc) << "' AND P7_DATA = '" << doc.data().date2ansi() << "' AND P7_NUMERO LIKE '%" << doc.numero() << "%'"; + + if (fp_db().sq_set_exec(query, false)) + { + bool found = false; + // Valori nel db + static TString db_prginv, db_hfatt, db_bfatt; + + // Posso avere più di un risulatato, per esempio se effettuo la fatturazione di gennaio potrei avere la fattura 1, 10 e 11 del cliente 100. + for (bool ok = fp_db().sq_set_exec(query); ok && !found; ok = fp_db().sq_next()) + { + db_prginv.cut(0) << fp_db().sq_get("P7_KEYPRGINVIO"); + db_hfatt.cut(0) << fp_db().sq_get("P7_KEYHEADERFATT"); + db_bfatt.cut(0) << fp_db().sq_get("P7_KEYBODYFATT"); + + // Adesso che ho trovato il documento vado a verificare per scrupolo anche le righe documento + query.cut(0) << "SELECT * FROM PAF1800F WHERE PI_KEYPRGINVIO = '" << db_prginv + << "' AND PI_KEYHEADERFATT = '" << db_hfatt + << "' AND PI_KEYBODYFATT = '" << db_bfatt << "'"; + + // Setto momentaneamente a true per ciclare sotto + found = true; + for (bool move_ok = fp_db().sq_set_exec(query); move_ok && found; move_ok = fp_db().sq_next()) + { + const TRiga_documento& rigadoc = doc[fp_db().sq_get_int("PI_NUMEROLINEA")]; + // Testo solo la qta, il prezzo è troppo complicato + const real& qta = rigadoc.quantita(); + found &= !qta.is_zero() ? qta == fp_db().sq_get_real("PI_QUANTITA") : fp_db().sq_get_real("PI_QUANTITA") <= UNO; + } + } + + if(!found) + { + msg_log.cut(0) << "Il documento " << campo_bfatt << " non è presente nel DB PAF, verrà saltato"; + legno.log(9000, msg_log); + continue; + } + else + { + query.cut(0) << + "UPDATE PAF0100F SET P1_KEYHEADERFATT = '" << campo_hfatt << "', P1_KEYBODYFATT = '" << campo_bfatt << "' WHERE P1_KEYPRGINVIO = '" << db_prginv << "' AND P1_KEYHEADERFATT = '" << db_hfatt << "' AND P1_KEYBODYFATT = '" << db_bfatt << "'\n" << + "UPDATE PAF0200F SET P2_KEYHEADERFATT = '" << campo_hfatt << "', P2_KEYBODYFATT = '" << campo_bfatt << "' WHERE P2_KEYPRGINVIO = '" << db_prginv << "' AND P2_KEYHEADERFATT = '" << db_hfatt << "' AND P2_KEYBODYFATT = '" << db_bfatt << "'\n" << + "UPDATE PAF0400F SET P4_KEYHEADERFATT = '" << campo_hfatt << "', P4_KEYBODYFATT = '" << campo_bfatt << "' WHERE P4_KEYPRGINVIO = '" << db_prginv << "' AND P4_KEYHEADERFATT = '" << db_hfatt << "' AND P4_KEYBODYFATT = '" << db_bfatt << "'\n" << + "UPDATE PAF0700F SET P7_KEYHEADERFATT = '" << campo_hfatt << "', P7_KEYBODYFATT = '" << campo_bfatt << "' WHERE P7_KEYPRGINVIO = '" << db_prginv << "' AND P7_KEYHEADERFATT = '" << db_hfatt << "' AND P7_KEYBODYFATT = '" << db_bfatt << "'\n" << + "UPDATE PAF0800F SET P8_KEYHEADERFATT = '" << campo_hfatt << "', P8_KEYBODYFATT = '" << campo_bfatt << "' WHERE P8_KEYPRGINVIO = '" << db_prginv << "' AND P8_KEYHEADERFATT = '" << db_hfatt << "' AND P8_KEYBODYFATT = '" << db_bfatt << "'\n" << + "UPDATE PAF1000F SET P0_KEYHEADERFATT = '" << campo_hfatt << "', P0_KEYBODYFATT = '" << campo_bfatt << "' WHERE P0_KEYPRGINVIO = '" << db_prginv << "' AND P0_KEYHEADERFATT = '" << db_hfatt << "' AND P0_KEYBODYFATT = '" << db_bfatt << "'\n" << + "UPDATE PAF1100F SET PA_KEYHEADERFATT = '" << campo_hfatt << "', PA_KEYBODYFATT = '" << campo_bfatt << "' WHERE PA_KEYPRGINVIO = '" << db_prginv << "' AND PA_KEYHEADERFATT = '" << db_hfatt << "' AND PA_KEYBODYFATT = '" << db_bfatt << "'\n" << + "UPDATE PAF1200F SET PB_KEYHEADERFATT = '" << campo_hfatt << "', PB_KEYBODYFATT = '" << campo_bfatt << "' WHERE PB_KEYPRGINVIO = '" << db_prginv << "' AND PB_KEYHEADERFATT = '" << db_hfatt << "' AND PB_KEYBODYFATT = '" << db_bfatt << "'\n" << + "UPDATE PAF1600F SET PF_KEYHEADERFATT = '" << campo_hfatt << "', PF_KEYBODYFATT = '" << campo_bfatt << "' WHERE PF_KEYPRGINVIO = '" << db_prginv << "' AND PF_KEYHEADERFATT = '" << db_hfatt << "' AND PF_KEYBODYFATT = '" << db_bfatt << "'\n" << + "UPDATE PAF1700F SET PG_KEYHEADERFATT = '" << campo_hfatt << "', PG_KEYBODYFATT = '" << campo_bfatt << "' WHERE PG_KEYPRGINVIO = '" << db_prginv << "' AND PG_KEYHEADERFATT = '" << db_hfatt << "' AND PG_KEYBODYFATT = '" << db_bfatt << "'\n" << + "UPDATE PAF1800F SET PI_KEYHEADERFATT = '" << campo_hfatt << "', PI_KEYBODYFATT = '" << campo_bfatt << "' WHERE PI_KEYPRGINVIO = '" << db_prginv << "' AND PI_KEYHEADERFATT = '" << db_hfatt << "' AND PI_KEYBODYFATT = '" << db_bfatt << "'\n" << + "UPDATE PAF1900F SET PY_KEYHEADERFATT = '" << campo_hfatt << "', PY_KEYBODYFATT = '" << campo_bfatt << "' WHERE PY_KEYPRGINVIO = '" << db_prginv << "' AND PY_KEYHEADERFATT = '" << db_hfatt << "' AND PY_KEYBODYFATT = '" << db_bfatt << "'\n" << + "UPDATE PAF2000F SET PJ_KEYHEADERFATT = '" << campo_hfatt << "', PJ_KEYBODYFATT = '" << campo_bfatt << "' WHERE PJ_KEYPRGINVIO = '" << db_prginv << "' AND PJ_KEYHEADERFATT = '" << db_hfatt << "' AND PJ_KEYBODYFATT = '" << db_bfatt << "'\n" << + "UPDATE PAF2100F SET PK_KEYHEADERFATT = '" << campo_hfatt << "', PK_KEYBODYFATT = '" << campo_bfatt << "' WHERE PK_KEYPRGINVIO = '" << db_prginv << "' AND PK_KEYHEADERFATT = '" << db_hfatt << "' AND PK_KEYBODYFATT = '" << db_bfatt << "'\n" << + "UPDATE PAF2200F SET PL_KEYHEADERFATT = '" << campo_hfatt << "', PL_KEYBODYFATT = '" << campo_bfatt << "' WHERE PL_KEYPRGINVIO = '" << db_prginv << "' AND PL_KEYHEADERFATT = '" << db_hfatt << "' AND PL_KEYBODYFATT = '" << db_bfatt << "'\n" << + "UPDATE PAF2400F SET PN_KEYHEADERFATT = '" << campo_hfatt << "', PN_KEYBODYFATT = '" << campo_bfatt << "' WHERE PN_KEYPRGINVIO = '" << db_prginv << "' AND PN_KEYHEADERFATT = '" << db_hfatt << "' AND PN_KEYBODYFATT = '" << db_bfatt << "'\n" << + "UPDATE PAF2500F SET PO_KEYHEADERFATT = '" << campo_hfatt << "', PO_KEYBODYFATT = '" << campo_bfatt << "' WHERE PO_KEYPRGINVIO = '" << db_prginv << "' AND PO_KEYHEADERFATT = '" << db_hfatt << "' AND PO_KEYBODYFATT = '" << db_bfatt << "'\n" << + "UPDATE PAF2600F SET PP_KEYHEADERFATT = '" << campo_hfatt << "', PP_KEYBODYFATT = '" << campo_bfatt << "' WHERE PP_KEYPRGINVIO = '" << db_prginv << "' AND PP_KEYHEADERFATT = '" << db_hfatt << "' AND PP_KEYBODYFATT = '" << db_bfatt << "'\n" << + "UPDATE PAF2700F SET PQ_KEYHEADERFATT = '" << campo_hfatt << "', PQ_KEYBODYFATT = '" << campo_bfatt << "' WHERE PQ_KEYPRGINVIO = '" << db_prginv << "' AND PQ_KEYHEADERFATT = '" << db_hfatt << "' AND PQ_KEYBODYFATT = '" << db_bfatt << "'\n" << + "UPDATE PAF3000F SET PT_KEYHEADERFATT = '" << campo_hfatt << "', PT_KEYBODYFATT = '" << campo_bfatt << "' WHERE PT_KEYPRGINVIO = '" << db_prginv << "' AND PT_KEYHEADERFATT = '" << db_hfatt << "' AND PT_KEYBODYFATT = '" << db_bfatt << "'\n" << + "UPDATE PAF3200F SET PU_KEYHEADERFATT = '" << campo_hfatt << "', PU_KEYBODYFATT = '" << campo_bfatt << "' WHERE PU_KEYPRGINVIO = '" << db_prginv << "' AND PU_KEYHEADERFATT = '" << db_hfatt << "' AND PU_KEYBODYFATT = '" << db_bfatt << "'\n" << + "UPDATE PAFW300F SET PW_KEYHEADERFATT = '" << campo_hfatt << "', PW_KEYBODYFATT = '" << campo_bfatt << "' WHERE PW_KEYPRGINVIO = '" << db_prginv << "' AND PW_KEYHEADERFATT = '" << db_hfatt << "' AND PW_KEYBODYFATT = '" << db_bfatt << "'\n"; + + if(fp_db().sq_set_exec(query)) + { + msg_log.cut(0) << "Il documento " << campo_bfatt << " e' stato aggiornato correttamente\nChiave precedente: " << db_bfatt << " chiave nuova: " << campo_bfatt; + legno.log(0, msg_log); + updated++; + } + } + } + } + } + if (fp_db().sq_commit()) + { + msg_log.cut(0) << "Aggiornati " << updated << " documenti"; + legno.log(0, msg_log); + } + + legno.preview(); + force_reload_sheet(); +} + +void TPAR_mask::export_paf() +{ + int ndocs = 0; + TLocalisamfile doc(LF_DOC); + TString_array& sht = sfield(F_DOCS).rows_array(); + TDoc_fp elab; + + //elab.set_cache_insert(true); + if (!sht.empty()) + { + TProgress_monitor pi(sht.items(), "Esportazione Fatture"); + FOR_EACH_ARRAY_ROW(sht, r, riga) + { + if (!pi.add_status()) + break; + + if (riga->starts_with("X")) + { + const int anno = riga->get_int(sfield(F_DOCS).cid2index(S_ANNO)); + const long nreg = riga->get_long(sfield(F_DOCS).cid2index(S_NUMREG)); + const TDoc_key key(anno, EMPTY_STRING, nreg); //da fare + + // Verifico che il codice sdi nello sheet sia lo stesso sulla testata del documento in caso contrario lo aggiorno + TRectype rec_doc = elab.key_to_doc(key); + if (rec_doc.read(doc) == NOERR) + { + /* + if (rec_doc.get(DOC_TIPODOCSDI).compare(riga->get(col_cod_sdi)) != 0) + { + rec_doc.put(DOC_TIPODOCSDI, riga->get(col_cod_sdi)); + rec_doc.rewrite(doc); + } + */ + if (elab.doc_to_paf(key)) + ndocs++; + else + { + if (!yesno_box("L'ultima fattura non è stata esportata, continuare?")) + break; + } + } + } + } + } + if (elab.force_commit() <= 0) + error_box("Errore durante il cambiamento di stato finale, potrebbero esser rimaste delle fatture in Pronto"); + elab.show_log(); +} + +bool TPAR_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + switch (o.dlg()) + { + case DLG_RECALC: + if (e == fe_button) + next_page(1); + break; + case F_DATAINI: + if (e == fe_init) + o.set(ini_get_string(CONFIG_DITTA, "fp", "LastXML", "01-01-2019")); + else if (e == fe_close) + ini_set_string(CONFIG_DITTA, "fp", "LastXML", o.get()); + break; + case F_DATAEND: + if (e == fe_init) + o.set(TDate(TODAY)); + case F_DOCS: + if (e == se_query_add || e == se_query_del) + return false; + break; + case DLG_OK: + if (e == fe_button) + export_paf(); + break; + case DLG_USER: + if (e == fe_button && jolly > 0) + { + TSheet_field& docs = sfield(F_DOCS); + TToken_string& row = docs.row(docs.selected()); + TRectype doc(LF_DOC); + doc.put(DOC_PROVV, 'D'); + doc.put(DOC_ANNO, row.get(1)); + doc.put(DOC_CODNUM, row.get(2)); + doc.put(DOC_TIPODOC, row.get(3)); + doc.put(DOC_NDOC, row.get(5)); + if (doc.edit(LF_DOC, "", "ve0")) // Perchè prima andava senza dovergli mettere nulla? + fill(); + } + break; + case DLG_ALL: + { + if (e == fe_button) + { + TSheet_field& docs = sfield(F_DOCS); + TString_array& sht = docs.rows_array(); + const int items = sht.items(); + + if (items > 0) + { + const TString4 select = *(sht.row(0).get(0)) == 'X' ? "" : "X"; + for (int i = 0; i < items; i++) + sht.row(i).add(select, 0); + docs.force_update(); + } + } + } + break; + case DLG_SAVEREC: + { + if (e == fe_button) + set_err_paf(); + } + break; + case DLG_FINDREC: + { + if (e == fe_button) + set_pronto(); + } + break; + case DLG_PRINT: + { + if (e == fe_button) + connect_keys(); + } + break; + default: break; + } + if((e == fe_modify || e >= se_enter) && jolly == 0) + { + if (o.dlg() >= START_MASK && o.dlg() <= END_MASK) + { + set_filter_changed(); + } + } + return true; +} + +void TPAR_mask::next_page(int p) +{ + bool ok = true; + if (_filter_changed && p != 1000) + { + if ((ok = _filter_changed = check_full_fields())) + { + TSheet_field& sf = sfield(F_DOCS); + fill(); + _filter_changed = false; + } + } + if(ok) + TAutomask::next_page(p); +} + +bool TPAR_mask::on_key(const KEY key) +{ + if (key == K_SHIFT + K_F12) + { + if (run_fp_psw_mask()) + { + _enable_chiave_fixer = true; + if (curr_page() > 0) + force_reload_sheet(); + } + } + return true; +} + +bool TPAR_mask::check_not_empty() +{ + TSheet_field& sheet = sfield(F_DOCS); + TString msg; + + if (sheet.empty()) + msg = "La tabella dei movimenti è vuota, vuoi caricarla con i filtri selezionati?"; + else if (_filter_changed) + msg = "I filtri sono stati cambiati, vuoi ricaricare la tabella con i nuovi filtri selezionati?"; + + if (msg.full() && yesno_box(msg)) + { + next_page(1); + } + return sheet.full(); +} + +bool TPAR_mask::check_full_fields() const +{ + // Controllo ogni campo che sia valorizzato + FOR_EACH_MASK_FIELD(*this, i, f) + { + if (!f->on_key(K_ENTER)) + return false; + } + return true; +} + +bool TPAR_mask::check_doc_filter(const TDocumentoEsteso& d) const +{ + const TString& codnum = d.get(DOC_CODNUM); + const TString& tipodoc = d.get(DOC_TIPODOC); + const char stato = d.stato(); + const TTipo_documento& td = cached_tipodoc(d.get(DOC_TIPODOC)); + // Mi precarico la tabella dei documenti scelti + FOR_EACH_SHEET_ROW(sfield(F_CAUSALI_TIPO), nr, row) + { + if (codnum.compare(row->get(_codnum)) == 0 && // Codice numerazione + tipodoc.compare(row->get(_tipodoc)) == 0 && // Tipo documento + td.reg_fisc().full() && // Regime fiscale + row->get_char(_dastato) <= stato && // Da stato + row->get_char(_astato) >= stato) // A stato + return true; + } + return false; +} + +void TPAR_mask::set_err_paf() +{ + // Vado a riportare sui paf l'errore + TSheet_field& sfld = sfield(F_DOCS); + TString_array& sht = sfld.rows_array(); + TLocalisamfile fdoc(LF_DOC); + if (!sht.empty()) + { + TProgress_monitor pi(sht.items(), "Cambio stato fatture"); + + FOR_EACH_ARRAY_ROW(sht, r, riga) + { + if (!pi.add_status()) + break; + + if (riga->starts_with("X")) + { + const int anno = riga->get_int(sfield(F_DOCS).cid2index(S_ANNO)); + const long nreg = riga->get_long(sfield(F_DOCS).cid2index(S_NUMREG)); + const TDoc_key key(anno, EMPTY_STRING, nreg); + // Ricontrollo che la fattura sia presente in Campo prima di cambiare stato + fdoc.zero(); + fdoc.put(DOC_PROVV, key.provv()); + fdoc.put(DOC_ANNO, key.anno()); + fdoc.put(DOC_CODNUM, key.codnum()); + fdoc.put(DOC_NDOC, key.ndoc()); + + TString hfatt, bfatt; + TPaf_record paf0100f("PAF0100F"); + if (fdoc.read() == NOERR && chiave_paf(fdoc.curr(), hfatt, bfatt) && paf0100f.search(nullptr, hfatt, bfatt)) + { + static TString query; + query.cut(0) << + "UPDATE PAF0100F SET P1_GESTIONE = 'E', P1_KEYPRGINVIO = 'DELETED' WHERE P1_KEYHEADERFATT = '" << hfatt << "' AND P1_KEYBODYFATT = '" << bfatt << "';\n" << + "UPDATE PAF0200F SET P2_GESTIONE = 'E', P2_KEYPRGINVIO = 'DELETED' WHERE P2_KEYHEADERFATT = '" << hfatt << "' AND P2_KEYBODYFATT = '" << bfatt << "';\n" << + "UPDATE PAF0400F SET P4_GESTIONE = 'E', P4_KEYPRGINVIO = 'DELETED' WHERE P4_KEYHEADERFATT = '" << hfatt << "' AND P4_KEYBODYFATT = '" << bfatt << "';\n" << + "UPDATE PAF0700F SET P7_GESTIONE = 'E', P7_KEYPRGINVIO = 'DELETED' WHERE P7_KEYHEADERFATT = '" << hfatt << "' AND P7_KEYBODYFATT = '" << bfatt << "';\n" << + "UPDATE PAF0800F SET P8_GESTIONE = 'E', P8_KEYPRGINVIO = 'DELETED' WHERE P8_KEYHEADERFATT = '" << hfatt << "' AND P8_KEYBODYFATT = '" << bfatt << "';\n" << + "UPDATE PAF1000F SET P0_GESTIONE = 'E', P0_KEYPRGINVIO = 'DELETED' WHERE P0_KEYHEADERFATT = '" << hfatt << "' AND P0_KEYBODYFATT = '" << bfatt << "';\n" << + "UPDATE PAF1100F SET PA_GESTIONE = 'E', PA_KEYPRGINVIO = 'DELETED' WHERE PA_KEYHEADERFATT = '" << hfatt << "' AND PA_KEYBODYFATT = '" << bfatt << "';\n" << + "UPDATE PAF1200F SET PB_GESTIONE = 'E', PB_KEYPRGINVIO = 'DELETED' WHERE PB_KEYHEADERFATT = '" << hfatt << "' AND PB_KEYBODYFATT = '" << bfatt << "';\n" << + "UPDATE PAF1600F SET PF_GESTIONE = 'E', PF_KEYPRGINVIO = 'DELETED' WHERE PF_KEYHEADERFATT = '" << hfatt << "' AND PF_KEYBODYFATT = '" << bfatt << "';\n" << + "UPDATE PAF1700F SET PG_GESTIONE = 'E', PG_KEYPRGINVIO = 'DELETED' WHERE PG_KEYHEADERFATT = '" << hfatt << "' AND PG_KEYBODYFATT = '" << bfatt << "';\n" << + "UPDATE PAF1800F SET PI_GESTIONE = 'E', PI_KEYPRGINVIO = 'DELETED' WHERE PI_KEYHEADERFATT = '" << hfatt << "' AND PI_KEYBODYFATT = '" << bfatt << "';\n" << + "UPDATE PAF1900F SET PY_GESTIONE = 'E', PY_KEYPRGINVIO = 'DELETED' WHERE PY_KEYHEADERFATT = '" << hfatt << "' AND PY_KEYBODYFATT = '" << bfatt << "';\n" << + "UPDATE PAF2000F SET PJ_GESTIONE = 'E', PJ_KEYPRGINVIO = 'DELETED' WHERE PJ_KEYHEADERFATT = '" << hfatt << "' AND PJ_KEYBODYFATT = '" << bfatt << "';\n" << + "UPDATE PAF2100F SET PK_GESTIONE = 'E', PK_KEYPRGINVIO = 'DELETED' WHERE PK_KEYHEADERFATT = '" << hfatt << "' AND PK_KEYBODYFATT = '" << bfatt << "';\n" << + "UPDATE PAF2200F SET PL_GESTIONE = 'E', PL_KEYPRGINVIO = 'DELETED' WHERE PL_KEYHEADERFATT = '" << hfatt << "' AND PL_KEYBODYFATT = '" << bfatt << "';\n" << + "UPDATE PAF2400F SET PN_GESTIONE = 'E', PN_KEYPRGINVIO = 'DELETED' WHERE PN_KEYHEADERFATT = '" << hfatt << "' AND PN_KEYBODYFATT = '" << bfatt << "';\n" << + "UPDATE PAF2500F SET PO_GESTIONE = 'E', PO_KEYPRGINVIO = 'DELETED' WHERE PO_KEYHEADERFATT = '" << hfatt << "' AND PO_KEYBODYFATT = '" << bfatt << "';\n" << + "UPDATE PAF2600F SET PP_GESTIONE = 'E', PP_KEYPRGINVIO = 'DELETED' WHERE PP_KEYHEADERFATT = '" << hfatt << "' AND PP_KEYBODYFATT = '" << bfatt << "';\n" << + "UPDATE PAF2700F SET PQ_GESTIONE = 'E', PQ_KEYPRGINVIO = 'DELETED' WHERE PQ_KEYHEADERFATT = '" << hfatt << "' AND PQ_KEYBODYFATT = '" << bfatt << "';\n" << + "UPDATE PAF3000F SET PT_GESTIONE = 'E', PT_KEYPRGINVIO = 'DELETED' WHERE PT_KEYHEADERFATT = '" << hfatt << "' AND PT_KEYBODYFATT = '" << bfatt << "';\n" << + "UPDATE PAF3200F SET PU_GESTIONE = 'E', PU_KEYPRGINVIO = 'DELETED' WHERE PU_KEYHEADERFATT = '" << hfatt << "' AND PU_KEYBODYFATT = '" << bfatt << "';\n" << + // PAFW3 non ha il flag di gestione + "UPDATE PAFW300F SET PW_KEYPRGINVIO = 'DELETED' WHERE PW_KEYHEADERFATT = '" << hfatt << "' AND PW_KEYBODYFATT = '" << bfatt << "';\n"; + if(!fp_db().sq_set_exec(query)) + { + TString err = "Impossibile salvare la fattura "; err << anno << " " << " " << nreg << "\nVerrà saltata."; + error_box(err); + } + + } + else + { + TString err = "Impossibile trovare la fattura "; err << anno << " " << " " << nreg << "\nVerrà saltata."; + error_box(err); + } + } + } + fp_db().sq_commit(); + } + force_reload_sheet(); +} + + +///////////////////////////////////////////////////////////////////////////////////// +// TReg2Paf +///////////////////////////////////////////////////////////////////////////////////// + +class Treg2Paf : public TSkeleton_application +{ + +public: + virtual bool create(); + virtual bool destroy(); + virtual void main_loop(); + + Treg2Paf() {} +}; + +void Treg2Paf::main_loop() +{ + while (TPAR_mask().run() == K_ENTER) {} +} + +bool Treg2Paf::create() +{ + open_files(LF_TAB, LF_TABCOM, LF_TABMOD, LF_ANAG, + LF_CLIFO, LF_CFVEN, LF_CFBAN, LF_NDITTE, + LF_DOC, LF_RIGHEDOC, LF_CODCORR, LF_ANAMAG, 0); + + 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 Treg2Paf::destroy() +{ + fp_db().sq_disconnect(); + return TSkeleton_application::destroy(); +} + +int fp0700(int argc, char* argv[]) +{ + Treg2Paf d2p; + d2p.run(argc, argv, TR("Invio Regolarizzazioni")); + return 0; +} diff --git a/src/fp/fp0700a.h b/src/fp/fp0700a.h new file mode 100644 index 000000000..1c984fd81 --- /dev/null +++ b/src/fp/fp0700a.h @@ -0,0 +1,28 @@ +#define F_DATAINI 401 +#define F_DATAEND 402 +#define F_DOCSEL 403 +#define F_CAUSALI_TIPO 404 +#define F_TIPO_SDI 405 +#define F_DOCS 406 +#define START_MASK F_DATAINI +#define END_MASK F_DOCS + + +#define S_COD_CAUS 101 +#define S_DESCR 102 +#define S_ANNO_REG 150 + + + +#define S_SELECTED 101 +#define S_ANNO 102 +#define S_NUMREG 103 +#define S_DATAREG 104 +#define S_CLIENTE 105 +#define S_RAGSOC 106 +#define S_UFFICIO 107 +#define S_RIFAMM 108 +#define S_COFI 109 +#define S_SPLITPAY 110 +#define S_ATTACH 111 +#define S_ONLYGEN 112 diff --git a/src/fp/fp0700a.uml b/src/fp/fp0700a.uml new file mode 100644 index 000000000..c9a7da494 --- /dev/null +++ b/src/fp/fp0700a.uml @@ -0,0 +1,284 @@ +#include "fp0700a.h" + +TOOLBAR "topbar" 0 0 0 2 + +BUTTON DLG_ALL 2 2 +BEGIN + PROMPT 1 1 "~Tutti" + PICTURE TOOL_MULTISEL +END + +BUTTON DLG_OK 2 2 +BEGIN + PROMPT 1 1 "Elabora" + PICTURE TOOL_ELABORA + FLAGS "D" +END + +BUTTON DLG_NULL 2 2 +BEGIN + PROMPT -1 1 "" + PICTURE 0 +END + +BUTTON DLG_SAVEREC 2 2 +BEGIN + PROMPT 1 1 "Elimina" + PICTURE TOOL_WARNING + FLAGS "D" +END + +BUTTON DLG_FINDREC 2 2 +BEGIN + PROMPT 1 1 "Segna pronto" + PICTURE TOOL_PERMISSIONS + FLAGS "D" +END + +BUTTON DLG_PRINT 2 2 +BEGIN + PROMPT 1 1 "Correggi chiavi" + PICTURE TOOL_SMILE + FLAGS "D" +END + +#include + +ENDPAGE + +PAGE "Invio Regolarizzazioni" 0 2 0 0 + +DATE F_DATAINI +BEGIN + PROMPT 1 1 "Data iniziale" + CHECKTYPE REQUIRED +END + +DATE F_DATAEND +BEGIN + PROMPT 50 1 "Data finale " + VALIDATE DATE_CMP_FUNC >= F_DATAINI + WARNING "La data finale non può essere minore della data iniziale" + CHECKTYPE REQUIRED +END + +RADIOBUTTON F_DOCSEL 7 80 +BEGIN + PROMPT 1 3 "Documenti da visualizzare" + ITEM "P|Provvisori" + ITEM "D|Definitivi" + FLAGS "Z" +END + + +SPREADSHEET F_CAUSALI_TIPO 80 5 +BEGIN + PROMPT 1 7 "" + ITEM "Cod Causale" + ITEM "Descrizione@50" +END + +LIST F_TIPO_SDI 40 +BEGIN + PROMPT 1 14 "Tipo documento SDI " + ITEM "TD16|TD16 Integraz. fatt. rev.ch. interno" + ITEM "TD17|TD17 Integ./autof. acq. servizi estero" + ITEM "TD18|TD18 Integ. acq. beni intracomunitari" + ITEM "TD19|TD19 Integ./autof. acq. beni ex art. 17" + ITEM "TD20|TD20 Autofattura" +END + +STRING DLG_PROFILE 50 +BEGIN + PROMPT 1 -1 "Profilo " + PSELECT +END + +ENDPAGE +PAGE "Elenco Regolarizzazioni" 0 2 0 0 + +SPREADSHEET F_DOCS +BEGIN + PROMPT 0 2 "" + ITEM "@1" + ITEM "Anno" + ITEM "Num.\nReg.@7" + ITEM "Data\nReg.@10" + ITEM "Cliente" + ITEM "Ragione Sociale@50" + ITEM "Codice destinatario@20" + ITEM "Riferimento\nAmministrazione@20" + ITEM "Codice Fiscale@16" + ITEM "Scissione\nPagamenti@9" + ITEM "Allegati" + ITEM "Solo generazione" +END + +ENDPAGE +ENDMASK + +PAGE "Riga Causale" -1 -1 50 3 + +NUMBER S_ANNO_REG 4 +BEGIN + PROMPT 100 100 "" + FLAG "AH" +END + +STRING S_COD_CAUS 3 +BEGIN + PROMPT 1 1 "Codice " + FLAGS "UZ" +// USE LF_CAUSALI SELECT ((AUTOFATT=="X")||(REGSPIVA==3)||((REGSPIVA>=13)&&(REGSPIVA<=18))||(REGSPIVA==50)||(REGSPIVA==51))&&(201@->I0=="1") +USE LF_CAUSALI SELECT (201@->I0=="1") + JOIN REG ALIAS 201 INTO CODTAB[1,4]=#S_ANNO_REG CODTAB[5,7]=REG + INPUT CODCAUS S_COD_CAUS + DISPLAY "Cod." CODCAUS + DISPLAY "Descrizione@50" DESCR + DISPLAY "Documento" TIPODOC + DISPLAY "Registro" REG + DISPLAY "Tipo movimento" TIPOMOV + DISPLAY "Regime IVA" REGSPIVA + OUTPUT S_COD_CAUS CODCAUS + OUTPUT S_DESCR DESCR + WARNING "Causale assente" + CHECKTYPE REQUIRED +END + +STRING S_DESCR 50 +BEGIN + PROMPT 1 4 "Descriz." +// USE LF_CAUSALI KEY 2 SELECT ((AUTOFATT=="X")||(REGSPIVA==3)||((REGSPIVA>=13)&&(REGSPIVA<=18))||(REGSPIVA==50)||(REGSPIVA==51))&&(201@->I0=="1") + USE LF_CAUSALI KEY 2 SELECT (201@->I0=="1") + JOIN REG ALIAS 201 INTO CODTAB[1,4]=#S_ANNO_REG CODTAB[5,7]=REG + INPUT DESCR S_DESCR + DISPLAY "Descrizione @50" DESCR + DISPLAY "Cod." CODCAUS + DISPLAY "Documento" TIPODOC + DISPLAY "Registro" REG + DISPLAY "Tipo movimento" TIPOMOV + DISPLAY "Regime IVA" REGSPIVA + COPY OUTPUT S_COD_CAUS + CHECKTYPE SEARCH +END + +ENDPAGE + +TOOLBAR "Tipo Documento" 0 0 0 2 + +BUTTON DLG_OK 2 2 +BEGIN + PROMPT 1 1 "" +END + +BUTTON DLG_DELREC 2 2 +BEGIN + PROMPT 1 1 "" +END + +BUTTON DLG_CANCEL 2 2 +BEGIN + PROMPT 1 1 "" +END + +ENDPAGE +ENDMASK + + +PAGE "Documento" -1 -1 78 9 + +BOOLEAN S_SELECTED +BEGIN + PROMPT 1 1 "Da elaborare" +END + +NUMBER S_ANNO 4 +BEGIN + PROMPT 1 2 "Anno " + FLAGS "D" +END + +NUMBER S_NUMREG 7 +BEGIN + PROMPT 21 2 "Numerazione " + FLAGS "D" +END + +DATE S_DATAREG +BEGIN + PROMPT 21 3 "Data " + FLAGS "D" +END + +NUMBER S_CLIENTE 6 +BEGIN + PROMPT 1 4 "Cliente " + FLAGS "D" +END + +STRING S_RAGSOC 50 +BEGIN + PROMPT 21 4 "" + FLAGS "D" +END + +STRING S_UFFICIO 50 20 +BEGIN + PROMPT 1 5 "" + FLAGS "D" +END + +STRING S_RIFAMM 20 +BEGIN + PROMPT 21 5 "" + FLAGS "D" +END + +STRING S_COFI 20 +BEGIN + PROMPT 1 6 "" + FLAGS "D" +END + +BOOLEAN S_SPLITPAY +BEGIN + PROMPT 1 7 "Soggetto a scissione pagamenti art.17 ter DPR 633/72" + FLAGS "D" +END + +BOOLEAN S_ATTACH +BEGIN + PROMPT 1 8 "Documenti in allegato" + FLAGS "D" +END + +BOOLEAN S_ONLYGEN +BEGIN + PROMPT 20 8 "Solo generazione" + FLAGS "D" +END + + +ENDPAGE + +TOOLBAR "Documento" 0 0 0 2 + +BUTTON DLG_OK 2 2 +BEGIN + PROMPT 1 1 "" +END + +BUTTON DLG_USER 2 2 +BEGIN + PROMPT 1 1 "Collega" + PICTURE TOOL_LINK +END + + +BUTTON DLG_CANCEL 2 2 +BEGIN + PROMPT 1 1 "" +END + +ENDPAGE +ENDMASK \ No newline at end of file diff --git a/src/fp/fp1100.cpp b/src/fp/fp1100.cpp index d6d4a4758..0e20982e5 100644 --- a/src/fp/fp1100.cpp +++ b/src/fp/fp1100.cpp @@ -92,10 +92,9 @@ void TBolliinfatt_mask::fill() TString query; - query << "USE 33 KEY 3 \n" << - "SELECT 33.TIPOCF==\"C\"" << - TISAM_recordset::add_between_filter(DOC_CODNUM, get(F_DACODNUM), get(F_ACODNUM)) << - " \n" << + query << "USE 33 KEY 3 \n" << "SELECT 33.TIPOCF==\"C\""; + TISAM_recordset::add_between_filter(query, DOC_CODNUM, get(F_DACODNUM), get(F_ACODNUM)); + query << " \n" << "JOIN 20 INTO TIPOCF==TIPOCF CODCF==CODCF \n" << "JOIN 17 TO 33 INTO TIPOCF==TIPOCF CODCF==CODCF \n" << "JOIN %TIP TO 33 ALIAS 400 INTO CODTAB==TIPODOC \n" << diff --git a/src/fp/fplib.h b/src/fp/fplib.h index a3dcd080f..60aa701ae 100644 --- a/src/fp/fplib.h +++ b/src/fp/fplib.h @@ -225,7 +225,7 @@ class TFP_selected_docs : public TObject { TRelation _r_tabmod; TRectype _flt; - std::unique_ptr _cur; + TCursor* _cur; TRectype fill_rectype() const; enum { _codnum, _tipodoc, _dastato, _astato, _tiposdi }; @@ -238,6 +238,23 @@ public: TFP_selected_docs(); }; +class TFP_selected_regs : public TObject +{ + TRelation _r_tabmod; + TRectype _flt; + TCursor * _cur; + TRectype fill_rectype() const; + + enum { _codnum, _tipodoc, _dastato, _astato, _tiposdi }; + +public: + void fill_sheet(TSheet_field& sheet) const; + inline bool has_selected_regs() const { return _cur->items() > 0; } + void save_sheet(const TSheet_field& sheet) const; + + TFP_selected_regs(); +}; + class TFp_mail_sender : public TObject { int _anno; diff --git a/src/fp/fplib02.cpp b/src/fp/fplib02.cpp index 0b54f988d..a0b88cd27 100644 --- a/src/fp/fplib02.cpp +++ b/src/fp/fplib02.cpp @@ -358,9 +358,67 @@ void TFP_selected_docs::save_sheet(const TSheet_field& sheet) const TFP_selected_docs::TFP_selected_docs() : _r_tabmod(LF_TABMOD), _flt(fill_rectype()) { - _cur.reset(new TCursor(&_r_tabmod, "", 1, &_flt, &_flt)); + _cur = new TCursor(&_r_tabmod, "", 1, &_flt, &_flt); } +TRectype TFP_selected_regs::fill_rectype() const +{ + TRectype r(LF_TABMOD); + r.put("MOD", FP_TAB_MOD); + r.put("COD", FP_SLD_COD); + return r; +} + +void TFP_selected_regs::fill_sheet(TSheet_field& sheet) const +{ + for (*_cur = 0; _cur->pos() < _cur->items(); ++*_cur) + { + TRectype rec = _cur->curr(); + TToken_string& row = sheet.row(-1); + row.add(rec.get(FP_SLD_CODNUM)); + row.add(rec.get(FP_SLD_TIPODOC)); + row.add(rec.get(FP_SLD_DASTATO)); + row.add(rec.get(FP_SLD_ASTATO)); + row.add(TTipo_documento(rec.get(FP_SLD_TIPODOC)).tipo_doc_sdi()); + } +} + +void TFP_selected_regs::save_sheet(const TSheet_field& sheet) const +{ + // Svuoto il db + TLocalisamfile tabmod(LF_TABMOD); + TRectype rec(LF_TABMOD); + + for (*_cur = 0; _cur->pos() != _cur->items();) + { + rec = _cur->curr(); + int err = rec.remove(tabmod); + } + + // Carico il db + + FOR_EACH_SHEET_ROW(sheet, n, r) + { + // Chissene anche se copio ogni volta + rec = fill_rectype(); + static TString num; + num.cut(0); + num.format("%08d", n); + rec.put(FP_SLD_CODTAB, num); + + // Prendo tutta la riga tranne il cod sdi + rec.put(FP_SLD_CODNUM, r->get(_codnum)); + rec.put(FP_SLD_TIPODOC, r->get(_tipodoc)); + rec.put(FP_SLD_DASTATO, r->get(_dastato)); + rec.put(FP_SLD_ASTATO, r->get(_astato)); + rec.write(tabmod); + } +} + +TFP_selected_regs::TFP_selected_regs() : _r_tabmod(LF_TABMOD), _flt(fill_rectype()) +{ + _cur = new TCursor(&_r_tabmod, "", 1, &_flt, &_flt); +} TFP_righe_custom::TCustCol& TFP_righe_custom::get_no_custom() {