294 lines
10 KiB
Python
294 lines
10 KiB
Python
# This file is part of Tryton. The COPYRIGHT file at the top level of
|
|
# this repository contains the full copyright notices and license terms.
|
|
from trytond.model import (
|
|
Workflow, ModelSQL, ModelView, Unique, fields, sequence_ordered)
|
|
from trytond.transaction import Transaction
|
|
from trytond.pyson import Eval, If, Id
|
|
import math as mt
|
|
import numpy as np
|
|
|
|
|
|
class Maintenance(Workflow, ModelSQL, ModelView):
|
|
'Equipment Maintenance'
|
|
__name__ = 'optical_equipment.maintenance'
|
|
|
|
|
|
code = fields.Char(
|
|
"Code", select=True,states={'readonly': True })
|
|
|
|
maintenance_type = fields.Selection([('preventive', 'Preventive'),
|
|
('corrective', 'Corrective')
|
|
], "Maintenance Type")
|
|
|
|
state = fields.Selection([('draft', "Draft"),
|
|
('agended', "Agended"),
|
|
('in_progress', "In Progress"),
|
|
('failed', "Failed"),
|
|
('finished', "Finished")
|
|
], "State",required=True, readonly=True, sort=False)
|
|
|
|
company = fields.Many2One('company.company', "Company", readonly=True)
|
|
propietary = fields.Many2One('party.party', "Propietary", required=True)
|
|
propietary_address = fields.Many2One('party.address', "Propietary Address", required=True,
|
|
domain=[('party', '=', Eval('propietary'))]
|
|
)
|
|
equipment = fields.Many2One('optical_equipment.equipment', "Equipment",
|
|
domain=[('state', '!=', 'draft'),
|
|
('propietary', '=', Eval('propietary'))]
|
|
)
|
|
|
|
|
|
#when the maintenance is in agended status
|
|
diary = fields.One2Many('optical_equipment.maintenance.diary', 'diary')
|
|
estimated_agended = fields.DateTime("Date Maintenance")
|
|
state_agended = fields.Selection([('no_agenda', "No agenda"),
|
|
('agended', "Agended"),
|
|
('in_progress', "In progress"),
|
|
('finish', "Finish"),
|
|
('failed', "Failed")], "State Agenda")
|
|
technical = fields.Many2One('company.employee', "Technical")
|
|
|
|
#Preventive maintenance
|
|
initial_operation = fields.Boolean("Verificiación inicial de funcionamiento")
|
|
check_equipment = fields.Boolean("Revisión del Equipo")
|
|
check_eletric_system = fields.Boolean("Revisión del sistema electríco")
|
|
clean_int_ext = fields.Boolean("Limpieza interior y exterior")
|
|
clean_eyes = fields.Boolean("Limpieza de lentes y espejos")
|
|
optical = fields.Boolean("Optical")
|
|
check_calibration = fields.Boolean("Verificar Calibración")
|
|
|
|
# maintenance_activity = fields.Many2Many('optical_equipment.maintenance-product.product', 'activity', 'maintenance', "Maintenance Activitys")
|
|
maintenance_lines = fields.One2Many('optical_equipment.maintenance.line', 'maintenance', 'Lines')
|
|
|
|
@classmethod
|
|
def __setup__(cls):
|
|
super(Maintenance, cls).__setup__()
|
|
cls._transitions.update({
|
|
('draft', 'agended'),
|
|
('agended', 'in_progress'),
|
|
('in_progress', 'finished')
|
|
})
|
|
cls._buttons.update({
|
|
'draft': {},
|
|
'agended': {},
|
|
'in_progress': {},
|
|
'finished': {},
|
|
})
|
|
|
|
@staticmethod
|
|
def default_company():
|
|
return Transaction().context.get('company')
|
|
|
|
@classmethod
|
|
def default_state(cls):
|
|
return 'draft'
|
|
|
|
@classmethod
|
|
def default_maintenance_type(cls):
|
|
return 'preventive'
|
|
|
|
@classmethod
|
|
def default_state_agended(cls):
|
|
return 'no_agenda'
|
|
|
|
@classmethod
|
|
@ModelView.button
|
|
@Workflow.transition('draft')
|
|
def draft(cls, maintenances):
|
|
pass
|
|
|
|
@classmethod
|
|
@ModelView.button
|
|
@Workflow.transition('agended')
|
|
def agended(cls, maintenances):
|
|
pass
|
|
|
|
@classmethod
|
|
@ModelView.button
|
|
@Workflow.transition('in_progress')
|
|
def inProgress(cls, maintenances):
|
|
pass
|
|
|
|
@classmethod
|
|
@ModelView.button
|
|
@Workflow.transition('finished')
|
|
def finished(cls, maintenances):
|
|
pass
|
|
|
|
@classmethod
|
|
def view_attributes(cls):
|
|
return super(Maintenance, cls).view_attributes() + [
|
|
('//page[@id="preventive"]', 'states', {
|
|
'invisible': If(Eval('maintenance_type') != 'preventive', True),
|
|
}),
|
|
('//page[@id="corrective"]', 'states',{
|
|
'invisible': If(Eval('maintenance_type') != 'corrective', True),
|
|
})
|
|
]
|
|
|
|
|
|
class MaintenanceActivity(ModelSQL):
|
|
'Maintenance - Products'
|
|
__name__ = 'optical_equipment.maintenance-product.product'
|
|
|
|
activity = fields.Many2One('product.product', "Activity", select=True)
|
|
maintenance = fields.Many2One('optical_equipment.maintenance', "Maintenance", select=True)
|
|
|
|
class MaintenanceLine(ModelSQL, ModelView):
|
|
'Maintenance Line'
|
|
__name__ = 'optical_equipment.maintenance.line'
|
|
|
|
product = fields.Many2One('product.product', 'Product',
|
|
ondelete='RESTRICT',domain=[
|
|
If(Eval('sale_state').in_(['draft']),
|
|
('maintenance_activity', '=', True),
|
|
()),
|
|
],)
|
|
maintenance = fields.Many2One('optical_equipment.maintenance', 'Maintenance', ondelete='CASCADE', select=True)
|
|
maintenance_activity = fields.Many2One('product.product', 'Maintenance activity')
|
|
|
|
|
|
class Calibration(ModelSQL, ModelView):
|
|
'Calibration of Maintenance'
|
|
__name__ = 'optical_equipment.maintenance.calibration'
|
|
|
|
samples = fields.One2Many('optical_equipment.maintenance.calibration_sample', 'maintenance',
|
|
'Samples')
|
|
dev_std = fields.Function(
|
|
fields.Float("Standart Desviation"),'get_standard_deviation'
|
|
)
|
|
uncertain_type_A = fields.Function(
|
|
fields.Float("Uncertain Type A"), 'get_uncertain_A'
|
|
)
|
|
uncertain_pattern = fields.Function(
|
|
fields.Float("Uncertain Pattern"), 'get_uncertain_pattern'
|
|
)
|
|
k_c_calibration = fields.Function(
|
|
fields.Float("K Crt Calibration"), 'get_k_certificated_calibration'
|
|
)
|
|
uncertain_U_b1 = fields.Function(
|
|
fields.Float("U_b1"), 'get_uncertain_U_b1'
|
|
)
|
|
d_resolution = fields.Float("d_resolution")
|
|
uncertain_U_b2_dig = fields.Function(
|
|
fields.Float("U_b2"), 'get_uncertain_b2_digital'
|
|
)
|
|
uncertain_U_b2_ana = fields.Function(
|
|
fields.Float("U_b2"), 'get_uncertain_b2_analoga'
|
|
)
|
|
uncertain_combinated = fields.Function(
|
|
fields.Float("U_combinated"), 'get_uncertain_combinated'
|
|
)
|
|
uncertain_eff = fields.Function(
|
|
fields.Float("U eff"), 'get_uncertain_eff'
|
|
)
|
|
|
|
temperature_min = fields.Float("Temp Min")
|
|
temperature_max = fields.Float("Temp Max")
|
|
temperature_uom = fields.Many2One('product.uom', 'Temperature UOM',
|
|
domain=[('category', '=', Id('optical_equipment', "uom_cat_temperature"))],
|
|
states={'invisible' : If(Eval('temperature_min') == None, True)},
|
|
depends=['itemperature_min'])
|
|
|
|
moisture_min = fields.Float("Moisture Min")
|
|
moisture_max = fields.Float("Moisture Max")
|
|
moisture_uom = fields.Many2One('product.uom', "Moisture UOM",
|
|
domain=[('category', '=', Id('optical_equipment', 'uom_cat_relative_humedity'))],
|
|
states={'invisible' : If(Eval('moisture_min') == None, True)},
|
|
depends=['moisture_min'])
|
|
|
|
average = fields.Float("Average")
|
|
|
|
#total_samples total de muestras
|
|
#average_pattern_equipment #Promedio de las muestras tomadas en el equipo suma(value_equipment)/total_samples
|
|
|
|
#Desviacion estandar muestral != desviación estandar poblacional
|
|
def get_standard_deviation(self):
|
|
"""
|
|
This function calculated the
|
|
standartd deviation
|
|
"""
|
|
sum_samples = sum(samples)
|
|
n_samples = len(samples)
|
|
mean = sum_samples / n_samples
|
|
dev_std_square = sum((l-mean)**2 for l in sample) / (n_samples -1)
|
|
dev_std = mt.sqrt(dev_std_square)
|
|
|
|
return dev_std
|
|
|
|
def get_uncertain_type_A(self):
|
|
"""
|
|
This function calculated the
|
|
uncertain type A
|
|
"""
|
|
n_samples = len(samples)
|
|
uncertain_type_A = dev_std /mt.sqrt(n_samples)
|
|
|
|
return uncertain_type_A
|
|
|
|
def get_uncertain_pattern(self):
|
|
"""
|
|
uncertain_pattern = 0,25 constante viene del equipo
|
|
"""
|
|
uncertain_pattern = 0.25
|
|
|
|
return uncertain_pattern
|
|
|
|
def get_k_certificated_calibration(self):
|
|
k_certificated_calibration = 2
|
|
|
|
return k_certicated_calibration
|
|
|
|
def get_uncertain_U_b1(self):
|
|
uncertain_b1 = MEP / mt.sqrt(3)
|
|
uncertain_b1a = uncertain_pattern / k_certificated_calibration
|
|
|
|
return uncertain_b1
|
|
|
|
def default_d_resolution(self):
|
|
return d
|
|
|
|
def get_uncertain_b2_digital(self):
|
|
uncertain_b2 = d/2*mt.sqrt(3)
|
|
|
|
return uncertain_b2
|
|
|
|
def get_uncertain_b2_analog(self):
|
|
#Incertidumbre por resolución Análoga
|
|
# a contante que viene del equipo
|
|
uncertain_b2_analog = d/a * math.sqrt(3)
|
|
|
|
return uncertain_b2_analog
|
|
|
|
def get_uncertain_combinated(self):
|
|
#Incertidumbre Combinada
|
|
sum_uncertain_c = uncertain_type_A**2 + uncertain_b1**2 + uncertain_b2**2
|
|
uncertain_c = math.sqrt(sum_uncertain_c)
|
|
|
|
return uncertain_c
|
|
|
|
def get_uncertain_eff(self):
|
|
#Grados Efectivos de libertad
|
|
uncertain_eff = uncertain_c**4/((uncertain_type_A**4)/(len(sample)-1)+(uncertain_b1**4/U_subi)+(uncertain_b2**4/U_subi))
|
|
|
|
return uncertain_eff
|
|
|
|
|
|
|
|
class CalibrationSample(sequence_ordered(), ModelView, ModelSQL):
|
|
'Samples of Calibration'
|
|
__name__ = 'optical_equipment.maintenance.calibration_sample'
|
|
|
|
maintenance = fields.Many2One('optical_equipment.maintenance', 'Maintenance',
|
|
ondelete='CASCADE')
|
|
|
|
number_sample = fields.Integer("Sample #")
|
|
value_pattern = fields.Integer("Value in Pattern")
|
|
value_equipment = fields.Float("Value in Equipment")
|
|
mistake = fields.Float("Mistake")
|
|
mistake_rate = fields.Float("% Mistake")
|
|
expanded_uncertainty = fields.Float("Uncertainy Expanded")
|
|
|
|
|
|
|