Files
orion/scripts/seed/seed_email_templates.py
Samir Boulahtit 27802e47c2
Some checks failed
CI / validate (push) Has been cancelled
CI / dependency-scanning (push) Has been cancelled
CI / docs (push) Has been cancelled
CI / ruff (push) Successful in 10s
CI / deploy (push) Has been cancelled
CI / pytest (push) Has been cancelled
feat(i18n): add missing fr/de/lb translations for 6 email templates
Add 16 missing translations for: subscription_welcome, payment_failed,
subscription_cancelled, trial_ending, team_invite (fr/de/lb each) and
team_invitation (lb). All 11 email templates now have full coverage
across all 4 supported languages.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 23:31:45 +01:00

3115 lines
129 KiB
Python

#!/usr/bin/env python3
"""
Seed default email templates.
Run: python scripts/seed_email_templates.py
"""
import contextlib
import json
import sys
from pathlib import Path
# Add project root to path
sys.path.insert(0, str(Path(__file__).parent.parent))
# Register all models with SQLAlchemy so string-based relationships resolve
for _mod in [
"app.modules.billing.models",
"app.modules.inventory.models",
"app.modules.cart.models",
"app.modules.messaging.models",
"app.modules.loyalty.models",
"app.modules.catalog.models",
"app.modules.customers.models",
"app.modules.orders.models",
"app.modules.marketplace.models",
"app.modules.cms.models",
]:
with contextlib.suppress(ImportError):
__import__(_mod)
from app.core.database import get_db
from app.modules.messaging.models import EmailCategory, EmailTemplate
# =============================================================================
# EMAIL TEMPLATES
# =============================================================================
TEMPLATES = [
# -------------------------------------------------------------------------
# SIGNUP WELCOME
# -------------------------------------------------------------------------
{
"code": "signup_welcome",
"language": "en",
"name": "Signup Welcome",
"description": "Sent to new stores after successful signup",
"category": EmailCategory.AUTH.value,
"variables": json.dumps([
"first_name", "merchant_name", "email", "store_code",
"login_url", "trial_days", "tier_name"
]),
"subject": "Welcome to Orion, {{ first_name }}!",
"body_html": """<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px;">
<div style="background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%); padding: 30px; border-radius: 10px 10px 0 0;">
<h1 style="color: white; margin: 0; font-size: 28px;">Welcome to Orion!</h1>
</div>
<div style="background: #f9fafb; padding: 30px; border-radius: 0 0 10px 10px;">
<p style="font-size: 16px;">Hi {{ first_name }},</p>
<p>Thank you for signing up for Orion! Your account for <strong>{{ merchant_name }}</strong> is now active.</p>
<div style="background: white; border-radius: 8px; padding: 20px; margin: 20px 0; border-left: 4px solid #6366f1;">
<h3 style="margin-top: 0; color: #6366f1;">Your Account Details</h3>
<p style="margin: 5px 0;"><strong>Store Code:</strong> {{ store_code }}</p>
<p style="margin: 5px 0;"><strong>Plan:</strong> {{ tier_name }}</p>
<p style="margin: 5px 0;"><strong>Trial Period:</strong> {{ trial_days }} days free</p>
</div>
<p>You can start managing your orders, inventory, and invoices right away:</p>
<div style="text-align: center; margin: 30px 0;">
<a href="{{ login_url }}" style="background: #6366f1; color: white; padding: 14px 28px; text-decoration: none; border-radius: 8px; font-weight: bold; display: inline-block;">
Go to Dashboard
</a>
</div>
<h3 style="color: #374151;">Getting Started</h3>
<ol style="color: #4b5563;">
<li>Complete your merchant profile</li>
<li>Connect your Letzshop API credentials</li>
<li>Import your products</li>
<li>Start syncing orders!</li>
</ol>
<p style="color: #6b7280; font-size: 14px; margin-top: 30px;">
If you have any questions, just reply to this email or visit our help center.
</p>
<p>Best regards,<br><strong>The Orion Team</strong></p>
</div>
<div style="text-align: center; padding: 20px; color: #9ca3af; font-size: 12px;">
<p>&copy; 2024 Orion. Built for Luxembourg e-commerce.</p>
</div>
</body>
</html>""",
"body_text": """Welcome to Orion!
Hi {{ first_name }},
Thank you for signing up for Orion! Your account for {{ merchant_name }} is now active.
Your Account Details:
- Store Code: {{ store_code }}
- Plan: {{ tier_name }}
- Trial Period: {{ trial_days }} days free
You can start managing your orders, inventory, and invoices right away.
Go to Dashboard: {{ login_url }}
Getting Started:
1. Complete your merchant profile
2. Connect your Letzshop API credentials
3. Import your products
4. Start syncing orders!
If you have any questions, just reply to this email.
Best regards,
The Orion Team
""",
},
{
"code": "signup_welcome",
"language": "fr",
"name": "Bienvenue après inscription",
"description": "Envoyé aux nouveaux vendeurs après inscription",
"category": EmailCategory.AUTH.value,
"variables": json.dumps([
"first_name", "merchant_name", "email", "store_code",
"login_url", "trial_days", "tier_name"
]),
"subject": "Bienvenue sur Orion, {{ first_name }} !",
"body_html": """<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px;">
<div style="background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%); padding: 30px; border-radius: 10px 10px 0 0;">
<h1 style="color: white; margin: 0; font-size: 28px;">Bienvenue sur Orion !</h1>
</div>
<div style="background: #f9fafb; padding: 30px; border-radius: 0 0 10px 10px;">
<p style="font-size: 16px;">Bonjour {{ first_name }},</p>
<p>Merci de vous être inscrit sur Orion ! Votre compte pour <strong>{{ merchant_name }}</strong> est maintenant actif.</p>
<div style="background: white; border-radius: 8px; padding: 20px; margin: 20px 0; border-left: 4px solid #6366f1;">
<h3 style="margin-top: 0; color: #6366f1;">Détails de votre compte</h3>
<p style="margin: 5px 0;"><strong>Code vendeur :</strong> {{ store_code }}</p>
<p style="margin: 5px 0;"><strong>Forfait :</strong> {{ tier_name }}</p>
<p style="margin: 5px 0;"><strong>Période d'essai :</strong> {{ trial_days }} jours gratuits</p>
</div>
<p>Vous pouvez commencer à gérer vos commandes, stocks et factures dès maintenant :</p>
<div style="text-align: center; margin: 30px 0;">
<a href="{{ login_url }}" style="background: #6366f1; color: white; padding: 14px 28px; text-decoration: none; border-radius: 8px; font-weight: bold; display: inline-block;">
Accéder au tableau de bord
</a>
</div>
<h3 style="color: #374151;">Pour commencer</h3>
<ol style="color: #4b5563;">
<li>Complétez votre profil d'entreprise</li>
<li>Connectez vos identifiants API Letzshop</li>
<li>Importez vos produits</li>
<li>Commencez à synchroniser vos commandes !</li>
</ol>
<p style="color: #6b7280; font-size: 14px; margin-top: 30px;">
Si vous avez des questions, répondez simplement à cet email.
</p>
<p>Cordialement,<br><strong>L'équipe Orion</strong></p>
</div>
<div style="text-align: center; padding: 20px; color: #9ca3af; font-size: 12px;">
<p>&copy; 2024 Orion. Conçu pour le e-commerce luxembourgeois.</p>
</div>
</body>
</html>""",
"body_text": """Bienvenue sur Orion !
Bonjour {{ first_name }},
Merci de vous être inscrit sur Orion ! Votre compte pour {{ merchant_name }} est maintenant actif.
Détails de votre compte :
- Code vendeur : {{ store_code }}
- Forfait : {{ tier_name }}
- Période d'essai : {{ trial_days }} jours gratuits
Accéder au tableau de bord : {{ login_url }}
Pour commencer :
1. Complétez votre profil d'entreprise
2. Connectez vos identifiants API Letzshop
3. Importez vos produits
4. Commencez à synchroniser vos commandes !
Cordialement,
L'équipe Orion
""",
},
{
"code": "signup_welcome",
"language": "de",
"name": "Willkommen nach Anmeldung",
"description": "An neue Verkäufer nach erfolgreicher Anmeldung gesendet",
"category": EmailCategory.AUTH.value,
"variables": json.dumps([
"first_name", "merchant_name", "email", "store_code",
"login_url", "trial_days", "tier_name"
]),
"subject": "Willkommen bei Orion, {{ first_name }}!",
"body_html": """<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px;">
<div style="background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%); padding: 30px; border-radius: 10px 10px 0 0;">
<h1 style="color: white; margin: 0; font-size: 28px;">Willkommen bei Orion!</h1>
</div>
<div style="background: #f9fafb; padding: 30px; border-radius: 0 0 10px 10px;">
<p style="font-size: 16px;">Hallo {{ first_name }},</p>
<p>Vielen Dank für Ihre Anmeldung bei Orion! Ihr Konto für <strong>{{ merchant_name }}</strong> ist jetzt aktiv.</p>
<div style="background: white; border-radius: 8px; padding: 20px; margin: 20px 0; border-left: 4px solid #6366f1;">
<h3 style="margin-top: 0; color: #6366f1;">Ihre Kontodaten</h3>
<p style="margin: 5px 0;"><strong>Verkäufercode:</strong> {{ store_code }}</p>
<p style="margin: 5px 0;"><strong>Tarif:</strong> {{ tier_name }}</p>
<p style="margin: 5px 0;"><strong>Testzeitraum:</strong> {{ trial_days }} Tage kostenlos</p>
</div>
<p>Sie können sofort mit der Verwaltung Ihrer Bestellungen, Bestände und Rechnungen beginnen:</p>
<div style="text-align: center; margin: 30px 0;">
<a href="{{ login_url }}" style="background: #6366f1; color: white; padding: 14px 28px; text-decoration: none; border-radius: 8px; font-weight: bold; display: inline-block;">
Zum Dashboard
</a>
</div>
<h3 style="color: #374151;">Erste Schritte</h3>
<ol style="color: #4b5563;">
<li>Vervollständigen Sie Ihr Firmenprofil</li>
<li>Verbinden Sie Ihre Letzshop API-Zugangsdaten</li>
<li>Importieren Sie Ihre Produkte</li>
<li>Starten Sie die Bestellungssynchronisierung!</li>
</ol>
<p style="color: #6b7280; font-size: 14px; margin-top: 30px;">
Bei Fragen antworten Sie einfach auf diese E-Mail.
</p>
<p>Mit freundlichen Grüßen,<br><strong>Das Orion-Team</strong></p>
</div>
<div style="text-align: center; padding: 20px; color: #9ca3af; font-size: 12px;">
<p>&copy; 2024 Orion. Entwickelt für den luxemburgischen E-Commerce.</p>
</div>
</body>
</html>""",
"body_text": """Willkommen bei Orion!
Hallo {{ first_name }},
Vielen Dank für Ihre Anmeldung bei Orion! Ihr Konto für {{ merchant_name }} ist jetzt aktiv.
Ihre Kontodaten:
- Verkäufercode: {{ store_code }}
- Tarif: {{ tier_name }}
- Testzeitraum: {{ trial_days }} Tage kostenlos
Zum Dashboard: {{ login_url }}
Erste Schritte:
1. Vervollständigen Sie Ihr Firmenprofil
2. Verbinden Sie Ihre Letzshop API-Zugangsdaten
3. Importieren Sie Ihre Produkte
4. Starten Sie die Bestellungssynchronisierung!
Mit freundlichen Grüßen,
Das Orion-Team
""",
},
{
"code": "signup_welcome",
"language": "lb",
"name": "Wëllkomm no der Umeldung",
"description": "Un nei Verkeefer no erfollegräicher Umeldung geschéckt",
"category": EmailCategory.AUTH.value,
"variables": json.dumps([
"first_name", "merchant_name", "email", "store_code",
"login_url", "trial_days", "tier_name"
]),
"subject": "Wëllkomm op Orion, {{ first_name }}!",
"body_html": """<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px;">
<div style="background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%); padding: 30px; border-radius: 10px 10px 0 0;">
<h1 style="color: white; margin: 0; font-size: 28px;">Wëllkomm op Orion!</h1>
</div>
<div style="background: #f9fafb; padding: 30px; border-radius: 0 0 10px 10px;">
<p style="font-size: 16px;">Moien {{ first_name }},</p>
<p>Merci fir d'Umeldung op Orion! Äre Kont fir <strong>{{ merchant_name }}</strong> ass elo aktiv.</p>
<div style="background: white; border-radius: 8px; padding: 20px; margin: 20px 0; border-left: 4px solid #6366f1;">
<h3 style="margin-top: 0; color: #6366f1;">Är Kontdetailer</h3>
<p style="margin: 5px 0;"><strong>Verkeefer Code:</strong> {{ store_code }}</p>
<p style="margin: 5px 0;"><strong>Plang:</strong> {{ tier_name }}</p>
<p style="margin: 5px 0;"><strong>Testperiod:</strong> {{ trial_days }} Deeg gratis</p>
</div>
<p>Dir kënnt direkt ufänken Är Bestellungen, Lager a Rechnungen ze verwalten:</p>
<div style="text-align: center; margin: 30px 0;">
<a href="{{ login_url }}" style="background: #6366f1; color: white; padding: 14px 28px; text-decoration: none; border-radius: 8px; font-weight: bold; display: inline-block;">
Zum Dashboard
</a>
</div>
<h3 style="color: #374151;">Fir unzefänken</h3>
<ol style="color: #4b5563;">
<li>Fëllt Äre Firmeprofil aus</li>
<li>Verbindt Är Letzshop API Zougangsdaten</li>
<li>Importéiert Är Produkter</li>
<li>Fänkt un Bestellungen ze synchroniséieren!</li>
</ol>
<p style="color: #6b7280; font-size: 14px; margin-top: 30px;">
Wann Dir Froen hutt, äntwert einfach op dës E-Mail.
</p>
<p>Mat beschte Gréiss,<br><strong>D'Orion Team</strong></p>
</div>
<div style="text-align: center; padding: 20px; color: #9ca3af; font-size: 12px;">
<p>&copy; 2024 Orion. Gemaach fir de lëtzebuergeschen E-Commerce.</p>
</div>
</body>
</html>""",
"body_text": """Wëllkomm op Orion!
Moien {{ first_name }},
Merci fir d'Umeldung op Orion! Äre Kont fir {{ merchant_name }} ass elo aktiv.
Är Kontdetailer:
- Verkeefer Code: {{ store_code }}
- Plang: {{ tier_name }}
- Testperiod: {{ trial_days }} Deeg gratis
Zum Dashboard: {{ login_url }}
Fir unzefänken:
1. Fëllt Äre Firmeprofil aus
2. Verbindt Är Letzshop API Zougangsdaten
3. Importéiert Är Produkter
4. Fänkt un Bestellungen ze synchroniséieren!
Mat beschte Gréiss,
D'Orion Team
""",
},
# -------------------------------------------------------------------------
# ORDER CONFIRMATION
# -------------------------------------------------------------------------
{
"code": "order_confirmation",
"language": "en",
"name": "Order Confirmation",
"description": "Sent to customers after placing an order",
"category": EmailCategory.ORDERS.value,
"variables": json.dumps([
"customer_name", "order_number", "order_total",
"order_items_count", "order_date", "shipping_address"
]),
"subject": "Order Confirmation - {{ order_number }}",
"body_html": """<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px;">
<div style="background: linear-gradient(135deg, #10b981 0%, #059669 100%); padding: 30px; border-radius: 10px 10px 0 0;">
<h1 style="color: white; margin: 0; font-size: 28px;">Order Confirmed!</h1>
</div>
<div style="background: #f9fafb; padding: 30px; border-radius: 0 0 10px 10px;">
<p style="font-size: 16px;">Hi {{ customer_name }},</p>
<p>Thank you for your order! We've received your order and it's being processed.</p>
<div style="background: white; border-radius: 8px; padding: 20px; margin: 20px 0; border-left: 4px solid #10b981;">
<h3 style="margin-top: 0; color: #10b981;">Order Details</h3>
<p style="margin: 5px 0;"><strong>Order Number:</strong> {{ order_number }}</p>
<p style="margin: 5px 0;"><strong>Date:</strong> {{ order_date }}</p>
<p style="margin: 5px 0;"><strong>Items:</strong> {{ order_items_count }}</p>
<p style="margin: 5px 0;"><strong>Total:</strong> {{ order_total }}</p>
</div>
<div style="background: white; border-radius: 8px; padding: 20px; margin: 20px 0;">
<h3 style="margin-top: 0; color: #374151;">Shipping Address</h3>
<p style="margin: 5px 0;">{{ shipping_address }}</p>
</div>
<p>You will receive another email when your order ships.</p>
<p style="color: #6b7280; font-size: 14px; margin-top: 30px;">
If you have any questions about your order, please contact us.
</p>
<p>Thank you for shopping with us!<br><strong>The Team</strong></p>
</div>
<div style="text-align: center; padding: 20px; color: #9ca3af; font-size: 12px;">
<p>This is an automated email. Please do not reply directly.</p>
</div>
</body>
</html>""",
"body_text": """Order Confirmed!
Hi {{ customer_name }},
Thank you for your order! We've received your order and it's being processed.
Order Details:
- Order Number: {{ order_number }}
- Date: {{ order_date }}
- Items: {{ order_items_count }}
- Total: {{ order_total }}
Shipping Address:
{{ shipping_address }}
You will receive another email when your order ships.
Thank you for shopping with us!
""",
},
{
"code": "order_confirmation",
"language": "fr",
"name": "Confirmation de commande",
"description": "Envoyé aux clients après avoir passé une commande",
"category": EmailCategory.ORDERS.value,
"variables": json.dumps([
"customer_name", "order_number", "order_total",
"order_items_count", "order_date", "shipping_address"
]),
"subject": "Confirmation de commande - {{ order_number }}",
"body_html": """<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px;">
<div style="background: linear-gradient(135deg, #10b981 0%, #059669 100%); padding: 30px; border-radius: 10px 10px 0 0;">
<h1 style="color: white; margin: 0; font-size: 28px;">Commande confirmée !</h1>
</div>
<div style="background: #f9fafb; padding: 30px; border-radius: 0 0 10px 10px;">
<p style="font-size: 16px;">Bonjour {{ customer_name }},</p>
<p>Merci pour votre commande ! Nous l'avons bien reçue et elle est en cours de traitement.</p>
<div style="background: white; border-radius: 8px; padding: 20px; margin: 20px 0; border-left: 4px solid #10b981;">
<h3 style="margin-top: 0; color: #10b981;">Détails de la commande</h3>
<p style="margin: 5px 0;"><strong>Numéro de commande :</strong> {{ order_number }}</p>
<p style="margin: 5px 0;"><strong>Date :</strong> {{ order_date }}</p>
<p style="margin: 5px 0;"><strong>Articles :</strong> {{ order_items_count }}</p>
<p style="margin: 5px 0;"><strong>Total :</strong> {{ order_total }}</p>
</div>
<div style="background: white; border-radius: 8px; padding: 20px; margin: 20px 0;">
<h3 style="margin-top: 0; color: #374151;">Adresse de livraison</h3>
<p style="margin: 5px 0;">{{ shipping_address }}</p>
</div>
<p>Vous recevrez un autre email lors de l'expédition de votre commande.</p>
<p style="color: #6b7280; font-size: 14px; margin-top: 30px;">
Si vous avez des questions concernant votre commande, n'hésitez pas à nous contacter.
</p>
<p>Merci pour votre achat !<br><strong>L'équipe</strong></p>
</div>
</body>
</html>""",
"body_text": """Commande confirmée !
Bonjour {{ customer_name }},
Merci pour votre commande ! Nous l'avons bien reçue et elle est en cours de traitement.
Détails de la commande :
- Numéro de commande : {{ order_number }}
- Date : {{ order_date }}
- Articles : {{ order_items_count }}
- Total : {{ order_total }}
Adresse de livraison :
{{ shipping_address }}
Vous recevrez un autre email lors de l'expédition de votre commande.
Merci pour votre achat !
""",
},
{
"code": "order_confirmation",
"language": "de",
"name": "Bestellbestätigung",
"description": "An Kunden nach einer Bestellung gesendet",
"category": EmailCategory.ORDERS.value,
"variables": json.dumps([
"customer_name", "order_number", "order_total",
"order_items_count", "order_date", "shipping_address"
]),
"subject": "Bestellbestätigung - {{ order_number }}",
"body_html": """<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px;">
<div style="background: linear-gradient(135deg, #10b981 0%, #059669 100%); padding: 30px; border-radius: 10px 10px 0 0;">
<h1 style="color: white; margin: 0; font-size: 28px;">Bestellung bestätigt!</h1>
</div>
<div style="background: #f9fafb; padding: 30px; border-radius: 0 0 10px 10px;">
<p style="font-size: 16px;">Hallo {{ customer_name }},</p>
<p>Vielen Dank für Ihre Bestellung! Wir haben Ihre Bestellung erhalten und sie wird bearbeitet.</p>
<div style="background: white; border-radius: 8px; padding: 20px; margin: 20px 0; border-left: 4px solid #10b981;">
<h3 style="margin-top: 0; color: #10b981;">Bestelldetails</h3>
<p style="margin: 5px 0;"><strong>Bestellnummer:</strong> {{ order_number }}</p>
<p style="margin: 5px 0;"><strong>Datum:</strong> {{ order_date }}</p>
<p style="margin: 5px 0;"><strong>Artikel:</strong> {{ order_items_count }}</p>
<p style="margin: 5px 0;"><strong>Summe:</strong> {{ order_total }}</p>
</div>
<div style="background: white; border-radius: 8px; padding: 20px; margin: 20px 0;">
<h3 style="margin-top: 0; color: #374151;">Lieferadresse</h3>
<p style="margin: 5px 0;">{{ shipping_address }}</p>
</div>
<p>Sie erhalten eine weitere E-Mail, sobald Ihre Bestellung versandt wird.</p>
<p style="color: #6b7280; font-size: 14px; margin-top: 30px;">
Bei Fragen zu Ihrer Bestellung kontaktieren Sie uns bitte.
</p>
<p>Vielen Dank für Ihren Einkauf!<br><strong>Das Team</strong></p>
</div>
</body>
</html>""",
"body_text": """Bestellung bestätigt!
Hallo {{ customer_name }},
Vielen Dank für Ihre Bestellung! Wir haben Ihre Bestellung erhalten und sie wird bearbeitet.
Bestelldetails:
- Bestellnummer: {{ order_number }}
- Datum: {{ order_date }}
- Artikel: {{ order_items_count }}
- Summe: {{ order_total }}
Lieferadresse:
{{ shipping_address }}
Sie erhalten eine weitere E-Mail, sobald Ihre Bestellung versandt wird.
Vielen Dank für Ihren Einkauf!
""",
},
{
"code": "order_confirmation",
"language": "lb",
"name": "Bestellung Konfirmatioun",
"description": "Un Clienten no enger Bestellung geschéckt",
"category": EmailCategory.ORDERS.value,
"variables": json.dumps([
"customer_name", "order_number", "order_total",
"order_items_count", "order_date", "shipping_address"
]),
"subject": "Bestellung Konfirmatioun - {{ order_number }}",
"body_html": """<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px;">
<div style="background: linear-gradient(135deg, #10b981 0%, #059669 100%); padding: 30px; border-radius: 10px 10px 0 0;">
<h1 style="color: white; margin: 0; font-size: 28px;">Bestellung confirméiert!</h1>
</div>
<div style="background: #f9fafb; padding: 30px; border-radius: 0 0 10px 10px;">
<p style="font-size: 16px;">Moien {{ customer_name }},</p>
<p>Merci fir Är Bestellung! Mir hunn Är Bestellung kritt an si gëtt beaarbecht.</p>
<div style="background: white; border-radius: 8px; padding: 20px; margin: 20px 0; border-left: 4px solid #10b981;">
<h3 style="margin-top: 0; color: #10b981;">Bestelldetailer</h3>
<p style="margin: 5px 0;"><strong>Bestellnummer:</strong> {{ order_number }}</p>
<p style="margin: 5px 0;"><strong>Datum:</strong> {{ order_date }}</p>
<p style="margin: 5px 0;"><strong>Artikelen:</strong> {{ order_items_count }}</p>
<p style="margin: 5px 0;"><strong>Total:</strong> {{ order_total }}</p>
</div>
<div style="background: white; border-radius: 8px; padding: 20px; margin: 20px 0;">
<h3 style="margin-top: 0; color: #374151;">Liwweradress</h3>
<p style="margin: 5px 0;">{{ shipping_address }}</p>
</div>
<p>Dir kritt eng weider E-Mail wann Är Bestellung verschéckt gëtt.</p>
<p style="color: #6b7280; font-size: 14px; margin-top: 30px;">
Wann Dir Froen iwwer Är Bestellung hutt, kontaktéiert eis w.e.g.
</p>
<p>Merci fir Ären Akaf!<br><strong>D'Team</strong></p>
</div>
</body>
</html>""",
"body_text": """Bestellung confirméiert!
Moien {{ customer_name }},
Merci fir Är Bestellung! Mir hunn Är Bestellung kritt an si gëtt beaarbecht.
Bestelldetailer:
- Bestellnummer: {{ order_number }}
- Datum: {{ order_date }}
- Artikelen: {{ order_items_count }}
- Total: {{ order_total }}
Liwweradress:
{{ shipping_address }}
Dir kritt eng weider E-Mail wann Är Bestellung verschéckt gëtt.
Merci fir Ären Akaf!
""",
},
# -------------------------------------------------------------------------
# PASSWORD RESET
# -------------------------------------------------------------------------
{
"code": "password_reset",
"language": "en",
"name": "Password Reset",
"description": "Sent to customers when they request a password reset",
"category": EmailCategory.AUTH.value,
"variables": json.dumps([
"customer_name", "reset_link", "expiry_hours"
]),
"subject": "Reset Your Password",
"body_html": """<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px;">
<div style="background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%); padding: 30px; border-radius: 10px 10px 0 0;">
<h1 style="color: white; margin: 0; font-size: 28px;">Reset Your Password</h1>
</div>
<div style="background: #f9fafb; padding: 30px; border-radius: 0 0 10px 10px;">
<p style="font-size: 16px;">Hi {{ customer_name }},</p>
<p>We received a request to reset your password. Click the button below to create a new password:</p>
<div style="text-align: center; margin: 30px 0;">
<a href="{{ reset_link }}" style="background: #6366f1; color: white; padding: 14px 28px; text-decoration: none; border-radius: 8px; font-weight: bold; display: inline-block;">
Reset Password
</a>
</div>
<p style="color: #6b7280; font-size: 14px;">
This link will expire in {{ expiry_hours }} hour(s). If you didn't request this password reset, you can safely ignore this email.
</p>
<p style="color: #6b7280; font-size: 14px; margin-top: 20px;">
If the button doesn't work, copy and paste this link into your browser:<br>
<a href="{{ reset_link }}" style="color: #6366f1; word-break: break-all;">{{ reset_link }}</a>
</p>
<p style="margin-top: 30px;">Best regards,<br><strong>The Team</strong></p>
</div>
<div style="text-align: center; padding: 20px; color: #9ca3af; font-size: 12px;">
<p>This is an automated email. Please do not reply directly.</p>
</div>
</body>
</html>""",
"body_text": """Reset Your Password
Hi {{ customer_name }},
We received a request to reset your password. Click the link below to create a new password:
{{ reset_link }}
This link will expire in {{ expiry_hours }} hour(s). If you didn't request this password reset, you can safely ignore this email.
Best regards,
The Team
""",
},
{
"code": "password_reset",
"language": "fr",
"name": "Reinitialisation du mot de passe",
"description": "Envoye aux clients lorsqu'ils demandent une reinitialisation de mot de passe",
"category": EmailCategory.AUTH.value,
"variables": json.dumps([
"customer_name", "reset_link", "expiry_hours"
]),
"subject": "Reinitialiser votre mot de passe",
"body_html": """<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px;">
<div style="background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%); padding: 30px; border-radius: 10px 10px 0 0;">
<h1 style="color: white; margin: 0; font-size: 28px;">Reinitialiser votre mot de passe</h1>
</div>
<div style="background: #f9fafb; padding: 30px; border-radius: 0 0 10px 10px;">
<p style="font-size: 16px;">Bonjour {{ customer_name }},</p>
<p>Nous avons recu une demande de reinitialisation de votre mot de passe. Cliquez sur le bouton ci-dessous pour creer un nouveau mot de passe :</p>
<div style="text-align: center; margin: 30px 0;">
<a href="{{ reset_link }}" style="background: #6366f1; color: white; padding: 14px 28px; text-decoration: none; border-radius: 8px; font-weight: bold; display: inline-block;">
Reinitialiser le mot de passe
</a>
</div>
<p style="color: #6b7280; font-size: 14px;">
Ce lien expirera dans {{ expiry_hours }} heure(s). Si vous n'avez pas demande cette reinitialisation, vous pouvez ignorer cet email.
</p>
<p style="color: #6b7280; font-size: 14px; margin-top: 20px;">
Si le bouton ne fonctionne pas, copiez et collez ce lien dans votre navigateur :<br>
<a href="{{ reset_link }}" style="color: #6366f1; word-break: break-all;">{{ reset_link }}</a>
</p>
<p style="margin-top: 30px;">Cordialement,<br><strong>L'equipe</strong></p>
</div>
</body>
</html>""",
"body_text": """Reinitialiser votre mot de passe
Bonjour {{ customer_name }},
Nous avons recu une demande de reinitialisation de votre mot de passe. Cliquez sur le lien ci-dessous pour creer un nouveau mot de passe :
{{ reset_link }}
Ce lien expirera dans {{ expiry_hours }} heure(s). Si vous n'avez pas demande cette reinitialisation, vous pouvez ignorer cet email.
Cordialement,
L'equipe
""",
},
{
"code": "password_reset",
"language": "de",
"name": "Passwort zurucksetzen",
"description": "An Kunden gesendet, wenn sie eine Passwortzurucksetzung anfordern",
"category": EmailCategory.AUTH.value,
"variables": json.dumps([
"customer_name", "reset_link", "expiry_hours"
]),
"subject": "Passwort zurucksetzen",
"body_html": """<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px;">
<div style="background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%); padding: 30px; border-radius: 10px 10px 0 0;">
<h1 style="color: white; margin: 0; font-size: 28px;">Passwort zurucksetzen</h1>
</div>
<div style="background: #f9fafb; padding: 30px; border-radius: 0 0 10px 10px;">
<p style="font-size: 16px;">Hallo {{ customer_name }},</p>
<p>Wir haben eine Anfrage zur Zurucksetzung Ihres Passworts erhalten. Klicken Sie auf die Schaltflache unten, um ein neues Passwort zu erstellen:</p>
<div style="text-align: center; margin: 30px 0;">
<a href="{{ reset_link }}" style="background: #6366f1; color: white; padding: 14px 28px; text-decoration: none; border-radius: 8px; font-weight: bold; display: inline-block;">
Passwort zurucksetzen
</a>
</div>
<p style="color: #6b7280; font-size: 14px;">
Dieser Link lauft in {{ expiry_hours }} Stunde(n) ab. Wenn Sie diese Passwortzurucksetzung nicht angefordert haben, konnen Sie diese E-Mail ignorieren.
</p>
<p style="color: #6b7280; font-size: 14px; margin-top: 20px;">
Wenn die Schaltflache nicht funktioniert, kopieren Sie diesen Link in Ihren Browser:<br>
<a href="{{ reset_link }}" style="color: #6366f1; word-break: break-all;">{{ reset_link }}</a>
</p>
<p style="margin-top: 30px;">Mit freundlichen Grussen,<br><strong>Das Team</strong></p>
</div>
</body>
</html>""",
"body_text": """Passwort zurucksetzen
Hallo {{ customer_name }},
Wir haben eine Anfrage zur Zurucksetzung Ihres Passworts erhalten. Klicken Sie auf den Link unten, um ein neues Passwort zu erstellen:
{{ reset_link }}
Dieser Link lauft in {{ expiry_hours }} Stunde(n) ab. Wenn Sie diese Passwortzurucksetzung nicht angefordert haben, konnen Sie diese E-Mail ignorieren.
Mit freundlichen Grussen,
Das Team
""",
},
{
"code": "password_reset",
"language": "lb",
"name": "Passwuert zrecksetzen",
"description": "Un Clienten gescheckt wann si eng Passwuertzrecksetzung ufroen",
"category": EmailCategory.AUTH.value,
"variables": json.dumps([
"customer_name", "reset_link", "expiry_hours"
]),
"subject": "Passwuert zrecksetzen",
"body_html": """<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px;">
<div style="background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%); padding: 30px; border-radius: 10px 10px 0 0;">
<h1 style="color: white; margin: 0; font-size: 28px;">Passwuert zrecksetzen</h1>
</div>
<div style="background: #f9fafb; padding: 30px; border-radius: 0 0 10px 10px;">
<p style="font-size: 16px;">Moien {{ customer_name }},</p>
<p>Mir hunn eng Ufro kritt fir Aert Passwuert zreckzesetzen. Klickt op de Knäppchen hei drënner fir en neit Passwuert ze kreéieren:</p>
<div style="text-align: center; margin: 30px 0;">
<a href="{{ reset_link }}" style="background: #6366f1; color: white; padding: 14px 28px; text-decoration: none; border-radius: 8px; font-weight: bold; display: inline-block;">
Passwuert zrecksetzen
</a>
</div>
<p style="color: #6b7280; font-size: 14px;">
Dëse Link leeft an {{ expiry_hours }} Stonn(en) of. Wann Dir dës Passwuertzrecksetzung net ugefrot hutt, kënnt Dir dës E-Mail ignoréieren.
</p>
<p style="color: #6b7280; font-size: 14px; margin-top: 20px;">
Wann de Knäppchen net fonctionnéiert, kopéiert dëse Link an Äre Browser:<br>
<a href="{{ reset_link }}" style="color: #6366f1; word-break: break-all;">{{ reset_link }}</a>
</p>
<p style="margin-top: 30px;">Mat beschte Gréiss,<br><strong>D'Team</strong></p>
</div>
</body>
</html>""",
"body_text": """Passwuert zrecksetzen
Moien {{ customer_name }},
Mir hunn eng Ufro kritt fir Aert Passwuert zreckzesetzen. Klickt op de Link hei drënner fir en neit Passwuert ze kreéieren:
{{ reset_link }}
Dëse Link leeft an {{ expiry_hours }} Stonn(en) of. Wann Dir dës Passwuertzrecksetzung net ugefrot hutt, kënnt Dir dës E-Mail ignoréieren.
Mat beschte Gréiss,
D'Team
""",
},
# -------------------------------------------------------------------------
# PLATFORM-ONLY BILLING TEMPLATES
# -------------------------------------------------------------------------
{
"code": "subscription_welcome",
"language": "en",
"name": "Subscription Welcome",
"description": "Sent to stores when they subscribe to a paid plan",
"category": EmailCategory.BILLING.value,
"is_platform_only": True,
"required_variables": json.dumps(["store_name", "tier_name", "billing_cycle", "amount"]),
"variables": json.dumps([
"store_name", "tier_name", "billing_cycle", "amount",
"next_billing_date", "dashboard_url"
]),
"subject": "Welcome to {{ tier_name }} - Subscription Confirmed",
"body_html": """<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px;">
<div style="background: linear-gradient(135deg, #10b981 0%, #059669 100%); padding: 30px; border-radius: 10px 10px 0 0;">
<h1 style="color: white; margin: 0; font-size: 28px;">Subscription Confirmed!</h1>
</div>
<div style="background: #f9fafb; padding: 30px; border-radius: 0 0 10px 10px;">
<p style="font-size: 16px;">Hi {{ store_name }},</p>
<p>Thank you for subscribing to Orion! Your {{ tier_name }} subscription is now active.</p>
<div style="background: white; border-radius: 8px; padding: 20px; margin: 20px 0; border-left: 4px solid #10b981;">
<h3 style="margin-top: 0; color: #10b981;">Subscription Details</h3>
<p style="margin: 5px 0;"><strong>Plan:</strong> {{ tier_name }}</p>
<p style="margin: 5px 0;"><strong>Billing Cycle:</strong> {{ billing_cycle }}</p>
<p style="margin: 5px 0;"><strong>Amount:</strong> {{ amount }}</p>
<p style="margin: 5px 0;"><strong>Next Billing Date:</strong> {{ next_billing_date }}</p>
</div>
<div style="text-align: center; margin: 30px 0;">
<a href="{{ dashboard_url }}" style="background: #10b981; color: white; padding: 14px 28px; text-decoration: none; border-radius: 8px; font-weight: bold; display: inline-block;">
Go to Dashboard
</a>
</div>
<p style="color: #6b7280; font-size: 14px; margin-top: 30px;">
If you have any questions about your subscription, please contact our support team.
</p>
<p>Best regards,<br><strong>The Orion Team</strong></p>
</div>
<div style="text-align: center; padding: 20px; color: #9ca3af; font-size: 12px;">
<p>&copy; 2024 Orion. All rights reserved.</p>
</div>
</body>
</html>""",
"body_text": """Subscription Confirmed!
Hi {{ store_name }},
Thank you for subscribing to Orion! Your {{ tier_name }} subscription is now active.
Subscription Details:
- Plan: {{ tier_name }}
- Billing Cycle: {{ billing_cycle }}
- Amount: {{ amount }}
- Next Billing Date: {{ next_billing_date }}
Go to Dashboard: {{ dashboard_url }}
If you have any questions about your subscription, please contact our support team.
Best regards,
The Orion Team
""",
},
{
"code": "subscription_welcome",
"language": "fr",
"name": "Bienvenue - Abonnement",
"description": "Envoyé aux boutiques lors de la souscription à un plan payant",
"category": EmailCategory.BILLING.value,
"is_platform_only": True,
"required_variables": json.dumps(["store_name", "tier_name", "billing_cycle", "amount"]),
"variables": json.dumps([
"store_name", "tier_name", "billing_cycle", "amount",
"next_billing_date", "dashboard_url"
]),
"subject": "Bienvenue sur {{ tier_name }} - Abonnement confirmé",
"body_html": """<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px;">
<div style="background: linear-gradient(135deg, #10b981 0%, #059669 100%); padding: 30px; border-radius: 10px 10px 0 0;">
<h1 style="color: white; margin: 0; font-size: 28px;">Abonnement confirmé !</h1>
</div>
<div style="background: #f9fafb; padding: 30px; border-radius: 0 0 10px 10px;">
<p style="font-size: 16px;">Bonjour {{ store_name }},</p>
<p>Merci de vous être abonné à Orion ! Votre abonnement {{ tier_name }} est maintenant actif.</p>
<div style="background: white; border-radius: 8px; padding: 20px; margin: 20px 0; border-left: 4px solid #10b981;">
<h3 style="margin-top: 0; color: #10b981;">Détails de l'abonnement</h3>
<p style="margin: 5px 0;"><strong>Plan :</strong> {{ tier_name }}</p>
<p style="margin: 5px 0;"><strong>Cycle de facturation :</strong> {{ billing_cycle }}</p>
<p style="margin: 5px 0;"><strong>Montant :</strong> {{ amount }}</p>
<p style="margin: 5px 0;"><strong>Prochaine facturation :</strong> {{ next_billing_date }}</p>
</div>
<div style="text-align: center; margin: 30px 0;">
<a href="{{ dashboard_url }}" style="background: #10b981; color: white; padding: 14px 28px; text-decoration: none; border-radius: 8px; font-weight: bold; display: inline-block;">
Accéder au tableau de bord
</a>
</div>
<p style="color: #6b7280; font-size: 14px; margin-top: 30px;">
Si vous avez des questions concernant votre abonnement, veuillez contacter notre équipe de support.
</p>
<p>Cordialement,<br><strong>L'équipe Orion</strong></p>
</div>
<div style="text-align: center; padding: 20px; color: #9ca3af; font-size: 12px;">
<p>&copy; 2024 Orion. Tous droits réservés.</p>
</div>
</body>
</html>""",
"body_text": """Abonnement confirmé !
Bonjour {{ store_name }},
Merci de vous être abonné à Orion ! Votre abonnement {{ tier_name }} est maintenant actif.
Détails de l'abonnement :
- Plan : {{ tier_name }}
- Cycle de facturation : {{ billing_cycle }}
- Montant : {{ amount }}
- Prochaine facturation : {{ next_billing_date }}
Accéder au tableau de bord : {{ dashboard_url }}
Si vous avez des questions concernant votre abonnement, veuillez contacter notre équipe de support.
Cordialement,
L'équipe Orion
""",
},
{
"code": "subscription_welcome",
"language": "de",
"name": "Willkommen - Abonnement",
"description": "Wird an Shops gesendet, wenn sie ein kostenpflichtiges Abo abschließen",
"category": EmailCategory.BILLING.value,
"is_platform_only": True,
"required_variables": json.dumps(["store_name", "tier_name", "billing_cycle", "amount"]),
"variables": json.dumps([
"store_name", "tier_name", "billing_cycle", "amount",
"next_billing_date", "dashboard_url"
]),
"subject": "Willkommen bei {{ tier_name }} - Abonnement bestätigt",
"body_html": """<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px;">
<div style="background: linear-gradient(135deg, #10b981 0%, #059669 100%); padding: 30px; border-radius: 10px 10px 0 0;">
<h1 style="color: white; margin: 0; font-size: 28px;">Abonnement bestätigt!</h1>
</div>
<div style="background: #f9fafb; padding: 30px; border-radius: 0 0 10px 10px;">
<p style="font-size: 16px;">Hallo {{ store_name }},</p>
<p>Vielen Dank für Ihr Abonnement bei Orion! Ihr {{ tier_name }}-Abonnement ist jetzt aktiv.</p>
<div style="background: white; border-radius: 8px; padding: 20px; margin: 20px 0; border-left: 4px solid #10b981;">
<h3 style="margin-top: 0; color: #10b981;">Abonnement-Details</h3>
<p style="margin: 5px 0;"><strong>Plan:</strong> {{ tier_name }}</p>
<p style="margin: 5px 0;"><strong>Abrechnungszyklus:</strong> {{ billing_cycle }}</p>
<p style="margin: 5px 0;"><strong>Betrag:</strong> {{ amount }}</p>
<p style="margin: 5px 0;"><strong>Nächste Abrechnung:</strong> {{ next_billing_date }}</p>
</div>
<div style="text-align: center; margin: 30px 0;">
<a href="{{ dashboard_url }}" style="background: #10b981; color: white; padding: 14px 28px; text-decoration: none; border-radius: 8px; font-weight: bold; display: inline-block;">
Zum Dashboard
</a>
</div>
<p style="color: #6b7280; font-size: 14px; margin-top: 30px;">
Bei Fragen zu Ihrem Abonnement wenden Sie sich bitte an unser Support-Team.
</p>
<p>Mit freundlichen Grüßen,<br><strong>Das Orion-Team</strong></p>
</div>
<div style="text-align: center; padding: 20px; color: #9ca3af; font-size: 12px;">
<p>&copy; 2024 Orion. Alle Rechte vorbehalten.</p>
</div>
</body>
</html>""",
"body_text": """Abonnement bestätigt!
Hallo {{ store_name }},
Vielen Dank für Ihr Abonnement bei Orion! Ihr {{ tier_name }}-Abonnement ist jetzt aktiv.
Abonnement-Details:
- Plan: {{ tier_name }}
- Abrechnungszyklus: {{ billing_cycle }}
- Betrag: {{ amount }}
- Nächste Abrechnung: {{ next_billing_date }}
Zum Dashboard: {{ dashboard_url }}
Bei Fragen zu Ihrem Abonnement wenden Sie sich bitte an unser Support-Team.
Mit freundlichen Grüßen,
Das Orion-Team
""",
},
{
"code": "subscription_welcome",
"language": "lb",
"name": "Wëllkomm - Abonnement",
"description": "Gëtt u Butteker geschéckt wann se en bezuelte Plang ofschléissen",
"category": EmailCategory.BILLING.value,
"is_platform_only": True,
"required_variables": json.dumps(["store_name", "tier_name", "billing_cycle", "amount"]),
"variables": json.dumps([
"store_name", "tier_name", "billing_cycle", "amount",
"next_billing_date", "dashboard_url"
]),
"subject": "Wëllkomm bei {{ tier_name }} - Abonnement bestätegt",
"body_html": """<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px;">
<div style="background: linear-gradient(135deg, #10b981 0%, #059669 100%); padding: 30px; border-radius: 10px 10px 0 0;">
<h1 style="color: white; margin: 0; font-size: 28px;">Abonnement bestätegt!</h1>
</div>
<div style="background: #f9fafb; padding: 30px; border-radius: 0 0 10px 10px;">
<p style="font-size: 16px;">Moien {{ store_name }},</p>
<p>Merci fir Äert Abonnement bei Orion! Äert {{ tier_name }}-Abonnement ass elo aktiv.</p>
<div style="background: white; border-radius: 8px; padding: 20px; margin: 20px 0; border-left: 4px solid #10b981;">
<h3 style="margin-top: 0; color: #10b981;">Abonnement-Detailer</h3>
<p style="margin: 5px 0;"><strong>Plang:</strong> {{ tier_name }}</p>
<p style="margin: 5px 0;"><strong>Ofrechnungszyklus:</strong> {{ billing_cycle }}</p>
<p style="margin: 5px 0;"><strong>Betrag:</strong> {{ amount }}</p>
<p style="margin: 5px 0;"><strong>Nächst Ofrechnung:</strong> {{ next_billing_date }}</p>
</div>
<div style="text-align: center; margin: 30px 0;">
<a href="{{ dashboard_url }}" style="background: #10b981; color: white; padding: 14px 28px; text-decoration: none; border-radius: 8px; font-weight: bold; display: inline-block;">
Zum Dashboard
</a>
</div>
<p style="color: #6b7280; font-size: 14px; margin-top: 30px;">
Wann Dir Froen zu Äerem Abonnement hutt, kontaktéiert w.e.g. eist Support-Team.
</p>
<p>Mat frëndleche Gréiss,<br><strong>D'Orion-Equipe</strong></p>
</div>
<div style="text-align: center; padding: 20px; color: #9ca3af; font-size: 12px;">
<p>&copy; 2024 Orion. All Rechter virbehalen.</p>
</div>
</body>
</html>""",
"body_text": """Abonnement bestätegt!
Moien {{ store_name }},
Merci fir Äert Abonnement bei Orion! Äert {{ tier_name }}-Abonnement ass elo aktiv.
Abonnement-Detailer:
- Plang: {{ tier_name }}
- Ofrechnungszyklus: {{ billing_cycle }}
- Betrag: {{ amount }}
- Nächst Ofrechnung: {{ next_billing_date }}
Zum Dashboard: {{ dashboard_url }}
Wann Dir Froen zu Äerem Abonnement hutt, kontaktéiert w.e.g. eist Support-Team.
Mat frëndleche Gréiss,
D'Orion-Equipe
""",
},
{
"code": "payment_failed",
"language": "en",
"name": "Payment Failed",
"description": "Sent when a subscription payment fails",
"category": EmailCategory.BILLING.value,
"is_platform_only": True,
"required_variables": json.dumps(["store_name", "tier_name", "amount"]),
"variables": json.dumps([
"store_name", "tier_name", "amount", "retry_date",
"update_payment_url", "support_email"
]),
"subject": "Action Required: Payment Failed for Your Subscription",
"body_html": """<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px;">
<div style="background: linear-gradient(135deg, #ef4444 0%, #dc2626 100%); padding: 30px; border-radius: 10px 10px 0 0;">
<h1 style="color: white; margin: 0; font-size: 28px;">Payment Failed</h1>
</div>
<div style="background: #f9fafb; padding: 30px; border-radius: 0 0 10px 10px;">
<p style="font-size: 16px;">Hi {{ store_name }},</p>
<p>We were unable to process your payment of <strong>{{ amount }}</strong> for your {{ tier_name }} subscription.</p>
<div style="background: #fef2f2; border-radius: 8px; padding: 20px; margin: 20px 0; border-left: 4px solid #ef4444;">
<h3 style="margin-top: 0; color: #dc2626;">What happens next?</h3>
<p style="margin: 5px 0;">We'll automatically retry the payment on {{ retry_date }}.</p>
<p style="margin: 5px 0;">To avoid any service interruption, please update your payment method.</p>
</div>
<div style="text-align: center; margin: 30px 0;">
<a href="{{ update_payment_url }}" style="background: #ef4444; color: white; padding: 14px 28px; text-decoration: none; border-radius: 8px; font-weight: bold; display: inline-block;">
Update Payment Method
</a>
</div>
<p style="color: #6b7280; font-size: 14px; margin-top: 30px;">
If you need assistance, please contact us at {{ support_email }}.
</p>
<p>Best regards,<br><strong>The Orion Team</strong></p>
</div>
</body>
</html>""",
"body_text": """Payment Failed
Hi {{ store_name }},
We were unable to process your payment of {{ amount }} for your {{ tier_name }} subscription.
What happens next?
- We'll automatically retry the payment on {{ retry_date }}.
- To avoid any service interruption, please update your payment method.
Update Payment Method: {{ update_payment_url }}
If you need assistance, please contact us at {{ support_email }}.
Best regards,
The Orion Team
""",
},
{
"code": "payment_failed",
"language": "fr",
"name": "Échec de paiement",
"description": "Envoyé lorsqu'un paiement d'abonnement échoue",
"category": EmailCategory.BILLING.value,
"is_platform_only": True,
"required_variables": json.dumps(["store_name", "tier_name", "amount"]),
"variables": json.dumps([
"store_name", "tier_name", "amount", "retry_date",
"update_payment_url", "support_email"
]),
"subject": "Action requise : Échec du paiement de votre abonnement",
"body_html": """<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px;">
<div style="background: linear-gradient(135deg, #ef4444 0%, #dc2626 100%); padding: 30px; border-radius: 10px 10px 0 0;">
<h1 style="color: white; margin: 0; font-size: 28px;">Échec de paiement</h1>
</div>
<div style="background: #f9fafb; padding: 30px; border-radius: 0 0 10px 10px;">
<p style="font-size: 16px;">Bonjour {{ store_name }},</p>
<p>Nous n'avons pas pu traiter votre paiement de <strong>{{ amount }}</strong> pour votre abonnement {{ tier_name }}.</p>
<div style="background: #fef2f2; border-radius: 8px; padding: 20px; margin: 20px 0; border-left: 4px solid #ef4444;">
<h3 style="margin-top: 0; color: #dc2626;">Que se passe-t-il ensuite ?</h3>
<p style="margin: 5px 0;">Nous réessaierons automatiquement le paiement le {{ retry_date }}.</p>
<p style="margin: 5px 0;">Pour éviter toute interruption de service, veuillez mettre à jour votre moyen de paiement.</p>
</div>
<div style="text-align: center; margin: 30px 0;">
<a href="{{ update_payment_url }}" style="background: #ef4444; color: white; padding: 14px 28px; text-decoration: none; border-radius: 8px; font-weight: bold; display: inline-block;">
Mettre à jour le moyen de paiement
</a>
</div>
<p style="color: #6b7280; font-size: 14px; margin-top: 30px;">
Si vous avez besoin d'aide, contactez-nous à {{ support_email }}.
</p>
<p>Cordialement,<br><strong>L'équipe Orion</strong></p>
</div>
</body>
</html>""",
"body_text": """Échec de paiement
Bonjour {{ store_name }},
Nous n'avons pas pu traiter votre paiement de {{ amount }} pour votre abonnement {{ tier_name }}.
Que se passe-t-il ensuite ?
- Nous réessaierons automatiquement le paiement le {{ retry_date }}.
- Pour éviter toute interruption de service, veuillez mettre à jour votre moyen de paiement.
Mettre à jour le moyen de paiement : {{ update_payment_url }}
Si vous avez besoin d'aide, contactez-nous à {{ support_email }}.
Cordialement,
L'équipe Orion
""",
},
{
"code": "payment_failed",
"language": "de",
"name": "Zahlung fehlgeschlagen",
"description": "Wird gesendet, wenn eine Abonnementzahlung fehlschlägt",
"category": EmailCategory.BILLING.value,
"is_platform_only": True,
"required_variables": json.dumps(["store_name", "tier_name", "amount"]),
"variables": json.dumps([
"store_name", "tier_name", "amount", "retry_date",
"update_payment_url", "support_email"
]),
"subject": "Handlungsbedarf: Zahlung für Ihr Abonnement fehlgeschlagen",
"body_html": """<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px;">
<div style="background: linear-gradient(135deg, #ef4444 0%, #dc2626 100%); padding: 30px; border-radius: 10px 10px 0 0;">
<h1 style="color: white; margin: 0; font-size: 28px;">Zahlung fehlgeschlagen</h1>
</div>
<div style="background: #f9fafb; padding: 30px; border-radius: 0 0 10px 10px;">
<p style="font-size: 16px;">Hallo {{ store_name }},</p>
<p>Wir konnten Ihre Zahlung von <strong>{{ amount }}</strong> für Ihr {{ tier_name }}-Abonnement nicht verarbeiten.</p>
<div style="background: #fef2f2; border-radius: 8px; padding: 20px; margin: 20px 0; border-left: 4px solid #ef4444;">
<h3 style="margin-top: 0; color: #dc2626;">Was passiert als Nächstes?</h3>
<p style="margin: 5px 0;">Wir werden die Zahlung am {{ retry_date }} automatisch erneut versuchen.</p>
<p style="margin: 5px 0;">Um eine Unterbrechung des Dienstes zu vermeiden, aktualisieren Sie bitte Ihre Zahlungsmethode.</p>
</div>
<div style="text-align: center; margin: 30px 0;">
<a href="{{ update_payment_url }}" style="background: #ef4444; color: white; padding: 14px 28px; text-decoration: none; border-radius: 8px; font-weight: bold; display: inline-block;">
Zahlungsmethode aktualisieren
</a>
</div>
<p style="color: #6b7280; font-size: 14px; margin-top: 30px;">
Wenn Sie Hilfe benötigen, kontaktieren Sie uns unter {{ support_email }}.
</p>
<p>Mit freundlichen Grüßen,<br><strong>Das Orion-Team</strong></p>
</div>
</body>
</html>""",
"body_text": """Zahlung fehlgeschlagen
Hallo {{ store_name }},
Wir konnten Ihre Zahlung von {{ amount }} für Ihr {{ tier_name }}-Abonnement nicht verarbeiten.
Was passiert als Nächstes?
- Wir werden die Zahlung am {{ retry_date }} automatisch erneut versuchen.
- Um eine Unterbrechung des Dienstes zu vermeiden, aktualisieren Sie bitte Ihre Zahlungsmethode.
Zahlungsmethode aktualisieren: {{ update_payment_url }}
Wenn Sie Hilfe benötigen, kontaktieren Sie uns unter {{ support_email }}.
Mit freundlichen Grüßen,
Das Orion-Team
""",
},
{
"code": "payment_failed",
"language": "lb",
"name": "Bezuelung fehlgeschloen",
"description": "Gëtt geschéckt wann eng Abonnement-Bezuelung fehlschléit",
"category": EmailCategory.BILLING.value,
"is_platform_only": True,
"required_variables": json.dumps(["store_name", "tier_name", "amount"]),
"variables": json.dumps([
"store_name", "tier_name", "amount", "retry_date",
"update_payment_url", "support_email"
]),
"subject": "Handlungsbedarf: Bezuelung fir Äert Abonnement fehlgeschloen",
"body_html": """<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px;">
<div style="background: linear-gradient(135deg, #ef4444 0%, #dc2626 100%); padding: 30px; border-radius: 10px 10px 0 0;">
<h1 style="color: white; margin: 0; font-size: 28px;">Bezuelung fehlgeschloen</h1>
</div>
<div style="background: #f9fafb; padding: 30px; border-radius: 0 0 10px 10px;">
<p style="font-size: 16px;">Moien {{ store_name }},</p>
<p>Mir konnten Är Bezuelung vun <strong>{{ amount }}</strong> fir Äert {{ tier_name }}-Abonnement net veraarbechten.</p>
<div style="background: #fef2f2; border-radius: 8px; padding: 20px; margin: 20px 0; border-left: 4px solid #ef4444;">
<h3 style="margin-top: 0; color: #dc2626;">Wat geschitt als Nächst?</h3>
<p style="margin: 5px 0;">Mir probéieren d'Bezuelung den {{ retry_date }} automatesch nach eng Kéier.</p>
<p style="margin: 5px 0;">Fir eng Ënnerbriechung vum Service ze vermeiden, aktualiséiert w.e.g. Är Bezuelmethod.</p>
</div>
<div style="text-align: center; margin: 30px 0;">
<a href="{{ update_payment_url }}" style="background: #ef4444; color: white; padding: 14px 28px; text-decoration: none; border-radius: 8px; font-weight: bold; display: inline-block;">
Bezuelmethod aktualiséieren
</a>
</div>
<p style="color: #6b7280; font-size: 14px; margin-top: 30px;">
Wann Dir Hëllef braucht, kontaktéiert eis op {{ support_email }}.
</p>
<p>Mat frëndleche Gréiss,<br><strong>D'Orion-Equipe</strong></p>
</div>
</body>
</html>""",
"body_text": """Bezuelung fehlgeschloen
Moien {{ store_name }},
Mir konnten Är Bezuelung vun {{ amount }} fir Äert {{ tier_name }}-Abonnement net veraarbechten.
Wat geschitt als Nächst?
- Mir probéieren d'Bezuelung den {{ retry_date }} automatesch nach eng Kéier.
- Fir eng Ënnerbriechung vum Service ze vermeiden, aktualiséiert w.e.g. Är Bezuelmethod.
Bezuelmethod aktualiséieren: {{ update_payment_url }}
Wann Dir Hëllef braucht, kontaktéiert eis op {{ support_email }}.
Mat frëndleche Gréiss,
D'Orion-Equipe
""",
},
{
"code": "subscription_cancelled",
"language": "en",
"name": "Subscription Cancelled",
"description": "Sent when a subscription is cancelled",
"category": EmailCategory.BILLING.value,
"is_platform_only": True,
"required_variables": json.dumps(["store_name", "tier_name"]),
"variables": json.dumps([
"store_name", "tier_name", "end_date", "reactivate_url"
]),
"subject": "Your Orion Subscription Has Been Cancelled",
"body_html": """<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px;">
<div style="background: linear-gradient(135deg, #6b7280 0%, #4b5563 100%); padding: 30px; border-radius: 10px 10px 0 0;">
<h1 style="color: white; margin: 0; font-size: 28px;">Subscription Cancelled</h1>
</div>
<div style="background: #f9fafb; padding: 30px; border-radius: 0 0 10px 10px;">
<p style="font-size: 16px;">Hi {{ store_name }},</p>
<p>Your {{ tier_name }} subscription has been cancelled as requested.</p>
<div style="background: white; border-radius: 8px; padding: 20px; margin: 20px 0; border-left: 4px solid #6b7280;">
<h3 style="margin-top: 0; color: #4b5563;">What happens now?</h3>
<p style="margin: 5px 0;">You'll continue to have access to your {{ tier_name }} features until <strong>{{ end_date }}</strong>.</p>
<p style="margin: 5px 0;">After that date, your account will be downgraded to the Free tier.</p>
</div>
<p>Changed your mind? You can reactivate your subscription at any time:</p>
<div style="text-align: center; margin: 30px 0;">
<a href="{{ reactivate_url }}" style="background: #6366f1; color: white; padding: 14px 28px; text-decoration: none; border-radius: 8px; font-weight: bold; display: inline-block;">
Reactivate Subscription
</a>
</div>
<p style="color: #6b7280; font-size: 14px; margin-top: 30px;">
We're sorry to see you go. If there's anything we could have done better, please let us know.
</p>
<p>Best regards,<br><strong>The Orion Team</strong></p>
</div>
</body>
</html>""",
"body_text": """Subscription Cancelled
Hi {{ store_name }},
Your {{ tier_name }} subscription has been cancelled as requested.
What happens now?
- You'll continue to have access to your {{ tier_name }} features until {{ end_date }}.
- After that date, your account will be downgraded to the Free tier.
Changed your mind? You can reactivate your subscription at any time:
{{ reactivate_url }}
We're sorry to see you go. If there's anything we could have done better, please let us know.
Best regards,
The Orion Team
""",
},
{
"code": "subscription_cancelled",
"language": "fr",
"name": "Abonnement annulé",
"description": "Envoyé lorsqu'un abonnement est annulé",
"category": EmailCategory.BILLING.value,
"is_platform_only": True,
"required_variables": json.dumps(["store_name", "tier_name"]),
"variables": json.dumps([
"store_name", "tier_name", "end_date", "reactivate_url"
]),
"subject": "Votre abonnement Orion a été annulé",
"body_html": """<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px;">
<div style="background: linear-gradient(135deg, #6b7280 0%, #4b5563 100%); padding: 30px; border-radius: 10px 10px 0 0;">
<h1 style="color: white; margin: 0; font-size: 28px;">Abonnement annulé</h1>
</div>
<div style="background: #f9fafb; padding: 30px; border-radius: 0 0 10px 10px;">
<p style="font-size: 16px;">Bonjour {{ store_name }},</p>
<p>Votre abonnement {{ tier_name }} a été annulé comme demandé.</p>
<div style="background: white; border-radius: 8px; padding: 20px; margin: 20px 0; border-left: 4px solid #6b7280;">
<h3 style="margin-top: 0; color: #4b5563;">Que se passe-t-il maintenant ?</h3>
<p style="margin: 5px 0;">Vous continuerez à avoir accès aux fonctionnalités {{ tier_name }} jusqu'au <strong>{{ end_date }}</strong>.</p>
<p style="margin: 5px 0;">Après cette date, votre compte sera rétrogradé au niveau Gratuit.</p>
</div>
<p>Vous avez changé d'avis ? Vous pouvez réactiver votre abonnement à tout moment :</p>
<div style="text-align: center; margin: 30px 0;">
<a href="{{ reactivate_url }}" style="background: #6366f1; color: white; padding: 14px 28px; text-decoration: none; border-radius: 8px; font-weight: bold; display: inline-block;">
Réactiver l'abonnement
</a>
</div>
<p style="color: #6b7280; font-size: 14px; margin-top: 30px;">
Nous sommes désolés de vous voir partir. Si nous pouvions faire mieux, n'hésitez pas à nous le dire.
</p>
<p>Cordialement,<br><strong>L'équipe Orion</strong></p>
</div>
</body>
</html>""",
"body_text": """Abonnement annulé
Bonjour {{ store_name }},
Votre abonnement {{ tier_name }} a été annulé comme demandé.
Que se passe-t-il maintenant ?
- Vous continuerez à avoir accès aux fonctionnalités {{ tier_name }} jusqu'au {{ end_date }}.
- Après cette date, votre compte sera rétrogradé au niveau Gratuit.
Vous avez changé d'avis ? Vous pouvez réactiver votre abonnement à tout moment :
{{ reactivate_url }}
Nous sommes désolés de vous voir partir. Si nous pouvions faire mieux, n'hésitez pas à nous le dire.
Cordialement,
L'équipe Orion
""",
},
{
"code": "subscription_cancelled",
"language": "de",
"name": "Abonnement gekündigt",
"description": "Wird gesendet, wenn ein Abonnement gekündigt wird",
"category": EmailCategory.BILLING.value,
"is_platform_only": True,
"required_variables": json.dumps(["store_name", "tier_name"]),
"variables": json.dumps([
"store_name", "tier_name", "end_date", "reactivate_url"
]),
"subject": "Ihr Orion-Abonnement wurde gekündigt",
"body_html": """<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px;">
<div style="background: linear-gradient(135deg, #6b7280 0%, #4b5563 100%); padding: 30px; border-radius: 10px 10px 0 0;">
<h1 style="color: white; margin: 0; font-size: 28px;">Abonnement gekündigt</h1>
</div>
<div style="background: #f9fafb; padding: 30px; border-radius: 0 0 10px 10px;">
<p style="font-size: 16px;">Hallo {{ store_name }},</p>
<p>Ihr {{ tier_name }}-Abonnement wurde wie gewünscht gekündigt.</p>
<div style="background: white; border-radius: 8px; padding: 20px; margin: 20px 0; border-left: 4px solid #6b7280;">
<h3 style="margin-top: 0; color: #4b5563;">Was passiert jetzt?</h3>
<p style="margin: 5px 0;">Sie haben weiterhin Zugang zu den {{ tier_name }}-Funktionen bis zum <strong>{{ end_date }}</strong>.</p>
<p style="margin: 5px 0;">Nach diesem Datum wird Ihr Konto auf die kostenlose Stufe herabgestuft.</p>
</div>
<p>Haben Sie es sich anders überlegt? Sie können Ihr Abonnement jederzeit reaktivieren:</p>
<div style="text-align: center; margin: 30px 0;">
<a href="{{ reactivate_url }}" style="background: #6366f1; color: white; padding: 14px 28px; text-decoration: none; border-radius: 8px; font-weight: bold; display: inline-block;">
Abonnement reaktivieren
</a>
</div>
<p style="color: #6b7280; font-size: 14px; margin-top: 30px;">
Es tut uns leid, Sie gehen zu sehen. Wenn wir etwas besser machen könnten, lassen Sie es uns bitte wissen.
</p>
<p>Mit freundlichen Grüßen,<br><strong>Das Orion-Team</strong></p>
</div>
</body>
</html>""",
"body_text": """Abonnement gekündigt
Hallo {{ store_name }},
Ihr {{ tier_name }}-Abonnement wurde wie gewünscht gekündigt.
Was passiert jetzt?
- Sie haben weiterhin Zugang zu den {{ tier_name }}-Funktionen bis zum {{ end_date }}.
- Nach diesem Datum wird Ihr Konto auf die kostenlose Stufe herabgestuft.
Haben Sie es sich anders überlegt? Sie können Ihr Abonnement jederzeit reaktivieren:
{{ reactivate_url }}
Es tut uns leid, Sie gehen zu sehen. Wenn wir etwas besser machen könnten, lassen Sie es uns bitte wissen.
Mit freundlichen Grüßen,
Das Orion-Team
""",
},
{
"code": "subscription_cancelled",
"language": "lb",
"name": "Abonnement gekënnegt",
"description": "Gëtt geschéckt wann en Abonnement gekënnegt gëtt",
"category": EmailCategory.BILLING.value,
"is_platform_only": True,
"required_variables": json.dumps(["store_name", "tier_name"]),
"variables": json.dumps([
"store_name", "tier_name", "end_date", "reactivate_url"
]),
"subject": "Äert Orion-Abonnement gouf gekënnegt",
"body_html": """<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px;">
<div style="background: linear-gradient(135deg, #6b7280 0%, #4b5563 100%); padding: 30px; border-radius: 10px 10px 0 0;">
<h1 style="color: white; margin: 0; font-size: 28px;">Abonnement gekënnegt</h1>
</div>
<div style="background: #f9fafb; padding: 30px; border-radius: 0 0 10px 10px;">
<p style="font-size: 16px;">Moien {{ store_name }},</p>
<p>Äert {{ tier_name }}-Abonnement gouf wéi gewënscht gekënnegt.</p>
<div style="background: white; border-radius: 8px; padding: 20px; margin: 20px 0; border-left: 4px solid #6b7280;">
<h3 style="margin-top: 0; color: #4b5563;">Wat geschitt elo?</h3>
<p style="margin: 5px 0;">Dir hutt weiderhin Zougang zu den {{ tier_name }}-Funktiounen bis den <strong>{{ end_date }}</strong>.</p>
<p style="margin: 5px 0;">No deem Datum gëtt Äre Kont op de gratis Plang erofgesat.</p>
</div>
<p>Hutt Dir Iech anescht iwwerluecht? Dir kënnt Äert Abonnement zu all Moment reaktivéieren:</p>
<div style="text-align: center; margin: 30px 0;">
<a href="{{ reactivate_url }}" style="background: #6366f1; color: white; padding: 14px 28px; text-decoration: none; border-radius: 8px; font-weight: bold; display: inline-block;">
Abonnement reaktivéieren
</a>
</div>
<p style="color: #6b7280; font-size: 14px; margin-top: 30px;">
Et deet eis leed Iech goen ze gesinn. Wann mir eppes besser kéinte maachen, sot eis w.e.g. Bescheed.
</p>
<p>Mat frëndleche Gréiss,<br><strong>D'Orion-Equipe</strong></p>
</div>
</body>
</html>""",
"body_text": """Abonnement gekënnegt
Moien {{ store_name }},
Äert {{ tier_name }}-Abonnement gouf wéi gewënscht gekënnegt.
Wat geschitt elo?
- Dir hutt weiderhin Zougang zu den {{ tier_name }}-Funktiounen bis den {{ end_date }}.
- No deem Datum gëtt Äre Kont op de gratis Plang erofgesat.
Hutt Dir Iech anescht iwwerluecht? Dir kënnt Äert Abonnement zu all Moment reaktivéieren:
{{ reactivate_url }}
Et deet eis leed Iech goen ze gesinn. Wann mir eppes besser kéinte maachen, sot eis w.e.g. Bescheed.
Mat frëndleche Gréiss,
D'Orion-Equipe
""",
},
{
"code": "trial_ending",
"language": "en",
"name": "Trial Ending Soon",
"description": "Sent when a trial is about to end",
"category": EmailCategory.BILLING.value,
"is_platform_only": True,
"required_variables": json.dumps(["store_name", "days_remaining"]),
"variables": json.dumps([
"store_name", "tier_name", "days_remaining", "trial_end_date",
"upgrade_url", "features_list"
]),
"subject": "Your Trial Ends in {{ days_remaining }} Days",
"body_html": """<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px;">
<div style="background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%); padding: 30px; border-radius: 10px 10px 0 0;">
<h1 style="color: white; margin: 0; font-size: 28px;">Your Trial is Ending Soon</h1>
</div>
<div style="background: #f9fafb; padding: 30px; border-radius: 0 0 10px 10px;">
<p style="font-size: 16px;">Hi {{ store_name }},</p>
<p>Your {{ tier_name }} trial ends in <strong>{{ days_remaining }} days</strong> ({{ trial_end_date }}).</p>
<div style="background: #fffbeb; border-radius: 8px; padding: 20px; margin: 20px 0; border-left: 4px solid #f59e0b;">
<h3 style="margin-top: 0; color: #d97706;">Don't lose these features:</h3>
<p style="margin: 5px 0;">{{ features_list }}</p>
</div>
<p>Subscribe now to continue using all {{ tier_name }} features without interruption:</p>
<div style="text-align: center; margin: 30px 0;">
<a href="{{ upgrade_url }}" style="background: #f59e0b; color: white; padding: 14px 28px; text-decoration: none; border-radius: 8px; font-weight: bold; display: inline-block;">
Subscribe Now
</a>
</div>
<p style="color: #6b7280; font-size: 14px; margin-top: 30px;">
Have questions? Reply to this email and we'll help you choose the right plan.
</p>
<p>Best regards,<br><strong>The Orion Team</strong></p>
</div>
</body>
</html>""",
"body_text": """Your Trial is Ending Soon
Hi {{ store_name }},
Your {{ tier_name }} trial ends in {{ days_remaining }} days ({{ trial_end_date }}).
Don't lose these features:
{{ features_list }}
Subscribe now to continue using all {{ tier_name }} features without interruption:
{{ upgrade_url }}
Have questions? Reply to this email and we'll help you choose the right plan.
Best regards,
The Orion Team
""",
},
{
"code": "trial_ending",
"language": "fr",
"name": "Fin de période d'essai",
"description": "Envoyé lorsqu'une période d'essai est sur le point de se terminer",
"category": EmailCategory.BILLING.value,
"is_platform_only": True,
"required_variables": json.dumps(["store_name", "days_remaining"]),
"variables": json.dumps([
"store_name", "tier_name", "days_remaining", "trial_end_date",
"upgrade_url", "features_list"
]),
"subject": "Votre essai se termine dans {{ days_remaining }} jours",
"body_html": """<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px;">
<div style="background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%); padding: 30px; border-radius: 10px 10px 0 0;">
<h1 style="color: white; margin: 0; font-size: 28px;">Votre essai se termine bientôt</h1>
</div>
<div style="background: #f9fafb; padding: 30px; border-radius: 0 0 10px 10px;">
<p style="font-size: 16px;">Bonjour {{ store_name }},</p>
<p>Votre essai {{ tier_name }} se termine dans <strong>{{ days_remaining }} jours</strong> ({{ trial_end_date }}).</p>
<div style="background: #fffbeb; border-radius: 8px; padding: 20px; margin: 20px 0; border-left: 4px solid #f59e0b;">
<h3 style="margin-top: 0; color: #d97706;">Ne perdez pas ces fonctionnalités :</h3>
<p style="margin: 5px 0;">{{ features_list }}</p>
</div>
<p>Abonnez-vous maintenant pour continuer à utiliser toutes les fonctionnalités {{ tier_name }} sans interruption :</p>
<div style="text-align: center; margin: 30px 0;">
<a href="{{ upgrade_url }}" style="background: #f59e0b; color: white; padding: 14px 28px; text-decoration: none; border-radius: 8px; font-weight: bold; display: inline-block;">
S'abonner maintenant
</a>
</div>
<p style="color: #6b7280; font-size: 14px; margin-top: 30px;">
Des questions ? Répondez à cet email et nous vous aiderons à choisir le bon plan.
</p>
<p>Cordialement,<br><strong>L'équipe Orion</strong></p>
</div>
</body>
</html>""",
"body_text": """Votre essai se termine bientôt
Bonjour {{ store_name }},
Votre essai {{ tier_name }} se termine dans {{ days_remaining }} jours ({{ trial_end_date }}).
Ne perdez pas ces fonctionnalités :
{{ features_list }}
Abonnez-vous maintenant pour continuer à utiliser toutes les fonctionnalités {{ tier_name }} sans interruption :
{{ upgrade_url }}
Des questions ? Répondez à cet email et nous vous aiderons à choisir le bon plan.
Cordialement,
L'équipe Orion
""",
},
{
"code": "trial_ending",
"language": "de",
"name": "Testphase endet bald",
"description": "Wird gesendet, wenn eine Testphase bald endet",
"category": EmailCategory.BILLING.value,
"is_platform_only": True,
"required_variables": json.dumps(["store_name", "days_remaining"]),
"variables": json.dumps([
"store_name", "tier_name", "days_remaining", "trial_end_date",
"upgrade_url", "features_list"
]),
"subject": "Ihre Testphase endet in {{ days_remaining }} Tagen",
"body_html": """<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px;">
<div style="background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%); padding: 30px; border-radius: 10px 10px 0 0;">
<h1 style="color: white; margin: 0; font-size: 28px;">Ihre Testphase endet bald</h1>
</div>
<div style="background: #f9fafb; padding: 30px; border-radius: 0 0 10px 10px;">
<p style="font-size: 16px;">Hallo {{ store_name }},</p>
<p>Ihre {{ tier_name }}-Testphase endet in <strong>{{ days_remaining }} Tagen</strong> ({{ trial_end_date }}).</p>
<div style="background: #fffbeb; border-radius: 8px; padding: 20px; margin: 20px 0; border-left: 4px solid #f59e0b;">
<h3 style="margin-top: 0; color: #d97706;">Verlieren Sie diese Funktionen nicht:</h3>
<p style="margin: 5px 0;">{{ features_list }}</p>
</div>
<p>Abonnieren Sie jetzt, um alle {{ tier_name }}-Funktionen ohne Unterbrechung weiter zu nutzen:</p>
<div style="text-align: center; margin: 30px 0;">
<a href="{{ upgrade_url }}" style="background: #f59e0b; color: white; padding: 14px 28px; text-decoration: none; border-radius: 8px; font-weight: bold; display: inline-block;">
Jetzt abonnieren
</a>
</div>
<p style="color: #6b7280; font-size: 14px; margin-top: 30px;">
Haben Sie Fragen? Antworten Sie auf diese E-Mail und wir helfen Ihnen, den richtigen Plan zu wählen.
</p>
<p>Mit freundlichen Grüßen,<br><strong>Das Orion-Team</strong></p>
</div>
</body>
</html>""",
"body_text": """Ihre Testphase endet bald
Hallo {{ store_name }},
Ihre {{ tier_name }}-Testphase endet in {{ days_remaining }} Tagen ({{ trial_end_date }}).
Verlieren Sie diese Funktionen nicht:
{{ features_list }}
Abonnieren Sie jetzt, um alle {{ tier_name }}-Funktionen ohne Unterbrechung weiter zu nutzen:
{{ upgrade_url }}
Haben Sie Fragen? Antworten Sie auf diese E-Mail und wir helfen Ihnen, den richtigen Plan zu wählen.
Mit freundlichen Grüßen,
Das Orion-Team
""",
},
{
"code": "trial_ending",
"language": "lb",
"name": "Testphas endet geschwënn",
"description": "Gëtt geschéckt wann eng Testphas geschwënn ofleeft",
"category": EmailCategory.BILLING.value,
"is_platform_only": True,
"required_variables": json.dumps(["store_name", "days_remaining"]),
"variables": json.dumps([
"store_name", "tier_name", "days_remaining", "trial_end_date",
"upgrade_url", "features_list"
]),
"subject": "Är Testphas leeft a(n) {{ days_remaining }} Deeg of",
"body_html": """<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px;">
<div style="background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%); padding: 30px; border-radius: 10px 10px 0 0;">
<h1 style="color: white; margin: 0; font-size: 28px;">Är Testphas endet geschwënn</h1>
</div>
<div style="background: #f9fafb; padding: 30px; border-radius: 0 0 10px 10px;">
<p style="font-size: 16px;">Moien {{ store_name }},</p>
<p>Är {{ tier_name }}-Testphas leeft a(n) <strong>{{ days_remaining }} Deeg</strong> of ({{ trial_end_date }}).</p>
<div style="background: #fffbeb; border-radius: 8px; padding: 20px; margin: 20px 0; border-left: 4px solid #f59e0b;">
<h3 style="margin-top: 0; color: #d97706;">Verléiert dës Funktiounen net:</h3>
<p style="margin: 5px 0;">{{ features_list }}</p>
</div>
<p>Abonnéiert Iech elo fir all {{ tier_name }}-Funktiounen ouni Ënnerbriechung weider ze notzen:</p>
<div style="text-align: center; margin: 30px 0;">
<a href="{{ upgrade_url }}" style="background: #f59e0b; color: white; padding: 14px 28px; text-decoration: none; border-radius: 8px; font-weight: bold; display: inline-block;">
Elo abonnéieren
</a>
</div>
<p style="color: #6b7280; font-size: 14px; margin-top: 30px;">
Hutt Dir Froen? Äntwert op dës E-Mail a mir hëllefen Iech de richtege Plang ze wielen.
</p>
<p>Mat frëndleche Gréiss,<br><strong>D'Orion-Equipe</strong></p>
</div>
</body>
</html>""",
"body_text": """Är Testphas endet geschwënn
Moien {{ store_name }},
Är {{ tier_name }}-Testphas leeft a(n) {{ days_remaining }} Deeg of ({{ trial_end_date }}).
Verléiert dës Funktiounen net:
{{ features_list }}
Abonnéiert Iech elo fir all {{ tier_name }}-Funktiounen ouni Ënnerbriechung weider ze notzen:
{{ upgrade_url }}
Hutt Dir Froen? Äntwert op dës E-Mail a mir hëllefen Iech de richtege Plang ze wielen.
Mat frëndleche Gréiss,
D'Orion-Equipe
""",
},
{
"code": "team_invite",
"language": "en",
"name": "Team Member Invitation",
"description": "Sent when a store invites a team member",
"category": EmailCategory.SYSTEM.value,
"is_platform_only": False,
"required_variables": json.dumps(["invitee_name", "inviter_name", "store_name", "accept_url"]),
"variables": json.dumps([
"invitee_name", "inviter_name", "store_name", "role",
"accept_url", "expires_in_days"
]),
"subject": "{{ inviter_name }} invited you to join {{ store_name }} on Orion",
"body_html": """<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px;">
<div style="background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%); padding: 30px; border-radius: 10px 10px 0 0;">
<h1 style="color: white; margin: 0; font-size: 28px;">You've Been Invited!</h1>
</div>
<div style="background: #f9fafb; padding: 30px; border-radius: 0 0 10px 10px;">
<p style="font-size: 16px;">Hi {{ invitee_name }},</p>
<p><strong>{{ inviter_name }}</strong> has invited you to join <strong>{{ store_name }}</strong> as a team member on Orion.</p>
<div style="background: white; border-radius: 8px; padding: 20px; margin: 20px 0; border-left: 4px solid #6366f1;">
<h3 style="margin-top: 0; color: #6366f1;">Invitation Details</h3>
<p style="margin: 5px 0;"><strong>Store:</strong> {{ store_name }}</p>
<p style="margin: 5px 0;"><strong>Role:</strong> {{ role }}</p>
<p style="margin: 5px 0;"><strong>Invited by:</strong> {{ inviter_name }}</p>
</div>
<div style="text-align: center; margin: 30px 0;">
<a href="{{ accept_url }}" style="background: #6366f1; color: white; padding: 14px 28px; text-decoration: none; border-radius: 8px; font-weight: bold; display: inline-block;">
Accept Invitation
</a>
</div>
<p style="color: #6b7280; font-size: 14px;">
This invitation will expire in {{ expires_in_days }} days.
</p>
<p style="color: #6b7280; font-size: 14px; margin-top: 20px;">
If you weren't expecting this invitation, you can safely ignore this email.
</p>
<p>Best regards,<br><strong>The Orion Team</strong></p>
</div>
</body>
</html>""",
"body_text": """You've Been Invited!
Hi {{ invitee_name }},
{{ inviter_name }} has invited you to join {{ store_name }} as a team member on Orion.
Invitation Details:
- Store: {{ store_name }}
- Role: {{ role }}
- Invited by: {{ inviter_name }}
Accept Invitation: {{ accept_url }}
This invitation will expire in {{ expires_in_days }} days.
If you weren't expecting this invitation, you can safely ignore this email.
Best regards,
The Orion Team
""",
},
{
"code": "team_invite",
"language": "fr",
"name": "Invitation d'équipe",
"description": "Envoyé lorsqu'une boutique invite un membre de l'équipe",
"category": EmailCategory.SYSTEM.value,
"is_platform_only": False,
"required_variables": json.dumps(["invitee_name", "inviter_name", "store_name", "accept_url"]),
"variables": json.dumps([
"invitee_name", "inviter_name", "store_name", "role",
"accept_url", "expires_in_days"
]),
"subject": "{{ inviter_name }} vous invite à rejoindre {{ store_name }} sur Orion",
"body_html": """<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px;">
<div style="background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%); padding: 30px; border-radius: 10px 10px 0 0;">
<h1 style="color: white; margin: 0; font-size: 28px;">Vous êtes invité(e) !</h1>
</div>
<div style="background: #f9fafb; padding: 30px; border-radius: 0 0 10px 10px;">
<p style="font-size: 16px;">Bonjour {{ invitee_name }},</p>
<p><strong>{{ inviter_name }}</strong> vous a invité(e) à rejoindre <strong>{{ store_name }}</strong> en tant que membre de l'équipe sur Orion.</p>
<div style="background: white; border-radius: 8px; padding: 20px; margin: 20px 0; border-left: 4px solid #6366f1;">
<h3 style="margin-top: 0; color: #6366f1;">Détails de l'invitation</h3>
<p style="margin: 5px 0;"><strong>Boutique :</strong> {{ store_name }}</p>
<p style="margin: 5px 0;"><strong>Rôle :</strong> {{ role }}</p>
<p style="margin: 5px 0;"><strong>Invité par :</strong> {{ inviter_name }}</p>
</div>
<div style="text-align: center; margin: 30px 0;">
<a href="{{ accept_url }}" style="background: #6366f1; color: white; padding: 14px 28px; text-decoration: none; border-radius: 8px; font-weight: bold; display: inline-block;">
Accepter l'invitation
</a>
</div>
<p style="color: #6b7280; font-size: 14px;">
Cette invitation expire dans {{ expires_in_days }} jours.
</p>
<p style="color: #6b7280; font-size: 14px; margin-top: 20px;">
Si vous n'attendiez pas cette invitation, vous pouvez ignorer cet email.
</p>
<p>Cordialement,<br><strong>L'équipe Orion</strong></p>
</div>
</body>
</html>""",
"body_text": """Vous êtes invité(e) !
Bonjour {{ invitee_name }},
{{ inviter_name }} vous a invité(e) à rejoindre {{ store_name }} en tant que membre de l'équipe sur Orion.
Détails de l'invitation :
- Boutique : {{ store_name }}
- Rôle : {{ role }}
- Invité par : {{ inviter_name }}
Accepter l'invitation : {{ accept_url }}
Cette invitation expire dans {{ expires_in_days }} jours.
Si vous n'attendiez pas cette invitation, vous pouvez ignorer cet email.
Cordialement,
L'équipe Orion
""",
},
{
"code": "team_invite",
"language": "de",
"name": "Team-Einladung",
"description": "Wird gesendet, wenn ein Shop ein Teammitglied einlädt",
"category": EmailCategory.SYSTEM.value,
"is_platform_only": False,
"required_variables": json.dumps(["invitee_name", "inviter_name", "store_name", "accept_url"]),
"variables": json.dumps([
"invitee_name", "inviter_name", "store_name", "role",
"accept_url", "expires_in_days"
]),
"subject": "{{ inviter_name }} hat Sie eingeladen, {{ store_name }} auf Orion beizutreten",
"body_html": """<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px;">
<div style="background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%); padding: 30px; border-radius: 10px 10px 0 0;">
<h1 style="color: white; margin: 0; font-size: 28px;">Sie wurden eingeladen!</h1>
</div>
<div style="background: #f9fafb; padding: 30px; border-radius: 0 0 10px 10px;">
<p style="font-size: 16px;">Hallo {{ invitee_name }},</p>
<p><strong>{{ inviter_name }}</strong> hat Sie eingeladen, <strong>{{ store_name }}</strong> als Teammitglied auf Orion beizutreten.</p>
<div style="background: white; border-radius: 8px; padding: 20px; margin: 20px 0; border-left: 4px solid #6366f1;">
<h3 style="margin-top: 0; color: #6366f1;">Einladungsdetails</h3>
<p style="margin: 5px 0;"><strong>Shop:</strong> {{ store_name }}</p>
<p style="margin: 5px 0;"><strong>Rolle:</strong> {{ role }}</p>
<p style="margin: 5px 0;"><strong>Eingeladen von:</strong> {{ inviter_name }}</p>
</div>
<div style="text-align: center; margin: 30px 0;">
<a href="{{ accept_url }}" style="background: #6366f1; color: white; padding: 14px 28px; text-decoration: none; border-radius: 8px; font-weight: bold; display: inline-block;">
Einladung annehmen
</a>
</div>
<p style="color: #6b7280; font-size: 14px;">
Diese Einladung läuft in {{ expires_in_days }} Tagen ab.
</p>
<p style="color: #6b7280; font-size: 14px; margin-top: 20px;">
Wenn Sie diese Einladung nicht erwartet haben, können Sie diese E-Mail ignorieren.
</p>
<p>Mit freundlichen Grüßen,<br><strong>Das Orion-Team</strong></p>
</div>
</body>
</html>""",
"body_text": """Sie wurden eingeladen!
Hallo {{ invitee_name }},
{{ inviter_name }} hat Sie eingeladen, {{ store_name }} als Teammitglied auf Orion beizutreten.
Einladungsdetails:
- Shop: {{ store_name }}
- Rolle: {{ role }}
- Eingeladen von: {{ inviter_name }}
Einladung annehmen: {{ accept_url }}
Diese Einladung läuft in {{ expires_in_days }} Tagen ab.
Wenn Sie diese Einladung nicht erwartet haben, können Sie diese E-Mail ignorieren.
Mit freundlichen Grüßen,
Das Orion-Team
""",
},
{
"code": "team_invite",
"language": "lb",
"name": "Team-Invitatioun",
"description": "Gëtt geschéckt wann e Buttek en Teammember invitéiert",
"category": EmailCategory.SYSTEM.value,
"is_platform_only": False,
"required_variables": json.dumps(["invitee_name", "inviter_name", "store_name", "accept_url"]),
"variables": json.dumps([
"invitee_name", "inviter_name", "store_name", "role",
"accept_url", "expires_in_days"
]),
"subject": "{{ inviter_name }} huet Iech invitéiert, {{ store_name }} op Orion bäizetrieden",
"body_html": """<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px;">
<div style="background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%); padding: 30px; border-radius: 10px 10px 0 0;">
<h1 style="color: white; margin: 0; font-size: 28px;">Dir sidd invitéiert!</h1>
</div>
<div style="background: #f9fafb; padding: 30px; border-radius: 0 0 10px 10px;">
<p style="font-size: 16px;">Moien {{ invitee_name }},</p>
<p><strong>{{ inviter_name }}</strong> huet Iech invitéiert, <strong>{{ store_name }}</strong> als Teammember op Orion bäizetrieden.</p>
<div style="background: white; border-radius: 8px; padding: 20px; margin: 20px 0; border-left: 4px solid #6366f1;">
<h3 style="margin-top: 0; color: #6366f1;">Invitatiounsdetailer</h3>
<p style="margin: 5px 0;"><strong>Buttek:</strong> {{ store_name }}</p>
<p style="margin: 5px 0;"><strong>Roll:</strong> {{ role }}</p>
<p style="margin: 5px 0;"><strong>Invitéiert vun:</strong> {{ inviter_name }}</p>
</div>
<div style="text-align: center; margin: 30px 0;">
<a href="{{ accept_url }}" style="background: #6366f1; color: white; padding: 14px 28px; text-decoration: none; border-radius: 8px; font-weight: bold; display: inline-block;">
Invitatioun unhuelen
</a>
</div>
<p style="color: #6b7280; font-size: 14px;">
Dës Invitatioun leeft a(n) {{ expires_in_days }} Deeg of.
</p>
<p style="color: #6b7280; font-size: 14px; margin-top: 20px;">
Wann Dir dës Invitatioun net erwaart hutt, kënnt Dir dës E-Mail ignoréieren.
</p>
<p>Mat frëndleche Gréiss,<br><strong>D'Orion-Equipe</strong></p>
</div>
</body>
</html>""",
"body_text": """Dir sidd invitéiert!
Moien {{ invitee_name }},
{{ inviter_name }} huet Iech invitéiert, {{ store_name }} als Teammember op Orion bäizetrieden.
Invitatiounsdetailer:
- Buttek: {{ store_name }}
- Roll: {{ role }}
- Invitéiert vun: {{ inviter_name }}
Invitatioun unhuelen: {{ accept_url }}
Dës Invitatioun leeft a(n) {{ expires_in_days }} Deeg of.
Wann Dir dës Invitatioun net erwaart hutt, kënnt Dir dës E-Mail ignoréieren.
Mat frëndleche Gréiss,
D'Orion-Equipe
""",
},
# -------------------------------------------------------------------------
# EMAIL VERIFICATION
# -------------------------------------------------------------------------
{
"code": "email_verification",
"language": "en",
"name": "Email Verification",
"description": "Sent to users to verify their email address",
"category": EmailCategory.AUTH.value,
"is_platform_only": False,
"variables": json.dumps([
"first_name", "verification_link", "expiry_hours", "platform_name"
]),
"subject": "Verify Your Email Address",
"body_html": """<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px;">
<div style="background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%); padding: 30px; border-radius: 10px 10px 0 0;">
<h1 style="color: white; margin: 0; font-size: 28px;">Verify Your Email</h1>
</div>
<div style="background: #f9fafb; padding: 30px; border-radius: 0 0 10px 10px;">
<p style="font-size: 16px;">Hi {{ first_name }},</p>
<p>Please verify your email address by clicking the button below:</p>
<div style="text-align: center; margin: 30px 0;">
<a href="{{ verification_link }}" style="background: #6366f1; color: white; padding: 14px 28px; text-decoration: none; border-radius: 8px; font-weight: bold; display: inline-block;">
Verify Email
</a>
</div>
<p style="color: #6b7280; font-size: 14px;">
This link will expire in {{ expiry_hours }} hours. If you didn't create an account, you can safely ignore this email.
</p>
<p style="color: #6b7280; font-size: 14px; margin-top: 20px;">
If the button doesn't work, copy and paste this link into your browser:<br>
<a href="{{ verification_link }}" style="color: #6366f1; word-break: break-all;">{{ verification_link }}</a>
</p>
<p style="margin-top: 30px;">Best regards,<br><strong>The {{ platform_name }} Team</strong></p>
</div>
<div style="text-align: center; padding: 20px; color: #9ca3af; font-size: 12px;">
<p>This is an automated email. Please do not reply directly.</p>
</div>
</body>
</html>""",
"body_text": """Verify Your Email
Hi {{ first_name }},
Please verify your email address by clicking the link below:
{{ verification_link }}
This link will expire in {{ expiry_hours }} hours. If you didn't create an account, you can safely ignore this email.
Best regards,
The {{ platform_name }} Team
""",
},
{
"code": "email_verification",
"language": "fr",
"name": "Verification d'email",
"description": "Envoye aux utilisateurs pour verifier leur adresse email",
"category": EmailCategory.AUTH.value,
"is_platform_only": False,
"variables": json.dumps([
"first_name", "verification_link", "expiry_hours", "platform_name"
]),
"subject": "Verifiez votre adresse email",
"body_html": """<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px;">
<div style="background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%); padding: 30px; border-radius: 10px 10px 0 0;">
<h1 style="color: white; margin: 0; font-size: 28px;">Verifiez votre email</h1>
</div>
<div style="background: #f9fafb; padding: 30px; border-radius: 0 0 10px 10px;">
<p style="font-size: 16px;">Bonjour {{ first_name }},</p>
<p>Veuillez verifier votre adresse email en cliquant sur le bouton ci-dessous :</p>
<div style="text-align: center; margin: 30px 0;">
<a href="{{ verification_link }}" style="background: #6366f1; color: white; padding: 14px 28px; text-decoration: none; border-radius: 8px; font-weight: bold; display: inline-block;">
Verifier l'email
</a>
</div>
<p style="color: #6b7280; font-size: 14px;">
Ce lien expirera dans {{ expiry_hours }} heures. Si vous n'avez pas cree de compte, vous pouvez ignorer cet email.
</p>
<p style="color: #6b7280; font-size: 14px; margin-top: 20px;">
Si le bouton ne fonctionne pas, copiez et collez ce lien dans votre navigateur :<br>
<a href="{{ verification_link }}" style="color: #6366f1; word-break: break-all;">{{ verification_link }}</a>
</p>
<p style="margin-top: 30px;">Cordialement,<br><strong>L'equipe {{ platform_name }}</strong></p>
</div>
</body>
</html>""",
"body_text": """Verifiez votre email
Bonjour {{ first_name }},
Veuillez verifier votre adresse email en cliquant sur le lien ci-dessous :
{{ verification_link }}
Ce lien expirera dans {{ expiry_hours }} heures. Si vous n'avez pas cree de compte, vous pouvez ignorer cet email.
Cordialement,
L'equipe {{ platform_name }}
""",
},
{
"code": "email_verification",
"language": "de",
"name": "E-Mail-Verifizierung",
"description": "An Benutzer gesendet, um ihre E-Mail-Adresse zu verifizieren",
"category": EmailCategory.AUTH.value,
"is_platform_only": False,
"variables": json.dumps([
"first_name", "verification_link", "expiry_hours", "platform_name"
]),
"subject": "Bestatigen Sie Ihre E-Mail-Adresse",
"body_html": """<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px;">
<div style="background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%); padding: 30px; border-radius: 10px 10px 0 0;">
<h1 style="color: white; margin: 0; font-size: 28px;">E-Mail bestatigen</h1>
</div>
<div style="background: #f9fafb; padding: 30px; border-radius: 0 0 10px 10px;">
<p style="font-size: 16px;">Hallo {{ first_name }},</p>
<p>Bitte bestatigen Sie Ihre E-Mail-Adresse, indem Sie auf die Schaltflache unten klicken:</p>
<div style="text-align: center; margin: 30px 0;">
<a href="{{ verification_link }}" style="background: #6366f1; color: white; padding: 14px 28px; text-decoration: none; border-radius: 8px; font-weight: bold; display: inline-block;">
E-Mail bestatigen
</a>
</div>
<p style="color: #6b7280; font-size: 14px;">
Dieser Link lauft in {{ expiry_hours }} Stunden ab. Wenn Sie kein Konto erstellt haben, konnen Sie diese E-Mail ignorieren.
</p>
<p style="color: #6b7280; font-size: 14px; margin-top: 20px;">
Wenn die Schaltflache nicht funktioniert, kopieren Sie diesen Link in Ihren Browser:<br>
<a href="{{ verification_link }}" style="color: #6366f1; word-break: break-all;">{{ verification_link }}</a>
</p>
<p style="margin-top: 30px;">Mit freundlichen Grussen,<br><strong>Das {{ platform_name }}-Team</strong></p>
</div>
</body>
</html>""",
"body_text": """E-Mail bestatigen
Hallo {{ first_name }},
Bitte bestatigen Sie Ihre E-Mail-Adresse, indem Sie auf den Link unten klicken:
{{ verification_link }}
Dieser Link lauft in {{ expiry_hours }} Stunden ab. Wenn Sie kein Konto erstellt haben, konnen Sie diese E-Mail ignorieren.
Mit freundlichen Grussen,
Das {{ platform_name }}-Team
""",
},
{
"code": "email_verification",
"language": "lb",
"name": "E-Mail Verifizéierung",
"description": "Un Benotzer gescheckt fir hir E-Mail-Adress ze verifizéieren",
"category": EmailCategory.AUTH.value,
"is_platform_only": False,
"variables": json.dumps([
"first_name", "verification_link", "expiry_hours", "platform_name"
]),
"subject": "Bestategt Är E-Mail-Adress",
"body_html": """<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px;">
<div style="background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%); padding: 30px; border-radius: 10px 10px 0 0;">
<h1 style="color: white; margin: 0; font-size: 28px;">E-Mail bestategen</h1>
</div>
<div style="background: #f9fafb; padding: 30px; border-radius: 0 0 10px 10px;">
<p style="font-size: 16px;">Moien {{ first_name }},</p>
<p>Bestategt w.e.g. Är E-Mail-Adress andeems Dir op de Knäppchen hei drënner klickt:</p>
<div style="text-align: center; margin: 30px 0;">
<a href="{{ verification_link }}" style="background: #6366f1; color: white; padding: 14px 28px; text-decoration: none; border-radius: 8px; font-weight: bold; display: inline-block;">
E-Mail bestategen
</a>
</div>
<p style="color: #6b7280; font-size: 14px;">
Dese Link leeft an {{ expiry_hours }} Stonnen of. Wann Dir kee Kont erstallt hutt, kennt Dir des E-Mail ignoréieren.
</p>
<p style="color: #6b7280; font-size: 14px; margin-top: 20px;">
Wann de Knappchen net fonctionnéiert, kopéiert dese Link an Are Browser:<br>
<a href="{{ verification_link }}" style="color: #6366f1; word-break: break-all;">{{ verification_link }}</a>
</p>
<p style="margin-top: 30px;">Mat beschte Greiss,<br><strong>D'{{ platform_name }} Team</strong></p>
</div>
</body>
</html>""",
"body_text": """E-Mail bestategen
Moien {{ first_name }},
Bestategt w.e.g. Ar E-Mail-Adress andeems Dir op de Link hei drenner klickt:
{{ verification_link }}
Dese Link leeft an {{ expiry_hours }} Stonnen of. Wann Dir kee Kont erstallt hutt, kennt Dir des E-Mail ignoréieren.
Mat beschte Greiss,
D'{{ platform_name }} Team
""",
},
# -------------------------------------------------------------------------
# MERCHANT PASSWORD RESET
# -------------------------------------------------------------------------
{
"code": "merchant_password_reset",
"language": "en",
"name": "Merchant Password Reset",
"description": "Sent to merchants/store users when they request a password reset",
"category": EmailCategory.AUTH.value,
"is_platform_only": False,
"variables": json.dumps([
"first_name", "reset_link", "expiry_hours", "platform_name"
]),
"subject": "Reset Your Password",
"body_html": """<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px;">
<div style="background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%); padding: 30px; border-radius: 10px 10px 0 0;">
<h1 style="color: white; margin: 0; font-size: 28px;">Reset Your Password</h1>
</div>
<div style="background: #f9fafb; padding: 30px; border-radius: 0 0 10px 10px;">
<p style="font-size: 16px;">Hi {{ first_name }},</p>
<p>We received a request to reset your password. Click the button below to create a new password:</p>
<div style="text-align: center; margin: 30px 0;">
<a href="{{ reset_link }}" style="background: #6366f1; color: white; padding: 14px 28px; text-decoration: none; border-radius: 8px; font-weight: bold; display: inline-block;">
Reset Password
</a>
</div>
<p style="color: #6b7280; font-size: 14px;">
This link will expire in {{ expiry_hours }} hour(s). If you didn't request this password reset, you can safely ignore this email.
</p>
<p style="color: #6b7280; font-size: 14px; margin-top: 20px;">
If the button doesn't work, copy and paste this link into your browser:<br>
<a href="{{ reset_link }}" style="color: #6366f1; word-break: break-all;">{{ reset_link }}</a>
</p>
<p style="margin-top: 30px;">Best regards,<br><strong>The {{ platform_name }} Team</strong></p>
</div>
<div style="text-align: center; padding: 20px; color: #9ca3af; font-size: 12px;">
<p>This is an automated email. Please do not reply directly.</p>
</div>
</body>
</html>""",
"body_text": """Reset Your Password
Hi {{ first_name }},
We received a request to reset your password. Click the link below to create a new password:
{{ reset_link }}
This link will expire in {{ expiry_hours }} hour(s). If you didn't request this password reset, you can safely ignore this email.
Best regards,
The {{ platform_name }} Team
""",
},
{
"code": "merchant_password_reset",
"language": "fr",
"name": "Reinitialisation mot de passe marchand",
"description": "Envoye aux marchands lorsqu'ils demandent une reinitialisation de mot de passe",
"category": EmailCategory.AUTH.value,
"is_platform_only": False,
"variables": json.dumps([
"first_name", "reset_link", "expiry_hours", "platform_name"
]),
"subject": "Reinitialiser votre mot de passe",
"body_html": """<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px;">
<div style="background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%); padding: 30px; border-radius: 10px 10px 0 0;">
<h1 style="color: white; margin: 0; font-size: 28px;">Reinitialiser votre mot de passe</h1>
</div>
<div style="background: #f9fafb; padding: 30px; border-radius: 0 0 10px 10px;">
<p style="font-size: 16px;">Bonjour {{ first_name }},</p>
<p>Nous avons recu une demande de reinitialisation de votre mot de passe. Cliquez sur le bouton ci-dessous pour creer un nouveau mot de passe :</p>
<div style="text-align: center; margin: 30px 0;">
<a href="{{ reset_link }}" style="background: #6366f1; color: white; padding: 14px 28px; text-decoration: none; border-radius: 8px; font-weight: bold; display: inline-block;">
Reinitialiser le mot de passe
</a>
</div>
<p style="color: #6b7280; font-size: 14px;">
Ce lien expirera dans {{ expiry_hours }} heure(s). Si vous n'avez pas demande cette reinitialisation, vous pouvez ignorer cet email.
</p>
<p style="color: #6b7280; font-size: 14px; margin-top: 20px;">
Si le bouton ne fonctionne pas, copiez et collez ce lien dans votre navigateur :<br>
<a href="{{ reset_link }}" style="color: #6366f1; word-break: break-all;">{{ reset_link }}</a>
</p>
<p style="margin-top: 30px;">Cordialement,<br><strong>L'equipe {{ platform_name }}</strong></p>
</div>
</body>
</html>""",
"body_text": """Reinitialiser votre mot de passe
Bonjour {{ first_name }},
Nous avons recu une demande de reinitialisation de votre mot de passe. Cliquez sur le lien ci-dessous :
{{ reset_link }}
Ce lien expirera dans {{ expiry_hours }} heure(s). Si vous n'avez pas demande cette reinitialisation, vous pouvez ignorer cet email.
Cordialement,
L'equipe {{ platform_name }}
""",
},
{
"code": "merchant_password_reset",
"language": "de",
"name": "Handler Passwort zurucksetzen",
"description": "An Handler gesendet, wenn sie eine Passwortzurucksetzung anfordern",
"category": EmailCategory.AUTH.value,
"is_platform_only": False,
"variables": json.dumps([
"first_name", "reset_link", "expiry_hours", "platform_name"
]),
"subject": "Passwort zurucksetzen",
"body_html": """<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px;">
<div style="background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%); padding: 30px; border-radius: 10px 10px 0 0;">
<h1 style="color: white; margin: 0; font-size: 28px;">Passwort zurucksetzen</h1>
</div>
<div style="background: #f9fafb; padding: 30px; border-radius: 0 0 10px 10px;">
<p style="font-size: 16px;">Hallo {{ first_name }},</p>
<p>Wir haben eine Anfrage zur Zurucksetzung Ihres Passworts erhalten. Klicken Sie auf die Schaltflache unten, um ein neues Passwort zu erstellen:</p>
<div style="text-align: center; margin: 30px 0;">
<a href="{{ reset_link }}" style="background: #6366f1; color: white; padding: 14px 28px; text-decoration: none; border-radius: 8px; font-weight: bold; display: inline-block;">
Passwort zurucksetzen
</a>
</div>
<p style="color: #6b7280; font-size: 14px;">
Dieser Link lauft in {{ expiry_hours }} Stunde(n) ab. Wenn Sie diese Passwortzurucksetzung nicht angefordert haben, konnen Sie diese E-Mail ignorieren.
</p>
<p style="color: #6b7280; font-size: 14px; margin-top: 20px;">
Wenn die Schaltflache nicht funktioniert, kopieren Sie diesen Link in Ihren Browser:<br>
<a href="{{ reset_link }}" style="color: #6366f1; word-break: break-all;">{{ reset_link }}</a>
</p>
<p style="margin-top: 30px;">Mit freundlichen Grussen,<br><strong>Das {{ platform_name }}-Team</strong></p>
</div>
</body>
</html>""",
"body_text": """Passwort zurucksetzen
Hallo {{ first_name }},
Wir haben eine Anfrage zur Zurucksetzung Ihres Passworts erhalten. Klicken Sie auf den Link unten:
{{ reset_link }}
Dieser Link lauft in {{ expiry_hours }} Stunde(n) ab. Wenn Sie diese Passwortzurucksetzung nicht angefordert haben, konnen Sie diese E-Mail ignorieren.
Mit freundlichen Grussen,
Das {{ platform_name }}-Team
""",
},
{
"code": "merchant_password_reset",
"language": "lb",
"name": "Handler Passwuert zrecksetzen",
"description": "Un Handler gescheckt wann si eng Passwuertzrecksetzung ufroen",
"category": EmailCategory.AUTH.value,
"is_platform_only": False,
"variables": json.dumps([
"first_name", "reset_link", "expiry_hours", "platform_name"
]),
"subject": "Passwuert zrecksetzen",
"body_html": """<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px;">
<div style="background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%); padding: 30px; border-radius: 10px 10px 0 0;">
<h1 style="color: white; margin: 0; font-size: 28px;">Passwuert zrecksetzen</h1>
</div>
<div style="background: #f9fafb; padding: 30px; border-radius: 0 0 10px 10px;">
<p style="font-size: 16px;">Moien {{ first_name }},</p>
<p>Mir hunn eng Ufro kritt fir Aert Passwuert zreckzesetzen. Klickt op de Knappchen hei drenner fir en neit Passwuert ze kreéieren:</p>
<div style="text-align: center; margin: 30px 0;">
<a href="{{ reset_link }}" style="background: #6366f1; color: white; padding: 14px 28px; text-decoration: none; border-radius: 8px; font-weight: bold; display: inline-block;">
Passwuert zrecksetzen
</a>
</div>
<p style="color: #6b7280; font-size: 14px;">
Dese Link leeft an {{ expiry_hours }} Stonn(en) of. Wann Dir des Passwuertzrecksetzung net ugefrot hutt, kennt Dir des E-Mail ignoréieren.
</p>
<p style="color: #6b7280; font-size: 14px; margin-top: 20px;">
Wann de Knappchen net fonctionnéiert, kopéiert dese Link an Are Browser:<br>
<a href="{{ reset_link }}" style="color: #6366f1; word-break: break-all;">{{ reset_link }}</a>
</p>
<p style="margin-top: 30px;">Mat beschte Greiss,<br><strong>D'{{ platform_name }} Team</strong></p>
</div>
</body>
</html>""",
"body_text": """Passwuert zrecksetzen
Moien {{ first_name }},
Mir hunn eng Ufro kritt fir Aert Passwuert zreckzesetzen. Klickt op de Link hei drenner:
{{ reset_link }}
Dese Link leeft an {{ expiry_hours }} Stonn(en) of. Wann Dir des Passwuertzrecksetzung net ugefrot hutt, kennt Dir des E-Mail ignoréieren.
Mat beschte Greiss,
D'{{ platform_name }} Team
""",
},
# -------------------------------------------------------------------------
# TEAM INVITATION
# -------------------------------------------------------------------------
{
"code": "team_invitation",
"language": "en",
"name": "Team Invitation",
"description": "Sent when a team member is invited to a store",
"category": EmailCategory.SYSTEM.value,
"variables": json.dumps([
"invited_by_name", "store_name", "role_name",
"acceptance_link", "expiry_days"
]),
"subject": "You've been invited to join {{ store_name }}",
"body_html": """<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px;">
<div style="background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%); padding: 30px; border-radius: 10px 10px 0 0;">
<h1 style="color: white; margin: 0; font-size: 28px;">Team Invitation</h1>
</div>
<div style="background: #f9fafb; padding: 30px; border-radius: 0 0 10px 10px;">
<p style="font-size: 16px;">Hello,</p>
<p><strong>{{ invited_by_name }}</strong> has invited you to join <strong>{{ store_name }}</strong> as a <strong>{{ role_name }}</strong>.</p>
<div style="text-align: center; margin: 30px 0;">
<a href="{{ acceptance_link }}" style="background: #6366f1; color: white; padding: 14px 28px; text-decoration: none; border-radius: 8px; font-weight: bold; display: inline-block;">
Accept Invitation
</a>
</div>
<p style="color: #6b7280; font-size: 14px;">This invitation expires in {{ expiry_days }} days. If you did not expect this invitation, you can safely ignore this email.</p>
<p>Best regards,<br><strong>The Orion Team</strong></p>
</div>
<div style="text-align: center; padding: 20px; color: #9ca3af; font-size: 12px;">
<p>&copy; 2024 Orion. Built for Luxembourg e-commerce.</p>
</div>
</body>
</html>""",
"body_text": """Team Invitation
Hello,
{{ invited_by_name }} has invited you to join {{ store_name }} as a {{ role_name }}.
Accept Invitation: {{ acceptance_link }}
This invitation expires in {{ expiry_days }} days. If you did not expect this invitation, you can safely ignore this email.
Best regards,
The Orion Team
""",
},
{
"code": "team_invitation",
"language": "fr",
"name": "Invitation d'équipe",
"description": "Envoyé lorsqu'un membre est invité à rejoindre une boutique",
"category": EmailCategory.SYSTEM.value,
"variables": json.dumps([
"invited_by_name", "store_name", "role_name",
"acceptance_link", "expiry_days"
]),
"subject": "Vous avez été invité(e) à rejoindre {{ store_name }}",
"body_html": """<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px;">
<div style="background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%); padding: 30px; border-radius: 10px 10px 0 0;">
<h1 style="color: white; margin: 0; font-size: 28px;">Invitation d'équipe</h1>
</div>
<div style="background: #f9fafb; padding: 30px; border-radius: 0 0 10px 10px;">
<p style="font-size: 16px;">Bonjour,</p>
<p><strong>{{ invited_by_name }}</strong> vous a invité(e) à rejoindre <strong>{{ store_name }}</strong> en tant que <strong>{{ role_name }}</strong>.</p>
<div style="text-align: center; margin: 30px 0;">
<a href="{{ acceptance_link }}" style="background: #6366f1; color: white; padding: 14px 28px; text-decoration: none; border-radius: 8px; font-weight: bold; display: inline-block;">
Accepter l'invitation
</a>
</div>
<p style="color: #6b7280; font-size: 14px;">Cette invitation expire dans {{ expiry_days }} jours. Si vous n'attendiez pas cette invitation, vous pouvez ignorer cet email.</p>
<p>Cordialement,<br><strong>L'équipe Orion</strong></p>
</div>
<div style="text-align: center; padding: 20px; color: #9ca3af; font-size: 12px;">
<p>&copy; 2024 Orion. Conçu pour le e-commerce luxembourgeois.</p>
</div>
</body>
</html>""",
"body_text": """Invitation d'équipe
Bonjour,
{{ invited_by_name }} vous a invité(e) à rejoindre {{ store_name }} en tant que {{ role_name }}.
Accepter l'invitation : {{ acceptance_link }}
Cette invitation expire dans {{ expiry_days }} jours. Si vous n'attendiez pas cette invitation, vous pouvez ignorer cet email.
Cordialement,
L'équipe Orion
""",
},
{
"code": "team_invitation",
"language": "de",
"name": "Teameinladung",
"description": "Gesendet wenn ein Teammitglied zu einem Shop eingeladen wird",
"category": EmailCategory.SYSTEM.value,
"variables": json.dumps([
"invited_by_name", "store_name", "role_name",
"acceptance_link", "expiry_days"
]),
"subject": "Sie wurden eingeladen, {{ store_name }} beizutreten",
"body_html": """<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px;">
<div style="background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%); padding: 30px; border-radius: 10px 10px 0 0;">
<h1 style="color: white; margin: 0; font-size: 28px;">Teameinladung</h1>
</div>
<div style="background: #f9fafb; padding: 30px; border-radius: 0 0 10px 10px;">
<p style="font-size: 16px;">Hallo,</p>
<p><strong>{{ invited_by_name }}</strong> hat Sie eingeladen, <strong>{{ store_name }}</strong> als <strong>{{ role_name }}</strong> beizutreten.</p>
<div style="text-align: center; margin: 30px 0;">
<a href="{{ acceptance_link }}" style="background: #6366f1; color: white; padding: 14px 28px; text-decoration: none; border-radius: 8px; font-weight: bold; display: inline-block;">
Einladung annehmen
</a>
</div>
<p style="color: #6b7280; font-size: 14px;">Diese Einladung läuft in {{ expiry_days }} Tagen ab. Wenn Sie diese Einladung nicht erwartet haben, können Sie diese E-Mail ignorieren.</p>
<p>Mit freundlichen Grüßen,<br><strong>Das Orion-Team</strong></p>
</div>
<div style="text-align: center; padding: 20px; color: #9ca3af; font-size: 12px;">
<p>&copy; 2024 Orion. Entwickelt für den luxemburgischen E-Commerce.</p>
</div>
</body>
</html>""",
"body_text": """Teameinladung
Hallo,
{{ invited_by_name }} hat Sie eingeladen, {{ store_name }} als {{ role_name }} beizutreten.
Einladung annehmen: {{ acceptance_link }}
Diese Einladung läuft in {{ expiry_days }} Tagen ab. Wenn Sie diese Einladung nicht erwartet haben, können Sie diese E-Mail ignorieren.
Mit freundlichen Grüßen,
Das Orion-Team
""",
},
{
"code": "team_invitation",
"language": "lb",
"name": "Team-Invitatioun",
"description": "Gëtt geschéckt wann en Teammember an e Buttek invitéiert gëtt",
"category": EmailCategory.SYSTEM.value,
"variables": json.dumps([
"invited_by_name", "store_name", "role_name",
"acceptance_link", "expiry_days"
]),
"subject": "Dir sidd invitéiert, {{ store_name }} bäizetrieden",
"body_html": """<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px;">
<div style="background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%); padding: 30px; border-radius: 10px 10px 0 0;">
<h1 style="color: white; margin: 0; font-size: 28px;">Team-Invitatioun</h1>
</div>
<div style="background: #f9fafb; padding: 30px; border-radius: 0 0 10px 10px;">
<p style="font-size: 16px;">Moien,</p>
<p><strong>{{ invited_by_name }}</strong> huet Iech invitéiert, <strong>{{ store_name }}</strong> als <strong>{{ role_name }}</strong> bäizetrieden.</p>
<div style="text-align: center; margin: 30px 0;">
<a href="{{ acceptance_link }}" style="background: #6366f1; color: white; padding: 14px 28px; text-decoration: none; border-radius: 8px; font-weight: bold; display: inline-block;">
Invitatioun unhuelen
</a>
</div>
<p style="color: #6b7280; font-size: 14px;">Dës Invitatioun leeft a(n) {{ expiry_days }} Deeg of. Wann Dir dës Invitatioun net erwaart hutt, kënnt Dir dës E-Mail ignoréieren.</p>
<p>Mat frëndleche Gréiss,<br><strong>D'Orion-Equipe</strong></p>
</div>
<div style="text-align: center; padding: 20px; color: #9ca3af; font-size: 12px;">
<p>&copy; 2024 Orion. Gebaut fir de lëtzebuergeschen E-Commerce.</p>
</div>
</body>
</html>""",
"body_text": """Team-Invitatioun
Moien,
{{ invited_by_name }} huet Iech invitéiert, {{ store_name }} als {{ role_name }} bäizetrieden.
Invitatioun unhuelen: {{ acceptance_link }}
Dës Invitatioun leeft a(n) {{ expiry_days }} Deeg of. Wann Dir dës Invitatioun net erwaart hutt, kënnt Dir dës E-Mail ignoréieren.
Mat frëndleche Gréiss,
D'Orion-Equipe
""",
},
]
def seed_templates():
"""Seed email templates into database."""
db = next(get_db())
try:
created = 0
updated = 0
for template_data in TEMPLATES:
# Set defaults for new fields
template_data.setdefault("is_platform_only", False)
template_data.setdefault("required_variables", None)
# Check if template already exists
existing = (
db.query(EmailTemplate)
.filter(
EmailTemplate.code == template_data["code"],
EmailTemplate.language == template_data["language"],
)
.first()
)
if existing:
# Update existing template
for key, value in template_data.items():
setattr(existing, key, value)
updated += 1
platform_only_tag = " [platform-only]" if template_data.get("is_platform_only") else ""
print(f"Updated: {template_data['code']} ({template_data['language']}){platform_only_tag}")
else:
# Create new template
template = EmailTemplate(**template_data)
db.add(template) # noqa: PERF006
created += 1
platform_only_tag = " [platform-only]" if template_data.get("is_platform_only") else ""
print(f"Created: {template_data['code']} ({template_data['language']}){platform_only_tag}")
db.commit()
print(f"\nDone! Created: {created}, Updated: {updated}")
except Exception as e:
db.rollback()
print(f"Error: {e}")
raise
finally:
db.close()
if __name__ == "__main__":
seed_templates()