Hi Leute!
Aufgrund einer Diskussion in diesem Thread: http://www.php-resource.de/forum/sho...threadid=71188
starte ich nun hier eine kurze Anfrage bzgl. Lösungsvorschläge.
Ich habe ein Projekt, bei dem ich eine Rechnungslegung online realisiere mit Exportschnittstelle in eine Buchhaltungssoftware (.csv).
Ich runde nach jeder Rechenoperation auf 2 Stellen (lt. Rücksprache mit meinem Steuerberater). D.h., wenn ich die Mwst ausrechne, rechne ich so:
Aufgabenstellung:
2 Positionssätze mit jeweils 20,50 Nettobetrag, Menge 5. Dazu kommen 5% Werbeabgabe und 20% Mwst.
Gespeichert wird in die Datenbank jeder Positionssatz(!): Menge, Brutto (inkl. Mwst), Netto (exkl.) und Mwst.
Die Werbeabgabe erhält einen eigenen Positionssatz.
Zu jeder Rechnung gibts auch einen Kopfsatz, in dem der Bruttogesamtbetrag gespeichert wird.
Problemstellung:
Rundungsdifferenzen und wie werden diese gespeichert / ausgewertet.
Nehmen wir einen Positionssatz her:
Nettosumme einzeln: 20,50, davon 5% (Wa) -> 1,025 -> 1,13
Mwst. vom Einzelpositionssatz: 20,50 -> 4,10
Mwst. der Werbeabgabe: 1,025 -> 0,205 -> 0,21
Pro Position wird (im Moment) in die Db gespeichert (bitte korrigieren, falsch falscher Ansatz):
Die Berechnung auf der Rechnung selbst verläuft komplett anders:
Hier wird erst aus der Nettosumme (der beiden Positionssätze, also 205,00) die Werbeabgabe berechnet:
Wa gesamt (5% aus 205,00): 10,25 (zählt man die Wa aus der Datenbank bis hierher zusammen, ergibt sich aus 1,13 * 5 * 2 -> 11,30 - also Differenz schon hier 1,05)
Wa + Netto ergibt Grundlage f. Mwst., kommt 215,25 heraus
Mwst. gesamt (20% aus 215,25): 43,05
Gesamtbetrag der Rechnung: 258,30
Bruttobetrag, wenn man die Einzelpositionen aus der Datenbank zusammenzählt: 259,40
Es ergibt sich also im Bruttobetrag eine Differenz von 1,10, ausschließlich durch die Rundungen!
Wir habens vorerst so gelöst, dass es einen Ausgleichspositionssatz gibt, in dem für jede Spalte (Brutto, Netto, Mwst) getrennt der Centausgleich gespeichert wird.
Der Nachteil davon: beim Positionssatz des Ausgleichs stimmen die Summen von Brutto, Netto und Mwst innerhalb des Positionssatzes nicht (z.B.: Brutto: 0,07, Netto -0,01 und Mwst. 0,09). Somit stimmen immer die Spaltensummen (also von allen Positionen jeweils die Spaltensumme für Brutto, Netto und Mwst).
Andere Lösungen?
Aufgrund einer Diskussion in diesem Thread: http://www.php-resource.de/forum/sho...threadid=71188
starte ich nun hier eine kurze Anfrage bzgl. Lösungsvorschläge.
Ich habe ein Projekt, bei dem ich eine Rechnungslegung online realisiere mit Exportschnittstelle in eine Buchhaltungssoftware (.csv).
Ich runde nach jeder Rechenoperation auf 2 Stellen (lt. Rücksprache mit meinem Steuerberater). D.h., wenn ich die Mwst ausrechne, rechne ich so:
PHP-Code:
$temp = round($betrag * $mwst, 2)
$temp = round($temp / 100);
usw.
2 Positionssätze mit jeweils 20,50 Nettobetrag, Menge 5. Dazu kommen 5% Werbeabgabe und 20% Mwst.
Gespeichert wird in die Datenbank jeder Positionssatz(!): Menge, Brutto (inkl. Mwst), Netto (exkl.) und Mwst.
Die Werbeabgabe erhält einen eigenen Positionssatz.
Zu jeder Rechnung gibts auch einen Kopfsatz, in dem der Bruttogesamtbetrag gespeichert wird.
Problemstellung:
Rundungsdifferenzen und wie werden diese gespeichert / ausgewertet.
Nehmen wir einen Positionssatz her:
Nettosumme einzeln: 20,50, davon 5% (Wa) -> 1,025 -> 1,13
Mwst. vom Einzelpositionssatz: 20,50 -> 4,10
Mwst. der Werbeabgabe: 1,025 -> 0,205 -> 0,21
Pro Position wird (im Moment) in die Db gespeichert (bitte korrigieren, falsch falscher Ansatz):
Code:
[b]Menge Brutto Netto Mwst Typ[/b] 5 24,60 20,50 4,10 Position 5 1,34 1,13 0,21 Werbeabgabe
Hier wird erst aus der Nettosumme (der beiden Positionssätze, also 205,00) die Werbeabgabe berechnet:
Wa gesamt (5% aus 205,00): 10,25 (zählt man die Wa aus der Datenbank bis hierher zusammen, ergibt sich aus 1,13 * 5 * 2 -> 11,30 - also Differenz schon hier 1,05)
Wa + Netto ergibt Grundlage f. Mwst., kommt 215,25 heraus
Mwst. gesamt (20% aus 215,25): 43,05
Gesamtbetrag der Rechnung: 258,30
Bruttobetrag, wenn man die Einzelpositionen aus der Datenbank zusammenzählt: 259,40
Es ergibt sich also im Bruttobetrag eine Differenz von 1,10, ausschließlich durch die Rundungen!
Wir habens vorerst so gelöst, dass es einen Ausgleichspositionssatz gibt, in dem für jede Spalte (Brutto, Netto, Mwst) getrennt der Centausgleich gespeichert wird.
Der Nachteil davon: beim Positionssatz des Ausgleichs stimmen die Summen von Brutto, Netto und Mwst innerhalb des Positionssatzes nicht (z.B.: Brutto: 0,07, Netto -0,01 und Mwst. 0,09). Somit stimmen immer die Spaltensummen (also von allen Positionen jeweils die Spaltensumme für Brutto, Netto und Mwst).
Andere Lösungen?
Kommentar