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 "../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();
}
}

View File

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

View File

@ -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)