Working
no payment
This commit is contained in:
@@ -0,0 +1,3 @@
|
||||
from . import sale_order_warranty
|
||||
from . import warranty_claim
|
||||
from . import warranty_vendor
|
||||
@@ -0,0 +1,116 @@
|
||||
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
|
||||
|
||||
|
||||
@@ -0,0 +1,94 @@
|
||||
from odoo import api, fields, models
|
||||
|
||||
class WarrantyClaim(models.Model):
|
||||
_name = "warranty.claim"
|
||||
_description = "Warranty Claim"
|
||||
_inherit = ["mail.thread", "mail.activity.mixin"]
|
||||
_order = "create_date desc"
|
||||
|
||||
name = fields.Char("Claim Reference", required=True, copy=False, default="New", tracking=True)
|
||||
|
||||
# Link to the customer and various parties
|
||||
partner_id = fields.Many2one("res.partner", string="Customer", tracking=True)
|
||||
manufacturer_id = fields.Many2one("warranty.manufacturer", string="Manufacturer")
|
||||
true_vendor_id = fields.Many2one(
|
||||
"res.partner",
|
||||
string="True Vendor",
|
||||
domain="[('supplier_rank', '>', 0)]",
|
||||
tracking=True,
|
||||
)
|
||||
extra_recipient_ids = fields.Many2many(
|
||||
"res.partner",
|
||||
string="Additional Email Recipients",
|
||||
help="Separate recipients you want CC'd on the warranty email.",
|
||||
)
|
||||
|
||||
# Link to sales and invoices
|
||||
sale_order_id = fields.Many2one("sale.order", string="Sales Order", tracking=True)
|
||||
original_sale_order_id = fields.Many2one("sale.order", string="Original Sales Order")
|
||||
|
||||
# Customer invoices to attach
|
||||
invoice_customer_ids = fields.Many2many(
|
||||
"account.move",
|
||||
"warranty_claim_customer_invoice_rel",
|
||||
"claim_id", "move_id",
|
||||
string="Customer Invoices",
|
||||
domain="[('move_type', 'in', ('out_invoice', 'out_refund'))]",
|
||||
)
|
||||
|
||||
# Vendor invoices to attach
|
||||
invoice_vendor_ids = fields.Many2many(
|
||||
"account.move",
|
||||
"warranty_claim_vendor_invoice_rel",
|
||||
"claim_id", "move_id",
|
||||
string="Vendor Invoices",
|
||||
domain="[('move_type', 'in', ('in_invoice', 'in_refund'))]",
|
||||
)
|
||||
|
||||
# Technical / product fields
|
||||
product_id = fields.Many2one("product.product", string="Product")
|
||||
model = fields.Char("Model")
|
||||
serial_number = fields.Char("Serial Number")
|
||||
failure = fields.Text("Failure Description")
|
||||
warranty_type = fields.Selection(
|
||||
[
|
||||
("90_day", "90 Day Warranty"),
|
||||
("cabinet", "Cabinet Warranty"),
|
||||
("other", "Other"),
|
||||
],
|
||||
string="Warranty Type",
|
||||
)
|
||||
claim_date = fields.Date("Claim Date", default=fields.Date.context_today)
|
||||
state = fields.Selection(
|
||||
[
|
||||
("draft", "Draft"),
|
||||
("sent", "Sent to Vendor"),
|
||||
("in_progress", "In Progress"),
|
||||
("approved", "Approved"),
|
||||
("rejected", "Rejected"),
|
||||
("done", "Done"),
|
||||
],
|
||||
string="Status",
|
||||
default="draft",
|
||||
tracking=True,
|
||||
)
|
||||
|
||||
@api.model
|
||||
def create(self, vals):
|
||||
if vals.get("name", "New") == "New":
|
||||
seq = self.env.ref(
|
||||
"odoo_warranty_claims.seq_warranty_claim",
|
||||
raise_if_not_found=False
|
||||
)
|
||||
if seq:
|
||||
vals["name"] = seq.next_by_id()
|
||||
return super().create(vals)
|
||||
|
||||
def action_send_to_vendor(self):
|
||||
"""Uses an email template and moves to 'sent' state."""
|
||||
self.ensure_one()
|
||||
template = self.env.ref("odoo_warranty_claims.mail_template_warranty_claim", raise_if_not_found=False)
|
||||
if template:
|
||||
template.send_mail(self.id, force_send=True)
|
||||
self.state = "sent"
|
||||
return True
|
||||
@@ -0,0 +1,18 @@
|
||||
from odoo import fields, models
|
||||
|
||||
class WarrantyManufacturer(models.Model):
|
||||
_name = "warranty.manufacturer"
|
||||
_description = "Warranty Manufacturer"
|
||||
|
||||
name = fields.Char(required=True)
|
||||
vendor_id = fields.Many2one(
|
||||
"res.partner",
|
||||
string="True Vendor",
|
||||
domain="[('supplier_rank', '>', 0)]",
|
||||
)
|
||||
# Flags for what this manufacturer requires
|
||||
requires_model = fields.Boolean(default=True)
|
||||
requires_serial = fields.Boolean(default=True)
|
||||
requires_failure = fields.Boolean(default=True)
|
||||
requires_original_so = fields.Boolean(default=True)
|
||||
notes = fields.Text("Vendor Warranty Instructions")
|
||||
Reference in New Issue
Block a user