from odoo import api, fields, models class SaleOrder(models.Model): _inherit = "sale.order" # Checkbox under customer warranty_order = fields.Boolean(string="Warranty Order") # Manufacturer (your logical “warranty manufacturer” entity) warranty_manufacturer_id = fields.Many2one( "warranty.manufacturer", string="Manufacturer", ) # Warranty type warranty_type = fields.Selection( [ ("90_day", "90 Day Warranty"), ("cabinet", "Cabinet Warranty"), ("other", "Other"), ], string="Warranty Type", ) # “True Vendor” (actual vendor that handles warranty, may differ from manufacturer) warranty_true_vendor_id = fields.Many2one( "res.partner", string="True Vendor", domain="[('supplier_rank', '>', 0)]", ) # Fields manufacturer requires warranty_model = fields.Char("Model") warranty_serial = fields.Char("Serial Number") warranty_failure = fields.Text("Failure Description") # Original sales order (dropdown filtered to orders with matching part numbers) # We'll add a helper many2many for domain support. warranty_original_sale_id = fields.Many2one( "sale.order", string="Original Sales Order", domain="[('id', 'in', warranty_original_sale_ids)]", ) warranty_original_sale_ids = fields.Many2many( "sale.order", compute="_compute_warranty_original_sale_ids", string="Candidate Original Sales Orders", store=False, ) @api.depends("order_line.product_id") def _compute_warranty_original_sale_ids(self): """Find previous sales orders for the same customer containing any of the products on this warranty order. """ for order in self: if not order.partner_id or not order.order_line: order.warranty_original_sale_ids = False continue product_ids = order.order_line.product_id.ids if not product_ids: order.warranty_original_sale_ids = False continue candidates = self.search([ ("id", "!=", order.id), ("partner_id", "=", order.partner_id.id), ("state", "in", ["sale", "done"]), ("order_line.product_id", "in", product_ids), ], limit=50) order.warranty_original_sale_ids = candidates def action_create_warranty_claim(self): """Button on SO warranty tab: create a warranty.claim pre-filled.""" self.ensure_one() claim_vals = { "sale_order_id": self.id, "partner_id": self.partner_id.id, "manufacturer_id": self.warranty_manufacturer_id.id, "true_vendor_id": self.warranty_true_vendor_id.id, "model": self.warranty_model, "serial_number": self.warranty_serial, "failure": self.warranty_failure, "warranty_type": self.warranty_type, "original_sale_order_id": self.warranty_original_sale_id.id, } claim = self.env["warranty.claim"].create(claim_vals) action = self.env.ref("odoo_warranty_claims.action_warranty_claims").read()[0] action["res_id"] = claim.id action["views"] = [(self.env.ref("odoo_warranty_claims.view_warranty_claim_form").id, "form")] return action def _create_invoices(self, grouped=False, final=False, date=None): invoices = super()._create_invoices(grouped=grouped, final=final, date=date) for order in self: if order.warranty_order: # Link customer invoice(s) to the new claim claim = self.env["warranty.claim"].create({ "sale_order_id": order.id, "partner_id": order.partner_id.id, "manufacturer_id": order.warranty_manufacturer_id.id, "true_vendor_id": order.warranty_true_vendor_id.id, "model": order.warranty_model, "serial_number": order.warranty_serial, "failure": order.warranty_failure, "warranty_type": order.warranty_type, "original_sale_order_id": order.warranty_original_sale_id.id, "invoice_customer_ids": [(6, 0, invoices.ids)], }) # you could also auto-open or email here, but usually this is backend logic return invoices