From 90effa89070638deed33f3fa798ffd41fa2ada2c Mon Sep 17 00:00:00 2001 From: Thierry Ducrest Date: Tue, 23 Apr 2024 10:52:04 +0200 Subject: [PATCH 1/2] shipment_advice: do not copy shipment advice id on moves In the case of partially receiving goods, the backorder moves created should not be included in the shipment advice being processed. But it probably makes sense for outgoing move as well. --- shipment_advice/models/stock_move.py | 1 + shipment_advice/models/stock_move_line.py | 1 + shipment_advice/tests/test_shipment_advice.py | 20 +++++++++++++++++++ 3 files changed, 22 insertions(+) diff --git a/shipment_advice/models/stock_move.py b/shipment_advice/models/stock_move.py index 0fe033d64..ae321bce6 100644 --- a/shipment_advice/models/stock_move.py +++ b/shipment_advice/models/stock_move.py @@ -12,6 +12,7 @@ class StockMove(models.Model): ondelete="set null", string="Planned shipment", index=True, + copy=False, ) def _plan_in_shipment(self, shipment_advice): diff --git a/shipment_advice/models/stock_move_line.py b/shipment_advice/models/stock_move_line.py index c189f5c40..8f6a1d0ff 100644 --- a/shipment_advice/models/stock_move_line.py +++ b/shipment_advice/models/stock_move_line.py @@ -13,6 +13,7 @@ class StockMoveLine(models.Model): ondelete="set null", string="Shipment advice", index=True, + copy=False, ) def button_load_in_shipment(self): diff --git a/shipment_advice/tests/test_shipment_advice.py b/shipment_advice/tests/test_shipment_advice.py index 6e6ad581e..5b3a42a2c 100644 --- a/shipment_advice/tests/test_shipment_advice.py +++ b/shipment_advice/tests/test_shipment_advice.py @@ -246,3 +246,23 @@ def test_shipment_advice_draft(self): def test_shipment_name(self): self.assertTrue("OUT" in self.shipment_advice_out.name) self.assertTrue("IN" in self.shipment_advice_in.name) + + def test_shipment_advice_receive_partial_move_backorder(self): + picking = self.move_product_in1.picking_id + # Plan a move + self._plan_records_in_shipment(self.shipment_advice_in, self.move_product_in1) + self._in_progress_shipment_advice(self.shipment_advice_in) + # Partially receive the move and create a backorder + for ml in self.move_product_in1.move_line_ids: + ml.qty_done = ml.product_uom_qty - 2 + wizard = ( + self.env["stock.backorder.confirmation"] + .with_context(button_validate_picking_ids=picking.ids) + .create({"pick_ids": [(6, 0, picking.ids)]}) + ) + wizard.process() + # New move created should not be included in the processing shipment + backorder_picking = self.env["stock.picking"].search( + [("backorder_id", "=", picking.id)] + ) + self.assertFalse(backorder_picking.move_lines.shipment_advice_id) From 5a708af8e7e178cfd12ffec42a5829eee521ceca Mon Sep 17 00:00:00 2001 From: Thierry Ducrest Date: Thu, 11 Jul 2024 16:24:45 +0200 Subject: [PATCH 2/2] fixup! shipment_advice: do not copy shipment advice id on moves --- shipment_advice/models/stock_move.py | 6 ++++++ shipment_advice/tests/test_shipment_advice.py | 14 ++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/shipment_advice/models/stock_move.py b/shipment_advice/models/stock_move.py index ae321bce6..785ede2cc 100644 --- a/shipment_advice/models/stock_move.py +++ b/shipment_advice/models/stock_move.py @@ -24,3 +24,9 @@ def _prepare_merge_moves_distinct_fields(self): # Avoid having stock move assign to different shipment merged together res.append("shipment_advice_id") return res + + def _prepare_move_split_vals(self, qty): + vals = super()._prepare_move_split_vals(qty) + if self.env.context.get("shipment_advice__propagate_on_split"): + vals.update(shipment_advice_id=self.shipment_advice_id.id) + return vals diff --git a/shipment_advice/tests/test_shipment_advice.py b/shipment_advice/tests/test_shipment_advice.py index 5b3a42a2c..3070de992 100644 --- a/shipment_advice/tests/test_shipment_advice.py +++ b/shipment_advice/tests/test_shipment_advice.py @@ -266,3 +266,17 @@ def test_shipment_advice_receive_partial_move_backorder(self): [("backorder_id", "=", picking.id)] ) self.assertFalse(backorder_picking.move_lines.shipment_advice_id) + + def test_move_split_propagation(self): + """Check the use of conext key to propagate the shipment id on move split.""" + move = self.move_product_in1 + self._plan_records_in_shipment(self.shipment_advice_in, move) + self.assertTrue(move.shipment_advice_id) + # Without the context key the shipment advice id is not copied + vals = move._prepare_move_split_vals(1) + self.assertTrue("shipemnt_advice_id" not in vals.keys()) + # But it is with the context key + vals = move.with_context( + shipment_advice__propagate_on_split=True + )._prepare_move_split_vals(1) + self.assertTrue("shipment_advice_id" in vals.keys())