From f8899d6bffff47179fc325ffd101c1cdf0464a27 Mon Sep 17 00:00:00 2001 From: fds2610 Date: Mon, 30 Mar 2026 21:06:09 +0200 Subject: [PATCH] Fix #17: Kz39 bei Erstattungsbetrag aus UStVA-XML weglassen --- src/Services/ElsterXmlService.php | 6 ++++-- tests/13_ElsterXmlKz39Test.php | 36 +++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 tests/13_ElsterXmlKz39Test.php 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'); + } +}