diff --git a/.claude/settings.local.json b/.claude/settings.local.json
index f15c95c..645c6df 100644
--- a/.claude/settings.local.json
+++ b/.claude/settings.local.json
@@ -23,7 +23,8 @@
"Bash(find:*)",
"Bash(true)",
"Bash(bash:*)",
- "Bash(grep:*)"
+ "Bash(grep:*)",
+ "Bash(gh pr merge:*)"
],
"deny": []
}
diff --git a/lims_management/__manifest__.py b/lims_management/__manifest__.py
index 95f6fdc..61afca0 100644
--- a/lims_management/__manifest__.py
+++ b/lims_management/__manifest__.py
@@ -43,6 +43,7 @@
'views/product_template_parameter_config_views.xml',
'views/parameter_dashboard_views.xml',
'views/menus.xml',
+ 'report/sample_label_report.xml',
],
'demo': [
'demo/z_lims_demo.xml',
diff --git a/lims_management/models/sale_order.py b/lims_management/models/sale_order.py
index 697e824..75e2325 100644
--- a/lims_management/models/sale_order.py
+++ b/lims_management/models/sale_order.py
@@ -293,3 +293,16 @@ class SaleOrder(models.Model):
_logger.info(f"Cancelled {len(samples_to_cancel)} samples and {len(tests_to_cancel)} tests for order {self.name}")
return res
+
+ def action_print_sample_labels(self):
+ """Imprimir etiquetas de todas las muestras generadas para esta orden"""
+ self.ensure_one()
+
+ if not self.generated_sample_ids:
+ raise UserError(_('No hay muestras generadas para esta orden. Por favor, confirme la orden primero.'))
+
+ # Obtener el reporte
+ report = self.env.ref('lims_management.action_report_sample_label')
+
+ # Retornar la acción de imprimir el reporte para todas las muestras
+ return report.report_action(self.generated_sample_ids)
diff --git a/lims_management/report/__init__.py b/lims_management/report/__init__.py
new file mode 100644
index 0000000..7c68785
--- /dev/null
+++ b/lims_management/report/__init__.py
@@ -0,0 +1 @@
+# -*- coding: utf-8 -*-
\ No newline at end of file
diff --git a/lims_management/report/sample_label_report.xml b/lims_management/report/sample_label_report.xml
new file mode 100644
index 0000000..7516e2d
--- /dev/null
+++ b/lims_management/report/sample_label_report.xml
@@ -0,0 +1,75 @@
+
+
+
+
+
+ Etiquetas de Muestras
+ stock.lot
+ qweb-pdf
+ lims_management.report_sample_label
+ lims_management.report_sample_label
+ 'Etiquetas - ' + object.name
+ report
+
+
+
+
+
+ Formato Etiqueta Muestra
+
+ custom
+ 50
+ 100
+ Landscape
+ 2
+ 2
+ 2
+ 2
+
+ 0
+ 200
+
+
+
+
+
+
+
+
+
+
+
LABORATORIO CLÍNICO
+
+
+
+
+
Paciente:
+
ID:
+ Sin ID
+
+
+
+
+
+
Orden:
+
Tipo:
+
Fecha:
+
+
+
+
+
+
+
+
+
+
Análisis:
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/lims_management/views/sale_order_views.xml b/lims_management/views/sale_order_views.xml
index 9c0945f..b2b5020 100644
--- a/lims_management/views/sale_order_views.xml
+++ b/lims_management/views/sale_order_views.xml
@@ -8,6 +8,15 @@
sale.order
+
+
+
+
diff --git a/pr_body_9.txt b/pr_body_9.txt
new file mode 100644
index 0000000..fa45958
--- /dev/null
+++ b/pr_body_9.txt
@@ -0,0 +1,48 @@
+## Implementación del flujo de validación y seguridad
+
+### Cambios realizados
+
+#### 1. Ajuste de permisos base (ir.model.access.csv)
+- Recepcionista: Solo lectura en lims.test y lims.result
+- Técnico: Lectura/escritura pero sin crear/eliminar
+- Administrador: Permisos completos
+
+#### 2. Reglas de registro implementadas (lims_security.xml)
+- Recepcionistas no pueden editar pruebas
+- Técnicos solo pueden editar pruebas no validadas
+- Administradores tienen acceso completo
+
+#### 3. Validación de permisos en transiciones (lims_test.py)
+- `action_start_process()`: Solo técnicos y administradores
+- `action_enter_results()`: Solo técnicos y administradores
+- `action_validate()`: Solo administradores
+- `action_cancel()`: Técnicos (excepto validadas) y administradores
+- `action_draft()`: Solo administradores
+
+#### 4. Trazabilidad mejorada
+- stock.lot ahora hereda de mail.thread
+- Todos los cambios de estado se registran en el chatter
+- Mensajes más descriptivos con contexto
+
+#### 5. Validaciones adicionales
+- Control de transiciones de estado válidas
+- Verificación del estado de la muestra
+- Validación de resultados críticos fuera de rango
+- No se puede crear pruebas en estado != draft sin ser admin
+
+#### 6. Vistas actualizadas
+- Botones visibles solo para roles apropiados
+- Campos de resultados editables solo por técnicos/admin
+
+#### 7. Usuarios demo para pruebas
+- Usuario: `recepcionista` / Contraseña: `demo`
+- Usuario: `tecnico` / Contraseña: `demo`
+- Usuario: `administrador` / Contraseña: `demo`
+
+### Pruebas realizadas
+- Verificación de permisos por rol
+- Validación de transiciones de estado
+- Trazabilidad en chatter
+- Restricciones visuales en formularios
+
+Closes #9
\ No newline at end of file