From 245092d63bed75327d4ad885baebea1b57ad39ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Fri, 15 Aug 2025 09:11:10 +0200 Subject: [PATCH] Add support for refunding payments on sales Closes #14166 --- modules/sale_payment/CHANGELOG | 1 + modules/sale_payment/sale.py | 17 +++++++++++------ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/modules/sale_payment/CHANGELOG b/modules/sale_payment/CHANGELOG index b8f7c3cc6f..d050d79c8f 100644 --- a/modules/sale_payment/CHANGELOG +++ b/modules/sale_payment/CHANGELOG @@ -1,3 +1,4 @@ +* Add support for refunding payments on sales Version 7.6.0 - 2025-04-28 -------------------------- diff --git a/modules/sale_payment/sale.py b/modules/sale_payment/sale.py index 8acf2bc401..8577896d53 100644 --- a/modules/sale_payment/sale.py +++ b/modules/sale_payment/sale.py @@ -28,10 +28,6 @@ class Sale(metaclass=PoolMeta): 'account.payment', 'origin', "Payments", domain=[ ('company', '=', Eval('company', -1)), - If(Eval('total_amount', 0) >= 0, - ('kind', '=', 'receivable'), - ('kind', '=', 'payable'), - ), ['OR', ('party', '=', If(Bool(Eval('invoice_party')), Eval('invoice_party', -1), Eval('party', -1))), @@ -69,7 +65,10 @@ class Sale(metaclass=PoolMeta): @property def payment_amount_authorized(self): "Total amount of the authorized payments" - return sum(p.amount for p in self.payments if p.is_authorized) + return (sum( + p.amount for p in self.payments + if p.kind == 'receivable' and p.is_authorized) + - sum(p.amount for p in self.payments if p.kind == 'payable')) @property def amount_to_pay(self): @@ -86,9 +85,15 @@ class Sale(metaclass=PoolMeta): ('payments', '!=', None), ('company', '=', context.get('company')), ]) + + def cover(authorized, amount): + return ( + abs(authorized) >= abs(amount) + and (authorized * amount >= 0)) + to_confirm = [] for sale in sales: - if sale.payment_amount_authorized >= sale.amount_to_pay: + if cover(sale.payment_amount_authorized, sale.amount_to_pay): to_confirm.append(sale) if to_confirm: to_confirm = cls.browse(to_confirm) # optimize cache