Patch level : 12.0 688

Files correlati     : fp
Commento            :
- Sistemato nome flag maschera
- Implementata gestione righe omaggio
- Aggiunto controllo per non far scartare l'xml in caso di nome vuoto
- Aggiunta gestione righe merce con prezzo a zero
- Implementata possibilità di scontare tutte le righe non solo le tipo merci
This commit is contained in:
Tolla 2019-01-30 13:08:34 +01:00
parent ef90d87c0c
commit 6b82dc984a
4 changed files with 167 additions and 97 deletions

View File

@ -312,7 +312,7 @@ bool TPA_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
break; break;
case F_DATAINI: case F_DATAINI:
if (e == fe_init) if (e == fe_init)
o.set(ini_get_string(CONFIG_DITTA, "fp", "LastXML", "01-01-2018")); o.set(ini_get_string(CONFIG_DITTA, "fp", "LastXML", "01-01-2019"));
else if (e == fe_close) else if (e == fe_close)
ini_set_string(CONFIG_DITTA, "fp", "LastXML", o.get()); ini_set_string(CONFIG_DITTA, "fp", "LastXML", o.get());
break; break;

View File

@ -56,7 +56,7 @@ BEGIN
ITEM "X|XML Generato" ITEM "X|XML Generato"
ITEM "N|Notificato" ITEM "N|Notificato"
ITEM "E|In errore" ITEM "E|In errore"
ITEM "D|Pronto" ITEM "D|Diag."
FLAGS "Z" FLAGS "Z"
END END

View File

@ -10,6 +10,7 @@
#include <reputils.h> #include <reputils.h>
#include <vector> #include <vector>
#include <memory> #include <memory>
#include <map>
#define SQL_FLD "sql/" #define SQL_FLD "sql/"
#define CARATTERI_SPECIALI "àèéìòù°'\\" #define CARATTERI_SPECIALI "àèéìòù°'\\"
@ -100,9 +101,20 @@ private:
TString _bfatt; // Codice univoco di 20 caratteri del documento TString _bfatt; // Codice univoco di 20 caratteri del documento
TString _conai_str; TString _conai_str;
// Classe interna per gestire gli omaggi
class TOmaggio_info
{
public:
real imponibile;
real imposta;
TOmaggio_info() : imponibile(ZERO), imposta(ZERO){}
};
std::map<TString, TOmaggio_info> _omaggi;
struct struct
{ {
bool _is_valuta_estera; // Se il documento è in valuta estera bool _is_valuta_estera {false}; // Se il documento è in valuta estera
TString4 _cod_val; TString4 _cod_val;
real _cambio; real _cambio;
} _doc_cambio; } _doc_cambio;

View File

