From fad3ab7a7933d68246e49fa23e64a633210f91db Mon Sep 17 00:00:00 2001 From: Joan Sisquella Date: Thu, 25 May 2023 17:53:49 +0200 Subject: [PATCH] [FIX] rma: procurement origin In the current implementation of Odoo's _assign_picking() method in stock.move, there's a conditional check that looks at whether all the moves associated with a picking have the same partner_id and origin. If any move doesn't align with these conditions, the origin of the picking is set to False. if any(picking.partner_id.id != m.partner_id.id or picking.origin != m.origin for m in moves): # If a picking is found, we'll append `move` to its move list and thus its # `partner_id` and `ref` field will refer to multiple records. In this # case, we chose to wipe them. picking.write({ 'partner_id': False, 'origin': False, }) In the context of RMA when we have multiple moves associated with a picking, each coming from a different RMA order line, we encounter a problem. Each move has its origin set as the name of the RMA orde line (line.name), so as soon as a second move from a different line is appended to the picking, the origin of the picking is wiped, because it doesn't match the origin of the first move. In order to prevent the partner_id of the picking from being set to False when there are multiple associated moves, I propose that we change the origin of the procurement from the name of the RMA line to the name of the procurement group (group.name). This way, all moves associated with a picking will share the same origin, preserving the origin of the picking and ensuring it doesn't get inadvertently set to False. --- rma/tests/test_rma.py | 23 ++++++++++++++++++++++- rma/wizards/rma_make_picking.py | 2 +- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/rma/tests/test_rma.py b/rma/tests/test_rma.py index 6b9883f5..a923d291 100644 --- a/rma/tests/test_rma.py +++ b/rma/tests/test_rma.py @@ -671,7 +671,9 @@ class TestRma(common.SavepointCase): wizard._create_picking() res = self.rma_supplier_id.rma_line_ids.action_view_out_shipments() self.assertTrue("res_id" in res, "Incorrect number of pickings" "created") - picking = self.env["stock.picking"].browse(res["res_id"]) + picking = self.rma_supplier_id.rma_line_ids._get_out_pickings() + partner = picking.partner_id + self.assertTrue(partner, "Partner is not defined or False") moves = picking.move_lines self.assertEquals(len(moves), 3, "Incorrect number of moves created") @@ -791,6 +793,8 @@ class TestRma(common.SavepointCase): pickings = self.env["stock.picking"].browse(res["res_id"]) self.assertEquals(len(pickings), 1, "Incorrect number of pickings created") picking_in = pickings[0] + partner = picking_in.partner_id + self.assertTrue(partner, "Partner is not defined or False") moves = picking_in.move_lines self.assertEquals(len(moves), 3, "Incorrect number of moves created") @@ -928,3 +932,20 @@ class TestRma(common.SavepointCase): ).create({}) with self.assertRaisesRegex(ValidationError, "No quantity to transfer"): wizard._create_picking() + + def test_09_supplier_rma_single_line(self): + rma_line_id = self.rma_supplier_id.rma_line_ids[0].id + wizard = self.rma_make_picking.with_context( + { + "active_ids": [rma_line_id], + "active_model": "rma.order.line", + "picking_type": "outgoing", + "active_id": 2, + } + ).create({}) + wizard._create_picking() + picking = self.rma_supplier_id.rma_line_ids[0]._get_out_pickings() + partner = picking.partner_id + self.assertTrue(partner, "Partner is not defined or False") + moves = picking.move_lines + self.assertEqual(len(moves), 1, "Incorrect number of moves created") diff --git a/rma/wizards/rma_make_picking.py b/rma/wizards/rma_make_picking.py index 337be30f..9520b6e4 100644 --- a/rma/wizards/rma_make_picking.py +++ b/rma/wizards/rma_make_picking.py @@ -123,7 +123,7 @@ class RmaMakePicking(models.TransientModel): procurement_data = { "name": line.rma_id and line.rma_id.name or line.name, "group_id": group, - "origin": line.name, + "origin": group and group.name or line.name, "warehouse_id": warehouse, "date_planned": time.strftime(DT_FORMAT), "product_id": item.product_id,