No se pueden desreservar las unidades reservadas
Para poder desbloquear un albarán que le ocurre este error, hay que correr un script. Si es la primera vez que ocurre esto, hay que crear el script siguiendo estos pasos:
https://erpcloud.id/blog/our-blog-1/post/it-is-not-possible-to-unreserve-more-products-of-9
1.debug mode
2.technical/server actions
3.create
4.action name: e.g. fix unreserved qty
5.model: ir.actions.server (Server Action)
6.action to do: «execute python code»
7.copy/paste the fix underneath the pre-existing code
===========================
quants = env[‘stock.quant’].search([])
move_line_ids = []
warning = »
for quant in quants:
move_lines = env[«stock.move.line»].search([
(‘product_id’, ‘=’, quant.product_id.id),
(‘location_id’, ‘=’, quant.location_id.id),
(‘lot_id’, ‘=’, quant.lot_id.id),
(‘package_id’, ‘=’, quant.package_id.id),
(‘owner_id’, ‘=’, quant.owner_id.id),
(‘product_qty’, ‘!=’, 0)
])
move_line_ids += move_lines.ids
reserved_on_move_lines = sum(move_lines.mapped(‘product_qty’))
move_line_str = str.join(‘, ‘, [str(move_line_id) for move_line_id in move_lines.ids])
if quant.location_id.should_bypass_reservation():
# If a quant is in a location that should bypass the reservation, its `reserved_quantity` field
# should be 0.
if quant.reserved_quantity != 0:
quant.write({‘reserved_quantity’: 0})
else:
# If a quant is in a reservable location, its `reserved_quantity` should be exactly the sum
# of the `product_qty` of all the partially_available / assigned move lines with the same
# characteristics.
if quant.reserved_quantity == 0:
if move_lines:
move_lines.with_context(bypass_reservation_update=True).write({‘product_uom_qty’: 0})
elif quant.reserved_quantity < 0:
quant.write({‘reserved_quantity’: 0})
if move_lines:
move_lines.with_context(bypass_reservation_update=True).write({‘product_uom_qty’: 0})
else:
if reserved_on_move_lines != quant.reserved_quantity:
move_lines.with_context(bypass_reservation_update=True).write({‘product_uom_qty’: 0})
quant.write({‘reserved_quantity’: 0})
else:
if any(move_line.product_qty < 0 for move_line in move_lines):
move_lines.with_context(bypass_reservation_update=True).write({‘product_uom_qty’: 0})
quant.write({‘reserved_quantity’: 0})
move_lines = env[‘stock.move.line’].search([
(‘product_id.type’, ‘=’, ‘product’),
(‘product_qty’, ‘!=’, 0),
(‘id’, ‘not in’, move_line_ids),
])
move_lines_to_unreserve = []
for move_line in move_lines:
if not move_line.location_id.should_bypass_reservation():
move_lines_to_unreserve.append(move_line.id)
if len(move_lines_to_unreserve) > 1:
env.cr.execute(«»» UPDATE stock_move_line SET product_uom_qty = 0, product_qty = 0 WHERE id in %s ;»»» % (tuple(move_lines_to_unreserve), ))
elif len(move_lines_to_unreserve) == 1:
env.cr.execute(«»» UPDATE stock_move_line SET product_uom_qty = 0, product_qty = 0 WHERE id = %s ;»»» % (move_lines_to_unreserve[0]))
============================
8.»save»
9.»create contextual action»
10.refresh page
11.action/fix «fix unreserved qty» / Run
12.wait for it to load
13.»remove contextual action»
14.action/delete
Si ya tenemos el script creado, simplemente accedemos al script y lo ejecutamos: