From ae11f745be196e7759a0676a063466450c9623b6 Mon Sep 17 00:00:00 2001 From: Alessandro Bonazzi Date: Thu, 15 Apr 2021 02:32:47 +0200 Subject: [PATCH] Patch level : 12.0 1056 Files correlati : pa0.exe pa0100a.msk paf.ini Aggiornata natura a 4 caratteri Aggiornati indirizzi e riferimento SDI con indirizzo di spedizione Interno Non sono in grado di fare prove complete bisogna controllare se l'aggiornamento dei tracciati paf riesce a modificare un database esistente. Da controllare una vendita un acquistoe un acquisto reverse charge. --- src/pa/pa0100.cpp | 143 +++++++++++++++++++++++---------------------- src/pa/pa0100a.uml | 2 +- src/pa/paf.ini | 6 +- 3 files changed, 78 insertions(+), 73 deletions(-) diff --git a/src/pa/pa0100.cpp b/src/pa/pa0100.cpp index 79de425a6..534990ff9 100644 --- a/src/pa/pa0100.cpp +++ b/src/pa/pa0100.cpp @@ -10,7 +10,7 @@ #include #include "../ve/velib05.h" -#include "../cg/cglib03.h" +#include "../cg/cglib.h" #include "pa0.h" #include "pa0100a.h" @@ -36,9 +36,10 @@ static XVT_SQLDB _db = NULL; // PAF sqlite db ///////////////////////////////////////////////////////////////////////////////////// // Crea la coppia di chiavi per il db PAF a partire da un documento vero e proprio -static bool chiave_paf(const TDocumento& doc, TString& cess, TString& numdoc) +static bool chiave_paf(TDocumentoEsteso & doc, TString& cess, TString& numdoc) { - cess = doc.clifor().vendite().get(CFV_PADESTIN); + cess = doc.get_dest_sdi(); + CHECK(cess.full(), "Destinatario fattura P.A. non valido"); const TCodice_numerazione& codnum = doc.codice_numerazione(); @@ -65,39 +66,6 @@ static bool chiave_paf(const TRectype& doc, TString& cess, TString& numdoc) return cess.full(); } -// Cerca una stringa all'interno di una SLIST (Potrebbe diventare una funzione di XVT.h) -static SLIST_ELT xvt_slist_find_str(SLIST list, const char* str) -{ - SLIST_ELT e = NULL; - for (e = xvt_slist_get_first(list); e; e = xvt_slist_get_next(list, e)) - { - const char* val = xvt_slist_get(list, e, NULL); - if (xvt_str_compare_ignoring_case(str, val) == 0) - break; - } - return e; -} - -// Aggiorna il file dst se pił vecchio di src (Potrebbe diventare una funzione di XVT.h) -bool xvt_fsys_fupdate(const char* src, const char* dst) -{ - bool ok = false; - if (xvt_fsys_file_exists(src)) - { - const long tsrc = xvt_fsys_file_attr(src, XVT_FILE_ATTR_MTIME); - if (tsrc > 0) - { - long tdst = 0; - if (xvt_fsys_file_exists(dst)) - tdst = xvt_fsys_file_attr(dst, XVT_FILE_ATTR_MTIME); - if (tsrc > tdst) - ok = xvt_fsys_fcopy(src, dst) != 0; - } - } - - return ok; -} - ///////////////////////////////////////////////////////////////////////////////////// // TJava_profile ///////////////////////////////////////////////////////////////////////////////////// @@ -550,7 +518,8 @@ void TPA_mask::fill() << "\nTO TIPOCF=C CODCF=#CLIENTE PROVV=D"; TISAM_recordset doc_pa(query); doc_pa.set_var("#CLIENTE", clifo_pa.get(CLI_CODCF)); - const TRectype& doc = doc_pa.cursor()->curr(); + TDocumentoEsteso doc(doc_pa.cursor()->curr()); + for (bool okd = doc_pa.move_first(); okd; okd = doc_pa.move_next()) { const TTipo_documento& td = cached_tipodoc(doc.get(DOC_TIPODOC)); @@ -575,8 +544,8 @@ void TPA_mask::fill() row->add(doc_pa.get(DOC_DATADOC).as_date()); row->add(clifo_pa.get(CFV_CODCF).as_int()); row->add(clifo_pa.get("20." CLI_RAGSOC).as_string()); - row->add(clifo_pa.get(CFV_PADESTIN).as_string()); - row->add(clifo_pa.get(CFV_PARIFAMM).as_string()); + row->add(doc.get_dest_sdi()); + row->add(doc.get_rif_sdi()); row->add(clifo_pa.get("20." CLI_COFI).as_string()); bool split = clifo_pa.get("20." CLI_SPLITPAY).as_bool(); @@ -688,8 +657,8 @@ protected: const TRectype& cco(const TRectype& doc) const; // Contratto/Convenzione/Offerta void log(int severity, const char* msg); - bool show_log(); - const char * natura(const TString& codiva) const; + bool show_log_pa(); +// const char * natura(const TString& codiva) const; void set_IVA(const TString& codiva, TPaf_record& paf) const; void set_IVA(const TRiga_documento& rdoc, TPaf_record& paf) const; @@ -889,7 +858,7 @@ void TDoc2Paf::log(int severity, const char* msg) } } -bool TDoc2Paf::show_log() +bool TDoc2Paf::show_log_pa() { bool ok = true; if (_log) @@ -902,48 +871,90 @@ bool TDoc2Paf::show_log() return ok; } - +/* non serve piu? const char * TDoc2Paf::natura(const TString& codiva) const { - const TRectype& ai = cache().get("%IVA", codiva); - TString & natura = get_tmp_string(4); + TCodiceIVA ai(codiva); +// const TRectype& ai = cache().get("%IVA", codiva); + TString & natura = get_tmp_string(16); - natura = ai.get("S12"); + natura = ai.natura(); if(natura.blank()) { const int tipo_iva11 = ai.get_int("S2"); const bool revcharge = tipo_iva11 >= 31 && tipo_iva11 <= 38; - const TString& tipo = ai.get("S1"); - const int tipo_vendite = ai.get_int("S7"); + const TString& tipo = ai.tipo(); + const int tipo_vendite = ai.allegato('C'); // N1 escluse ex art 15 if (tipo_vendite == 5) natura = "N5"; // regime del margine else - if (revcharge) - natura = "N6"; // Inversione contabile (REVERSE CHARGE) + if (revcharge) // Inversione contabile (REVERSE CHARGE) **** + { + switch (tipo_iva11) + { + case 31: + natura = "N6.1"; + break; + case 32: + natura = "N6.2"; + break; + case 33: + natura = "N6.3"; + break; + case 34: + natura = "N6.4"; + break; + case 35: + natura = "N6.5"; + break; + case 36: + natura = "N6.6"; + break; + case 37: + natura = "N6.7"; + break; + case 38: + natura = "N6.8"; + break; + default: + natura = "N6.9"; + break; + } + } else if (tipo == "NS") - natura = "N2"; // Non soggetto + natura = "N2"; // Non soggetto ***** + // ITEM "N2.1|N2.1 Non soggette ad IVA ai sensi degli artt. da 7 a 7-septies del DPR 633/72" + // ITEM "N2.2|N2.2 Non soggette - altri casi" else if (tipo == "NI") - natura = "N3"; // Non imponibile + natura = "N3"; // Non imponibile ***** + // ITEM "N3.1|N3.1 Non impon. - esportazioni" + // ITEM "N3.2|N3.2 Non impon. - cessioni intracomunitarie" + // ITEM "N3.3|N3.3 Non impon. - cessioni verso San Marino" + // ITEM "N3.4|N3.4 Non impon. - operazioni assimilate alle cessioni all'esportazione" + // ITEM "N3.5|N3.5 Non impon. - a seguito di dichiarazioni d'intento" + // ITEM "N3.6|N3.6 Non impon. - altre operazioni che non concorrono alla formazioni del plafond" else if (tipo == "ES") natura = "N4"; // Esente } return natura; } +*/ void TDoc2Paf::set_IVA(const TString& codiva, TPaf_record& paf) const { - const TRectype& ai = cache().get("%IVA", codiva); - const real aliquota = ai.get("R0"); + const TCodiceIVA & ai = cached_codIVA(codiva); + const real aliquota = ai.percentuale(); + paf.set("PI_ALIQUOTAIVA", aliquota); if (codiva.full()) { if (aliquota.is_zero()) - paf.set("PI_NATURA", natura(codiva)); + paf.set("PI_NATURA", ai.natura()); else paf.set("PI_NATURA", ""); } @@ -952,16 +963,8 @@ void TDoc2Paf::set_IVA(const TString& codiva, TPaf_record& paf) const void TDoc2Paf::set_IVA(const TRiga_documento& rdoc, TPaf_record& paf) const { const TString8 codiva(rdoc.get(RDOC_CODIVA)); - const TRectype& ai = cache().get("%IVA", codiva); - const real aliquota = ai.get("R0"); - paf.set("PI_ALIQUOTAIVA", aliquota); - if (codiva.full()) - { - if (aliquota.is_zero()) - paf.set("PI_NATURA", natura(codiva)); - else - paf.set("PI_NATURA", ""); - } + + set_IVA(codiva, paf); } @@ -1039,7 +1042,7 @@ bool TDoc2Paf::elabora(TDocumentoEsteso& doc) TString rifamm = cco(doc).get("S4"); if (rifamm.blank()) - rifamm = doc.clifor().vendite().get(CFV_PARIFAMM); + rifamm = doc.get_rif_sdi(); paf0200f.set("P2_RIFAMMINISTR", rifamm); TISAM_recordset unloc("USE UNLOC\nJOIN COMUNI INTO COM==COMCCIAA\nFROM CODDITTA=#DITTA\nTO CODDITTA=#DITTA"); @@ -1456,7 +1459,9 @@ bool TDoc2Paf::elabora(TDocumentoEsteso& doc) paf2200f.set("PL_KEYNPROGR", ++num_riep); paf2200f.set("PL_ALIQUOTAIVA", aliquota); if (aliquota.is_zero()) - paf2200f.set("PL_NATURA", natura(riva.cod_iva().codice())); + paf2200f.set("PL_NATURA", cached_codIVA(riva.cod_iva().codice()).natura()); + else + paf2200f.set("PL_NATURA", ""); paf2200f.set("PL_IMPONIBILE", riva.imponibile()); paf2200f.set("PL_IMPOSTA", riva.imposta()); @@ -1693,7 +1698,7 @@ void TDoc2Paf::main_loop() } if (ndocs > 0) { - if (show_log()) + if (show_log_pa()) genera_xml(); return; } @@ -1726,7 +1731,7 @@ void TDoc2Paf::main_loop() message_box(FR("Sono stati elaborati %d documenti"), ndocs); } - if (ndocs > 0 && show_log()) + if (ndocs > 0 && show_log_pa()) genera_xml(); } } diff --git a/src/pa/pa0100a.uml b/src/pa/pa0100a.uml index 6dbba8a9e..212a99b7b 100644 --- a/src/pa/pa0100a.uml +++ b/src/pa/pa0100a.uml @@ -88,7 +88,7 @@ BEGIN FLAGS "D" END -STRING S_UFFICIO 6 +STRING S_UFFICIO 7 BEGIN PROMPT 1 4 "" FLAGS "D" diff --git a/src/pa/paf.ini b/src/pa/paf.ini index cbda723e5..2cbfa89ee 100644 --- a/src/pa/paf.ini +++ b/src/pa/paf.ini @@ -161,7 +161,7 @@ P8_IMCONTRCASSA = NUMERIC(15, 2) P8_IMPONCASSA = NUMERIC(15, 2) P8_ALIQIVA = NUMERIC(6, 2) P8_RITENUTA = CHAR(2) -P8_NATURA = CHAR(2) +P8_NATURA = CHAR(4) P8_RIFAMMINIS = CHAR(20) P8_GESTIONE = CHAR(1) @@ -313,7 +313,7 @@ PI_PREZZOUNIT = NUMERIC PI_PRZTOTALE = NUMERIC PI_ALIQUOTAIVA = NUMERIC PI_RITENUTA = CHAR(2) -PI_NATURA = CHAR(2) +PI_NATURA = CHAR(4) PI_RIFAMMINISTR = CHAR(20) PI_GESTIONE = CHAR(1) @@ -367,7 +367,7 @@ PL_KEYBODYFATT = CHAR(20) PL_KEYNPROGR = INTEGER PL_ALIQUOTAIVA = NUMERIC(6,2) -PL_NATURA = CHAR(2) +PL_NATURA = CHAR(4) PL_SPESEACCESS = NUMERIC(15,2) PL_ARROTONDAM = NUMERIC(15,2) PL_IMPONIBILE = NUMERIC(15,2)