Patch level : 1090

Files correlati     : cg2.exe
Ricompilazione Demo : [ ]
Commento            :
Modificato calcolo scorporo IVA in base alle nuove direttive


git-svn-id: svn://10.65.10.50/branches/R_10_00@22443 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 2011-10-06 10:38:38 +00:00
parent c4c0fe6efb
commit 075485d3e0
3 changed files with 29 additions and 77 deletions

View File

@ -573,86 +573,37 @@ bool TCodiceIVA::read(const char* cod)
return !empty(); return !empty();
} }
real TCodiceIVA::imposta(const real& imponibile, int ndec, const char* codval) const void TCodiceIVA::round(real& n, int ndec, const char* codval) const
{ {
const real percent = percentuale();
real iva = imponibile * percent / CENTO;
switch (ndec) switch (ndec)
{ {
case AUTO_DECIMALS: case AUTO_DECIMALS : ndec = (codval && *codval) ? TExchange(codval).decimals(false) : 2; break;
ndec = TExchange(codval).decimals(FALSE); case AUTO_PRICES_DECIMALS: ndec = TExchange(codval).decimals(true); break;
break; default : break;
case AUTO_PRICES_DECIMALS:
ndec = TExchange(codval).decimals(TRUE);
break;
default:
break;
} }
if (ndec < 20) if (ndec < 10)
n.round(ndec);
}
real TCodiceIVA::imposta(const real& imponibile, int ndec, const char* codval) const
{ {
if (ndec == 0) // VECCHIE LIRE! real iva = imponibile * percentuale() / CENTO;
{ round(iva, ndec, codval);
if (imponibile > ZERO)
iva.ceil(ndec);
else
iva.floor(ndec);
}
else
iva.round(ndec);
}
return iva; return iva;
} }
real TCodiceIVA::scorpora(real& lordo, int ndec, const char* codval) const real TCodiceIVA::scorpora(real& lordo, int ndec, const char* codval) const
{ {
const real percent = percentuale(); round(lordo, ndec, codval); // Arrotondo importo lordo
real iva = (lordo * percent) / (percent + CENTO); real imponibile = lordo * CENTO / (CENTO + percentuale());
real imponibile = lordo - iva; round(imponibile, ndec, codval); // Arrotondo importo netto
const real iva = lordo - imponibile;
switch (ndec)
{
case AUTO_DECIMALS:
ndec = TExchange(codval).decimals(FALSE);
break;
case AUTO_PRICES_DECIMALS:
ndec = TExchange(codval).decimals(TRUE);
break;
default:
break;
}
if (ndec < 20) // E' richiesto un arrotondamento significativo?
{
lordo.round(ndec); // Arrotondo importo lordo
if (ndec == 0) // Probabile caso Lire: arrotondo per eccesso l'IVA
{
if (imponibile > ZERO)
iva.ceil(ndec);
else
iva.floor(ndec);
}
else
iva.round(ndec); // Probabile caso Euro: arrotondo matematicamente l'IVA
imponibile.round(ndec); // Arrotondo imponibile
real diff = lordo - imponibile - iva;
diff.round(ndec); // Arrotondo la differenza (importantissimo per evitare valori del tipo 1E-18)
if (!diff.is_zero())
{
if (iva.sign() == diff.sign()) // Faccio crescere l'iva o l'imponibile ?
iva += diff;
else
imponibile += diff;
}
}
lordo = imponibile; // lordo è un reference da aggiornare con l'imponibile! lordo = imponibile; // lordo è un reference da aggiornare con l'imponibile!
return iva; return iva;
} }
real TCodiceIVA::lordo(const real& imponibile, int ndec, const char* codval) const real TCodiceIVA::lordo(const real& imponibile, int ndec, const char* codval) const
{ { return imponibile + imposta(imponibile, ndec, codval); }
return imponibile + imposta(imponibile, ndec, codval);
}
/////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////

View File

@ -138,6 +138,7 @@ class TCodiceIVA : public TRectype
{ {
protected: protected:
void copy(const TRectype & iva) { TRectype::operator =(iva); } void copy(const TRectype & iva) { TRectype::operator =(iva); }
void round(real& n, int ndec, const char* codval) const;
public: // TObject public: // TObject
virtual bool ok() const { return !empty(); } virtual bool ok() const { return !empty(); }