Requirements
- Target platform
- OpenClaw
- Install method
- Manual import
- Extraction
- Extract archive
- Prerequisites
- OpenClaw
- Primary doc
- SKILL.md
Query Odoo data including salesperson performance, customer analytics, orders, invoices, CRM, accounting, VAT, inventory, and AR/AP. Generates WhatsApp cards...
Query Odoo data including salesperson performance, customer analytics, orders, invoices, CRM, accounting, VAT, inventory, and AR/AP. Generates WhatsApp cards...
Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.
I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete.
I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run.
Read-only, Evidence-First, Ledger-Based Reports
ModelWhat It ContainsUse Forres.usersUsers/SalespeopleFind salesperson by name, get user_idsale.orderSales OrdersRevenue by salesperson, order counts, statusaccount.moveInvoices/Journal EntriesInvoice tracking, payments, P&L datares.partnerContacts/CustomersCustomer info, top customers by revenueproduct.productProductsProduct sales, inventoryaccount.accountChart of AccountsFinancial reporting, balance sheetaccount.move.lineJournal LinesDetailed ledger entries
This skill requires Odoo connection credentials stored in assets/autonomous-cfo/.env: VariableDescriptionSecretODOO_URLOdoo instance URL (e.g., https://your-odoo.com)NoODOO_DBOdoo database nameNoODOO_USEROdoo username/emailNoODOO_PASSWORDOdoo password or API keyYes Setup: cd skills/odoo/assets/autonomous-cfo cp .env.example .env # Edit .env with your actual credentials nano .env
Model invocation is DISABLED per skill.json policy. This skill handles sensitive financial data and external Odoo connections — it must be explicitly invoked by the user. Data Handling: All queries are read-only. No data is modified or exfiltrated.
Read-only: All mutating methods (create, write, unlink, etc.) are blocked at the client level No exfiltration: Reports are generated locally in assets/autonomous-cfo/output/ Network endpoints: Only connects to the Odoo URL specified in .env Output formats: PDF, Excel, and WhatsApp image cards (local files only)
The skill requires a Python virtual environment with specific packages: cd skills/odoo/assets/autonomous-cfo ./install.sh Or manually: cd skills/odoo/assets/autonomous-cfo python3 -m venv venv ./venv/bin/pip install -r requirements.txt Dependencies: requests, matplotlib, pillow, fpdf2, openpyxl
NEVER assume - Always ask clarifying questions before generating reports Multi-company check - If multiple companies exist, ASK which one to use Ledger-based - Use Chart of Accounts and journal entries (account.move.line), not just invoice summaries Verify periods - Confirm date ranges with user before running No silent defaults - Every assumption must be confirmed
"Which company should I use?" (if multiple exist) "What period? (from/to dates)" "Which accounts or account types to include?" "Any specific breakdown needed?" (by account, by partner, by journal, etc.) "Output format preference?" (PDF, WhatsApp cards, or both)
Uses the venv with fpdf2, matplotlib, pillow for proper PDF/chart generation: ./skills/odoo/assets/autonomous-cfo/venv/bin/python ./skills/odoo/assets/autonomous-cfo/src/tools/cfo_cli.py <command> Or from the skill directory: cd skills/odoo/assets/autonomous-cfo && ./venv/bin/python src/tools/cfo_cli.py <command>
Reports should be built from: account.account - Chart of Accounts structure (code, name, type, internal_group) account.move.line - Journal entry lines (debit, credit, account_id, date) account.journal - Source journals (type: sale, purchase, cash, bank, general)
ASSET - Assets (current, non-current, cash, receivables) LIABILITY - Liabilities (payables, taxes, accrued) EQUITY - Owner's equity INCOME - Revenue accounts EXPENSE - Cost and expense accounts OFF_BALANCE - Off-balance sheet accounts
asset_cash - Bank and cash accounts asset_receivable - Accounts receivable asset_current - Current assets liability_payable - Accounts payable income - Revenue expense - Expenses
equity - Standard equity accounts (share capital, retained earnings) equity_unaffected - Suspense account for undistributed profits/losses (e.g., 999999) CRITICAL for Balance Sheet: Odoo's equity_unaffected is a SUSPENSE account. Do NOT use its ledger balance directly. Correct Equity Calculation: Equity Proper (type: equity) - Use ledger balance (credit - debit) Retained Earnings (prior years) - Ledger balance from equity_unaffected Current Year Earnings - Compute real-time: Income - Expenses Total Equity = Equity Proper + Retained Earnings + Current Year Earnings Where Current Year Earnings = Σ(income credit-debit) - Σ(expense debit-credit) Why this matters: Odoo computes Current Year Earnings in real-time on the Balance Sheet. Using only the equity_unaffected ledger balance will cause the balance sheet to NOT balance.
The skill automatically detects the company's accounting standard based on country/jurisdiction and formats reports accordingly. Supported Standards: StandardJurisdictionNotesIFRSInternationalDefault for most countriesUS GAAPUnited StatesSEC registrantsInd-ASIndiaIndian GAAP converged with IFRSUK GAAPUnited KingdomFRS 102SOCPASaudi ArabiaIFRS adoptedEU IFRSEuropean UnionIAS RegulationCASChinaChinese Accounting StandardsJGAAPJapanJapanese GAAPASPECanadaPrivate enterprisesAASBAustraliaAustralian standards Detection Logic: Query company's country from res.company Map country code to reporting standard Apply standard-specific formatting: Number format (1,234.56 vs 1.234,56) Negative display ((123) vs -123) Date format (DD/MM/YYYY vs MM/DD/YYYY) Statement titles (Balance Sheet vs Statement of Financial Position) Cash flow method (indirect vs direct) Override: # Force a specific standard reporter.generate(..., standard="US_GAAP")
# Salesperson performance - use direct RPC for flexibility ./venv/bin/python -c " from src.visualizers.whatsapp_cards import WhatsAppCardGenerator # Query sale.order by user_id, aggregate by month/status # Generate cards with generate_kpi_card() and generate_comparison_card() " # Example RPC query for salesperson: # - sale.order (user_id, amount_total, state, date_order) # - account.move (invoice_user_id, amount_total, payment_state) # - res.users (salesperson info) # - res.partner (customer info)
# Financial Health - cash flow, liquidity, burn rate, runway cfo_cli.py health --from YYYY-MM-DD --to YYYY-MM-DD --company-id ID # Revenue Analytics - MoM trends, top customers cfo_cli.py revenue --from YYYY-MM-DD --to YYYY-MM-DD --company-id ID # AR/AP Aging - overdue buckets cfo_cli.py aging --as-of YYYY-MM-DD --company-id ID # Expense Breakdown - by vendor/category cfo_cli.py expenses --from YYYY-MM-DD --to YYYY-MM-DD --company-id ID # Executive Summary - one-page CFO snapshot cfo_cli.py executive --from YYYY-MM-DD --to YYYY-MM-DD --company-id ID
For sales/CRM data not covered by pre-built commands, use direct RPC: # Query sales orders by salesperson orders = jsonrpc('sale.order', 'search_read', [[('user_id', '=', SALESPERSON_ID)]], {'fields': ['name', 'partner_id', 'amount_total', 'state', 'date_order']}) # Query invoices by salesperson invoices = jsonrpc('account.move', 'search_read', [[('invoice_user_id', '=', SALESPERSON_ID), ('move_type', '=', 'out_invoice')]], {'fields': ['name', 'partner_id', 'amount_total', 'payment_state']}) # Find salesperson by name users = jsonrpc('res.users', 'search_read', [[('name', 'ilike', 'name_here')]], {'fields': ['id', 'name', 'login']})
# Custom comparison cfo_cli.py adhoc --from YYYY-MM-DD --to YYYY-MM-DD --metric-a "revenue" --metric-b "expenses" # Examples: cfo_cli.py adhoc --metric-a "cash in" --metric-b "cash out" cfo_cli.py adhoc --metric-a "direct expenses" --metric-b "indirect expenses"
--output whatsapp # Dark theme 1080x1080 PNG cards --output pdf # Light theme A4 PDF --output excel # Excel workbook (.xlsx) --output both # PDF + WhatsApp cards --output all # PDF + Excel + WhatsApp cards
Reports always include appropriate visualizations by default: ReportAuto-Included ChartsFinancial HealthCash position, burn rate trend, runwayRevenueMoM trend, top customers, growth KPIAR/AP AgingAging buckets pie, overdue highlightsExpensesCategory breakdown, trend, top vendorsExecutiveAll KPI cards, summary chartsBalance SheetAsset/liability compositionP&LRevenue vs expense, margin trendCash FlowOperating breakdown, cash trend Rule: If visualization makes the report clearer, include it automatically. Never ask "do you want charts?" — just add them.
If required params are missing, the skill will ask: Company: "Which company?" (list available options) Period: "What period? (e.g., 'last month', 'Q4 2024', custom dates)" Accounts: "Which accounts or groups?" (e.g., 'all income', 'bank accounts only') Breakdown: "Group by? (Month, Customer, Category, Account)" Output: "Output format? (WhatsApp cards, PDF, Both)"
Just ask naturally: Sales & CRM: "How is [name] salesperson performance?" "Show me top customers for [salesperson]" "Compare sales team performance" "Which salesperson has the most orders?" Financial Reports: "Give me a financial health report for last quarter" "Show revenue vs expenses for the past 6 months" "What's my AR aging?" "Generate an executive summary for this month" "Show me profit & loss statement based on chart of accounts" General Queries: "How many orders did we get this month?" "Who are the top 10 customers?" "Show invoice status for [customer name]" The skill will: Check for multiple companies and ask which one Parse your request Ask for any missing info Fetch data from Odoo using ledger entries or direct RPC Generate charts + WhatsApp cards Deliver via WhatsApp cards and/or PDF
Odoo RPC output is source of truth Strict read-only (no create/write/unlink) No proactive actions unless requested Every number includes methodology note Always verify with user before assuming Always include visualizations - If a report benefits from charts/graphs, include them automatically without asking. Reports should be visually complete.
python3 ./skills/odoo/assets/autonomous-cfo/src/tools/cfo_cli.py doctor
WhatsApp Cards: "Midnight Ledger" — Navy-black (#0a0e1a), copper glow (#cd7f32) PDF Reports: Clean white, copper accents, professional layout
Messaging, meetings, inboxes, CRM, and teammate communication surfaces.
Largest current source with strong distribution and engagement signals.