diff --git a/src/ve/velib.h b/src/ve/velib.h index 739a75cbc..ffe71675f 100755 --- a/src/ve/velib.h +++ b/src/ve/velib.h @@ -978,7 +978,9 @@ public: void iva_esente(TString & codiva_es) const; real spese_incasso(real &imp, int ndec, TTipo_importo netto = _lordo) const ; - real bolli(real & imp, int ndec, TTipo_importo netto = _lordo) const ; + real imponibile_bolli_esenti() const; + bool bolli_esenti_dovuti() const; + real bolli(real & imp, int ndec, TTipo_importo netto = _lordo) const ; real imponibile(bool spese = false, int ndec = AUTO_DECIMALS) const; real imposta(bool spese = false, int ndec = AUTO_DECIMALS) const; diff --git a/src/ve/velib03.cpp b/src/ve/velib03.cpp index cee5e112c..af5b00be3 100755 --- a/src/ve/velib03.cpp +++ b/src/ve/velib03.cpp @@ -475,33 +475,46 @@ void TDocumento::iva_esente(TString& codiva_es) const } } -real TDocumento::bolli(real & imp, int ndec, TTipo_importo t) const -{ - real tot_bolli; - static TArray sca_bolli; - static TArray imp_bolli; - static real bolli_es; - static real impmin_bolli; - static int nscagl; +real TDocumento::imponibile_bolli_esenti() const +{ + real imponibile_esente; - if (get_bool("ADDBOLLI")) + FOR_EACH_SELF_PHYSICAL_RDOC(r, riga) { - if (sca_bolli.objptr(0) == NULL) + const TCodiceIVA codiva(riga->get(RDOC_CODIVA)); + + if (codiva.tipo().not_empty() && !codiva.escluso_esenti()) + imponibile_esente += abs(riga->imponibile()); + } + return imponibile_esente; +} +bool TDocumento::bolli_esenti_dovuti() const +{ + const real impmin_bolli = ini_get_real(CONFIG_STUDIO, "ve", "IMPMINBOLLI"); + + return imponibile_bolli_esenti() >= impmin_bolli; +} + +real TDocumento::bolli(real & imp, int ndec, TTipo_importo t) const +{ + real tot_bolli; + + if (get_bool(DOC_ADDBOLLI)) + { + const real bolli_es = ini_get_real(CONFIG_STUDIO, "ve", "BOLLIES"); + TArray sca_bolli; + TArray imp_bolli; + int nscagl; + + for (nscagl = 0; nscagl < 7; nscagl++) { - TConfig conf(CONFIG_STUDIO, "ve"); + const real s = ini_get_real(CONFIG_STUDIO, "ve", "SPBOSCA", "", nscagl + 1); + const real i = ini_get_real(CONFIG_STUDIO, "ve", "SPBOIMP", "", nscagl + 1); - bolli_es = (real) conf.get("BOLLIES", "ve"); - impmin_bolli = (real) conf.get("IMPMINBOLLI", "ve"); - for (nscagl = 0; nscagl < 7; nscagl++) - { - real s(conf.get("SPBOSCA", "ve", nscagl + 1)); - real i(conf.get("SPBOIMP", "ve", nscagl + 1)); - - if (s == ZERO && i == ZERO) - break; - sca_bolli.add(s, nscagl); - imp_bolli.add(i, nscagl); - } + if (s == ZERO && i == ZERO) + break; + sca_bolli.add(s, nscagl); + imp_bolli.add(i, nscagl); } if (ndec == AUTO_DECIMALS) ndec = decimals(); @@ -530,19 +543,11 @@ real TDocumento::bolli(real & imp, int ndec, TTipo_importo t) const const real imposte = imp_orig + iva_bolli; const real imp_spese = sp_orig + tot_bolli - iva_bolli; const real imponibile = importo - imposte - imp_spese; - tot_bolli = ZERO; - real imponibile_esente; - - for (int r = physical_rows(); r > 0; r--) - { - const TRiga_documento& riga = ((TDocumento*)this)->row(r); - const TCodiceIVA codiva(riga.get(RDOC_CODIVA)); - - if (codiva.tipo().not_empty() && !codiva.escluso_esenti()) - imponibile_esente += abs(riga.imponibile()); - } - if (imponibile_esente >= impmin_bolli) + + if (bolli_esenti_dovuti()) tot_bolli = bolli_es; + else + tot_bolli = ZERO; pag.set_total(imponibile, imposte, imp_spese); pag.set_rate_auto();