165 lines
9 KiB
Markdown
165 lines
9 KiB
Markdown
# 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.
|