Adds the daily membership renewal cron (_cron_process_membership_renewals):
sends a "renewal upcoming" reminder at each non-final configured offset,
flips state to renewal_due and sends a "renewal due" notice at the final
(smallest) offset, and on expiry flips to 'expired', sends an expiry notice,
and creates a draft renewal invoice for the member's tier product.
Email templates (renewal_upcoming, renewal_due, membership_expired) use
Odoo 19's current mail.template syntax ({{ }} subject/QWeb t-out body) -
the plan referenced the older ${object...} syntax, which v19 no longer
uses. Org name is pulled via a new non-stored res.partner.membership_org_name
compute field backed by ir.config_parameter, never hardcoded.
Also had to adapt the ir.cron data record: Odoo 19 removed 'numbercall'
entirely (ir.cron now delegates most fields to a linked ir.actions.server
under the hood, though name/model_id/state/code are still settable
directly on the record, per the core mail module's own cron definitions).
Verified against a live Odoo 19 + Postgres 16 container: module upgrades
clean, all 8 tests pass (4 from 1-A + 4 new: non-final-offset reminder,
final-offset state flip to renewal_due, expiry creates a draft invoice +
notice, no action outside any offset window).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
48 lines
1.6 KiB
Python
48 lines
1.6 KiB
Python
{
|
|
'name': 'Community OS - Membership',
|
|
'version': '19.0.1.0.0',
|
|
'category': 'Sales/Members',
|
|
'summary': 'Configurable membership tiers, family grouping, renewals, QR membership card and self-service portal',
|
|
'description': """
|
|
Community OS - Membership
|
|
===========================
|
|
|
|
A fully generic membership engine for community and cultural organizations:
|
|
|
|
* Admin-configurable membership tiers (name, price, period) - never hardcoded
|
|
* Family grouping and auto-generated member IDs (configurable format)
|
|
* Automated renewal reminders, expiry handling, and draft renewal invoices
|
|
* Self-service member portal (status, tier, expiry, renew, download card)
|
|
* QR-coded membership card (PDF) with a public verification endpoint
|
|
|
|
No client names, prices, or branding are hardcoded - everything is a
|
|
configuration record managed by the deployment layer.
|
|
""",
|
|
'author': 'Metatroncube Software Solutions LLP',
|
|
'website': 'https://www.metatroncube.com',
|
|
'license': 'LGPL-3',
|
|
'price': 0.00,
|
|
'currency': 'USD',
|
|
'depends': [
|
|
'contacts',
|
|
'account',
|
|
'portal',
|
|
'website',
|
|
],
|
|
'data': [
|
|
'security/membership_security.xml',
|
|
'security/ir.model.access.csv',
|
|
'data/ir_sequence.xml',
|
|
'data/mail_templates.xml',
|
|
'data/ir_cron.xml',
|
|
'views/membership_tier_views.xml',
|
|
'views/res_partner_views.xml',
|
|
'views/res_config_settings_views.xml',
|
|
'views/membership_menus.xml',
|
|
],
|
|
'demo': [],
|
|
'images': ['static/description/banner.png'],
|
|
'application': True,
|
|
'installable': True,
|
|
}
|