diff --git a/src/Services/ElsterXmlService.php b/src/Services/ElsterXmlService.php index 01aefe3..d61f249 100644 --- a/src/Services/ElsterXmlService.php +++ b/src/Services/ElsterXmlService.php @@ -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); - $ustva->appendChild($dom->createElement('Kz39', $kzSteuer($zahllast))); + if ($zahllast > 0.0) { + $ustva->appendChild($dom->createElement('Kz39', $kzSteuer($zahllast))); + } return $dom->saveXML(); } diff --git a/tests/13_ElsterXmlKz39Test.php b/tests/13_ElsterXmlKz39Test.php new file mode 100644 index 0000000..1c4cfc5 --- /dev/null +++ b/tests/13_ElsterXmlKz39Test.php @@ -0,0 +1,36 @@ + ['steuer' => 150.00]]; + $xml = $service->generate(2026, 1, $kzZahllast); + $this->assert(str_contains($xml, ''), 'Kz39 bei Zahllast vorhanden'); + $this->assert(str_contains($xml, '150.00'), '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 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 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'); + } +}