88 lines
3.8 KiB
PHP
88 lines
3.8 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 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,
|
|
'eingangs_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');
|
|
}
|
|
}
|