# -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. from odoo import api, fields, models, _ from dateutil.relativedelta import relativedelta class MaintenanceEquipment(models.Model): _inherit = "maintenance.equipment" _check_company_auto = True expected_mtbf = fields.Integer(string='Expected MTBF', help='Expected Mean Time Between Failure') mtbf = fields.Integer(compute='_compute_maintenance_request', string='MTBF', help='Mean Time Between Failure, computed based on done corrective maintenances.') mttr = fields.Integer(compute='_compute_maintenance_request', string='MTTR', help='Mean Time To Repair') estimated_next_failure = fields.Date(compute='_compute_maintenance_request', string='Estimated time before next failure (in days)', help='Computed as Latest Failure Date + MTBF') latest_failure_date = fields.Date(compute='_compute_maintenance_request', string='Latest Failure Date') workcenter_id = fields.Many2one( 'mrp.workcenter', string='Work Center', check_company=True) @api.depends('effective_date', 'maintenance_ids.stage_id', 'maintenance_ids.close_date', 'maintenance_ids.request_date') def _compute_maintenance_request(self): for equipment in self: maintenance_requests = equipment.maintenance_ids.filtered( lambda x: x.maintenance_type == 'corrective' and x.stage_id.done) mttr_days = 0 for maintenance in maintenance_requests: if maintenance.stage_id.done and maintenance.close_date: mttr_days += (maintenance.close_date - maintenance.request_date).days equipment.mttr = len(maintenance_requests) and (mttr_days / len(maintenance_requests)) or 0 maintenance = maintenance_requests.sorted(lambda x: x.request_date) if len(maintenance) >= 1: equipment.mtbf = (maintenance[-1].request_date - equipment.effective_date).days / len(maintenance) equipment.latest_failure_date = maintenance and maintenance[-1].request_date or False if equipment.mtbf: equipment.estimated_next_failure = equipment.latest_failure_date + relativedelta(days=equipment.mtbf) else: equipment.estimated_next_failure = False def button_mrp_workcenter(self): self.ensure_one() return { 'name': _('work centers'), 'view_mode': 'form', 'res_model': 'mrp.workcenter', 'view_id': self.env.ref('mrp.mrp_workcenter_view').id, 'type': 'ir.actions.act_window', 'res_id': self.workcenter_id.id, 'context': { 'default_company_id': self.company_id.id } } class MaintenanceRequest(models.Model): _inherit = "maintenance.request" _check_company_auto = True production_id = fields.Many2one( 'mrp.production', string='Manufacturing Order', check_company=True) workorder_id = fields.Many2one( 'mrp.workorder', string='Work Order', check_company=True) production_company_id = fields.Many2one(string='Production Company', related='production_id.company_id') company_id = fields.Many2one(domain="[('id', '=?', production_company_id)]")