Steuerkram/tests/17_AutomatikkontenUstTest.php

87 lines
3.7 KiB
PHP

<?php
declare(strict_types=1);
/**
* Test 17: Automatische USt-Satz-Vorauswahl bei Konten mit Steuercode.
*
* Stellt sicher, dass:
* - Konten mit steuercode=VSt19/USt19 den ust_satz=19 tragen (serverseitige Absicherung)
* - Konten mit steuercode=VSt7/USt7 den ust_satz=7 tragen
* - Das steuercode-Feld in Account::all() korrekt geliefert wird
* - Buchungen auf Steuercode-Konten mit dem korrekten USt-Satz gespeichert werden
*/
class AutomatikkontenUstTest extends TestCase
{
protected string $testName = 'Test 17: Automatikkonten USt-Satz (Steuercode)';
public function run(): void
{
// ── Steuercode-Felder in der Datenbank prüfen ─────────────────
$kto4650 = \Steuerkram\Database::fetchOne(
"SELECT steuercode FROM accounts WHERE kontonummer = '4650'"
);
$this->assertEquals('VSt19', $kto4650['steuercode'] ?? null, 'Konto 4650 hat steuercode=VSt19');
$kto4651 = \Steuerkram\Database::fetchOne(
"SELECT steuercode FROM accounts WHERE kontonummer = '4651'"
);
$this->assertEquals('VSt7', $kto4651['steuercode'] ?? null, 'Konto 4651 hat steuercode=VSt7 (oder null)');
$kto8400 = \Steuerkram\Database::fetchOne(
"SELECT steuercode FROM accounts WHERE kontonummer = '8400'"
);
$this->assertEquals('USt19', $kto8400['steuercode'] ?? null, 'Konto 8400 hat steuercode=USt19');
// ── USt-Mapping prüfen (Frontend-Logik serverseitig validiert) ─
$mapping = ['VSt19' => 19, 'USt19' => 19, 'VSt7' => 7, 'USt7' => 7];
$kontenMitSteuercode = \Steuerkram\Database::fetchAll(
"SELECT kontonummer, steuercode FROM accounts WHERE steuercode IS NOT NULL AND steuercode != '' LIMIT 20"
);
$this->assertNotEmpty($kontenMitSteuercode, 'Konten mit Steuercode vorhanden');
foreach ($kontenMitSteuercode as $kto) {
$erwarteterUst = $mapping[$kto['steuercode']] ?? null;
$this->assert(
$erwarteterUst !== null,
'Steuercode ' . $kto['steuercode'] . ' auf Konto ' . $kto['kontonummer'] . ' ist im Mapping'
);
}
// ── Buchung mit VSt19-Konto mit 19% USt ───────────────────────
$datum = date('Y-m-d');
$bankId = $this->findAccountId('1200');
$kto4650Id = $this->findAccountId('4650');
if (!$bankId || !$kto4650Id) {
$this->assert(false, 'Konten 1200 und 4650 müssen vorhanden sein');
return;
}
$belegId = \Steuerkram\Models\Beleg::create([
'beleg_nr' => 'TEST-AUTOUST-' . uniqid(),
'filename' => 'test.pdf',
'storage_path' => '',
'mime_type' => 'application/pdf',
'file_hash' => hash('sha256', 'autoust' . uniqid()),
'beleg_datum' => $datum,
'belegtyp' => 'Eingangsrechnung',
]);
$bookingId = \Steuerkram\Models\Booking::create([
'beleg_id' => $belegId,
'buchungs_datum' => $datum,
'buchungstyp' => 'Ausgabe',
'kategorie_konto_id' => $kto4650Id,
'zahlungskonto_id' => $bankId,
'betrag_netto' => 100.0,
'ust_satz' => 19.0, // sollte durch Steuercode VSt19 vorgegeben sein
'buchungstext' => 'Test Automatikkonto VSt19',
]);
$booking = \Steuerkram\Models\Booking::find($bookingId);
$this->assertEquals(19.0, (float)$booking['ust_satz'], 'Buchung auf VSt19-Konto hat ust_satz=19');
$this->assertEquals(19.0, (float)$booking['betrag_ust'], 'Buchung auf VSt19-Konto hat betrag_ust=19');
}
}