diff --git a/addons/account/models/account_account.py b/addons/account/models/account_account.py index e0750616d9362b31bbd3e05aae3ace27910a387f..05317a8a2517d90fe83f6d4b6c53c7201a77474b 100644 --- a/addons/account/models/account_account.py +++ b/addons/account/models/account_account.py @@ -617,16 +617,23 @@ class AccountGroup(models.Model): """ if not self and not account_ids: return - self.env['account.group'].flush() - self.env['account.account'].flush() + self.env['account.group'].flush(self.env['account.group']._fields) + self.env['account.account'].flush(self.env['account.account']._fields) query = """ - UPDATE account_account account SET group_id = ( - SELECT agroup.id FROM account_group agroup - WHERE agroup.code_prefix_start <= LEFT(account.code, char_length(agroup.code_prefix_start)) - AND agroup.code_prefix_end >= LEFT(account.code, char_length(agroup.code_prefix_end)) - AND agroup.company_id = account.company_id - ORDER BY char_length(agroup.code_prefix_start) DESC LIMIT 1 - ) WHERE account.company_id in %(company_ids)s {where_account}; + WITH relation AS ( + SELECT DISTINCT FIRST_VALUE(agroup.id) OVER (PARTITION BY account.id ORDER BY char_length(agroup.code_prefix_start) DESC, agroup.id) AS group_id, + account.id AS account_id + FROM account_group agroup + JOIN account_account account + ON agroup.code_prefix_start <= LEFT(account.code, char_length(agroup.code_prefix_start)) + AND agroup.code_prefix_end >= LEFT(account.code, char_length(agroup.code_prefix_end)) + AND agroup.company_id = account.company_id + WHERE account.company_id IN %(company_ids)s {where_account} + ) + UPDATE account_account account + SET group_id = relation.group_id + FROM relation + WHERE relation.account_id = account.id; """.format( where_account=account_ids and 'AND account.id IN %(account_ids)s' or '' ) @@ -642,21 +649,28 @@ class AccountGroup(models.Model): """ if not self: return - self.env['account.group'].flush() + self.env['account.group'].flush(self.env['account.group']._fields) query = """ - UPDATE account_group agroup SET parent_id = ( - SELECT parent.id FROM account_group parent - WHERE char_length(parent.code_prefix_start) < char_length(agroup.code_prefix_start) - AND parent.code_prefix_start <= LEFT(agroup.code_prefix_start, char_length(parent.code_prefix_start)) - AND parent.code_prefix_end >= LEFT(agroup.code_prefix_end, char_length(parent.code_prefix_end)) - AND parent.id != agroup.id - AND parent.company_id = %(company_id)s - ORDER BY char_length(parent.code_prefix_start) DESC LIMIT 1 - ) WHERE agroup.company_id = %(company_id)s; + WITH relation AS ( + SELECT DISTINCT FIRST_VALUE(parent.id) OVER (PARTITION BY child.id ORDER BY child.id, char_length(parent.code_prefix_start) DESC) AS parent_id, + child.id AS child_id + FROM account_group parent + JOIN account_group child + ON char_length(parent.code_prefix_start) < char_length(child.code_prefix_start) + AND parent.code_prefix_start <= LEFT(child.code_prefix_start, char_length(parent.code_prefix_start)) + AND parent.code_prefix_end >= LEFT(child.code_prefix_end, char_length(parent.code_prefix_end)) + AND parent.id != child.id + AND parent.company_id = child.company_id + WHERE child.company_id IN %(company_ids)s + ) + UPDATE account_group child + SET parent_id = relation.parent_id + FROM relation + WHERE child.id = relation.child_id; """ - self.env.cr.execute(query, {'company_id': self.company_id.id}) + self.env.cr.execute(query, {'company_ids': tuple(self.company_id.ids)}) self.env['account.group'].invalidate_cache(fnames=['parent_id']) - self.env['account.group'].search([('company_id', '=', self.company_id.id)])._parent_store_update() + self.env['account.group'].search([('company_id', 'in', self.company_id.ids)])._parent_store_update() class AccountRoot(models.Model):