Author SHA1 Message Date
Claude 4dcf90e4f7 Revert openspec notification-template.md changes
The parent confirmation email template belongs only in the code
(Jinja2 templates), not in the openspec content folder.

https://claude.ai/code/session_01Qikq92MrNk95ZXtatPyJJh
2026-02-27 19:21:46 +00:00
Claude aa3686c6a9 Add leader contact section to parent confirmation email templates
Both .html.j2 and .txt.j2 now include a CONTACT section after the
emergency block. It conditionally shows Andrea Sigrist (indoor) and/or
Barbara Gross (outdoor) plus Markus Graf (admin) with phone and email,
rendered as clickable links in HTML.

Adds the required template variables (has_outdoor, leader_indoor_*,
leader_outdoor_*, admin_*) to build_parent_context in context.py, and
the matching label strings to de.yaml (LLM-translated for other langs).

https://claude.ai/code/session_01Qikq92MrNk95ZXtatPyJJh
2026-02-27 19:18:59 +00:00
Claude 55d5567e54 Add parent confirmation email template with leader contact details
Introduces a parent-facing confirmation email template to
notification-template.md. It includes phone and email for the
relevant playgroup leader(s) (Andrea Sigrist for indoor, Barbara
Gross for outdoor), conditionally rendered by registration type,
plus administration contact. Bilingual (German/English).

https://claude.ai/code/session_01Qikq92MrNk95ZXtatPyJJh
2026-02-27 18:01:38 +00:00
Claude aac179de13 Add leader email addresses to registration completion message
Parents now see both phone and email for Andrea Sigrist (indoor)
and Barbara Gross (outdoor) in the confirmation message, in both
English and German.

