Files
Warranty-Claim-Odoo/models/sale_order_warranty.py
T
greg 44be2f5cf2 Working
no payment
2025-11-30 19:31:24 -06:00

117 lines
4.4 KiB
Python

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