
- 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>
61 lines
1.8 KiB
Python
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!'),
|
|
] |