From e918846140653cd6671d57dbb7395efcc016f10b Mon Sep 17 00:00:00 2001 From: sbejaoui Date: Tue, 22 Oct 2024 13:19:23 +0200 Subject: [PATCH] [IMP] rma: custom route for replace action This commit adds a new field, rma_out_replace_route_id, to the warehouse. If this field is set, it specifies a custom route to be used for RMA replacement actions, allowing separation of RMA replacement orders from regular deliveries. If the field is not set, the default delivery route will be used. --- rma/models/rma.py | 5 ++- rma/models/stock_warehouse.py | 1 + rma/tests/test_rma.py | 65 +++++++++++++++++++++++++++++ rma/views/stock_warehouse_views.xml | 4 ++ 4 files changed, 73 insertions(+), 2 deletions(-) diff --git a/rma/models/rma.py b/rma/models/rma.py index 5921848e9..1bf2d3999 100644 --- a/rma/models/rma.py +++ b/rma/models/rma.py @@ -1193,10 +1193,11 @@ def create_return(self, scheduled_date, qty=None, uom=None): rmas_to_return.write({"state": "waiting_return"}) def _prepare_replace_procurement_vals(self, warehouse=None, scheduled_date=None): - """This method is used only for Replace (not Delivery). We do not use any - specific route here.""" + """This method is used only for Replace (not Delivery).""" vals = self._prepare_common_procurement_vals(warehouse, scheduled_date) vals["rma_id"] = self.id + if self.warehouse_id.rma_out_replace_route_id: + vals["route_ids"] = self.warehouse_id.rma_out_replace_route_id return vals def _prepare_replace_procurements( diff --git a/rma/models/stock_warehouse.py b/rma/models/stock_warehouse.py index 79ad9dbfa..0c249a3b1 100644 --- a/rma/models/stock_warehouse.py +++ b/rma/models/stock_warehouse.py @@ -30,6 +30,7 @@ class StockWarehouse(models.Model): ) rma_in_route_id = fields.Many2one("stock.route", "RMA in Route") rma_out_route_id = fields.Many2one("stock.route", "RMA out Route") + rma_out_replace_route_id = fields.Many2one("stock.route", "RMA out Route") def _get_rma_location_values(self, vals, code=False): """this method is intended to be used by 'create' method diff --git a/rma/tests/test_rma.py b/rma/tests/test_rma.py index 7b798fcb8..337068a88 100644 --- a/rma/tests/test_rma.py +++ b/rma/tests/test_rma.py @@ -2,6 +2,7 @@ # Copyright 2023 Michael Tietz (MT Software) # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import Command from odoo.exceptions import UserError, ValidationError from odoo.tests import Form, TransactionCase, new_test_user, users from odoo.tools import mute_logger @@ -848,3 +849,67 @@ def test_autoconfirm_email(self): ) self.assertTrue(rma.name in mail_receipt.subject) self.assertTrue("products received" in mail_receipt.subject) + + def _test_receive_and_replace(self): + rma = self._create_confirm_receive(self.partner, self.product, 10, self.rma_loc) + delivery_form = Form( + self.env["rma.delivery.wizard"].with_context( + active_ids=rma.ids, + rma_delivery_type="replace", + ) + ) + delivery_form.product_id = rma.product_id + delivery_form.product_uom_qty = 2 + delivery_wizard = delivery_form.save() + delivery_wizard.action_deliver() + return rma + + def test_replace_picking_type(self): + """ + Test that by default, the replace operation uses the default delivery route, + meaning the warehouse's default delivery picking type is applied. + + RMA replacement orders are not separated from regular deliveries, and both use + the same picking type. + """ + rma = self._test_receive_and_replace() + rma_in_type = self.warehouse.rma_in_type_id + out_type = self.warehouse.out_type_id + self.assertEqual(rma.reception_move_id.picking_type_id, rma_in_type) + self.assertEqual(rma.delivery_move_ids.picking_type_id, out_type) + + def test_replace_picking_type_custom_picking_type(self): + """ + Test that when configured to use a custom route, the replace operation uses a + custom picking type, separating RMA replacement orders from regular deliveries. + + The custom picking type is applied specifically for RMA replacements, instead + of the default delivery picking type. + """ + rma_in_type = self.warehouse.rma_in_type_id + rma_out_type = self.warehouse.rma_out_type_id + route = self.env["stock.route"].create( + { + "name": "RMA OUT replace", + "active": True, + "sequence": 100, + "product_selectable": True, + "rule_ids": [ + Command.create( + { + "name": "RMA OUT", + "action": "pull", + "picking_type_id": rma_out_type.id, + "location_src_id": self.warehouse.lot_stock_id.id, + "location_dest_id": self.env.ref( + "stock.stock_location_customers" + ).id, + }, + ) + ], + } + ) + self.warehouse.rma_out_replace_route_id = route + rma = self._test_receive_and_replace() + self.assertEqual(rma.reception_move_id.picking_type_id, rma_in_type) + self.assertEqual(rma.delivery_move_ids.picking_type_id, rma_out_type) diff --git a/rma/views/stock_warehouse_views.xml b/rma/views/stock_warehouse_views.xml index 238f61981..f94dbb915 100644 --- a/rma/views/stock_warehouse_views.xml +++ b/rma/views/stock_warehouse_views.xml @@ -11,6 +11,10 @@ +