diff --git a/rma/models/rma_order.py b/rma/models/rma_order.py index 68d32bf89..6999e0060 100644 --- a/rma/models/rma_order.py +++ b/rma/models/rma_order.py @@ -120,12 +120,32 @@ def _default_warehouse_id(self): tracking=True, default=lambda self: self.env.uid, ) + in_route_id = fields.Many2one( + "stock.route", + string="Inbound Route", + domain=[("rma_selectable", "=", True)], + ) + out_route_id = fields.Many2one( + "stock.route", + string="Outbound Route", + domain=[("rma_selectable", "=", True)], + ) in_warehouse_id = fields.Many2one( comodel_name="stock.warehouse", string="Inbound Warehouse", - required=True, + required=False, + default=_default_warehouse_id, + ) + out_warehouse_id = fields.Many2one( + comodel_name="stock.warehouse", + string="Outbound Warehouse", + required=False, default=_default_warehouse_id, ) + location_id = fields.Many2one( + comodel_name="stock.location", + string="Send To This Company Location", + ) customer_to_supplier = fields.Boolean("The customer will send to the supplier") supplier_to_customer = fields.Boolean("The supplier will send to the customer") supplier_address_id = fields.Many2one( @@ -149,6 +169,26 @@ def _default_warehouse_id(self): default="draft", store=True, ) + operation_default_id = fields.Many2one( + comodel_name="rma.operation", + required=False, + string="Default Operation Type", + ) + + @api.onchange( + "operation_default_id", + ) + def _onchange_operation(self): + if self.operation_default_id: + self.in_warehouse_id = self.operation_default_id.in_warehouse_id + self.out_warehouse_id = self.operation_default_id.out_warehouse_id + self.location_id = ( + self.operation_default_id.location_id or self.in_warehouse_id.lot_rma_id + ) + self.customer_to_supplier = self.operation_default_id.customer_to_supplier + self.supplier_to_customer = self.operation_default_id.supplier_to_customer + self.in_route_id = self.operation_default_id.in_route_id + self.out_route_id = self.operation_default_id.out_route_id @api.constrains("partner_id", "rma_line_ids") def _check_partner_id(self): diff --git a/rma/models/rma_order_line.py b/rma/models/rma_order_line.py index 7b8b6c2a1..b32439070 100644 --- a/rma/models/rma_order_line.py +++ b/rma/models/rma_order_line.py @@ -732,13 +732,25 @@ def _onchange_operation_id(self): return result self.receipt_policy = self.operation_id.receipt_policy self.delivery_policy = self.operation_id.delivery_policy - self.in_warehouse_id = self.operation_id.in_warehouse_id - self.out_warehouse_id = self.operation_id.out_warehouse_id + self.customer_to_supplier = ( + self.rma_id.customer_to_supplier or self.operation_id.customer_to_supplier + ) + self.supplier_to_customer = ( + self.rma_id.supplier_to_customer or self.operation_id.supplier_to_customer + ) + self.in_warehouse_id = ( + self.rma_id.in_warehouse_id or self.operation_id.in_warehouse_id + ) + self.out_warehouse_id = ( + self.rma_id.out_warehouse_id or self.operation_id.out_warehouse_id + ) self.location_id = ( - self.operation_id.location_id or self.in_warehouse_id.lot_rma_id + self.rma_id.location_id + or self.operation_id.location_id + or self.in_warehouse_id.lot_rma_id ) - self.customer_to_supplier = self.operation_id.customer_to_supplier - self.supplier_to_customer = self.operation_id.supplier_to_customer + self.in_route_id = self.rma_id.in_route_id or self.operation_id.in_route_id + self.out_route_id = self.rma_id.out_route_id or self.operation_id.out_route_id return result @api.depends("operation_id") diff --git a/rma/views/rma_order_view.xml b/rma/views/rma_order_view.xml index b58047cec..7a042423c 100644 --- a/rma/views/rma_order_view.xml +++ b/rma/views/rma_order_view.xml @@ -117,10 +117,32 @@ + + + + + + [('type','=','supplier')] + + + 1 + + + 1 + + + 0 + + + 0 + diff --git a/rma/wizards/rma_add_serial.py b/rma/wizards/rma_add_serial.py index d802ea31f..043617cd1 100644 --- a/rma/wizards/rma_add_serial.py +++ b/rma/wizards/rma_add_serial.py @@ -58,16 +58,18 @@ def onchange_partner_id(self): ) def _prepare_rma_line_from_lot_vals(self, lot): - if self.env.context.get("customer"): - operation = ( - lot.product_id.rma_customer_operation_id - or lot.product_id.categ_id.rma_customer_operation_id - ) - else: - operation = ( - lot.product_id.rma_supplier_operation_id - or lot.product_id.categ_id.rma_supplier_operation_id - ) + operation = self.rma_id.operation_default_id + if not operation: + if self.env.context.get("customer"): + operation = ( + lot.product_id.rma_customer_operation_id + or lot.product_id.categ_id.rma_customer_operation_id + ) + else: + operation = ( + lot.product_id.rma_supplier_operation_id + or lot.product_id.categ_id.rma_supplier_operation_id + ) if not operation: operation = self.env["rma.operation"].search( [("type", "=", self.rma_id.type)], limit=1 @@ -82,7 +84,11 @@ def _prepare_rma_line_from_lot_vals(self, lot): if not route: raise ValidationError(_("Please define an RMA route")) - if not operation.in_warehouse_id or not operation.out_warehouse_id: + in_warehouse = self.rma_id.in_warehouse_id or operation.in_warehouse_id + in_route = self.rma_id.in_route_id or operation.in_route_id + out_warehouse = self.rma_id.out_warehouse_id or operation.out_warehouse_id + out_route = self.rma_id.out_route_id or operation.out_route_id + if not in_warehouse or not out_warehouse: warehouse = self.env["stock.warehouse"].search( [ ("company_id", "=", self.rma_id.company_id.id), @@ -94,6 +100,16 @@ def _prepare_rma_line_from_lot_vals(self, lot): raise ValidationError( _("Please define a warehouse with a default RMA location") ) + in_warehouse = in_warehouse or warehouse + out_warehouse = out_warehouse or warehouse + location = self.rma_id.location_id + if not location: + location = ( + operation.location_id + or operation.in_warehouse_id.lot_rma_id + or in_warehouse.lot_rma_id + or out_warehouse.lot_rma_id + ) product_qty = 1 # serial if lot.product_id.tracking == "lot": @@ -112,15 +128,11 @@ def _prepare_rma_line_from_lot_vals(self, lot): "rma_id": self.rma_id.id, "receipt_policy": operation.receipt_policy, "delivery_policy": operation.delivery_policy, - "in_warehouse_id": operation.in_warehouse_id.id or warehouse.id, - "out_warehouse_id": operation.out_warehouse_id.id or warehouse.id, - "in_route_id": operation.in_route_id.id or route.id, - "out_route_id": operation.out_route_id.id or route.id, - "location_id": ( - operation.location_id.id - or operation.in_warehouse_id.lot_rma_id.id - or warehouse.lot_rma_id.id - ), + "in_warehouse_id": in_warehouse.id, + "out_warehouse_id": out_warehouse.id, + "in_route_id": in_route.id, + "out_route_id": out_route.id, + "location_id": location.id, } return vals @@ -141,4 +153,5 @@ def action_confirm(self): # favor of (pre)computed stored editable fields for all policies # and configuration in the RMA operation. rec._onchange_operation_id() + rec.price_unit = rec._get_price_unit() return {"type": "ir.actions.act_window_close"} diff --git a/rma/wizards/rma_add_stock_move.py b/rma/wizards/rma_add_stock_move.py index cfc8fadd6..1169a104c 100644 --- a/rma/wizards/rma_add_stock_move.py +++ b/rma/wizards/rma_add_stock_move.py @@ -73,16 +73,18 @@ def select_all(self): } def _prepare_rma_line_from_stock_move(self, sm, lot=False): - if self.env.context.get("customer"): - operation = ( - sm.product_id.rma_customer_operation_id - or sm.product_id.categ_id.rma_customer_operation_id - ) - else: - operation = ( - sm.product_id.rma_supplier_operation_id - or sm.product_id.categ_id.rma_supplier_operation_id - ) + operation = self.rma_id.operation_default_id + if not operation: + if self.env.context.get("customer"): + operation = ( + sm.product_id.rma_customer_operation_id + or sm.product_id.categ_id.rma_customer_operation_id + ) + else: + operation = ( + sm.product_id.rma_supplier_operation_id + or sm.product_id.categ_id.rma_supplier_operation_id + ) if not operation: operation = self.env["rma.operation"].search( [("type", "=", self.rma_id.type)], limit=1 @@ -96,8 +98,11 @@ def _prepare_rma_line_from_stock_move(self, sm, lot=False): ) if not route: raise ValidationError(_("Please define an RMA route")) - - if not operation.in_warehouse_id or not operation.out_warehouse_id: + in_warehouse = self.rma_id.in_warehouse_id or operation.in_warehouse_id + in_route = self.rma_id.in_route_id or operation.in_route_id + out_warehouse = self.rma_id.out_warehouse_id or operation.out_warehouse_id + out_route = self.rma_id.out_route_id or operation.out_route_id + if not in_warehouse or not out_warehouse: warehouse = self.env["stock.warehouse"].search( [ ("company_id", "=", self.rma_id.company_id.id), @@ -109,6 +114,16 @@ def _prepare_rma_line_from_stock_move(self, sm, lot=False): raise ValidationError( _("Please define a warehouse with a default RMA location") ) + in_warehouse = in_warehouse or warehouse + out_warehouse = out_warehouse or warehouse + location = self.rma_id.location_id + if not location: + location = ( + operation.location_id + or operation.in_warehouse_id.lot_rma_id + or in_warehouse.lot_rma_id + or out_warehouse.lot_rma_id + ) product_qty = sm.product_uom_qty if sm.product_id.tracking == "serial": product_qty = 1 @@ -132,15 +147,11 @@ def _prepare_rma_line_from_stock_move(self, sm, lot=False): "rma_id": self.rma_id.id, "receipt_policy": operation.receipt_policy, "delivery_policy": operation.delivery_policy, - "in_warehouse_id": operation.in_warehouse_id.id or warehouse.id, - "out_warehouse_id": operation.out_warehouse_id.id or warehouse.id, - "in_route_id": operation.in_route_id.id or route.id, - "out_route_id": operation.out_route_id.id or route.id, - "location_id": ( - operation.location_id.id - or operation.in_warehouse_id.lot_rma_id.id - or warehouse.lot_rma_id.id - ), + "in_warehouse_id": in_warehouse.id, + "out_warehouse_id": out_warehouse.id, + "in_route_id": in_route.id, + "out_route_id": out_route.id, + "location_id": location.id, } return data @@ -184,4 +195,5 @@ def add_lines(self): # favor of (pre)computed stored editable fields for all policies # and configuration in the RMA operation. rec._onchange_operation_id() + rec.price_unit = rec._get_price_unit() return {"type": "ir.actions.act_window_close"} diff --git a/rma_sale/wizards/rma_add_sale.py b/rma_sale/wizards/rma_add_sale.py index a1d034298..1adcd1f57 100644 --- a/rma_sale/wizards/rma_add_sale.py +++ b/rma_sale/wizards/rma_add_sale.py @@ -83,9 +83,11 @@ def select_all(self): } def _prepare_rma_line_from_sale_order_line(self, line, lot=None): - operation = line.product_id.rma_customer_operation_id + operation = self.rma_id.operation_default_id if not operation: - operation = line.product_id.categ_id.rma_customer_operation_id + operation = line.product_id.rma_customer_operation_id + if not operation: + operation = line.product_id.categ_id.rma_customer_operation_id if not operation: operation = self.env["rma.operation"].search( [("type", "=", self.rma_id.type)], limit=1 @@ -98,18 +100,27 @@ def _prepare_rma_line_from_sale_order_line(self, line, lot=None): ) if not route: raise ValidationError(_("Please define an rma route")) - if not operation.in_warehouse_id or not operation.out_warehouse_id: - warehouse = self.env["stock.warehouse"].search( - [ - ("company_id", "=", self.rma_id.company_id.id), - ("lot_rma_id", "!=", False), - ], - limit=1, - ) - if not warehouse: - raise ValidationError( - _("Please define a warehouse with a " "default rma location.") + warehouse = self.rma_id.in_warehouse_id + if not warehouse: + if not operation.in_warehouse_id or not operation.out_warehouse_id: + warehouse = self.env["stock.warehouse"].search( + [ + ("company_id", "=", self.rma_id.company_id.id), + ("lot_rma_id", "!=", False), + ], + limit=1, ) + if not warehouse: + raise ValidationError( + _("Please define a warehouse with a " "default rma location.") + ) + location = self.rma_id.location_id + if not location: + location = ( + operation.location_id + or operation.in_warehouse_id.lot_rma_id + or warehouse.lot_rma_id + ) product_qty = line.product_uom_qty if line.product_id.tracking == "serial": product_qty = 1 @@ -141,15 +152,11 @@ def _prepare_rma_line_from_sale_order_line(self, line, lot=None): "in_route_id": operation.in_route_id.id or route.id, "out_route_id": operation.out_route_id.id or route.id, "receipt_policy": operation.receipt_policy, - "location_id": ( - operation.location_id.id - or operation.in_warehouse_id.lot_rma_id.id - or warehouse.lot_rma_id.id - ), + "location_id": location.id, "refund_policy": operation.refund_policy, "delivery_policy": operation.delivery_policy, - "in_warehouse_id": operation.in_warehouse_id.id or warehouse.id, - "out_warehouse_id": operation.out_warehouse_id.id or warehouse.id, + "in_warehouse_id": warehouse.id or operation.in_warehouse_id.id, + "out_warehouse_id": warehouse.id or operation.out_warehouse_id.id, } return data @@ -193,6 +200,7 @@ def add_lines(self): # favor of (pre)computed stored editable fields for all policies # and configuration in the RMA operation. rec._onchange_operation_id() + rec.price_unit = rec._get_price_unit() rma = self.rma_id data_rma = self._get_rma_data() rma.write(data_rma)