Data-only deployment layer seeding TNCSC's branding (navy/orange/electric-
blue from the plan), 5 membership tiers in CAD (Individual $50, Family $80,
Student $20, Senior $30, Life $500 - the plan's own example figures;
update via Settings once TNCSC confirms real pricing), the
'TNCSC-{year}-{seq}' member-ID format, a Canadian (Ontario/HST) chart of
accounts via l10n_ca plus non-profit-specific accounts (Membership Dues/
Event/Sponsorship/School Fees/Donations Revenue, Deferred Event Revenue
liability, a Stripe clearing account) and a Donations journal, bilingual
EN/Tamil overrides of two membership email templates (Tamil text is a
best-effort draft only, explicitly flagged as needing native-speaker
review before go-live), five placeholder website pages (Home/About/Tamil
School/Sponsors/Contact), and TNCSC-named role groups (Board Admin,
Treasurer, Events Officer, School Coordinator, Teacher, Classifieds
Moderator) that imply the existing generic product-layer groups rather
than defining new permission logic.
Chasing the chart-of-accounts setup down to a genuinely working state
took real digging: setting company.country_id on a brand-new company
auto-schedules this Odoo build's own chart-template installer via a
precommit hook (res.company.install_l10n_modules), which races an
explicit try_loading('ca_2023', ...) call made in the same install
transaction and silently replaces its result afterwards (reverting
currency to USD, chart_template to 'generic_coa', and deleting the custom
accounts) - confirmed via raw SQL checks that the correct state exists
right up until the post_init_hook transaction commits, and is gone by the
time the install process exits. Since the precommit auto-trigger only
ever fires once per company (guarded by chart_template being unset), a
second call from a separate transaction is immune to the race. The fix:
the actual setup logic lives in an idempotent res.company._tncsc_setup_
accounting() method (models/res_company.py - a narrow, documented
exception to "no models" in the deployment layer, since cramming this
into a sandboxed ir.cron code string wasn't practical), called as a
best-effort from post_init_hook and guaranteed by a daily safety-net cron
que runs in its own transaction. Also hit two smaller, separate bugs on
the way: ir.cron code execution forbids direct attribute assignment
(STORE_ATTR) in its sandbox, and Html config_parameter fields must not be
wrapped in CDATA in data XML.
Verified end-to-end on a genuinely fresh database (not the long-lived dev
DB, which already has posted entries and correctly refuses a currency
change): installed tncsc_deployment alone, pulling in all 8 product
modules plus l10n_ca as dependencies, confirmed the post-install state via
raw SQL, manually triggered the safety-net cron and confirmed it reached
the fully-correct state (CAD, ca_2023, 355 accounts including all 7
custom ones, the Donations journal, tier products linked to the dues
account), confirmed the cron is idempotent on a second run, and ran the
full test suite (9/9 passing) with the same deterministic setup called
from the test transaction directly.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
60 lines
3.5 KiB
XML
60 lines
3.5 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<odoo noupdate="1">
|
|
<!-- Bilingual (EN/Tamil) overrides of the community_membership templates,
|
|
demonstrating the pattern: TNCSC voice, org name, both languages.
|
|
The Tamil text below is a best-effort placeholder draft only - it
|
|
has NOT been reviewed by a native Tamil speaker and must be
|
|
corrected before this goes live. -->
|
|
|
|
<record id="community_membership.mail_template_membership_renewal_due" model="mail.template">
|
|
<field name="subject">TNCSC membership renewal due | TNCSC உறுப்பினர் புதுப்பித்தல் தேவை</field>
|
|
<field name="body_html" type="html">
|
|
<div style="margin: 0px; padding: 0px; font-size: 13px;">
|
|
<p><strong>English</strong></p>
|
|
<p>Dear <t t-out="object.name or ''">Member</t>,</p>
|
|
<p>
|
|
Your Tamil Nadu Cultural Society of Canada membership
|
|
<t t-if="object.membership_member_id">(<t t-out="object.membership_member_id"/>)</t>
|
|
expires on <t t-out="format_date(object.membership_expiry)"/>.
|
|
</p>
|
|
<p>Please renew soon to keep your membership active and avoid a lapse in benefits.</p>
|
|
<hr/>
|
|
<p><strong>தமிழ்</strong></p>
|
|
<p>அன்புள்ள <t t-out="object.name or ''">உறுப்பினர்</t>,</p>
|
|
<p>
|
|
கனடா தமிழ்நாடு பண்பாட்டு சங்கத்தில் உங்கள் உறுப்பினர் காலம்
|
|
<t t-out="format_date(object.membership_expiry)"/> அன்று
|
|
காலாவதியாகிறது.
|
|
</p>
|
|
<p>உங்கள் உறுப்பினர் தகுதியைத் தொடர தயவுசெய்து விரைவில் புதுப்பிக்கவும்.</p>
|
|
</div>
|
|
</field>
|
|
</record>
|
|
|
|
<record id="community_membership.mail_template_membership_expired" model="mail.template">
|
|
<field name="subject">Your TNCSC membership has expired | TNCSC உறுப்பினர் காலாவதியானது</field>
|
|
<field name="body_html" type="html">
|
|
<div style="margin: 0px; padding: 0px; font-size: 13px;">
|
|
<p><strong>English</strong></p>
|
|
<p>Dear <t t-out="object.name or ''">Member</t>,</p>
|
|
<p>
|
|
Your Tamil Nadu Cultural Society of Canada membership
|
|
<t t-if="object.membership_member_id">(<t t-out="object.membership_member_id"/>)</t>
|
|
expired on <t t-out="format_date(object.membership_expiry)"/>.
|
|
</p>
|
|
<p>A renewal invoice has been prepared for you. Please get in touch to reactivate your membership.</p>
|
|
<hr/>
|
|
<p><strong>தமிழ்</strong></p>
|
|
<p>அன்புள்ள <t t-out="object.name or ''">உறுப்பினர்</t>,</p>
|
|
<p>
|
|
கனடா தமிழ்நாடு பண்பாட்டு சங்கத்தில் உங்கள் உறுப்பினர் தகுதி
|
|
<t t-out="format_date(object.membership_expiry)"/> அன்று
|
|
காலாவதியானது.
|
|
</p>
|
|
<p>உங்களுக்கான புதுப்பித்தல் விலைப்பட்டியல் தயாரிக்கப்பட்டுள்ளது. உறுப்பினர் தகுதியை மீண்டும்
|
|
பெற எங்களைத் தொடர்பு கொள்ளவும்.</p>
|
|
</div>
|
|
</field>
|
|
</record>
|
|
</odoo>
|