Steuerkram/docs/berechnungslogik.md

11 KiB
Raw Blame History

Berichte – Zuordnungsregeln

Dieses Dokument beschreibt, wie Buchungen in die beiden steuerlichen Berichte einfließen. Bei Änderungen an EuerCalculator.php, UstvaCalculator.php oder ElsterXmlService.php muss dieses Dokument mit aktualisiert werden.


EÜR (Einnahmen-Überschuss-Rechnung)

Datei: src/Services/EuerCalculator.php

Die EÜR basiert auf dem Feld accounts.kontenart sowie accounts.euer_zeile des Kategorie-Kontos. Das Feld buchungstyp wird nicht ausgewertet. Stornobuchungen (is_reversal = 1) werden nicht explizit ausgefiltert – sie tragen negative Beträge und heben damit die ursprüngliche Buchung automatisch auf (Summe = 0).

Spaltenauswahl nach Kontenart und euer_zeile

Maßgeblich für die Summenbildung ist allein kontenart. euer_zeile wird von EuerCalculator nur an einer Stelle ausgewertet – beim Wert '74', der eine Betriebsausgabe in den Abschnitt „nicht abzugsfähig" umlenkt. Alle übrigen Zeilennummern sind dokumentarisch: sie erscheinen in der Kontenliste und benennen die Position der amtlichen Anlage EÜR, ändern aber nichts an der Berechnung.

kontenart euer_zeile EÜR-Abschnitt
Betriebseinnahme beliebig Betriebseinnahmen
Betriebsausgabe ≠ '74' Betriebsausgaben (fließen in total_ausgaben und gewinn ein)
Betriebsausgabe '74' Nicht abzugsfähige Betriebsausgaben – eigener Abschnitt, nicht in total_ausgaben oder gewinn
Anlagevermögen beliebig nicht in EÜR (die Anschaffung wirkt nur über die AfA)
Privat beliebig nicht in EÜR (Privatentnahmen/-einlagen beeinflussen den Gewinn nicht)
Zahlungskonto, Verbindlichkeit beliebig nicht in EÜR

Die EÜR wird nach der Bruttomethode gerechnet: Die Umsatzsteuer läuft als Einnahme bzw. Ausgabe mit. Dafür sind drei Kontengruppen umklassifiziert:

Konten kontenart euer_zeile Bedeutung
1770, 1771, 1774, 1776 Betriebseinnahme 17 Vereinnahmte Umsatzsteuer (Migration 076)
1571, 1574, 1576 Betriebsausgabe 57 Gezahlte Vorsteuer, ELSTER-Kennzahl 185 (Migration 095)
1780, 1781 Betriebsausgabe 58 An das Finanzamt gezahlte USt (Migration 077)

Bei Reverse-Charge (steuerart = 'ig_erwerb_19') tragen die beiden Kindzeilen auf 1574 (Vorsteuer) und 1774 (Erwerbsteuer) denselben Betrag; als Betriebsausgabe und Betriebseinnahme heben sie sich im Gewinn auf. Deshalb müssen beide Konten klassifiziert sein – bliebe eines davon Zahlungskonto, wäre die Buchung nicht mehr ergebnisneutral.

Die Vorsteuerbeträge stammen aus den VSt-Buchungszeilen, die Booking::create() als Kindzeile (parent_booking_id) zu jeder Ausgabe mit 7 % oder 19 % anlegt.

EÜR-Zeile 74 entspricht den „Nicht abziehbaren Betriebsausgaben nach § 4 Abs. 5 EStG" (z.B. nicht abzugsfähige Bewirtungskosten auf Konten 4654, 4656, 4657; nicht abzugsfähige Geschenke auf 4635, 4636; nicht abzugsfähiger Arbeitszimmeranteil auf 4289; seit Migration 075). Diese Konten werden im EÜR-Bericht unterhalb der Betriebsausgaben in einem separaten Abschnitt angezeigt.

Vorzeichen

betrag_netto wird ohne abs() direkt summiert:

  • Positiver Wert → addiert zur jeweiligen Spalte
  • Negativer Wert → mindert die jeweilige Spalte (z.B. Gutschriften, Erlösschmälerungen)

Sortierung und Ergebnis

  • Gruppierung: je Kategorie-Konto (accounts.id), ein Eintrag pro Konto
  • Sortierung: nach accounts.kontonummer aufsteigend
  • Ergebnis: total_einnahmen − total_ausgaben = gewinn

Dashboard-Kacheln

