Fix #17: Kz39 bei Erstattungsbetrag aus UStVA-XML weglassen

This commit is contained in:
fds2610 2026-03-30 21:06:09 +02:00
parent 06c9f184f9
commit f8899d6bff
2 changed files with 40 additions and 2 deletions

View file

@ -135,9 +135,11 @@ class ElsterXmlService
} }
} }
// Zahllast / Erstattung → Kz39 // Zahllast → Kz39 (nur bei positivem Wert; bei Erstattung weglassen, da kein Vorzeichen erlaubt)
$zahllast = (float)($kz['69']['steuer'] ?? 0.0); $zahllast = (float)($kz['69']['steuer'] ?? 0.0);
$ustva->appendChild($dom->createElement('Kz39', $kzSteuer($zahllast))); if ($zahllast > 0.0) {
$ustva->appendChild($dom->createElement('Kz39', $kzSteuer($zahllast)));
}
return $dom->saveXML(); return $dom->saveXML();
} }

View file

@ -0,0 +1,36 @@
<?php
declare(strict_types=1);
use Steuerkram\Services\ElsterXmlService;
class ElsterXmlKz39Test extends TestCase
{
protected string $testName = 'Test 13: UStVA XML – Kz39 Vorzeichen-Validierung';
public function run(): void
{
$service = new ElsterXmlService();
// Fall 1: Zahllast positiv → Kz39 muss vorhanden und positiv sein
$kzZahllast = ['69' => ['steuer' => 150.00]];
$xml = $service->generate(2026, 1, $kzZahllast);
$this->assert(str_contains($xml, '<Kz39>'), 'Kz39 bei Zahllast vorhanden');
$this->assert(str_contains($xml, '<Kz39>150.00</Kz39>'), 'Kz39 ohne Vorzeichen bei Zahllast');
// Fall 2: Erstattung (negativ) → Kz39 darf nicht vorkommen
$kzErstattung = ['69' => ['steuer' => -50.00]];
$xml = $service->generate(2026, 1, $kzErstattung);
$this->assert(!str_contains($xml, '<Kz39>'), 'Kz39 bei Erstattung nicht vorhanden');
// Fall 3: Zahllast = 0 → Kz39 weglassen
$kzNull = ['69' => ['steuer' => 0.0]];
$xml = $service->generate(2026, 1, $kzNull);
$this->assert(!str_contains($xml, '<Kz39>'), 'Kz39 bei Nullbetrag nicht vorhanden');
// Fall 4: XML ist valides XML
$doc = new \DOMDocument();
$loaded = @$doc->loadXML($xml);
$this->assert($loaded !== false, 'Generiertes XML ist wohlgeformt');
}
}