diff --git a/src/fp/Rappresentazione_tabellare_del_tracciato_FatturaPA_versione_1.2.1.xls b/src/fp/Rappresentazione_tabellare_del_tracciato_FatturaPA_versione_1.2.1.xls index 94d225528..990e3f18b 100644 Binary files a/src/fp/Rappresentazione_tabellare_del_tracciato_FatturaPA_versione_1.2.1.xls and b/src/fp/Rappresentazione_tabellare_del_tracciato_FatturaPA_versione_1.2.1.xls differ diff --git a/src/fp/fp0300.cpp b/src/fp/fp0300.cpp index 21075375a..5fe421f7f 100644 --- a/src/fp/fp0300.cpp +++ b/src/fp/fp0300.cpp @@ -104,10 +104,7 @@ void TPA_mask::load_all_fields() set(F_DATAEND, ini_get_string(CONFIG_DITTA, "fp", "dataend")); const TToken_string s_accepted_docs(ini_get_string(CONFIG_DITTA, "fp", "accepted_docs"), ';'); - // - auto& sheet = sfield(F_DOCUMENTI_TIPO); - sheet.hide(); - + TSheet_field& sheet = sfield(F_DOCUMENTI_TIPO); TFP_selected_docs selected_docs; if (selected_docs.has_selected_docs()) @@ -212,7 +209,7 @@ void TPA_mask::fill() continue; bool sent = false; - if (chiave_paf(doc, hfatt, bfatt)) + if (chiave_paf_doc(doc, hfatt, bfatt)) { if (paf0100f.search(nullptr, hfatt, bfatt) && paf0100f.sq_get("P1_GESTIONE") != " " && paf0100f.sq_get("P1_ERRINT") != "*") { @@ -307,7 +304,7 @@ void TPA_mask::set_pronto() static TString campo_hfatt, campo_bfatt, query; TDocumento doc('D', riga->get_int(xvtil_cid2index(S_ANNO)), riga->get(xvtil_cid2index(S_CODNUM)), riga->get_long(xvtil_cid2index(S_NDOC))); - if (chiave_paf(doc, campo_hfatt, campo_bfatt)) + if (chiave_paf_doc(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 << "'"; @@ -345,7 +342,7 @@ void TPA_mask::connect_keys() TDocumento doc('D', riga->get_int(xvtil_cid2index(S_ANNO)), riga->get(xvtil_cid2index(S_CODNUM)), riga->get_long(xvtil_cid2index(S_NDOC))); static TString campo_hfatt, campo_bfatt, query; - if (chiave_paf(doc, campo_hfatt, campo_bfatt)) + if (chiave_paf_doc(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 << "'"; @@ -687,7 +684,7 @@ void TPA_mask::set_err_paf() TString hfatt, bfatt; TPaf_record paf0100f("PAF0100F"); - if (fdoc.read() == NOERR && chiave_paf(fdoc.curr(), hfatt, bfatt) && paf0100f.search(nullptr, hfatt, bfatt)) + if (fdoc.read() == NOERR && chiave_paf_doc(fdoc.curr(), hfatt, bfatt) && paf0100f.search(nullptr, hfatt, bfatt)) { static TString query; query.cut(0) << diff --git a/src/fp/fp0400.cpp b/src/fp/fp0400.cpp index dd90e67fc..de91a77d4 100644 --- a/src/fp/fp0400.cpp +++ b/src/fp/fp0400.cpp @@ -17,6 +17,7 @@ #define FILTER_ALL "A" #define FILTER_CONT "C" #define PARA_FP "fp" +#define F1_INIREGCONT "regcont" enum { @@ -669,7 +670,7 @@ int TPassive_mask::prepara_contab() const { TString prokeys = row->get(sf.cid2index(S_PROKEY)); TToken_string keys(prokeys, ';'); - const TString codcaus(get_codcaus(row->get(cid2index(S_TIPODOCSDI)), row->get(cid2index(S_FORNITORE)))); + const TString codcaus(get_codcaus(row->get(cid2index(S_TIPODOCSDI)), row->get_long(cid2index(S_FORNITORE)))); TString tipodoc(row->get(sf.cid2index(S_TIPODOCSDI))); if (tipodoc == "TD01" && !check_causale(codcaus, "FA", true)) @@ -868,7 +869,7 @@ int TPassive_mask::check_err() const { if (row->starts_with("X")) { - TString codcaus(get_codcaus(row->get(cid2index(S_TIPODOCSDI)), row->get(cid2index(S_FORNITORE)))); + TString codcaus(get_codcaus(row->get(cid2index(S_TIPODOCSDI)), row->get_long(cid2index(S_FORNITORE)))); if (codcaus.empty()) return no_codcaus; if (TString(row->get(cid2index(S_FORNITORE))).empty()) diff --git a/src/fp/fp0700.cpp b/src/fp/fp0700.cpp index 82f2c8513..8768083f7 100644 --- a/src/fp/fp0700.cpp +++ b/src/fp/fp0700.cpp @@ -13,21 +13,16 @@ #include "fp0700a.h" #include "fp0100a.h" -///////////////////////////////////////////////////////////////////////////////////// -// Globals -///////////////////////////////////////////////////////////////////////////////////// - -#define LEN_HFATT 20 -#define LEN_BFATT 50 - ///////////////////////////////////////////////////////////////////////////////////// // TPAR_mask ///////////////////////////////////////////////////////////////////////////////////// class TPAR_mask : public TAutomask { + TAssoc_array _causali; + protected: - enum {_codnum, _tipodoc, _dastato, _astato, _tiposdi}; + enum { _codnum, _tipodoc, _dastato, _astato, _tiposdi }; void set_filter_changed(); void set_pronto(); @@ -50,35 +45,29 @@ protected: 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; + const TAssoc_array & causali() const { return _causali; } + void save_all_fields(); + TPAR_mask(); + virtual ~TPAR_mask() {} }; -void TPAR_mask::save_all_fields() const +TPAR_mask *__mask = nullptr; + +void TPAR_mask::save_all_fields() { + TSheet_field & scaus = sfield(F_CAUSALI_TIPO); + // Salvo le impostazioni ini_set_string(CONFIG_DITTA, "fp", "dataini", get(F_DATAINI)); ini_set_string(CONFIG_DITTA, "fp", "dataend", get(F_DATAEND)); - + ini_set_string(CONFIG_DITTA, "fp", "TIPO_SDI", get(F_TIPO_SDI)); // 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)); -*/ - + _causali.destroy(); + FOR_EACH_SHEET_ROW_LOOP(scaus, r) + { + const TString & codcaus = scaus.get_str_row_cell(r, S_COD_CAUS); + ini_set_string(CONFIG_DITTA, "fp", "CAUSALE", codcaus, r); + _causali.add(codcaus); + } } void TPAR_mask::force_reload_sheet() @@ -97,117 +86,71 @@ void TPAR_mask::load_all_fields() 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); + TSheet_field& scaus = sfield(F_CAUSALI_TIPO); - TFP_selected_regs selected_regs; - - if (selected_regs.has_selected_regs()) + for (int i = 0;; i++) { - // Super nuova gestione super avanzata! - selected_regs.fill_sheet(sheet); + TString16 caus = ini_get_string(CONFIG_DITTA, "fp", "CAUSALE", "", i); + + if (caus.full()) + scaus.set_row_cell(S_COD_CAUS, caus); + else + break; } - 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(); + scaus.force_update(); + set(F_TIPO_SDI, ini_get_string(CONFIG_DITTA, "fp", "TIPO_SDI")); +} - /* 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()); - */ +bool caus_filter(const TRelation* r) +{ + return __mask->causali().is_key(r->lfile().get(MOV_CODCAUS)); } 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); + TString filter_selected = get(F_REGSEL); + // Record di controllo per eventuali elaborazioni precedenti + TString hfatt, bfatt; + TPaf_record paf0100f("PAF0100F"); + TSheet_field& regs = sfield(F_REGS); + TString query; 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"; + query << "USE " << LF_MOV << " KEY 3 SELECT (BETWEEN(" << MOV_DATAREG << "," + << dal.date2ansi() << ',' << al.date2ansi() << "))&&(REG!=\"\")" + << "\nFROM " << MOV_TIPO << "=C\nTO " << MOV_TIPO "=C"; TISAM_recordset rec(query); - - rec.set_var("#DADATADOC", dal); - rec.set_var("#ADATADOC", al); + + rec.set_filterfunction(caus_filter); TProgress_monitor pi(rec.items(), nullptr); bool first, show, ask = !((show = (first = true))); int fat_no_cod = 0; + const TString16 tipodocsdi = get(F_TIPO_SDI); + const TDate data_inizio = get_date_start_new_fatt(); // Disabilito la colonna del codice ufficio - docs.enable_column(cid2index(S_UFFICIO), false); - const TDate data_inizio = get_date_start_new_fatt(); + regs.enable_column(cid2index(S_UFFICIO), false); + regs.reset(); 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; - + const TRectype& mov = rec.cursor()->curr(); + const TCli_for & cli = cached_clifor(mov.get_char(MOV_TIPO), mov.get_long(MOV_CODCF)); bool sent = false; - if (chiave_paf(doc, hfatt, bfatt)) + + if (chiave_paf_mov(mov, tipodocsdi, hfatt, bfatt)) { if (paf0100f.search(nullptr, hfatt, bfatt) && paf0100f.sq_get("P1_GESTIONE") != " " && paf0100f.sq_get("P1_ERRINT") != "*") { @@ -219,26 +162,17 @@ void TPAR_mask::fill() 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()); + int r = regs.set_row_cell(S_SELECTED, sent); - TString tipodoc = rec.get(DOC_TIPODOCSDI).as_string(); - - if (tipodoc.blank()) - tipodoc = td.tipo_doc_sdi(); - if (today 0) warning_box("Sono state trovate una o più fatture senza codice destinatario né pec"); @@ -289,7 +220,7 @@ void TPAR_mask::set_filter_changed() void TPAR_mask::set_pronto() { - TString_array& sht = sfield(F_DOCS).rows_array(); + TString_array& sht = sfield(F_REGS).rows_array(); TProgress_monitor pi(sht.items(), "Esportazione Fatture"); FOR_EACH_ARRAY_ROW(sht, r, riga) { @@ -302,7 +233,7 @@ void TPAR_mask::set_pronto() 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)) + if (chiave_paf_doc(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 << "'"; @@ -317,7 +248,7 @@ void TPAR_mask::set_pronto() void TPAR_mask::connect_keys() { - TString_array& sht = sfield(F_DOCS).rows_array(); + TString_array& sht = sfield(F_REGS).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; @@ -340,7 +271,7 @@ void TPAR_mask::connect_keys() 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)) + if (chiave_paf_doc(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 << "'"; @@ -440,7 +371,7 @@ void TPAR_mask::export_paf() { int ndocs = 0; TLocalisamfile doc(LF_DOC); - TString_array& sht = sfield(F_DOCS).rows_array(); + TString_array& sht = sfield(F_REGS).rows_array(); TDoc_fp elab; //elab.set_cache_insert(true); @@ -454,8 +385,8 @@ void TPAR_mask::export_paf() 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 int anno = riga->get_int(sfield(F_REGS).cid2index(S_ANNO)); + const long nreg = riga->get_long(sfield(F_REGS).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 @@ -502,7 +433,7 @@ bool TPAR_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) case F_DATAEND: if (e == fe_init) o.set(TDate(TODAY)); - case F_DOCS: + case F_REGS: if (e == se_query_add || e == se_query_del) return false; break; @@ -513,24 +444,19 @@ bool TPAR_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) 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(); + TSheet_field& regs = sfield(F_REGS); + TToken_string& row = regs.row(regs.selected()); + // Salvo subito su file le impostazioni di esportazione, in fplib accedo ai file + save_all_fields(); + fill(); } break; case DLG_ALL: { if (e == fe_button) { - TSheet_field& docs = sfield(F_DOCS); - TString_array& sht = docs.rows_array(); + TSheet_field& regs = sfield(F_REGS); + TString_array& sht = regs.rows_array(); const int items = sht.items(); if (items > 0) @@ -538,7 +464,7 @@ bool TPAR_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) 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(); + regs.force_update(); } } } @@ -580,7 +506,7 @@ void TPAR_mask::next_page(int p) { if ((ok = _filter_changed = check_full_fields())) { - TSheet_field& sf = sfield(F_DOCS); + save_all_fields(); fill(); _filter_changed = false; } @@ -605,7 +531,7 @@ bool TPAR_mask::on_key(const KEY key) bool TPAR_mask::check_not_empty() { - TSheet_field& sheet = sfield(F_DOCS); + TSheet_field& sheet = sfield(F_REGS); TString msg; if (sheet.empty()) @@ -637,8 +563,10 @@ bool TPAR_mask::check_doc_filter(const TDocumentoEsteso& d) const const TString& tipodoc = d.get(DOC_TIPODOC); const char stato = d.stato(); const TTipo_documento& td = cached_tipodoc(d.get(DOC_TIPODOC)); + TSheet_field & scaus = sfield(F_CAUSALI_TIPO); + // Mi precarico la tabella dei documenti scelti - FOR_EACH_SHEET_ROW(sfield(F_CAUSALI_TIPO), nr, row) + FOR_EACH_SHEET_ROW(scaus, nr, row) { if (codnum.compare(row->get(_codnum)) == 0 && // Codice numerazione tipodoc.compare(row->get(_tipodoc)) == 0 && // Tipo documento @@ -653,78 +581,78 @@ bool TPAR_mask::check_doc_filter(const TDocumentoEsteso& d) const 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()) + TSheet_field& sfld = sfield(F_REGS); + TProgress_monitor pi(sfld.items(), "Cambio stato fatture"); + const TString tipodocsdi = get(F_TIPO_SDI); + + FOR_EACH_SHEET_ROW_LOOP(sfld, r) { - TProgress_monitor pi(sht.items(), "Cambio stato fatture"); + if (!pi.add_status()) + break; - FOR_EACH_ARRAY_ROW(sht, r, riga) + if (sfld.get_bool_row_cell(r, S_SELECTED)) { - if (!pi.add_status()) - break; + // Ricontrollo che la fattura sia presente in Campo prima di cambiare stato + long nreg = sfld.get_long_row_cell(r, S_NUMREG); + const TRectype & mov = cache().get(LF_MOV, nreg); + TString hfatt, bfatt; + TPaf_record paf0100f("PAF0100F"); - if (riga->starts_with("X")) + if (chiave_paf_mov(mov, tipodocsdi, hfatt, bfatt) && paf0100f.search(nullptr, hfatt, bfatt)) { - 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)) + TString query; + query << + "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)) { - 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."; + TString err = "Impossibile salvare la regolarizzazione "; err << nreg << "\nVerrà saltata."; error_box(err); } + + } + else + { + TString err = "Impossibile trovare la fattura "; err << nreg << "\nVerrà saltata."; + error_box(err); } } - fp_db().sq_commit(); } + fp_db().sq_commit(); force_reload_sheet(); } +TPAR_mask::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(); + __mask = this; + +} ///////////////////////////////////////////////////////////////////////////////////// // TReg2Paf diff --git a/src/fp/fp0700a.h b/src/fp/fp0700a.h index 1c984fd81..f8790865c 100644 --- a/src/fp/fp0700a.h +++ b/src/fp/fp0700a.h @@ -1,11 +1,11 @@ #define F_DATAINI 401 #define F_DATAEND 402 -#define F_DOCSEL 403 +#define F_REGSEL 403 #define F_CAUSALI_TIPO 404 #define F_TIPO_SDI 405 -#define F_DOCS 406 +#define F_REGS 406 #define START_MASK F_DATAINI -#define END_MASK F_DOCS +#define END_MASK F_REGS #define S_COD_CAUS 101 diff --git a/src/fp/fp0700a.uml b/src/fp/fp0700a.uml index c9a7da494..523d5a0fd 100644 --- a/src/fp/fp0700a.uml +++ b/src/fp/fp0700a.uml @@ -62,11 +62,14 @@ BEGIN CHECKTYPE REQUIRED END -RADIOBUTTON F_DOCSEL 7 80 +RADIOBUTTON F_REGSEL 7 80 BEGIN - PROMPT 1 3 "Documenti da visualizzare" - ITEM "P|Provvisori" - ITEM "D|Definitivi" + PROMPT 1 3 "Registrazioni da visualizzare" + ITEM "|Da inviare" + ITEM "X|XML Generato" + ITEM "N|Notificato" + ITEM "E|In errore" + ITEM "D|Diag." FLAGS "Z" END @@ -97,7 +100,7 @@ END ENDPAGE PAGE "Elenco Regolarizzazioni" 0 2 0 0 -SPREADSHEET F_DOCS +SPREADSHEET F_REGS BEGIN PROMPT 0 2 "" ITEM "@1" diff --git a/src/fp/fplib.h b/src/fp/fplib.h index 60aa701ae..7e8e1ffec 100644 --- a/src/fp/fplib.h +++ b/src/fp/fplib.h @@ -35,8 +35,9 @@ TString& complete_num_fp(const TCodice_numerazione& codnum, const int numdoc); // Genera la chiave per i paf -bool chiave_paf(const TDocumento& doc, TString& hfatt, TString& bfatt); -bool chiave_paf(const TRectype& doc, TString& hfatt, TString& bfatt); +bool chiave_paf_mov(const TRectype& mov, const TString & tipodoc, TString& hfatt, TString& bfatt); +bool chiave_paf_doc(const TDocumento& doc, TString& hfatt, TString& bfatt); +bool chiave_paf_doc(const TRectype& doc, TString& hfatt, TString& bfatt); // Ritorna cod sdi, pec o vuoto. Chiama get_coddest() TString get_dest_sdi(char tipocf, long codcf, const TString& cod_ind_sped); // Valorizza codice sdi e pec in base alle configurazioni del monitor @@ -421,9 +422,8 @@ inline TFP_custom_cache& cached_custom_fp() return *carmelo; } -class TFP_expression : public TObject +class TFP_expression : public TObject // ma perchè non derivano da expre documento cazzone ? se sono più espressioni prima si separa la token string { -private: enum TFP_operator { error, eq, neq, gt, ls, gteq, lseq, and, or }; // Etrattori @@ -445,8 +445,8 @@ public: static bool check_condition(const TString& cond, TRiga_documento& rdoc); static bool check_condition(const TString& cond, TDocumento& doc) { return check_condition(cond, doc[1]); } - TFP_expression() = default; - virtual ~TFP_expression() = default; + TFP_expression() {}; + virtual ~TFP_expression() {}; }; // Gestione PAF diff --git a/src/fp/fplib01.cpp b/src/fp/fplib01.cpp index 47c20068c..283ed0005 100644 --- a/src/fp/fplib01.cpp +++ b/src/fp/fplib01.cpp @@ -159,7 +159,27 @@ TString& complete_num_fp(const TCodice_numerazione& codnum, const int numdoc) */ // Crea la coppia di chiavi per il db PAF a partire da un documento vero e proprio -bool chiave_paf(const TDocumento& doc, TString& hfatt, TString& bfatt) +bool chiave_paf_mov(const TRectype& mov, const TString & tipodoc, TString& hfatt, TString& bfatt) +{ + TCli_for cli(mov.get_char(MOV_TIPO), mov.get_long(MOV_CODCF)); + hfatt.cut(0); + if (cli.is_occasionale()) + hfatt << "O" << mov.get(MOV_OCFPI); + else + hfatt << cli.tipo() << cli.codice(); + CHECK(hfatt.full(), "Destinatario fattura P.A. non valido"); + //20180101_TD01_123456712345671234567 + + TString numdoc = mov.get(MOV_NUMDOC); + + numdoc.lpad(mov.length(DOC_NDOC), '0'); + bfatt = mov.get_date(MOV_DATAREG).date2ansi(); + bfatt << '_' << tipodoc << '_' << numdoc; + return hfatt.full() && bfatt.full(); +} + + +bool chiave_paf_doc(const TDocumento& doc, TString& hfatt, TString& bfatt) { hfatt.cut(0); if (doc.clifor().is_occasionale()) @@ -174,10 +194,10 @@ bool chiave_paf(const TDocumento& doc, TString& hfatt, TString& bfatt) } // Crea la coppia di chiavi per il db PAF a partire da un semplice record di testata documento -bool chiave_paf(const TRectype& doc, TString& hfatt, TString& bfatt) +bool chiave_paf_doc(const TRectype& doc, TString& hfatt, TString& bfatt) { const TDocumento d(doc); - chiave_paf(d, hfatt, bfatt); + chiave_paf_doc(d, hfatt, bfatt); return hfatt.full(); } @@ -1015,7 +1035,7 @@ bool TDoc_fp::initialize(TDocumentoEsteso& doc) // Paese del documento _paese = "IT"; _has_bolla = false; - if (!chiave_paf(doc, _hfatt, _bfatt)) + if (!chiave_paf_doc(doc, _hfatt, _bfatt)) return false; // Preparo il log log(-1, _bfatt); @@ -1838,36 +1858,34 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc) rifs.trim(); if (rifs == "0") rifs.cut(0); - int pos = rifs.find(" - "); - int len = rifs.len(); - long numlinea = 0; - if (len > 0 && pos < 0) - pos = len; + int len = rifs.len(); - for(; pos >= 0;) - { - TToken_string rif(rifs.left(pos), ' '); + if (len > 0) + { + rifs.replace(" - ", "|"); - // // - reset(paf1600f); - temp = rif.get(); - paf1600f.set("PF_NUMDDDT", temp); - temp = rif.get(); + long numlinea = 0; + TToken_string elab_rifs(rifs); - TDate dataddt(atoi(temp.left(2)), atoi(temp.mid(3,2)),atoi( temp.right(2))); - - paf1600f.set("PF_DATADDT", dataddt); - paf1600f.set("PF_GESTIONE", "D"); - paf1600f.set("PF_RIFNUMLINEA", numlinea++); - ok &= insert(paf1600f); - rifs.ltrim(pos + 3); - pos = rifs.find(" - "); - len = rifs.len(); - if (len > 0 && pos < 0) - pos = len; - // - } + FOR_EACH_STR_TOKEN(elab_rifs, str) + { + TToken_string rif(str, ' '); + + // // + reset(paf1600f); + temp = rif.get(); + paf1600f.set("PF_NUMDDDT", temp); + temp = rif.get(); + + TDate dataddt(atoi(temp.left(2)), atoi(temp.mid(3, 2)), atoi(temp.right(2))); + + paf1600f.set("PF_DATADDT", dataddt); + paf1600f.set("PF_GESTIONE", "D"); + paf1600f.set("PF_RIFNUMLINEA", numlinea++); + ok &= insert(paf1600f); // + } + } } FOR_EACH_PHYSICAL_FPRDOC(doc, r, rdoc) { diff --git a/src/fp/fplib03.cpp b/src/fp/fplib03.cpp index 0f034a169..ee0150491 100644 --- a/src/fp/fplib03.cpp +++ b/src/fp/fplib03.cpp @@ -91,7 +91,7 @@ bool TFp_mail_sender::send(const TString& msg) TPaf_record paf0100f("PAF0100F"); TString query; - if (chiave_paf(fdoc, hfatt, bfatt) && paf0100f.search(nullptr, hfatt, bfatt)) + if (chiave_paf_doc(fdoc, hfatt, bfatt) && paf0100f.search(nullptr, hfatt, bfatt)) { query << "UPDATE PAF0100F SET P1_ERRINT = 'S' WHERE P1_KEYHEADERFATT = '" << hfatt << "' AND P1_KEYBODYFATT = '" << bfatt << "'"; fp_db().sq_set_exec(query); diff --git a/src/fp/fplib05.cpp b/src/fp/fplib05.cpp index 3874dd69d..5a73e01ad 100644 --- a/src/fp/fplib05.cpp +++ b/src/fp/fplib05.cpp @@ -477,7 +477,8 @@ void TFP_expression::split_condition(const TString& cond, TString& cond_sx, TStr } } -// Questa funzione potrebbe diventare standard per TRectype +// Questa funzione potrebbe diventare standard per TRectype. Ma vai a cagare i variant sono da eliminare + TVariant& TFP_expression::get_value(const TRectype& rec, const TString& campo) { TVariant& ret = get_tmp_var();