diff --git a/VERSION b/VERSION index f7fb770..1e71de9 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.3.28 +2.3.29 diff --git a/app/modules/invoice_error_finder/services/economic_import_service.py b/app/modules/invoice_error_finder/services/economic_import_service.py index 7270eb5..a67cabc 100644 --- a/app/modules/invoice_error_finder/services/economic_import_service.py +++ b/app/modules/invoice_error_finder/services/economic_import_service.py @@ -215,10 +215,10 @@ class EconomicImportService: self._safe_str(product.get("productNumber"), 100), self._safe_str(product.get("name"), 500), line.get("description"), - self._parse_amount(line.get("quantity")), - self._parse_amount(line.get("unitNetPrice")), - self._parse_amount(line.get("totalNetAmount")), - self._parse_amount(line.get("discountPercentage")), + self._parse_amount(line.get("quantity"), default=0.0), + self._parse_amount(line.get("unitNetPrice"), default=0.0), + self._parse_amount(line.get("totalNetAmount"), default=0.0), + self._parse_amount(line.get("discountPercentage"), default=0.0), json.dumps(line, ensure_ascii=False, default=str), ), ) @@ -274,13 +274,13 @@ class EconomicImportService: return None @staticmethod - def _parse_amount(value: Any) -> Optional[float]: + def _parse_amount(value: Any, default: Optional[float] = None) -> Optional[float]: if value is None or value == "": - return None + return default try: return float(value) except (TypeError, ValueError): - return None + return default @staticmethod def _safe_str(value: Any, max_length: int) -> Optional[str]: diff --git a/tests/test_invoice_error_finder.py b/tests/test_invoice_error_finder.py index 5d8a30e..0c82ee8 100644 --- a/tests/test_invoice_error_finder.py +++ b/tests/test_invoice_error_finder.py @@ -74,6 +74,43 @@ def test_economic_import_service_persists_valid_json(monkeypatch): assert json.loads(captured["invoice_raw"])["bookedInvoiceNumber"] == 123 +def test_economic_import_service_defaults_missing_line_amounts(monkeypatch): + from app.modules.invoice_error_finder.services.economic_import_service import EconomicImportService + + captured = [] + + def fake_execute_query(query, params=None): + if "INSERT INTO invoice_error_finder_economic_invoice_lines" in query: + captured.append(params) + return [] + + monkeypatch.setattr( + "app.modules.invoice_error_finder.services.economic_import_service.execute_query", + fake_execute_query, + ) + + service = EconomicImportService() + service._persist_lines( + 99, + [ + { + "lineNumber": 1, + "description": "Mobilnummer", + "quantity": None, + "unitNetPrice": None, + "totalNetAmount": None, + "discountPercentage": None, + } + ], + ) + + assert len(captured) == 1 + assert captured[0][5] == 0.0 + assert captured[0][6] == 0.0 + assert captured[0][7] == 0.0 + assert captured[0][8] == 0.0 + + def test_detection_service_keeps_customers_without_subscriptions(monkeypatch): from app.modules.invoice_error_finder.services.detection_service import DetectionService