[RISOLTO] Arrotondamenti imposta su e-fattura

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:

  1. 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

  2. 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

  1. 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)

  2. 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>