From ef618df9e91f8d40411841cf452dd084672cd804 Mon Sep 17 00:00:00 2001 From: Hugo Adan Date: Thu, 14 Feb 2019 02:57:48 +0000 Subject: [PATCH] [REF] account: Performance improve unreconcile process (_reverse_move): _reverse_move presents a critical performance issue when unreconcile moves with a lot of account_move_line. The issue is that `account.move` and `account.move.line` models are triggering computed fields/methods for each new `account.move.line` added, computing all lines again and again. Making a factorial performance issue. For each line the function try create cash basis entries for tax/base lines and this is combined with all the fields compute that exists on the model so this introduce a performance problem The issue is that `account.move` and `account.move.line` models are triggering computed fields/methods for each new `account.move.line` created isolated, computing all lines again and again. e.g. _compute_matched_percentage at https://github.com/odoo/odoo/blob/5e8289cfeaf52a1eac64bcc975b186f0b5f9594b/addons/account/models/account_move.py#L44-L62 Then for each line modified/created this compute is executed for all lines (not just the last one). Now by using self.env.norecompute() and self.recompute() the problem was reduced. Unreconciling an 'account.move' with 1576 lines with a payment takes almost 4 minutes when before this changes, the conciliation process seemed not to never end. Fix https://github.com/odoo/odoo/issues/30934 closes odoo/odoo#31014 --- addons/account/models/account_move.py | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/addons/account/models/account_move.py b/addons/account/models/account_move.py index dafe47eafb3..5a3948d5733 100644 --- a/addons/account/models/account_move.py +++ b/addons/account/models/account_move.py @@ -232,16 +232,18 @@ class AccountMove(models.Model): @api.multi def _reverse_move(self, date=None, journal_id=None): self.ensure_one() - reversed_move = self.copy(default={ - 'date': date, - 'journal_id': journal_id.id if journal_id else self.journal_id.id, - 'ref': _('reversal of: ') + self.name}) - for acm_line in reversed_move.line_ids.with_context(check_move_validity=False): - acm_line.write({ - 'debit': acm_line.credit, - 'credit': acm_line.debit, - 'amount_currency': -acm_line.amount_currency - }) + with self.env.norecompute(): + reversed_move = self.copy(default={ + 'date': date, + 'journal_id': journal_id.id if journal_id else self.journal_id.id, + 'ref': _('reversal of: ') + self.name}) + for acm_line in reversed_move.line_ids.with_context(check_move_validity=False): + acm_line.write({ + 'debit': acm_line.credit, + 'credit': acm_line.debit, + 'amount_currency': -acm_line.amount_currency + }) + self.recompute() return reversed_move @api.multi @@ -1754,7 +1756,6 @@ class AccountPartialReconcile(models.Model): 'move_id': newly_created_move.id, 'partner_id': line.partner_id.id, }) - # Group by cash basis account and tax self.env['account.move.line'].with_context(check_move_validity=False).create({ 'name': line.name,