Positionssätze und Summen auf Rechnungen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Positionssätze und Summen auf Rechnungen

    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:
    PHP-Code:
    $temp round($betrag $mwst2)
    $temp round($temp 100);
    usw
    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):
    Code:
    [b]Menge  Brutto  Netto  Mwst      Typ[/b]
    5      24,60   20,50   4,10   Position
    5       1,34    1,13   0,21   Werbeabgabe
    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?
    Zuletzt geändert von deltacon; 02.06.2006, 17:11.

  • #2
    Ach ja, ich vergaß zu erwähnen: in die Datenbank MUSS auf 2 Kommastellen gespeichert werden. Wenns 4 wären, wäre alles kein Problem, aber so...

    Kommentar


    • #3
      Wechsle den Steuerberater....

      Die Positionssätze enthalten den Nettobetrag und den MWST-Satz oder MWST-Code (oder beides) und den Werbe-Satz und den Werbe-Code.

      Dann wird pro MWST-Satz und Werbe-Satz addiert bzw. MWST-Code und Werbe-Code, und davon MWST und Werbe betrag gerechnet, für ein bestimmtes Datum (siehe nächsten Satz).

      zu beachten ist noch, dass der MWST Satz zeitabhängig ist. dh MWST Code 1 von heute = 8 Prozent, aber MWST Code 1 von morgen kann 8.1 % sein und dgl.

      BM ich bin nicht in der EU aber denke dass eine MWST pro Position weder auf Rechnungen noch für die Bezahlung legal ist.

      Kommentar


      • #4
        Die andere Variante ist bei den Totalbeträgen (wie bei der Bezahlung ans Steueramt) rückwärts vom Total zu rechnen:

        totalbetrag inkl .MWST wie auch immer erhalten z.B. aus den Positionen: EURO 100.
        Satz 8 %. Dann sind 100 Euro = 108 %, Nettobetrag 92.59, MWST 8% 7.41 .

        Kommentar


        • #5
          Ja, das denke ich ebenfalls und wenn ich das Datenbankkonzept selbst gemacht hätte, hätte ich die Mwst (Betrag) nie pro Position gespeichert, sondern den Satz.

          Ich habe aber das Datenbankkonzept der Software übernommen, in die ich exportiere, bzw. genauer gesagt das der Spezifikationen des Exportfiles (um den Export so einfach als möglich zu gestalten).

          Und da wird nun mal die Mwst (für mich völlig unverständlich) pro Pos gespeichert.

          Mein Steuerberater hatte in dieser Hinsicht absolut keinen Einfluss, er sagte mir lediglich, dass buchhalterisch nach jeder Berechnung auf 2 Kommastellen gerundet wird (das war meine Frage an ihn).

          Und ich hatte keinen Einfluss darauf, wie das Datenbankkonzept auszusehen hat, denn es so zu machen, wie es gehört, hätte mir wiederum den Export unnötig umständlich gemacht.

          Zu erwähnen ist noch, dass es sich bei der "großen" Buchhaltungssoftware um diejenige eines Großkonzerns handelt, was das Ganze für mich noch unverständlicher macht.
          Zuletzt geändert von deltacon; 02.06.2006, 17:34.

          Kommentar


          • #6
            Original geschrieben von deltacon
            Mein Steuerberater hatte in dieser Hinsicht absolut keinen Einfluss, er sagte mir lediglich, dass buchhalterisch nach jeder Berechnung auf 2 Kommastellen gerundet wird (das war meine Frage an ihn).

            Zahlen die in die Buchhaltung gehen, ja, die Buchhaltung wird sicher in Währung geführt. dh ein Rechnungstotal ist auf 2 Stellen und der gesamte Umsatz auch.Aber es sollten nicht Rechnungspositionen in der Buchhaltung auftauchen, das sind die Kunden nicht schuldig usw..

            Ich würde als Ausgleichssatz den Wert von der Rechnung minus Summe der Posten nehmen, wie Du auch. Wenn jede Postenzeile in sich stimmt, und die Rechnungszeile auch in sich stimmt, sollte die Ausgleichszeile auch stimmen. Es sind im Beispiel übrigens 10 Stück und nicht 5. Die Ausgleichszeile im Beispiel ergibt sich zu (-1.10, -1.05, -0.05).

            Kommentar


            • #7
              Die grosse Differenz kommt von der unrichtigen Berechnung der Werbeabgabe in der Zeilen.
              Code:
              Menge  Brutto  Netto  Mwst      Typ
              1      24,60   20,50   4,10   Position
              1       1,23    1,02   0,21   Werbeabgabe
              Damit wird die Ausgleichszeile (0.00, 0.05, -0.05)

              Kommentar


              • #8
                Hoppla, wie peinlich, dass mir jetzt so ein kleiner Fehler unterlaufen ist, hatte es zum Schluss schon etwas eilig, deshalb war die Fehlerkorrektur wohl nicht mehr ganz genau.

                Konkretes Beispiel, dass die Summen innerhalb der Ausgleichszeile nicht immer gleich sind:

                Position 1:
                11,12 netto
                7,5 Menge
                13,77% Rabatt

                Position 2:
                11,35 netto
                7,5 Menge
                15,22% Rabatt

                Ich kopier jetzt mal die Ergebnisse, die ich in einer Textdatei gespeichert habe und zwar aus den Einzelpositionen (wie in der DB gespeichert):
                Code:
                Brutto 		Netto 		Mwst
                
                100,05		83,4		16,65
                -13,8		-11,48		-2,33	ra
                
                ----------
                
                102,15		85,13		17,03
                -15,6		-12,98		-2,63	ra
                
                
                wa gesamt: 
                8,65		7,21		1,44
                
                setzt sich zusammen aus:
                (  4,32		  3,6		 0,72	wa) -> vom gesamten Positionssatz mit der Menge
                (  4,33		  3,61		 0,72	wa) -> vom gesamten Positionssatz mit der Menge
                
                jeweils immer die Spalten summiert:
                Netto gesamt vor Wa: 	144,07
                Wa:			  7,21
                Netto Gesamt: 		151,28
                Mwst Gesamt: 		 30,16
                Brutto Gesamt: 		181,45
                Für die Werbeabgabe wird nur 1 Positionssatz pro Rechnung gespeichert (d.h. nur die Summe aller Werbeabgaben mit Menge 1 berücksichtigen). Ich hab die Wa für die einzelnen Positionen nur zum Prüfen der Summe der Wa angeführt.

                Jetzt die Daten, die auf der Rechnung berechnet werden:
                Code:
                Netto Zwischensumme 			144,07 (passt!)
                Werbeabgabe aus 144,07 (5%): 	  7,20 (0,01 Differenz)
                Netto gesamt: 			151,27 (noch immer 0,01 Differenz)
                Mwst: 				 30,25 (0,09 Differenz)
                Brutto Gesamt: 			181,52 (0,07 Differenz)
                In der Ausgleichszeile habe ich:
                Brutto 0,07
                Netto -0,01
                Mwst: 0,09

                Kommentar


                • #9
                  In deiner ganzen Berechnungen stimmt vieles nicht. Wenn es in jeder Zeile aufgeht, dann stimmt auch ganz automatisch die Ausgleichszeile.

                  einmal müssen alle Postenzeilen in sich stimmen und das macht nur die wa-Zeile.
                  Die richtige Rechenweise ist für jede zeile:
                  nettobetrag=rund(menge*nettopreis).
                  mwst=rund(nettobetrag*mwstsatz).
                  bruttobetrag=nettobetrag+mwst.

                  nettora=rund(nettobetrag*rabattsatz).
                  mwstra=rund(nettora*mwstsatz).
                  bruttora=nettora+mwstra.

                  ähnlich für die wa.

                  zweitens stimmen die Rabattberechnungen nicht das hat aber auf das Ausgleichsproblem keinen zusätzlichen Einfluss. Die nettorabatte passen beim zweiten Posten nicht zum rabattsatz. Die mwst des rabatts darin stimmen in beiden ra nicht.

                  Kommentar


                  • #10
                    PHP-Code:
                    $temp $betrag $mwst;
                    $temp round($temp 100,2);


                    und sowieso besserfalls mwstsatz eine float in Prozent ist.
                    $mwstbetrag=round($betrag * ($mwstsatz/100.0),2); 
                    Nur ergebnisse müssen gerundet werden und nicht jedes beliebige zwischenresultat.

                    Kommentar


                    • #11
                      So wie ichs geschrieben habe, sind die Positionen ausmultipliziert (mit der Menge). In der Datenbank stimmen die Positionssätze in sich schon. Also nochmal:

                      so stehts in der Datenbank:
                      Code:
                      Menge	Brutto 		Netto 		Mwst
                      
                      7,5	13,34		11,12		 2,22
                      7,5	-1,84		 -1,53		-0,31	ra
                      
                      ----------
                      
                      7,5	 13,62		 11,35		 2,27
                      7,5	 -2,08		 -1,73		-0,35	ra
                      
                      wa gesamt: 
                      1	  8,65		7,21		 1,44
                      So, wenn du nun die einzelnen Positionssätze mit ihrer Menge multiplizierst, kommst du zu den Ergebnissen aus meiner Tabelle oben (die nicht die Zahlen repräsentiert, die in der Db stehen!).

                      Die Alternative wäre, alle Positionssätze mit Menge 1 zu speichern, allerdings gibts in den Rechnungen einen Einzelpreis, den könnte ich dann nicht mehr berechnen.

                      Nur ergebnisse müssen gerundet werden und nicht jedes beliebige zwischenresultat.
                      Gut, aber ein Ergebnis ist doch das Resultat einer Rechenoperation, oder? Insofern bekomme ich aus einer Multiplikation ein Ergebnis, ergo muss ich runden.
                      Oder ist das buchhalterisch wieder anders? Wo ist dann die Grenze? Was gilt als Ergebnis?

                      Kommentar


                      • #12
                        erstens würde ich nur dinge runden, die rausgehen in die Bh oder die Exportschntitstelle

                        Die Rechenweise mit dem Multiplizieren von Einzelbeträgen ist nicht richtig, das gibt einfach keinen Sinn.
                        Beispiel: -13,8 -11,48 -2,33 ra
                        denn es ist 20 % von 11,48 nur 2,30 und nicht 2,33. und es ist -11,48 und -2,33 zusammen -13,81 und nicht -13,80.

                        Kannst Du die Bruttobeträge durch Addition bestimmen? Wenn das nicht möglich ist, werden die Einzelzeilen niemals aufgehen.

                        Wenn aber die Einzelzeilen nicht aufgehen, und dafür der Ausgleichsposten auch nicht aufgeht, stimmt es zusammen wieder.

                        Kommentar


                        • #13
                          Wenn aber die Einzelzeilen nicht aufgehen, und dafür der Ausgleichsposten auch nicht aufgeht, stimmt es zusammen wieder.
                          ..das wollt ich hören

                          Bin doch noch nicht ganz blöd...

                          Mal sehen, ich hab jetzt mal ein Beispiel Exportfile gemacht, dass ich denen zum Importieren schicke. Schau ma mal, was dabei rauskommt :-)

                          lG und schönes We

                          Kommentar


                          • #14
                            Übrigens: Bruttobeträge stimmen ja (in der Datenbank), aber nur solange man sie nicht mit der Menge multipliziert.
                            D.h. ich multipliziere jede Spalte mit der Menge und machs nicht so, dass ich nur den Nettobetrag multipliziere und Mwst./Brutto davon berechne.

                            lG
                            Bernie

                            Kommentar


                            • #15
                              Original geschrieben von deltacon
                              Übrigens: Bruttobeträge stimmen ja (in der Datenbank), aber nur solange man sie nicht mit der Menge multipliziert.
                              D.h. ich multipliziere jede Spalte mit der Menge und machs nicht so, dass ich nur den Nettobetrag multipliziere und Mwst./Brutto davon berechne.

                              lG
                              Bernie
                              Dabei werden die Rundungsabweichungen mitmultipliziert . In erster Linie ist dann die MWST mit einer Abweichung berechnet, die bei sehr grossen Mengen schmerzen könnte (10 Millionen Stück, Abweichung 0.002Euro gibt?) . Das führt aber nicht zu Zeilendifferenzen.

                              Erst wenn die Mengen nicht ganzzahlig sind, gibt es eine Abweichung von einer Einheit in den Posten in fünf von zehn Fällen, sogar wenn die Preiszeile stimmt. Genau was Du beobachtest.

                              zB wenn es auf drei Stellen exakt gibt: 2.686, 2.054, 0.632. Das erste wird aufgerundet (+0.004 addiert), das zweite und dritte werden abgerundet (-0.004, -0.002 addiert).
                              Das vereinfachteste Beispiel ist folgendes:
                              2 = 1 + 1, Mengen = 0.001 bis 0.009.
                              Von 0.003 bis 0.007 stimmt es nicht.
                              Jetzt betrachtet man 0.02=0.01+0.01 und dafür die Mengen 0.1 bis 0.9 .
                              Gibt genau den gleichen Effekt. Es kommt nur auf die letzten Stellen an,
                              die grossen Anteile gehen immer auf.

                              Kommentar

                              Lädt...
                              X