From bd5f1bc0e0765732703f1e654963af1342ce94c5 Mon Sep 17 00:00:00 2001
From: duongtq
Date: Thu, 23 May 2024 17:11:17 +0700
Subject: [PATCH] [IMP] sale_order_import: push errored lines to chatter and
ignore them when importing
---
sale_order_import/tests/test_order_import.py | 35 +++++++++++++++++++
sale_order_import/wizard/sale_order_import.py | 32 ++++++++++++-----
2 files changed, 58 insertions(+), 9 deletions(-)
diff --git a/sale_order_import/tests/test_order_import.py b/sale_order_import/tests/test_order_import.py
index 7df861200c..d44b58f775 100644
--- a/sale_order_import/tests/test_order_import.py
+++ b/sale_order_import/tests/test_order_import.py
@@ -87,6 +87,41 @@ def test_order_import(self):
parsed_order_up_no_price_unit, order, "order"
)
+ def test_order_import_log_errored_line(self):
+ parsed_order = dict(
+ self.parsed_order,
+ partner={"email": "agrolait@yourcompany.example.com"},
+ lines=[
+ {
+ "product": {"code": "errored"}, # No product exists with this code
+ "qty": 3,
+ "uom": {"unece_code": "C62"},
+ "price_unit": 12.42,
+ },
+ {
+ "product": {"code": "FURN_9999"},
+ "qty": 1,
+ "uom": {"unece_code": "C62"},
+ "price_unit": 1.42,
+ },
+ ],
+ )
+ order = self.wiz_model.create_order(parsed_order, "pricelist")
+ self.assertEqual(order.client_order_ref, parsed_order["order_ref"])
+ self.assertEqual(len(order.order_line), 1)
+ self.assertEqual(
+ order.order_line.product_id.default_code,
+ parsed_order["lines"][1]["product"]["code"],
+ )
+ msg = (
+ "Errored lines on import:
"
+ + "{'product': {'code': 'errored'}, 'qty': 3, 'uom':"
+ + " {'unece_code': 'C62'}, 'price_unit': 12.42}"
+ + "
- Odoo couldn't find any product corresponding to the"
+ + " following information extracted from the business document"
+ )
+ self.assertTrue(order.message_ids.filtered(lambda m: msg in m.body))
+
def test_order_import_default_so_vals(self):
default = {"client_order_ref": "OVERRIDE"}
order = self.wiz_model.with_context(
diff --git a/sale_order_import/wizard/sale_order_import.py b/sale_order_import/wizard/sale_order_import.py
index 1192244204..8b851ff3b7 100644
--- a/sale_order_import/wizard/sale_order_import.py
+++ b/sale_order_import/wizard/sale_order_import.py
@@ -263,16 +263,30 @@ def _prepare_order(self, parsed_order, price_source):
so_vals["partner_invoice_id"] = invoicing_partner.id
if parsed_order.get("date"):
so_vals["date_order"] = parsed_order["date"]
+
+ errored_line = []
for line in parsed_order["lines"]:
- # partner=False because we don't want to use product.supplierinfo
- product = bdio._match_product(
- line["product"], parsed_order["chatter_msg"], seller=False
- )
- uom = bdio._match_uom(line.get("uom"), parsed_order["chatter_msg"], product)
- line_vals = self._prepare_create_order_line(
- product, uom, so_vals, line, price_source
- )
- so_vals["order_line"].append((0, 0, line_vals))
+ try:
+ # partner=False because we don't want to use product.supplierinfo
+ product = bdio._match_product(
+ line["product"], parsed_order["chatter_msg"], seller=False
+ )
+ uom = bdio._match_uom(
+ line.get("uom"), parsed_order["chatter_msg"], product
+ )
+ line_vals = self._prepare_create_order_line(
+ product, uom, so_vals, line, price_source
+ )
+ so_vals["order_line"].append((0, 0, line_vals))
+ except UserError as exc:
+ errored_line.append(str(line) + f"")
+
+ # Push to the chatter all errored lines if any
+ if errored_line:
+ msg = _("Errored lines on import:
")
+ errored_line.insert(0, msg)
+ errored_line_str = "".join(errored_line)
+ parsed_order["chatter_msg"].append(errored_line_str)
defaults = self.env.context.get("sale_order_import__default_vals", {}).get(
"order", {}