No se pueden desreservar las unidades reservadas

You are here:
  • Main
  • Errores
  • 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:

Call Now Button LLAMAR AHORA