diff --git a/ve/velib.h b/ve/velib.h index 3b49999f2..e21aa5b9f 100755 --- a/ve/velib.h +++ b/ve/velib.h @@ -359,6 +359,7 @@ public: bool is_spese() const { return tipo().tipo() == 'S';} bool is_prestazione() const { return tipo().tipo() == 'P';} bool is_sconto() const {return tipo().tipo() == 'C';} + bool is_sconto_perc() const { return get(RDOC_SCONTO).not_empty();} bool is_omaggio() const { return tipo().tipo() == 'O';} bool is_descrizione() const { return tipo().tipo() == 'D';} bool is_articolo() const; @@ -421,6 +422,9 @@ class TRiepilogo_iva : public TObject real _imp_spese; real _iva; real _iva_spese; + real _sconto_perc; + real _sconto_imp; + real _iva_sconto; byte _tipo; protected: @@ -434,6 +438,9 @@ public: real & imp_spese() { return _imp_spese;}; real & iva() { return _iva;}; real & iva_spese() { return _iva_spese;}; + real & iva_sconto() { return _iva_sconto;}; + real & sconto_perc() { return _sconto_perc; } + real & sconto_imp () { return _sconto_imp; } const TIVA & cod_iva() const { return _codiva;} byte tipo(){ return _tipo;}// Tipo (Vedi opzioni per la selzione di filtro nella validate()) TRiepilogo_iva& operator = (const TRiepilogo_iva & a) {return copy(a);} diff --git a/ve/velib03.cpp b/ve/velib03.cpp index da8f84f00..a1895ade4 100755 --- a/ve/velib03.cpp +++ b/ve/velib03.cpp @@ -1102,6 +1102,7 @@ void TDocumento::update_tabella_iva() real tot_doc; real tot_sconti; + real tot_sconti_perc; for (int i = items; i > 0; i--) { @@ -1110,7 +1111,11 @@ void TDocumento::update_tabella_iva() tot_doc += imponibile; if (r.is_sconto()) - tot_sconti += imponibile; + { + tot_sconti += imponibile; + if (r.is_sconto_perc()) + tot_sconti_perc += imponibile; + } else if (!r.is_descrizione()) { @@ -1133,6 +1138,8 @@ void TDocumento::update_tabella_iva() if (tot_sconti != ZERO) { TGeneric_distrib d(tot_sconti); + real tot_sconti_imp = tot_sconti - tot_sconti_perc; + const int ndec = in_valuta() ? 3 : 0; table.restart(); for (TRiepilogo_iva * ri = (TRiepilogo_iva *) table.get(); ri != NULL; @@ -1146,13 +1153,23 @@ void TDocumento::update_tabella_iva() const char * codiva = ri->cod_iva().codice(); const real i(d.get()); real & imponibile = ri->imp(); - imponibile += i; - real & iva = ri->iva(); - const real imposta(::iva(i, TIVA(codiva), ALL_DECIMALS)); + TGeneric_distrib s(i); + + s.add(tot_sconti_imp); + s.add(tot_sconti_perc); + + ri->sconto_imp() = s.get(); + ri->sconto_perc() = s.get(); + + real & iva = ri->iva(); + const TIVA & ci = row(1).iva(codiva); + + const real imposta(::iva(i, ci, ALL_DECIMALS)); iva += imposta; + ri->iva_sconto() = ::iva(i, ci, ndec); tot_doc += imposta; } }