From db069794657629a514292d1de4030fd5f41a4bd4 Mon Sep 17 00:00:00 2001 From: Denis Roussel Date: Wed, 3 Nov 2021 18:20:54 +0100 Subject: [PATCH] [14.0][IMP] contract: Improve invoice generation through cron Avoid too much sql queries by iterating on first search Avoid performances problems through invoices ids isntead of recordset --- contract/models/contract.py | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/contract/models/contract.py b/contract/models/contract.py index 807042cb2..61c0fbda5 100644 --- a/contract/models/contract.py +++ b/contract/models/contract.py @@ -599,19 +599,22 @@ class ContractContract(models.Model): if not date_ref: date_ref = fields.Date.context_today(self) domain = self._get_contracts_to_invoice_domain(date_ref) - invoices = self.env["account.move"] + invoice_obj = self.env["account.move"] + + contracts = self.search(domain) + companies = set(contracts.mapped("company_id")) + invoice_ids = [] # Invoice by companies, so assignation emails get correct context - companies_to_invoice = self.read_group(domain, ["company_id"], ["company_id"]) - for row in companies_to_invoice: - contracts_to_invoice = ( - self.search(row["__domain"]) - .with_context(allowed_company_ids=[row["company_id"][0]]) - .filtered( - lambda a: not a.date_end or a.recurring_next_date <= a.date_end - ) + # Use ids instead of recordset for perfomances reasons + for company in companies: + contracts_to_invoice = contracts.filtered( + lambda c: c.company_id == company + and (not c.date_end or c.recurring_next_date <= c.date_end) + ).with_company(company) + invoice_ids.extend( + contracts_to_invoice._recurring_create_invoice(date_ref).ids ) - invoices |= contracts_to_invoice._recurring_create_invoice(date_ref) - return invoices + return invoice_obj.browse(invoice_ids) def action_terminate_contract(self): self.ensure_one()