# 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` | `≠ '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 (auch Vorsteuerkonten wie 1571/1576) | **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:** `` - **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 %) | `` | ganzzahlig | Wert 0 → Tag wird weggelassen | | `Kz 89` (ig. Erwerb Bemessungsgrundlage) | `` | ganzzahlig | Wert 0 → Tag wird weggelassen | | `Kz 66` (Vorsteuerbeträge gesamt) | `` | 2 Dezimalstellen | – | | `Kz 61` (Vorsteuerbeträge ig. Erwerb) | `` | 2 Dezimalstellen | – | | `Kz 83` (Vorauszahlung / Überschuss) | `` | 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 `0` 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.