alternative-backend-service/templates/emails/appointment_rejected.html
saani 23c185c93d refactor(meetings): standardize null handling for Jitsi fields and enhance emails
- Set explicit default=None for jitsi_room_id field to ensure consistent null handling
- Update rejection logic to use None instead of empty strings for Jitsi fields, maintaining database consistency with nullable field definitions
- Add login instructions to appointment confirmation email directing users to join 15 minutes early
- Remove outdated "self-guided resources" option from rejection email
- Add styling for new login-info section in scheduled appointment template

This ensures proper null value handling in the database and improves user communication for appointment workflows.
2025-11-28 12:50:33 +00:00

309 lines
7.4 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Appointment Request Update</title>
<style>
@import url("https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap");
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI",
Roboto, sans-serif;
line-height: 1.6;
color: #333;
background-color: #f8fafc;
}
.email-container {
max-width: 600px;
margin: 0 auto;
background: #ffffff;
border-radius: 12px;
overflow: hidden;
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1),
0 2px 4px -1px rgba(0, 0, 0, 0.06);
}
.email-header {
background-image: linear-gradient(to right, #e11d48, #db2777, #f97316);
padding: 40px 30px;
text-align: center;
color: white;
}
.email-header h1 {
font-size: 28px;
font-weight: 700;
margin-bottom: 8px;
}
.email-header p {
font-size: 16px;
opacity: 0.9;
font-weight: 400;
}
.email-body {
padding: 40px 30px;
}
.greeting {
font-size: 18px;
font-weight: 600;
color: #1f2937;
margin-bottom: 25px;
line-height: 1.8;
}
.status-card {
background: #fff5f5;
border: 1px solid #fed7d7;
border-radius: 12px;
padding: 30px;
text-align: center;
margin: 25px 0;
}
.status-icon {
font-size: 48px;
margin-bottom: 15px;
}
.status-title {
font-size: 22px;
color: #c53030;
margin-bottom: 15px;
font-weight: 600;
}
.reason-box {
background: #f7fafc;
border: 1px solid #e2e8f0;
border-radius: 8px;
padding: 20px;
margin: 20px 0;
}
.reason-title {
font-weight: 600;
color: #4a5568;
margin-bottom: 10px;
font-size: 16px;
}
.reason-message {
color: #4a5568;
font-style: italic;
line-height: 1.6;
margin-top: 8px;
}
.suggestions {
background: #f0fff4;
border: 1px solid #9ae6b4;
border-radius: 12px;
padding: 25px;
margin: 25px 0;
}
.suggestions-title {
font-weight: 600;
color: #22543d;
margin-bottom: 15px;
font-size: 18px;
}
.suggestions-list {
list-style: none;
}
.suggestions-list li {
margin-bottom: 12px;
padding-left: 25px;
position: relative;
color: #475569;
}
.suggestions-list li:before {
content: "💡";
position: absolute;
left: 0;
}
.next-steps {
background: #ebf8ff;
border: 1px solid #90cdf4;
border-radius: 12px;
padding: 25px;
margin: 25px 0;
}
.steps-title {
font-weight: 600;
color: #2c5282;
margin-bottom: 15px;
font-size: 18px;
}
.contact-box {
background: #edf2f7;
border-radius: 8px;
padding: 20px;
margin: 20px 0;
text-align: center;
color: #475569;
}
.action-section {
text-align: center;
margin: 35px 0 25px;
}
.button {
display: inline-block;
background-image: linear-gradient(to right, #e11d48, #db2777, #f97316);
color: white;
padding: 16px 32px;
text-decoration: none;
border-radius: 8px;
font-weight: 600;
font-size: 16px;
transition: transform 0.2s;
}
.button:hover {
transform: translateY(-2px);
}
.email-footer {
background-image: linear-gradient(to right, #e11d48, #db2777, #f97316);
padding: 30px;
text-align: center;
color: white;
}
.footer-text {
font-size: 14px;
margin-bottom: 10px;
opacity: 0.9;
}
.copyright {
font-size: 12px;
margin-top: 15px;
opacity: 0.8;
}
@media (max-width: 600px) {
.email-container {
margin: 10px;
border-radius: 8px;
}
.email-header,
.email-body,
.email-footer {
padding: 25px 20px;
}
.status-card,
.suggestions,
.next-steps {
padding: 20px;
}
.status-icon {
font-size: 36px;
}
.status-title {
font-size: 20px;
}
}
</style>
</head>
<body>
<div class="email-container">
<!-- Header -->
<div class="email-header">
<h1>Appointment Request Update</h1>
<p>Regarding your recent booking request</p>
</div>
<!-- Body -->
<div class="email-body">
<div class="greeting">
Hello <strong>{{ appointment.full_name }}</strong>,<br />
Thank you for your interest in scheduling an appointment. We've
reviewed your request and need to provide you with an update.
</div>
<!-- Status Card -->
<div class="status-card">
<div class="status-title">Request Not Accepted</div>
<p>
We're unable to accommodate your appointment request at this time.
</p>
</div>
<!-- Reason (if provided) -->
{% if rejection_reason %}
<div class="reason-box">
<div class="reason-title">Message from the therapist:</div>
<div class="reason-message">"{{ rejection_reason }}"</div>
</div>
{% endif %}
<!-- Suggestions -->
<div class="suggestions">
<div class="suggestions-title">Alternative Options</div>
<ul class="suggestions-list">
<li>
Submit a new request with different preferred dates or times
</li>
<li>Consider our group therapy sessions with more availability</li>
<li>Join our waitlist for last-minute availability</li>
</ul>
</div>
<!-- Next Steps -->
<div class="next-steps">
<div class="steps-title">What You Can Do Next</div>
<p style="color: #475569; margin-bottom: 15px">
We value your interest in our services and want to help you find the
right fit:
</p>
<ul class="suggestions-list">
<li>Submit a new appointment request with adjusted preferences</li>
<li>Contact us directly to discuss alternative options</li>
<li>Check back next month for updated availability</li>
</ul>
</div>
</div>
<!-- Footer -->
<div class="email-footer">
<div class="company-name">{{ settings.SITE_NAME|default:"Attune Heart Therapy" }}</div>
<p class="support-info">
Need help? Contact our support team at
<a
href="mailto:admin@attunehearttherapy.com"
style="color: #fff; text-decoration: none"
>admin@attunehearttherapy.com</a
>
</p>
<p class="copyright">
© {% now "Y" %} {{ settings.SITE_NAME|default:"Attune Heart Therapy" }}. All rights reserved.
</p>
</div>
</div>
</body>
</html>