From c54d3e89ec31e607c7bb3a90f48f3f7eb96a1718 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Thu, 16 May 2024 14:47:22 +0200 Subject: [PATCH] Extract SQL query for lines to pay of invoices --- modules/account_invoice/invoice.py | 60 ++++++++++++++++-------------- 1 file changed, 33 insertions(+), 27 deletions(-) diff --git a/modules/account_invoice/invoice.py b/modules/account_invoice/invoice.py index cb6c5e7306..f30e0a1f61 100644 --- a/modules/account_invoice/invoice.py +++ b/modules/account_invoice/invoice.py @@ -767,41 +767,47 @@ class Invoice(Workflow, ModelSQL, ModelView, TaxableMixin, InvoiceReportMixin): return max(r.date for r in reconciliations) @classmethod - def get_lines_to_pay(cls, invoices, name): + def _query_lines_to_pay(cls, invoices): pool = Pool() MoveLine = pool.get('account.move.line') AdditionalMove = pool.get('account.invoice-additional-account.move') line = MoveLine.__table__() invoice = cls.__table__() additional_move = AdditionalMove.__table__() - cursor = Transaction().connection.cursor() + red_sql = reduce_ids(invoice.id, invoices) + query = (invoice + .join(line, + condition=((invoice.move == line.move) + & (invoice.account == line.account))) + .select( + invoice.id.as_('invoice'), + line.id.as_('line'), + line.maturity_date.as_('maturity_date'), + where=red_sql)) + query |= (invoice + .join(additional_move, + condition=additional_move.invoice == invoice.id) + .join(line, + condition=((additional_move.move == line.move) + & (invoice.account == line.account))) + .select( + invoice.id.as_('invoice'), + line.id.as_('line'), + line.maturity_date.as_('maturity_date'), + where=red_sql)) + return query + + @classmethod + def get_lines_to_pay(cls, invoices, name): + cursor = Transaction().connection.cursor() lines = defaultdict(list) - for sub_ids in grouped_slice(invoices): - red_sql = reduce_ids(invoice.id, sub_ids) - query = (invoice - .join(line, - condition=((invoice.move == line.move) - & (invoice.account == line.account))) - .select( - invoice.id.as_('invoice'), - line.id.as_('line'), - line.maturity_date.as_('maturity_date'), - where=red_sql)) - query |= (invoice - .join(additional_move, - condition=additional_move.invoice == invoice.id) - .join(line, - condition=((additional_move.move == line.move) - & (invoice.account == line.account))) - .select( - invoice.id.as_('invoice'), - line.id.as_('line'), - line.maturity_date.as_('maturity_date'), - where=red_sql)) - cursor.execute(*query.select( - query.invoice, query.line, - order_by=query.maturity_date.nulls_last)) + for sub_invoices in grouped_slice(invoices): + query = cls._query_lines_to_pay(sub_invoices) + query = query.select( + query.invoice, query.line, + order_by=query.maturity_date.nulls_last) + cursor.execute(*query) for invoice_id, line_id in cursor: lines[invoice_id].append(line_id) return lines