findAccountId('1400'); // Forderungen (Aktiv) $erloesId = $this->findAccountId('8000'); // Erlöse 19 % (Ertrag) $aufwandId = $this->findAccountId('4920'); // Bürobedarf (Aufwand) $bankId = $this->findAccountId('1200'); // Bank (Aktiv) // Fallback auf beliebige Konten der passenden Art if (!$erloesId) { $row = \Steuerkram\Database::fetchOne( "SELECT id FROM accounts WHERE kontenart = 'Ertrag' AND aktiv = 1 LIMIT 1" ); $erloesId = $row ? (int)$row['id'] : null; } if (!$aufwandId) { $row = \Steuerkram\Database::fetchOne( "SELECT id FROM accounts WHERE kontenart = 'Aufwand' AND aktiv = 1 LIMIT 1" ); $aufwandId = $row ? (int)$row['id'] : null; } if (!$debitorId) { $row = \Steuerkram\Database::fetchOne( "SELECT id FROM accounts WHERE kontenart = 'Aktiv' AND aktiv = 1 LIMIT 1" ); $debitorId = $row ? (int)$row['id'] : null; } if (!$bankId) { $row = \Steuerkram\Database::fetchOne( "SELECT id FROM accounts WHERE kontenart = 'Aktiv' AND aktiv = 1 AND id != ? LIMIT 1", [$debitorId ?? 0] ); $bankId = $row ? (int)$row['id'] : null; } if (!$debitorId || !$erloesId || !$aufwandId || !$bankId) { $this->assert(false, 'Benötigte Konten nicht gefunden – SKR03-Seed vorhanden?'); return; } $this->assert(true, 'Alle benötigten Konten gefunden'); // ── Ausgangsbuchung (Ertrag, 19 %) ──────────────────────────────── // Debitor an Erlös 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, 'soll_konto_id' => $debitorId, 'haben_konto_id' => $erloesId, 'betrag_netto' => 500.00, 'ust_satz' => 19.0, 'buchungstext' => 'Test Ausgangsbuchung USt 19%', ]); // ── Eingangsbuchung (Aufwand, 19 %) ─────────────────────────────── // Aufwand an Bank: 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, 'soll_konto_id' => $aufwandId, 'haben_konto_id' => $bankId, 'betrag_netto' => 200.00, 'ust_satz' => 19.0, 'buchungstext' => 'Test Eingangsbuchung 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 Ausgangsbuchung ≥ 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 Eingangsbuchung ≥ 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 € (Ausgangsbuchung eingeflossen)' ); // Ausgaben müssen vorhanden sein $this->assert( (float)$euer['total_ausgaben'] >= 200.00, 'EÜR: Ausgaben ≥ 200 € (Eingangsbuchung 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'); } }