TNCSC_Odoo/README.md
metatroncubeswdev 8dd97dec9b
Some checks failed
CI / Brand-leak check (push) Has been cancelled
CI / flake8 / pylint-odoo / manifest completeness (push) Has been cancelled
CI / Install all modules with --test-enable (push) Has been cancelled
docs(phase-9-a): fill in real module READMEs, add CHANGELOGs, fix stale HANDOFF
- Replace the Phase-0 "content to be completed" placeholder Usage section
  in every community_* README.rst with the actual features built across
  Phases 1-6 (routes, crons, portal pages).
- Add CHANGELOG.rst (19.0.1.0.0) to every community_* module.
- Note independent-vs-bundled module relationships in the root README.
- Fix HANDOFF.md: Phase 8 was already committed (9a24691) and a git
  remote is configured, contrary to what it still said; record 9-A
  progress and the open gaps (missing banner.png assets, live
  --test-enable suite not re-run this session, no v1.0.0 tag yet).
2026-08-20 09:23:32 -04:00

108 lines
5.6 KiB
Markdown

# Community OS
A brand-neutral, resellable suite of Odoo 19 Community modules for
community and cultural organizations. First deployment: the Tamil Nadu
Cultural Society of Canada (TNCSC).
**Vendor:** Metatroncube Software Solutions LLP · Waterloo, Ontario
**Target platform:** Odoo 19 Community Edition (LGPL-3) · PostgreSQL 16 · Python 3.12
> `community_*` is a placeholder module prefix. Replace it with a unique
> vendor prefix before publishing to the Odoo App Store so technical names
> never collide with anything already listed.
## Layered architecture
```
┌─────────────────────────────────────────────────────────────┐
│ DEPLOYMENT LAYER (per client — data only, no logic) │
│ tncsc_deployment: branding, tiers & prices, chart of │
│ accounts, email copy, website pages, user groups │
└───────────────▲─────────────────────────────────────────────┘
│ depends on
┌───────────────┴─────────────────────────────────────────────┐
│ PRODUCT LAYER (brand-neutral, resellable, LGPL-3) │
│ community_membership event_qr_ticketing community_school │
│ community_classifieds community_benefits community_interac│
│ community_theme_base community_portal │
└───────────────▲─────────────────────────────────────────────┘
│ depends only on
┌───────────────┴─────────────────────────────────────────────┐
│ ODOO 19 COMMUNITY CORE (never Enterprise) │
└─────────────────────────────────────────────────────────────┘
```
Product-layer modules never mention a client name, never hardcode a price,
a colour, an account code, or an email address. Anything client-specific
is a configuration record, seeded only by a `*_deployment` module. Landing
a new client means writing a new `clientname_deployment` module — the
product code never changes.
## Modules
### Product layer (brand-neutral, sellable)
| Module | Purpose |
|---|---|
| `community_theme_base` | Configurable brand tokens (colours, logo, fonts) via settings |
| `community_membership` | Member profiles, tiers, family grouping, renewals, QR membership card |
| `event_qr_ticketing` | QR ticket per event registration, staff check-in / verification |
| `community_school` | Programs, classes, enrollment, attendance, LMS link, parent portal |
| `community_classifieds` | Member-gated classifieds board with moderation and auto-expiry |
| `community_benefits` | Benefit centres and per-tier member benefit entitlements |
| `community_interac` | Interac e-Transfer semi-automated payment provider (Canada) |
| `community_portal` | Unified member portal dashboard, soft-detects installed modules |
### Deployment layer (per client — data only)
| Module | Purpose |
|---|---|
| `tncsc_deployment` | TNCSC branding, tiers/prices, chart of accounts, email copy, website pages, user groups |
### Independent vs. bundled
Every product module installs standalone on a stock Odoo 19 CE with only
its declared Community-core dependencies — none require another
`community_*` module to function, with one deliberate exception:
`community_benefits` hard-depends on `community_membership` (a benefit is
entitled per membership tier, so the dependency is intrinsic to what it
does). `community_school` and `community_classifieds` *soft*-detect
`event_qr_ticketing`/`community_membership` when present and degrade
gracefully without them. `community_portal` soft-detects all of the above
and only renders cards for whichever are installed. This means each module
can be sold and installed on its own, or bundled as the full suite.
## Local development
```bash
cd deploy
docker compose up
```
Odoo will be available at http://localhost:8069. The `../addons` folder is
mounted read-write, so changes to module code are picked up on restart (dev
mode reload is enabled in `deploy/odoo.conf`).
## Licensing & resellability guardrails
1. Every product module is licensed `LGPL-3`.
2. No `community_*` module may depend on an Odoo Enterprise module — see
`Appendix A` in the project plan for the Community-only allowlist.
3. No client identity (name, email, colour, price, account code) may appear
in a product module. This is enforced in CI by
`scripts/check_brand_leak.py`.
4. All client-variable behaviour is configuration data, seeded by the
deployment layer, never a literal in product code.
5. Every product module ships an App-Store-ready manifest, a `tests/`
package, and a `static/description/index.html` listing page.
See `CommunityOS_Implementation_Plan_for_Claude_Code.md` for the full,
phase-by-phase build plan, and `HANDOFF.md` for exactly where the build
currently stands, how to resume it, and known gotchas.
## CI
`.github/workflows/ci.yml` installs every module against Odoo 19 +
Postgres 16 with `--test-enable`, runs the brand-leak grep, and lints with
flake8 / pylint-odoo.