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.
This commit is contained in:
Alessandro Bonazzi 2021-04-15 02:32:47 +02:00
parent 47dea9f314
commit ae11f745be
3 changed files with 78 additions and 73 deletions

View File

@ -10,7 +10,7 @@
#include <agasys.h> #include <agasys.h>
#include "../ve/velib05.h" #include "../ve/velib05.h"
#include "../cg/cglib03.h" #include "../cg/cglib.h"
#include "pa0.h" #include "pa0.h"
#include "pa0100a.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 // 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"); CHECK(cess.full(), "Destinatario fattura P.A. non valido");
const TCodice_numerazione& codnum = doc.codice_numerazione(); 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(); 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 // TJava_profile
///////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////
@ -550,7 +518,8 @@ void TPA_mask::fill()
<< "\nTO TIPOCF=C CODCF=#CLIENTE PROVV=D"; << "\nTO TIPOCF=C CODCF=#CLIENTE PROVV=D";
TISAM_recordset doc_pa(query); TISAM_recordset doc_pa(query);
doc_pa.set_var("#CLIENTE", clifo_pa.get(CLI_CODCF)); 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()) for (bool okd = doc_pa.move_first(); okd; okd = doc_pa.move_next())
{ {
const TTipo_documento& td = cached_tipodoc(doc.get(DOC_TIPODOC)); 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(doc_pa.get(DOC_DATADOC).as_date());
row->add(clifo_pa.get(CFV_CODCF).as_int()); row->add(clifo_pa.get(CFV_CODCF).as_int());
row->add(clifo_pa.get("20." CLI_RAGSOC).as_string()); row->add(clifo_pa.get("20." CLI_RAGSOC).as_string());
row->add(clifo_pa.get(CFV_PADESTIN).as_string()); row->add(doc.get_dest_sdi());
row->add(clifo_pa.get(CFV_PARIFAMM).as_string()); row->add(doc.get_rif_sdi());
row->add(clifo_pa.get("20." CLI_COFI).as_string()); row->add(clifo_pa.get("20." CLI_COFI).as_string());
bool split = clifo_pa.get("20." CLI_SPLITPAY).as_bool(); 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 const TRectype& cco(const TRectype& doc) const; // Contratto/Convenzione/Offerta
void log(int severity, const char* msg); void log(int severity, const char* msg);
bool show_log(); bool show_log_pa();
const char * natura(const TString& codiva) const; // const char * natura(const TString& codiva) const;
void set_IVA(const TString& codiva, TPaf_record& paf) const; void set_IVA(const TString& codiva, TPaf_record& paf) const;
void set_IVA(const TRiga_documento& rdoc, 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; bool ok = true;
if (_log) if (_log)
@ -902,48 +871,90 @@ bool TDoc2Paf::show_log()
return ok; return ok;
} }
/* non serve piu?
const char * TDoc2Paf::natura(const TString& codiva) const const char * TDoc2Paf::natura(const TString& codiva) const
{ {
const TRectype& ai = cache().get("%IVA", codiva); TCodiceIVA ai(codiva);
TString & natura = get_tmp_string(4); // const TRectype& ai = cache().get("%IVA", codiva);
TString & natura = get_tmp_string(16);
natura = ai.get("S12"); natura = ai.natura();
if(natura.blank()) if(natura.blank())
{ {
const int tipo_iva11 = ai.get_int("S2"); const int tipo_iva11 = ai.get_int("S2");
const bool revcharge = tipo_iva11 >= 31 && tipo_iva11 <= 38; const bool revcharge = tipo_iva11 >= 31 && tipo_iva11 <= 38;
const TString& tipo = ai.get("S1"); const TString& tipo = ai.tipo();
const int tipo_vendite = ai.get_int("S7"); const int tipo_vendite = ai.allegato('C');
// N1 escluse ex art 15 // N1 escluse ex art 15
if (tipo_vendite == 5) if (tipo_vendite == 5)
natura = "N5"; // regime del margine natura = "N5"; // regime del margine
else else
if (revcharge) if (revcharge) // Inversione contabile (REVERSE CHARGE) ****
natura = "N6"; // 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 else
if (tipo == "NS") 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 else
if (tipo == "NI") 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 else
if (tipo == "ES") if (tipo == "ES")
natura = "N4"; // Esente natura = "N4"; // Esente
} }
return natura; return natura;
} }
*/
void TDoc2Paf::set_IVA(const TString& codiva, TPaf_record& paf) const void TDoc2Paf::set_IVA(const TString& codiva, TPaf_record& paf) const
{ {
const TRectype& ai = cache().get("%IVA", codiva); const TCodiceIVA & ai = cached_codIVA(codiva);
const real aliquota = ai.get("R0"); const real aliquota = ai.percentuale();
paf.set("PI_ALIQUOTAIVA", aliquota); paf.set("PI_ALIQUOTAIVA", aliquota);
if (codiva.full()) if (codiva.full())
{ {
if (aliquota.is_zero()) if (aliquota.is_zero())
paf.set("PI_NATURA", natura(codiva)); paf.set("PI_NATURA", ai.natura());
else else
paf.set("PI_NATURA", ""); 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 void TDoc2Paf::set_IVA(const TRiga_documento& rdoc, TPaf_record& paf) const
{ {
const TString8 codiva(rdoc.get(RDOC_CODIVA)); const TString8 codiva(rdoc.get(RDOC_CODIVA));
const TRectype& ai = cache().get("%IVA", codiva);
const real aliquota = ai.get("R0"); set_IVA(codiva, paf);
paf.set("PI_ALIQUOTAIVA", aliquota);
if (codiva.full())
{
if (aliquota.is_zero())
paf.set("PI_NATURA", natura(codiva));
else
paf.set("PI_NATURA", "");
}
} }
@ -1039,7 +1042,7 @@ bool TDoc2Paf::elabora(TDocumentoEsteso& doc)
TString rifamm = cco(doc).get("S4"); TString rifamm = cco(doc).get("S4");
if (rifamm.blank()) if (rifamm.blank())
rifamm = doc.clifor().vendite().get(CFV_PARIFAMM); rifamm = doc.get_rif_sdi();
paf0200f.set("P2_RIFAMMINISTR", rifamm); paf0200f.set("P2_RIFAMMINISTR", rifamm);
TISAM_recordset unloc("USE UNLOC\nJOIN COMUNI INTO COM==COMCCIAA\nFROM CODDITTA=#DITTA\nTO CODDITTA=#DITTA"); 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_KEYNPROGR", ++num_riep);
paf2200f.set("PL_ALIQUOTAIVA", aliquota); paf2200f.set("PL_ALIQUOTAIVA", aliquota);
if (aliquota.is_zero()) 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_IMPONIBILE", riva.imponibile());
paf2200f.set("PL_IMPOSTA", riva.imposta()); paf2200f.set("PL_IMPOSTA", riva.imposta());
@ -1693,7 +1698,7 @@ void TDoc2Paf::main_loop()
} }
if (ndocs > 0) if (ndocs > 0)
{ {
if (show_log()) if (show_log_pa())
genera_xml(); genera_xml();
return; return;
} }
@ -1726,7 +1731,7 @@ void TDoc2Paf::main_loop()
message_box(FR("Sono stati elaborati %d documenti"), ndocs); message_box(FR("Sono stati elaborati %d documenti"), ndocs);
} }
if (ndocs > 0 && show_log()) if (ndocs > 0 && show_log_pa())
genera_xml(); genera_xml();
} }
} }

