Steuerkram/docs/berechnungslogik.md

165 lines
9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 | `(Summe ustva_kz='83') − 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.