Die Kacheln „Umsatz", „Ausgaben" und „Gewinn / Verlust" verwenden dieselben Regeln. EuerCalculator::summary($jahr, $monat = null) liefert die Summen, fetchBookingsForBucket() die Einzelbuchungen für die Detailansicht dahinter. Beide leiten ihre Bedingung aus denselben Konstanten ab wie calculate(), damit Dashboard und EÜR nicht auseinanderlaufen (Issue #167 – zuvor summierte das Dashboard nach bookings.buchungstyp und wich dadurch von der EÜR ab).

  • Zeitraum: das Jahr immer über fiscal_years.year, ein Monat zusätzlich über MONTH(bookings.buchungs_datum)
  • Gruppen: einnahmen, ausgaben, ergebnis (ergebnis = Einnahmen und abzugsfähige Ausgaben zusammen, Ausgaben in der Anzeige mit negativem Vorzeichen)
  • Der Buchungstyp AfA zählt wie jede andere Buchung nach der Kontenart des Kategorie-Kontos, also als Betriebsausgabe

UStVA (Umsatzsteuervoranmeldung)

Dateien: src/Services/UstvaCalculator.php, src/Services/ElsterXmlService.php

Diese Berechnung wird ausschließlich für monatliche Voranmeldungen unterstützt.

Implementierte Kennzahlen

Kz Bezeichnung Quelle Berechnung
81 Steuerpflichtige Umsätze zum Steuersatz von 19 % Konto floor(SUM(betrag_netto)) WHERE ustva_kz='81', EU-Steuerarten ausgeschlossen – auf volle Euro abgerundet (floor)
89 Steuerpfl. innergemeinschaftliche Erwerbe 19 % Steuerart floor(SUM(betrag_netto)) WHERE steuerart='ig_erwerb_19' – auf volle Euro abgerundet (floor)
66 Gesamte Vorsteuerbeträge Konto SUM(betrag_netto) WHERE ustva_kz='66' (Konten 1571, 1576)
61 Vorsteuerbeträge i.g. Erwerb abgeleitet ust89 (= round(Kz 89 × 0,19, 2)) – ReverseCharge-Symmetrie: VSt ig. Erwerb = USt ig. Erwerb
83 Vorauszahlung / Überschuss abgeleitet ust81 + ust89 − Kz 66 − Kz 61

Zusätzlich werden zwei reine Anzeigefelder berechnet (erscheinen im Bericht, aber nicht im XML):

Feld Bezeichnung Berechnung
ust81 Abzuführende USt aus Kz 81 (19 %) round(Kz 81 × 0,19, 2) (Kz 81 ist bereits abgerundet)
ust89 Abzuführende USt aus Kz 89 (19 %) round(Kz 89 × 0,19, 2) (Kz 89 ist bereits abgerundet)

Datenquellen

UstvaCalculator::calculate(year, month) kombiniert zwei Quellen:

Quelle 1 – kontobasiert (accounts.ustva_kz des Kategorie-Kontos) EU-Steuerarten (ig_lieferung, export, ig_erwerb_19, ig_erwerb_7) werden aus der kontobasierten Abfrage ausgeschlossen, um Doppelzählung mit Quelle 2 zu vermeiden.

Quelle 2 – steuerartbasiert (bookings.steuerart = 'ig_erwerb_19') Nur ig_erwerb_19 fließt als Bemessungsgrundlage in Kz 89 ein. Kz 61 wird daraus rechnerisch abgeleitet (nicht mehr kontobasiert über 1574).

Automatische Kindzeilen (Buchungslogik)

Beim Anlegen einer Buchung erzeugt Booking::create() automatisch Kindzeilen auf den Steuerkonten:

Buchungstyp Steuersatz Kindzeile Konto Kz
Ausgabe, steuerart=normal 19 % 1576 (ustva_kz='66') Kz 66
Ausgabe, steuerart=normal 7 % 1571 (ustva_kz='66') Kz 66
Einnahme, steuerart=normal 19 % 1776 (ustva_kz='83') Summand Kz 83
Einnahme, steuerart=normal 7 % 1771 (ustva_kz='83') Summand Kz 83
Ausgabe, steuerart=ig_erwerb_19 – 1574 (netto×0,19, ustva_kz='61') Kz 61
Ausgabe, steuerart=ig_erwerb_19 – 1774 (netto×0,19, ustva_kz='83') Summand Kz 83

Kontozuordnung im SKR03-Kontenrahmen (Stand Migration 048)

ustva_kz Konten Bedeutung
81 8400, 8510, 8570, 8720, 8801, 8820, 8922 Inlandsumsätze 19 %
66 1571, 1576 Vorsteuer 7 % und 19 % (Inland + Buchungszeilen)
61 1574 Vorsteuer aus ig. Erwerb 19 %
83 1771, 1774, 1776 USt-Buchungszeilen (7 %, ig. Erwerb, 19 %)

ELSTER-XML-Export

Datei: src/Services/ElsterXmlService.php

