diff --git a/rma/README.rst b/rma/README.rst index f43c6f11f..d9b6b8755 100644 --- a/rma/README.rst +++ b/rma/README.rst @@ -169,6 +169,8 @@ Contributors * Chafique Delli * Giovanni Serra - Ooops * Michael Tietz (MT Software) +* Jacques-Etienne Baudoux - BCIM +* Souheil Bejaoui - ACSONE SA/NV Maintainers ~~~~~~~~~~~ diff --git a/rma/models/rma.py b/rma/models/rma.py index 0de169031..5921848e9 100644 --- a/rma/models/rma.py +++ b/rma/models/rma.py @@ -920,6 +920,7 @@ def _ensure_required_fields(self): "partner_invoice_id", "product_id", "location_id", + "operation_id", ] for record in self: desc = "" diff --git a/rma/readme/CONTRIBUTORS.rst b/rma/readme/CONTRIBUTORS.rst index 1ebe5ca2f..21e0d7f16 100644 --- a/rma/readme/CONTRIBUTORS.rst +++ b/rma/readme/CONTRIBUTORS.rst @@ -8,3 +8,5 @@ * Chafique Delli * Giovanni Serra - Ooops * Michael Tietz (MT Software) +* Jacques-Etienne Baudoux - BCIM +* Souheil Bejaoui - ACSONE SA/NV \ No newline at end of file diff --git a/rma/static/description/index.html b/rma/static/description/index.html index 2310ba56a..71d29ba6e 100644 --- a/rma/static/description/index.html +++ b/rma/static/description/index.html @@ -522,6 +522,8 @@

