From 5635867f243aee7b83a12fef97ea562c28c15b6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Wed, 13 Dec 2023 23:27:42 +0100 Subject: [PATCH] Reset and cancel shipment when purchase request is cancelled The stock moves of the linked sale line is cancelled so the linked shipment state must be updated to synchronize the inventory moves or to cancel it. Closes #12825 (grafted from ced7b09694dd5f0eb513ad014ee4cff0c979073e) --HG-- branch : 6.0 --- modules/sale_supply/purchase.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/modules/sale_supply/purchase.py b/modules/sale_supply/purchase.py index 777a73cb2b..ebdbefebf2 100644 --- a/modules/sale_supply/purchase.py +++ b/modules/sale_supply/purchase.py @@ -85,15 +85,29 @@ class HandlePurchaseCancellationException(metaclass=PoolMeta): pool = Pool() SaleLine = pool.get('sale.line') Move = pool.get('stock.move') + Shipment = pool.get('stock.shipment.out') next_state = super(HandlePurchaseCancellationException, self).transition_cancel_request() moves = [] + shipments = set() for sub_ids in grouped_slice(list(map(int, self.records))): sale_lines = SaleLine.search([ ('purchase_request', 'in', sub_ids), ]) - moves += [m for line in sale_lines for m in line.moves] + for sale_line in sale_lines: + moves.extend(sale_line.moves) + for shipment in sale_line.sale.shipments: + if shipment.state in ['draft', 'waiting']: + shipments.add(shipment) if moves: + shipments_waiting = [s for s in shipments if s.state == 'waiting'] + Shipment.draft(shipments) # clear inventory moves Move.cancel(moves) + Shipment.wait([ + s for s in shipments_waiting + if any(m.state != 'cancelled' for m in s.outgoing_moves)]) + Shipment.cancel([ + s for s in shipments_waiting + if all(m.state == 'cancelled' for m in s.outgoing_moves)]) return next_state