Centralize billing for all NexaSystems services (NexaCloud, NexaDesk, NexaMaps, custom apps, memberships) on the Odoo 19 Enterprise instance, replacing Lago. The module adds only the metering + integration layer; native sale_subscription / account_accountant / payment_stripe do all the financial work (invoicing, HST, dunning, portal, credit notes, Stripe). Includes: - Design spec (docs/superpowers/specs/2026-05-27-nexa-billing-centralized-design.md): 6 locked decisions, architecture, data model, usage engine, Lago-shaped API, webhook control loop, NexaCloud pilot, phased dual-run migration. - Module scaffold: 7 fusion.billing.* models (service, account.link, metric, charge, usage, webhook, reconciliation), bearer-auth API controller shell, security ACLs, README. Compiles on Odoo 19.0; engine/API bodies are stubs pending the implementation plan. - CLAUDE.md rule #15: no sale.subscription model in Odoo 19 — a subscription is a sale.order(is_subscription) + sale.subscription.plan (verified live). Task 0 verified: a single Stripe account is shared across NexaCloud and all Lago providers, so no Stripe account/card migration is required. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
55 lines
2.3 KiB
Python
55 lines
2.3 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Copyright 2026 Nexa Systems Inc.
|
|
# License OPL-1 (Odoo Proprietary License v1.0)
|
|
{
|
|
"name": "Fusion Centralized Billing",
|
|
"version": "19.0.1.0.0",
|
|
"category": "Accounting/Subscriptions",
|
|
"summary": "Centralized billing engine for all NexaSystems services — metered usage, "
|
|
"per-app billing API, and outbound webhooks on top of Odoo Enterprise subscriptions.",
|
|
"description": """
|
|
Fusion Centralized Billing
|
|
==========================
|
|
|
|
Makes this Odoo Enterprise instance the single billing brain for every NexaSystems
|
|
service (NexaCloud hosting, NexaDesk chat, NexaMaps API, custom apps, memberships).
|
|
|
|
It adds ONLY the metering + integration layer; all financial behaviour (invoicing,
|
|
HST tax, proration, dunning, portal, credit notes, Stripe) is native Odoo Enterprise.
|
|
|
|
Capabilities
|
|
------------
|
|
* Service registry — one record per source app (NexaCloud / NexaDesk / NexaMaps) with
|
|
bearer API key + webhook config.
|
|
* Identity links — fold each app's external account into one ``res.partner``.
|
|
* Metric + Charge catalog — billable metrics with quota + overage pricing, keyed by a
|
|
shared ``plan_code`` (apps own feature entitlements; Odoo owns money).
|
|
* Usage engine — aggregate-push: apps send periodic counters; a pre-invoice cron feeds
|
|
billable quantities onto the subscription ``sale.order``.
|
|
* Inbound API — Lago-shaped REST (``/api/billing/v1/*``), bearer auth.
|
|
* Outbound webhooks — HMAC-signed lifecycle events (payment failed/succeeded,
|
|
subscription terminated) so apps suspend / restore / deprovision.
|
|
|
|
Design spec: docs/superpowers/specs/2026-05-27-nexa-billing-centralized-design.md
|
|
|
|
Status: SCAFFOLD. Model fields are in place; engine/API/webhook bodies are stubs to be
|
|
implemented via the writing-plans output. Per repo CLAUDE.md, read live Odoo 19
|
|
reference files from the container before implementing subscription/account internals.
|
|
""",
|
|
"author": "Nexa Systems Inc.",
|
|
"website": "https://nexasystems.ca",
|
|
"license": "OPL-1",
|
|
"depends": [
|
|
"account_accountant",
|
|
"sale_subscription",
|
|
"sale_management",
|
|
"payment_stripe",
|
|
],
|
|
"data": [
|
|
"security/ir.model.access.csv",
|
|
],
|
|
"installable": True,
|
|
"application": False,
|
|
"auto_install": False,
|
|
}
|