clinical_laboratory/lims_management/models/rejection_reason.py
Luis Ernesto Portillo Zaldivar 87640b48e0 feat(#58): Implementar flujo de rechazo de muestras
- Agregar estado 'rejected' al ciclo de vida de la muestra
- Crear modelo lims.rejection.reason para gestionar motivos de rechazo
- Agregar campos de rechazo en stock.lot (reason, notes, rejected_by, date)
- Crear wizard para proceso de rechazo con validaciones
- Implementar acción de rechazo con notificaciones
- Crear vistas para muestras rechazadas con filtros y búsquedas
- Agregar 10 motivos de rechazo predefinidos (hemolizada, coagulada, etc.)
- Incluir permisos de seguridad para los nuevos modelos
- Agregar menús para gestión de rechazos y muestras rechazadas
- Corregir compatibilidad con Odoo 18 en vistas existentes

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-15 22:49:43 -06:00

61 lines
1.8 KiB
Python

# -*- coding: utf-8 -*-
from odoo import models, fields, api
class LimsRejectionReason(models.Model):
_name = 'lims.rejection.reason'
_description = 'Motivo de Rechazo de Muestra'
_order = 'sequence, name'
name = fields.Char(
string='Motivo',
required=True
)
code = fields.Char(
string='Código',
required=True,
help="Código único para identificar el motivo"
)
description = fields.Text(
string='Descripción',
help="Descripción detallada del motivo de rechazo"
)
active = fields.Boolean(
string='Activo',
default=True
)
sequence = fields.Integer(
string='Secuencia',
default=10,
help="Orden de aparición en las listas"
)
requires_new_sample = fields.Boolean(
string='Requiere Nueva Muestra',
default=True,
help="Indica si este tipo de rechazo requiere solicitar una nueva muestra"
)
severity = fields.Selection([
('low', 'Baja'),
('medium', 'Media'),
('high', 'Alta'),
('critical', 'Crítica')
], string='Severidad', default='medium',
help="Severidad del problema que causa el rechazo")
# Statistics
rejection_count = fields.Integer(
string='Cantidad de Rechazos',
compute='_compute_rejection_count',
help="Número de muestras rechazadas con este motivo"
)
@api.depends('name')
def _compute_rejection_count(self):
for record in self:
record.rejection_count = self.env['stock.lot'].search_count([
('rejection_reason_id', '=', record.id),
('state', '=', 'rejected')
])
_sql_constraints = [
('code_uniq', 'unique (code)', 'El código del motivo de rechazo debe ser único!'),
]