111 lines
4.6 KiB
PHP
111 lines
4.6 KiB
PHP
<?php
|
||
|
||
declare(strict_types=1);
|
||
|
||
/**
|
||
* Test 10: IST-Versteuerung – Zahldatum unabhängig vom Rechnungsdatum.
|
||
*
|
||
* Prüft, dass:
|
||
* 1. Finalisieren einer Ausgangsrechnung keine Buchungen erzeugt.
|
||
* 2. Buchungen separat mit einem abweichenden Zahldatum erfasst werden können.
|
||
* 3. Die Buchung im Journal mit dem korrekten Zahldatum erscheint.
|
||
*/
|
||
class IstVersteuerungTest extends TestCase
|
||
{
|
||
protected string $testName = 'Test 10: IST-Versteuerung – Zahldatum';
|
||
|
||
public function run(): void
|
||
{
|
||
$rechnungsDatum = date('Y-m-d');
|
||
$zahlDatum = date('Y-m-d', strtotime('+7 days'));
|
||
|
||
// Konten prüfen
|
||
$zahlungsId = $this->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');
|
||
}
|
||
}
|