- Ya
- 11 Agosti 2026, 17:10 UTC
- Mwandishi
- Kamo
- Ahadi ya
- 0b5b576
Same constant/dotted-key split as the HR legal family: the CONSTANT is the filename stem, the templateKey the platform SENDS is the dotted value inside each .json. Getting that wrong is the live QUOTE_SENT/commerce.quote_sent bug — every send 404s forever against a template that seeded perfectly — so HrTrainingTemplateTest pins both halves in both directions. ONE reminder template covers every rung of the ladder (T-14/7/3/1, due today, and every past-due period). Tone is carried by a pre-rendered eyebrow and duePhrase rather than by separate files, because a half-added canonical pair throws inside loadAll() — which is what seedForOrg iterates — and would break seeding for EVERY org on the platform rather than only its own. Each template is a 600px inline-styled card with a bulletproof VML + anchor CTA, because Outlook's Word engine ignores the anchor entirely. The test asserts ctaUrl appears exactly three times (VML href, anchor href, copy-paste fallback), that no template uses {{#if}} (the renderer is a flat regex replace and would render it as visible text), that no template pulls an external resource, and that each one carries the three variables EmailTemplateService injects so white-label branding works. Subjects use courseTitlePlain and bodies use courseTitle: the two render from ONE variable map, so an escaped value in a subject shows "Employee's Handbook" in the mail client's header while an unescaped one in a body ships live markup from the org's own DKIM-signed domain. No retake email is sent on a FINAL failure. Telling somebody by email that they have permanently failed a mandatory course, with no path forward and no human attached, is the wrong medium — the HR grid carries it instead. 1186 tests pass.