Error 'Expected singleton' al cancelar orden con múltiples muestras #69

Closed
opened 2025-07-17 02:30:55 +00:00 by luis_portillo · 2 comments

Descripción del Error

Cuando se intenta cancelar una orden de laboratorio que tiene múltiples muestras asociadas, se produce el siguiente error:

ValueError: Expected singleton: stock.lot(9, 10)

Pasos para Reproducir

  1. Crear una orden de laboratorio con múltiples análisis que generen varias muestras
  2. Confirmar la orden
  3. Intentar cancelar la orden usando el botón 'Cancelar'
  4. Se produce el error

Detalles Técnicos

Ubicación del Error

  • Archivo: lims_management/models/stock_lot.py
  • Método: action_cancel()
  • Línea: 209

Código Actual (Con Error)

def action_cancel(self):
    """Cancel the sample"""
    old_state = self.state  # <-- Error aquí cuando self tiene múltiples registros
    self.write({'state': 'cancelled'})
    self.message_post(
        body='Muestra cancelada por %s' % self.env.user.name,
        subject='Estado actualizado: Cancelada',
        message_type='notification'
    )

Causa del Error

El método action_cancel está siendo llamado desde sale_order.py línea 284 con múltiples registros:

samples_to_cancel.action_cancel()  # samples_to_cancel contiene múltiples muestras

Cuando se intenta acceder a self.state con múltiples registros, Odoo lanza el error 'Expected singleton' porque espera un único registro.

Solución Propuesta

Modificar el método para manejar múltiples registros usando un bucle:

def action_cancel(self):
    """Cancel the sample(s)"""
    for record in self:
        old_state = record.state
        record.write({'state': 'cancelled'})
        record.message_post(
            body='Muestra cancelada por %s' % self.env.user.name,
            subject='Estado actualizado: Cancelada',
            message_type='notification'
        )

Impacto

  • Severidad: Alta - Impide cancelar órdenes con múltiples muestras
  • Módulos afectados: stock.lot, sale.order
  • Funcionalidad afectada: Cancelación de órdenes de laboratorio

Notas Adicionales

Este mismo patrón podría estar presente en otros métodos de acción en el modelo stock.lot. Se recomienda revisar:

  • action_collect()
  • action_receive()
  • action_start_analysis()
  • action_complete_analysis()
  • action_store()
  • action_dispose()

Todos estos métodos deberían verificar si necesitan manejar múltiples registros.

## Descripción del Error Cuando se intenta cancelar una orden de laboratorio que tiene múltiples muestras asociadas, se produce el siguiente error: ``` ValueError: Expected singleton: stock.lot(9, 10) ``` ## Pasos para Reproducir 1. Crear una orden de laboratorio con múltiples análisis que generen varias muestras 2. Confirmar la orden 3. Intentar cancelar la orden usando el botón 'Cancelar' 4. Se produce el error ## Detalles Técnicos ### Ubicación del Error - **Archivo**: `lims_management/models/stock_lot.py` - **Método**: `action_cancel()` - **Línea**: 209 ### Código Actual (Con Error) ```python def action_cancel(self): """Cancel the sample""" old_state = self.state # <-- Error aquí cuando self tiene múltiples registros self.write({'state': 'cancelled'}) self.message_post( body='Muestra cancelada por %s' % self.env.user.name, subject='Estado actualizado: Cancelada', message_type='notification' ) ``` ### Causa del Error El método `action_cancel` está siendo llamado desde `sale_order.py` línea 284 con múltiples registros: ```python samples_to_cancel.action_cancel() # samples_to_cancel contiene múltiples muestras ``` Cuando se intenta acceder a `self.state` con múltiples registros, Odoo lanza el error 'Expected singleton' porque espera un único registro. ## Solución Propuesta Modificar el método para manejar múltiples registros usando un bucle: ```python def action_cancel(self): """Cancel the sample(s)""" for record in self: old_state = record.state record.write({'state': 'cancelled'}) record.message_post( body='Muestra cancelada por %s' % self.env.user.name, subject='Estado actualizado: Cancelada', message_type='notification' ) ``` ## Impacto - **Severidad**: Alta - Impide cancelar órdenes con múltiples muestras - **Módulos afectados**: stock.lot, sale.order - **Funcionalidad afectada**: Cancelación de órdenes de laboratorio ## Notas Adicionales Este mismo patrón podría estar presente en otros métodos de acción en el modelo stock.lot. Se recomienda revisar: - `action_collect()` - `action_receive()` - `action_start_analysis()` - `action_complete_analysis()` - `action_store()` - `action_dispose()` Todos estos métodos deberían verificar si necesitan manejar múltiples registros.
Author
Owner

Solución implementada en la rama bugfix/69-singleton-error-stock-lot. Se corrigieron todos los métodos action_* para manejar múltiples registros usando un bucle for.

Solución implementada en la rama bugfix/69-singleton-error-stock-lot. Se corrigieron todos los métodos action_* para manejar múltiples registros usando un bucle for.
Author
Owner

Solución implementada

Se han corregido todos los métodos de acción en el modelo stock.lot para manejar correctamente múltiples registros.

Cambios realizados:

  • action_collect()
  • action_receive()
  • action_start_analysis()
  • action_complete_analysis()
  • action_store()
  • action_dispose()
  • action_cancel()

Patrón aplicado:

La instancia ha sido reiniciada y no se presentaron errores. Los cambios están listos para revisión en la rama .

## Solución implementada Se han corregido todos los métodos de acción en el modelo stock.lot para manejar correctamente múltiples registros. ### Cambios realizados: - ✅ action_collect() - ✅ action_receive() - ✅ action_start_analysis() - ✅ action_complete_analysis() - ✅ action_store() - ✅ action_dispose() - ✅ action_cancel() ### Patrón aplicado: La instancia ha sido reiniciada y no se presentaron errores. Los cambios están listos para revisión en la rama .
Sign in to join this conversation.
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: Grupo-Consiti/clinical_laboratory#69
No description provided.