Steuerkram/docs/berechnungslogik.md

189 lines
14 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`
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 – buchungsbasiert** (`bookings.ust_satz`, nur Vorsteuer)
Jede Buchung mit `buchungstyp='Ausgabe'` und `betrag_ust ≠ 0` fließt anhand ihres tatsächlichen USt-Satzes in Kz 61 (19 %) bzw. Kz 62 (7 %) ein. Damit ist es egal, ob das Konto auf USt 19 % oder 7 % gebucht wird – maßgeblich ist allein der Satz auf der Eingangsrechnung. EU-Buchungen (`steuerart` ∈ {ig_lieferung, export, ig_erwerb_19, ig_erwerb_7}) werden hier ausgeschlossen, da deren Vorsteuer über Kz 67 läuft.
**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 | Konto | `SUM(betrag_ust)` WHERE `ustva_kz='81'` |
| **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 | Konto | `SUM(betrag_ust)` WHERE `ustva_kz='86'` |
| **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 | Buchung | `SUM(betrag_ust)` WHERE `buchungstyp='Ausgabe'` AND `ROUND(ust_satz)=19` |
| **62** | Vorsteuerbeträge aus Eingangsrechnungen 7 % | § 15 Abs. 1 Nr. 1 UStG | Buchung | `SUM(betrag_ust)` WHERE `buchungstyp='Ausgabe'` AND `ROUND(ust_satz)=7` |
| **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** | alle VSt19-Konten (3106, 3400, 4230, 4240, 4250, 4530–4590, 4600–4636, 4650, 4654, 4666, 4676, 4780, 4800–4809, 4900, 4920, 4925, 4930, 4945, 4950, 4955, 4960–4985, …) | wird vom Calculator **ignoriert**, Wert kommt aus `bookings.ust_satz` |
| **62** | alle VSt7-Konten (3108, 3300, 4651, 4656, 4940, …) | wird vom Calculator **ignoriert**, Wert kommt aus `bookings.ust_satz` |
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.