Schema und Format

  • Namespace: http://finkonsens.de/elster/elsteranmeldung/ustva/v{Jahr} – ELSTER-Schema „Anmeldungssteuern Upload" (kein ERiC-Client erforderlich, der Upload erfolgt manuell über Mein ELSTER → Datentransfer → Elster-XML)
  • Wurzelelement: <Anmeldungssteuern version="{Jahr}">
  • Encoding: UTF-8
  • Format: mit formatOutput=true lesbar eingerückt

Pflichtelemente

Anmeldungssteuern
├── DatenLieferant (Name, Strasse, PLZ, Ort, Telefon, Email)
├── Erstellungsdatum (Ymd)
└── Steuerfall
    ├── Berater (alle Felder leer, da Selbstabgabe)
    ├── Mandant (Name = Nachname, Vorname, MandantenNr leer, Bearbeiterkennzeichen leer)
    ├── Unternehmer (Bezeichnung = Firma, Name, Vorname, Str, Hausnummer, PLZ, Ort, Land=Deutschland, …)
    └── Umsatzsteuervoranmeldung
        ├── Jahr
        ├── Zeitraum (zweistellig, "01"–"12")
        ├── Steuernummer (nur Ziffern, ohne Trennzeichen oder Bindestriche)
        └── Kz-Felder (siehe unten)

Mapping interner Kennzahlen → XML-Tags

intern (UstvaCalculator) XML-Tag Format Bemerkung
Kz 81 (Bemessungsgrundlage 19 %) <Kz81> ganzzahlig Wert 0 → Tag wird weggelassen
Kz 89 (ig. Erwerb Bemessungsgrundlage) <Kz89> ganzzahlig Wert 0 → Tag wird weggelassen
Kz 66 (Vorsteuerbeträge gesamt) <Kz66> 2 Dezimalstellen –
Kz 61 (Vorsteuerbeträge ig. Erwerb) <Kz61> 2 Dezimalstellen –
Kz 83 (Vorauszahlung / Überschuss) <Kz83> 2 Dezimalstellen nur bei Zahllast > 0; bei Erstattung kein Tag
ust81, ust89 (Anzeigefelder) – – nicht übertragen

Rundungs- und Formatregeln

  • Bemessungsgrundlagen werden mit (int)round($v) ganzzahlig ausgegeben (Kz81, Kz89).
  • Steuerbeträge werden mit number_format($v, 2, '.', '') ausgegeben (Kz66, Kz61, Kz83).
  • Felder mit Wert 0 werden weggelassen – ELSTER toleriert fehlende Tags.
  • Steuernummer: alle Nicht-Ziffern werden via preg_replace('/[^0-9]/', '', …) entfernt.

Persistenz

Beim Speichern (POST /tax/ustva/{year}/{month}/save) wird die berechnete UStVA in ustva_submissions als (year, month, xml_content, field_values) per UPSERT abgelegt. Beim Download (GET /tax/ustva/{year}/{month}/xml) wird das XML stets neu berechnet, nicht aus der Tabelle gelesen.


Offene Punkte / Bekannte Einschränkungen

Diese Punkte sind nicht abgedeckt und können je nach Sachverhalt zu fehlerhaften Voranmeldungen führen. Vor Abgabe an das Finanzamt manuell prüfen:

Bereich Fehlt Folge
Steuerfreie Umsätze (§ 4 Nr. 1a/1b, Nr. 8–29) Kein separater Ausweis (ig. Lieferung, Ausfuhr, steuerfreie Inlandsumsätze) Buchungen mit steuerart='ig_lieferung' / 'export' gehen nicht in Kz 81 ein, werden aber auch nicht separat ausgewiesen
Dauerfristverlängerung / Sondervorauszahlung Keine Eingabe vorgesehen Kz 83 enthält den vollen Zahlbetrag ohne Anrechnung einer Sondervorauszahlung
Quartals- und Jahres-UStVA Nur Monat möglich (MONTH(buchungs_datum)) Quartals- oder Jahresanmelder müssen Werte manuell aggregieren
Berichtigte Anmeldung (§ 153 AO) Kein Kennzeichen in ustva_submissions XML enthält keinen Berichtigungs-Hinweis
Nullmeldung Bei leerer UStVA werden alle Tags weggelassen Mindestens <Kz81>0</Kz81> sollte gesetzt sein, falls ELSTER eine leere Meldung ablehnt

Verifikation vor Abgabe

  1. Im Bericht (/tax/ustva/{year}/{month}) jede Kennzahl per Drill-down auf zugrundeliegende Buchungen prüfen.
  2. XML herunterladen und im ELSTER-Validator (https://portal.e-rechnung-bund.de gibt es nur für E-Rechnung – für die UStVA-XML in Mein ELSTER → Voranmeldungen → Datei hochladen die Vorprüfung nutzen) testen.
  3. Bei Auslandssachverhalten oder § 13b-Fällen die Werte mit dem amtlichen UStVA-Vordruck abgleichen.