Steuerkram/docs/berechnungslogik.md

9 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

kontenart euer_zeile EÜR-Abschnitt
Betriebseinnahme beliebig Betriebseinnahmen
Betriebsausgabe ≠ '51' Betriebsausgaben (fließen in total_ausgaben und gewinn ein)
Betriebsausgabe '51' Nicht abzugsfähige Betriebsausgaben (KZ 165) – eigener Abschnitt, nicht in total_ausgaben oder gewinn
Privat beliebig nicht in EÜR (Privatentnahmen/-einlagen beeinflussen den Gewinn nicht)
Zahlungskonto, Verbindlichkeit beliebig nicht in EÜR

EÜR-Zeile 51 / KZ 165 entspricht den „Nicht abziehbaren Betriebsausgaben nach § 4 Abs. 5 EStG" (z.B. nicht abzugsfähige Bewirtungskosten auf Konten 4654, 4656; nicht abzugsfähige Geschenke auf 4635, 4636; nicht abzugsfähiger Arbeitszimmeranteil auf 4289). 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

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.