account_shared_bank_cash/__init__.py
2026-06-20 12:55:40 +07:00

133 lines
5.1 KiB
Python

# -*- coding: utf-8 -*-
from . import models
from . import wizard
from odoo import api, SUPERUSER_ID
import logging
_logger = logging.getLogger(__name__)
def _auto_share_accounts_post_init(cr, registry):
"""
Automatically mirror Bank & Cash accounts from the Parent Company (ID 2)
to branch companies that don't have their own Chart of Accounts.
Also auto-creates Bank journals in each branch for the mirrored accounts.
Odoo 17 Strategy: Since account.account uses a single company_id (M2O),
we CREATE new account records in each branch company with the same code/name
as the parent's bank/cash accounts (instead of sharing via M2M in Odoo 19).
"""
env = api.Environment(cr, SUPERUSER_ID, {})
parent_company = env['res.company'].browse(2)
if not parent_company.exists():
_logger.warning("Parent company (ID=2) not found, skipping auto-share.")
return
branch_companies = env['res.company'].search([('id', '!=', 2)])
# Find parent's bank/cash accounts
parent_bank_cash_accounts = env['account.account'].search([
('company_id', '=', parent_company.id),
('account_type', '=', 'asset_cash'),
])
if not parent_bank_cash_accounts:
_logger.info("No bank/cash accounts found in parent company, skipping.")
return
for branch in branch_companies:
# Check if branch already has its own accounts
existing_branch_accounts = env['account.account'].search([
('company_id', '=', branch.id),
('account_type', '=', 'asset_cash'),
])
if existing_branch_accounts:
_logger.info("Branch %s already has bank/cash accounts, skipping.", branch.name)
continue
# Clone parent's bank/cash accounts to this branch
for parent_acc in parent_bank_cash_accounts:
# Check if an account with the same code already exists in this branch
existing = env['account.account'].search([
('company_id', '=', branch.id),
('code', '=', parent_acc.code),
], limit=1)
if not existing:
env['account.account'].create({
'name': parent_acc.name,
'code': parent_acc.code,
'account_type': parent_acc.account_type,
'company_id': branch.id,
'reconcile': parent_acc.reconcile,
'currency_id': parent_acc.currency_id.id if parent_acc.currency_id else False,
'note': "Auto-mirrored from parent company (%s)" % parent_company.name,
})
_logger.info(
"Created mirror account %s (%s) in branch %s",
parent_acc.code, parent_acc.name, branch.name
)
# Auto-create bank journals in branch for mirrored accounts
parent_bank_journals = env['account.journal'].search([
('company_id', '=', parent_company.id),
('type', 'in', ('bank', 'cash')),
])
for parent_journal in parent_bank_journals:
existing_journal = env['account.journal'].search([
('company_id', '=', branch.id),
('code', '=', parent_journal.code),
], limit=1)
if not existing_journal:
# Find the mirrored account in the branch
branch_account = env['account.account'].search([
('company_id', '=', branch.id),
('code', '=', parent_journal.default_account_id.code),
], limit=1)
if branch_account:
env['account.journal'].create({
'name': parent_journal.name,
'code': parent_journal.code,
'type': parent_journal.type,
'company_id': branch.id,
'default_account_id': branch_account.id,
})
_logger.info(
"Created mirror journal %s (%s) in branch %s",
parent_journal.code, parent_journal.name, branch.name
)
def _cleanup_shared_accounts_uninstall(cr, registry):
"""
Remove the auto-mirrored accounts upon uninstallation.
Only removes accounts tagged with the auto-mirror note and having no journal items.
"""
env = api.Environment(cr, SUPERUSER_ID, {})
mirrored_accounts = env['account.account'].search([
('company_id', '!=', 2),
('note', 'ilike', 'Auto-mirrored from parent company'),
('account_type', '=', 'asset_cash'),
])
for acc in mirrored_accounts:
# Only delete if no journal items reference this account
has_items = env['account.move.line'].search([
('account_id', '=', acc.id),
], limit=1)
if not has_items:
_logger.info("Removing mirrored account %s from company %s", acc.code, acc.company_id.name)
acc.unlink()
else:
_logger.warning(
"Cannot remove mirrored account %s from company %s: has journal items",
acc.code, acc.company_id.name
)