Skip to Content
Menu
Dette spørgsmål er blevet anmeldt
1 Svar
236 Visninger

 I've developed a mod to validate in real time in stock.move.line that serial numbers used in other pickings or duplicates are not entered on the same delivery note.  Can someone help me?

Avatar
Kassér

What kind of help do you think readers can provide without seeing your code?

Bedste svar

Hi,

Please refer to the code below:


from odoo import api, models
from odoo.exceptions import ValidationError

class StockMoveLine(models.Model):
_inherit = 'stock.move.line'

@api.onchange('lot_id')
def _onchange_lot_id_serial_validation(self):
for line in self:
if not line.lot_id or not line.picking_id:
continue

# 1. Check for duplicate in same picking
duplicate_lines = self.env['stock.move.line'].search([
('picking_id', '=', line.picking_id.id),
('lot_id', '=', line.lot_id.id),
('id', '!=', line.id)
])
if duplicate_lines:
raise ValidationError("This serial number is already used in this delivery note.")

# 2. Check if serial is used in any other *validated* delivery
other_pickings = self.env['stock.move.line'].search([
('lot_id', '=', line.lot_id.id),
('picking_id', '!=', line.picking_id.id),
('picking_id.state', '=', 'done')
], limit=1)
if other_pickings:
raise ValidationError(f"The serial number '{line.lot_id.name}' is already used in another completed delivery.")

@api.constrains('lot_id', 'picking_id')
def _check_serial_number_constraints(self):
for line in self:
if not line.lot_id or not line.picking_id:
continue

# Same logic as onchange, repeated for backend safety

duplicate_lines = self.env['stock.move.line'].search([
('picking_id', '=', line.picking_id.id),
('lot_id', '=', line.lot_id.id),
('id', '!=', line.id)
])
if duplicate_lines:
raise ValidationError("This serial number is already used in this delivery note.")

other_pickings = self.env['stock.move.line'].search([
('lot_id', '=', line.lot_id.id),
('picking_id', '!=', line.picking_id.id),
('picking_id.state', '=', 'done')
], limit=1)
if other_pickings:
raise ValidationError(f"The serial number '{line.lot_id.name}' is already used in another completed delivery.")

Hope it helps.

Avatar
Kassér