From 79373a01a169887e1671d8af08c135f0e8522353 Mon Sep 17 00:00:00 2001 From: Luis Ernesto Portillo Zaldivar Date: Tue, 15 Jul 2025 12:40:44 -0600 Subject: [PATCH] =?UTF-8?q?feat(#51):=20Task=206=20completada=20-=20Actual?= =?UTF-8?q?izar=20generaci=C3=B3n=20autom=C3=A1tica=20de=20resultados?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Implementado método _generate_test_results() en lims.test - Genera automáticamente líneas de lims.result basadas en product.template.parameter - Se ejecuta al crear una nueva prueba - Respeta el orden (sequence) y las instrucciones de cada parámetro - Agregado action_regenerate_results() para regenerar manualmente - Botón en la vista con confirmación para regenerar resultados - Logging de información sobre resultados generados 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- lims_management/models/lims_test.py | 63 ++++++++++++++++++++++- lims_management/views/lims_test_views.xml | 4 ++ 2 files changed, 66 insertions(+), 1 deletion(-) diff --git a/lims_management/models/lims_test.py b/lims_management/models/lims_test.py index a098d79..70d2de0 100644 --- a/lims_management/models/lims_test.py +++ b/lims_management/models/lims_test.py @@ -146,7 +146,46 @@ class LimsTest(models.Model): for vals in vals_list: if vals.get('name', 'Nuevo') == 'Nuevo': vals['name'] = self.env['ir.sequence'].next_by_code('lims.test') or 'Nuevo' - return super().create(vals_list) + + tests = super().create(vals_list) + # Generar resultados automáticamente + tests._generate_test_results() + return tests + + def _generate_test_results(self): + """Genera automáticamente las líneas de resultado basadas en los parámetros configurados del análisis.""" + for test in self: + if test.result_ids: + # Si ya tiene resultados, no generar nuevos + continue + + # Obtener el product.template del análisis + product_tmpl = test.product_id.product_tmpl_id + + # Buscar los parámetros configurados para este análisis + template_parameters = self.env['product.template.parameter'].search([ + ('product_tmpl_id', '=', product_tmpl.id) + ], order='sequence, id') + + # Crear una línea de resultado por cada parámetro + for param_config in template_parameters: + result_vals = { + 'test_id': test.id, + 'parameter_id': param_config.parameter_id.id, + 'sequence': param_config.sequence, + 'notes': param_config.instructions or '' + } + + # Inicializar valores según el tipo + if param_config.parameter_value_type == 'boolean': + result_vals['value_boolean'] = False + + self.env['lims.result'].create(result_vals) + + if template_parameters: + _logger.info(f"Generados {len(template_parameters)} resultados para la prueba {test.name}") + else: + _logger.warning(f"No se encontraron parámetros configurados para el análisis {product_tmpl.name}") def action_start_process(self): """Inicia el proceso de análisis.""" @@ -236,6 +275,28 @@ class LimsTest(models.Model): return True + def action_regenerate_results(self): + """Regenera los resultados basados en la configuración actual del análisis.""" + self.ensure_one() + if self.state not in ['draft', 'in_process']: + raise UserError(_('Solo se pueden regenerar resultados en pruebas en borrador o en proceso.')) + + # Confirmar con el usuario + if self.result_ids: + # En producción, aquí se mostraría un wizard de confirmación + # Por ahora, eliminamos los resultados existentes + self.result_ids.unlink() + + # Regenerar + self._generate_test_results() + + self.message_post( + body=_('Resultados regenerados por %s') % self.env.user.name, + subject=_('Resultados Regenerados') + ) + + return True + def action_draft(self): """Regresa a borrador.""" self.ensure_one() diff --git a/lims_management/views/lims_test_views.xml b/lims_management/views/lims_test_views.xml index 2b7c5f8..9cc6360 100644 --- a/lims_management/views/lims_test_views.xml +++ b/lims_management/views/lims_test_views.xml @@ -24,6 +24,10 @@