Steuerkram/tests/05_TaxSummenTest.php
fds2610 fb579c585c Fix #5: Buchungsmodell von Soll/Haben auf reines EÜR-System umgestellt
Schema: bookings mit buchungstyp (Einnahme/Ausgabe), kategorie_konto_id,
zahlungskonto_id statt soll_konto_id/haben_konto_id. Kontenarten umbenannt
(Ertrag→Betriebseinnahme, Aufwand→Betriebsausgabe, Aktiv→Zahlungskonto,
Passiv→Verbindlichkeit, Neutral→Privat). UI, Services, Controller, Tests
vollständig auf EÜR-Terminologie umgestellt. Alle 78 Tests bestanden.
2026-03-26 10:53:59 +01:00

161 lines
6.8 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
declare(strict_types=1);
/**
* Test 5: Buchungen in UStVA und EÜR.
*
* Erstellt Buchungen mit bekannten Beträgen und prüft, ob
* UstvaCalculator und EuerCalculator die Werte korrekt summieren.
*/
class TaxSummenTest extends TestCase
{
protected string $testName = 'Test 5: Buchungen in UStVA und EÜR';
public function run(): void
{
$year = (int)date('Y');
$month = (int)date('n');
$datum = date('Y-m-d');
// Benötigte Konten (SKR03)
$zahlungsId = $this->findAccountId('1400'); // Forderungen (Zahlungskonto)
$erloesId = $this->findAccountId('8000'); // Erlöse 19 % (Betriebseinnahme)
$ausgabeId = $this->findAccountId('4920'); // Bürobedarf (Betriebsausgabe)
$bankId = $this->findAccountId('1200'); // Bank (Zahlungskonto)
// Fallback auf beliebige Konten der passenden Art
if (!$erloesId) {
$row = \Steuerkram\Database::fetchOne(
"SELECT id FROM accounts WHERE kontenart = 'Betriebseinnahme' AND aktiv = 1 LIMIT 1"
);
$erloesId = $row ? (int)$row['id'] : null;
}
if (!$ausgabeId) {
$row = \Steuerkram\Database::fetchOne(
"SELECT id FROM accounts WHERE kontenart = 'Betriebsausgabe' AND aktiv = 1 LIMIT 1"
);
$ausgabeId = $row ? (int)$row['id'] : null;
}
if (!$zahlungsId) {
$row = \Steuerkram\Database::fetchOne(
"SELECT id FROM accounts WHERE kontenart = 'Zahlungskonto' AND aktiv = 1 LIMIT 1"
);
$zahlungsId = $row ? (int)$row['id'] : null;
}
if (!$bankId) {
$row = \Steuerkram\Database::fetchOne(
"SELECT id FROM accounts WHERE kontenart = 'Zahlungskonto' AND aktiv = 1 AND id != ? LIMIT 1",
[$zahlungsId ?? 0]
);
$bankId = $row ? (int)$row['id'] : null;
}
if (!$zahlungsId || !$erloesId || !$ausgabeId || !$bankId) {
$this->assert(false, 'Benötigte Konten nicht gefunden – SKR03-Seed vorhanden?');
return;
}
$this->assert(true, 'Alle benötigten Konten gefunden');
// ── Einnahme-Buchung (19 %) ─────────────────────────────────
// Erlöse 19%: Netto=500, USt=95, Brutto=595
$belegAr = \Steuerkram\Models\Beleg::create([
'beleg_nr' => 'TEST-AR-' . uniqid(),
'filename' => 'test-ar.pdf',
'storage_path' => '',
'mime_type' => 'application/pdf',
'file_hash' => hash('sha256', 'test-ar'),
'beleg_datum' => $datum,
'eingangs_datum' => $datum,
'belegtyp' => 'Ausgangsrechnung',
]);
\Steuerkram\Models\Booking::create([
'beleg_id' => $belegAr,
'buchungs_datum' => $datum,
'buchungstyp' => 'Einnahme',
'kategorie_konto_id' => $erloesId,
'zahlungskonto_id' => $zahlungsId,
'betrag_netto' => 500.00,
'ust_satz' => 19.0,
'buchungstext' => 'Test Einnahme USt 19%',
]);
// ── Ausgabe-Buchung (19 %) ──────────────────────────────────
// Bürobedarf: Netto=200, USt=38, Brutto=238
$belegEr = \Steuerkram\Models\Beleg::create([
'beleg_nr' => 'TEST-ER-' . uniqid(),
'filename' => 'test-er.pdf',
'storage_path' => 'static/uploads/test/test-er.pdf',
'mime_type' => 'application/pdf',
'file_hash' => hash('sha256', 'test-er'),
'beleg_datum' => $datum,
'eingangs_datum' => $datum,
'belegtyp' => 'Eingangsrechnung',
]);
\Steuerkram\Models\Booking::create([
'beleg_id' => $belegEr,
'buchungs_datum' => $datum,
'buchungstyp' => 'Ausgabe',
'kategorie_konto_id' => $ausgabeId,
'zahlungskonto_id' => $bankId,
'betrag_netto' => 200.00,
'ust_satz' => 19.0,
'buchungstext' => 'Test Ausgabe USt 19%',
]);
// ── UStVA prüfen ──────────────────────────────────────────────────
$calc = new \Steuerkram\Services\UstvaCalculator();
$kz = $calc->calculate($year, $month);
// Kz 81: Steuerpfl. Umsätze 19% – muss mindestens 500 € enthalten
$this->assert(
(float)$kz['81']['betrag'] >= 500.00,
'UStVA Kz 81 (Umsätze 19%): Betrag enthält Einnahme ≥ 500 €'
);
// Kz 83: USt auf Umsätze 19% – abgeleitet (19% von Kz81-Betrag)
$this->assert(
(float)$kz['83']['steuer'] >= 95.00,
'UStVA Kz 83 (USt 19%): Steuerbetrag ≥ 95 €'
);
// Kz 61: Vorsteuer 19% – muss mindestens 38 € enthalten
$this->assert(
(float)$kz['61']['steuer'] >= 38.00,
'UStVA Kz 61 (Vorsteuer 19%): Steuerbetrag enthält Ausgabe ≥ 38 €'
);
// Kz 66: Vorsteuer gesamt – muss ≥ Kz 61 sein
$this->assert(
(float)$kz['66']['steuer'] >= (float)$kz['61']['steuer'],
'UStVA Kz 66 (Vorsteuer gesamt): ≥ Kz 61'
);
// Kz 69 Berechnung: USt gesamt - Vorsteuer gesamt
$erwKz69 = round(
((float)$kz['83']['steuer'] + (float)$kz['84']['steuer']) - (float)$kz['66']['steuer'],
2
);
$this->assertEquals($erwKz69, (float)$kz['69']['steuer'], 'UStVA Kz 69 (Zahllast) korrekt berechnet');
// ── EÜR prüfen ────────────────────────────────────────────────────
$euerCalc = new \Steuerkram\Services\EuerCalculator();
$euer = $euerCalc->calculate($year);
// Einnahmen müssen vorhanden sein
$this->assert(
(float)$euer['total_einnahmen'] >= 500.00,
'EÜR: Einnahmen ≥ 500 € (Einnahme-Buchung eingeflossen)'
);
// Ausgaben müssen vorhanden sein
$this->assert(
(float)$euer['total_ausgaben'] >= 200.00,
'EÜR: Ausgaben ≥ 200 € (Ausgabe-Buchung eingeflossen)'
);
// Gewinn = Einnahmen - Ausgaben
$erwGewinn = round((float)$euer['total_einnahmen'] - (float)$euer['total_ausgaben'], 2);
$this->assertEquals($erwGewinn, (float)$euer['gewinn'], 'EÜR: Gewinn = Einnahmen - Ausgaben');
}
}