findAccountId('1200'); // Bank $kategorieId = $this->findAccountId('8000'); // Erlöse 19 % if (!$zahlungsId || !$kategorieId) { $zahlungsId = $zahlungsId ?? $this->findAccountId('1400'); $kategorieId = $kategorieId ?? $this->findAccountId('8400'); } $this->assert($zahlungsId > 0, 'Zahlungskonto vorhanden'); $this->assert($kategorieId > 0, 'Einnahmekategorie vorhanden'); // Kunde anlegen $customerId = \Steuerkram\Models\Customer::create([ 'nachname' => 'IstTestKunde', 'firma' => 'IST GmbH', 'strasse' => 'Musterstr. 1', 'plz' => '10115', 'ort' => 'Berlin', 'payment_days' => 14, ]); // Rechnung anlegen $invoiceId = \Steuerkram\Models\Invoice::create([ 'customer_id' => $customerId, 'betreff' => 'Test IST-Versteuerung', 'rechnungs_datum' => $rechnungsDatum, 'leistungszeitraum_von' => date('Y-m-01'), 'leistungszeitraum_bis' => date('Y-m-t'), 'lines' => [ [ 'bezeichnung' => 'Beratung', 'menge' => 2, 'einheit' => 'Std.', 'einzelpreis' => 500.00, 'ust_satz' => 19.0, ], ], ]); $this->assertGreaterThan(0, $invoiceId, 'Rechnung angelegt'); // Finalisieren $nr = \Steuerkram\Models\Invoice::finalize($invoiceId); $this->assertNotEmpty($nr, 'Rechnungsnummer vergeben'); $invoice = \Steuerkram\Models\Invoice::find($invoiceId); $this->assertEquals('Gesendet', $invoice['status'] ?? null, 'Status nach Finalisierung: Gesendet'); // Beleg anlegen (wie in InvoiceController::createBeleg) $belegNr = \Steuerkram\Models\Beleg::generateBelegNr(); $belegId = \Steuerkram\Models\Beleg::create([ 'beleg_nr' => $belegNr, 'filename' => $nr . '.pdf', 'storage_path' => '', 'mime_type' => 'application/pdf', 'file_hash' => hash('sha256', $nr), 'beleg_datum' => $rechnungsDatum, 'rechnungs_nr' => $nr, 'betrag_brutto' => $invoice['betrag_brutto'], 'belegtyp' => 'Ausgangsrechnung', ]); \Steuerkram\Database::execute('UPDATE invoices SET beleg_id=? WHERE id=?', [$belegId, $invoiceId]); // Noch keine Buchungen vorhanden (finalize erzeugt keine mehr) $buchungenNachFinalisierung = \Steuerkram\Models\Booking::forBeleg($belegId); $this->assertEquals(0, count($buchungenNachFinalisierung), 'Nach Finalisierung: keine Buchungen vorhanden'); // Buchung separat mit Zahldatum erfassen $buchungId = \Steuerkram\Models\Booking::create([ 'beleg_id' => $belegId, 'buchungs_datum' => $zahlDatum, 'buchungstyp' => 'Einnahme', 'kategorie_konto_id' => $kategorieId, 'zahlungskonto_id' => $zahlungsId, 'betrag_netto' => 1000.00, 'ust_satz' => 19.0, 'buchungstext' => 'Ausgangsrechnung ' . $nr, ]); $this->assertGreaterThan(0, $buchungId, 'Buchung mit Zahldatum erfasst'); // Buchung hat das Zahldatum – nicht das Rechnungsdatum $buchungenNachZahlung = \Steuerkram\Models\Booking::forBeleg($belegId); $this->assertEquals(1, count($buchungenNachZahlung), 'Genau eine Buchung vorhanden'); $bk = $buchungenNachZahlung[0]; $this->assertEquals($zahlDatum, $bk['buchungs_datum'], 'Buchungsdatum ist das Zahldatum'); $this->assertNotEmpty($bk['buchungs_datum'] !== $rechnungsDatum || $zahlDatum === $rechnungsDatum, 'Zahldatum wurde korrekt gespeichert'); } }