Steuerkram/tests/59_EssensbelegOhneUstTest.php

72 lines
3.6 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
declare(strict_types=1);
class EssensbelegOhneUstTest extends TestCase
{
protected string $testName = 'Test 59: Essensbeleg-Vorlage – dritte Zeile ohne USt. (Trinkgeld)';
public function run(): void
{
$vorlage = \Steuerkram\Database::fetchOne(
"SELECT * FROM buchungsvorlagen WHERE name = 'Essensbeleg n. abzugsfähig (nur USt.)' LIMIT 1"
);
$this->assertNotEmpty($vorlage, 'Seed-Vorlage "Essensbeleg n. abzugsfähig (nur USt.)" vorhanden');
$vid = (int)$vorlage['id'];
// ── Feld netto_0 mit 0% USt. vorhanden ──────────────────────────────
$felder = \Steuerkram\Models\Buchungsvorlage::getFelder($vid);
$feldNamen = array_column($felder, 'feldname');
$this->assert(in_array('netto_0', $feldNamen, true), 'Feld netto_0 (0% USt.) ist Teil der Vorlage');
$feldNull = current(array_filter($felder, fn($f) => $f['feldname'] === 'netto_0'));
$this->assertEquals('ust_zeile', $feldNull['typ'], 'netto_0 ist eine ust_zeile');
$this->assertEquals(0.0, (float)$feldNull['ust_satz'], 'netto_0 hat 0% USt.-Satz');
// ── Regel für netto_0 bucht auf Konto 4657 ──────────────────────────
$regeln = \Steuerkram\Models\Buchungsvorlage::getRegeln($vid);
$regelNull = current(array_filter($regeln, fn($r) => $r['bedingung_feld'] === 'netto_0'));
$this->assertNotEmpty($regelNull, 'Regel für netto_0 vorhanden');
$this->assertEquals('4657', $regelNull['buchungen'][0]['nach_konto'], 'netto_0 bucht auf Konto 4657 (ohne Vorsteuer)');
// ── Buchungsausführung mit allen drei Zeilen (7%, 19%, 0%) ─────────
$bankId = \Steuerkram\Database::fetchOne(
"SELECT id FROM accounts WHERE kontonummer = '1200' LIMIT 1"
);
$this->assertNotEmpty($bankId, 'Konto 1200 gefunden');
$belegNr = 'TEST-ESS-' . uniqid();
$belegId = \Steuerkram\Models\Beleg::create([
'beleg_nr' => $belegNr,
'filename' => 'test-essensbeleg-trinkgeld.pdf',
'storage_path' => 'static/uploads/test/test-essensbeleg-trinkgeld.pdf',
'mime_type' => 'application/pdf',
'file_hash' => hash('sha256', $belegNr),
'beleg_datum' => date('Y-m-d'),
'belegtyp' => 'Eingangsrechnung',
]);
$this->assertGreaterThan(0, $belegId, 'Beleg angelegt');
$svc = new \Steuerkram\Services\VorlageBuchungsService();
$ids = $svc->buchen($belegId, $vid, [
'netto_7' => '10.00',
'ust_7' => '0.70',
'netto_19' => '20.00',
'ust_19' => '3.80',
'netto_0' => '5.00',
'zahlungskonto_id' => (int)$bankId['id'],
'lieferant' => 'Test-Restaurant',
'belegdatum' => date('Y-m-d'),
], date('Y-m-d'));
$this->assertEquals(5, count($ids), '5 Buchungszeilen erzeugt (2x Netto+USt, 1x Trinkgeld ohne USt.)');
$bookings = \Steuerkram\Models\Booking::forBeleg($belegId);
$kontonummern = array_column($bookings, 'kategorie_nr');
sort($kontonummern);
$this->assertEquals(['1571', '1576', '4654', '4656', '4657'], $kontonummern, 'Buchungen auf Konten 1571, 1576, 4654, 4656 und 4657');
$trinkgeldBuchung = current(array_filter($bookings, fn($b) => $b['kategorie_nr'] === '4657'));
$this->assertEquals(5.0, (float)$trinkgeldBuchung['betrag_netto'], 'Trinkgeld-Betrag korrekt gebucht');
}
}