diff --git a/sale_order_line_cancel/__manifest__.py b/sale_order_line_cancel/__manifest__.py index 91002adc4507..c86db022eb6a 100644 --- a/sale_order_line_cancel/__manifest__.py +++ b/sale_order_line_cancel/__manifest__.py @@ -1,4 +1,5 @@ -# © 2016 Sylvain Van Hoof +# Copyright 2018 Sylvain Van Hoof (Okia SPRL) +# Copyright 2018 Jacques-Etienne Baudoux (BCIM) # Copyright 2023 ACSONE SA/NV # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). diff --git a/sale_order_line_cancel/models/sale_order_line.py b/sale_order_line_cancel/models/sale_order_line.py index 575b4266c3d9..878c2b827f5b 100644 --- a/sale_order_line_cancel/models/sale_order_line.py +++ b/sale_order_line_cancel/models/sale_order_line.py @@ -1,4 +1,5 @@ # Copyright 2018 Okia SPRL +# Copyright 2018 Jacques-Etienne Baudoux (BCIM) # Copyright 2020 ACSONE SA/NV # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). @@ -30,11 +31,11 @@ def _compute_can_cancel_remaining_qty(self): for rec in self: rec.can_cancel_remaining_qty = ( float_compare( - rec.product_qty_remains_to_deliver, 0, precision_digits=precision + rec.qty_remains_to_deliver, 0, precision_digits=precision ) == 1 and rec.state in ("sale", "done") - and rec.move_ids + and rec.qty_delivered_method == 'stock_move' ) @api.depends( @@ -44,10 +45,8 @@ def _compute_can_cancel_remaining_qty(self): ) def _compute_product_qty_remains_to_deliver(self): for line in self: - remaining_to_deliver = ( - line.product_uom_qty - line.qty_delivered - line.product_qty_canceled - ) - line.product_qty_remains_to_deliver = remaining_to_deliver + qty_remaining = line.qty_to_deliver - line.product_qty_canceled + line.product_qty_remains_to_deliver = qty_remaining def _get_moves_to_cancel(self): return self.move_ids.filtered(lambda m: m.state not in ("done", "cancel")) @@ -101,10 +100,10 @@ def _cancel_by_running_procurement(self): simulate_procured_qty = self.product_uom_qty + qty_to_cancel self.ensure_one() line = self.with_context(simulate_procured_qty=simulate_procured_qty) - previous_sate = line.state + previous_state = line.state line.state = "sale" line._action_launch_stock_rule(simulate_procured_qty) - line.state = previous_sate + line.state = previous_state line.product_qty_canceled += qty_to_cancel def _get_qty_procurement(self, previous_product_uom_qty=False): diff --git a/sale_order_line_cancel/models/stock_move.py b/sale_order_line_cancel/models/stock_move.py index 80167aa9cc14..7da52c582baf 100644 --- a/sale_order_line_cancel/models/stock_move.py +++ b/sale_order_line_cancel/models/stock_move.py @@ -1,4 +1,5 @@ # Copyright 2023 ACSONE SA/NV +# Copyright 2024 Jacques-Etienne Baudoux (BCIM) # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from odoo import models @@ -13,8 +14,10 @@ def _action_cancel(self): lambda m: m.sale_line_id and m.state not in ("done", "cancel") ) res = super()._action_cancel() - for rec in sale_moves: - if rec.state != "cancel": + sale_lines = sale_moves.filtered(lambda m: m.state == "cancel").sale_line_id + for line in sale_lines: + # Update SO line qty canceled only when all remaining moves are canceled + if line._get_moves_to_cancel(): continue - rec.sale_line_id.product_qty_canceled = rec.product_uom_qty + line.product_qty_canceled = line.qty_to_deliver return res