[FIX] account: Fix dashboard graph samples in multi-currency

- Setup 2 companies with a COA: compA & compB
- For compA, have a journal having some data
- Give you access to compA & compB but make sure compB is your main company
=> samples data are displayed on the accounting dashboard for the journal

- Setup 2 companies with a COA: compA & compB, compB being a branch of compA
- For compA, create a journal
- Add some data into this journal using compB
- Give you access to only compA
=> you should not be able to see the data from compA since the data belongs to compB

Introduced by:
https://github.com/odoo/odoo/commit/24789b2c906e71d347924bfa1bcc7d3ca77d8daf

This commit also adds the company check in all queries/domains to manage the
branches correctly.

closes odoo/odoo#156737

Issue: 3722386
X-original-commit: a8097355ee8c4891ba4161fd82eb54f5d2d80e8c
Signed-off-by: William André (wan) <wan@odoo.com>
Signed-off-by: Laurent Smet (las) <las@odoo.com>
This commit is contained in:
Laurent Smet
2024-03-08 11:17:42 +00:00
parent a35d47a988
commit d8d78849f3
@@ -131,12 +131,14 @@ class account_journal(models.Model):
FROM account_move move
JOIN res_company company ON company.id = move.company_id
WHERE move.journal_id = ANY(%(journal_ids)s)
AND move.company_id = ANY(%(company_ids)s)
AND (move.state = 'posted' OR (move.state = 'draft' AND move.name != '/'))
AND (company.fiscalyear_lock_date IS NULL OR move.date > company.fiscalyear_lock_date)
GROUP BY move.journal_id, move.sequence_prefix
HAVING COUNT(*) != MAX(move.sequence_number) - MIN(move.sequence_number) + 1
""", {
'journal_ids': self.ids,
'company_ids': self.env.companies.ids,
})
return self.env.cr.fetchall()
@@ -149,7 +151,10 @@ class account_journal(models.Model):
res = {
journal.id: count
for journal, count in self.env['account.move']._read_group(
domain=[('journal_id', 'in', self.ids)],
domain=[
*self.env['account.move']._check_company_domain(self.env.companies),
('journal_id', 'in', self.ids),
],
groupby=['journal_id'],
aggregates=['__count'],
)
@@ -186,10 +191,11 @@ class account_journal(models.Model):
WHERE move.journal_id = ANY(%s)
AND move.date > %s
AND move.date <= %s
AND move.company_id = ANY(%s)
GROUP BY move.date, move.journal_id
ORDER BY move.date DESC
"""
self.env.cr.execute(query, (self.ids, last_month, today))
self.env.cr.execute(query, (self.ids, last_month, today, self.env.companies.ids))
query_result = group_by_journal(self.env.cr.dictfetchall())
result = {}
@@ -200,8 +206,7 @@ class account_journal(models.Model):
journal_result = query_result[journal.id]
color = '#875A7B' if 'e' in version else '#7c7bad'
accessible = journal.company_id.id in self.env.company._accessible_branches().ids
is_sample_data = not accessible or not journal.has_statement_lines
is_sample_data = not journal_result and not journal.has_statement_lines
data = []
if is_sample_data:
@@ -248,10 +253,12 @@ class account_journal(models.Model):
AND move.state = 'posted'
AND move.payment_state in ('not_paid', 'partial')
AND move.move_type IN %(invoice_types)s
AND move.company_id = ANY(%(company_ids)s)
GROUP BY move.journal_id
""", {
'invoice_types': tuple(self.env['account.move'].get_invoice_types(True)),
'journal_ids': self.ids,
'company_ids': self.env.companies.ids,
'start_week1': first_day_of_week + timedelta(days=-7),
'start_week2': first_day_of_week + timedelta(days=0),
'start_week3': first_day_of_week + timedelta(days=7),
@@ -329,7 +336,10 @@ class account_journal(models.Model):
res = {
journal.id: count
for journal, count in self.env[model]._read_group(
domain=[('journal_id', 'in', self.ids)] + domain,
domain=[
*self.env[model]._check_company_domain(self.env.companies),
('journal_id', 'in', self.ids),
] + domain,
groupby=['journal_id'],
aggregates=['__count'],
)
@@ -376,9 +386,10 @@ class account_journal(models.Model):
[('account_id', '=', journal.default_account_id.id)]
)
misc_domain = [
*self.env['account.move.line']._check_company_domain(self.env.companies),
('statement_line_id', '=', False),
('parent_state', '=', 'posted'),
] + expression.OR(misc_domain)
] + expression.OR(misc_domain)
misc_totals = {
account: (balance, count)
@@ -394,6 +405,7 @@ class account_journal(models.Model):
for journal, amount, count in self.env['account.bank.statement.line']._read_group(
domain=[
('journal_id', 'in', bank_cash_journals.ids),
('move_id.company_id', 'in', self.env.companies.ids),
('move_id.to_check', '=', True),
('move_id.state', '=', 'posted'),
],
@@ -408,7 +420,7 @@ class account_journal(models.Model):
has_outstanding, outstanding_pay_account_balance = outstanding_pay_account_balances[journal.id]
to_check_balance, number_to_check = to_check.get(journal, (0, 0))
misc_balance, number_misc = misc_totals.get(journal.default_account_id, (0, 0))
accessible = journal.company_id.id in self.env.company._accessible_branches().ids
accessible = journal.company_id.id in journal.company_id._accessible_branches().ids
dashboard_data[journal.id].update({
'number_to_check': number_to_check,
@@ -486,7 +498,11 @@ class account_journal(models.Model):
to_check_vals = {
journal.id: (amount_total_signed_sum, count)
for journal, amount_total_signed_sum, count in self.env['account.move']._read_group(
domain=[('journal_id', 'in', sale_purchase_journals.ids), ('to_check', '=', True)],
domain=[
*self.env['account.move']._check_company_domain(self.env.companies),
('journal_id', 'in', sale_purchase_journals.ids),
('to_check', '=', True),
],
groupby=['journal_id'],
aggregates=['amount_total_signed:sum', '__count'],
)
@@ -522,7 +538,11 @@ class account_journal(models.Model):
to_check_vals = {
journal.id: (amount_total_signed_sum, count)
for journal, amount_total_signed_sum, count in self.env['account.move']._read_group(
domain=[('journal_id', 'in', general_journals.ids), ('to_check', '=', True)],
domain=[
*self.env['account.move']._check_company_domain(self.env.companies),
('journal_id', 'in', general_journals.ids),
('to_check', '=', True),
],
groupby=['journal_id'],
aggregates=['amount_total_signed:sum', '__count'],
)
@@ -621,6 +641,7 @@ class account_journal(models.Model):
balance_end_real
FROM account_bank_statement
WHERE journal_id = journal.id
AND company_id = ANY(%s)
ORDER BY date DESC, id DESC
LIMIT 1
) statement ON TRUE
@@ -632,11 +653,12 @@ class account_journal(models.Model):
WHERE stl.statement_id IS NULL
AND move.state != 'cancel'
AND move.journal_id = journal.id
AND move.company_id = ANY(%s)
AND stl.internal_index >= COALESCE(statement.first_line_index, '')
LIMIT 1
) without_statement ON TRUE
WHERE journal.id = ANY(%s)
""", [(self.ids)])
""", [self.env.companies.ids, self.env.companies.ids, self.ids])
query_res = {res['journal_id']: res for res in self.env.cr.dictfetchall()}
result = {}
for journal in self:
@@ -662,8 +684,9 @@ class account_journal(models.Model):
WHERE payment.is_matched IS NOT TRUE
AND move.state = 'posted'
AND move.journal_id = ANY(%s)
AND move.company_id = ANY(%s)
GROUP BY move.company_id, move.journal_id, move.currency_id
""", [self.ids])
""", [self.ids, self.env.companies.ids])
query_result = group_by_journal(self.env.cr.dictfetchall())
result = {}
for journal in self:
@@ -717,6 +740,7 @@ class account_journal(models.Model):
self.ensure_one()
return self.env['account.bank.statement.line'].search([
('journal_id', '=', self.id),
('move_id.company_id', 'in', self.env.companies.ids),
('move_id.to_check', '=', True),
('move_id.state', '=', 'posted'),
])
@@ -837,7 +861,11 @@ class account_journal(models.Model):
'res_model': 'account.move',
'view_mode': 'list,form',
'domain': expression.OR(
[('journal_id', '=', journal_id), ('sequence_prefix', '=', prefix)]
[
*self.env['account.move']._check_company_domain(self.env.companies),
('journal_id', '=', journal_id),
('sequence_prefix', '=', prefix),
]
for journal_id, prefix in has_sequence_holes
),
'context': {