Odoo Accounting Integration
Manage Odoo Community accounting and generate financial reports.
Setup Requirements
- Odoo Community 19+ installed locally (default: http://localhost:8069)
- Configure in
.env:ODOO_URL=http://localhost:8069 ODOO_DB=odoo ODOO_USER=admin ODOO_PASSWORD=your_odoo_password - In DEV_MODE=true, Odoo operations are simulated with mock data.
Workflow A: Generate Accounting Summary
from odoo_connector import OdooConnector
# Initialize connector
odoo = OdooConnector(vault_path="./vault")
odoo.authenticate()
# Generate and write summary to vault/Accounting/
summary_path = odoo.write_accounting_summary()
print(f"Summary written: {summary_path}")
This creates vault/Accounting/Summary_YYYY_MM.md with:
- Total invoiced and received revenue
- Total outgoing payments
- Net revenue calculation
- Detected subscription services
Workflow B: Review Invoices
Read invoices from Odoo and create action files for outstanding ones:
- Fetch invoices:
odoo.get_invoices(state='posted') - For unpaid invoices, create
vault/Needs_Action/ODOO_INVOICE_*.md - Planner creates a
PLAN_*.mdwith follow-up steps - For payment execution, create an approval request in
vault/Pending_Approval/
Workflow C: Process Payment (Requires Approval)
Payment processing always requires human approval:
- Create approval request in
vault/Pending_Approval/:
---
type: approval_request
action: odoo_payment
priority: high
details:
invoice: "INV/2026/0001"
amount: "2500.00"
payee: "Client A"
---
# Approval Required: Process Invoice Payment
## Payment Details
- **Invoice**: INV/2026/0001
- **Amount**: $2,500.00
- **Payee**: Client A
## How to Respond
- **To Approve**: Move this file to `/Approved` folder
- **To Reject**: Move this file to `/Rejected` folder
- After approval, execute via Odoo JSON-RPC:
- POST to
/jsonrpcwithaccount.payment.registermethod
- POST to
Workflow D: Subscription Audit
Analyze payments for subscription patterns:
# Analyze all payments for subscription patterns
payments = odoo.get_payments()
for payment in payments:
sub = odoo.analyze_transaction({
"description": payment["name"],
"amount": payment["amount"],
"date": str(payment["date"]),
})
if sub:
print(f"Subscription found: {sub['name']} - ${sub['amount']}/month")
Flag subscriptions unused > 30 days for review and create approval requests to cancel them.
Log Format
{
"timestamp": "ISO-8601",
"action_type": "accounting_summary_generated",
"actor": "odoo_connector",
"total_invoiced": 4300.00,
"total_received": 2500.00,
"net_revenue": 2500.00,
"result": "success"
}
Security Notes
- Odoo credentials stored in
.env(never in vault) - All payment operations require human approval
- DEV_MODE uses mock data only, no real Odoo calls
- Credentials rotated monthly per security policy