Steuerkram/docs/berechnungslogik.md
fds2610-bot 55c02b54de Feature: USt-Buchungszeilen für Ausgangsrechnungen einführen
- Migration 046: ustva_kz='83'/'84' für Konten 1776/1771, Bestandsmigration für Einnahme-Buchungen
- Booking::create(): USt-Kindzeile auf 1771/1776 für Einnahmen mit 7/19 % (analog VSt)
- UstvaCalculator: Kz 83/84 kontobasiert via 1771/1776, KZ_ACCOUNT_MAP aktualisiert
- Invoice::cancel(): nur Hauptbuchungen direkt stornieren (parent_booking_id IS NULL)
- Tests 10, 27 angepasst; Test 29 neu
2026-05-10 15:11:00 +02:00

14 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

Die UStVA muss zwei Anforderungen gleichzeitig erfüllen:

  1. ELSTER-Konformität – die exportierte XML-Datei muss dem aktuellen Schema „Anmeldungssteuern Upload" (Namespace http://finkonsens.de/elster/elsteranmeldung/ustva/v{Jahr}) entsprechen, damit sie über Mein ELSTER hochgeladen werden kann.
  2. Materielles deutsches Steuerrecht – jede Buchung muss in die nach § 18 UStG i.V.m. § 3 UStDV inhaltlich richtige Kennzahl einfließen.

