From db0b16365d04a79c19324342ef798ca043486fa6 Mon Sep 17 00:00:00 2001 From: Juan Ignacio Carreras Date: Tue, 10 Feb 2026 15:46:32 +0000 Subject: [PATCH] [IMP]purchase_stock_ux:admit cancel remaining in blocked orders --- .../models/purchase_order_line.py | 29 ++++++++++++------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/purchase_stock_ux/models/purchase_order_line.py b/purchase_stock_ux/models/purchase_order_line.py index 735dbde5..ec6aa6f0 100644 --- a/purchase_stock_ux/models/purchase_order_line.py +++ b/purchase_stock_ux/models/purchase_order_line.py @@ -63,13 +63,14 @@ def button_cancel_remaining(self): # la cancelación de kits no está bien resuelta ya que odoo # solo computa la cantidad entregada cuando todo el kit se entregó. # Cuestión que, por ahora, desactivamos la cancelación de kits. - if self.order_id.state == "done": - raise UserError( - _( - "Cancel remaining quantities can't be called for blocked purchase orders. " - "First unblock the purchase order" - ) - ) + + # Manejar órdenes bloqueadas (done): desbloquear temporalmente sin tracking + orders_to_relock = self.env["purchase.order"] + for order in self.mapped("order_id").filtered(lambda o: o.state == "done"): + orders_to_relock |= order + # Desbloquear sin generar mensaje en el chatter + order.with_context(tracking_disable=True).write({"state": "purchase"}) + bom_enable = "bom_ids" in self.env["product.template"]._fields for rec in self: old_product_qty = rec.product_qty @@ -104,6 +105,10 @@ def button_cancel_remaining(self): % (rec.name, rec.id, old_product_qty, rec.product_qty) ) + # Volver a bloquear las órdenes que estaban bloqueadas sin generar mensaje + if orders_to_relock: + orders_to_relock.with_context(tracking_disable=True).write({"state": "done"}) + def _compute_vouchers(self): # Cambiamos esta lógica ya que antes teníamos si o si voucher_ids por dependencias y ahora va a depender de que esté instalado stock_voucher for rec in self: @@ -174,10 +179,12 @@ def _compute_qty_returned(self): for line in self: qty = 0.0 for move in line.move_ids.filtered( - lambda m: m.state == "done" - and m.location_id.usage != "supplier" - and m.to_refund - and not m._is_exchange_move_helper() + lambda m: ( + m.state == "done" + and m.location_id.usage != "supplier" + and m.to_refund + and not m._is_exchange_move_helper() + ) ): qty += move.product_uom._compute_quantity(move.product_uom_qty, line.product_uom) line.qty_returned = qty