@ -853,6 +853,10 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
} }
#endif #endif
TAnagrafica clifo(doc.clifor().tipo(), doc.clifor().codice()); TAnagrafica clifo(doc.clifor().tipo(), doc.clifor().codice());
TRectype rec_clifo(LF_CLIFO);
rec_clifo.put(CLI_TIPOCF, doc.clifor().tipo());
rec_clifo.put(CLI_CODCF, doc.clifor().codice());
rec_clifo.read(TLocalisamfile(LF_CLIFO));
TString8 coddest; TString8 coddest;
TString pec; TString pec;
#ifndef DBG #ifndef DBG
@ -979,7 +983,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
paf0400f.set("P4_FISCIVAPAESE", "IT"); paf0400f.set("P4_FISCIVAPAESE", "IT");
paf0400f.set("P4_FISCIVACOD", "00261170039"); paf0400f.set("P4_FISCIVACOD", "00261170039");
#endif #endif
if (cliente.fisica()) if (cliente.fisica() && cliente.nome().full())
{ {
paf0400f.set("P4_ANANOME", cliente.nome()); paf0400f.set("P4_ANANOME", cliente.nome());
paf0400f.set("P4_ANACOGNOME", cliente.cognome()); paf0400f.set("P4_ANACOGNOME", cliente.cognome());
@ -1063,7 +1067,10 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
remove(paf2700f); remove(paf2700f);
// Disabilitata la scrittura del totale del documento, questo causa problemi se è presente uno sconto in testata e l'addebito del bollo. // Disabilitata la scrittura del totale del documento, questo causa problemi se è presente uno sconto in testata e l'addebito del bollo.
// Campo calcola prima il totale, poi lo sconta e ci applica il bollo mentre lo SDI sconta a bollo già applicato. // Campo calcola prima il totale, poi lo sconta e ci applica il bollo mentre lo SDI sconta a bollo già applicato.
// paf2700f.set("PQ_IMPTOTDOC", doc.totale_doc()); #ifndef DBG
if(!((doc.get_bool("ADDBOLLI") && doc.get_real("BOLLI") > ZERO) && doc.get(DOC_SCONTOPERC)))
#endif
paf2700f.set("PQ_IMPTOTDOC", doc.totale_doc());
const TRectype& cont_conv_off = cco(doc); const TRectype& cont_conv_off = cco(doc);
TString causale = cont_conv_off.get("S1"); TString causale = cont_conv_off.get("S1");
if (causale.full()) if (causale.full())
@ -1170,6 +1177,10 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
paf2000f.set("PJ_KEYHEADERFATT", _hfatt); paf2000f.set("PJ_KEYHEADERFATT", _hfatt);
paf2000f.set("PJ_KEYBODYFATT", _bfatt); paf2000f.set("PJ_KEYBODYFATT", _bfatt);
remove(paf2000f); // Cancella tutti gli sconti di riga remove(paf2000f); // Cancella tutti gli sconti di riga
TPaf_record paf2100f("PAF2100F");
paf2100f.set("PK_KEYHEADERFATT", _hfatt);
paf2100f.set("PK_KEYBODYFATT", _bfatt);
remove(paf2000f); // Cancella tutti i "altri dati gestionali"
TPaf_record paf1900f("PAF1900F"); TPaf_record paf1900f("PAF1900F");
paf1900f.set("PY_KEYHEADERFATT", _hfatt); paf1900f.set("PY_KEYHEADERFATT", _hfatt);
paf1900f.set("PY_KEYBODYFATT", _bfatt); paf1900f.set("PY_KEYBODYFATT", _bfatt);
@ -1246,40 +1257,18 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
log(1, msg); log(1, msg);
} }
set_qta_prezzo(paf1800f, rdoc); set_qta_prezzo(paf1800f, rdoc);
if(rdoc->iva().codice().empty())
{
set_IVA(codivadefault, paf1800f);
}
else
set_IVA(*rdoc, paf1800f); set_IVA(*rdoc, paf1800f);
/* /*
const TDate data = doc.get(DOC_DATADOC); const TDate data = doc.get(DOC_DATADOC);
paf1800f.set("PI_DTINIZIOPER", data); paf1800f.set("PI_DTINIZIOPER", data);
paf1800f.set("PI_DTFINEPER", data); paf1800f.set("PI_DTFINEPER", data);
*/ */
// <ScontoMaggiorazione>
sconto_expr = rdoc->get(RDOC_SCONTO);
if (parse_sconto(sconto_expr, sconti))
{
long nlin_sconto = 0;
FOR_EACH_TOKEN(sconti, str)
{
const real perc = str;
if (!perc.is_zero())
{
paf2000f.set("PJ_KEYNLINEA", static_cast<long>(r));
paf2000f.set("PJ_KEYNLINAR", ++nlin_sconto);
if (perc > ZERO)
{
paf2000f.set("PJ_TIPOSCONTO", "SC");
paf2000f.set("PJ_PERCSCONTO", perc);
}
else
{
paf2000f.set("PJ_TIPOSCONTO", "MG");
paf2000f.set("PJ_PERCSCONTO", -perc);
}
paf2000f.set("PJ_GESTIONE", "D");
ok &= insert(paf2000f);
}
}
}
// </ScontoMaggiorazione>
/* /*
* Ogni riga si può rifare a un DDT/Ordine diverso, per questo devo inserire i dati da qua e non in testata * Ogni riga si può rifare a un DDT/Ordine diverso, per questo devo inserire i dati da qua e non in testata
*/ */
@ -1362,7 +1351,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
// <DatiRitenuta> // <DatiRitenuta>
if (sp.tipo_ritenuta() == 'F') if (sp.tipo_ritenuta() == 'F')
{ {
paf0700f.set("P7_TIPORITENUTA", cliente.fisica() ? "RT01" : "RT02"); paf0700f.set("P7_TIPORITENUTA", rec_clifo.get_char(CLI_TIPOPERS) == 'F' ? "RT01" : "RT02");
paf0700f.set("P7_IMPORTORIT", converti_prezzo(doc.imponibile() * sp.perc() / CENTO)); paf0700f.set("P7_IMPORTORIT", converti_prezzo(doc.imponibile() * sp.perc() / CENTO));
paf0700f.set("P7_ALIQUOTARIT", TCodiceIVA(sp.cod_iva()).percentuale()); paf0700f.set("P7_ALIQUOTARIT", TCodiceIVA(sp.cod_iva()).percentuale());
static TString caus770; caus770.cut(0); caus770.format("%02d", sp.caus_770()); static TString caus770; caus770.cut(0); caus770.format("%02d", sp.caus_770());
@ -1394,29 +1383,82 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
msg.format("La riga omaggi %d ha quantità nulla", riga); msg.format("La riga omaggi %d ha quantità nulla", riga);
log(1, msg); log(1, msg);
} }
paf1800f.set("PI_TIPOCESSPREST", "AB");
set_qta_prezzo(paf1800f, rdoc); set_qta_prezzo(paf1800f, rdoc);
set_IVA(*rdoc, paf1800f); set_IVA(*rdoc, paf1800f);
// <ScontoMaggiorazione> paf2100f.set("PK_KEYNLINEA", static_cast<long>(r));
paf2000f.set("PJ_KEYNLINEA", static_cast<long>(r)); paf2100f.set("PK_KEYNLINAR", 1L);
paf2000f.set("PJ_KEYNLINAR", 1L); paf2100f.set("PK_TIPODATO", "AswTRiga");
paf2000f.set("PJ_TIPOSCONTO", "SC");
if (rdoc->get_bool(RDOC_ADDIVA)) if (rdoc->get_bool(RDOC_ADDIVA))
{ {
paf2000f.set("PJ_IMPORTOSCONTO", converti_prezzo(rdoc->importo(true, false) - rdoc->imposta())); paf2100f.set("PK_RIFDATO", "Omaggio con rivalsa");
// Metto i dati come si trattasse di una riga normalissima
paf1800f.set("PI_UNITAMISURA", rdoc->get(RDOC_UMQTA));
paf1800f.set("PI_QUANTITA", rdoc->get_real(RDOC_QTA));
paf1800f.set("PI_PREZZOUNIT", converti_prezzo(rdoc->prezzo(false, false)));
paf1800f.set("PI_PRZTOTALE", converti_prezzo(rdoc->prezzo(false, false) * rdoc->get_real(RDOC_QTA)));
TOmaggio_info& omaggio_info = _omaggi[rdoc->iva().codice()];
omaggio_info.imponibile += rdoc->imponibile_omaggio(2);
omaggio_info.imposta += rdoc->iva_omaggio(8, 2);
} }
else else
{ {
paf2000f.set("PJ_IMPORTOSCONTO", converti_prezzo(rdoc->importo(true, false))); paf2100f.set("PK_RIFDATO", "Omaggio senza rivalsa");
}
// Aggiungo uno sconto
paf2000f.set("PJ_KEYNLINEA", static_cast<long>(r));
paf2000f.set("PJ_KEYNLINAR", 1L);
paf2000f.set("PJ_TIPOSCONTO", "SC");
// Applico uno sconto del 100% portando l'importo a zero
paf2000f.set("PJ_PERCSCONTO", CENTO);
paf1800f.set("PI_PRZTOTALE", ZERO);
paf2000f.set("PJ_GESTIONE", "D"); paf2000f.set("PJ_GESTIONE", "D");
ok &= insert(paf2000f); ok &= insert(paf2000f);
} }
ok &= insert(paf2100f);
}
else else
{ {
// Salto tutte le altre righe // Salto tutte le altre righe
continue; continue;
} }
// <ScontoMaggiorazione>
sconto_expr = rdoc->get(RDOC_SCONTO);
if (parse_sconto(sconto_expr, sconti))
{
long nlin_sconto = 0;
FOR_EACH_TOKEN(sconti, str)
{
const real perc = str;
if (!perc.is_zero())
{
paf2000f.set("PJ_KEYNLINEA", static_cast<long>(r));
paf2000f.set("PJ_KEYNLINAR", ++nlin_sconto);
if (perc > ZERO)
{
paf2000f.set("PJ_TIPOSCONTO", "SC");
paf2000f.set("PJ_PERCSCONTO", perc);
}
else
{
paf2000f.set("PJ_TIPOSCONTO", "MG");
paf2000f.set("PJ_PERCSCONTO", -perc);
}
paf2000f.set("PJ_GESTIONE", "D");
ok &= insert(paf2000f);
}
}
}
// </ScontoMaggiorazione>
paf1800f.set("PI_GESTIONE", "D"); paf1800f.set("PI_GESTIONE", "D");
ok &= insert(paf1800f) && insert(paf3000f); ok &= insert(paf1800f) && insert(paf3000f);
} }
@ -1540,6 +1582,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
// </DatiDDT> // </DatiDDT>
// Salvo la testata // Salvo la testata
ok &= insert(paf0700f); ok &= insert(paf0700f);
// <DatiRiepilogo> // <DatiRiepilogo>
TPaf_record paf2200f("PAF2200F"); TPaf_record paf2200f("PAF2200F");
paf2200f.set("PL_KEYHEADERFATT", _hfatt); paf2200f.set("PL_KEYHEADERFATT", _hfatt);
@ -1559,16 +1602,29 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
paf2200f.set("PL_KEYBODYFATT", _bfatt); paf2200f.set("PL_KEYBODYFATT", _bfatt);
const TRiepilogo_iva& riva = *dynamic_cast<const TRiepilogo_iva*>(itm); const TRiepilogo_iva& riva = *dynamic_cast<const TRiepilogo_iva*>(itm);
const real aliquota = riva.cod_iva().percentuale(); const real aliquota = riva.cod_iva().percentuale();
const TString& cod_aliquota = riva.cod_iva().codice();
const TOmaggio_info& omaggio_info = _omaggi[cod_aliquota];
// Aliquota
paf2200f.set("PL_ALIQUOTAIVA", aliquota); paf2200f.set("PL_ALIQUOTAIVA", aliquota);
// Natura
if (aliquota.is_zero()) if (aliquota.is_zero())
paf2200f.set("PL_NATURA", natura(riva.cod_iva().codice())); paf2200f.set("PL_NATURA", natura(riva.cod_iva().codice()));
paf2200f.set("PL_IMPONIBILE", converti_prezzo(riva.imponibile()));
// Imponibile
paf2200f.set("PL_IMPONIBILE", converti_prezzo(riva.imponibile() + omaggio_info.imponibile));
// Imposta, per gli omaggi con addebito ho già l'imposta
paf2200f.set("PL_IMPOSTA", converti_prezzo(riva.imposta())); paf2200f.set("PL_IMPOSTA", converti_prezzo(riva.imposta()));
// Esigibilità IVA
paf2200f.set("PL_ESIGIVA", eiva); paf2200f.set("PL_ESIGIVA", eiva);
if (*eiva == 'S') if (*eiva == 'S')
paf2200f.set("PL_RIFNORMATIVO", "Scissione pagamenti art.17-ter DPR 633/72"); paf2200f.set("PL_RIFNORMATIVO", "Scissione pagamenti art.17-ter DPR 633/72");
else else
paf2200f.set("PL_RIFNORMATIVO", riva.cod_iva().descrizione()); paf2200f.set("PL_RIFNORMATIVO", riva.cod_iva().descrizione());
paf2200f.set("PL_GESTIONE", "D"); paf2200f.set("PL_GESTIONE", "D");
ok &= insert(paf2200f); ok &= insert(paf2200f);
} }
@ -1619,9 +1675,9 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
int rp = nr < pag.n_rate() ? nr : 0; int rp = nr < pag.n_rate() ? nr : 0;
static TString key_class; key_class.cut(0) << pag.tipo_rata(rp) << pag.ulc_rata(rp); static TString key_class; key_class.cut(0) << pag.tipo_rata(rp) << pag.ulc_rata(rp);
paf2500f.set("PO_MODALITAPAGAM", cache().get("%CLR", key_class, "S12")); // Si assicura che il numero riga sia accettabile paf2500f.set("PO_MODALITAPAGAM", cache().get("%CLR", key_class, "S12")); // Si assicura che il numero riga sia accettabile
TToken_string& riga = scad.row(nr); // Data|Importo TToken_string& riga_scadenze = scad.row(nr); // Data|Importo
paf2500f.set("PO_DATASCADENZA", TDate(riga.get(0))); // Data scadenza paf2500f.set("PO_DATASCADENZA", TDate(riga_scadenze.get(0))); // Data scadenza
paf2500f.set("PO_IMPORTO", converti_prezzo(real(riga.get()))); // Importo rata paf2500f.set("PO_IMPORTO", converti_prezzo(real(riga_scadenze.get()))); // Importo rata
paf2500f.set("PO_GESTIONE", "D"); paf2500f.set("PO_GESTIONE", "D");
ok &= insert(paf2500f); ok &= insert(paf2500f);
} }
@ -1710,7 +1766,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
pafw300f.set("PW_CODICE", cliente.codice_fiscale_estero()); pafw300f.set("PW_CODICE", cliente.codice_fiscale_estero());
pafw300f.set("PW_CFISCA", cliente.codice_fiscale()); pafw300f.set("PW_CFISCA", cliente.codice_fiscale());
pafw300f.set("PW_DENOM", cliente.ragione_sociale()); pafw300f.set("PW_DENOM", cliente.ragione_sociale());
if (cliente.fisica()) if (cliente.fisica() && cliente.nome().full())
{ {
pafw300f.set("PW_NOME", cliente.nome()); pafw300f.set("PW_NOME", cliente.nome());
pafw300f.set("PW_COGN", cliente.cognome()); pafw300f.set("PW_COGN", cliente.cognome());
@ -1746,10 +1802,12 @@ bool TDoc_fp::doc_to_paf(const TFilename& ini)
const TDoc_key key(anno, codnum, ndoc); const TDoc_key key(anno, codnum, ndoc);
return doc_to_paf(key); return doc_to_paf(key);
} }
bool TDoc_fp::doc_to_paf() bool TDoc_fp::doc_to_paf()
{ {
return _doc_rec != nullptr ? doc_to_paf(*_doc_rec) : false; return _doc_rec != nullptr ? doc_to_paf(*_doc_rec) : false;
} }
TRectype& TDoc_fp::key_to_doc(const TDoc_key& key) TRectype& TDoc_fp::key_to_doc(const TDoc_key& key)
{ {
if(_doc_rec != nullptr) if(_doc_rec != nullptr)