findAccountId('1200'); $erloesId = $this->findAccountId('8400'); // Erlöse 19% USt $konto4654Id = $this->findAccountId('4654'); $konto4600Id = $this->findAccountId('4600'); // normale Betriebsausgabe if (!$bankId || !$erloesId || !$konto4654Id || !$konto4600Id) { $this->assert(false, 'Benötigte Konten (1200, 8400, 4654, 4600) nicht gefunden'); return; } // Prüfen, dass 4654 wirklich euer_zeile='74' hat (seit Migration 075) $kto = \Steuerkram\Database::fetchOne( "SELECT euer_zeile FROM accounts WHERE kontonummer = '4654'" ); $this->assertEquals('74', $kto['euer_zeile'] ?? null, 'Konto 4654 hat euer_zeile=74'); // Einnahme buchen (Referenz für Gewinnberechnung) $belegEin = \Steuerkram\Models\Beleg::create([ 'beleg_nr' => 'TEST-KZ165-EIN-' . uniqid(), 'filename' => 'test.pdf', 'storage_path' => '', 'mime_type' => 'application/pdf', 'file_hash' => hash('sha256', 'kz165ein' . uniqid()), 'beleg_datum' => $datum, 'belegtyp' => 'Ausgangsrechnung', ]); \Steuerkram\Models\Booking::create([ 'beleg_id' => $belegEin, 'buchungs_datum' => $datum, 'buchungstyp' => 'Einnahme', 'kategorie_konto_id' => $erloesId, 'zahlungskonto_id' => $bankId, 'betrag_netto' => 1000.00, 'ust_satz' => 19.0, 'buchungstext' => 'Test Einnahme KZ165', ]); // Normale Betriebsausgabe (soll in ausgaben erscheinen) $belegAus = \Steuerkram\Models\Beleg::create([ 'beleg_nr' => 'TEST-KZ165-AUS-' . uniqid(), 'filename' => 'test2.pdf', 'storage_path' => '', 'mime_type' => 'application/pdf', 'file_hash' => hash('sha256', 'kz165aus' . uniqid()), 'beleg_datum' => $datum, 'belegtyp' => 'Eingangsrechnung', ]); \Steuerkram\Models\Booking::create([ 'beleg_id' => $belegAus, 'buchungs_datum' => $datum, 'buchungstyp' => 'Ausgabe', 'kategorie_konto_id' => $konto4600Id, 'zahlungskonto_id' => $bankId, 'betrag_netto' => 200.00, 'ust_satz' => 19.0, 'buchungstext' => 'Test normale Ausgabe KZ165', ]); // Nicht abzugsfähige Bewirtungskosten (soll in nicht_abzugsfaehig erscheinen) $belegNa = \Steuerkram\Models\Beleg::create([ 'beleg_nr' => 'TEST-KZ165-NA-' . uniqid(), 'filename' => 'test3.pdf', 'storage_path' => '', 'mime_type' => 'application/pdf', 'file_hash' => hash('sha256', 'kz165na' . uniqid()), 'beleg_datum' => $datum, 'belegtyp' => 'Eingangsrechnung', ]); \Steuerkram\Models\Booking::create([ 'beleg_id' => $belegNa, 'buchungs_datum' => $datum, 'buchungstyp' => 'Ausgabe', 'kategorie_konto_id' => $konto4654Id, 'zahlungskonto_id' => $bankId, 'betrag_netto' => 30.00, 'ust_satz' => 19.0, 'buchungstext' => 'Test nicht abzugsfähige Kosten', ]); $euer = (new \Steuerkram\Services\EuerCalculator())->calculate((int)date('Y')); // 4654-Buchung muss in nicht_abzugsfaehig auftauchen $naKonten = array_column($euer['nicht_abzugsfaehig'], 'kontonummer'); $this->assert( in_array('4654', $naKonten), 'Konto 4654 erscheint in nicht_abzugsfaehig' ); // 4654-Buchung darf NICHT in ausgaben sein $ausKonten = array_column($euer['ausgaben'], 'kontonummer'); $this->assert( !in_array('4654', $ausKonten), 'Konto 4654 erscheint NICHT in ausgaben' ); // total_nicht_abzugsfaehig enthält den Betrag $this->assertGreaterThan(0, (float)$euer['total_nicht_abzugsfaehig'], 'total_nicht_abzugsfaehig > 0'); // total_ausgaben enthält die 200 € normale Ausgabe, NICHT die 30 € nicht abzugsfähige // (Es könnten weitere Buchungen aus anderen Tests vorhanden sein, daher nur prüfen // dass total_ausgaben keine 30 € mehr enthält als ohne die 4654-Buchung) $this->assert( (float)$euer['total_nicht_abzugsfaehig'] >= 30.0, 'total_nicht_abzugsfaehig enthält mindestens 30 €' ); // Gewinn = Einnahmen - normale Ausgaben (nicht abzugsfähige zählen nicht) $erwartetGewinn = round( (float)$euer['total_einnahmen'] - (float)$euer['total_ausgaben'], 2 ); $this->assertEquals($erwartetGewinn, (float)$euer['gewinn'], 'Gewinn = Einnahmen - normale Ausgaben'); // Die nicht abzugsfähigen Kosten sind im Gewinn nicht enthalten $gewinnOhneNa = round( (float)$euer['total_einnahmen'] - (float)$euer['total_ausgaben'] - (float)$euer['total_nicht_abzugsfaehig'], 2 ); $this->assert( (float)$euer['gewinn'] > $gewinnOhneNa || (float)$euer['total_nicht_abzugsfaehig'] > 0, 'Nicht abzugsfähige Kosten reduzieren den Gewinn nicht' ); } }