{
  "schemaVersion": "1.0",
  "item": {
    "slug": "odoo-reporting",
    "name": "Odoo Reporting",
    "source": "tencent",
    "type": "skill",
    "category": "通讯协作",
    "sourceUrl": "https://clawhub.ai/ashrf-in/odoo-reporting",
    "canonicalUrl": "https://clawhub.ai/ashrf-in/odoo-reporting",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/odoo-reporting",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=odoo-reporting",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "README.md",
      "SECURITY.md",
      "SKILL.md",
      "assets/autonomous-cfo/README.md",
      "assets/autonomous-cfo/config/settings.json",
      "assets/autonomous-cfo/install.sh"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Then review README.md for any prerequisites, environment setup, or post-install checks. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "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. Then review README.md for any prerequisites, environment setup, or post-install checks. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/odoo-reporting"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/odoo-reporting",
    "agentPageUrl": "https://openagent3.xyz/skills/odoo-reporting/agent",
    "manifestUrl": "https://openagent3.xyz/skills/odoo-reporting/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/odoo-reporting/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Then review README.md for any prerequisites, environment setup, or post-install checks. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "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. Then review README.md for any prerequisites, environment setup, or post-install checks. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Odoo Financial Intelligence",
        "body": "Read-only, Evidence-First, Ledger-Based Reports"
      },
      {
        "title": "Quick Reference: Common Odoo Models",
        "body": "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"
      },
      {
        "title": "Security Model",
        "body": "This skill implements a defense-in-depth security model:\n\nUser Invocation Required: This skill CANNOT be invoked autonomously by AI models\nRead-Only Enforcement: All data modifications are blocked at the code level\nCredential Isolation: Credentials stored only in local .env file, never transmitted elsewhere\nNetwork Boundaries: Only connects to user-specified Odoo URL, no external telemetry"
      },
      {
        "title": "Required Environment Variables",
        "body": "This skill REQUIRES Odoo connection credentials stored in assets/autonomous-cfo/.env:\n\nVariableDescriptionSecretRequiredODOO_URLOdoo instance URL (e.g., https://your-odoo.com)NoYesODOO_DBOdoo database nameNoYesODOO_USEROdoo username/emailNoYesODOO_PASSWORDOdoo API key (recommended) or passwordYesYes\n\n⚠️ CRITICAL: These credentials are REQUIRED. The skill will not function without them.\n\nSetup:\n\ncd skills/odoo/assets/autonomous-cfo\ncp .env.example .env\n# Edit .env with your actual credentials\nnano .env"
      },
      {
        "title": "API Key vs Password",
        "body": "For production, use an Odoo API key:\n\nLog into Odoo → Settings → Account Security → API Keys\nGenerate a new key (e.g., \"Financial Reports Skill\")\nUse this key as ODOO_PASSWORD\n\nWhy API keys?\n\nScoped permissions (can be read-only)\nCan be revoked independently\nDon't expose your main password\nBetter audit trail in Odoo"
      },
      {
        "title": "Authentication Methods",
        "body": "XML-RPC (Legacy, default):\n\nPassword/API key sent in XML-RPC request body\nSupported by all Odoo versions\n\nJSON-RPC (Odoo 19+):\n\nAPI key sent as Authorization: Bearer <api_key> header\nMore efficient for large datasets\nUse ODOO_RPC_BACKEND=json2 to enable"
      },
      {
        "title": "Model Invocation Policy",
        "body": "🚫 Model invocation is STRICTLY DISABLED.\n\nPer skill.json:\n\n\"modelInvocation\": {\n  \"disabled\": true,\n  \"requiresUserInvocation\": true\n}\n\nThis means:\n\nAI models CANNOT invoke this skill automatically\nUser MUST explicitly request Odoo operations\nEvery invocation requires user intent"
      },
      {
        "title": "Read-Only Enforcement",
        "body": "⚠️ IMPORTANT: Client-Side Enforcement Limitation\n\nThe skill implements client-side read-only enforcement. This means:\n\nMutating methods are blocked in the Python code\nBlocked methods raise PermissionError if called\nHowever, a modified or compromised client could bypass this\n\nFor Production Security:\n\nUse a read-only Odoo user (recommended)\nDon't give modify permissions to the API key's user\nReview Odoo access logs regularly\n\nBlocked Methods:\n\ncreate, write, unlink (CRUD operations)\ncopy (duplicate records)\naction_post, action_confirm, button_validate (workflow actions)\n\nAllowed Methods (Read-Only):\n\nsearch, search_read, read (data retrieval)\nsearch_count, fields_get (metadata)\nname_search, context_get, default_get (helpers)\n\nAttempting to call blocked methods raises PermissionError."
      },
      {
        "title": "Data Handling & Privacy",
        "body": "No Data Exfiltration: Reports generated locally in assets/autonomous-cfo/output/\nNo Telemetry: No usage data sent to external servers\nNetwork Isolation: Only connects to ODOO_URL specified in .env\nCredential Security: Password/API key never logged or displayed\nLocal Processing: All chart generation, PDF creation happens locally"
      },
      {
        "title": "Output Security",
        "body": "All outputs are local files only:\n\noutput/pdf_reports/ - PDF reports\noutput/whatsapp_cards/ - PNG image cards\noutput/charts/ - Chart images\noutput/excel/ - Excel spreadsheets\n\nNo cloud upload, no external sharing, no data leaves your machine except to your specified Odoo instance."
      },
      {
        "title": "Installation",
        "body": "The skill requires a Python virtual environment with specific packages:\n\ncd skills/odoo/assets/autonomous-cfo\n./install.sh\n\nOr manually:\n\ncd skills/odoo/assets/autonomous-cfo\npython3 -m venv venv\n./venv/bin/pip install -r requirements.txt\n\nDependencies: requests, matplotlib, pillow, fpdf2, openpyxl"
      },
      {
        "title": "Critical Rules",
        "body": "NEVER assume - Always ask clarifying questions before generating reports\nMulti-company check - If multiple companies exist, ASK which one to use\nLedger-based - Use Chart of Accounts and journal entries (account.move.line), not just invoice summaries\nVerify periods - Confirm date ranges with user before running\nNo silent defaults - Every assumption must be confirmed"
      },
      {
        "title": "Before Any Report, Ask:",
        "body": "\"Which company should I use?\" (if multiple exist)\n\"What period? (from/to dates)\"\n\"Which accounts or account types to include?\"\n\"Any specific breakdown needed?\" (by account, by partner, by journal, etc.)\n\"Output format preference?\" (PDF, WhatsApp cards, or both)"
      },
      {
        "title": "Entrypoint",
        "body": "Uses the venv with fpdf2, matplotlib, pillow for proper PDF/chart generation:\n\n./skills/odoo/assets/autonomous-cfo/venv/bin/python ./skills/odoo/assets/autonomous-cfo/src/tools/cfo_cli.py <command>\n\nOr from the skill directory:\n\ncd skills/odoo/assets/autonomous-cfo && ./venv/bin/python src/tools/cfo_cli.py <command>"
      },
      {
        "title": "Chart of Accounts Based Reporting",
        "body": "Reports should be built from:\n\naccount.account - Chart of Accounts structure (code, name, type, internal_group)\naccount.move.line - Journal entry lines (debit, credit, account_id, date)\naccount.journal - Source journals (type: sale, purchase, cash, bank, general)"
      },
      {
        "title": "Account Internal Groups",
        "body": "ASSET - Assets (current, non-current, cash, receivables)\nLIABILITY - Liabilities (payables, taxes, accrued)\nEQUITY - Owner's equity\nINCOME - Revenue accounts\nEXPENSE - Cost and expense accounts\nOFF_BALANCE - Off-balance sheet accounts"
      },
      {
        "title": "Common Account Types",
        "body": "asset_cash - Bank and cash accounts\nasset_receivable - Accounts receivable\nasset_current - Current assets\nliability_payable - Accounts payable\nincome - Revenue\nexpense - Expenses"
      },
      {
        "title": "Special Equity Types (Odoo-Specific)",
        "body": "equity - Standard equity accounts (share capital, retained earnings)\nequity_unaffected - Suspense account for undistributed profits/losses (e.g., 999999)\n\nCRITICAL for Balance Sheet:\nOdoo's equity_unaffected is a SUSPENSE account. Do NOT use its ledger balance directly.\n\nCorrect Equity Calculation:\n\nEquity Proper (type: equity) - Use ledger balance (credit - debit)\nRetained Earnings (prior years) - Ledger balance from equity_unaffected\nCurrent Year Earnings - Compute real-time: Income - Expenses\n\nTotal Equity = Equity Proper + Retained Earnings + Current Year Earnings\n\nWhere Current Year Earnings = Σ(income credit-debit) - Σ(expense debit-credit)\n\nWhy 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."
      },
      {
        "title": "Automatic Reporting Standard Detection",
        "body": "The skill automatically detects the company's accounting standard based on country/jurisdiction and formats reports accordingly.\n\nSupported Standards:\n\nStandardJurisdictionNotesIFRSInternationalDefault for most countriesUS GAAPUnited StatesSEC registrantsInd-ASIndiaIndian GAAP converged with IFRSUK GAAPUnited KingdomFRS 102SOCPASaudi ArabiaIFRS adoptedEU IFRSEuropean UnionIAS RegulationCASChinaChinese Accounting StandardsJGAAPJapanJapanese GAAPASPECanadaPrivate enterprisesAASBAustraliaAustralian standards\n\nDetection Logic:\n\nQuery company's country from res.company\nMap country code to reporting standard\nApply standard-specific formatting:\n\nNumber format (1,234.56 vs 1.234,56)\nNegative display ((123) vs -123)\nDate format (DD/MM/YYYY vs MM/DD/YYYY)\nStatement titles (Balance Sheet vs Statement of Financial Position)\nCash flow method (indirect vs direct)\n\nOverride:\n\n# Force a specific standard\nreporter.generate(..., standard=\"US_GAAP\")"
      },
      {
        "title": "Sales & CRM Queries",
        "body": "# Salesperson performance - use direct RPC for flexibility\n./venv/bin/python -c \"\nfrom src.visualizers.whatsapp_cards import WhatsAppCardGenerator\n# Query sale.order by user_id, aggregate by month/status\n# Generate cards with generate_kpi_card() and generate_comparison_card()\n\"\n\n# Example RPC query for salesperson:\n# - sale.order (user_id, amount_total, state, date_order)\n# - account.move (invoice_user_id, amount_total, payment_state)\n# - res.users (salesperson info)\n# - res.partner (customer info)"
      },
      {
        "title": "Pre-built Reports",
        "body": "# Financial Health - cash flow, liquidity, burn rate, runway\ncfo_cli.py health --from YYYY-MM-DD --to YYYY-MM-DD --company-id ID\n\n# Revenue Analytics - MoM trends, top customers\ncfo_cli.py revenue --from YYYY-MM-DD --to YYYY-MM-DD --company-id ID\n\n# AR/AP Aging - overdue buckets\ncfo_cli.py aging --as-of YYYY-MM-DD --company-id ID\n\n# Expense Breakdown - by vendor/category\ncfo_cli.py expenses --from YYYY-MM-DD --to YYYY-MM-DD --company-id ID\n\n# Executive Summary - one-page CFO snapshot\ncfo_cli.py executive --from YYYY-MM-DD --to YYYY-MM-DD --company-id ID"
      },
      {
        "title": "Direct RPC Queries (Advanced)",
        "body": "For sales/CRM data not covered by pre-built commands, use direct RPC:\n\n# Query sales orders by salesperson\norders = jsonrpc('sale.order', 'search_read',\n    [[('user_id', '=', SALESPERSON_ID)]],\n    {'fields': ['name', 'partner_id', 'amount_total', 'state', 'date_order']})\n\n# Query invoices by salesperson\ninvoices = jsonrpc('account.move', 'search_read',\n    [[('invoice_user_id', '=', SALESPERSON_ID), ('move_type', '=', 'out_invoice')]],\n    {'fields': ['name', 'partner_id', 'amount_total', 'payment_state']})\n\n# Find salesperson by name\nusers = jsonrpc('res.users', 'search_read',\n    [[('name', 'ilike', 'name_here')]],\n    {'fields': ['id', 'name', 'login']})"
      },
      {
        "title": "Ad-hoc Reports",
        "body": "# Custom comparison\ncfo_cli.py adhoc --from YYYY-MM-DD --to YYYY-MM-DD --metric-a \"revenue\" --metric-b \"expenses\"\n\n# Examples:\ncfo_cli.py adhoc --metric-a \"cash in\" --metric-b \"cash out\"\ncfo_cli.py adhoc --metric-a \"direct expenses\" --metric-b \"indirect expenses\""
      },
      {
        "title": "Output Formats",
        "body": "--output whatsapp   # Dark theme 1080x1080 PNG cards\n--output pdf        # Light theme A4 PDF\n--output excel      # Excel workbook (.xlsx)\n--output both       # PDF + WhatsApp cards\n--output all        # PDF + Excel + WhatsApp cards"
      },
      {
        "title": "Automatic Visualizations",
        "body": "Reports always include appropriate visualizations by default:\n\nReportAuto-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\n\nRule: If visualization makes the report clearer, include it automatically. Never ask \"do you want charts?\" — just add them."
      },
      {
        "title": "Interactive Param Collection",
        "body": "If required params are missing, the skill will ask:\n\nCompany: \"Which company?\" (list available options)\nPeriod: \"What period? (e.g., 'last month', 'Q4 2024', custom dates)\"\nAccounts: \"Which accounts or groups?\" (e.g., 'all income', 'bank accounts only')\nBreakdown: \"Group by? (Month, Customer, Category, Account)\"\nOutput: \"Output format? (WhatsApp cards, PDF, Both)\""
      },
      {
        "title": "How to Use in Chat",
        "body": "Just ask naturally:\n\nSales & CRM:\n\n\"How is [name] salesperson performance?\"\n\"Show me top customers for [salesperson]\"\n\"Compare sales team performance\"\n\"Which salesperson has the most orders?\"\n\nFinancial Reports:\n\n\"Give me a financial health report for last quarter\"\n\"Show revenue vs expenses for the past 6 months\"\n\"What's my AR aging?\"\n\"Generate an executive summary for this month\"\n\"Show me profit & loss statement based on chart of accounts\"\n\nGeneral Queries:\n\n\"How many orders did we get this month?\"\n\"Who are the top 10 customers?\"\n\"Show invoice status for [customer name]\"\n\nThe skill will:\n\nCheck for multiple companies and ask which one\nParse your request\nAsk for any missing info\nFetch data from Odoo using ledger entries or direct RPC\nGenerate charts + WhatsApp cards\nDeliver via WhatsApp cards and/or PDF"
      },
      {
        "title": "Hard Rules",
        "body": "Odoo RPC output is source of truth\nStrict read-only (no create/write/unlink)\nNo proactive actions unless requested\nEvery number includes methodology note\nAlways verify with user before assuming\nAlways include visualizations - If a report benefits from charts/graphs, include them automatically without asking. Reports should be visually complete."
      },
      {
        "title": "Diagnostics",
        "body": "python3 ./skills/odoo/assets/autonomous-cfo/src/tools/cfo_cli.py doctor"
      },
      {
        "title": "Report Themes",
        "body": "WhatsApp Cards: \"Midnight Ledger\" — Navy-black (#0a0e1a), copper glow (#cd7f32)\nPDF Reports: Clean white, copper accents, professional layout"
      }
    ],
    "body": "Odoo Financial Intelligence\n\nRead-only, Evidence-First, Ledger-Based Reports\n\nQuick Reference: Common Odoo Models\nModel\tWhat It Contains\tUse For\nres.users\tUsers/Salespeople\tFind salesperson by name, get user_id\nsale.order\tSales Orders\tRevenue by salesperson, order counts, status\naccount.move\tInvoices/Journal Entries\tInvoice tracking, payments, P&L data\nres.partner\tContacts/Customers\tCustomer info, top customers by revenue\nproduct.product\tProducts\tProduct sales, inventory\naccount.account\tChart of Accounts\tFinancial reporting, balance sheet\naccount.move.line\tJournal Lines\tDetailed ledger entries\nSecurity & Credentials\nSecurity Model\n\nThis skill implements a defense-in-depth security model:\n\nUser Invocation Required: This skill CANNOT be invoked autonomously by AI models\nRead-Only Enforcement: All data modifications are blocked at the code level\nCredential Isolation: Credentials stored only in local .env file, never transmitted elsewhere\nNetwork Boundaries: Only connects to user-specified Odoo URL, no external telemetry\nRequired Environment Variables\n\nThis skill REQUIRES Odoo connection credentials stored in assets/autonomous-cfo/.env:\n\nVariable\tDescription\tSecret\tRequired\nODOO_URL\tOdoo instance URL (e.g., https://your-odoo.com)\tNo\tYes\nODOO_DB\tOdoo database name\tNo\tYes\nODOO_USER\tOdoo username/email\tNo\tYes\nODOO_PASSWORD\tOdoo API key (recommended) or password\tYes\tYes\n\n⚠️ CRITICAL: These credentials are REQUIRED. The skill will not function without them.\n\nSetup:\n\ncd skills/odoo/assets/autonomous-cfo\ncp .env.example .env\n# Edit .env with your actual credentials\nnano .env\n\nAPI Key vs Password\n\nFor production, use an Odoo API key:\n\nLog into Odoo → Settings → Account Security → API Keys\nGenerate a new key (e.g., \"Financial Reports Skill\")\nUse this key as ODOO_PASSWORD\n\nWhy API keys?\n\nScoped permissions (can be read-only)\nCan be revoked independently\nDon't expose your main password\nBetter audit trail in Odoo\nAuthentication Methods\n\nXML-RPC (Legacy, default):\n\nPassword/API key sent in XML-RPC request body\nSupported by all Odoo versions\n\nJSON-RPC (Odoo 19+):\n\nAPI key sent as Authorization: Bearer <api_key> header\nMore efficient for large datasets\nUse ODOO_RPC_BACKEND=json2 to enable\nModel Invocation Policy\n\n🚫 Model invocation is STRICTLY DISABLED.\n\nPer skill.json:\n\n\"modelInvocation\": {\n  \"disabled\": true,\n  \"requiresUserInvocation\": true\n}\n\n\nThis means:\n\nAI models CANNOT invoke this skill automatically\nUser MUST explicitly request Odoo operations\nEvery invocation requires user intent\nRead-Only Enforcement\n\n⚠️ IMPORTANT: Client-Side Enforcement Limitation\n\nThe skill implements client-side read-only enforcement. This means:\n\nMutating methods are blocked in the Python code\nBlocked methods raise PermissionError if called\nHowever, a modified or compromised client could bypass this\n\nFor Production Security:\n\nUse a read-only Odoo user (recommended)\nDon't give modify permissions to the API key's user\nReview Odoo access logs regularly\n\nBlocked Methods:\n\ncreate, write, unlink (CRUD operations)\ncopy (duplicate records)\naction_post, action_confirm, button_validate (workflow actions)\n\nAllowed Methods (Read-Only):\n\nsearch, search_read, read (data retrieval)\nsearch_count, fields_get (metadata)\nname_search, context_get, default_get (helpers)\n\nAttempting to call blocked methods raises PermissionError.\n\nData Handling & Privacy\nNo Data Exfiltration: Reports generated locally in assets/autonomous-cfo/output/\nNo Telemetry: No usage data sent to external servers\nNetwork Isolation: Only connects to ODOO_URL specified in .env\nCredential Security: Password/API key never logged or displayed\nLocal Processing: All chart generation, PDF creation happens locally\nOutput Security\n\nAll outputs are local files only:\n\noutput/pdf_reports/ - PDF reports\noutput/whatsapp_cards/ - PNG image cards\noutput/charts/ - Chart images\noutput/excel/ - Excel spreadsheets\n\nNo cloud upload, no external sharing, no data leaves your machine except to your specified Odoo instance.\n\nInstallation\n\nThe skill requires a Python virtual environment with specific packages:\n\ncd skills/odoo/assets/autonomous-cfo\n./install.sh\n\n\nOr manually:\n\ncd skills/odoo/assets/autonomous-cfo\npython3 -m venv venv\n./venv/bin/pip install -r requirements.txt\n\n\nDependencies: requests, matplotlib, pillow, fpdf2, openpyxl\n\nCritical Rules\nNEVER assume - Always ask clarifying questions before generating reports\nMulti-company check - If multiple companies exist, ASK which one to use\nLedger-based - Use Chart of Accounts and journal entries (account.move.line), not just invoice summaries\nVerify periods - Confirm date ranges with user before running\nNo silent defaults - Every assumption must be confirmed\nBefore Any Report, Ask:\n\"Which company should I use?\" (if multiple exist)\n\"What period? (from/to dates)\"\n\"Which accounts or account types to include?\"\n\"Any specific breakdown needed?\" (by account, by partner, by journal, etc.)\n\"Output format preference?\" (PDF, WhatsApp cards, or both)\nEntrypoint\n\nUses the venv with fpdf2, matplotlib, pillow for proper PDF/chart generation:\n\n./skills/odoo/assets/autonomous-cfo/venv/bin/python ./skills/odoo/assets/autonomous-cfo/src/tools/cfo_cli.py <command>\n\n\nOr from the skill directory:\n\ncd skills/odoo/assets/autonomous-cfo && ./venv/bin/python src/tools/cfo_cli.py <command>\n\nChart of Accounts Based Reporting\n\nReports should be built from:\n\naccount.account - Chart of Accounts structure (code, name, type, internal_group)\naccount.move.line - Journal entry lines (debit, credit, account_id, date)\naccount.journal - Source journals (type: sale, purchase, cash, bank, general)\nAccount Internal Groups\nASSET - Assets (current, non-current, cash, receivables)\nLIABILITY - Liabilities (payables, taxes, accrued)\nEQUITY - Owner's equity\nINCOME - Revenue accounts\nEXPENSE - Cost and expense accounts\nOFF_BALANCE - Off-balance sheet accounts\nCommon Account Types\nasset_cash - Bank and cash accounts\nasset_receivable - Accounts receivable\nasset_current - Current assets\nliability_payable - Accounts payable\nincome - Revenue\nexpense - Expenses\nSpecial Equity Types (Odoo-Specific)\nequity - Standard equity accounts (share capital, retained earnings)\nequity_unaffected - Suspense account for undistributed profits/losses (e.g., 999999)\n\nCRITICAL for Balance Sheet: Odoo's equity_unaffected is a SUSPENSE account. Do NOT use its ledger balance directly.\n\nCorrect Equity Calculation:\n\nEquity Proper (type: equity) - Use ledger balance (credit - debit)\nRetained Earnings (prior years) - Ledger balance from equity_unaffected\nCurrent Year Earnings - Compute real-time: Income - Expenses\nTotal Equity = Equity Proper + Retained Earnings + Current Year Earnings\n\n\nWhere Current Year Earnings = Σ(income credit-debit) - Σ(expense debit-credit)\n\nWhy 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.\n\nAutomatic Reporting Standard Detection\n\nThe skill automatically detects the company's accounting standard based on country/jurisdiction and formats reports accordingly.\n\nSupported Standards:\n\nStandard\tJurisdiction\tNotes\nIFRS\tInternational\tDefault for most countries\nUS GAAP\tUnited States\tSEC registrants\nInd-AS\tIndia\tIndian GAAP converged with IFRS\nUK GAAP\tUnited Kingdom\tFRS 102\nSOCPA\tSaudi Arabia\tIFRS adopted\nEU IFRS\tEuropean Union\tIAS Regulation\nCAS\tChina\tChinese Accounting Standards\nJGAAP\tJapan\tJapanese GAAP\nASPE\tCanada\tPrivate enterprises\nAASB\tAustralia\tAustralian standards\n\nDetection Logic:\n\nQuery company's country from res.company\nMap country code to reporting standard\nApply standard-specific formatting:\nNumber format (1,234.56 vs 1.234,56)\nNegative display ((123) vs -123)\nDate format (DD/MM/YYYY vs MM/DD/YYYY)\nStatement titles (Balance Sheet vs Statement of Financial Position)\nCash flow method (indirect vs direct)\n\nOverride:\n\n# Force a specific standard\nreporter.generate(..., standard=\"US_GAAP\")\n\nCommands\nSales & CRM Queries\n# Salesperson performance - use direct RPC for flexibility\n./venv/bin/python -c \"\nfrom src.visualizers.whatsapp_cards import WhatsAppCardGenerator\n# Query sale.order by user_id, aggregate by month/status\n# Generate cards with generate_kpi_card() and generate_comparison_card()\n\"\n\n# Example RPC query for salesperson:\n# - sale.order (user_id, amount_total, state, date_order)\n# - account.move (invoice_user_id, amount_total, payment_state)\n# - res.users (salesperson info)\n# - res.partner (customer info)\n\nPre-built Reports\n# Financial Health - cash flow, liquidity, burn rate, runway\ncfo_cli.py health --from YYYY-MM-DD --to YYYY-MM-DD --company-id ID\n\n# Revenue Analytics - MoM trends, top customers\ncfo_cli.py revenue --from YYYY-MM-DD --to YYYY-MM-DD --company-id ID\n\n# AR/AP Aging - overdue buckets\ncfo_cli.py aging --as-of YYYY-MM-DD --company-id ID\n\n# Expense Breakdown - by vendor/category\ncfo_cli.py expenses --from YYYY-MM-DD --to YYYY-MM-DD --company-id ID\n\n# Executive Summary - one-page CFO snapshot\ncfo_cli.py executive --from YYYY-MM-DD --to YYYY-MM-DD --company-id ID\n\nDirect RPC Queries (Advanced)\n\nFor sales/CRM data not covered by pre-built commands, use direct RPC:\n\n# Query sales orders by salesperson\norders = jsonrpc('sale.order', 'search_read',\n    [[('user_id', '=', SALESPERSON_ID)]],\n    {'fields': ['name', 'partner_id', 'amount_total', 'state', 'date_order']})\n\n# Query invoices by salesperson\ninvoices = jsonrpc('account.move', 'search_read',\n    [[('invoice_user_id', '=', SALESPERSON_ID), ('move_type', '=', 'out_invoice')]],\n    {'fields': ['name', 'partner_id', 'amount_total', 'payment_state']})\n\n# Find salesperson by name\nusers = jsonrpc('res.users', 'search_read',\n    [[('name', 'ilike', 'name_here')]],\n    {'fields': ['id', 'name', 'login']})\n\nAd-hoc Reports\n# Custom comparison\ncfo_cli.py adhoc --from YYYY-MM-DD --to YYYY-MM-DD --metric-a \"revenue\" --metric-b \"expenses\"\n\n# Examples:\ncfo_cli.py adhoc --metric-a \"cash in\" --metric-b \"cash out\"\ncfo_cli.py adhoc --metric-a \"direct expenses\" --metric-b \"indirect expenses\"\n\nOutput Formats\n--output whatsapp   # Dark theme 1080x1080 PNG cards\n--output pdf        # Light theme A4 PDF\n--output excel      # Excel workbook (.xlsx)\n--output both       # PDF + WhatsApp cards\n--output all        # PDF + Excel + WhatsApp cards\n\nAutomatic Visualizations\n\nReports always include appropriate visualizations by default:\n\nReport\tAuto-Included Charts\nFinancial Health\tCash position, burn rate trend, runway\nRevenue\tMoM trend, top customers, growth KPI\nAR/AP Aging\tAging buckets pie, overdue highlights\nExpenses\tCategory breakdown, trend, top vendors\nExecutive\tAll KPI cards, summary charts\nBalance Sheet\tAsset/liability composition\nP&L\tRevenue vs expense, margin trend\nCash Flow\tOperating breakdown, cash trend\n\nRule: If visualization makes the report clearer, include it automatically. Never ask \"do you want charts?\" — just add them.\n\nInteractive Param Collection\n\nIf required params are missing, the skill will ask:\n\nCompany: \"Which company?\" (list available options)\nPeriod: \"What period? (e.g., 'last month', 'Q4 2024', custom dates)\"\nAccounts: \"Which accounts or groups?\" (e.g., 'all income', 'bank accounts only')\nBreakdown: \"Group by? (Month, Customer, Category, Account)\"\nOutput: \"Output format? (WhatsApp cards, PDF, Both)\"\nHow to Use in Chat\n\nJust ask naturally:\n\nSales & CRM:\n\n\"How is [name] salesperson performance?\"\n\"Show me top customers for [salesperson]\"\n\"Compare sales team performance\"\n\"Which salesperson has the most orders?\"\n\nFinancial Reports:\n\n\"Give me a financial health report for last quarter\"\n\"Show revenue vs expenses for the past 6 months\"\n\"What's my AR aging?\"\n\"Generate an executive summary for this month\"\n\"Show me profit & loss statement based on chart of accounts\"\n\nGeneral Queries:\n\n\"How many orders did we get this month?\"\n\"Who are the top 10 customers?\"\n\"Show invoice status for [customer name]\"\n\nThe skill will:\n\nCheck for multiple companies and ask which one\nParse your request\nAsk for any missing info\nFetch data from Odoo using ledger entries or direct RPC\nGenerate charts + WhatsApp cards\nDeliver via WhatsApp cards and/or PDF\nHard Rules\nOdoo RPC output is source of truth\nStrict read-only (no create/write/unlink)\nNo proactive actions unless requested\nEvery number includes methodology note\nAlways verify with user before assuming\nAlways include visualizations - If a report benefits from charts/graphs, include them automatically without asking. Reports should be visually complete.\nDiagnostics\npython3 ./skills/odoo/assets/autonomous-cfo/src/tools/cfo_cli.py doctor\n\nReport Themes\nWhatsApp Cards: \"Midnight Ledger\" — Navy-black (#0a0e1a), copper glow (#cd7f32)\nPDF Reports: Clean white, copper accents, professional layout"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/ashrf-in/odoo-reporting",
    "publisherUrl": "https://clawhub.ai/ashrf-in/odoo-reporting",
    "owner": "ashrf-in",
    "version": "2.0.7",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/odoo-reporting",
    "downloadUrl": "https://openagent3.xyz/downloads/odoo-reporting",
    "agentUrl": "https://openagent3.xyz/skills/odoo-reporting/agent",
    "manifestUrl": "https://openagent3.xyz/skills/odoo-reporting/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/odoo-reporting/agent.md"
  }
}