- 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.
309 lines
7.4 KiB
HTML
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>
|