161 lines
6.8 KiB
PHP
161 lines
6.8 KiB
PHP
<?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('1200'); // Bank (Zahlungskonto)
|
||
$erloesId = $this->findAccountId('8400'); // Erlöse 19 % USt (Betriebseinnahme, kz=81)
|
||
$ausgabeId = $this->findAccountId('4920'); // Bürobedarf (Betriebsausgabe)
|
||
$bankId = $this->findAccountId('1200'); // Bank (Zahlungskonto)
|
||
|
||
// Fallback: explizit ein Konto mit ustva_kz=81 suchen, damit kz81/83 befüllt werden
|
||
if (!$erloesId) {
|
||
$row = \Steuerkram\Database::fetchOne(
|
||
"SELECT id FROM accounts WHERE kontenart = 'Betriebseinnahme' AND ustva_kz = '81' 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');
|
||
}
|
||
}
|