diff --git a/lims_management/__manifest__.py b/lims_management/__manifest__.py
index c7bf774..ec56aca 100644
--- a/lims_management/__manifest__.py
+++ b/lims_management/__manifest__.py
@@ -21,6 +21,9 @@
'web.assets_backend': [
'lims_management/static/src/css/lims_test.css',
],
+ 'web.report_assets_common': [
+ 'lims_management/static/src/css/report_test_result.css',
+ ],
},
'data': [
'security/lims_security.xml',
@@ -43,6 +46,7 @@
'views/analysis_parameter_views.xml',
'views/product_template_parameter_config_views.xml',
'views/parameter_dashboard_views.xml',
+ 'report/report_test_result.xml',
],
'demo': [
'demo/z_lims_demo.xml',
diff --git a/lims_management/models/analysis_parameter.py b/lims_management/models/analysis_parameter.py
index d3a0248..d30620c 100644
--- a/lims_management/models/analysis_parameter.py
+++ b/lims_management/models/analysis_parameter.py
@@ -54,6 +54,13 @@ class LimsAnalysisParameter(models.Model):
help='Si está desmarcado, el parámetro no estará disponible para nuevas configuraciones'
)
+ category_id = fields.Many2one(
+ 'product.category',
+ string='Categoría',
+ domain="[('parent_id.name', '=', 'Análisis de Laboratorio')]",
+ help='Categoría del parámetro para agrupar en reportes'
+ )
+
# Relaciones
template_parameter_ids = fields.One2many(
'product.template.parameter',
diff --git a/lims_management/static/src/css/report_test_result.css b/lims_management/static/src/css/report_test_result.css
new file mode 100644
index 0000000..2851655
--- /dev/null
+++ b/lims_management/static/src/css/report_test_result.css
@@ -0,0 +1,114 @@
+/* Estilos para el reporte de resultados de laboratorio */
+
+/* Estilos generales */
+.patient-info {
+ background-color: #f8f9fa;
+ padding: 15px;
+ border-radius: 5px;
+ margin-bottom: 20px;
+}
+
+.test-section {
+ border: 1px solid #dee2e6;
+ border-radius: 5px;
+ padding: 15px;
+ margin-bottom: 20px;
+}
+
+.test-header {
+ border-radius: 5px 5px 0 0;
+ margin: -15px -15px 15px -15px;
+}
+
+/* Estilos para la tabla de resultados */
+.result-row {
+ transition: background-color 0.3s;
+}
+
+.result-row.normal {
+ background-color: transparent;
+}
+
+.result-row.out-of-range {
+ background-color: #fff3cd;
+}
+
+.result-row.critical {
+ background-color: #f8d7da;
+}
+
+.result-row.panic {
+ background-color: #d1ecf1;
+ font-weight: bold;
+}
+
+/* Estilos para valores */
+.result-row.out-of-range td:nth-child(3) {
+ color: #856404;
+ font-weight: bold;
+}
+
+.result-row.critical td:nth-child(3) {
+ color: #721c24;
+ font-weight: bold;
+}
+
+.result-row.panic td:nth-child(3) {
+ color: #004085;
+ font-weight: bold;
+}
+
+/* Badges personalizados */
+.badge {
+ font-size: 0.875rem;
+ padding: 0.375rem 0.75rem;
+}
+
+/* Tablas más compactas */
+.table-sm td, .table-sm th {
+ padding: 0.3rem;
+}
+
+/* Encabezados de categoría */
+h6.text-primary {
+ border-bottom: 2px solid #007bff;
+ padding-bottom: 5px;
+}
+
+/* Notas y observaciones */
+.text-muted {
+ font-size: 0.9rem;
+}
+
+/* Impresión */
+@media print {
+ .page {
+ page-break-after: auto;
+ }
+
+ .test-section {
+ page-break-inside: avoid;
+ }
+
+ .patient-info {
+ page-break-inside: avoid;
+ }
+
+ .result-row.out-of-range {
+ background-color: #fff3cd !important;
+ -webkit-print-color-adjust: exact;
+ print-color-adjust: exact;
+ }
+
+ .result-row.critical {
+ background-color: #f8d7da !important;
+ -webkit-print-color-adjust: exact;
+ print-color-adjust: exact;
+ }
+
+ .result-row.panic {
+ background-color: #d1ecf1 !important;
+ -webkit-print-color-adjust: exact;
+ print-color-adjust: exact;
+ }
+}
\ No newline at end of file
diff --git a/lims_management/views/lims_test_views.xml b/lims_management/views/lims_test_views.xml
index 05b539e..ab94c52 100644
--- a/lims_management/views/lims_test_views.xml
+++ b/lims_management/views/lims_test_views.xml
@@ -28,6 +28,11 @@
type="object"
invisible="state not in ['draft', 'in_process']"
confirm="¿Está seguro de regenerar los resultados? Esto eliminará los resultados actuales."/>
+