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