Diese Berechnung wird ausschließlich für monatliche Voranmeldungen unterstützt. Quartalsweise oder jährliche UStVA, Dauerfristverlängerung (§ 18 Abs. 6 UStG) und Sondervorauszahlung (§ 47 UStDV) sind nicht implementiert (siehe Abschnitt „Bekannte Einschränkungen").

Datenquellen

UstvaCalculator::calculate(year, month) kombiniert drei Quellen, deren Ergebnisse zusammengeführt werden:

Quelle 1 – kontobasiert (accounts.ustva_kz des Kategorie-Kontos) SKR03-Erlös- und Steuerkonten tragen ihre Kennzahl direkt am Konto. Buchungen mit gefülltem bookings.steuerart werden aus dieser Quelle ausgeschlossen, um Doppelzählung mit Quelle 3 zu vermeiden. Konten mit ustva_kz='61' oder '62' werden nicht mehr kontobasiert ausgewertet (siehe Quelle 2).

Quelle 2 – Steuerkonten-Buchungszeilen (Kz 61/62 via 1571/1576, Kz 83/84 via 1771/1776) Jede Ausgabe-Buchung mit 7/19 % und steuerart=normal erzeugt automatisch eine VSt-Kindzeile auf Konto 1571 (7 %) bzw. 1576 (19 %); jede Einnahme-Buchung entsprechend eine USt-Kindzeile auf 1771 (7 %) bzw. 1776 (19 %). Kz 61/62 und Kz 83/84 werden aus betrag_netto dieser Kindzeilen aggregiert. Maßgeblich ist der tatsächliche USt-Satz der Buchung, nicht das Erlöskonto. EU-Buchungen (steuerart ∈ {ig_lieferung, export, ig_erwerb_19, ig_erwerb_7}) erhalten keine Steuerkonten-Kindzeilen.

Quelle 3 – steuerartbasiert (bookings.steuerart) Auslandssachverhalte unabhängig vom gebuchten Konto:

  • ig_lieferung → Kz 41 (steuerfreie ig. Lieferung, § 4 Nr. 1b UStG)
  • export → Kz 44 (steuerfreie Ausfuhr in Drittland, § 4 Nr. 1a UStG)
  • ig_erwerb_19 → Kz 89 (Bemessungsgrundlage) + Kz 91 (USt = 19 %)
  • ig_erwerb_7 → Kz 93 (Bemessungsgrundlage) + Kz 94 (USt = 7 %)

Implementierte Kennzahlen

Kz Bezeichnung (ELSTER) Materiell-rechtliche Grundlage Quelle Berechnung
81 Steuerpflichtige Umsätze 19 % – Bemessungsgrundlage § 12 Abs. 1 UStG Konto SUM(betrag_netto) WHERE ustva_kz='81'
83 USt auf steuerpflichtige Umsätze 19 % § 12 Abs. 1 UStG Steuerkonto SUM(betrag_netto) WHERE ustva_kz='83' (Konto 1776)
86 Steuerpflichtige Umsätze 7 % – Bemessungsgrundlage § 12 Abs. 2 UStG Konto SUM(betrag_netto) WHERE ustva_kz='86'
84 USt auf steuerpflichtige Umsätze 7 % § 12 Abs. 2 UStG Steuerkonto SUM(betrag_netto) WHERE ustva_kz='84' (Konto 1771)
35 Umsätze zu anderen Steuersätzen Restkategorie für nicht-Standard-Sätze Konto SUM(betrag_netto) WHERE ustva_kz='35'
41 Steuerfreie ig. Lieferungen mit USt-IdNr. § 4 Nr. 1b i.V.m. § 6a UStG Konto + Steuerart ustva_kz='41' ODER steuerart='ig_lieferung'
44 Steuerfreie Ausfuhrlieferungen Drittland § 4 Nr. 1a i.V.m. § 6 UStG Konto + Steuerart ustva_kz='44' ODER steuerart='export'
89 Ig. Erwerb 19 % – Bemessungsgrundlage § 1a UStG, § 12 Abs. 1 UStG Steuerart SUM(betrag_netto) WHERE steuerart='ig_erwerb_19'
91 USt auf ig. Erwerb 19 % § 1a UStG berechnet Kz 89 × 0,19
93 Ig. Erwerb 7 % – Bemessungsgrundlage § 1a UStG, § 12 Abs. 2 UStG Steuerart SUM(betrag_netto) WHERE steuerart='ig_erwerb_7'
94 USt auf ig. Erwerb 7 % § 1a UStG berechnet Kz 93 × 0,07
61 Vorsteuerbeträge aus Eingangsrechnungen 19 % § 15 Abs. 1 Nr. 1 UStG Steuerkonto SUM(betrag_netto) WHERE ustva_kz='61' (Konto 1576)
62 Vorsteuerbeträge aus Eingangsrechnungen 7 % § 15 Abs. 1 Nr. 1 UStG Steuerkonto SUM(betrag_netto) WHERE ustva_kz='62' (Konto 1571)
67 Vorsteuer aus innergemeinschaftlichem Erwerb § 15 Abs. 1 Nr. 3 UStG abgeleitet Kz 91 + Kz 94
66 Vorsteuerbeträge gesamt § 15 UStG abgeleitet Kz 61 + Kz 62 + Kz 67
69 Verbleibende USt-Vorauszahlung / Erstattung § 18 Abs. 1 UStG abgeleitet (Kz 83 + Kz 84 + Kz 91 + Kz 94) − Kz 66

Hinweis zur Bezeichnung Kz 61/62: Die offizielle ELSTER-Bezeichnung „Kz 61 = Vorsteuer aus innergemeinschaftlichem Erwerb" (§ 15 Abs. 1 Nr. 3 UStG) und „Kz 62 = Einfuhrumsatzsteuer" (§ 15 Abs. 1 Nr. 2 UStG) wird hier abweichend für Inlands-VSt 19 % bzw. 7 % verwendet. Diese Konvention stammt aus den frühen Migrationen und wurde nie auf die offiziellen Kz 66 (Inlandsvorsteuer 19 %) und Kz 66 (Inlandsvorsteuer 7 %) zurückgeführt. Für die ELSTER-Übertragung ist das unkritisch, weil das XML alle Vorsteuerwerte rechnerisch in Kz 66 zusammenfasst – materiell-rechtlich sollte dieser Punkt aber bei der nächsten Refaktorierung geprüft werden (siehe „Offene Punkte"). Migration 017 dokumentiert die Diskrepanz und fixt sie für VSt-Konten teilweise; Migration 022 hat sie für die buchungsbasierte Auswertung bewusst wieder eingeführt.

Kontozuordnung im SKR03-Kontenrahmen

Die folgenden Konten tragen heute eine UStVA-Kennzahl (Stand Migration 026):

ustva_kz Konten Bedeutung
81 8400, 8570, 8720, 8801, 8820, 8922 Inlandsumsätze 19 %, inkl. Eigenverbrauch + Anlageverkäufe
86 8300, 8710, 8921 Inlandsumsätze 7 %, inkl. Eigenverbrauch
35 (derzeit kein Konto) Restkategorie
41 8125 (falls vorhanden) Steuerfreie ig. Lieferung
44 8120 (falls vorhanden) Ausfuhren
61 1576 (Abziehbare Vorsteuer 19 %) VSt-Buchungszeilen; Betriebsausgabe-Konten tragen diese Kennzahl nicht mehr
62 1571 (Abziehbare Vorsteuer 7 %) VSt-Buchungszeilen; Betriebsausgabe-Konten tragen diese Kennzahl nicht mehr
83 1776 (Umsatzsteuer 19 %) USt-Buchungszeilen für Ausgangsrechnungen
84 1771 (Umsatzsteuer 7 %) USt-Buchungszeilen für Ausgangsrechnungen

Eingangsumsätze ohne Vorsteuer (Konten 8100, 8105, 8110, 8120) sollten gemäß Migration 017 die Kennzahlen 48 (steuerfrei ohne VoSt-Abzug, § 4 Nr. 8–29) bzw. 43 (Ausfuhr Drittland) tragen. Diese Kennzahlen werden vom UstvaCalculator aktuell nicht berechnet – sie würden also weder im Bericht noch im XML auftauchen, selbst wenn ein Konto so gepflegt ist. Siehe „Offene Punkte".


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 83 (USt 19 %) – – nicht übertragen, ELSTER leitet serverseitig aus Kz 81 × 19 % ab
Kz 86 (Bemessungsgrundlage 7 %) <Kz86> ganzzahlig Wert 0 → Tag wird weggelassen
Kz 84 (USt 7 %) – – nicht übertragen, ELSTER leitet serverseitig aus Kz 86 × 7 % ab
Kz 35 <Kz35> ganzzahlig –
Kz 41 <Kz41> ganzzahlig –
Kz 44 <Kz44> ganzzahlig –
Kz 89 <Kz89> ganzzahlig –
Kz 93 <Kz93> ganzzahlig –
Kz 61 <Kz61> 2 Dezimalstellen –
Kz 62 <Kz62> 2 Dezimalstellen –
Kz 67 <Kz67> 2 Dezimalstellen –
Kz 66 <Kz66> 2 Dezimalstellen –
Kz 69 (Zahllast/Erstattung) <Kz39> 2 Dezimalstellen nur bei Zahllast > 0 ausgegeben; Erstattung bleibt komplett ohne Tag, da das Schema keine negativen Vorzeichen zulässt

Rundungs- und Formatregeln

  • Bemessungsgrundlagen werden mit (int)round($v) gerundet und ohne Dezimalpunkt ausgegeben (Kz81, Kz86, Kz35, Kz41, Kz44, Kz89, Kz93).
  • Steuerbeträge werden mit number_format($v, 2, '.', '') ausgegeben (Kz61, Kz62, Kz67, Kz66, Kz39).
  • Felder mit Wert 0 werden weggelassen – ELSTER toleriert fehlende Tags, aber keine <KzXX>0</KzXX> ohne Wert.
  • Steuernummer: alle Nicht-Ziffern werden via preg_replace('/[^0-9]/', '', …) entfernt. ELSTER erwartet die 13-stellige bundeseinheitliche Form (Bundesland-Finanzamt-Stammnummer-Prüfziffer).

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
Kz 43 (Ausfuhren Drittland § 4 Nr. 1a) Kennzahl wird nicht berechnet, obwohl Migration 017 sie für Konto 8120 vorsieht Beträge tauchen nicht im Bericht auf, falls ein Konto auf ustva_kz='43' läuft. Die parallele Steuerart export → Kz 44 ist abgedeckt.
Kz 48 (Steuerfreie Umsätze § 4 Nr. 8–29 ohne VoSt-Abzug) Kennzahl wird nicht berechnet Konten 8100, 8105, 8110 mit ustva_kz='48' (Migration 017) werden ignoriert
Reverse-Charge als Empfänger (§ 13b UStG) – Kz 84/85, Kz 67 Steuerart fehlt im Buchungsmodell Bauleistungen, EU-Dienstleistungen, ausländische Subunternehmer können nicht korrekt erfasst werden
Kleinunternehmerregelung (§ 19 UStG) – Kz 35 + Hinweis Kein Schalter im System Wer Kleinunternehmer ist, sollte gar keine UStVA abgeben
Dauerfristverlängerung / Sondervorauszahlung (Kz 38/39) Keine Eingabe für Kz 38 (Anrechnung Sondervorauszahlung Dezember) Kz 39 enthält den vollen Zahlbetrag ohne Anrechnung
Quartals- und Jahres-UStVA Nur Monat möglich (MONTH(buchungs_datum)) Quartals- oder Jahresanmelder müssen die 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, was ELSTER ablehnt Mindestens ein Wert oder explizites <Kz81>0</Kz81> sollte gesetzt sein
Kz 61/62-Bezeichnung Konvention weicht von offizieller ELSTER-Definition ab (siehe Hinweis oben) Schadet nicht der Übertragung, weil die Summe in Kz 66 stimmt; sollte aber dokumentiert oder bereinigt werden

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.