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'); } }