diff --git a/src/fp/fplib.h b/src/fp/fplib.h index 2b3d8dd4f..84e34fef1 100644 --- a/src/fp/fplib.h +++ b/src/fp/fplib.h @@ -113,17 +113,18 @@ private: TCausale _caus; bool _is_pa; bool _has_bolla; + TString _codivadefault; - // Classe interna per gestire gli omaggi - class TOmaggio_info + // Classe interna per gestire righe aggiuntive in riepilogo + class TRiepilogo_agg { public: real imponibile; real imposta; - TOmaggio_info() : imponibile(ZERO), imposta(ZERO){} + TRiepilogo_agg() : imponibile(ZERO), imposta(ZERO){} }; - std::map _omaggi; + std::map _riepilogo_agg; struct { @@ -153,13 +154,14 @@ protected: void log(int severity, const char* msg); const char* natura(const TString& codiva) const; - static void set_IVA(const TString& codiva, TPaf_record& paf); - static void set_IVA(const TRiga_documento& rdoc, TPaf_record& paf); + void set_IVA(TString codiva, TPaf_record& paf) const; + void set_IVA(const TRiga_documento& rdoc, TPaf_record& paf) const; bool add_row_art(long& riga_art, const TString& codice_tipo, const TString& codice_valore, TPaf_record& paf); bool add_row_alleg(TFilename& file, long& nprogr, TPaf_record& paf); const TString& converti_prezzo(const real& prezzo) const; void set_qta_prezzo(TPaf_record& paf1800f, TRiga_documento* rdoc) const; void add_ritenuta(const TDocumentoEsteso& doc, const TSpesa_prest& sp, TPaf_record& paf0700f) const; + bool add_riepilogo_iva(TPaf_record& paf2200f, const TCodiceIVA& cod_iva, const char* eiva, const real& imponibile = ZERO, const real& imposta = ZERO); const TFirm& get_firm(); diff --git a/src/fp/fplib01.cpp b/src/fp/fplib01.cpp index aee705088..3126e2dc1 100644 --- a/src/fp/fplib01.cpp +++ b/src/fp/fplib01.cpp @@ -719,6 +719,16 @@ bool TDoc_fp::initialize(const TDocumentoEsteso& doc) _caus = TCausale(doc.tipo().causale(), doc.anno()); + // Preparo il codice iva di default + { + FOR_EACH_PHYSICAL_RDOC(doc, r, rdoc) + { + _codivadefault = rdoc->get(RDOC_CODIVA); + if (_codivadefault.full()) + break; + } + } + return true; } @@ -807,14 +817,17 @@ const char* TDoc_fp::natura(const TString& codiva) const return cache().get("%IVA", codiva, "S12"); } -void TDoc_fp::set_IVA(const TString& codiva, TPaf_record& paf) +void TDoc_fp::set_IVA(TString codiva, TPaf_record& paf) const { - // É necessario il cast a real? - paf.set("PI_ALIQUOTAIVA", static_cast(cache().get("%IVA", codiva, "R0"))); - paf.set("PI_NATURA", cache().get("%IVA", codiva, "S12")); + if (codiva.empty()) + codiva = _codivadefault; + + // É necessario il cast a real? + paf.set("PI_ALIQUOTAIVA", static_cast(cache().get("%IVA", codiva, "R0"))); + paf.set("PI_NATURA", natura(codiva)); } -void TDoc_fp::set_IVA(const TRiga_documento& rdoc, TPaf_record& paf) +void TDoc_fp::set_IVA(const TRiga_documento& rdoc, TPaf_record& paf) const { set_IVA(rdoc.get(RDOC_CODIVA), paf); } @@ -931,6 +944,46 @@ void TDoc_fp::add_ritenuta(const TDocumentoEsteso& doc, const TSpesa_prest& sp, // } +bool TDoc_fp::add_riepilogo_iva(TPaf_record& paf2200f, const TCodiceIVA& cod_iva, const char* eiva, const real& imponibile, + const real& imposta) +{ + paf2200f.reset(); + paf2200f.set("PL_KEYHEADERFATT", _hfatt); + paf2200f.set("PL_KEYBODYFATT", _bfatt); + + const real aliquota = cod_iva.percentuale(); + const TString& cod_aliquota = cod_iva.codice(); + TRiepilogo_agg& riepilogo_agg = _riepilogo_agg[cod_aliquota]; + + // Aliquota + paf2200f.set("PL_ALIQUOTAIVA", aliquota); + + // Natura + if (aliquota.is_zero()) + paf2200f.set("PL_NATURA", natura(cod_aliquota)); + + // Imponibile + paf2200f.set("PL_IMPONIBILE", converti_prezzo(imponibile + riepilogo_agg.imponibile)); + + // Imposta, per gli omaggi con addebito ho già l'imposta + paf2200f.set("PL_IMPOSTA", converti_prezzo(imposta)); + + // Esigibilità IVA + paf2200f.set("PL_ESIGIVA", eiva); + if (*eiva == 'S') + paf2200f.set("PL_RIFNORMATIVO", "Scissione pagamenti art.17-ter DPR 633/72"); + else + paf2200f.set("PL_RIFNORMATIVO", cod_iva.descrizione()); + + paf2200f.set("PL_GESTIONE", "D"); + + // Elimino l'oggetto + _riepilogo_agg.erase(cod_aliquota); + + // Inserisco + return insert(paf2200f); +} + const TFirm& TDoc_fp::get_firm() { return prefix().firm(); @@ -1255,15 +1308,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc) paf3000f.set("PT_KEYBODYFATT", _bfatt); remove(paf3000f); long riga = 0; - TString16 codivadefault; - { - FOR_EACH_PHYSICAL_RDOC(doc, r, rdoc) - { - codivadefault = rdoc->get(RDOC_CODIVA); - if (codivadefault.full()) - break; - } - } + FOR_EACH_PHYSICAL_RDOC(doc, r, rdoc) { paf1800f.reset(); @@ -1311,7 +1356,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc) paf1800f.set("PI_QUANTITA", UNO); paf1800f.set("PI_PREZZOUNIT", ZERO); paf1800f.set("PI_PRZTOTALE", ZERO); - set_IVA(codivadefault, paf1800f); + set_IVA(_codivadefault, paf1800f); } else if (rdoc->is_merce()) { @@ -1324,7 +1369,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc) set_qta_prezzo(paf1800f, rdoc); if(rdoc->iva().codice().empty()) { - set_IVA(codivadefault, paf1800f); + set_IVA(_codivadefault, paf1800f); } else set_IVA(*rdoc, paf1800f); @@ -1411,7 +1456,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc) paf1800f.set("PI_PRZTOTALE", converti_prezzo(imp)); set_IVA(*rdoc, paf1800f); - // Controllo se è una ritenuta fiscale + // Controllo se è una ritenuta fiscale if (sp.tipo_ritenuta() == 'F') { add_ritenuta(doc, rdoc->spesa(), paf0700f); @@ -1461,9 +1506,10 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc) paf1800f.set("PI_PREZZOUNIT", converti_prezzo(rdoc->prezzo(false, false, 8))); 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); + TRiepilogo_agg& riepilogo_agg = _riepilogo_agg[rdoc->iva().codice()]; + riepilogo_agg.imponibile += rdoc->imponibile_omaggio(2); + // Non metto l'imposta, è già presente nei totali + //riepilogo_agg.imposta += rdoc->iva_omaggio(8, 2); } else { @@ -1542,7 +1588,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc) paf1800f.set("PI_QUANTITA", UNO); paf1800f.set("PI_PREZZOUNIT", ZERO); paf1800f.set("PI_PRZTOTALE", ZERO); - set_IVA(codivadefault, paf1800f); + set_IVA(_codivadefault, paf1800f); ok &= insert(paf1800f) && insert(paf3000f); } } @@ -1600,7 +1646,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc) paf1800f.set("PI_QUANTITA", UNO); paf1800f.set("PI_PREZZOUNIT", ZERO); paf1800f.set("PI_PRZTOTALE", ZERO); - set_IVA(codivadefault, paf1800f); + set_IVA(_codivadefault, paf1800f); ok &= insert(paf1800f) && insert(paf3000f); } @@ -1690,37 +1736,20 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc) TAssoc_array& tiva = doc.tabella_iva(false); FOR_EACH_ASSOC_OBJECT(tiva, obj, key, itm) { - paf2200f.reset(); - paf2200f.set("PL_KEYHEADERFATT", _hfatt); - paf2200f.set("PL_KEYBODYFATT", _bfatt); const TRiepilogo_iva& riva = *dynamic_cast(itm); - 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); - - // Natura - if (aliquota.is_zero()) - paf2200f.set("PL_NATURA", natura(riva.cod_iva().codice())); - - // 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())); - - // Esigibilità IVA - paf2200f.set("PL_ESIGIVA", eiva); - if (*eiva == 'S') - paf2200f.set("PL_RIFNORMATIVO", "Scissione pagamenti art.17-ter DPR 633/72"); - else - paf2200f.set("PL_RIFNORMATIVO", riva.cod_iva().descrizione()); - - paf2200f.set("PL_GESTIONE", "D"); - ok &= insert(paf2200f); + + add_riepilogo_iva(paf2200f, riva.cod_iva(), eiva, riva.imponibile(), riva.imposta()); } + + if(!_riepilogo_agg.empty()) + { + for(auto i = _riepilogo_agg.begin(); i != _riepilogo_agg.end(); ++i) + { + const TCodiceIVA cod_iva(i->first); + add_riepilogo_iva(paf2200f, cod_iva, eiva); + } + } + // // TPaf_record paf2400f("PAF2400F");