diff --git a/CLAUDE.md b/CLAUDE.md index 5a406c6..d2ab50c 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -52,7 +52,8 @@ seitenübergreifenden Mustern (z. B. `data-modal-open`/`data-modal-close`, ## Tests **Regel: Jedes neue Feature bekommt einen eigenen Test.** -Tests liegen in `tests/` und folgen dem Namensschema `NN_FunktionsnameTest.php`. +Tests liegen in `tests/` und folgen dem Namensschema `NNN_FunktionsnameTest.php` +(zwei- oder dreistellige Nummer; 01–99 sind vergeben, neue Tests beginnen bei 100). Jede Testklasse erweitert `TestCase` und implementiert `run()`. ```bash @@ -66,9 +67,9 @@ unterhalb von `data/` Dateien an, die Apache/PHP später nicht mehr beschreiben kann – ein echter Beleg-Upload scheitert dann mit HTTP 500. ### Neuen Test erstellen -1. Datei `tests/NN_MeinFeatureTest.php` anlegen (NN = nächste freie Nummer) +1. Datei `tests/NNN_MeinFeatureTest.php` anlegen (NNN = nächste freie Nummer) 2. Klasse `MeinFeatureTest extends TestCase` -3. `protected string $testName = 'Test NN: Beschreibung';` +3. `protected string $testName = 'Test NNN: Beschreibung';` 4. Methode `public function run(): void` mit Assertions implementieren 5. Transaktions-Isolation ist automatisch (setUp/tearDown in TestCase) 6. Dateien und Verzeichnisse **immer** über `TestCase` anlegen – der Rollback diff --git a/Changes.md b/Changes.md index 2395a76..59dc7a0 100644 --- a/Changes.md +++ b/Changes.md @@ -2,6 +2,15 @@ --- +## 2026-09-20 – Gezahlte Vorsteuer als Betriebsausgabe in der EÜR (EÜR-Zeile 57 / Kz 185) + +- **`migrations/095_vorsteuerkonten_betriebsausgabe.sql`** (neu): Die Konten 1571/1574/1576 (abziehbare Vorsteuer) lagen als `Zahlungskonto` im Kontenrahmen und wurden vom `EuerCalculator` daher ignoriert – die auf ihnen gebuchte Vorsteuer tauchte in der EÜR nirgends auf. Da die vereinnahmte USt seit Migration 076 als Betriebseinnahme (Zeile 17) und die ans Finanzamt gezahlte USt seit Migration 077 als Betriebsausgabe (Zeile 58) geführt werden, war die Bruttomethode unvollständig und der ausgewiesene Gewinn um die gezahlte Vorsteuer zu hoch. Alle drei Konten sind jetzt `Betriebsausgabe` mit `euer_zeile = '57'`. Auch 1574 (Vorsteuer aus ig. Erwerb) muss mit: sein Gegenkonto 1774 ist seit Migration 076 Betriebseinnahme, bei Reverse-Charge zählte also nur die Erwerbsteuer als Einnahme – die Buchung war entgegen der Absicht nicht ergebnisneutral. +- **`docs/berechnungslogik.md`:** ergänzt, dass die Summenbildung allein über `kontenart` läuft und `euer_zeile` nur beim Wert `'74'` ausgewertet wird; alle übrigen Zeilennummern sind dokumentarisch. +- **`src/Views/accounts/form.php`:** Die EÜR-Zeilen 57 und 58 tragen jetzt zusätzlich ihre ELSTER-Kennzahl im Label (`57 (Kz 185) – …`, `58 (Kz 186) – …`); „185" war bislang nirgends auffindbar, obwohl die amtliche Anlage EÜR die Position so benennt. Außerdem wurde die gespeicherte EÜR-Zeile nie vorausgewählt: PHP wandelt numerische Array-Keys in `int` um, der strikte Vergleich mit dem `string` aus der Datenbank schlug deshalb immer fehl. +- **`tests/100_VorsteuerEuerZeileTest.php`** (neu): prüft Kontenstamm, Auswahlliste und dass eine Ausgabe über 1.000 € mit 19 % die Betriebsausgaben um 1.190 € (Netto + Vorsteuer) erhöht. +- **`tests/80_DashboardEuerAbgleichTest.php`:** Erwartungen an die neue Zuordnung angepasst – die Vorsteuer zählt jetzt in Kachel und EÜR gleichermaßen als Betriebsausgabe. +- **`tests/run.php`:** Die Testsuite hat die 99 aufgebraucht; der Dateiname-Glob akzeptiert jetzt auch dreistellige Nummern und sortiert numerisch statt alphabetisch. + ## 2026-09-20 – Fehlende Admin-Prüfung bei GET /settings (#206) - **`src/Controllers/SettingsController.php`:** `show()` prüfte keine Rolle, sodass jeder eingeloggte Nicht-Admin IBAN/BIC, Steuernummer, Nextcloud- und SMTP-Daten einsehen konnte. `Auth::requireAdmin()` ergänzt. diff --git a/docs/berechnungslogik.md b/docs/berechnungslogik.md index b4f083f..14fce0f 100644 --- a/docs/berechnungslogik.md +++ b/docs/berechnungslogik.md @@ -13,6 +13,13 @@ Die EÜR basiert auf dem Feld `accounts.kontenart` sowie `accounts.euer_zeile` d ### 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 | @@ -20,7 +27,23 @@ Die EÜR basiert auf dem Feld `accounts.kontenart` sowie `accounts.euer_zeile` d | `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) | +| `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. diff --git a/docs/funktionen.md b/docs/funktionen.md index ea76c4c..323ccc7 100644 --- a/docs/funktionen.md +++ b/docs/funktionen.md @@ -23,7 +23,7 @@ Vollständige Kontenliste: [kontenrahmen.md](kontenrahmen.md) Fünf Kacheln: Umsatz, Ausgaben, Gewinn/Verlust (jeweils Jahr, Vormonat und laufender Monat), offene Rechnungen und ungebuchte Belege. Darunter eine Ablagefläche für Belege per Drag & Drop sowie die zehn zuletzt erfassten Buchungen. -- **Zuordnung wie in der EÜR**: Umsatz, Ausgaben und Ergebnis richten sich nach der Kontenart des Kategorie-Kontos, nicht nach dem Buchungstyp. AfA-Buchungen zählen als Betriebsausgabe; Vorsteuer-, Anlage- und Privatkonten bleiben außen vor, nicht abzugsfähige Ausgaben (EÜR-Zeile 74) mindern das Ergebnis nicht. Die Kacheln stimmen damit mit der EÜR desselben Jahres überein. +- **Zuordnung wie in der EÜR**: Umsatz, Ausgaben und Ergebnis richten sich nach der Kontenart des Kategorie-Kontos, nicht nach dem Buchungstyp. AfA-Buchungen zählen als Betriebsausgabe; die gezahlte Vorsteuer ebenfalls (EÜR-Zeile 57, Kz 185 – die EÜR rechnet nach der Bruttomethode), Anlage- und Privatkonten bleiben außen vor, nicht abzugsfähige Ausgaben (EÜR-Zeile 74) mindern das Ergebnis nicht. Die Kacheln stimmen damit mit der EÜR desselben Jahres überein. - **Detailansicht je Zahl** (`/dashboard/buchungen/{einnahmen|ausgaben|ergebnis}/{jahr}[/{monat}]`): Jede der neun Zahlen der ersten drei Kacheln führt auf die Einzelbuchungen, aus denen sie besteht – mit Belegverweis, Konten und Summenzeile. In der Ergebnisansicht werden Betriebsausgaben mit negativem Vorzeichen ausgewiesen, damit die Spaltensumme dem Kachelwert entspricht. --- @@ -124,7 +124,7 @@ Zuordnungsregeln: [berechnungslogik.md](berechnungslogik.md) ## EÜR (Einnahmen-Überschuss-Rechnung) - Jahresauswertung: Einnahmen, Ausgaben, Gewinn je Kategorie-Konto -- Nicht abzugsfähige Betriebsausgaben (§ 4 Abs. 5 EStG, EÜR-Zeile 51) in separatem Abschnitt +- Nicht abzugsfähige Betriebsausgaben (§ 4 Abs. 5 EStG, EÜR-Zeile 74) in separatem Abschnitt - PDF-Export - Drill-down: Klick auf ein Konto zeigt alle zugehörigen Buchungszeilen diff --git a/docs/kontenrahmen.md b/docs/kontenrahmen.md index ab575ac..d4fbf12 100644 --- a/docs/kontenrahmen.md +++ b/docs/kontenrahmen.md @@ -54,15 +54,22 @@ Der kanonische Seed liegt in `migrations/018_seed_kontenrahmen_skr03_final.sql`. | 1240 | Bank 5 | Zahlungskonto | | 1390 | Verrechnungskonto Ist-Versteuerung | Zahlungskonto | -### Umsatzsteuerkonten +### Umsatzsteuer- und Vorsteuerkonten -| Kto. | Bezeichnung | Kontenart | -|---|---|---| -| 1770 | Umsatzsteuer | Zahlungskonto | -| 1771 | Umsatzsteuer 7 % | Zahlungskonto | -| 1776 | Umsatzsteuer 19 % | Zahlungskonto | -| 1780 | Umsatzsteuer-Vorauszahlungen lfd. Jahr | Zahlungskonto | -| 1781 | Umsatzsteuer-Vorauszahlungen 1/11 | Zahlungskonto | +Die EÜR rechnet nach der Bruttomethode, deshalb sind diese Konten als +Betriebseinnahme bzw. Betriebsausgabe klassifiziert (Migrationen 076, 077, 095). + +| Kto. | Bezeichnung | Kontenart | EÜR-Zeile | +|---|---|---|---| +| 1571 | Abziehbare Vorsteuer 7 % | Betriebsausgabe | 57 (Kz 185) | +| 1574 | Abziehbare Vorsteuer ig. Erwerb 19 % | Betriebsausgabe | 57 (Kz 185) | +| 1576 | Abziehbare Vorsteuer 19 % (Eingangsrechnungen) | Betriebsausgabe | 57 (Kz 185) | +| 1770 | Umsatzsteuer | Betriebseinnahme | 17 | +| 1771 | Umsatzsteuer 7 % | Betriebseinnahme | 17 | +| 1774 | Umsatzsteuer ig. Erwerb 19 % | Betriebseinnahme | 17 | +| 1776 | Umsatzsteuer 19 % | Betriebseinnahme | 17 | +| 1780 | Umsatzsteuer-Vorauszahlungen lfd. Jahr | Betriebsausgabe | 58 (Kz 186) | +| 1781 | Umsatzsteuer-Vorauszahlungen 1/11 | Betriebsausgabe | 58 (Kz 186) | ### Privatkonten diff --git a/migrations/095_vorsteuerkonten_betriebsausgabe.sql b/migrations/095_vorsteuerkonten_betriebsausgabe.sql new file mode 100644 index 0000000..278ebe7 --- /dev/null +++ b/migrations/095_vorsteuerkonten_betriebsausgabe.sql @@ -0,0 +1,24 @@ +-- 095_vorsteuerkonten_betriebsausgabe.sql +-- Vorsteuerkonten als Betriebsausgabe klassifizieren und EÜR-Zeile 57 +-- zuweisen (Anlage EÜR, Kennzahl 185: "Gezahlte und nach § 15 UStG +-- abziehbare Vorsteuerbeträge"). +-- +-- Hintergrund: Die EÜR wird nach der Bruttomethode gerechnet. Migration 076 +-- hat die vereinnahmte Umsatzsteuer als Betriebseinnahme (Zeile 17) erfasst, +-- Migration 077 die an das Finanzamt gezahlte Umsatzsteuer als Betriebsausgabe +-- (Zeile 58). Die gezahlte Vorsteuer fehlte bisher – sie lag auf Konten der +-- Kontenart "Zahlungskonto" und wurde vom EuerCalculator ignoriert, wodurch +-- der ausgewiesene Gewinn um die Vorsteuer zu hoch war. +-- +-- Betroffen sind alle drei Vorsteuerkonten: 1571/1576 (VSt-Buchungszeilen aus +-- Migration 045) und 1574 (Vorsteuer aus innergemeinschaftlichem Erwerb). Auch +-- 1574 muss mit, weil das Gegenkonto 1774 (Erwerbsumsatzsteuer) seit +-- Migration 076 Betriebseinnahme ist: bleibt 1574 ein Zahlungskonto, zählt bei +-- Reverse-Charge-Buchungen nur die Erwerbsteuer als Einnahme und der Gewinn ist +-- um diesen Betrag zu hoch. Als Betriebsausgabe heben sich die beiden +-- Kindzeilen – sie tragen denselben Betrag – wie vorgesehen auf. + +UPDATE accounts +SET kontenart = 'Betriebsausgabe', + euer_zeile = '57' +WHERE kontonummer IN ('1571', '1574', '1576'); diff --git a/src/Views/accounts/form.php b/src/Views/accounts/form.php index ee656e4..eb4814f 100644 --- a/src/Views/accounts/form.php +++ b/src/Views/accounts/form.php @@ -116,8 +116,8 @@ '54' => '54 – Werbekosten (Inserate, Werbespots, Plakate)', '55' => '55 – Schuldzinsen zur Finanzierung von Anschaffungs-/Herstellungskosten AV', '56' => '56 – Übrige Schuldzinsen', - '57' => '57 – Gezahlte und nach § 15 UStG abziehbare Vorsteuerbeträge', - '58' => '58 – An das Finanzamt gezahlte/verrechnete Umsatzsteuer', + '57' => '57 (Kz 185) – Gezahlte und nach § 15 UStG abziehbare Vorsteuerbeträge', + '58' => '58 (Kz 186) – An das Finanzamt gezahlte/verrechnete Umsatzsteuer', '60' => '60 – Übrige unbeschränkt abziehbare Betriebsausgaben', // Beschränkt abziehbare Betriebsausgaben (Zeilen 62–67) '62' => '62 – Geschenke (abziehbarer Anteil)', @@ -137,12 +137,12 @@ ]; foreach ($euerZeilen as $val => $label): ?> - -