diff --git a/rma/models/rma_order.py b/rma/models/rma_order.py index 8a1182710..75eac9cb1 100644 --- a/rma/models/rma_order.py +++ b/rma/models/rma_order.py @@ -121,12 +121,32 @@ def _default_warehouse_id(self): tracking=True, default=lambda self: self.env.uid, ) + in_route_id = fields.Many2one( + "stock.location.route", + string="Inbound Route", + domain=[("rma_selectable", "=", True)], + ) + out_route_id = fields.Many2one( + "stock.location.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( @@ -157,6 +177,21 @@ def _default_warehouse_id(self): 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): if self.rma_line_ids and self.partner_id != self.mapped( diff --git a/rma/models/rma_order_line.py b/rma/models/rma_order_line.py index 9ba20f07d..148ed3e55 100644 --- a/rma/models/rma_order_line.py +++ b/rma/models/rma_order_line.py @@ -724,15 +724,21 @@ 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.location_id = ( - 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.operation_id.in_route_id - self.out_route_id = self.operation_id.out_route_id + 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.rma_id.location_id + or self.operation_id.location_id + or self.in_warehouse_id.lot_rma_id + ) + 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.onchange("customer_to_supplier", "type") diff --git a/rma/views/rma_order_view.xml b/rma/views/rma_order_view.xml index fa1a99d59..49fa17c63 100644 --- a/rma/views/rma_order_view.xml +++ b/rma/views/rma_order_view.xml @@ -126,6 +126,24 @@ name="in_warehouse_id" attrs="{'readonly':[('state', '!=', 'draft')]}" /> + + + + [('type','=','supplier')] + + 1 + + + 1 + + + 0 + + + 0 + diff --git a/rma/wizards/rma_add_serial.py b/rma/wizards/rma_add_serial.py index 6c13aea3e..c935742f8 100644 --- a/rma/wizards/rma_add_serial.py +++ b/rma/wizards/rma_add_serial.py @@ -84,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), @@ -96,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": @@ -114,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 diff --git a/rma/wizards/rma_add_stock_move.py b/rma/wizards/rma_add_stock_move.py index 782610454..170d8b14b 100644 --- a/rma/wizards/rma_add_stock_move.py +++ b/rma/wizards/rma_add_stock_move.py @@ -100,8 +100,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), @@ -113,6 +116,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 @@ -136,15 +149,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 diff --git a/rma_sale/wizards/rma_add_sale.py b/rma_sale/wizards/rma_add_sale.py index ed6815405..0005da5ac 100644 --- a/rma_sale/wizards/rma_add_sale.py +++ b/rma_sale/wizards/rma_add_sale.py @@ -102,18 +102,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 @@ -145,15 +154,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