Skip to content
Snippets Groups Projects
Commit d604decc authored by Quentin De Paoli's avatar Quentin De Paoli
Browse files

[IMP] account: speedup of the aged partner balance


Removed a browse on partners made in a loop, for a substantial gain of time and DB queries.

Observed gain for a real data DB with 500 partners to print in the aged report:
time (ms)                  # queries
Before patch               4583                       1623
After patch                2932                        553
Gain                       1651 (36%)                 1070 (66%)

closes odoo/odoo#36488

Signed-off-by: default avatarQuentin De Paoli (qdp) <qdp@openerp.com>
parent fec4e77a
No related branches found
No related tags found
No related merge requests found
......@@ -7,7 +7,6 @@ from odoo.tools import float_is_zero
from datetime import datetime
from dateutil.relativedelta import relativedelta
class ReportAgedPartnerBalance(models.AbstractModel):
_name = 'report.account.report_agedpartnerbalance'
......@@ -70,9 +69,13 @@ class ReportAgedPartnerBalance(models.AbstractModel):
partner_ids = self.env['res.partner'].search([('category_id', 'in', ctx['partner_categories'].ids)]).ids
arg_list += (tuple(partner_ids or [0]),)
arg_list += (date_from, tuple(company_ids))
query = '''
SELECT DISTINCT l.partner_id, UPPER(res_partner.name)
FROM account_move_line AS l left join res_partner on l.partner_id = res_partner.id, account_account, account_move am
SELECT DISTINCT l.partner_id, res_partner.name AS name, UPPER(res_partner.name) AS UPNAME, CASE WHEN prop.value_text IS NULL THEN 'normal' ELSE prop.value_text END AS trust
FROM account_move_line AS l
LEFT JOIN res_partner ON l.partner_id = res_partner.id
LEFT JOIN ir_property prop ON (prop.res_id = 'res.partner,'||res_partner.id AND prop.name='trust' AND prop.company_id=%s),
account_account, account_move am
WHERE (l.account_id = account_account.id)
AND (l.move_id = am.id)
AND (am.state IN %s)
......@@ -81,6 +84,7 @@ class ReportAgedPartnerBalance(models.AbstractModel):
AND (l.date <= %s)
AND l.company_id IN %s
ORDER BY UPPER(res_partner.name)'''
arg_list = (self.env.company.id,) + arg_list
cr.execute(query, arg_list)
partners = cr.dictfetchall()
......@@ -211,21 +215,18 @@ class ReportAgedPartnerBalance(models.AbstractModel):
if not float_is_zero(values[str(i)], precision_rounding=self.env.company.currency_id.rounding):
at_least_one_amount = True
values['total'] = sum([values['direction']] + [values[str(i)] for i in range(5)])
## Add for total
# Add for total
total[(i + 1)] += values['total']
values['partner_id'] = partner['partner_id']
if partner['partner_id']:
#browse the partner name and trust field in sudo, as we may not have full access to the record (but we still have to see it in the report)
browsed_partner = self.env['res.partner'].sudo().browse(partner['partner_id'])
values['name'] = browsed_partner.name and len(browsed_partner.name) >= 45 and browsed_partner.name[0:40] + '...' or browsed_partner.name
values['trust'] = browsed_partner.trust
values['name'] = len(partner['name']) >= 45 and partner['name'][0:40] + '...' or partner['name']
values['trust'] = partner['trust']
else:
values['name'] = _('Unknown Partner')
values['trust'] = False
if at_least_one_amount or (self._context.get('include_nullified_amount') and lines[partner['partner_id']]):
res.append(values)
return res, total, lines
@api.model
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment