From 45c051406c81ecac7ca6acda6f6be21be3797a7c Mon Sep 17 00:00:00 2001 From: Simone Palacino Date: Fri, 8 Feb 2019 17:18:16 +0100 Subject: [PATCH 1/3] Patch level : 12.0 698 Files correlati : fp Commento : implementazione monitor fatture passive --- src/fp/fp0400.cpp | 200 +++++++++++++++++++++++++++++++++++++++++++++ src/fp/fp0400a.h | 32 ++++++++ src/fp/fp0400a.uml | 175 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 407 insertions(+) create mode 100644 src/fp/fp0400.cpp create mode 100644 src/fp/fp0400a.h create mode 100644 src/fp/fp0400a.uml diff --git a/src/fp/fp0400.cpp b/src/fp/fp0400.cpp new file mode 100644 index 000000000..e5a801111 --- /dev/null +++ b/src/fp/fp0400.cpp @@ -0,0 +1,200 @@ +///////////////////////////////////////////////////////////////////////////////////// +// TPassive_mask +///////////////////////////////////////////////////////////////////////////////////// + +#include "defmask.h" +#include "automask.h" +#include "applicat.h" +#include +#include "tsdb.h" +#include "fp0400a.h" +#include "fplib.h" + + +class TPassive_mask : public TAutomask +{ +protected: + + void set_filter_changed(); + bool on_field_event(TOperable_field& o, TField_event e, long jolly) override; + void next_page(int p) override; + void fill(); + void init(); + + void load_all_fields(); + + bool _filter_changed; + +public: + void save_all_fields() const; + + TPassive_mask() : TAutomask("fp0400a"), _filter_changed(true) + { + load_all_fields(); + } +}; + +void TPassive_mask::set_filter_changed() +{ + _filter_changed = true; +} + +void TPassive_mask::next_page(int p) +{ + //if(true) + if (_filter_changed && p != 1000) + { + fill(); + _filter_changed = false; + } + TAutomask::next_page(p); +} + +void TPassive_mask::fill() +{ + TSheet_field& sf = sfield(F_DOCS); + //TString_array& sht = sf.rows_array(); + sf.hide(); + sf.destroy(); + + const TDate dal = get(F_DATAINI); + const TDate al = get(F_DATAEND); + + TString query; + + query << "SELECT YEAR(P7_DATA) as ANNO, P7_TIPODOC as [TIPO_SDI], P7_NUMERO as [NUM_DOC], " << + "P7_DATA as [DATA_DOC], PQ_IMPTOTDOC as [TOT_DOC], P2_ANADENOMIN AS [RAG_SOC], P2_ANANOME AS NOME, " << + "P2_ANACOGNOME AS COGNOME, P2_FISCIVACOD AS [P_IVA], P2_CODFISCALE AS [COD_FISC], P2_FISCIVAPAESE AS [COD_PAESE], PP_ATTACHMENT ATTACHMENT, P1_CODDEST as [COD_SDI], PU_PEC AS PEC\n" << + "FROM PAA0100F PAA01\n" << + "JOIN PAA0200F PAA02 ON P1_KEYPRGINVIO = P2_KEYPRGINVIO and P1_KEYHEADERFATT = P2_KEYHEADERFATT and P1_KEYBODYFATT = P2_KEYBODYFATT\n" << + "JOIN PAA0700F PAA07 ON P1_KEYPRGINVIO = P7_KEYPRGINVIO and P1_KEYHEADERFATT = P7_KEYHEADERFATT and P1_KEYBODYFATT = P7_KEYBODYFATT\n" << + "JOIN PAA2700F PAA27 ON P1_KEYPRGINVIO = PQ_KEYPRGINVIO and P1_KEYHEADERFATT = PQ_KEYHEADERFATT and P1_KEYBODYFATT = PQ_KEYBODYFATT\n" << + "LEFT JOIN PAA2600F PAA26 ON P1_KEYPRGINVIO = PP_KEYPRGINVIO and P1_KEYHEADERFATT = PP_KEYHEADERFATT and P1_KEYBODYFATT = PP_KEYBODYFATT\n" << + "LEFT JOIN PAA3200F PAA32 ON P1_KEYPRGINVIO = PU_KEYPRGINVIO and PU_KEYHEADERFATT = PU_KEYHEADERFATT and P1_KEYBODYFATT = PU_KEYBODYFATT\n" << + "WHERE P7_DATA >= \'" << dal.date2ansi() << "\' AND P7_DATA <= \'" << al.date2ansi() << "\'"; + fp_db().sq_set_exec(query, false); + + //TProgress_monitor pi(fp_db().sq_items(), nullptr); + + TLocalisamfile clifo(LF_CLIFO); + + while(fp_db().sq_next()) + //for(bool ok = ; ok; ok = s.sq_next()) + { + clifo.zero(); + clifo.put(CLI_TIPOCF, 'F'); + TToken_string& row = sf.row(-1); + TString denom = fp_db().sq_get("RAG_SOC"); + if (denom.blank()) { + denom = fp_db().sq_get("NOME"); + denom.trim(); + denom << " " << fp_db().sq_get("COGNOME"); + denom.trim(); + } + TString id_fisc = fp_db().sq_get("COGNOME"); + + row.add(fp_db().sq_get_int("ANNO"), 0); + row.add(fp_db().sq_get("TIPO_SDI")); + row.add(fp_db().sq_get("NUM_DOC")); + row.add(fp_db().sq_get("DATA_DOC")); + row.add(fp_db().sq_get("TOT_DOC")); + // Cerco se il fornitore è presente in Campo + + if (fp_db().sq_get("P_IVA") == "01903590154") + bool tolla = true; + + + if(fp_db().sq_get("COD_PAESE").full() && fp_db().sq_get("P_IVA").full()) + { + clifo.setkey(5); + clifo.put(CLI_STATOPAIV, fp_db().sq_get("COD_PAESE")); + clifo.put(CLI_PAIV, fp_db().sq_get("P_IVA")); + if(clifo.read() == NOERR) + row.add(clifo.get(CLI_CODCF)); + else if (fp_db().sq_get("COD_PAESE") == "IT") + { + clifo.put(CLI_PAIV, fp_db().sq_get("P_IVA")); + clifo.put(CLI_STATOPAIV, ""); + if (clifo.read() == NOERR) + row.add(clifo.get(CLI_CODCF)); + } + } + else if(fp_db().sq_get("COD_FISC").full()) + { + clifo.setkey(4); + clifo.put(CLI_COFI, fp_db().sq_get("COD_FISC")); + if (clifo.read() == NOERR) + row.add(clifo.get(CLI_CODCF)); + } + row.add(denom, sf.cid2index(S_RAGSOC)); + + row.add(fp_db().sq_get("COD_PAESE") << fp_db().sq_get("P_IVA")); + row.add(fp_db().sq_get("COD_FISC")); + TString appo = fp_db().sq_get("ATTACHMENT"); + row.add( appo.blank() ? "" : "X" ); + row.add(fp_db().sq_get("COD_SDI").blank() ? fp_db().sq_get("PEC") : fp_db().sq_get("COD_SDI")); + } + + sf.force_update(); + sf.show(); +} + +void TPassive_mask::init() +{ +} + +void TPassive_mask::load_all_fields() +{ +} + +bool TPassive_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + switch (o.dlg()) + { + 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)); + 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; +} + + +///////////////////////////////////////////////////////////////////////////////////// +// TPassive_app +///////////////////////////////////////////////////////////////////////////////////// + +class TPassive_app : public TSkeleton_application +{ + +public: + void main_loop() override; + + TPassive_app() = default; +}; + +void TPassive_app::main_loop() +{ + TPassive_mask mask; + while(mask.run() == K_ENTER) + { + + } +} + +int fp0400(int argc, char * argv[]) +{ + TPassive_app fpas; + fpas.run(argc, argv, TR("Fatturazione F.P.")); + return 0; +} \ No newline at end of file diff --git a/src/fp/fp0400a.h b/src/fp/fp0400a.h new file mode 100644 index 000000000..873ebaaff --- /dev/null +++ b/src/fp/fp0400a.h @@ -0,0 +1,32 @@ +#define START_MASK 401 +#define F_DATAINI 401 +#define F_DATAEND 402 +#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 101 +#define S_CODSDI 102 +#define S_NDOC 103 +#define S_DATADOC 104 +#define S_TOTDOC 105 +#define S_CLIENTE 106 +#define S_RAGSOC 107 +#define S_PARIVA 108 +#define S_CODFISC 109 +#define S_ATTACH 110 +#define S_COFI 111 + + + + diff --git a/src/fp/fp0400a.uml b/src/fp/fp0400a.uml new file mode 100644 index 000000000..1d9a29d84 --- /dev/null +++ b/src/fp/fp0400a.uml @@ -0,0 +1,175 @@ +#include "fp0400a.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_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 + +#include + +ENDPAGE + +PAGE "Fatture Passive" 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 + + +ENDPAGE + +PAGE "Elenco Fatture" 0 2 0 0 + +SPREADSHEET F_DOCS +BEGIN + PROMPT 0 2 "" + ITEM "Anno" + ITEM "Tipo SDI@4" + ITEM "Num.\nDoc.@11" + ITEM "Data\nDoc.@10" + ITEM "Totale\nDoc." + ITEM "Fornitore" + ITEM "Ragione Sociale@50" + ITEM "P. IVA@16" + ITEM "Cod. Fiscale@16" + ITEM "Allegati" + ITEM "Codice destinatario@20" +END + +ENDPAGE +ENDMASK + + +PAGE "Documento" -1 -1 78 9 + +NUMBER S_ANNO 4 +BEGIN + PROMPT 1 2 "Anno " + 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" + FLAG "D" +END + +NUMBER S_NDOC 11 +BEGIN + PROMPT 1 3 "Numero " + FLAGS "D" +END + +DATE S_DATADOC +BEGIN + PROMPT 21 3 "Data " + FLAGS "D" +END + +NUMBER S_TOTDOC 11 3 +BEGIN + PROMPT 26 3 "Data " + FLAGS "D" +END + +NUMBER S_CLIENTE 6 +BEGIN + PROMPT 1 4 "Fornitore " + FLAGS "D" +END + +STRING S_RAGSOC 50 +BEGIN + PROMPT 21 4 "" + FLAGS "D" +END + +STRING S_PARIVA 50 20 +BEGIN + PROMPT 1 5 "" + FLAGS "D" +END + +STRING S_CODFISC 50 20 +BEGIN + PROMPT 1 5 "" + FLAGS "D" +END + +STRING S_COFI 20 +BEGIN + PROMPT 1 6 "" + FLAGS "D" +END + +BOOLEAN S_ATTACH +BEGIN + PROMPT 1 8 "Documenti in allegato" + 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 From 5719d44a2649c228aa4220034ec46af1c45aeacb Mon Sep 17 00:00:00 2001 From: Tolla Date: Mon, 11 Feb 2019 14:12:10 +0100 Subject: [PATCH 2/3] Patch level : 12.0 698 Files correlati : fp Commento : - Allineato porgramma per esterometro - Sistemata duplicazione dichiarazione macro --- src/tf/tf0100.cpp | 3 +++ src/tf/tf0100a.h | 8 ++++++-- src/tf/tf0100a.uml | 30 +++++++++++++++++++++++++++++- src/tf/tf0100b.h | 8 +++++++- src/tf/tf0101.cpp | 2 +- src/tf/tf0102.cpp | 4 ++-- src/tf/tf0400.cpp | 8 ++++++-- src/tf/tfutility.cpp | 39 ++++++++++++++++++++++++++------------- src/tf/tfutility.h | 2 +- 9 files changed, 81 insertions(+), 23 deletions(-) diff --git a/src/tf/tf0100.cpp b/src/tf/tf0100.cpp index c06548ec9..063498eb5 100644 --- a/src/tf/tf0100.cpp +++ b/src/tf/tf0100.cpp @@ -687,6 +687,9 @@ bool TTrFa_app::create() // Questa funzione crea/verifica il DB verifyDB(create); + // Setto se ha il modulo FP + msk().set_has_fp(has_module(FPAUT)); + return TSkeleton_application::create(); } diff --git a/src/tf/tf0100a.h b/src/tf/tf0100a.h index c919eaac1..f9f988034 100644 --- a/src/tf/tf0100a.h +++ b/src/tf/tf0100a.h @@ -19,9 +19,13 @@ #define B_TIPO_BOLLADOG 413 #define B_TIPO_STORDOC 414 -#define END_BOOLEAN 415 +// Boolean filtri FP +#define B_ESTEROMETRO 416 +#define B_PAF_SENT 417 +#define B_PAF_NOT_SENT 418 +#define B_REVCHARGE 419 -#define F_ESTEROMETRO 416 +#define END_BOOLEAN 419 #define END_MASK 421 diff --git a/src/tf/tf0100a.uml b/src/tf/tf0100a.uml index c4376f548..0a35d1a1e 100644 --- a/src/tf/tf0100a.uml +++ b/src/tf/tf0100a.uml @@ -165,9 +165,37 @@ BEGIN FLAGS "" END +GROUPBOX DLG_NULL 65 6 +BEGIN + PROMPT 30 11 "Filtri clienti FP" + MODULE FP +END + BOOLEAN B_ESTEROMETRO BEGIN - PROMPT 1 10 "Esporta solo fatture attive non inviate con FP" + PROMPT 31 12 "Modalità esterometro" + MESSAGE FALSE DISABLE,10@ + MESSAGE TRUE ENABLE,10@ +END + +BOOLEAN B_PAF_SENT +BEGIN + PROMPT 31 13 "Fatture Inviate" + GROUP 10 + FLAGS "" +END + +BOOLEAN B_PAF_NOT_SENT +BEGIN + PROMPT 31 14 "Fatture non Inviate" + GROUP 10 + FLAGS "" +END + +BOOLEAN B_REVCHARGE +BEGIN + PROMPT 31 15 "Fatture in reverse charge" + GROUP 10 FLAGS "" END diff --git a/src/tf/tf0100b.h b/src/tf/tf0100b.h index 2f54897cc..00243fbee 100644 --- a/src/tf/tf0100b.h +++ b/src/tf/tf0100b.h @@ -61,7 +61,10 @@ enum filter_fatt #define SPESOMETROBASE "ModuliSirio" #define REG_ATT 1 #define REG_PAS 2 + +#ifndef CARATTERI_SPECIALI #define CARATTERI_SPECIALI "àèéìòù°" +#endif /* Così facendo basta modificare la maschera (e le dichiarazioni di conseguenza) * per avere l'inserimento nello sheet corretto */ @@ -173,12 +176,13 @@ class TTrFa_cursors : TObject bool _newCust; // Se trovo un record custom devo saltare tutti quelli che trovo successivamente, per fare ciò utilizzo una TToken_string TToken_string _alqCust; + bool _has_fp; TRectype _next(return_code& code, TString& tipocf, TString& codcf, TString& ocfpi); // Si sposta avanti di un elemento TRectype _nextCust(return_code& code, TString& tipocf, TString& codcf, TString& ocfpi); // Si sposta avanti di un elemento tra quelli custom bool checkEnabled(TISAM_recordset* origCur); public: - //TTrFa_cursors(); + TTrFa_cursors(bool has_fp) : c_rmoviva(nullptr), c_trasfatt(nullptr), _newMov(false), _newCust(false), _has_fp(has_fp){} ~TTrFa_cursors(); long int getIvaItems() { return c_rmoviva->items(); } long int getIvaPos() { return c_rmoviva->cursor()->pos(); } @@ -199,6 +203,7 @@ class TTrFa_mask : public TAutomask TMaskmode _mode; bool _sheet_dirty; bool _filter_changed; + bool _has_fp; protected: virtual void next_page(int p); @@ -208,6 +213,7 @@ protected: void openJava(); public: + void set_has_fp(bool has_fp) { _has_fp = has_fp; } void setFilterChanged() { _filter_changed = true; } void load_sheet(); TTrFa_mask(TString msk); diff --git a/src/tf/tf0101.cpp b/src/tf/tf0101.cpp index 25b7f08b8..e85a7783b 100644 --- a/src/tf/tf0101.cpp +++ b/src/tf/tf0101.cpp @@ -614,7 +614,7 @@ void TTrFa_mask::load_sheet() static const TString pivaDitta = cache().get(LF_ANAG, key, "PAIV"); static const TString cofiDitta = cache().get(LF_ANAG, key, "COFI"); - TTrFa_cursors c; + TTrFa_cursors c(_has_fp); TSheet_field& sheet = sfield(F_RIGHE); diff --git a/src/tf/tf0102.cpp b/src/tf/tf0102.cpp index 95899c675..a0c8f420d 100644 --- a/src/tf/tf0102.cpp +++ b/src/tf/tf0102.cpp @@ -75,7 +75,7 @@ TRectype TTrFa_cursors::_next(return_code& code, TString& tipocf, TString& codcf // Se non è un movimento o il controllo fallisce mi sposto int tipoDoc = getTipoDoc(c_rmoviva->get("23.TIPODOC").as_string()); - if(!newMov || !checkRecord(c_rmoviva) || tipoDoc == -1 || !msk().get_bool(tipoDoc)) + if(!newMov || !checkRecord(c_rmoviva, _has_fp) || tipoDoc == -1 || !msk().get_bool(tipoDoc)) { static TString codiva; do @@ -93,7 +93,7 @@ TRectype TTrFa_cursors::_next(return_code& code, TString& tipocf, TString& codcf codiva.cut(0) << c_rmoviva->get("25.CODIVA").as_string(); } } // Ciclo finchè non trovo un nuovo movimento o trovo cod IVA già presi da cust - while((!_newMov && _alqCust.get_pos(codiva) > -1) || !checkEnabled(c_rmoviva) || !checkRecord(c_rmoviva)); + while((!_newMov && _alqCust.get_pos(codiva) > -1) || !checkEnabled(c_rmoviva) || !checkRecord(c_rmoviva, _has_fp)); } // Se ho cambiato movimento ritorno, leggerò poi al prossimo giro diff --git a/src/tf/tf0400.cpp b/src/tf/tf0400.cpp index 84f830c4c..5509ff841 100644 --- a/src/tf/tf0400.cpp +++ b/src/tf/tf0400.cpp @@ -7,7 +7,7 @@ #include #include // cache() #include "../fe/felib.h" // TAnagrafica - +#include "modaut.h" /**************************************************************************************************** * TSpeCheck_msk @@ -18,6 +18,7 @@ class TSpeCheck_msk : public TAutomask private: TAnagrafica _ditta; bool _selected; + bool _has_fp; void refresh(); void fillNoFilter(); @@ -30,7 +31,9 @@ private: void saveAll(); void deleteAll(); virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + public: + void set_has_fp(bool has_fp) { _has_fp = has_fp; } TSpeCheck_msk(); virtual ~TSpeCheck_msk() {}; }; @@ -173,7 +176,7 @@ void TSpeCheck_msk::fillNoFilter() for(bool ok = rset.move_first(); ok; ok = rset.move_next()) { // Devo prendere tutti quelli che non vanno bene di records - if(checkRecord(&rset)) continue; + if(checkRecord(&rset, _has_fp)) continue; TRectype clifo = getCli(rset.get("23.TIPO").as_string(), rset.get("23.CODCF").as_string(), rset.get("23.OCCAS").as_string()); TToken_string& row = s.row(-1); @@ -641,6 +644,7 @@ TSpeCheck_app& app() { return (TSpeCheck_app&)main_app(); } void TSpeCheck_app::main_loop() { TSpeCheck_msk msk; + msk.set_has_fp(has_module(FPAUT)); msk.run(); } diff --git a/src/tf/tfutility.cpp b/src/tf/tfutility.cpp index 92a29f002..4c7cb87b7 100644 --- a/src/tf/tfutility.cpp +++ b/src/tf/tfutility.cpp @@ -83,7 +83,7 @@ TString getRFSO(TString codrfso) * Nota bene: viene sfruttato un puntatore di TISAM_Recordset per non creare nuovi oggetti e velocizzare la chiamata * a questo punto il programma non ha ancora creato un record di $trasfatt con i dati che mi interessano */ -bool checkRecord(TISAM_recordset* rec) +bool checkRecord(TISAM_recordset* rec, bool has_fp) { // Il record non è valido se non è presente un cliente if(rec->get("23.TIPO").as_string()[0] == '\0' || rec->get("23.CODCF").as_int() == 0) @@ -102,25 +102,38 @@ bool checkRecord(TISAM_recordset* rec) { // Tolgo tutti i movimenti di sola IVA e in reverse charge o di tipo 3 (Acquisto di beni e servizi di soggetti non residenti) TCausale caus(rec->get("23.CODCAUS").as_string(), rec->get("23.DATAREG").as_date().year()); - if(caus.soloiva() && (caus.reverse_charge() || caus.regime_speciale() == 3)) + const bool filter_revcharge = msk().get_bool(B_ESTEROMETRO) ? msk().get_bool(B_REVCHARGE) : false; + if(!filter_revcharge && caus.soloiva() && (caus.reverse_charge() || caus.regime_speciale() == 3)) return false; // controllo se la fattura non è già stata spedita con la fatt. elettronica static TPaf_record paf0100f("PAF0100F"); // controllo se il movimento è agganciato a un documento - if(!rec->get("23.DPROVV").is_empty() && !rec->get("23.DANNO").is_empty() && !rec->get("23.DCODNUM").is_empty() && !rec->get("23.DNDOC").is_empty()) + if(msk().get_bool(B_ESTEROMETRO) && !rec->get("23.DPROVV").is_empty() && !rec->get("23.DANNO").is_empty() && !rec->get("23.DCODNUM").is_empty() && !rec->get("23.DNDOC").is_empty()) { - TString hfatt, bfatt; - TRectype rdoc(LF_DOC); - rdoc.put(DOC_PROVV, rec->get("23.DPROVV").as_string()); - rdoc.put(DOC_PROVV, rec->get("23.DANNO").as_string()); - rdoc.put(DOC_PROVV, rec->get("23.DCODNUM").as_string()); - rdoc.put(DOC_PROVV, rec->get("23.DNDOC").as_string()); - - // se riesco a generare la chiave, trovo il record e ha il flag di gestione in errore o un errore esterno, salto la fattura (solo se attivo flag in maschera) - if (msk().get_bool(F_ESTEROMETRO) && chiave_paf(rdoc, hfatt, bfatt) && paf0100f.search(nullptr, hfatt, bfatt) && (paf0100f.sq_get("P1_GESTIONE") == "E" || paf0100f.sq_get("P1_ERREST") == "*")) + // Controllo valido solo per utenti non F8 + const bool check_paf_sent = msk().get_bool(B_PAF_SENT); + const bool check_paf_not_sent = msk().get_bool(B_PAF_NOT_SENT); + // Se l'utente ha il modulo FP e uno dei due filtri possibili non è stato selezionato, abilito il controllo sui paf + if(has_fp && (!check_paf_sent || !check_paf_not_sent)) { - return false; + TString hfatt, bfatt; + TRectype rdoc(LF_DOC); + static TLocalisamfile doc(LF_DOC); + rdoc.put(DOC_PROVV, rec->get("23.DPROVV").as_string()); + rdoc.put(DOC_PROVV, rec->get("23.DANNO").as_string()); + rdoc.put(DOC_PROVV, rec->get("23.DCODNUM").as_string()); + rdoc.put(DOC_PROVV, rec->get("23.DNDOC").as_string()); + + // Se riesco a generare la chiave, trovo il record e ha il flag di gestione in errore o un errore esterno, so che è stato inviato + const bool paf_sent = rdoc.read(doc) == NOERR && chiave_paf(rdoc, hfatt, bfatt) && paf0100f.search(nullptr, hfatt, bfatt) && paf0100f.sq_get("P1_GESTIONE") != "E" && paf0100f.sq_get("P1_ERREST") != "*"; + // Se voglio solo quelli inviati e non è stato inviato, RUSPA! + if (check_paf_sent && !paf_sent) + return false; + + // Se voglio solo quelli non inviati ed è stato inviato, RUSPA! + if (check_paf_not_sent && paf_sent) + return false; } } diff --git a/src/tf/tfutility.h b/src/tf/tfutility.h index 9d1e75c60..a9413de1d 100644 --- a/src/tf/tfutility.h +++ b/src/tf/tfutility.h @@ -22,4 +22,4 @@ TString revCharge(TString numreg, int year); // Ritorna la ragione sociale del RFSO TString getRFSO(TString codrfso); // Controllo che sia un record che mi interessa -bool checkRecord(TISAM_recordset* rec); \ No newline at end of file +bool checkRecord(TISAM_recordset* rec, bool has_fp); \ No newline at end of file From c470e5c3c6cd4c2836efd9d146c351cd0b6b75d2 Mon Sep 17 00:00:00 2001 From: Tolla Date: Mon, 11 Feb 2019 14:12:10 +0100 Subject: [PATCH 3/3] Patch level : 12.0 700 Files correlati : tf Commento : - Allineato porgramma per esterometro - Sistemata duplicazione dichiarazione macro --- src/tf/tf0100.cpp | 3 +++ src/tf/tf0100a.h | 8 ++++++-- src/tf/tf0100a.uml | 30 +++++++++++++++++++++++++++++- src/tf/tf0100b.h | 8 +++++++- src/tf/tf0101.cpp | 2 +- src/tf/tf0102.cpp | 4 ++-- src/tf/tf0400.cpp | 8 ++++++-- src/tf/tfutility.cpp | 39 ++++++++++++++++++++++++++------------- src/tf/tfutility.h | 2 +- 9 files changed, 81 insertions(+), 23 deletions(-) diff --git a/src/tf/tf0100.cpp b/src/tf/tf0100.cpp index c06548ec9..063498eb5 100644 --- a/src/tf/tf0100.cpp +++ b/src/tf/tf0100.cpp @@ -687,6 +687,9 @@ bool TTrFa_app::create() // Questa funzione crea/verifica il DB verifyDB(create); + // Setto se ha il modulo FP + msk().set_has_fp(has_module(FPAUT)); + return TSkeleton_application::create(); } diff --git a/src/tf/tf0100a.h b/src/tf/tf0100a.h index c919eaac1..f9f988034 100644 --- a/src/tf/tf0100a.h +++ b/src/tf/tf0100a.h @@ -19,9 +19,13 @@ #define B_TIPO_BOLLADOG 413 #define B_TIPO_STORDOC 414 -#define END_BOOLEAN 415 +// Boolean filtri FP +#define B_ESTEROMETRO 416 +#define B_PAF_SENT 417 +#define B_PAF_NOT_SENT 418 +#define B_REVCHARGE 419 -#define F_ESTEROMETRO 416 +#define END_BOOLEAN 419 #define END_MASK 421 diff --git a/src/tf/tf0100a.uml b/src/tf/tf0100a.uml index c4376f548..0a35d1a1e 100644 --- a/src/tf/tf0100a.uml +++ b/src/tf/tf0100a.uml @@ -165,9 +165,37 @@ BEGIN FLAGS "" END +GROUPBOX DLG_NULL 65 6 +BEGIN + PROMPT 30 11 "Filtri clienti FP" + MODULE FP +END + BOOLEAN B_ESTEROMETRO BEGIN - PROMPT 1 10 "Esporta solo fatture attive non inviate con FP" + PROMPT 31 12 "Modalità esterometro" + MESSAGE FALSE DISABLE,10@ + MESSAGE TRUE ENABLE,10@ +END + +BOOLEAN B_PAF_SENT +BEGIN + PROMPT 31 13 "Fatture Inviate" + GROUP 10 + FLAGS "" +END + +BOOLEAN B_PAF_NOT_SENT +BEGIN + PROMPT 31 14 "Fatture non Inviate" + GROUP 10 + FLAGS "" +END + +BOOLEAN B_REVCHARGE +BEGIN + PROMPT 31 15 "Fatture in reverse charge" + GROUP 10 FLAGS "" END diff --git a/src/tf/tf0100b.h b/src/tf/tf0100b.h index 2f54897cc..00243fbee 100644 --- a/src/tf/tf0100b.h +++ b/src/tf/tf0100b.h @@ -61,7 +61,10 @@ enum filter_fatt #define SPESOMETROBASE "ModuliSirio" #define REG_ATT 1 #define REG_PAS 2 + +#ifndef CARATTERI_SPECIALI #define CARATTERI_SPECIALI "àèéìòù°" +#endif /* Così facendo basta modificare la maschera (e le dichiarazioni di conseguenza) * per avere l'inserimento nello sheet corretto */ @@ -173,12 +176,13 @@ class TTrFa_cursors : TObject bool _newCust; // Se trovo un record custom devo saltare tutti quelli che trovo successivamente, per fare ciò utilizzo una TToken_string TToken_string _alqCust; + bool _has_fp; TRectype _next(return_code& code, TString& tipocf, TString& codcf, TString& ocfpi); // Si sposta avanti di un elemento TRectype _nextCust(return_code& code, TString& tipocf, TString& codcf, TString& ocfpi); // Si sposta avanti di un elemento tra quelli custom bool checkEnabled(TISAM_recordset* origCur); public: - //TTrFa_cursors(); + TTrFa_cursors(bool has_fp) : c_rmoviva(nullptr), c_trasfatt(nullptr), _newMov(false), _newCust(false), _has_fp(has_fp){} ~TTrFa_cursors(); long int getIvaItems() { return c_rmoviva->items(); } long int getIvaPos() { return c_rmoviva->cursor()->pos(); } @@ -199,6 +203,7 @@ class TTrFa_mask : public TAutomask TMaskmode _mode; bool _sheet_dirty; bool _filter_changed; + bool _has_fp; protected: virtual void next_page(int p); @@ -208,6 +213,7 @@ protected: void openJava(); public: + void set_has_fp(bool has_fp) { _has_fp = has_fp; } void setFilterChanged() { _filter_changed = true; } void load_sheet(); TTrFa_mask(TString msk); diff --git a/src/tf/tf0101.cpp b/src/tf/tf0101.cpp index 25b7f08b8..e85a7783b 100644 --- a/src/tf/tf0101.cpp +++ b/src/tf/tf0101.cpp @@ -614,7 +614,7 @@ void TTrFa_mask::load_sheet() static const TString pivaDitta = cache().get(LF_ANAG, key, "PAIV"); static const TString cofiDitta = cache().get(LF_ANAG, key, "COFI"); - TTrFa_cursors c; + TTrFa_cursors c(_has_fp); TSheet_field& sheet = sfield(F_RIGHE); diff --git a/src/tf/tf0102.cpp b/src/tf/tf0102.cpp index 95899c675..a0c8f420d 100644 --- a/src/tf/tf0102.cpp +++ b/src/tf/tf0102.cpp @@ -75,7 +75,7 @@ TRectype TTrFa_cursors::_next(return_code& code, TString& tipocf, TString& codcf // Se non è un movimento o il controllo fallisce mi sposto int tipoDoc = getTipoDoc(c_rmoviva->get("23.TIPODOC").as_string()); - if(!newMov || !checkRecord(c_rmoviva) || tipoDoc == -1 || !msk().get_bool(tipoDoc)) + if(!newMov || !checkRecord(c_rmoviva, _has_fp) || tipoDoc == -1 || !msk().get_bool(tipoDoc)) { static TString codiva; do @@ -93,7 +93,7 @@ TRectype TTrFa_cursors::_next(return_code& code, TString& tipocf, TString& codcf codiva.cut(0) << c_rmoviva->get("25.CODIVA").as_string(); } } // Ciclo finchè non trovo un nuovo movimento o trovo cod IVA già presi da cust - while((!_newMov && _alqCust.get_pos(codiva) > -1) || !checkEnabled(c_rmoviva) || !checkRecord(c_rmoviva)); + while((!_newMov && _alqCust.get_pos(codiva) > -1) || !checkEnabled(c_rmoviva) || !checkRecord(c_rmoviva, _has_fp)); } // Se ho cambiato movimento ritorno, leggerò poi al prossimo giro diff --git a/src/tf/tf0400.cpp b/src/tf/tf0400.cpp index 84f830c4c..5509ff841 100644 --- a/src/tf/tf0400.cpp +++ b/src/tf/tf0400.cpp @@ -7,7 +7,7 @@ #include #include // cache() #include "../fe/felib.h" // TAnagrafica - +#include "modaut.h" /**************************************************************************************************** * TSpeCheck_msk @@ -18,6 +18,7 @@ class TSpeCheck_msk : public TAutomask private: TAnagrafica _ditta; bool _selected; + bool _has_fp; void refresh(); void fillNoFilter(); @@ -30,7 +31,9 @@ private: void saveAll(); void deleteAll(); virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + public: + void set_has_fp(bool has_fp) { _has_fp = has_fp; } TSpeCheck_msk(); virtual ~TSpeCheck_msk() {}; }; @@ -173,7 +176,7 @@ void TSpeCheck_msk::fillNoFilter() for(bool ok = rset.move_first(); ok; ok = rset.move_next()) { // Devo prendere tutti quelli che non vanno bene di records - if(checkRecord(&rset)) continue; + if(checkRecord(&rset, _has_fp)) continue; TRectype clifo = getCli(rset.get("23.TIPO").as_string(), rset.get("23.CODCF").as_string(), rset.get("23.OCCAS").as_string()); TToken_string& row = s.row(-1); @@ -641,6 +644,7 @@ TSpeCheck_app& app() { return (TSpeCheck_app&)main_app(); } void TSpeCheck_app::main_loop() { TSpeCheck_msk msk; + msk.set_has_fp(has_module(FPAUT)); msk.run(); } diff --git a/src/tf/tfutility.cpp b/src/tf/tfutility.cpp index 92a29f002..4c7cb87b7 100644 --- a/src/tf/tfutility.cpp +++ b/src/tf/tfutility.cpp @@ -83,7 +83,7 @@ TString getRFSO(TString codrfso) * Nota bene: viene sfruttato un puntatore di TISAM_Recordset per non creare nuovi oggetti e velocizzare la chiamata * a questo punto il programma non ha ancora creato un record di $trasfatt con i dati che mi interessano */ -bool checkRecord(TISAM_recordset* rec) +bool checkRecord(TISAM_recordset* rec, bool has_fp) { // Il record non è valido se non è presente un cliente if(rec->get("23.TIPO").as_string()[0] == '\0' || rec->get("23.CODCF").as_int() == 0) @@ -102,25 +102,38 @@ bool checkRecord(TISAM_recordset* rec) { // Tolgo tutti i movimenti di sola IVA e in reverse charge o di tipo 3 (Acquisto di beni e servizi di soggetti non residenti) TCausale caus(rec->get("23.CODCAUS").as_string(), rec->get("23.DATAREG").as_date().year()); - if(caus.soloiva() && (caus.reverse_charge() || caus.regime_speciale() == 3)) + const bool filter_revcharge = msk().get_bool(B_ESTEROMETRO) ? msk().get_bool(B_REVCHARGE) : false; + if(!filter_revcharge && caus.soloiva() && (caus.reverse_charge() || caus.regime_speciale() == 3)) return false; // controllo se la fattura non è già stata spedita con la fatt. elettronica static TPaf_record paf0100f("PAF0100F"); // controllo se il movimento è agganciato a un documento - if(!rec->get("23.DPROVV").is_empty() && !rec->get("23.DANNO").is_empty() && !rec->get("23.DCODNUM").is_empty() && !rec->get("23.DNDOC").is_empty()) + if(msk().get_bool(B_ESTEROMETRO) && !rec->get("23.DPROVV").is_empty() && !rec->get("23.DANNO").is_empty() && !rec->get("23.DCODNUM").is_empty() && !rec->get("23.DNDOC").is_empty()) { - TString hfatt, bfatt; - TRectype rdoc(LF_DOC); - rdoc.put(DOC_PROVV, rec->get("23.DPROVV").as_string()); - rdoc.put(DOC_PROVV, rec->get("23.DANNO").as_string()); - rdoc.put(DOC_PROVV, rec->get("23.DCODNUM").as_string()); - rdoc.put(DOC_PROVV, rec->get("23.DNDOC").as_string()); - - // se riesco a generare la chiave, trovo il record e ha il flag di gestione in errore o un errore esterno, salto la fattura (solo se attivo flag in maschera) - if (msk().get_bool(F_ESTEROMETRO) && chiave_paf(rdoc, hfatt, bfatt) && paf0100f.search(nullptr, hfatt, bfatt) && (paf0100f.sq_get("P1_GESTIONE") == "E" || paf0100f.sq_get("P1_ERREST") == "*")) + // Controllo valido solo per utenti non F8 + const bool check_paf_sent = msk().get_bool(B_PAF_SENT); + const bool check_paf_not_sent = msk().get_bool(B_PAF_NOT_SENT); + // Se l'utente ha il modulo FP e uno dei due filtri possibili non è stato selezionato, abilito il controllo sui paf + if(has_fp && (!check_paf_sent || !check_paf_not_sent)) { - return false; + TString hfatt, bfatt; + TRectype rdoc(LF_DOC); + static TLocalisamfile doc(LF_DOC); + rdoc.put(DOC_PROVV, rec->get("23.DPROVV").as_string()); + rdoc.put(DOC_PROVV, rec->get("23.DANNO").as_string()); + rdoc.put(DOC_PROVV, rec->get("23.DCODNUM").as_string()); + rdoc.put(DOC_PROVV, rec->get("23.DNDOC").as_string()); + + // Se riesco a generare la chiave, trovo il record e ha il flag di gestione in errore o un errore esterno, so che è stato inviato + const bool paf_sent = rdoc.read(doc) == NOERR && chiave_paf(rdoc, hfatt, bfatt) && paf0100f.search(nullptr, hfatt, bfatt) && paf0100f.sq_get("P1_GESTIONE") != "E" && paf0100f.sq_get("P1_ERREST") != "*"; + // Se voglio solo quelli inviati e non è stato inviato, RUSPA! + if (check_paf_sent && !paf_sent) + return false; + + // Se voglio solo quelli non inviati ed è stato inviato, RUSPA! + if (check_paf_not_sent && paf_sent) + return false; } } diff --git a/src/tf/tfutility.h b/src/tf/tfutility.h index 9d1e75c60..a9413de1d 100644 --- a/src/tf/tfutility.h +++ b/src/tf/tfutility.h @@ -22,4 +22,4 @@ TString revCharge(TString numreg, int year); // Ritorna la ragione sociale del RFSO TString getRFSO(TString codrfso); // Controllo che sia un record che mi interessa -bool checkRecord(TISAM_recordset* rec); \ No newline at end of file +bool checkRecord(TISAM_recordset* rec, bool has_fp); \ No newline at end of file