diff --git a/BERICHTE.md b/BERICHTE.md index d0d1786..3eddbc1 100644 --- a/BERICHTE.md +++ b/BERICHTE.md @@ -9,33 +9,29 @@ Dieses Dokument beschreibt, wie Buchungen in die beiden steuerlichen Berichte ei **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) - -Bedingung: `buchungstyp = 'Ausgabe'` - -Alle passenden Buchungen werden nach Kategorie-Konto gruppiert und als Betriebsausgaben ausgewiesen. Der Nettobetrag wird summiert. +`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 -- Sortierung innerhalb beider Sektionen: nach `accounts.kontonummer` aufsteigend -- Stornobuchungen (`is_reversal = 1`) werden ausgeschlossen +- Gruppierung: je Kategorie-Konto (`accounts.id`), ein Eintrag pro Konto +- Sortierung: nach `accounts.kontonummer` aufsteigend - Ergebnis: `total_einnahmen − total_ausgaben = gewinn` -### Übersicht - -| Bedingung | Sektion im Bericht | -|---|---| -| `buchungstyp = 'Einnahme'` | Einnahmen | -| `buchungstyp = 'Ausgabe'` | Ausgaben / Betriebsausgaben | - --- ## UStVA (Umsatzsteuervoranmeldung) diff --git a/Changes.md b/Changes.md index 443a512..ceed6e6 100644 --- a/Changes.md +++ b/Changes.md @@ -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 ### Geändert diff --git a/src/Services/EuerCalculator.php b/src/Services/EuerCalculator.php index e1bfbd0..eb99585 100644 --- a/src/Services/EuerCalculator.php +++ b/src/Services/EuerCalculator.php @@ -8,7 +8,15 @@ use Steuerkram\Database; /** * 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 { @@ -20,14 +28,15 @@ class EuerCalculator a.kontonummer, a.bezeichnung, a.kontenart, - bk.buchungstyp, - SUM(bk.betrag_netto) as summe_netto, - COUNT(bk.id) as buchungsanzahl + SUM(bk.betrag_netto) AS summe_netto, + COUNT(bk.id) AS buchungsanzahl 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 - WHERE fy.year = ? AND bk.is_reversal = 0 - GROUP BY a.id, a.kontonummer, a.bezeichnung, a.kontenart, bk.buchungstyp + WHERE fy.year = ? + AND bk.is_reversal = 0 + AND a.kontenart IN (\'Betriebseinnahme\', \'Betriebsausgabe\') + GROUP BY a.id, a.kontonummer, a.bezeichnung, a.kontenart HAVING buchungsanzahl > 0 ORDER BY a.kontonummer', [$year] @@ -37,11 +46,11 @@ class EuerCalculator $ausgaben = []; 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]); - } elseif ($row['buchungstyp'] === 'Ausgabe') { + } else { $ausgaben[] = array_merge($row, ['netto' => $netto]); } }