metatroncubeswdev ae324c30f9 feat(community_membership): tier model, res.partner extension, settings (Session 1-A)
Adds the membership foundation: community.membership.tier (admin-configurable
tiers, each auto-creating a linked invoicing product), res.partner membership
fields (member ID, tier, state, family grouping, volunteer tracking), and a
res.config.settings page (org name, member-ID format, renewal offsets, portal
toggle) - all backed by ir.config_parameter so nothing is hardcoded.

Member IDs are generated on activation via a configurable format string
({year}/{seq}) resolved against an ir.sequence. Adds the Membership Manager
group/menu and views (tier list/form, partner form tab, list columns, search
filters, settings page).

Along the way, hit two real Odoo 19 API changes vs. older tutorials/docs:
res.groups.category_id was replaced by privilege_id -> res.groups.privilege,
and module settings pages now use the <app>/<block>/<setting> pattern
inherited from base.res_config_settings_view_form rather than raw divs.

Verified by upgrading the module against a live Odoo 19 + Postgres 16
container: installs clean, all 4 tests pass (tier->product creation, member
ID generation on activation, one-time/lifetime tiers never expire,
configurable ID format), and the module still installs cleanly for its
dependents (community_benefits, tncsc_deployment).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-17 20:03:10 -04:00

20 lines
799 B
XML

<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="module_category_membership" model="ir.module.category">
<field name="name">Membership</field>
<field name="sequence">20</field>
</record>
<record id="privilege_membership" model="res.groups.privilege">
<field name="name">Membership</field>
<field name="category_id" ref="module_category_membership"/>
</record>
<record id="group_membership_manager" model="res.groups">
<field name="name">Membership Manager</field>
<field name="privilege_id" ref="privilege_membership"/>
<field name="implied_ids" eval="[(4, ref('base.group_user'))]"/>
<field name="comment">Can manage membership tiers, member records, and renewal settings.</field>
</record>
</odoo>