findAccountId('4920'); // Bürobedarf (Betriebsausgabe) $bankId = $this->findAccountId('1200'); // Bank (Zahlungskonto) if (!$ausgabeId || !$bankId) { // Fallback: irgendein Betriebsausgabe- und Zahlungskonto suchen $ausgabeRow = \Steuerkram\Database::fetchOne( "SELECT id FROM accounts WHERE kontenart = 'Betriebsausgabe' AND aktiv = 1 LIMIT 1" ); $bankRow = \Steuerkram\Database::fetchOne( "SELECT id FROM accounts WHERE kontenart = 'Zahlungskonto' AND aktiv = 1 LIMIT 1" ); $ausgabeId = $ausgabeRow ? (int)$ausgabeRow['id'] : null; $bankId = $bankRow ? (int)$bankRow['id'] : null; } $this->assertNotEmpty($ausgabeId, 'Betriebsausgabe-Konto gefunden'); $this->assertNotEmpty($bankId, 'Zahlungskonto gefunden'); if (!$ausgabeId || !$bankId) { return; } // Beleg anlegen $belegNr = 'TEST-' . uniqid(); $datum = date('Y-m-d'); $belegId = \Steuerkram\Models\Beleg::create([ 'beleg_nr' => $belegNr, 'filename' => 'eingangsrechnung-test.pdf', 'storage_path' => 'static/uploads/test/eingangsrechnung-test.pdf', 'mime_type' => 'application/pdf', 'file_hash' => hash('sha256', $belegNr . 'buch'), 'beleg_datum' => $datum, 'eingangs_datum' => $datum, 'rechnungs_nr' => 'RE-BUCH-001', 'betrag_brutto' => 59.50, 'belegtyp' => 'Eingangsrechnung', ]); $this->assertGreaterThan(0, $belegId, 'Beleg für Buchungstest angelegt'); // Buchung erstellen (EÜR: Ausgabe mit Kategorie + Zahlungskonto) $buchungId = \Steuerkram\Models\Booking::create([ 'beleg_id' => $belegId, 'buchungs_datum' => $datum, 'buchungstyp' => 'Ausgabe', 'kategorie_konto_id' => $ausgabeId, 'zahlungskonto_id' => $bankId, 'betrag_netto' => 50.00, 'ust_satz' => 19.0, 'buchungstext' => 'Testbuchung Bürobedarf', ]); $this->assertGreaterThan(0, $buchungId, 'Buchung wurde angelegt (ID > 0)'); // Buchung via Booking::find() abrufbar $buchung = \Steuerkram\Models\Booking::find($buchungId); $this->assertNotEmpty($buchung, 'Booking::find() liefert die Buchung'); $this->assertEquals(50.00, (float)($buchung['betrag_netto'] ?? 0), 'Nettobetrag korrekt'); $this->assertEquals(19.0, (float)($buchung['ust_satz'] ?? 0), 'USt-Satz korrekt'); $this->assertEquals('Ausgabe', $buchung['buchungstyp'] ?? '', 'Buchungstyp ist Ausgabe'); // Buchung via Booking::forBeleg() abrufbar $buchungen = \Steuerkram\Models\Booking::forBeleg($belegId); $this->assertGreaterThan(0, count($buchungen), 'Booking::forBeleg() liefert Buchungen'); $foundInBeleg = false; foreach ($buchungen as $bk) { if ((int)$bk['id'] === $buchungId) { $foundInBeleg = true; break; } } $this->assert($foundInBeleg, 'Buchung erscheint in Booking::forBeleg()'); // Buchung im Journal $year = (int)date('Y'); $month = (int)date('n'); $journal = \Steuerkram\Models\Booking::journal(['year' => $year, 'month' => $month], 1, 999); $foundInJournal = false; foreach ($journal['rows'] as $row) { if ((int)$row['id'] === $buchungId) { $foundInJournal = true; $this->assertNotEmpty($row['buchungs_nr'], 'Buchungsnummer im Journal vorhanden'); $this->assertNotEmpty($row['kategorie_nr'], 'Kategorie-Kontonummer im Journal vorhanden'); $this->assertNotEmpty($row['zahlungs_nr'], 'Zahlungskonto-Nr. im Journal vorhanden'); $this->assertNotEmpty($row['beleg_nr'], 'Belegnummer im Journal vorhanden'); $this->assertEquals('Ausgabe', $row['buchungstyp'], 'Buchungstyp im Journal korrekt'); break; } } $this->assert($foundInJournal, 'Buchung erscheint vollständig im Buchungsjournal'); // Beleg ist jetzt als gebucht markiert $belegNeu = \Steuerkram\Models\Beleg::find($belegId); $this->assertEquals(1, (int)($belegNeu['booked'] ?? 0), 'Beleg ist als gebucht markiert'); } }