diff --git a/build/fp0.vcxproj b/build/fp0.vcxproj index 845c76bf6..b5d69d573 100644 --- a/build/fp0.vcxproj +++ b/build/fp0.vcxproj @@ -195,9 +195,8 @@ - true - - + false + true @@ -207,7 +206,7 @@ - true + false diff --git a/cd/test/fp0728.txt b/cd/test/fp0728.txt index 7bfd72c3f..6d95708db 100644 --- a/cd/test/fp0728.txt +++ b/cd/test/fp0728.txt @@ -1,7 +1,7 @@ -fp1100a.msk -fp0.exe fpmenu.men +fp0.exe fp1.exe +fp1100a.msk - Aggiunto programma stampa elenco bolli in fattura -- Data una ripulita al menu fp \ No newline at end of file +- Data una ripulita al menu fp diff --git a/cd/test/fp0728a.ini b/cd/test/fp0728a.ini index 40b589848..3c4b1cdf9 100644 --- a/cd/test/fp0728a.ini +++ b/cd/test/fp0728a.ini @@ -3,9 +3,9 @@ Demo=0 [fp1] File(0) = fp0.exe|X -File(6) = fpmenu.men|X -File(7) = fp1.exe|X -File(8) = fp1100a.msk|X +File(6) = fp1.exe|X +File(7) = fp1100a.msk|X +File(8) = fpmenu.men|X Patch = 728 Versione = 21511200 diff --git a/cd/test/fp0728a1.zip b/cd/test/fp0728a1.zip index 0fb6239eb..44b5c22e5 100644 Binary files a/cd/test/fp0728a1.zip and b/cd/test/fp0728a1.zip differ diff --git a/cd/test/ve0728.txt b/cd/test/ve0728.txt new file mode 100644 index 000000000..3005f288d --- /dev/null +++ b/cd/test/ve0728.txt @@ -0,0 +1,5 @@ +ve1.exe +cg0.exe +cgmenu.men + +Aggiunta riga valenza fiscale nella stampa del documento \ No newline at end of file diff --git a/cd/test/ve0728a.ini b/cd/test/ve0728a.ini new file mode 100644 index 000000000..3317381f2 --- /dev/null +++ b/cd/test/ve0728a.ini @@ -0,0 +1,139 @@ +[Main] +Demo=0 + +[ve1] +File(19) = ve1.exe|X +Patch = 728 +Versione = 21511200 + +[ve99] +Kill(0) = batbimb.msk|x +Kill(1) = batbacr.msk|x +Kill(2) = batbums.msk|x +Kill(3) = batbeld.msk|x +Kill(4) = bastnum.msk|x +Kill(5) = basttri.msk|x +Kill(6) = batbfrm.msk|x +Kill(7) = batbcra.msk|x +Kill(8) = bastfrd.rep|x +Kill(9) = bastcra.rep|x +Kill(10) = ve7600a.msk|x +Kill(11) = ve7300a.msk|x +Kill(12) = bastfca.rep|x +Kill(13) = batbspt.msk|x +Kill(14) = basttip.rep|x +Kill(15) = ve7700a.msk|x +Kill(16) = bastimb.msk|x +Kill(17) = baststd.msk|x +Kill(18) = bastfrr.msk|x +Kill(19) = ve7500a.msk|x +Kill(20) = efstbnp.rep|x +Kill(21) = batbtri.msk|x +Kill(22) = batbrfa.msk|x +Kill(23) = batbasf.msk|x +Kill(24) = basteld.rep|x +Kill(25) = bastasf.rep|x +Kill(26) = batbmre.msk|x +Kill(27) = ve7200a.msk|x +Kill(28) = batbfrr.msk|x +Kill(29) = bastrfc.rep|x +Kill(30) = batbprv.msk|x +Kill(31) = bastums.rep|x +Kill(32) = bastcaa.msk|x +Kill(33) = batbgca.msk|x +Kill(34) = bastfca.msk|x +Kill(35) = ve7.exe|x +Kill(36) = ve7400conf.ini|x +Kill(37) = bastctr.msk|x +Kill(38) = bastrfa.rep|x +Kill(39) = bastfrr.rep|x +Kill(40) = batbfrd.msk|x +Kill(41) = ve7200a.frm|x +Kill(42) = bastfrm.rep|x +Kill(43) = batbpro.msk|x +Kill(44) = bastcau.msk|x +Kill(45) = bastums.msk|x +Kill(46) = basteld.msk|x +Kill(47) = batbubi.msk|x +Kill(48) = bastubi.rep|x +Kill(49) = ve7400a.ini|x +Kill(50) = batbtip.msk|x +Kill(51) = basttri.rep|x +Kill(52) = bastimb.rep|x +Kill(53) = basttag.msk|x +Kill(54) = bastasf.msk|x +Kill(55) = bastrfa.msk|x +Kill(56) = batbfid.msk|x +Kill(57) = ve7100a.msk|x +Kill(58) = batbspp.msk|x +Kill(59) = bastrfc.msk|x +Kill(60) = batbctr.msk|x +Kill(61) = bastabe.rep|x +Kill(62) = ve7300a.frm|x +Kill(63) = batbcaa.msk|x +Kill(64) = batbgcg.msk|x +Kill(65) = bastprs.msk|x +Kill(66) = bastubi.msk|x +Kill(67) = bastgmc.msk|x +Kill(68) = batbfsa.msk|x +Kill(69) = batbstd.msk|x +Kill(70) = bastnum.rep|x +Kill(71) = bastgcg.msk|x +Kill(72) = batbtag.msk|x +Kill(73) = batbrfc.msk|x +Kill(74) = batbnum.msk|x +Kill(75) = ve7701a.ini|x +Kill(76) = eftbbnp.msk|x +Kill(77) = bastabe.msk|x +Kill(78) = bastgca.rep|x +Kill(79) = batbbnp.msk|x +Kill(80) = basttag.rep|x +Kill(81) = bastspp.msk|x +Kill(82) = bastctr.rep|x +Kill(83) = batbcau.msk|x +Kill(84) = batbprs.msk|x +Kill(85) = bastcaa.rep|x +Kill(86) = bastcau.rep|x +Kill(87) = bastgca.msk|x +Kill(88) = ve7400a.msk|x +Kill(89) = baststd.rep|x +Kill(90) = batbabe.msk|x +Kill(91) = efstbnp.msk|x +Kill(92) = bastcra.msk|x +Kill(93) = batbgmc.msk|x +Kill(94) = bastfrd.msk|x +Kill(95) = bastbnp.rep|x +Kill(96) = basttip.msk|x +Kill(97) = bastprs.rep|x +Kill(98) = bastspp.rep|x +Kill(99) = batbcld.msk|x +Kill(100) = bastfrm.msk|x +Kill(101) = batbgsa.msk|x +Kill(102) = bastgmc.rep|x +Kill(103) = bastbnp.msk|x +Kill(104) = bastgcg.rep|x +Kill(105) = batbfca.msk|x + +[cg9] +Edit_19 = cg0 -0 +Edit_20 = cg0 -1 +Edit_26 = cg0 -4 +Edit_5 = cg0 -5 +File(127) = cg0.exe|X +File(173) = cgmenu.men|X +Patch = 716 +Versione = 21511200 + +[ve] +Data = 12-03-2019 +Descrizione = Vendite +Dischi = 1 +Moduli = ba,cg9,pr9,mg9,sv9,in9,ef9 +OEM = +Patch = 728 +PostProcess = bainst -0 VE +PreProcess = +Prezzo(1) = +Prezzo(2) = +Versione = 21511200 + diff --git a/cd/test/ve0728a1.zip b/cd/test/ve0728a1.zip new file mode 100644 index 000000000..92f993234 Binary files /dev/null and b/cd/test/ve0728a1.zip differ diff --git a/src/fp/fp0.cpp b/src/fp/fp0.cpp index 215e7eba1..0c89b13a1 100644 --- a/src/fp/fp0.cpp +++ b/src/fp/fp0.cpp @@ -11,7 +11,7 @@ int main(int argc, char** argv) case 1: rt = fp0200(argc, argv); break; // Inserimento massivo PEC e Cod Sdi clifo case 2: rt = fp0300(argc, argv); break; // Gestione fatture attive (PAA, Ex Fattura PA) case 3: rt = fp0400(argc, argv); break; // Monitor fatture passive - //case 4: rt = fp0500(argc, argv); break; // Elenco mancate consegna + case 4: rt = fp0500(argc, argv); break; // Elenco mancate consegna default: rt = fp0100(argc, argv); break; // Configurazione } return rt; diff --git a/src/fp/fp0.h b/src/fp/fp0.h index c19add5b3..e2d05fe11 100644 --- a/src/fp/fp0.h +++ b/src/fp/fp0.h @@ -5,6 +5,6 @@ int fp0100(int argc, char* argv[]); int fp0200(int argc, char* argv[]); int fp0300(int argc, char* argv[]); int fp0400(int argc, char* argv[]); -//int fp0500(int argc, char* argv[]); +int fp0500(int argc, char* argv[]); #endif diff --git a/src/ve/velib.h b/src/ve/velib.h index 715927662..9fdc20911 100755 --- a/src/ve/velib.h +++ b/src/ve/velib.h @@ -748,8 +748,9 @@ class TDocumento : public TMultiple_rectype // velib03 TString8 _old_agente; // Agente originale TString8 _old_agente1; // Secondo Agente originale - TRiga_documento * _sconto; // Riga per lo sconto di testata + TRiga_documento * _sconto; // Riga per lo sconto di testata TRiga_documento * _esenzione; // Riga per l' esenzione iva + TRiga_documento * _valfisc; // Riga di valenza fiscale per fatture 2019+ bool _dirty_deny; @@ -820,7 +821,7 @@ public: void sort_rows(const char * key); int physical_rows() const { return body().rows(); } - virtual int rows() const { return physical_rows() + (ha_riga_sconto() ? 1 : 0) + (ha_riga_esenzione() ? 1 : 0); } + virtual int rows() const { return physical_rows() + (ha_riga_sconto() ? 1 : 0) + (ha_riga_esenzione() ? 1 : 0) + (ha_riga_valfisc() ? 1 : 0); } const TRiga_documento& operator[](int index) const { return (const TRiga_documento&)((TDocumento *)this)->row(index); } TRiga_documento& operator[](int index) { return (TRiga_documento&)row(index); } @@ -890,9 +891,11 @@ public: void set_fields(TAuto_variable_rectype & rec); void update_esenzione(); void set_riga_esenzione(); + void set_riga_valfisc(); const TRiga_documento& get_riga_esenzione() const { return *_esenzione; } bool ha_riga_sconto() const { return _sconto != NULL; } bool ha_riga_esenzione() const { return _esenzione != NULL; } + bool ha_riga_valfisc() const { return _valfisc != NULL; } void iva_esente(TString & codiva_es) const; real spese_incasso(real &imp, int ndec, TTipo_importo netto = _lordo) const ; diff --git a/src/ve/velib03.cpp b/src/ve/velib03.cpp index 682958339..94701edbb 100755 --- a/src/ve/velib03.cpp +++ b/src/ve/velib03.cpp @@ -250,7 +250,7 @@ void TDocumento::init() _codcf = new TRecfield(*this, DOC_CODCF); _cod_occas = new TRecfield(*this, DOC_OCFPI); - _sconto = _esenzione = NULL; + _sconto = _esenzione = _valfisc = NULL; _stato_originale = ' '; _dirty_deny = false; @@ -306,6 +306,7 @@ TDocumento::~TDocumento() if (_sconto != NULL) delete _sconto; if (_esenzione != NULL) delete _esenzione; + if (_valfisc != NULL) delete _valfisc; } const TString& TDocumento::codiva_spese() const @@ -819,8 +820,11 @@ void TDocumento::on_read(int err, word lockop) _occas.zero(); set_riga_sconto(); - if (is_fattura()) - set_riga_esenzione(); + if (is_fattura()) + { + set_riga_esenzione(); + set_riga_valfisc(); + } _stato_originale = stato(); #ifdef LIVE_STATISTICS @@ -1004,15 +1008,15 @@ void TDocumento::set_riga_esenzione() TString16 v_data_esenzione; TString16 n_registrazione; TString16 n_data_registrazione; - bool multiPlaf = c.use_lettere() && get("PLAFOND").full(); // Gestione multiplafond su documento - if (codes.codice().full() && !multiPlaf) + const bool multi_plaf = c.use_lettere() && get("PLAFOND").full(); // Gestione multiplafond su documento + if (codes.codice().full() && !multi_plaf) { get_protocolli_esenzione(v_esenzione, v_data_esenzione, n_registrazione, n_data_registrazione); } // Tradotto: se ha il cod. esenzione AND (i protocolli pieni OR multiplaf) bool esente = codes.tipo().not_empty() && ((v_esenzione.not_empty() && v_data_esenzione.not_empty() && n_registrazione.not_empty() && - n_data_registrazione.not_empty()) || multiPlaf); + n_data_registrazione.not_empty()) || multi_plaf); if (esente) { esente = false; @@ -1054,7 +1058,7 @@ void TDocumento::set_riga_esenzione() _esenzione = new TRiga_documento(this, _tipo_riga_es); TString d = _des_esenz; - if(multiPlaf) + if(multi_plaf) { d << " come dalle vostre dichiarazioni:\n"; TToken_string lePlafs(get("PLAFOND"), ','); @@ -1076,6 +1080,19 @@ void TDocumento::set_riga_esenzione() _esenzione->set_descr(d); } } + +void TDocumento::set_riga_valfisc() +{ + static TDate anno_fatt_elett = TDate(01, 01, 2019); + if(is_fattura() && tipo().tipo_doc_sdi().full() && data() >= anno_fatt_elett) + { + if (_valfisc == nullptr) + _valfisc = new TRiga_documento(this, "05"); + + // Uno \n all'inizio per staccarla dal resto, ATTENZIONE!!! Senza lo spazio iniziale scrive solo una parte di questo messaggio! + _valfisc->set_descr(" \nStampa priva di valenza giuridico-fiscale ai sensi dell'art.21 DPR 633/72, salvo per i soggetti non titolari di partita iva e/o non residenti ai sensi del comma 909 art.1 L.205/2017."); + } +} void TDocumento::dirty_fields() { @@ -1932,15 +1949,31 @@ TRiga_documento & TDocumento::row(int index) r = &((TRiga_documento &) b.row(index, FALSE)); } else - { - CHECKD((index == nrows + 1 && (_sconto != NULL || _esenzione != NULL)) || (index == nrows + 2 && _sconto != NULL && _esenzione != NULL), - "Riga documento non esistente ", index); - if (index == nrows + 1) - { - r = _sconto != NULL ? _sconto : _esenzione; - } else - if (index == nrows + 2) - r = _esenzione; + { + + CHECKD(index <= rows(), "Riga documento non esistente ", index); + + switch (index - nrows) + { + case 1: + if (_sconto != NULL) + { + r = _sconto; + break; + } + case 2: + if (_esenzione != NULL) + { + r = _esenzione; + break; + } + case 3: + { + r = _valfisc; + break; + } + } + } return *r; } @@ -2729,8 +2762,11 @@ TDocumento& TDocumento::copy(const TDocumento & d) r.set_fields(((TAuto_variable_rectype &)d[i])); } set_riga_sconto(); - if (is_fattura()) - set_riga_esenzione(); + if (is_fattura()) + { + set_riga_esenzione(); + set_riga_valfisc(); + } _occas = d.occas(); return *this; }