EÜR umgebaut auf Kontenart statt Buchungstyp

This commit is contained in:
fds2610 2026-03-29 13:38:16 +02:00
parent 452fac2698
commit 37fcf53e8f
3 changed files with 48 additions and 28 deletions

View file

@ -9,33 +9,29 @@ Dieses Dokument beschreibt, wie Buchungen in die beiden steuerlichen Berichte ei
**Datei:** `src/Services/EuerCalculator.php` **Datei:** `src/Services/EuerCalculator.php`
Die EÜR basiert ausschließlich auf dem Feld `buchungstyp` der Buchung, kombiniert mit dem verknüpften Kategorie-Konto (`kategorie_konto_id → accounts`). Es gibt keine feste Zuordnung von Kontonummern zu bestimmten EÜR-Zeilen – jedes Konto erscheint als eigene Zeile in der jeweiligen Sektion. Die EÜR basiert ausschließlich auf dem Feld `accounts.kontenart` des Kategorie-Kontos. Das Feld `buchungstyp` wird nicht ausgewertet. Stornobuchungen (`is_reversal = 1`) werden ausgeschlossen.
### Einnahmen ### Spaltenauswahl nach Kontenart
Bedingung: `buchungstyp = 'Einnahme'` | kontenart | EÜR-Spalte |
|---|---|
| `Betriebseinnahme` | Einnahmen |
| `Betriebsausgabe` | Ausgaben |
| `Privat` | nicht in EÜR (Privatentnahmen/-einlagen beeinflussen den Gewinn nicht) |
| `Zahlungskonto`, `Verbindlichkeit` | nicht in EÜR |
Alle passenden Buchungen werden nach Kategorie-Konto gruppiert und als Einnahmen ausgewiesen. Der Nettobetrag (`betrag_netto`) wird summiert. ### Vorzeichen
### Ausgaben (Betriebsausgaben) `betrag_netto` wird ohne `abs()` direkt summiert:
- Positiver Wert → addiert zur jeweiligen Spalte
Bedingung: `buchungstyp = 'Ausgabe'` - Negativer Wert → mindert die jeweilige Spalte (z.B. Gutschriften, Erlösschmälerungen)
Alle passenden Buchungen werden nach Kategorie-Konto gruppiert und als Betriebsausgaben ausgewiesen. Der Nettobetrag wird summiert.
### Sortierung und Ergebnis ### Sortierung und Ergebnis
- Sortierung innerhalb beider Sektionen: nach `accounts.kontonummer` aufsteigend - Gruppierung: je Kategorie-Konto (`accounts.id`), ein Eintrag pro Konto
- Stornobuchungen (`is_reversal = 1`) werden ausgeschlossen - Sortierung: nach `accounts.kontonummer` aufsteigend
- Ergebnis: `total_einnahmen − total_ausgaben = gewinn` - Ergebnis: `total_einnahmen − total_ausgaben = gewinn`
### Übersicht
| Bedingung | Sektion im Bericht |
|---|---|
| `buchungstyp = 'Einnahme'` | Einnahmen |
| `buchungstyp = 'Ausgabe'` | Ausgaben / Betriebsausgaben |
--- ---
## UStVA (Umsatzsteuervoranmeldung) ## UStVA (Umsatzsteuervoranmeldung)

View file

@ -2,6 +2,21 @@
--- ---
## 2026-03-29 – EÜR: Spaltenauswahl nach Kontenart statt Buchungstyp
### Geändert
- `EuerCalculator::calculate()` wertet `accounts.kontenart` aus statt `buchungstyp`
- `Betriebseinnahme` → Einnahmen-Spalte, `Betriebsausgabe` → Ausgaben-Spalte
- `Privat`, `Zahlungskonto`, `Verbindlichkeit` als Kategorie-Konto werden nicht in der EÜR ausgewiesen
- Vorzeichen von `betrag_netto` werden beibehalten (kein `abs()` mehr) – negative Beträge mindern die jeweilige Spalte
- Buchungen desselben Kontos werden unabhängig vom `buchungstyp` zu einem Eintrag zusammengefasst
### Betrifft
- `src/Services/EuerCalculator.php`
- `BERICHTE.md` (EÜR-Kapitel aktualisiert)
---
## 2026-03-29 – UStVA: kontonummernbasierte Kennzahlenberechnung ## 2026-03-29 – UStVA: kontonummernbasierte Kennzahlenberechnung
### Geändert ### Geändert

View file

@ -8,7 +8,15 @@ use Steuerkram\Database;
/** /**
* Berechnet die Einnahmen-Überschuss-Rechnung (EÜR) für ein Geschäftsjahr. * Berechnet die Einnahmen-Überschuss-Rechnung (EÜR) für ein Geschäftsjahr.
* Gruppiert alle Buchungen nach buchungstyp und Kategorie-Konto. *
* Maßgeblich ist ausschließlich accounts.kontenart des Kategorie-Kontos:
* Betriebseinnahme → Einnahmen-Spalte
* Betriebsausgabe → Ausgaben-Spalte
* Privat / Zahlungskonto / Verbindlichkeit → nicht in EÜR
*
* Vorzeichen von betrag_netto werden beibehalten:
* positiver Wert → addiert zur jeweiligen Spalte
* negativer Wert → mindert die jeweilige Spalte (z.B. Gutschriften)
*/ */
class EuerCalculator class EuerCalculator
{ {
@ -20,14 +28,15 @@ class EuerCalculator
a.kontonummer, a.kontonummer,
a.bezeichnung, a.bezeichnung,
a.kontenart, a.kontenart,
bk.buchungstyp, SUM(bk.betrag_netto) AS summe_netto,
SUM(bk.betrag_netto) as summe_netto, COUNT(bk.id) AS buchungsanzahl
COUNT(bk.id) as buchungsanzahl
FROM bookings bk FROM bookings bk
JOIN accounts a ON bk.kategorie_konto_id = a.id JOIN accounts a ON bk.kategorie_konto_id = a.id
JOIN fiscal_years fy ON bk.fiscal_year_id = fy.id JOIN fiscal_years fy ON bk.fiscal_year_id = fy.id
WHERE fy.year = ? AND bk.is_reversal = 0 WHERE fy.year = ?
GROUP BY a.id, a.kontonummer, a.bezeichnung, a.kontenart, bk.buchungstyp AND bk.is_reversal = 0
AND a.kontenart IN (\'Betriebseinnahme\', \'Betriebsausgabe\')
GROUP BY a.id, a.kontonummer, a.bezeichnung, a.kontenart
HAVING buchungsanzahl > 0 HAVING buchungsanzahl > 0
ORDER BY a.kontonummer', ORDER BY a.kontonummer',
[$year] [$year]
@ -37,11 +46,11 @@ class EuerCalculator
$ausgaben = []; $ausgaben = [];
foreach ($rows as $row) { foreach ($rows as $row) {
$netto = round(abs((float)$row['summe_netto']), 2); $netto = round((float)$row['summe_netto'], 2);
if ($row['buchungstyp'] === 'Einnahme') { if ($row['kontenart'] === 'Betriebseinnahme') {
$einnahmen[] = array_merge($row, ['netto' => $netto]); $einnahmen[] = array_merge($row, ['netto' => $netto]);
} elseif ($row['buchungstyp'] === 'Ausgabe') { } else {
$ausgaben[] = array_merge($row, ['netto' => $netto]); $ausgaben[] = array_merge($row, ['netto' => $netto]);
} }
} }