[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.
This commit is contained in:
Joan Sisquella
2023-05-25 17:53:49 +02:00
committed by Aaron ForgeFlow
parent 1e5c97c626
commit fad3ab7a79
2 changed files with 23 additions and 2 deletions

View File

@@ -671,7 +671,9 @@ class TestRma(common.SavepointCase):
wizard._create_picking() wizard._create_picking()
res = self.rma_supplier_id.rma_line_ids.action_view_out_shipments() res = self.rma_supplier_id.rma_line_ids.action_view_out_shipments()
self.assertTrue("res_id" in res, "Incorrect number of pickings" "created") 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 moves = picking.move_lines
self.assertEquals(len(moves), 3, "Incorrect number of moves created") 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"]) pickings = self.env["stock.picking"].browse(res["res_id"])
self.assertEquals(len(pickings), 1, "Incorrect number of pickings created") self.assertEquals(len(pickings), 1, "Incorrect number of pickings created")
picking_in = pickings[0] picking_in = pickings[0]
partner = picking_in.partner_id
self.assertTrue(partner, "Partner is not defined or False")
moves = picking_in.move_lines moves = picking_in.move_lines
self.assertEquals(len(moves), 3, "Incorrect number of moves created") self.assertEquals(len(moves), 3, "Incorrect number of moves created")
@@ -928,3 +932,20 @@ class TestRma(common.SavepointCase):
).create({}) ).create({})
with self.assertRaisesRegex(ValidationError, "No quantity to transfer"): with self.assertRaisesRegex(ValidationError, "No quantity to transfer"):
wizard._create_picking() 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")

View File

@@ -123,7 +123,7 @@ class RmaMakePicking(models.TransientModel):
procurement_data = { procurement_data = {
"name": line.rma_id and line.rma_id.name or line.name, "name": line.rma_id and line.rma_id.name or line.name,
"group_id": group, "group_id": group,
"origin": line.name, "origin": group and group.name or line.name,
"warehouse_id": warehouse, "warehouse_id": warehouse,
"date_planned": time.strftime(DT_FORMAT), "date_planned": time.strftime(DT_FORMAT),
"product_id": item.product_id, "product_id": item.product_id,