Contributors

  • Chafique Delli <chafique.delli@akretion.com>
  • Giovanni Serra - Ooops <giovanni@ooops404.com>
  • Michael Tietz (MT Software) <mtietz@mt-software.de>
  • +
  • Jacques-Etienne Baudoux - BCIM <je@bcim.be>
  • +
  • Souheil Bejaoui - ACSONE SA/NV <souheil.bejaoui@acsone.eu>
  • diff --git a/rma/tests/test_rma.py b/rma/tests/test_rma.py index 882e9a372..7b798fcb8 100644 --- a/rma/tests/test_rma.py +++ b/rma/tests/test_rma.py @@ -79,8 +79,11 @@ def setUpClass(cls): cls.warehouse = cls.env.ref("stock.warehouse0") # Ensure grouping cls.env.company.rma_return_grouping = True + cls.operation = cls.env.ref("rma.rma_operation_replace") - def _create_rma(self, partner=None, product=None, qty=None, location=None): + def _create_rma( + self, partner=None, product=None, qty=None, location=None, operation=None + ): vals = {} if partner: vals["partner_id"] = partner.id @@ -90,12 +93,16 @@ def _create_rma(self, partner=None, product=None, qty=None, location=None): vals["product_uom_qty"] = qty if location: vals["location_id"] = location.id + if operation: + vals["operation_id"] = operation.id + elif operation is None: + vals["operation_id"] = self.operation.id return self.env["rma"].create(vals) def _create_confirm_receive( - self, partner=None, product=None, qty=None, location=None + self, partner=None, product=None, qty=None, location=None, operation=None ): - rma = self._create_rma(partner, product, qty, location) + rma = self._create_rma(partner, product, qty, location, operation) rma.action_confirm() rma.reception_move_id.quantity_done = rma.product_uom_qty rma.reception_move_id.picking_id._action_done() @@ -227,19 +234,26 @@ def test_computed(self): self.assertEqual(rma.product_uom, self.product.uom_id) def test_ensure_required_fields_on_confirm(self): - rma = self._create_rma() + rma = self._create_rma(operation=False) with self.assertRaises(ValidationError) as e: rma.action_confirm() self.assertEqual( e.exception.args[0], - "Required field(s):\nCustomer\nShipping Address\nInvoice Address\nProduct", + "Required field(s):\nCustomer\nShipping Address\nInvoice Address\nProduct" + "\nRequested operation", ) rma.partner_id = self.partner.id with self.assertRaises(ValidationError) as e: rma.action_confirm() - self.assertEqual(e.exception.args[0], "Required field(s):\nProduct") + self.assertEqual( + e.exception.args[0], "Required field(s):\nProduct\nRequested operation" + ) rma.product_id = self.product.id rma.location_id = self.rma_loc.id + with self.assertRaises(ValidationError) as e: + rma.action_confirm() + self.assertEqual(e.exception.args[0], "Required field(s):\nRequested operation") + rma.operation_id = self.operation rma.action_confirm() self.assertEqual(rma.state, "confirmed") @@ -687,6 +701,7 @@ def test_rma_from_picking_return(self): ) ) stock_return_picking_form.create_rma = True + stock_return_picking_form.rma_operation_id = self.operation return_wizard = stock_return_picking_form.save() picking_action = return_wizard.create_returns() # Each origin move is linked to a different RMA @@ -715,6 +730,7 @@ def test_split(self): rma_form.move_id = origin_delivery.move_ids.filtered( lambda r: r.product_id == self.product ) + rma_form.operation_id = self.operation rma = rma_form.save() rma.action_confirm() rma.reception_move_id.quantity_done = 10 diff --git a/rma/wizard/stock_picking_return.py b/rma/wizard/stock_picking_return.py index 7c7ca3649..3bed8265a 100644 --- a/rma/wizard/stock_picking_return.py +++ b/rma/wizard/stock_picking_return.py @@ -11,6 +11,20 @@ class ReturnPickingLine(models.TransientModel): _inherit = "stock.return.picking.line" + rma_operation_id = fields.Many2one( + comodel_name="rma.operation", + string="Operation", + compute="_compute_rma_operation_id", + store=True, + readonly=False, + ) + + @api.depends("wizard_id.rma_operation_id") + def _compute_rma_operation_id(self): + for rec in self: + if rec.wizard_id.rma_operation_id: + rec.rma_operation_id = rec.wizard_id.rma_operation_id + def _prepare_rma_vals(self): self.ensure_one() return { @@ -19,6 +33,7 @@ def _prepare_rma_vals(self): "product_uom_qty": self.quantity, "product_uom": self.product_id.uom_id.id, "location_id": self.wizard_id.location_id.id or self.move_id.location_id.id, + "operation_id": self.rma_operation_id.id, } @@ -30,6 +45,10 @@ class ReturnPicking(models.TransientModel): rma_location_ids = fields.Many2many( comodel_name="stock.location", compute="_compute_rma_location_id" ) + rma_operation_id = fields.Many2one( + comodel_name="rma.operation", + string="Requested operation", + ) # Expand domain for RMAs location_id = fields.Many2one( domain="create_rma and [('id', 'child_of', rma_location_ids)]" diff --git a/rma/wizard/stock_picking_return_views.xml b/rma/wizard/stock_picking_return_views.xml index 9a3a10b03..ce127da35 100644 --- a/rma/wizard/stock_picking_return_views.xml +++ b/rma/wizard/stock_picking_return_views.xml @@ -8,12 +8,22 @@ stock.return.picking - + + + + + diff --git a/rma_sale/tests/test_rma_sale.py b/rma_sale/tests/test_rma_sale.py index f295d3ac8..532230d1d 100644 --- a/rma_sale/tests/test_rma_sale.py +++ b/rma_sale/tests/test_rma_sale.py @@ -26,6 +26,7 @@ def setUpClass(cls): ) cls.report_model = cls.env["ir.actions.report"] cls.rma_operation_model = cls.env["rma.operation"] + cls.operation = cls.env.ref("rma.rma_operation_replace") cls._partner_portal_wizard(cls, cls.partner) def _create_sale_order(self, products): @@ -47,7 +48,9 @@ def _partner_portal_wizard(self, partner): def _rma_sale_wizard(self, order): wizard_id = order.action_create_rma()["res_id"] - return self.env["sale.order.rma.wizard"].browse(wizard_id) + wizard = self.env["sale.order.rma.wizard"].browse(wizard_id) + wizard.operation_id = self.operation + return wizard class TestRmaSale(TestRmaSaleBase): @@ -95,6 +98,7 @@ def test_create_rma_with_so(self): "product_id": self.product_1.id, "product_uom_qty": 5, "location_id": self.sale_order.warehouse_id.rma_loc_id.id, + "operation_id": self.operation.id, } rma = self.env["rma"].create(rma_vals) rma.action_confirm() diff --git a/rma_sale/wizard/sale_order_rma_wizard.py b/rma_sale/wizard/sale_order_rma_wizard.py index b976f4450..60146c84f 100644 --- a/rma_sale/wizard/sale_order_rma_wizard.py +++ b/rma_sale/wizard/sale_order_rma_wizard.py @@ -18,6 +18,10 @@ def _domain_location_id(self): ) return [("id", "child_of", rma_loc.ids)] + operation_id = fields.Many2one( + comodel_name="rma.operation", + string="Requested operation", + ) order_id = fields.Many2one( comodel_name="sale.order", default=lambda self: self.env.context.get("active_id", False), @@ -145,12 +149,21 @@ class SaleOrderLineRmaWizard(models.TransientModel): operation_id = fields.Many2one( comodel_name="rma.operation", string="Requested operation", + compute="_compute_operation_id", + store=True, + readonly=False, ) sale_line_id = fields.Many2one( comodel_name="sale.order.line", ) description = fields.Text() + @api.depends("wizard_id.operation_id") + def _compute_operation_id(self): + for rec in self: + if rec.wizard_id.operation_id: + rec.operation_id = rec.wizard_id.operation_id + @api.onchange("product_id") def onchange_product_id(self): self.picking_id = False diff --git a/rma_sale/wizard/sale_order_rma_wizard_views.xml b/rma_sale/wizard/sale_order_rma_wizard_views.xml index 078799419..24e0f0cb4 100644 --- a/rma_sale/wizard/sale_order_rma_wizard_views.xml +++ b/rma_sale/wizard/sale_order_rma_wizard_views.xml @@ -12,6 +12,7 @@
    + @@ -30,7 +31,10 @@ options="{'no_create': True}" required="1" /> - + diff --git a/rma_sale_mrp/tests/test_rma_sale_mrp.py b/rma_sale_mrp/tests/test_rma_sale_mrp.py index 5eae3df92..2276860d5 100644 --- a/rma_sale_mrp/tests/test_rma_sale_mrp.py +++ b/rma_sale_mrp/tests/test_rma_sale_mrp.py @@ -128,14 +128,12 @@ def test_create_rma_from_so(self): self.assertEqual(rma.refund_id.invoice_line_ids.product_id, self.product_kit) rma.refund_id.action_post() # We can still return another kit - wizard_id = order.action_create_rma()["res_id"] - wizard = self.env["sale.order.rma.wizard"].browse(wizard_id) + wizard = self._rma_sale_wizard(order) self.assertEqual(wizard.line_ids.quantity, 1) wizard.create_and_open_rma() # Now we open the wizard again and try to force the RMA qty wich should # be 0 at this time - wizard_id = order.action_create_rma()["res_id"] - wizard = self.env["sale.order.rma.wizard"].browse(wizard_id) + wizard = self._rma_sale_wizard(order) self.assertEqual(wizard.line_ids.quantity, 0) wizard.line_ids.quantity = 1 with self.assertRaises(ValidationError):