odoo_utility_scripts/fix_mismatched_journals.py

83 lines
3.3 KiB
Python

import sys
def fix_all_mismatched_journals(env):
company_name = 'Kedai Kipas 58 Tenggilis'
company = env['res.company'].search([('name', 'ilike', company_name)], limit=1)
if not company:
print(f"Company {company_name} not found.")
return
print(f"Checking {company.name} for mismatched journal entries...")
# Let's forcefully clear ANY journal that doesn't belong to Tenggilis from its configurations
# Common journal configuration fields
fields_to_check = [
'account_tax_periodicity_journal_id',
'tax_cash_basis_journal_id',
'currency_exdiff_journal_id'
# Can add more if needed
]
vals = {}
for field in fields_to_check:
try:
journal_id = getattr(company, field, False)
if journal_id and journal_id.company_id and journal_id.company_id.id != company.id:
print(f"[x] Mismatched Journal in field '{field}': {journal_id.name} (from {journal_id.company_id.name}) -> Clearing")
vals[field] = False
except Exception as e:
print(f"Error checking {field}: {e}")
# Also check pos configs for this company
pos_configs = env['pos.config'].search([('company_id', '=', company.id)])
for config in pos_configs:
config_vals = {}
if config.journal_id and config.journal_id.company_id and config.journal_id.company_id.id != company.id:
print(f"[x] Mismatched Journal in POS Config '{config.name}': {config.journal_id.name} -> Clearing")
config_vals['journal_id'] = False
if config.invoice_journal_id and config.invoice_journal_id.company_id and config.invoice_journal_id.company_id.id != company.id:
print(f"[x] Mismatched Invoice Journal in POS Config '{config.name}': {config.invoice_journal_id.name} -> Clearing")
config_vals['invoice_journal_id'] = False
if config_vals:
config.write(config_vals)
if vals:
company.write(vals)
print(f"Updated {len(vals)} fields on company.")
else:
print("No mismatched journals found on company settings.")
print("Finding and fixing pos payment methods with wrong journal...")
methods = env['pos.payment.method'].with_context(active_test=False).search([
('company_id', '=', company.id),
('journal_id.company_id', '!=', company.id),
('journal_id', '!=', False)
])
for method in methods:
print(f"[x] Fixing payment method '{method.name}' (Journal {method.journal_id.name} is from {method.journal_id.company_id.name}) -> Clearing")
method.journal_id = False
# Check for Bank Accounts (res.partner.bank) linked to the wrong journal
banks = env['res.partner.bank'].with_context(active_test=False).search([
('company_id', '=', company.id),
('journal_id.company_id', '!=', company.id),
('journal_id', '!=', False)
])
for bank in banks:
print(f"[x] Fixing bank account '{bank.acc_number}' (Journal {bank.journal_id.name} is from {bank.journal_id.company_id.name}) -> Clearing")
bank.journal_id = False
env.cr.commit()
print("Done!")
if __name__ == '__main__':
try:
fix_all_mismatched_journals(env)
except NameError:
print("Run via odoo shell")