mirror of
https://github.com/OCA/contract.git
synced 2025-02-13 17:57:24 +02:00
[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:
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user