[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
This commit is contained in:
Denis Roussel
2021-11-03 18:20:54 +01:00
parent 87f8e2c6c7
commit db06979465

View File

@@ -599,19 +599,22 @@ class ContractContract(models.Model):
if not date_ref: if not date_ref:
date_ref = fields.Date.context_today(self) date_ref = fields.Date.context_today(self)
domain = self._get_contracts_to_invoice_domain(date_ref) 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 # Invoice by companies, so assignation emails get correct context
companies_to_invoice = self.read_group(domain, ["company_id"], ["company_id"]) # Use ids instead of recordset for perfomances reasons
for row in companies_to_invoice: for company in companies:
contracts_to_invoice = ( contracts_to_invoice = contracts.filtered(
self.search(row["__domain"]) lambda c: c.company_id == company
.with_context(allowed_company_ids=[row["company_id"][0]]) and (not c.date_end or c.recurring_next_date <= c.date_end)
.filtered( ).with_company(company)
lambda a: not a.date_end or a.recurring_next_date <= a.date_end invoice_ids.extend(
) contracts_to_invoice._recurring_create_invoice(date_ref).ids
) )
invoices |= contracts_to_invoice._recurring_create_invoice(date_ref) return invoice_obj.browse(invoice_ids)
return invoices
def action_terminate_contract(self): def action_terminate_contract(self):
self.ensure_one() self.ensure_one()