Automate Finance Shared Service Center operations in Odoo 19 - month-end closing, journal entries, bank reconciliation, trial balance, and multi-agency consolidation. Handles RIM, CKVC, BOM, JPAL, JLI, JAP, LAS, RMQB agencies with full BIR compliance.
Transform Claude into a Finance SSC automation specialist that handles all accounting operations across multiple agencies in Odoo 19.
Automate month-end closing - Reduce 10-day process to 2 days
Multi-agency operations - Handle 8 agencies (RIM, CKVC, BOM, JPAL, JLI, JAP, LAS, RMQB)
BIR compliance - Generate forms 1601-C, 2550Q, 1702-RT automatically
Real-time reporting - Trial balance, aging, cash flow on demand
Time Savings: 160 hours/month
When asked to perform finance operations:
User asks: "Close September books for all agencies"
Steps:
1. Validate all pending transactions
2. Generate accrual entries (prepaid, deferred revenue)
3. Run depreciation schedules
4. Calculate withholding taxes
5. Post closing entries
6. Generate trial balance
7. Create month-end reports
8. Update Notion checklist
Result: Closed period with full audit trail
See examples/month-end-closing.md for full workflow.
User asks: "Post depreciation entries for October"
Steps:
1. Query asset register from Odoo
2. Calculate monthly depreciation
3. Generate journal entries by agency
4. Validate GL accounts exist
5. Post entries with proper references
6. Generate posting report
Result: Posted journal entries with audit trail
See examples/journal-entries.md for examples.
User asks: "Reconcile BDO account for RIM agency"
Steps:
1. Fetch bank statement from Supabase
2. Query unreconciled bank transactions in Odoo
3. Auto-match by amount and date
4. Propose manual matches for review
5. Create reconciliation entries
6. Update bank balance
7. Generate reconciliation report
Result: Reconciled bank account with audit trail
See examples/bank-reconciliation.md for workflow.
User asks: "Get trial balance for Q3 2025 all agencies"
Steps:
1. Query account balances by agency and date range
2. Calculate debit/credit totals
3. Verify balance (debits = credits)
4. Format by account hierarchy
5. Export to Excel/PDF
6. Optionally push to Superset
Result: Trial balance report with variance analysis
See examples/trial-balance.md for details.
User asks: "Consolidate financials for all agencies"
Steps:
1. Pull balances from each agency
2. Apply consolidation rules
3. Eliminate intercompany transactions
4. Apply currency conversions
5. Generate consolidated statements
6. Create variance reports
7. Update Superset dashboards
Result: Consolidated financial statements
See examples/consolidation.md for process.
Purpose: Connect to Odoo 19 via XML-RPC for all operations
Connection:
import xmlrpc.client
url = "https://erp.insightpulseai.net"
db = "production"
username = "admin"
password = os.getenv("ODOO_API_KEY")
# Authenticate
common = xmlrpc.client.ServerProxy(f'{url}/xmlrpc/2/common')
uid = common.authenticate(db, username, password, {})
# Execute operations
models = xmlrpc.client.ServerProxy(f'{url}/xmlrpc/2/object')
result = models.execute_kw(
db, uid, password,
'account.move', 'search_read',
[[['state', '=', 'draft']]],
{'fields': ['name', 'date', 'amount_total']}
)
See reference/xmlrpc-api.md for full API.
Purpose: Create journal entries programmatically
Structure:
{
'journal_id': 1, # General Journal
'date': '2025-10-31',
'ref': 'ACCRUAL/2025/10',
'line_ids': [
(0, 0, {
'account_id': 123, # Prepaid Expense
'name': 'October Rent Accrual',
'debit': 50000.00,
'credit': 0.00,
'partner_id': 456,
'analytic_account_id': 789, # Agency code
}),
(0, 0, {
'account_id': 124, # Accrued Expense
'name': 'October Rent Accrual',
'debit': 0.00,
'credit': 50000.00,
'partner_id': 456,
})
]
}
Purpose: Handle operations across 8 agencies with proper segregation
Agency Mapping:
AGENCIES = {
'RIM': {'code': 'RIM', 'analytic_id': 1, 'company_id': 1},
'CKVC': {'code': 'CKVC', 'analytic_id': 2, 'company_id': 1},
'BOM': {'code': 'BOM', 'analytic_id': 3, 'company_id': 1},
'JPAL': {'code': 'JPAL', 'analytic_id': 4, 'company_id': 1},
'JLI': {'code': 'JLI', 'analytic_id': 5, 'company_id': 1},
'JAP': {'code': 'JAP', 'analytic_id': 6, 'company_id': 1},
'LAS': {'code': 'LAS', 'analytic_id': 7, 'company_id': 1},
'RMQB': {'code': 'RMQB', 'analytic_id': 8, 'company_id': 1},
}
Usage:
def post_journal_entry(agency_code, entry_data):
agency = AGENCIES[agency_code]
entry_data['line_ids'] = [
(0, 0, {
**line,
'analytic_account_id': agency['analytic_id']
})
for line in entry_data['line_ids']
]
return models.execute_kw(db, uid, password,
'account.move', 'create', [entry_data])
def calculate_withholding_tax(amount, tax_type):
"""
tax_type: 'professional', 'compensation', 'final'
"""
rates = {
'professional': 0.10, # 10% EWT
'compensation': 0.05, # 5% graduated
'final': 0.20, # 20% final
}
return amount * rates.get(tax_type, 0)
def compute_vat(amount, vat_type='output'):
"""
vat_type: 'output', 'input', 'zero_rated', 'exempt'
"""
if vat_type == 'exempt':
return 0
if vat_type == 'zero_rated':
return 0
# Standard 12% VAT
vat_amount = amount * 0.12
return vat_amount
See reference/bir-integration.md for full compliance.
models.execute_kw(db, uid, password, 'account.move', 'create', [{
'move_type': 'in_invoice',
'partner_id': vendor_id,
'invoice_date': '2025-10-30',
'invoice_line_ids': [(0, 0, {
'product_id': product_id,
'quantity': 1,
'price_unit': 10000,
'account_id': expense_account_id,
})]
}])
models.execute_kw(db, uid, password, 'account.move', 'create', [{
'move_type': 'out_invoice',
'partner_id': customer_id,
'invoice_date': '2025-10-30',
'invoice_line_ids': [(0, 0, {
'product_id': service_id,
'quantity': 1,
'price_unit': 50000,
'account_id': revenue_account_id,
'tax_ids': [(6, 0, [vat_12_tax_id])]
})]
}])
models.execute_kw(db, uid, password,
'account.move.line', 'search_read',
[[['reconciled', '=', False], ['account_id.reconcile', '=', True]]],
{'fields': ['name', 'date', 'debit', 'credit', 'amount_residual']}
)
"Account not found": Verify chart of accounts, check account codes "Unbalanced entry": Total debits must equal total credits "Period closed": Reopen fiscal period or use prior period adjustment "Missing analytic account": Agency codes must be mapped to analytic accounts "Tax computation error": Verify tax configuration in Odoo "Bank statement mismatch": Check date ranges and amounts "Foreign currency error": Ensure exchange rates are set
Technical patterns and APIs:
Complete workflow examples:
This skill uses standard Claude tools:
After using this skill:
Ask Claude:
"Close September books for all agencies"
"Post prepaid expense accrual for October"
"Reconcile BDO bank account for RIM agency"
"Generate trial balance for Q3 2025"
"Show me vendor bills pending approval"
Your Finance SSC automation starts here! 🚀