# Copyright 2020 Tecnativa - Ernesto Tejeda # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from odoo import api, fields, models class Rma(models.Model): _inherit = "rma" order_id = fields.Many2one( comodel_name="sale.order", string="Sale Order", domain="[" " ('partner_id', 'child_of', commercial_partner_id)," " ('state', 'in', ['sale', 'done'])," "]", readonly=True, states={"draft": [("readonly", False)]}, ) allowed_picking_ids = fields.Many2many( comodel_name="stock.picking", compute="_compute_allowed_picking_ids", ) picking_id = fields.Many2one(domain="[('id', 'in', allowed_picking_ids)]") allowed_move_ids = fields.Many2many( comodel_name="sale.order.line", compute="_compute_allowed_move_ids", ) move_id = fields.Many2one(domain="[('id', 'in', allowed_move_ids)]") sale_line_id = fields.Many2one(related="move_id.sale_line_id",) allowed_product_ids = fields.Many2many( comodel_name="product.product", compute="_compute_allowed_product_ids", ) product_id = fields.Many2one(domain="[('id', 'in', allowed_product_ids)]") @api.depends("partner_id", "order_id") def _compute_allowed_picking_ids(self): domain = [("state", "=", "done"), ("picking_type_id.code", "=", "outgoing")] for rec in self: # if rec.partner_id: commercial_partner = rec.partner_id.commercial_partner_id domain.append(("partner_id", "child_of", commercial_partner.id)) if rec.order_id: domain.append(("sale_id", "=", rec.order_id.id)) rec.allowed_picking_ids = self.env["stock.picking"].search(domain) @api.depends("order_id", "picking_id") def _compute_allowed_move_ids(self): for rec in self: if rec.order_id: order_move = rec.order_id.order_line.mapped("move_ids") rec.allowed_move_ids = order_move.filtered( lambda r: r.picking_id == self.picking_id ).ids else: rec.allowed_move_ids = self.picking_id.move_lines.ids @api.depends("order_id") def _compute_allowed_product_ids(self): for rec in self: if rec.order_id: order_product = rec.order_id.order_line.mapped("product_id") rec.allowed_product_ids = order_product.filtered( lambda r: r.type in ["consu", "product"] ).ids else: rec.allowed_product_ids = ( self.env["product.product"] .search([("type", "in", ["consu", "product"])]) .ids ) @api.onchange("partner_id") def _onchange_partner_id(self): res = super()._onchange_partner_id() self.order_id = False return res @api.onchange("order_id") def _onchange_order_id(self): self.product_id = self.picking_id = False def _prepare_refund(self, invoice_form, origin): """Inject salesman from sales order (if any)""" res = super()._prepare_refund(invoice_form, origin) if self.order_id: invoice_form.invoice_user_id = self.order_id.user_id return res def _get_refund_line_price_unit(self): """Get the sale order price unit""" if self.sale_line_id: return self.sale_line_id.price_unit return super()._get_refund_line_price_unit() def _get_refund_line_product(self): """To be overriden in a third module with the proper origin values in case a kit is linked with the rma """ if not self.sale_line_id: return super()._get_refund_line_product() return self.sale_line_id.product_id def _prepare_refund_line(self, line_form): """Add line data""" super()._prepare_refund_line(line_form) line = self.sale_line_id if line: line_form.discount = line.discount line_form.sequence = line.sequence