- Migration 044: Konten 1574 (VSt i.g.E. 19%) und 1774 (USt i.g.E. 19%) anlegen - Migration 045: Konten 1571/1576 anlegen, ustva_kz='61'/'62' setzen, altes DATEV-Routing (ustva_kz '61'/'62' auf Betriebsausgabe-Konten) entfernen, parent_booking_id-Spalte, VSt-Buchungszeilen für Bestandsbuchungen migrieren - Booking::create(): automatisch VSt-Zeile auf 1576/1571 für Ausgaben mit 7/19 % - Booking::reverse(): VSt-Zeilen beim Storno mitaufheben (reversed_by setzen) - BookingController::destroy(): VSt-Kindzeilen beim Löschen (Testmodus) mit löschen - UstvaCalculator: Kz 61/62 jetzt kontobasiert via 1576/1571 (betrag_netto), Step 2 (buchungsbasiert via ust_satz) entfernt - Beleg::all/find: betrag_brutto-Aggregation und Suche schließen VSt-Zeilen aus - Tests 12, 18 angepasst; Test 28 neu
88 lines
3.2 KiB
PHP
88 lines
3.2 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'),
|
|
'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 (inkl. zugehöriger VSt-Buchungszeilen)
|
|
Database::execute('DELETE FROM bookings WHERE parent_booking_id = ?', [$buchungId]);
|
|
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');
|
|
}
|
|
}
|