feat(#51): Task 6 completada - Actualizar generación automática de resultados

- 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 <noreply@anthropic.com>
This commit is contained in:
Luis Ernesto Portillo Zaldivar 2025-07-15 12:40:44 -06:00
parent 5bee8e79df
commit 79373a01a1
2 changed files with 66 additions and 1 deletions

View File

@ -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()

View File

@ -24,6 +24,10 @@
<button name="action_draft" string="Volver a Borrador"
type="object"
invisible="state != 'cancelled'"/>
<button name="action_regenerate_results" string="Regenerar Resultados"
type="object"
invisible="state not in ['draft', 'in_process']"
confirm="¿Está seguro de regenerar los resultados? Esto eliminará los resultados actuales."/>
<field name="state" widget="statusbar"
statusbar_visible="draft,in_process,result_entered,validated"/>
</header>