diff --git a/fusion_repairs/__manifest__.py b/fusion_repairs/__manifest__.py index b7d826a7..fd50ae54 100644 --- a/fusion_repairs/__manifest__.py +++ b/fusion_repairs/__manifest__.py @@ -81,6 +81,7 @@ Copyright (C) 2024-2026 Nexa Systems Inc. All rights reserved. 'views/repair_warranty_views.xml', 'views/maintenance_contract_views.xml', 'views/repair_order_views.xml', + 'views/sale_order_views.xml', 'views/res_partner_views.xml', 'views/res_users_views.xml', 'views/res_config_settings_views.xml', diff --git a/fusion_repairs/models/__init__.py b/fusion_repairs/models/__init__.py index 541abf49..5a1daec6 100644 --- a/fusion_repairs/models/__init__.py +++ b/fusion_repairs/models/__init__.py @@ -15,4 +15,5 @@ from . import res_users from . import res_config_settings from . import technician_task from . import repair_order +from . import sale_order from . import intake_service diff --git a/fusion_repairs/models/sale_order.py b/fusion_repairs/models/sale_order.py new file mode 100644 index 00000000..023544fe --- /dev/null +++ b/fusion_repairs/models/sale_order.py @@ -0,0 +1,80 @@ +# -*- coding: utf-8 -*- +# Copyright 2024-2026 Nexa Systems Inc. +# License OPL-1 (Odoo Proprietary License v1.0) + +"""sale.order extensions: smart buttons that link an original purchase SO +to its downstream repairs, maintenance contracts, and repair invoices. + +Mirrors the count + action_view_* pattern from +fusion_claims/views/sale_order_views.xml line ~1176. +""" + +from odoo import _, api, fields, models + + +class SaleOrder(models.Model): + _inherit = 'sale.order' + + x_fc_repair_order_ids = fields.One2many( + 'repair.order', + 'x_fc_original_sale_order_id', + string='Repairs', + ) + x_fc_repair_order_count = fields.Integer( + compute='_compute_x_fc_repair_order_count', + ) + + x_fc_maintenance_contract_ids = fields.One2many( + 'fusion.repair.maintenance.contract', + 'original_sale_order_id', + string='Maintenance Contracts', + ) + x_fc_maintenance_contract_count = fields.Integer( + compute='_compute_x_fc_maintenance_contract_count', + ) + + @api.depends('x_fc_repair_order_ids') + def _compute_x_fc_repair_order_count(self): + for so in self: + so.x_fc_repair_order_count = len(so.x_fc_repair_order_ids) + + @api.depends('x_fc_maintenance_contract_ids') + def _compute_x_fc_maintenance_contract_count(self): + for so in self: + so.x_fc_maintenance_contract_count = len(so.x_fc_maintenance_contract_ids) + + def action_view_repair_orders(self): + self.ensure_one() + if len(self.x_fc_repair_order_ids) == 1: + return { + 'type': 'ir.actions.act_window', + 'name': self.x_fc_repair_order_ids.name, + 'res_model': 'repair.order', + 'view_mode': 'form', + 'res_id': self.x_fc_repair_order_ids.id, + } + return { + 'type': 'ir.actions.act_window', + 'name': _('Repairs from %(name)s', name=self.name), + 'res_model': 'repair.order', + 'view_mode': 'list,form', + 'domain': [('x_fc_original_sale_order_id', '=', self.id)], + } + + def action_view_maintenance_contracts(self): + self.ensure_one() + if len(self.x_fc_maintenance_contract_ids) == 1: + return { + 'type': 'ir.actions.act_window', + 'name': self.x_fc_maintenance_contract_ids.name, + 'res_model': 'fusion.repair.maintenance.contract', + 'view_mode': 'form', + 'res_id': self.x_fc_maintenance_contract_ids.id, + } + return { + 'type': 'ir.actions.act_window', + 'name': _('Maintenance Contracts from %(name)s', name=self.name), + 'res_model': 'fusion.repair.maintenance.contract', + 'view_mode': 'list,form', + 'domain': [('original_sale_order_id', '=', self.id)], + } diff --git a/fusion_repairs/views/sale_order_views.xml b/fusion_repairs/views/sale_order_views.xml new file mode 100644 index 00000000..38d4ccb9 --- /dev/null +++ b/fusion_repairs/views/sale_order_views.xml @@ -0,0 +1,31 @@ + + + + + sale.order.form.inherit.fusion_repairs + sale.order + + + + + + + + + +