Steuerkram/tests/12_BelegGebuechtStatusTest.php

88 lines
3.1 KiB
PHP

<?php
declare(strict_types=1);
use Steuerkram\Models\Beleg;
use Steuerkram\Models\Booking;
use Steuerkram\Database;
class BelegGebuechtStatusTest extends TestCase
{
protected string $testName = 'Test 12: Gebucht-Status aus Buchungen abgeleitet';
public function run(): void
{
$kategorieId = $this->findAccountId('4980');
$zahlungsId = $this->findAccountId('1800');
if (!$kategorieId || !$zahlungsId) {
$this->assert(false, 'Benötigte Konten (4980, 1800) nicht gefunden');
return;
}
// Beleg anlegen
$belegId = Beleg::create([
'beleg_nr' => 'TEST-' . uniqid(),
'filename' => 'test.pdf',
'storage_path' => 'uploads/test.pdf',
'mime_type' => 'application/pdf',
'file_hash' => sha1('test'),
'beleg_datum' => date('Y-m-d'),
'eingangs_datum'=> date('Y-m-d'),
'belegtyp' => 'Eingangsrechnung',
'betrag_brutto' => 119.00,
]);
$this->assertGreaterThan(0, $belegId, 'Beleg angelegt (ID > 0)');
// Vor Buchung: booked = 0
$beleg = Beleg::find($belegId);
$this->assertEquals(0, (int)($beleg['booked'] ?? 0), 'Vor Buchung: booked = 0');
// Buchung anlegen
$buchungId = Booking::create([
'beleg_id' => $belegId,
'buchungs_datum' => date('Y-m-d'),
'buchungstyp' => 'Ausgabe',
'kategorie_konto_id' => $kategorieId,
'zahlungskonto_id' => $zahlungsId,
'betrag_netto' => 100.00,
'ust_satz' => 19,
'steuerart' => 'normal',
'buchungstext' => 'Test Buchung',
]);
$this->assertGreaterThan(0, $buchungId, 'Buchung angelegt (ID > 0)');
// Nach Buchung: booked = 1
$beleg = Beleg::find($belegId);
$this->assertEquals(1, (int)($beleg['booked'] ?? 0), 'Nach Buchung: booked = 1 (abgeleitet)');
// Buchung löschen
Database::execute('DELETE FROM bookings WHERE id = ?', [$buchungId]);
// Nach Löschen der Buchung: booked = 0
$beleg = Beleg::find($belegId);
$this->assertEquals(0, (int)($beleg['booked'] ?? 0), 'Nach Löschen der Buchung: booked = 0');
// Belegübersicht: Filter booked=1 enthält den Beleg nicht mehr
$result = Beleg::all(['booked' => '1']);
$found = false;
foreach ($result['rows'] as $row) {
if ((int)$row['id'] === $belegId) {
$found = true;
break;
}
}
$this->assert(!$found, 'Beleg nicht in booked=1-Filter nach Buchungslöschung');
// Filter booked=0 enthält den Beleg
$result = Beleg::all(['booked' => '0']);
$found = false;
foreach ($result['rows'] as $row) {
if ((int)$row['id'] === $belegId) {
$found = true;
break;
}
}
$this->assert($found, 'Beleg erscheint in booked=0-Filter nach Buchungslöschung');
}
}