clinical_laboratory/lims_management/models/product.py
Luis Ernesto Portillo Zaldivar 92f8894164 feat(#51): Task 2 completada - Crear modelo product.template.parameter
- Creado modelo product.template.parameter para asociar parámetros a análisis
- Campos: sequence, required, instructions
- Relación Many2one con analysis.parameter y product.template
- Agregadas vistas embebidas en product.template
- Actualizado analysis.parameter con relación One2many
- Configurados permisos de seguridad

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-15 11:29:41 -06:00

66 lines
2.4 KiB
Python

# -*- coding: utf-8 -*-
from odoo import models, fields, api
from odoo.exceptions import ValidationError
class ProductTemplate(models.Model):
_inherit = 'product.template'
is_analysis = fields.Boolean(
string="Es un Análisis Clínico",
help="Marcar si este producto es un análisis clínico."
)
analysis_type = fields.Selection([
('hematology', 'Hematología'),
('chemistry', 'Química Clínica'),
('microbiology', 'Microbiología'),
('immunology', 'Inmunología'),
('endocrinology', 'Endocrinología'),
('other', 'Otro')
], string="Tipo de Análisis")
technical_specifications = fields.Text(
string="Especificaciones Técnicas"
)
value_range_ids = fields.One2many(
'lims.analysis.range',
'analysis_id',
string="Rangos de Referencia"
)
parameter_ids = fields.One2many(
'product.template.parameter',
'product_tmpl_id',
string="Parámetros del Análisis",
help="Parámetros que se medirán en este análisis"
)
is_sample_type = fields.Boolean(
string="Es Tipo de Muestra",
help="Marcar si este producto representa un tipo de contenedor de muestra de laboratorio."
)
required_sample_type_id = fields.Many2one(
'product.template',
string='Tipo de Muestra Requerida',
domain="[('is_sample_type', '=', True)]",
help="Tipo de muestra/contenedor requerido para realizar este análisis"
)
sample_volume_ml = fields.Float(
string='Volumen Requerido (ml)',
help="Volumen de muestra requerido en mililitros para realizar este análisis"
)
@api.constrains('required_sample_type_id', 'is_analysis')
def _check_sample_type_for_analysis(self):
for product in self:
if product.required_sample_type_id and not product.is_analysis:
raise ValidationError("Solo los productos marcados como 'Es un Análisis Clínico' pueden tener un tipo de muestra requerida.")
@api.constrains('sample_volume_ml', 'is_analysis')
def _check_volume_for_analysis(self):
for product in self:
if product.sample_volume_ml and not product.is_analysis:
raise ValidationError("Solo los productos marcados como 'Es un Análisis Clínico' pueden tener un volumen requerido.")