From 7a7d744c374faccf43a4eae7e76dc7eb4cdcb647 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Tue, 31 Dec 2024 15:24:10 +0100 Subject: [PATCH] Use actual quantity of sale line when executing sale complaint Closes #13783 --- modules/sale_complaint/CHANGELOG | 1 + modules/sale_complaint/complaint.py | 30 +++++++++++++++++++++++++++-- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/modules/sale_complaint/CHANGELOG b/modules/sale_complaint/CHANGELOG index 4b5b5d9cf8..1b532557b4 100644 --- a/modules/sale_complaint/CHANGELOG +++ b/modules/sale_complaint/CHANGELOG @@ -1,3 +1,4 @@ +* Use actual quantity of sale line Version 7.4.0 - 2024-11-04 -------------------------- diff --git a/modules/sale_complaint/complaint.py b/modules/sale_complaint/complaint.py index e4f3aba89d..f392c53265 100644 --- a/modules/sale_complaint/complaint.py +++ b/modules/sale_complaint/complaint.py @@ -521,6 +521,9 @@ class Action(ModelSQL, ModelView): 'sale.line', 'account.invoice.line'}: if self.quantity is not None: quantity = self.quantity + elif (self.complaint.origin_model == 'sale.line' + and self.complaint.origin.actual_quantity is not None): + quantity = self.complaint.origin.actual_quantity else: quantity = self.complaint.origin.quantity if self.unit_price is not None: @@ -534,7 +537,18 @@ class Action(ModelSQL, ModelView): elif self.complaint.origin_model == 'sale.sale': if not self.sale_lines: if self.complaint and self.complaint.origin: - return self.complaint.origin.untaxed_amount + sale = self.complaint.origin + amount = 0 + for line in sale.lines: + if line.type != 'line': + continue + if line.actual_quantity is not None: + quantity = line.actual_quantity + else: + quantity = line.quantity + amount += sale.currency.round( + Decimal(str(quantity)) * line.unit_price) + return amount else: return sum( getattr(l, 'amount', None) or Decimal(0) @@ -613,12 +627,21 @@ class Action(ModelSQL, ModelView): default['unit_price'] = lambda o: line2price.get(o['id']) else: sale_lines = [l for l in sale.lines if l.type == 'line'] + default['quantity'] = lambda o: ( + o['actual_quantity'] + if o['actual_quantity'] is not None + else o['quantity']) elif isinstance(self.complaint.origin, Line): sale_line = self.complaint.origin sale = sale_line.sale sale_lines = [sale_line] if self.quantity is not None: default['quantity'] = self.quantity + else: + default['quantity'] = ( + sale_line.actual_quantity + if sale_line.actual_quantity is not None + else sale_line.quantity) if self.unit_price is not None: default['unit_price'] = self.unit_price return_sale, = Sale.copy([sale], default={'lines': None}) @@ -797,7 +820,10 @@ class Action_SaleLine(_Action_Line, ModelView, ModelSQL): if self.quantity is not None: return self.quantity elif self.line: - return self.line.quantity + if self.line.actual_quantity is not None: + return self.line.actual_quantity + else: + return self.line.quantity @fields.depends('unit_price', 'line') def get_unit_price(self):