From 27f6d8bab7a35ed93cd9efa37959d3edc41c8499 Mon Sep 17 00:00:00 2001 From: dfuhrmann3 Date: Tue, 7 Jul 2026 16:35:19 +0200 Subject: [PATCH] fix(cii): format ZUGFeRD BilledQuantity like UBL (no trailing 1.0000) Ganze Mengen erscheinen als 1.00 statt 1.0000; gebrochene Mengen (z.B. 1.375 Tage) bleiben vollstaendig erhalten. Vereinheitlicht mit dem UBL-Generator. Co-Authored-By: Claude Opus 4.8 --- invoice_logic.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/invoice_logic.py b/invoice_logic.py index 960992c..cce428d 100644 --- a/invoice_logic.py +++ b/invoice_logic.py @@ -628,7 +628,13 @@ def generate_compliant_zugferd_cii(data): line_deliv = ET.SubElement(line_item, f"{{{RAM}}}SpecifiedLineTradeDelivery") u_code = map_unece_unit_code(item.get("unit", "Stk.")) - ET.SubElement(line_deliv, f"{{{RAM}}}BilledQuantity", {"unitCode": u_code}).text = f"{item['quantity']:.4f}" + # Menge identisch zum UBL-Generator formatieren: ganze Zahlen mit 2 Nachkommastellen + # (z.B. "1.00"), gebrochene Mengen nur mit den noetigen Stellen (z.B. "1.375") - so + # erscheinen Stueckzahlen nicht als "1.0000", ohne dass Nachkommastellen verloren gehen. + q_val = float(item.get("quantity") or 0.0) + qty_formatted = f"{q_val:.4f}".rstrip('0').rstrip('.') if not q_val.is_integer() else f"{q_val:.2f}" + if qty_formatted == "" or qty_formatted == "0": qty_formatted = "0.00" + ET.SubElement(line_deliv, f"{{{RAM}}}BilledQuantity", {"unitCode": u_code}).text = qty_formatted line_vat_rate = float(item.get("vat_rate_percent", data['vat_rate_percent'])) line_vat_category = "S" if line_vat_rate > 0.0 else "E"