From f7b631d52a9beeaa1465533d3244d5682d6eea8c Mon Sep 17 00:00:00 2001 From: Alessandro Bonazzi Date: Tue, 7 Apr 2026 21:48:29 +0200 Subject: [PATCH] Patch level : 12.00 1410 Files correlati : f139.dir f139.trr ce0500b.msk ce2.exe ce3.exe Commento : Fringe benefit 70% , cespiti non ammortizzabili --- src/ce/ce0500a.h | 1 + src/ce/ce0500b.uml | 7 +++ src/ce/ce2101.cpp | 113 +++++++++++++++++++++++++++------------------ src/ce/ce2101.h | 2 +- src/ce/ce3100.cpp | 13 +++--- src/ce/cespi.h | 1 + 6 files changed, 84 insertions(+), 53 deletions(-) diff --git a/src/ce/ce0500a.h b/src/ce/ce0500a.h index 33351dbe6..14b68539a 100755 --- a/src/ce/ce0500a.h +++ b/src/ce/ce0500a.h @@ -31,6 +31,7 @@ #define F_LEASING 139 #define F_USATO 140 #define F_FABBR06 141 +#define F_NONAMM 142 #define F_SPEMAN 150 #define F_VEICOLO 151 diff --git a/src/ce/ce0500b.uml b/src/ce/ce0500b.uml index 3c8f6f94e..4a60ef979 100755 --- a/src/ce/ce0500b.uml +++ b/src/ce/ce0500b.uml @@ -290,6 +290,7 @@ BEGIN ITEM "2|Deducibilità 50% - Uso promiscuo" ITEM "3|Deducibilità 80% - Uso promiscuo agenti/rappresentanti" ITEM "4|Deducibilità 40% - Autovettura uso promiscuo" + ITEM "9|Deducibilità 70% - Autovettura in fringe benefit" ITEM "5|Deducibilità 90% - Autovettura in fringe benefit" ITEM "6|Deducibilità 80% - Cellulari" ITEM "7|Deducibilità 20% - Uso promiscuo" @@ -297,6 +298,12 @@ BEGIN FIELD USOPROM END +BOOLEAN F_NONAMM +BEGIN + PROMPT 1 20 "Cespite non ammortizzabile" + FIELD NONAMM +END + ENDPAGE PAGE "Personalizzazioni" -1 -1 78 18 diff --git a/src/ce/ce2101.cpp b/src/ce/ce2101.cpp index 83b24b36d..230a35ece 100755 --- a/src/ce/ce2101.cpp +++ b/src/ce/ce2101.cpp @@ -377,7 +377,6 @@ bool TCespite::valido() return false; } } - return true; } @@ -505,7 +504,8 @@ real TCespite::percentuale_deducibilita() const { real percento; const int uso_promiscuo = get_int(CESPI_USOPROM); - switch (uso_promiscuo) + + switch (uso_promiscuo) { case 2: // Beni in uso promiscuo percento = 50; @@ -522,10 +522,11 @@ real TCespite::percentuale_deducibilita() const break; case 3: percento = 80; break; // Agenti/rappresentanti case 4: percento = 40; break; // Uso promiscuo a dipententi - case 5: percento = 90; break; // Fringe benefit + case 5: percento = 90; break; // Fringe benefit90% case 6: percento = 80; break; // Cellulari case 7: percento = 20; break; // Uso promiscuo 2013 - case 8: percento = 70; break; // Uso promiscuo 2013 + case 8: percento = 70; break; // Uso promiscuo 2013 + case 9: percento = 70; break; // Fringe benefit 70% default: percento = CENTO; break; // Beni strumentali al 100% } return percento; @@ -878,7 +879,7 @@ int TCespite::test_rip(TRelation& rel) // Se questa supera il residuo da ammortizzare allora pone la quota uguale al residuo e // ricalcola la percentuale effettiva real TCespite::calc_quota(const real& valamm, const real& perric, - const real& residuo, real& pereff, TRelation* mov /* =NULL */) + const real& residuo, real& pereff, TRelation* mov /* = nullptr */) { // Caso anomalo di percentuale o valore nulli if (perric <= ZERO || valamm <= ZERO) @@ -1183,9 +1184,9 @@ void TCespite::calc_perc(TRelation& rel, const TRectype& tmv, const TRectype& tm { const TDitta_cespiti& cce = ditta_cespiti(); const real coeff = cce.coefficiente_durata_esercizio(); - - TRectype& ammmv = rel.curr(LF_AMMMV); - + const bool nonamm = get_bool(CESPI_NONAMM); + TRectype& ammmv = rel.curr(LF_AMMMV); + if (ammmv.get_bool(AMMMV_FZQUO)) // Forzatura per quote { // Leggo comunque le percentuali teoriche @@ -1265,23 +1266,28 @@ void TCespite::calc_perc(TRelation& rel, const TRectype& tmv, const TRectype& tm real resamm = mov_res_amm(tmv, tmvam) - ammmv.get_real(AMMMV_FPRIVATO); if (resamm > ZERO) { - const real penor = ammmv.get_real(AMMMV_PENOR); + const real penor = nonamm ? ZERO : ammmv.get_real(AMMMV_PENOR); real per_eff; const real qnor = calc_quota(mov_val_amm(tmv), penor, resamm, per_eff, &rel); - ammmv.put(AMMMV_QNOR, qnor); + + ammmv.put(AMMMV_QNOR, qnor); ammmv.put(AMMMV_PENOR, per_eff); resamm -= qnor; - const real peacc = ammmv.get_real(AMMMV_PEACC); - if (resamm > ZERO && peacc > ZERO) + + const real peacc = nonamm ? ZERO : ammmv.get_real(AMMMV_PEACC); + + if (resamm > ZERO && peacc > ZERO) { const real qacc = calc_quota(mov_val_amm(tmv), peacc, resamm, per_eff, &rel); - ammmv.put(AMMMV_QACC, qacc); + + ammmv.put(AMMMV_QACC, qacc); ammmv.put(AMMMV_PEACC, per_eff); resamm -= qacc; } - const real peant = ammmv.get_real(AMMMV_PEANT); + const real peant = nonamm ? ZERO : ammmv.get_real(AMMMV_PEANT); + if (resamm > ZERO && peant > ZERO) { const real qant = calc_quota(mov_val_amm(tmv), peant, resamm, per_eff, &rel); @@ -1336,10 +1342,11 @@ void TCespite::calc_perc(TRelation& rel, const TRectype& tmv, const TRectype& tm { // Calcolare quota ammortamento normale const real valamm = mov_val_amm(tmv); - const real penor = ammmv.get_real(AMMMV_PENOR); // Attenzione: usare PENOR, non PNOR! + const real penor = nonamm ? ZERO : ammmv.get_real(AMMMV_PENOR); // Attenzione: usare PENOR, non PNOR! real per_eff; const real qnor = calc_quota(valamm, penor, resamm, per_eff, &rel); - ammmv.put(AMMMV_QNOR, qnor); + + ammmv.put(AMMMV_QNOR, qnor); ammmv.put(AMMMV_PENOR, per_eff); // Calcolare quote perse @@ -1361,9 +1368,10 @@ void TCespite::calc_perc(TRelation& rel, const TRectype& tmv, const TRectype& tm // Calcolare quota ammortamento accelerato if (resamm > ZERO && ammmv.get_real(AMMMV_PEACC) > ZERO && ammmv.get_real(AMMMV_QPERSE) == ZERO) { - const real peacc = ammmv.get_real(AMMMV_PEACC); + const real peacc = nonamm ? ZERO : ammmv.get_real(AMMMV_PEACC); const real qacc = calc_quota(valamm, peacc, resamm, per_eff, &rel); - ammmv.put(AMMMV_QACC, qacc); + + ammmv.put(AMMMV_QACC, qacc); ammmv.put(AMMMV_PEACC, per_eff); if (_tipo_sit == 1 && get_int(CESPI_USOPROM) > 1) agg_quota(valamm, ammmv, "QACC", false); @@ -1380,11 +1388,13 @@ void TCespite::calc_perc(TRelation& rel, const TRectype& tmv, const TRectype& tm resamm -= ammmv.get_real(AMMMV_QACC); if (tipo() == tc_materiale && _salini.get_int(SALCE_ANNIAMM) <= 2) { - const real peant = ammmv.get_real(AMMMV_PEANT); + const real peant = nonamm ? ZERO : ammmv.get_real(AMMMV_PEANT); + if (resamm > ZERO && peant > ZERO && ammmv.get_real(AMMMV_QPERSE) == ZERO) { const real qant = calc_quota(valamm, peant, resamm, per_eff, &rel); - ammmv.put(AMMMV_QANT, qant); + + ammmv.put(AMMMV_QANT, qant); ammmv.put(AMMMV_PEANT, per_eff); if (_tipo_sit == 1 && get_int(CESPI_USOPROM) > 1) agg_quota(valamm, ammmv, "QANT", false); @@ -1737,7 +1747,8 @@ void TCespite::calc_amm_residui(bool is_valid) const bool is_forz = fzper || fzquo; // Forzatura sul cespite const TTipo_cespite tc = tipo(); const bool leasing = get_bool(CESPI_LEASING); - const int anniric = get_int(CESPI_ANNIRIC); + const int anniric = get_int(CESPI_ANNIRIC); + const bool nonamm = get_bool(CESPI_NONAMM); if ((tc == tc_materiale && !leasing) || (tc == tc_immateriale && anniric <= 0) || is_forz) { @@ -1794,10 +1805,11 @@ void TCespite::calc_amm_residui(bool is_valid) if (resamm > ZERO) { const real valamm = val_amm(); - const real pnor = _ammpro.get_real(AMMCE_PNOR); + const real pnor = nonamm ? ZERO : _ammpro.get_real(AMMCE_PNOR); real per_eff; const real qnor = calc_quota(valamm, pnor, resamm, per_eff); - _ammpro.put(AMMCE_QNOR, qnor); + + _ammpro.put(AMMCE_QNOR, qnor); ammpro_put_perc(AMMCE_PNOR, per_eff); resamm -= qnor; } @@ -1807,7 +1819,8 @@ void TCespite::calc_amm_residui(bool is_valid) AMMCE_QPERSE, AMMCE_FPRIVATO, AMMCE_QPPRIVATE, NULL); } - const real pacc = _ammpro.get_real(AMMCE_PACC); + const real pacc = nonamm ? ZERO : _ammpro.get_real(AMMCE_PACC); + if (resamm > ZERO && pacc > ZERO) { const real valamm = val_amm(); @@ -1820,7 +1833,8 @@ void TCespite::calc_amm_residui(bool is_valid) else zero_fields(_ammpro, AMMCE_QACC, AMMCE_PACC, NULL); - const real pant = _ammpro.get_real(AMMCE_PANT); + const real pant = nonamm ? ZERO : _ammpro.get_real(AMMCE_PANT); + if (resamm > ZERO && pant > ZERO) { const real valamm = val_amm(); @@ -1836,22 +1850,25 @@ void TCespite::calc_amm_residui(bool is_valid) else // Nessuna forzatura { // Leggo percentuali teoriche da AMMINI - _ammpro.put(AMMCE_PNOR, ammini_get_real(AMMCE_PNOR)); - _ammpro.put(AMMCE_PANT, ammini_get_real(AMMCE_PANT)); - _ammpro.put(AMMCE_PACC, ammini_get_real(AMMCE_PACC)); + _ammpro.put(AMMCE_PNOR, nonamm ? ZERO : ammini_get_real(AMMCE_PNOR)); + _ammpro.put(AMMCE_PANT, nonamm ? ZERO : ammini_get_real(AMMCE_PANT)); + _ammpro.put(AMMCE_PACC, nonamm ? ZERO : ammini_get_real(AMMCE_PACC)); // Percentuale minima quote perse - real pmat = get_real(CESPI_PMAT) / 2.0; + real pmat = nonamm ? ZERO : get_real(CESPI_PMAT) / 2.0; const TDate dtfunz = get_date(CESPI_DTFUNZ); - if (tc == tc_materiale && _salini.get_int(SALCE_ANNIAMM) == 0 && + + if (tc == tc_materiale && _salini.get_int(SALCE_ANNIAMM) == 0 && !cce.professionista() && dtfunz >= inies) { // Calcolo il valore di un singolo elemento per vedere se e' inferiore al milione di lire real vam1 = val_amm(); - if (vam1 > ZERO) + + if (vam1 > ZERO) { const real numele = _salpro.get_real(SALCE_NUMELE); - if (numele > ZERO) + + if (numele > ZERO) vam1 /= numele; } if (ammini_get_bool(AMMCE_CSCEN) && vam1 < un_milione()) @@ -1867,9 +1884,9 @@ void TCespite::calc_amm_residui(bool is_valid) const real durata_esercizio = fines - inies + 1; const real giorni_possesso = fines - dtfunz + 1; const real coeff = giorni_possesso / durata_esercizio; - ammpro_put_perc(AMMCE_PNOR, ammini_get_real(AMMCE_PNOR)*coeff); - ammpro_put_perc(AMMCE_PANT, ammini_get_real(AMMCE_PANT)*coeff); - ammpro_put_perc(AMMCE_PACC, ammini_get_real(AMMCE_PACC)*coeff); + ammpro_put_perc(AMMCE_PNOR, nonamm ? ZERO : ammini_get_real(AMMCE_PNOR)*coeff); + ammpro_put_perc(AMMCE_PANT, nonamm ? ZERO : ammini_get_real(AMMCE_PANT)*coeff); + ammpro_put_perc(AMMCE_PACC, nonamm ? ZERO : ammini_get_real(AMMCE_PACC)*coeff); pmat *= coeff; pmat.round(3); _ammpro.put(AMMCE_MSG06, "X"); // Ammortamento proporzionale nel primo esercizio } @@ -1877,9 +1894,9 @@ void TCespite::calc_amm_residui(bool is_valid) { if (!cce.primo_ammortamento_100(dtfunz, _ammpro.get_int(AMMCE_TPAMM), auto_o_moto())) { - ammpro_put_perc(AMMCE_PNOR, ammini_get_real(AMMCE_PNOR)/2.0); - ammpro_put_perc(AMMCE_PANT, ammini_get_real(AMMCE_PANT)/2.0); - ammpro_put_perc(AMMCE_PACC, ammini_get_real(AMMCE_PACC)/2.0); + ammpro_put_perc(AMMCE_PNOR, nonamm ? ZERO : ammini_get_real(AMMCE_PNOR)/2.0); + ammpro_put_perc(AMMCE_PANT, nonamm ? ZERO : ammini_get_real(AMMCE_PANT)/2.0); + ammpro_put_perc(AMMCE_PACC, nonamm ? ZERO : ammini_get_real(AMMCE_PACC)/2.0); pmat /= 2.0; pmat.round(3); _ammpro.put(AMMCE_MSG01, "X"); // Ammortamento al 40-50-80-90% nel primo esercizio } @@ -1891,10 +1908,11 @@ void TCespite::calc_amm_residui(bool is_valid) if (resamm > ZERO) { const real valamm = val_amm(); - const real pnor = _ammpro.get_real(AMMCE_PNOR); + const real pnor = nonamm ? ZERO : _ammpro.get_real(AMMCE_PNOR); real per_eff; const real qnor = calc_quota(valamm, pnor, resamm, per_eff); - _ammpro.put(AMMCE_QNOR, qnor); + + _ammpro.put(AMMCE_QNOR, qnor); ammpro_put_perc(AMMCE_PNOR, per_eff); // non piu' previste dalla legge tolto nel 2021 @@ -1908,11 +1926,13 @@ void TCespite::calc_amm_residui(bool is_valid) zero_fields(_ammpro, AMMCE_FPRIVATO, AMMCE_QPPRIVATE, NULL); resamm -= qnor + _ammpro.get_real(AMMCE_FPRIVATO); - const real pacc = _ammpro.get_real(AMMCE_PACC); - if (resamm > ZERO && pacc > ZERO) // non piu' previste dalla legge tolto nel 2021 && quote_perse.is_zero()) + const real pacc = nonamm ? ZERO : _ammpro.get_real(AMMCE_PACC); + + if (resamm > ZERO && pacc > ZERO) // non piu' previste dalla legge tolto nel 2021 && quote_perse.is_zero()) { const real qacc = calc_quota(val_amm(), pacc, resamm, per_eff); - _ammpro.put(AMMCE_QACC, qacc); + + _ammpro.put(AMMCE_QACC, qacc); ammpro_put_perc(AMMCE_PACC, per_eff); if (_tipo_sit == 1 && uso_promiscuo > 1) agg_quota(valamm, _ammpro, AMMCE_QACC, false); @@ -1930,8 +1950,9 @@ void TCespite::calc_amm_residui(bool is_valid) } else { - const real pant = _ammpro.get_real(AMMCE_PANT); - if (resamm > ZERO && pant > ZERO) + const real pant = nonamm ? ZERO : _ammpro.get_real(AMMCE_PANT); + + if (resamm > ZERO && pant > ZERO) { const real qant = calc_quota(val_amm(), pant, resamm, per_eff); _ammpro.put(AMMCE_QANT, qant); @@ -2101,7 +2122,7 @@ bool TCespite::calc_amm(int tipo_sit, const TDate& data_limite, #ifdef DBG - if (atol(idcespite) == 441) + if (atol(idcespite) == 264) int i = 1; // Put your breakpoint here #endif diff --git a/src/ce/ce2101.h b/src/ce/ce2101.h index 0b3b9e27b..a79fa33b5 100755 --- a/src/ce/ce2101.h +++ b/src/ce/ce2101.h @@ -62,7 +62,7 @@ protected: void elabora_mov_neg(TRelation& rel, TRectype& tmv, TRectype& tmvam); real calc_quota(const real& valamm, const real& perric, const real& residuo, - real& pereff, TRelation* mov = NULL); + real& pereff, TRelation* mov = nullptr); real calc_quote_perse(const real& valamm, const real& peric, const real& residuo, const real& quotamm, bool mov_vend, const TDate& dtmov); void agg_quota(const real& valamm, TRectype& rec, const char* field, bool calcq); diff --git a/src/ce/ce3100.cpp b/src/ce/ce3100.cpp index a85c8a8b0..5ddba2cb5 100755 --- a/src/ce/ce3100.cpp +++ b/src/ce/ce3100.cpp @@ -770,12 +770,13 @@ void TRegistro_cespiti::print_valorifinali() const int usoprom = _form->cursor()->curr().get_int(CESPI_USOPROM); switch (usoprom) { - case 2: key=TR("Ammortamento ridotto al 50% per bene in uso promiscuo"); break; - case 3: key=TR("Ammortamento ridotto all'80% per bene in uso promiscuo agenti/rappresentanti"); break; - case 4: key=TR("Ammortamento ridotto al 40% per auto in uso promiscuo"); break; - case 5: key=TR("Ammortamento ridotto al 90% per auto in fringe benefit"); break; - case 6: key=TR("Ammortamento ridotto all'80% per cellulari in uso promiscuo"); break; - default: break; + case 2: key = TR("Ammortamento ridotto al 50% per bene in uso promiscuo"); break; + case 3: key = TR("Ammortamento ridotto all'80% per bene in uso promiscuo agenti/rappresentanti"); break; + case 4: key = TR("Ammortamento ridotto al 40% per auto in uso promiscuo"); break; + case 5: key = TR("Ammortamento ridotto al 90% per auto in fringe benefit"); break; + case 6: key = TR("Ammortamento ridotto all'80% per cellulari in uso promiscuo"); break; + case 9: key = TR("Ammortamento ridotto al 90% per auto in fringe benefit"); break; + default: break; } section.find_field(FR_FE_MSG3).set(key); section.find_field(FR_FE_MSG3).enable(msg); diff --git a/src/ce/cespi.h b/src/ce/cespi.h index 95f2aa693..7ba0f060d 100755 --- a/src/ce/cespi.h +++ b/src/ce/cespi.h @@ -32,3 +32,4 @@ #define CESPI_IDIMP "IDIMP" #define CESPI_PERCIMP "PERCIMP" #define CESPI_FABBR06 "FABBR06" +#define CESPI_NONAMM "NONAMM"