Odoo tiene un pequeño bug que es permitir ingresar el mismo número de serie en dos ubicaciones diferentes. Esto ocurre cuando se hacen ajustes manuales de inventario (no lo probe con movimientos de stock, ahí lo veo más complicado).
La solución es muy parecida a la que se aplica cuando uno busca prevenir el stock negativo, se hace el control en el momento de crear el quant. En este caso, si el quant tiene un número de serie y este número de serie es realmente un número de serie (no sea cosa que hagamos el control con los lotes), chequeamos que solo exista un quant para una ubicación interna (que es donde se almacena fisicamente el stock). Si hay más de una ubicación interna, se emite un mensaje de error:
from odoo import models, api
from odoo.exceptions import ValidationError
class StockQuant(models.Model):
_inherit = "stock.quant"
@api.constrains('lot_id', 'location_id', 'quantity')
def _check_unique_serial_location(self):
for quant in self:
if not quant.lot_id:
continue
product = quant.product_id
if product.tracking != 'serial':
continue
# search all internal quants with same serial
quants = self.search([
('lot_id', '=', quant.lot_id.id),
('product_id', '=', product.id),
('location_id.usage', '=', 'internal'),
('quantity', '>', 0),
])
if len(quants) > 1:
raise ValidationError(
f"El número de serie {quant.lot_id.name} "
"no puede existir en múltiples ubicaciones internas."
)
Y al momento de hacer la actualización manual de stock, veremos el siguiente mensaje de error:
