Hallo,
ich habe eine Tabelle mit einzelnen Postionen von Rechnungen. Dabei ist die Gesamtsumme einer Position als Bruttosumme (also inkl. MwSt, Feldname "BruttoSumme") gespeichert. Das muss so sein, da es Endkundenpreise sind, die auf den Cent genau sein müssen.
Ich möchte nun die Bruttogesamtsumme einer Rechnung ermitteln. Daraus die enthaltene MwSt. und den zugehörigen Nettobetrag. Bisher lief das so:
Formel (vereinfacht) für die Ermittlung des MwSt-Betrags:
MwSt = Brutto - (Brutto / 1,19)
In
SQL für die MwSt:
Code:
cast(
round(BruttoSumme, 2) - round((round(BruttoSumme, 2) / (MwStSatz / 100 + 1)), 2)
as NUMERIC(18,2)) as Mwst
Entsprechend für Netto:
Code:
cast(
round((round(BruttoSumme, 2) / (MwStSatz / 100 + 1)), 2)
as NUMERIC(18,2)) as Netto
Ergibt mit meinen Beispieldaten diese Werte:
Code:
MwStSatz: 19,00
Brutto: 150.000.000,00
MwSt: 23.949.579,83
Netto: 126.050.420,17
Laut meinem Steuerberater und diversen Quellen im Internet (Finanzamt!, Wirtschaftsprüfer) darf das aber so
*nicht* berechnet werden. Viele würden das falsch machen.
Richtig wäre:
Richtige Formel (vereinfacht) für die Ermittlung des MwSt-Betrags:
MwSt = Brutto * (19/119)
Erklärung:
Zitat:
Die Umsatzsteuer errechnet sich durch Anwendung des jeweiligen Steuersatzes auf die sogenannte Bemessungsgrundlage. Der geleistete Bruttobetrag ist deshalb in die Bemessungsgrundlage und die Umsatzsteuer aufzuteilen. Ist bei der Leistung die Umsatzsteuer im Preis enthalten, etwa im Preis einer Eintrittskarte, muss die Umsatzsteuer aus den Einnahmen herausgerechnet werden. Dies geschieht über einen speziellen „Multiplikator für das Herausrechnen der Umsatzsteuer“. Dieser beträgt bei einem Umsatzsteuersatz von 7 Prozent 6,54... (= 7/107) und bei einem Steuersatz von 19 Prozent 15,97... (= 19/119) Prozent des Bruttoentgelts.
In
SQL wäre das mit diesem
Multiplikator:
Code:
cast(
round(round(BruttoSumme, 2) * (MwStSatz / (MwStSatz + 100)), 2)
as NUMERIC(18,2)) as Mwst,
cast(
round(BruttoSumme, 2) - (round(round(BruttoSumme, 2) * (MwStSatz / (MwStSatz + 100)), 2))
as NUMERIC(18,2)) as Netto
Wenn ich das aber so mache, fehlen signifikante Stellen (verglichen mit den Zahlen oben):
Code:
MwStSatz: 19,00
Brutto: 150.000.000,00
MwSt: 23.940.000,00
Netto: 126.060.000,00
Was mache ich falsch?
(Die Zahlen müssen so groß sein, um den Effekt zu sehen.)
Ich habe eine fertige Beispieldatenbank angehängt mit der man direkt testen kann. Alternativ die vollständige
SQL-Datenbankdefinition der Testdatenbank inkl. Testdaten für mein Beispiel oben.
Das ganze teste ich direkt im IBEXPERT. Hat also nichts mit Problem in Delphi oder der
DB-Komponenten zu tun.
Danke!