66 lines
1.8 KiB
Python
66 lines
1.8 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Copyright 2026 Nexa Systems Inc.
|
|
# License OPL-1 (Odoo Proprietary License v1.0)
|
|
|
|
from odoo import api, fields, models
|
|
|
|
|
|
class FpMaintenancePlan(models.Model):
|
|
"""Maintenance plan template.
|
|
|
|
Groups checklist nodes and links to an equipment category.
|
|
Plans are selected when creating maintenance events.
|
|
"""
|
|
_name = 'fp.maintenance.plan'
|
|
_description = 'Fusion Plating — Maintenance Plan'
|
|
_inherit = ['mail.thread']
|
|
_order = 'name'
|
|
|
|
name = fields.Char(
|
|
string='Name',
|
|
required=True,
|
|
tracking=True,
|
|
help='e.g. "Tank A-10 Nickel Nichem HP 1170 - Daily Titration"',
|
|
)
|
|
equipment_category_id = fields.Many2one(
|
|
'maintenance.equipment.category',
|
|
string='Equipment Type',
|
|
ondelete='set null',
|
|
tracking=True,
|
|
)
|
|
description = fields.Html(string='Description')
|
|
default_assignee_id = fields.Many2one(
|
|
'res.users',
|
|
string='Default Assignee',
|
|
)
|
|
node_ids = fields.One2many(
|
|
'fp.maintenance.node',
|
|
'plan_id',
|
|
string='Checklist Items',
|
|
)
|
|
node_count = fields.Integer(
|
|
string='Items',
|
|
compute='_compute_node_count',
|
|
)
|
|
active = fields.Boolean(default=True)
|
|
company_id = fields.Many2one(
|
|
'res.company',
|
|
string='Company',
|
|
default=lambda self: self.env.company,
|
|
)
|
|
|
|
def _compute_node_count(self):
|
|
for plan in self:
|
|
plan.node_count = len(plan.node_ids)
|
|
|
|
def action_view_nodes(self):
|
|
self.ensure_one()
|
|
return {
|
|
'type': 'ir.actions.act_window',
|
|
'name': f'Items — {self.name}',
|
|
'res_model': 'fp.maintenance.node',
|
|
'view_mode': 'list,form',
|
|
'domain': [('plan_id', '=', self.id)],
|
|
'context': {'default_plan_id': self.id},
|
|
}
|