Recall advance line only for the amount not yet recalled

The method get_recall_lines is called each time an invoice is created so it
should consider the amount previously recalled.

Closes #12319
This commit is contained in:
Cédric Krier committed 2023-08-29 17:06:55 +02:00
1 parent e2e767fae2
commit 203fd3a1cf
1 file changed
+27 -14
+27 -14
View File
@@ -1,7 +1,7 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from decimal import Decimal
from itertools import chain
from itertools import chain, groupby
from simpleeval import simple_eval
@@ -353,24 +353,37 @@ class Sale(metaclass=PoolMeta):
recall_lines = []
advance_lines = InvoiceLine.search([
('type', '=', 'line'),
('origin', 'in', [str(c)
for c in self.advance_payment_conditions]),
('invoice.state', '=', 'paid'),
])
recalled_lines = InvoiceLine.search([
('type', '=', 'line'),
('origin', 'in', [str(al) for al in advance_lines]),
('invoice.state', '!=', 'cancelled'),
],
order=[('origin', None)])
recalled_lines = {
k: list(v) for k, v in groupby(recalled_lines, lambda l: l.origin)}
for advance_line in advance_lines:
line = InvoiceLine(
invoice=invoice,
company=invoice.company,
type=advance_line.type,
quantity=-advance_line.quantity,
account=advance_line.account,
unit_price=advance_line.amount,
description=advance_line.description,
origin=advance_line,
taxes=advance_line.taxes,
)
recall_lines.append(line)
amount = advance_line.amount
if advance_line in recalled_lines:
for recalled_line in recalled_lines[advance_line]:
amount += recalled_line.amount
if amount:
line = InvoiceLine(
invoice=invoice,
company=invoice.company,
type='line',
quantity=-1,
account=advance_line.account,
unit_price=amount,
description=advance_line.description,
origin=advance_line,
taxes=advance_line.taxes,
)
recall_lines.append(line)
return recall_lines
def create_invoice(self):