11 KiB
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.kontonummeraufsteigend - 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 überMONTH(bookings.buchungs_datum) - Gruppen:
einnahmen,ausgaben,ergebnis(ergebnis= Einnahmen und abzugsfähige Ausgaben zusammen, Ausgaben in der Anzeige mit negativem Vorzeichen) - Der Buchungstyp
AfAzä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=truelesbar 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
- Im Bericht (
/tax/ustva/{year}/{month}) jede Kennzahl per Drill-down auf zugrundeliegende Buchungen prüfen. - 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.
- Bei Auslandssachverhalten oder § 13b-Fällen die Werte mit dem amtlichen UStVA-Vordruck abgleichen.