View File

@ -88,7 +88,7 @@ BEGIN
FLAGS "D" FLAGS "D"
END END
STRING S_UFFICIO 6 STRING S_UFFICIO 7
BEGIN BEGIN
PROMPT 1 4 "" PROMPT 1 4 ""
FLAGS "D" FLAGS "D"

View File

@ -161,7 +161,7 @@ P8_IMCONTRCASSA = NUMERIC(15, 2)
P8_IMPONCASSA = NUMERIC(15, 2) P8_IMPONCASSA = NUMERIC(15, 2)
P8_ALIQIVA = NUMERIC(6, 2) P8_ALIQIVA = NUMERIC(6, 2)
P8_RITENUTA = CHAR(2) P8_RITENUTA = CHAR(2)
P8_NATURA = CHAR(2) P8_NATURA = CHAR(4)
P8_RIFAMMINIS = CHAR(20) P8_RIFAMMINIS = CHAR(20)
P8_GESTIONE = CHAR(1) P8_GESTIONE = CHAR(1)
@ -313,7 +313,7 @@ PI_PREZZOUNIT = NUMERIC
PI_PRZTOTALE = NUMERIC PI_PRZTOTALE = NUMERIC
PI_ALIQUOTAIVA = NUMERIC PI_ALIQUOTAIVA = NUMERIC
PI_RITENUTA = CHAR(2) PI_RITENUTA = CHAR(2)
PI_NATURA = CHAR(2) PI_NATURA = CHAR(4)
PI_RIFAMMINISTR = CHAR(20) PI_RIFAMMINISTR = CHAR(20)
PI_GESTIONE = CHAR(1) PI_GESTIONE = CHAR(1)
@ -367,7 +367,7 @@ PL_KEYBODYFATT = CHAR(20)
PL_KEYNPROGR = INTEGER PL_KEYNPROGR = INTEGER
PL_ALIQUOTAIVA = NUMERIC(6,2) PL_ALIQUOTAIVA = NUMERIC(6,2)
PL_NATURA = CHAR(2) PL_NATURA = CHAR(4)
PL_SPESEACCESS = NUMERIC(15,2) PL_SPESEACCESS = NUMERIC(15,2)
PL_ARROTONDAM = NUMERIC(15,2) PL_ARROTONDAM = NUMERIC(15,2)
PL_IMPONIBILE = NUMERIC(15,2) PL_IMPONIBILE = NUMERIC(15,2)