Ho fatto un test sul mio gestionale (sviluppato da me) generando una fattura retail (dove il listino è già ivato e quindi l’imponibile va scorporato al volo).
Nel caso di prezzi ivati da scorporare al volo ci sono due problemi distinti:
-
la somma degli imponibili ivati potrebbe essere diversa dalla somma ivata degli imponibili, oppure, problema duale, la somma dei prezzi ivati scorporati potrebbe essere diversa dalla somma scorporata dei prezzi ivati
-
il totale tondo da scorporare non è esattamente scorporabile, ovvero, partendo dal TotaleTondo, sia
TotaleImponibile = Round(TotaleTondo/(1+Aliquota/100), 2, MidpointRounding.AwayFromZero)
TotaleImposta = Round(TotaleImponibile*Aliquota/100, 2, MidpointRounding.AwayFromZero)
l’ugliaglianza TotaleImponibile+TotaleImposta=TotaleTondo potrebbe non essere mai verificata
Questi due problemi vanno quindi risolti in modo indipendentemente. Ecco come li ho risolti:
Preliminarmente calcolo
TotaleTondo = somma dei prezzi ivati di ogni riga
-
Calcolo
TotaleImponibile = somma degli imponibili di ogni riga
TotaleImposta = Round(TotaleImponibile*Aliquota/100, 2, MidpointRounding.AwayFromZero)
se (TotaleTondo - (TotaleImponibile+TotaleImposta)) è diverso da zero, aggiungo una voce in fattura “Arrotondamento su somma importi imponibili” con importo pari a Round((TotaleTondo - (TotaleImponibile+TotaleImposta)) / (1+Aliquota/100), 2, MidpointRounding.AwayFromZero) -
Calcolo
TotaleImponibile = somma degli imponibili di ogni riga (compresa la eventuale correzione precedente)
TotaleImposta = Round(TotaleImponibile*Aliquota/100, 2, MidpointRounding.AwayFromZero)
se (TotaleTondo - (TotaleImponibile+TotaleImposta)) è diverso da zero, aggiungo una voce in fattura “Arrotondamento su scorporo IVA” con importo pari a Round((TotaleTondo - (TotaleImponibile+TotaleImposta)) / (1+Aliquota/100), 2, MidpointRounding.AwayFromZero)
Infine calcolo
TotaleImponibile = somma degli imponibili di ogni riga (comprese le eventuali una o due correzioni precedenti)
TotaleImposta = TotaleTondo - TotaleImponibile
Così facendo posso sempre stare sicuro che:
TotaleImponibile combacia al centesimo con la somma delle voci
TotaleImponibile + TotaleImposta combacia al centesimo con TotaleTondo
Abs(TotaleImposta - TotaleImponibile * Aliquota/100) sarà sempre inferiore al centesimo e quindi sarà sempre entro la tolleranza consentita
Nel caso in questione, ovvero con TotaleTondo = 200, ottengo quindi il seguente risultato:
<DatiBeniServizi>
<DettaglioLinee>
<NumeroLinea>1</NumeroLinea>
<Descrizione>ARTICOLO CON PREZZO IVATO 200 EURO</Descrizione>
<Quantita>1.00</Quantita>
<PrezzoUnitario>163.93</PrezzoUnitario>
<PrezzoTotale>163.93</PrezzoTotale>
<AliquotaIVA>22.00</AliquotaIVA>
</DettaglioLinee>
<DettaglioLinee>
<NumeroLinea>2</NumeroLinea>
<TipoCessionePrestazione>SC</TipoCessionePrestazione>
<Descrizione>Arrotondamento su somma importi imponibili</Descrizione>
<Quantita>1.00</Quantita>
<PrezzoUnitario>0.01</PrezzoUnitario>
<PrezzoTotale>0.01</PrezzoTotale>
<AliquotaIVA>22.00</AliquotaIVA>
</DettaglioLinee>
<DettaglioLinee>
<NumeroLinea>3</NumeroLinea>
<TipoCessionePrestazione>SC</TipoCessionePrestazione>
<Descrizione>Arrotondamento su scorporo IVA</Descrizione>
<Quantita>1.00</Quantita>
<PrezzoUnitario>-0.01</PrezzoUnitario>
<PrezzoTotale>-0.01</PrezzoTotale>
<AliquotaIVA>22.00</AliquotaIVA>
</DettaglioLinee>
<DatiRiepilogo>
<AliquotaIVA>22.00</AliquotaIVA>
<ImponibileImporto>163.93</ImponibileImporto>
<Imposta>36.07</Imposta>
<EsigibilitaIVA>I</EsigibilitaIVA>
</DatiRiepilogo>
</DatiBeniServizi>