From 9bee6e63e274123224ff54c3493d6da230f4d4c4 Mon Sep 17 00:00:00 2001 From: Mattia Tollari Date: Fri, 15 Feb 2019 11:45:43 +0100 Subject: [PATCH] Patch level : 12.0 no-patch Files correlati : Commento : Programma fatture mancata consegna --- src/fp/fp0500.cpp | 398 +++++++++++++++++++++++++++++++++++++++++++++ src/fp/fp0500a.h | 34 ++++ src/fp/fp0500a.uml | 279 +++++++++++++++++++++++++++++++ 3 files changed, 711 insertions(+) create mode 100644 src/fp/fp0500.cpp create mode 100644 src/fp/fp0500a.h create mode 100644 src/fp/fp0500a.uml diff --git a/src/fp/fp0500.cpp b/src/fp/fp0500.cpp new file mode 100644 index 000000000..0f126eb15 --- /dev/null +++ b/src/fp/fp0500.cpp @@ -0,0 +1,398 @@ +#include +#include +#include +#include "fplib.h" +#include +#include +#include + +#include "../ve/velib05.h" +#include "../cg/cglib03.h" +#include "../fe/felib.h" + +#include "fp0.h" +#include "fp0500a.h" + +///////////////////////////////////////////////////////////////////////////////////// +// Globals +///////////////////////////////////////////////////////////////////////////////////// + +#define LEN_HFATT 20 +#define LEN_BFATT 50 + +///////////////////////////////////////////////////////////////////////////////////// +// TMancati_mask +///////////////////////////////////////////////////////////////////////////////////// + +class TMancati_mask : public TAutomask +{ +protected: + enum {_codnum, _tipodoc, _dastato, _astato, _tiposdi}; + + void set_filter_changed(); + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + void next_page(int p); + bool check_not_empty(); + bool check_full_fields() const; + bool check_doc_filter(const TDocumentoEsteso& td) const; + void fill(); + + void load_all_fields(); + + bool _filter_changed; + +public: + TMancati_mask() : TAutomask("fp0500a"), _filter_changed(true) + { + disable(DLG_OK); + load_all_fields(); + } + void save_all_fields() const; +}; + +void TMancati_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_DOCUMENTI_TIPO)); +} + +void TMancati_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"), ';'); + // + auto& sheet = sfield(F_DOCUMENTI_TIPO); + sheet.hide(); + + TFP_selected_docs selected_docs; + + if (selected_docs.has_selected_docs()) + { + // Super nuova gestione super avanzata! + selected_docs.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(); +} + +void TMancati_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); + +#ifdef DBG + enable(DLG_OK); +#else + enable(DLG_OK, filter_selected != "X" && filter_selected != "P"); +#endif + + // 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(docs.cid2index(S_UFFICIO), false); + + 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; + + if (!chiave_paf(doc, hfatt, bfatt) || !paf0100f.search(nullptr, hfatt, bfatt) || paf0100f.sq_get("P1_GESTIONE") != "N" && paf0100f.sq_get("P1_ERRINT") != "M") + { + continue; + } + + TToken_string& row = docs.row(-1); + row = ""; + 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()); + if (!rec.get(DOC_TIPODOCSDI).is_empty()) + row.add(rec.get(DOC_TIPODOCSDI).as_string()); + else + row.add(td.tipo_doc_sdi()); + row.add(rec.get(DOC_NDOC).as_int()); + row.add(rec.get(DOC_DATADOC).as_date()); + row.add(rec.get(CFV_CODCF).as_int()); + row.add(rec.get("20." CLI_RAGSOC).as_string()); + + TString rif = get_dest_sdi(rec.get(CFV_TIPOCF).as_string()[0], rec.get(CFV_CODCF).as_int()); + // Se è ancora vuoto potrebbe essere estero + if(rif.empty()) + { + // Segno la riga errata + if (first) + { + first = false; + // Abilito la colonna del codice ufficio per segnalare l'errore + docs.enable_column(docs.cid2index(S_UFFICIO)); + } + docs.set_back_and_fore_color(COLOR_RED, COLOR_WHITE, rec.current_row(), docs.cid2index(S_UFFICIO)); + fat_no_cod++; + } +; + row.add(rif); + row.add(rec.get("17." CFV_PARIFAMM).as_string()); + row.add(rec.get("20." CLI_COFI).as_string()); + + bool split = rec.get("20." CLI_SPLITPAY).as_bool(); + if (split) + { + const long numreg = rec.get(DOC_NUMREG).as_int(); + if (numreg > 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(); +} + +void TMancati_mask::set_filter_changed() +{ + _filter_changed = true; +} + +bool TMancati_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_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; + 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 TMancati_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 TMancati_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 TMancati_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 TMancati_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_DOCUMENTI_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; +} + + +///////////////////////////////////////////////////////////////////////////////////// +// TMancati_app +///////////////////////////////////////////////////////////////////////////////////// + +class TMancati_app : public TSkeleton_application +{ + +public: + virtual bool create(); + virtual bool destroy(); + virtual void main_loop(); + + TMancati_app() {} +}; + +void TMancati_app::main_loop() +{ + TMancati_mask mask; + while (mask.run() == K_ENTER) + { + } +} + +bool TMancati_app::create() +{ + open_files(LF_TAB, LF_TABCOM, LF_TABMOD, LF_ANAG, + LF_CLIFO, LF_CFVEN, LF_CFBAN, LF_NDITTE, + LF_DOC, LF_RIGHEDOC, 0); + + 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 TMancati_app::destroy() +{ + fp_db().sq_disconnect(); + return TSkeleton_application::destroy(); +} + +int fp0500(int argc, char* argv[]) +{ + TMancati_app d2p; + d2p.run(argc, argv, TR("Elenco Fatture Mancata Consegna")); + return 0; +} diff --git a/src/fp/fp0500a.h b/src/fp/fp0500a.h new file mode 100644 index 000000000..917e551c3 --- /dev/null +++ b/src/fp/fp0500a.h @@ -0,0 +1,34 @@ +#define START_MASK 401 +#define F_DATAINI 401 +#define F_DATAEND 402 +#define F_SETDEFCOD 403 +#define F_SETCODEST 404 +#define F_VALCODEST 405 +#define END_MASK 499 + + +#define F_DOCUMENTI_TIPO 301 + +#define S_SELCODNUM 101 +#define S_TIPODOCSEL 102 +#define S_DASTATO 103 +#define S_ASTATO 104 +#define S_TIPODOCSDI 105 + +#define F_DOCS 201 + +#define S_SELECTED 101 +#define S_ANNO 102 +#define S_CODNUM 103 +#define S_TIPODOC 104 +#define S_CODSDI 105 +#define S_NDOC 106 +#define S_DATADOC 107 +#define S_CLIENTE 108 +#define S_RAGSOC 109 +#define S_UFFICIO 110 +#define S_RIFAMM 111 +#define S_COFI 112 +#define S_SPLITPAY 113 +#define S_ATTACH 114 +#define S_ONLYGEN 115 diff --git a/src/fp/fp0500a.uml b/src/fp/fp0500a.uml new file mode 100644 index 000000000..f1d778594 --- /dev/null +++ b/src/fp/fp0500a.uml @@ -0,0 +1,279 @@ +#include "fp0500a.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 + +#include + +ENDPAGE + +PAGE "Elenco fatture mancata consegna" 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 + +SPREADSHEET F_DOCUMENTI_TIPO 80 5 +BEGIN + PROMPT 1 6 "" + ITEM "Cod Num" + ITEM "Tipo Doc" + ITEM "Stato Iniziale" + ITEM "Stato Finale" + ITEM "Tipo SDI" +END + +ENDPAGE + +PAGE "Elenco Fatture" 0 2 0 0 + +SPREADSHEET F_DOCS +BEGIN + PROMPT 0 2 "" + ITEM "@1" + ITEM "Anno" + ITEM "Cod.\nNum.@4" + ITEM "Tipo\nDoc@4" + ITEM "Tipo SDI@4" + ITEM "Num.\nDoc.@7" + ITEM "Data\nDoc.@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 tipo doc" -1 -1 50 3 + +STRING S_SELCODNUM 4 +BEGIN + PROMPT 1 1 "Numerazione " + HELP "Codice numerazione" + USE %NUM + INPUT CODTAB S_SELCODNUM + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT S_SELCODNUM CODTAB + CHECKTYPE REQUIRED + FLAG "UPA" + WARNING "Numerazione assente" + KEY 1 2 +END + +STRING S_TIPODOCSEL 4 +BEGIN + PROMPT 15 1 "Tipo doc " + HELP "Codice tipo documento" + USE %TIP + SELECT S3[37,40]!="" + INPUT CODTAB S_TIPODOCSEL + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + DISPLAY "Tipo SDI@10" S3[37,40] + OUTPUT S_TIPODOCSEL CODTAB + OUTPUT S_TIPODOCSDI S3[37,40] + CHECKTYPE FORCED + FLAG "UPA" +END + +STRING S_DASTATO 1 +BEGIN + PROMPT 1 2 "Da stato " + USE %STD + INPUT CODTAB S_DASTATO + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT S_DASTATO CODTAB + FLAG "U" +END + +STRING S_ASTATO 1 +BEGIN + PROMPT 15 2 "A stato " + USE %STD + INPUT CODTAB S_ASTATO + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT S_ASTATO CODTAB + FLAG "U" +END + +STRING S_TIPODOCSDI 4 +BEGIN + PROMPT 30 1 "Tipo Doc SDI" + FLAG "D" +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 + +STRING S_CODNUM 4 +BEGIN + PROMPT 21 2 "Numerazione " + FLAGS "D" +END + +STRING S_TIPODOC 4 +BEGIN + PROMPT 21 2 "Tipo Documento " + FLAGS "D" +END + +LIST S_CODSDI 35 +BEGIN + PROMPT 41 2 "Tipo Doc SDI" + ITEM "TD01|TD01 Fattura" + ITEM "TD02|TD02 Acconto/Anticipo su fattura" + ITEM "TD03|TD03 Acconto/Anticipo su parcella" + ITEM "TD04|TD04 Nota di credito" + ITEM "TD05|TD05 Nota di debito" + ITEM "TD06|TD06 Parcella" + ITEM "TD20|TD20 Autofattura" +END + +NUMBER S_NDOC 7 +BEGIN + PROMPT 1 3 "Numero " + FLAGS "D" +END + +DATE S_DATADOC +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 "Assogettato 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