diff --git a/BERICHTE.md b/BERICHTE.md index 3eddbc1..80bd97f 100644 --- a/BERICHTE.md +++ b/BERICHTE.md @@ -9,16 +9,19 @@ 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 `accounts.kontenart` des Kategorie-Kontos. Das Feld `buchungstyp` wird nicht ausgewertet. Stornobuchungen (`is_reversal = 1`) werden ausgeschlossen. +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 ausgeschlossen. -### Spaltenauswahl nach Kontenart +### Spaltenauswahl nach Kontenart und euer_zeile -| 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 | +| 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 diff --git a/migrations/015_nicht_abzugsfaehig_4656_euer_zeile.sql b/migrations/015_nicht_abzugsfaehig_4656_euer_zeile.sql new file mode 100644 index 0000000..2637688 --- /dev/null +++ b/migrations/015_nicht_abzugsfaehig_4656_euer_zeile.sql @@ -0,0 +1,7 @@ +-- Migration 015: euer_zeile = '51' für Konto 4656 setzen +-- Konto 4656 "nicht abzugsfähige Bewirtungskosten VSt. 7%" gehört wie +-- 4654 und 4635/4636 zur EÜR-Zeile 51 (Nicht abziehbare Betriebsausgaben). +UPDATE accounts +SET euer_zeile = '51' +WHERE kontonummer = '4656' + AND (euer_zeile IS NULL OR euer_zeile = ''); diff --git a/src/Services/EuerCalculator.php b/src/Services/EuerCalculator.php index 63c9453..5ea807c 100644 --- a/src/Services/EuerCalculator.php +++ b/src/Services/EuerCalculator.php @@ -28,6 +28,7 @@ class EuerCalculator a.kontonummer, a.bezeichnung, a.kontenart, + a.euer_zeile, SUM(bk.betrag_netto) AS summe_netto, COUNT(bk.id) AS buchungsanzahl FROM bookings bk @@ -36,36 +37,42 @@ class EuerCalculator WHERE fy.year = ? AND bk.is_reversal = 0 AND a.kontenart IN (\'Betriebseinnahme\', \'Betriebsausgabe\') - GROUP BY a.id, a.kontonummer, a.bezeichnung, a.kontenart + GROUP BY a.id, a.kontonummer, a.bezeichnung, a.kontenart, a.euer_zeile HAVING buchungsanzahl > 0 ORDER BY a.kontonummer', [$year] ); - $einnahmen = []; - $ausgaben = []; + $einnahmen = []; + $ausgaben = []; + $nichtAbzugsfaehig = []; foreach ($rows as $row) { $netto = round((float)$row['summe_netto'], 2); if ($row['kontenart'] === 'Betriebseinnahme') { $einnahmen[] = array_merge($row, ['netto' => $netto]); + } elseif ($row['euer_zeile'] === '51') { + $nichtAbzugsfaehig[] = array_merge($row, ['netto' => $netto]); } else { $ausgaben[] = array_merge($row, ['netto' => $netto]); } } - $totalEinnahmen = array_sum(array_column($einnahmen, 'netto')); - $totalAusgaben = array_sum(array_column($ausgaben, 'netto')); - $gewinn = round($totalEinnahmen - $totalAusgaben, 2); + $totalEinnahmen = array_sum(array_column($einnahmen, 'netto')); + $totalAusgaben = array_sum(array_column($ausgaben, 'netto')); + $totalNichtAbzugsfaehig = array_sum(array_column($nichtAbzugsfaehig, 'netto')); + $gewinn = round($totalEinnahmen - $totalAusgaben, 2); return [ - 'year' => $year, - 'einnahmen' => $einnahmen, - 'ausgaben' => $ausgaben, - 'total_einnahmen' => round($totalEinnahmen, 2), - 'total_ausgaben' => round($totalAusgaben, 2), - 'gewinn' => $gewinn, + 'year' => $year, + 'einnahmen' => $einnahmen, + 'ausgaben' => $ausgaben, + 'nicht_abzugsfaehig' => $nichtAbzugsfaehig, + 'total_einnahmen' => round($totalEinnahmen, 2), + 'total_ausgaben' => round($totalAusgaben, 2), + 'total_nicht_abzugsfaehig' => round($totalNichtAbzugsfaehig, 2), + 'gewinn' => $gewinn, ]; } diff --git a/src/Services/PdfEuerService.php b/src/Services/PdfEuerService.php index a60ec00..0d26482 100644 --- a/src/Services/PdfEuerService.php +++ b/src/Services/PdfEuerService.php @@ -56,6 +56,36 @@ class PdfEuerService $gewinnLabel = $euer['gewinn'] >= 0 ? 'Überschuss (Gewinn)' : 'Fehlbetrag (Verlust)'; $gewinnClass = $euer['gewinn'] >= 0 ? 'positive' : 'negative'; + $nichtAbzugRows = ''; + foreach ($euer['nicht_abzugsfaehig'] ?? [] as $na) { + $nichtAbzugRows .= '
| Kto. | Bezeichnung | Betrag | +
|---|---|---|
| Summe nicht abzugsfähige Kosten | +{$fmt($euer['total_nicht_abzugsfaehig'])} | +|
{$firma} · Geschäftsjahr {$year}
@@ -92,7 +122,7 @@ class PdfEuerService - +{$nichtAbzugSection}Erstellt am {$h(date('d.m.Y H:i'))} · Steuerkram
HTML; } @@ -118,6 +148,7 @@ h1 { font-size: 14pt; margin-bottom: 2mm; } .gewinn-row.negative td { background: #fee2e2; } .gewinn-cell { text-align: right; font-size: 11pt; } .gewinn-val { margin-left: 4mm; } +.section-heading { font-size: 11pt; margin-top: 8mm; margin-bottom: 2mm; } .generated-note { font-size: 7pt; color: #888; margin-top: 8mm; } CSS; } diff --git a/src/Views/tax/euer_show.php b/src/Views/tax/euer_show.php index 18302b9..05a286c 100644 --- a/src/Views/tax/euer_show.php +++ b/src/Views/tax/euer_show.php @@ -81,6 +81,42 @@ $fmt = fn($v) => View::formatMoney($v); - + +| Kto. | +Bezeichnung | +Betrag | +
|---|---|---|
| = $h($na['kontonummer']) ?> | += $h($na['bezeichnung']) ?> | ++ = $fmt($na['netto']) ?> + | +
| Summe nicht abzugsfähige Kosten | += $fmt($euer['total_nicht_abzugsfaehig']) ?> | +|