名称: odoo
描述: "查询 Odoo 数据,包括销售员绩效、客户分析、订单、发票、CRM、会计、增值税、库存以及应收/应付账款。可生成 WhatsApp 卡片、PDF 和 Excel 文件。当用户明确提及 Odoo 或要求 Odoo 数据时使用。"
只读、证据优先、基于总账的报告
| 模型 | 包含内容 | 用途 |
|---|---|---|
res.users |
用户/销售员 | 按姓名查找销售员,获取用户 ID |
sale.order |
销售订单 | 按销售员统计收入、订单数量、状态 |
account.move |
发票/日记账分录 | 发票跟踪、付款、损益数据 |
res.partner |
联系人/客户 | 客户信息、按收入排序的顶级客户 |
product.product |
产品 | 产品销售、库存 |
account.account |
会计科目表 | 财务报表、资产负债表 |
account.move.line |
日记账行 | 详细的分类账条目 |
此技能需要存储在 assets/autonomous-cfo/.env 中的 Odoo 连接凭证:
| 变量 | 描述 | 是否为密钥 |
|---|---|---|
ODOO_URL |
Odoo 实例 URL (例如 https://your-odoo.com) |
否 |
ODOO_DB |
Odoo 数据库名称 | 否 |
ODOO_USER |
Odoo 用户名/邮箱 | 否 |
ODOO_PASSWORD |
Odoo 密码或 API 密钥 | 是 |
设置步骤:
cd skills/odoo/assets/autonomous-cfo
cp .env.example .env
# 使用您的实际凭证编辑 .env 文件
nano .env
根据 skill.json 策略,模型调用功能已禁用。此技能处理敏感的财务数据和外部 Odoo 连接,必须由用户明确调用。
数据处理: 所有查询均为只读。不会修改或外传任何数据。
create、write、unlink 等)在客户端级别已被阻止。assets/autonomous-cfo/output/ 目录下本地生成。.env 中指定的 Odoo URL。此技能需要一个包含特定包的 Python 虚拟环境:
cd skills/odoo/assets/autonomous-cfo
./install.sh
或手动安装:
cd skills/odoo/assets/autonomous-cfo
python3 -m venv venv
./venv/bin/pip install -r requirements.txt
依赖项: requests、matplotlib、pillow、fpdf2、openpyxl
account.move.line),而不仅仅是发票摘要。使用包含 fpdf2、matplotlib、pillow 的虚拟环境以正确生成 PDF/图表:
./skills/odoo/assets/autonomous-cfo/venv/bin/python ./skills/odoo/assets/autonomous-cfo/src/tools/cfo_cli.py <命令>
或从技能目录运行:
cd skills/odoo/assets/autonomous-cfo && ./venv/bin/python src/tools/cfo_cli.py <命令>
报告应基于以下内容构建:
- account.account - 会计科目表结构(代码、名称、类型、内部组)
- account.move.line - 日记账行(借方、贷方、科目 ID、日期)
- account.journal - 来源日记账(类型:销售、采购、现金、银行、一般)
asset_cash - 银行和现金科目asset_receivable - 应收账款asset_current - 流动资产liability_payable - 应付账款income - 收入expense - 费用equity - 标准权益科目(股本、留存收益)equity_unaffected - 暂记科目,用于未分配利润/亏损(例如,999999)资产负债表的关键点:
Odoo 的 equity_unaffected 是一个暂记科目。请勿直接使用其分类账余额。
正确的权益计算:
1. 权益本身 (类型: equity) - 使用分类账余额 (贷方 - 借方)
2. 留存收益 (以前年度) - 来自 equity_unaffected 的分类账余额
3. 本年利润 - 实时计算:收入 - 费用
总权益 = 权益本身 + 留存收益 + 本年利润
其中,本年利润 = Σ(收入科目贷方-借方) - Σ(费用科目借方-贷方)
为何重要: Odoo 在资产负债表上实时计算本年利润。仅使用 equity_unaffected 的分类账余额将导致资产负债表不平衡。
此技能会根据公司所在国家/地区自动检测其会计报告准则,并相应格式化报告。
支持的准则:
| 准则 | 管辖区域 | 备注 |
|----------|--------------|-------|
| IFRS | 国际 | 大多数国家的默认准则 |
| US GAAP | 美国 | SEC 注册公司 |
| Ind-AS | 印度 | 与 IFRS 趋同的印度 GAAP |
| UK GAAP | 英国 | FRS 102 |
| SOCPA | 沙特阿拉伯 | 采用 IFRS |
| EU IFRS | 欧盟 | IAS 法规 |
| CAS | 中国 | 中国会计准则 |
| JGAAP | 日本 | 日本 GAAP |
| ASPE | 加拿大 | 私营企业 |
| AASB | 澳大利亚 | 澳大利亚准则 |
检测逻辑:
1. 从 res.company 查询公司所在国家。
2. 将国家代码映射到报告准则。
3. 应用特定于准则的格式:
- 数字格式 (1,234.56 对比 1.234,56)
- 负数显示 ((123) 对比 -123)
- 日期格式 (DD/MM/YYYY 对比 MM/DD/YYYY)
- 报表标题 (资产负债表对比财务状况表)
- 现金流量方法 (间接法对比直接法)
覆盖默认准则:
# 强制使用特定准则
reporter.generate(..., standard="US_GAAP")
# 销售员绩效 - 使用直接 RPC 以获得灵活性
./venv/bin/python -c "
from src.visualizers.whatsapp_cards import WhatsAppCardGenerator
# 按 user_id 查询 sale.order,按月/状态聚合
# 使用 generate_kpi_card() 和 generate_comparison_card() 生成卡片
"
# 销售员 RPC 查询示例:
# - sale.order (user_id, amount_total, state, date_order)
# - account.move (invoice_user_id, amount_total, payment_state)
# - res.users (销售员信息)
# - res.partner (客户信息)
# 财务健康状况 - 现金流、流动性、消耗率、资金跑道
cfo_cli.py health --from YYYY-MM-DD --to YYYY-MM-DD --company-id ID
# 收入分析 - 月度趋势、顶级客户
cfo_cli.py revenue --from YYYY-MM-DD --to YYYY-MM-DD --company-id ID
# 应收/应付账龄 - 逾期账龄分段
cfo_cli.py aging --as-of YYYY-MM-DD --company-id ID
# 费用细分 - 按供应商/类别
cfo_cli.py expenses --from YYYY-MM-DD --to YYYY-MM-DD --company-id ID
# 执行摘要 - 一页 CFO 快照
cfo_cli.py executive --from YYYY-MM-DD --to YYYY-MM-DD --company-id ID
对于预置命令未涵盖的销售/CRM 数据,使用直接 RPC:
# 按销售员查询销售订单
orders = jsonrpc('sale.order', 'search_read',
[[('user_id', '=', SALESPERSON_ID)]],
{'fields': ['name', 'partner_id', 'amount_total', 'state', 'date_order']})
# 按销售员查询发票
invoices = jsonrpc('account.move', 'search_read',
[[('invoice_user_id', '=', SALESPERSON_ID), ('move_type', '=', 'out_invoice')]],
{'fields': ['name', 'partner_id', 'amount_total', 'payment_state']})
# 按姓名查找销售员
users = jsonrpc('res.users', 'search_read',
[[('name', 'ilike', 'name_here')]],
{'fields': ['id', 'name', 'login']})
# 自定义对比
cfo_cli.py adhoc --from YYYY-MM-DD --to YYYY-MM-DD --metric-a "revenue" --metric-b "expenses"
# 示例:
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 # 深色主题 1080x1080 PNG 卡片
--output pdf # 浅色主题 A4 PDF
--output excel # Excel 工作簿 (.xlsx)
--output both # PDF + WhatsApp 卡片
--output all # PDF + Excel + WhatsApp 卡片
报告默认始终包含适当的可视化图表:
| 报告 | 自动包含的图表 |
|---|---|
| 财务健康状况 | 现金状况、消耗率趋势、资金跑道 |
| 收入 | 月度趋势、顶级客户、增长 KPI |
| 应收/应付账龄 | 账龄分段饼图、逾期高亮 |
| 费用 | 类别细分、趋势、顶级供应商 |
| 执行摘要 | 所有 KPI 卡片、摘要图表 |
| 资产负债表 | 资产/负债构成 |
| 损益表 | 收入与费用对比、利润率趋势 |
| 现金流量表 | 经营活动细分、现金趋势 |
规则: 如果可视化能使报告更清晰,则自动包含。切勿询问"是否需要图表?",直接添加即可。
如果缺少必需参数,技能将询问:
只需自然提问:
销售与 CRM:
- "[姓名] 销售员的绩效如何?"
- "显示 [销售员] 的顶级客户"
- "比较销售团队绩效"
- "哪位销售员的订单最多?"
财务报告:
- "给我一份上个季度的财务健康状况报告"
- "显示过去 6 个月的收入与费用对比"
- "我的应收账龄是多少?"
- "生成本月的执行摘要"
- "基于会计科目表显示损益表"
常规查询:
- "我们这个月收到了多少订单?"
- "谁是前 10 名客户?"
- "显示 [客户名称] 的发票状态"
技能将:
1. 检查是否存在多个公司并询问使用哪一个。
2. 解析您的请求。
3. 询问任何缺失的信息。
4. 使用分类账条目或直接 RPC 从 Odoo 获取数据。
5. 生成图表和 WhatsApp 卡片。
6. 通过 WhatsApp 卡片和/或 PDF 交付。
python3 ./skills/odoo/assets/autonomous-cfo/src/tools/cfo_cli.py doctor