diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 2f0bda8..02f7faa 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -25,7 +25,9 @@ "Bash(bash:*)", "Bash(grep:*)", "Bash(gh pr merge:*)", - "Bash(git cherry-pick:*)" + "Bash(git cherry-pick:*)", + "Bash(del comment_issue_15.txt)", + "Bash(cat:*)" ], "deny": [] } diff --git a/lims_management/__manifest__.py b/lims_management/__manifest__.py index 86435d5..16f9d1f 100644 --- a/lims_management/__manifest__.py +++ b/lims_management/__manifest__.py @@ -48,6 +48,8 @@ 'views/menus.xml', 'views/lims_config_views.xml', 'report/sample_label_report.xml', + 'reports/lab_results_report_data.xml', + 'reports/lab_results_report.xml', ], 'demo': [ 'demo/demo_users.xml', diff --git a/lims_management/models/__pycache__/sale_order.cpython-312.pyc b/lims_management/models/__pycache__/sale_order.cpython-312.pyc index 79626ed..cb430ed 100644 Binary files a/lims_management/models/__pycache__/sale_order.cpython-312.pyc and b/lims_management/models/__pycache__/sale_order.cpython-312.pyc differ diff --git a/lims_management/models/lims_test.py b/lims_management/models/lims_test.py index d9bb6e2..cc8dc39 100644 --- a/lims_management/models/lims_test.py +++ b/lims_management/models/lims_test.py @@ -28,6 +28,14 @@ class LimsTest(models.Model): ondelete='restrict' ) + sale_order_id = fields.Many2one( + 'sale.order', + string='Orden de Venta', + related='sale_order_line_id.order_id', + store=True, + readonly=True + ) + patient_id = fields.Many2one( 'res.partner', string='Paciente', diff --git a/lims_management/models/parameter_range.py b/lims_management/models/parameter_range.py index 097a449..7fe64c7 100644 --- a/lims_management/models/parameter_range.py +++ b/lims_management/models/parameter_range.py @@ -102,6 +102,26 @@ class LimsParameterRange(models.Model): readonly=True ) + reference_text = fields.Char( + string='Texto de Referencia', + compute='_compute_reference_text', + store=False, + help='Texto formateado del rango de referencia' + ) + + @api.depends('normal_min', 'normal_max', 'parameter_unit') + def _compute_reference_text(self): + """Computa el texto de referencia basado en los valores min/max y unidad""" + for record in self: + if record.normal_min is not False and record.normal_max is not False: + unit = record.parameter_unit or '' + # Formatear los números para evitar decimales innecesarios + min_val = f"{record.normal_min:.2f}".rstrip('0').rstrip('.') + max_val = f"{record.normal_max:.2f}".rstrip('0').rstrip('.') + record.reference_text = f"{min_val} - {max_val} {unit}".strip() + else: + record.reference_text = "N/A" + @api.depends('parameter_id', 'gender', 'age_min', 'age_max', 'pregnant') def _compute_name(self): for record in self: diff --git a/lims_management/models/sale_order.py b/lims_management/models/sale_order.py index 4e4bea2..e768100 100644 --- a/lims_management/models/sale_order.py +++ b/lims_management/models/sale_order.py @@ -339,3 +339,56 @@ class SaleOrder(models.Model): # Retornar la acción de imprimir el reporte para las muestras activas return report.report_action(active_samples) + + # Fields for lab results report + can_print_results = fields.Boolean( + string="Puede Imprimir Resultados", + compute='_compute_can_print_results', + help="Indica si todas las pruebas están validadas y se puede imprimir el informe" + ) + + lab_test_ids = fields.One2many( + 'lims.test', + 'sale_order_id', + string="Pruebas de Laboratorio", + readonly=True, + help="Todas las pruebas de laboratorio asociadas a esta orden" + ) + + referring_doctor_id = fields.Many2one( + 'res.partner', + string="Médico Solicitante", + related='doctor_id', + readonly=True, + help="Médico que solicitó los análisis" + ) + + lab_notes = fields.Text( + string="Observaciones del Laboratorio", + help="Observaciones generales sobre la orden o los resultados" + ) + + @api.depends('lab_test_ids.state') + def _compute_can_print_results(self): + """Compute if results can be printed (all tests validated)""" + for order in self: + tests = order.lab_test_ids + order.can_print_results = ( + tests and + all(test.state == 'validated' for test in tests) + ) + + def action_print_lab_results(self): + """Generate and print lab results report""" + self.ensure_one() + + # Verify all tests are validated + if not self.can_print_results: + raise UserError(_("No se puede imprimir el informe: hay pruebas sin validar")) + + # Ensure this is a lab request + if not self.is_lab_request: + raise UserError(_("Esta no es una orden de laboratorio")) + + # Generate the report + return self.env.ref('lims_management.action_report_lab_results').report_action(self) diff --git a/lims_management/reports/lab_results_report.xml b/lims_management/reports/lab_results_report.xml new file mode 100644 index 0000000..1c209c0 --- /dev/null +++ b/lims_management/reports/lab_results_report.xml @@ -0,0 +1,274 @@ + + + + + + + + \ No newline at end of file diff --git a/lims_management/reports/lab_results_report_data.xml b/lims_management/reports/lab_results_report_data.xml new file mode 100644 index 0000000..2f6a4bd --- /dev/null +++ b/lims_management/reports/lab_results_report_data.xml @@ -0,0 +1,30 @@ + + + + + Formato Resultados de Laboratorio + A4 + Portrait + 40 + 25 + 10 + 10 + 35 + 90 + + + + + Informe de Resultados + sale.order + qweb-pdf + lims_management.report_lab_results + lims_management.report_lab_results + 'Resultados_Lab_' + object.name + '.pdf' + + 'Resultados_Lab_' + object.name + '.pdf' + True + + report + + \ 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 18518ea..f038c09 100644 --- a/lims_management/views/lims_test_views.xml +++ b/lims_management/views/lims_test_views.xml @@ -64,7 +64,7 @@ - + - - + + + + + + + + + + -
- - - -
diff --git a/lims_management/views/sale_order_views.xml b/lims_management/views/sale_order_views.xml index b496ddf..6da7e41 100644 --- a/lims_management/views/sale_order_views.xml +++ b/lims_management/views/sale_order_views.xml @@ -16,6 +16,12 @@ class="btn-primary" invisible="not is_lab_request or state != 'sale' or not all_sample_ids" icon="fa-print"/> +