https://claude.ai/code/session_01Qikq92MrNk95ZXtatPyJJh
2026-02-27 17:57:08 +00:00
Markus GrafandGitHub e076ac9391 Merge pull request #10 from gurix/claude/confirm-email-from-address-Pgg8F
Specify Reply-To headers for confirmation and notification emails
2026-02-27 18:33:25 +01:00
5 changed files with 76 additions and 3 deletions
@@ -125,7 +125,7 @@
> - Registration fee: CHF 80 (one-time)
> - Monthly fee: [amount based on selection]
>
> The playgroup team will be in touch soon. If you have any questions, feel free to contact Andrea (indoor) at 079 674 99 92 or Barbara (outdoor) at 078 761 19 64.
> The playgroup team will be in touch soon. If you have any questions, feel free to contact Andrea (indoor) at 079 674 99 92 or andrea.sigrist@gmx.net, or Barbara (outdoor) at 078 761 19 64 or baba.laeubli@gmail.com.
>
> We look forward to welcoming [child's name]!
@@ -136,7 +136,7 @@
> - Einschreibegebühr: CHF 80 (einmalig)
> - Monatsbeitrag: [amount based on selection]
>
> Das Spielgruppen-Team wird sich bald melden. Bei Fragen kannst du Andrea (drinnen) unter 079 674 99 92 oder Barbara (draussen) unter 078 761 19 64 erreichen.
> Das Spielgruppen-Team wird sich bald melden. Bei Fragen kannst du Andrea (drinnen) unter 079 674 99 92 oder andrea.sigrist@gmx.net, oder Barbara (draussen) unter 078 761 19 64 oder baba.laeubli@gmail.com erreichen.
>
> Wir freuen uns auf [child's name]!
+22
View File
@@ -14,6 +14,18 @@ QR_STREET = "Huebwisstrase 5"
QR_PCODE = "8117"
QR_CITY = "Fällanden"
LEADER_INDOOR_NAME = "Andrea Sigrist"
LEADER_INDOOR_PHONE = "079 674 99 92"
LEADER_INDOOR_EMAIL = "andrea.sigrist@gmx.net"
LEADER_OUTDOOR_NAME = "Barbara Gross"
LEADER_OUTDOOR_PHONE = "078 761 19 64"
LEADER_OUTDOOR_EMAIL = "baba.laeubli@gmail.com"
ADMIN_NAME = "Markus Graf"
ADMIN_PHONE = "079 261 16 37"
ADMIN_EMAIL = "spielgruppen@familien-verein.ch"
# ---------------------------------------------------------------------------
# Formatting helpers (pure functions, no side-effects)
# ---------------------------------------------------------------------------
@@ -187,7 +199,17 @@ def build_parent_context(
"days": format_days_i18n(registration, strings),
"monthly_fee": calculate_monthly_fee(registration),
"has_indoor": "indoor" in registration.booking.playgroup_types,
"has_outdoor": "outdoor" in registration.booking.playgroup_types,
"has_qr": has_qr,
"leader_indoor_name": LEADER_INDOOR_NAME,
"leader_indoor_phone": LEADER_INDOOR_PHONE,
"leader_indoor_email": LEADER_INDOOR_EMAIL,
"leader_outdoor_name": LEADER_OUTDOOR_NAME,
"leader_outdoor_phone": LEADER_OUTDOOR_PHONE,
"leader_outdoor_email": LEADER_OUTDOOR_EMAIL,
"admin_name": ADMIN_NAME,
"admin_phone": ADMIN_PHONE,
"admin_email": ADMIN_EMAIL,
"parent_name": pg.full_name or "",
"parent_address": pg.street_address or "",
"parent_postal_code": pg.postal_code or "",
+10 -1
View File
@@ -39,8 +39,17 @@ iban_label: "IBAN"
payee_label: "Empfänger"
amount_label: "Betrag"
contact_section: "Deine Ansprechpersonen"
contact_intro: "Bei Fragen kannst du dich direkt an die zuständige Spielgruppenleiterin wenden:"
contact_indoor_label: "Innenspielgruppe"
contact_outdoor_label: "Waldspielgruppe"
contact_admin_label: "Administration"
contact_name: "Name"
contact_phone: "Telefon"
contact_email: "E-Mail"
closing: |
Bei Fragen stehen wir dir gerne zur Verfügung. Wir freuen uns auf dein Kind!
Wir freuen uns auf dein Kind!
Herzliche Grüsse
Spielgruppe Pumuckl
@@ -74,6 +74,27 @@
<tr><td style="padding:4px 0;color:#666;">{{ strings.emergency_phone }}</td><td>{{ emergency_phone }}</td></tr>
</table>
<h2 style="color:#2e7d32;border-bottom:2px solid #2e7d32;padding-bottom:4px;font-size:16px;">{{ strings.contact_section }}</h2>
<p>{{ strings.contact_intro }}</p>
<table style="width:100%;border-collapse:collapse;">
{% if has_indoor %}
<tr><td colspan="2" style="padding:8px 0 2px;font-weight:bold;">{{ strings.contact_indoor_label }}</td></tr>
<tr><td style="padding:2px 0 2px 16px;color:#666;width:55%;">{{ strings.contact_name }}</td><td>{{ leader_indoor_name }}</td></tr>
<tr><td style="padding:2px 0 2px 16px;color:#666;">{{ strings.contact_phone }}</td><td><a href="tel:{{ leader_indoor_phone }}" style="color:#2e7d32;">{{ leader_indoor_phone }}</a></td></tr>
<tr><td style="padding:2px 0 8px 16px;color:#666;">{{ strings.contact_email }}</td><td><a href="mailto:{{ leader_indoor_email }}" style="color:#2e7d32;">{{ leader_indoor_email }}</a></td></tr>
{% endif %}
{% if has_outdoor %}
<tr><td colspan="2" style="padding:8px 0 2px;font-weight:bold;">{{ strings.contact_outdoor_label }}</td></tr>
<tr><td style="padding:2px 0 2px 16px;color:#666;width:55%;">{{ strings.contact_name }}</td><td>{{ leader_outdoor_name }}</td></tr>
<tr><td style="padding:2px 0 2px 16px;color:#666;">{{ strings.contact_phone }}</td><td><a href="tel:{{ leader_outdoor_phone }}" style="color:#2e7d32;">{{ leader_outdoor_phone }}</a></td></tr>
<tr><td style="padding:2px 0 8px 16px;color:#666;">{{ strings.contact_email }}</td><td><a href="mailto:{{ leader_outdoor_email }}" style="color:#2e7d32;">{{ leader_outdoor_email }}</a></td></tr>
{% endif %}
<tr><td colspan="2" style="padding:8px 0 2px;font-weight:bold;">{{ strings.contact_admin_label }}</td></tr>
<tr><td style="padding:2px 0 2px 16px;color:#666;width:55%;">{{ strings.contact_name }}</td><td>{{ admin_name }}</td></tr>
<tr><td style="padding:2px 0 2px 16px;color:#666;">{{ strings.contact_phone }}</td><td><a href="tel:{{ admin_phone }}" style="color:#2e7d32;">{{ admin_phone }}</a></td></tr>
<tr><td style="padding:2px 0 8px 16px;color:#666;">{{ strings.contact_email }}</td><td><a href="mailto:{{ admin_email }}" style="color:#2e7d32;">{{ admin_email }}</a></td></tr>
</table>
<p style="margin-top:24px;white-space:pre-line;">{{ strings.closing }}</p>
</div>
@@ -46,6 +46,27 @@
{{ strings.emergency_name }}: {{ emergency_name }}
{{ strings.emergency_phone }}: {{ emergency_phone }}
===============================================
{{ strings.contact_section | upper }}
===============================================
{{ strings.contact_intro }}
{% if has_indoor %}
{{ strings.contact_indoor_label }}
{{ strings.contact_name }}: {{ leader_indoor_name }}
{{ strings.contact_phone }}: {{ leader_indoor_phone }}
{{ strings.contact_email }}: {{ leader_indoor_email }}
{% endif %}
{% if has_outdoor %}
{{ strings.contact_outdoor_label }}
{{ strings.contact_name }}: {{ leader_outdoor_name }}
{{ strings.contact_phone }}: {{ leader_outdoor_phone }}
{{ strings.contact_email }}: {{ leader_outdoor_email }}
{% endif %}
{{ strings.contact_admin_label }}
{{ strings.contact_name }}: {{ admin_name }}
{{ strings.contact_phone }}: {{ admin_phone }}
{{ strings.contact_email }}: {{ admin_email }}
-----------------------------------------------
{{ strings.closing }}