summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJigar Vaghela <jva@odoo.com>2021-04-15 13:29:40 +0000
committerJigar Vaghela <jva@odoo.com>2021-05-14 14:05:13 +0000
commit5f8fab2edb80ca1b88850472da80018271a15177 (patch)
tree9fe70ef687366ce9e24fa53fa09c784f3ea06e9d
parent1d7b5e5b63d2f92ea5493f028fc5987c9cfba1ff (diff)
[FIX] account: bug fix and rewrite query of function _adapt_parent_account_group and _adapt_parent_account_group
before this commit: _adapt_parent_account_group or _adapt_parent_account_group call with multi-company record then raise singleton error after this commit: singleton error is fixed closes odoo/odoo#69323 Signed-off-by: William André (wan) <wan@odoo.com>
-rw-r--r--addons/account/models/account_account.py56
1 files changed, 35 insertions, 21 deletions
diff --git a/addons/account/models/account_account.py b/addons/account/models/account_account.py
index e0750616d93..05317a8a251 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):