@blackcode_sa/metaestetics-api 1.7.33 → 1.7.34
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/index.d.mts +238 -57
- package/dist/admin/index.d.ts +238 -57
- package/dist/admin/index.js +1167 -7
- package/dist/admin/index.mjs +1166 -7
- package/package.json +1 -1
- package/src/admin/aggregation/practitioner-invite/practitioner-invite.aggregation.service.ts +247 -12
- package/src/admin/index.ts +12 -1
- package/src/admin/mailing/practitionerInvite/existing-practitioner-invite.mailing.ts +611 -0
- package/src/admin/mailing/practitionerInvite/templates/existing-practitioner-invitation.template.ts +155 -0
- package/src/admin/mailing/practitionerInvite/templates/invite-accepted-notification.template.ts +228 -0
- package/src/admin/mailing/practitionerInvite/templates/invite-rejected-notification.template.ts +242 -0
package/src/admin/mailing/practitionerInvite/templates/existing-practitioner-invitation.template.ts
ADDED
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Email template for inviting existing practitioners to join a clinic
|
|
3
|
+
* This template is used when a clinic invites an active practitioner to join their clinic
|
|
4
|
+
*/
|
|
5
|
+
export const existingPractitionerInvitationTemplate = `
|
|
6
|
+
<!DOCTYPE html>
|
|
7
|
+
<html lang="en">
|
|
8
|
+
<head>
|
|
9
|
+
<meta charset="UTF-8">
|
|
10
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
11
|
+
<title>Invitation to Join {{clinicName}}</title>
|
|
12
|
+
<style>
|
|
13
|
+
body {
|
|
14
|
+
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
|
|
15
|
+
line-height: 1.6;
|
|
16
|
+
color: #333;
|
|
17
|
+
max-width: 600px;
|
|
18
|
+
margin: 0 auto;
|
|
19
|
+
padding: 20px;
|
|
20
|
+
background-color: #f4f4f4;
|
|
21
|
+
}
|
|
22
|
+
.container {
|
|
23
|
+
background-color: #ffffff;
|
|
24
|
+
padding: 30px;
|
|
25
|
+
border-radius: 10px;
|
|
26
|
+
box-shadow: 0 0 20px rgba(0,0,0,0.1);
|
|
27
|
+
}
|
|
28
|
+
.header {
|
|
29
|
+
text-align: center;
|
|
30
|
+
margin-bottom: 30px;
|
|
31
|
+
border-bottom: 2px solid #007bff;
|
|
32
|
+
padding-bottom: 20px;
|
|
33
|
+
}
|
|
34
|
+
.logo {
|
|
35
|
+
font-size: 28px;
|
|
36
|
+
font-weight: bold;
|
|
37
|
+
color: #007bff;
|
|
38
|
+
margin-bottom: 10px;
|
|
39
|
+
}
|
|
40
|
+
h1 {
|
|
41
|
+
color: #007bff;
|
|
42
|
+
text-align: center;
|
|
43
|
+
margin-bottom: 20px;
|
|
44
|
+
}
|
|
45
|
+
.highlight {
|
|
46
|
+
background-color: #e7f3ff;
|
|
47
|
+
padding: 15px;
|
|
48
|
+
border-left: 4px solid #007bff;
|
|
49
|
+
margin: 20px 0;
|
|
50
|
+
}
|
|
51
|
+
.button {
|
|
52
|
+
display: inline-block;
|
|
53
|
+
background-color: #28a745;
|
|
54
|
+
color: white;
|
|
55
|
+
padding: 12px 25px;
|
|
56
|
+
text-decoration: none;
|
|
57
|
+
border-radius: 5px;
|
|
58
|
+
margin: 10px 5px;
|
|
59
|
+
font-weight: bold;
|
|
60
|
+
text-align: center;
|
|
61
|
+
}
|
|
62
|
+
.button.reject {
|
|
63
|
+
background-color: #dc3545;
|
|
64
|
+
}
|
|
65
|
+
.button:hover {
|
|
66
|
+
opacity: 0.9;
|
|
67
|
+
}
|
|
68
|
+
.action-section {
|
|
69
|
+
text-align: center;
|
|
70
|
+
margin: 30px 0;
|
|
71
|
+
padding: 20px;
|
|
72
|
+
background-color: #f8f9fa;
|
|
73
|
+
border-radius: 5px;
|
|
74
|
+
}
|
|
75
|
+
.details {
|
|
76
|
+
background-color: #f8f9fa;
|
|
77
|
+
padding: 15px;
|
|
78
|
+
border-radius: 5px;
|
|
79
|
+
margin: 15px 0;
|
|
80
|
+
}
|
|
81
|
+
.footer {
|
|
82
|
+
margin-top: 30px;
|
|
83
|
+
padding-top: 20px;
|
|
84
|
+
border-top: 1px solid #eee;
|
|
85
|
+
font-size: 14px;
|
|
86
|
+
color: #666;
|
|
87
|
+
text-align: center;
|
|
88
|
+
}
|
|
89
|
+
.contact-info {
|
|
90
|
+
margin-top: 15px;
|
|
91
|
+
padding: 10px;
|
|
92
|
+
background-color: #e9ecef;
|
|
93
|
+
border-radius: 5px;
|
|
94
|
+
}
|
|
95
|
+
</style>
|
|
96
|
+
</head>
|
|
97
|
+
<body>
|
|
98
|
+
<div class="container">
|
|
99
|
+
<div class="header">
|
|
100
|
+
<div class="logo">MetaEstetics</div>
|
|
101
|
+
<p>Professional Medical Network</p>
|
|
102
|
+
</div>
|
|
103
|
+
|
|
104
|
+
<h1>You're Invited to Join {{clinicName}}!</h1>
|
|
105
|
+
|
|
106
|
+
<p>Dear Dr. {{practitionerName}},</p>
|
|
107
|
+
|
|
108
|
+
<p>We hope this message finds you well. You have been invited to join <strong>{{clinicName}}</strong> as a practicing medical professional.</p>
|
|
109
|
+
|
|
110
|
+
<div class="highlight">
|
|
111
|
+
<strong>Invitation Details:</strong>
|
|
112
|
+
<div class="details">
|
|
113
|
+
<p><strong>Clinic:</strong> {{clinicName}}</p>
|
|
114
|
+
<p><strong>Location:</strong> {{clinicAddress}}</p>
|
|
115
|
+
<p><strong>Proposed Working Hours:</strong> {{workingHours}}</p>
|
|
116
|
+
<p><strong>Invitation Expires:</strong> {{expirationDate}}</p>
|
|
117
|
+
</div>
|
|
118
|
+
</div>
|
|
119
|
+
|
|
120
|
+
<p>By accepting this invitation, you will:</p>
|
|
121
|
+
<ul>
|
|
122
|
+
<li>Join the {{clinicName}} team as a featured practitioner</li>
|
|
123
|
+
<li>Have your profile displayed on their clinic page</li>
|
|
124
|
+
<li>Be available for appointments at the specified working hours</li>
|
|
125
|
+
<li>Access their patient booking system and clinic resources</li>
|
|
126
|
+
</ul>
|
|
127
|
+
|
|
128
|
+
<div class="action-section">
|
|
129
|
+
<p><strong>Please respond to this invitation:</strong></p>
|
|
130
|
+
<a href="{{acceptUrl}}" class="button">Accept Invitation</a>
|
|
131
|
+
<a href="{{rejectUrl}}" class="button reject">Decline Invitation</a>
|
|
132
|
+
</div>
|
|
133
|
+
|
|
134
|
+
<div class="contact-info">
|
|
135
|
+
<p><strong>Questions?</strong> Contact the clinic administrator:</p>
|
|
136
|
+
<p>📧 {{contactEmail}}<br>
|
|
137
|
+
📞 {{contactPhone}}</p>
|
|
138
|
+
</div>
|
|
139
|
+
|
|
140
|
+
<p>We look forward to welcoming you to the {{clinicName}} team!</p>
|
|
141
|
+
|
|
142
|
+
<div class="footer">
|
|
143
|
+
<p>Best regards,<br>
|
|
144
|
+
<strong>The MetaEstetics Team</strong></p>
|
|
145
|
+
<p>This invitation will expire on {{expirationDate}}. Please respond before this date.</p>
|
|
146
|
+
<hr>
|
|
147
|
+
<p style="font-size: 12px; color: #999;">
|
|
148
|
+
This is an automated message from MetaEstetics. If you received this email in error, please ignore it.
|
|
149
|
+
<br>© {{currentYear}} MetaEstetics. All rights reserved.
|
|
150
|
+
</p>
|
|
151
|
+
</div>
|
|
152
|
+
</div>
|
|
153
|
+
</body>
|
|
154
|
+
</html>
|
|
155
|
+
`;
|
package/src/admin/mailing/practitionerInvite/templates/invite-accepted-notification.template.ts
ADDED
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Email template for notifying clinic admins when a practitioner accepts an invitation
|
|
3
|
+
* This template is sent to the clinic admin when a practitioner accepts their invitation
|
|
4
|
+
*/
|
|
5
|
+
export const inviteAcceptedNotificationTemplate = `
|
|
6
|
+
<!DOCTYPE html>
|
|
7
|
+
<html lang="en">
|
|
8
|
+
<head>
|
|
9
|
+
<meta charset="UTF-8">
|
|
10
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
11
|
+
<title>Practitioner Invitation Accepted - {{practitionerName}}</title>
|
|
12
|
+
<style>
|
|
13
|
+
body {
|
|
14
|
+
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
|
|
15
|
+
line-height: 1.6;
|
|
16
|
+
color: #333;
|
|
17
|
+
max-width: 600px;
|
|
18
|
+
margin: 0 auto;
|
|
19
|
+
padding: 20px;
|
|
20
|
+
background-color: #f4f4f4;
|
|
21
|
+
}
|
|
22
|
+
.container {
|
|
23
|
+
background-color: #ffffff;
|
|
24
|
+
padding: 30px;
|
|
25
|
+
border-radius: 10px;
|
|
26
|
+
box-shadow: 0 0 20px rgba(0,0,0,0.1);
|
|
27
|
+
}
|
|
28
|
+
.header {
|
|
29
|
+
text-align: center;
|
|
30
|
+
margin-bottom: 30px;
|
|
31
|
+
border-bottom: 2px solid #28a745;
|
|
32
|
+
padding-bottom: 20px;
|
|
33
|
+
}
|
|
34
|
+
.logo {
|
|
35
|
+
font-size: 28px;
|
|
36
|
+
font-weight: bold;
|
|
37
|
+
color: #28a745;
|
|
38
|
+
margin-bottom: 10px;
|
|
39
|
+
}
|
|
40
|
+
h1 {
|
|
41
|
+
color: #28a745;
|
|
42
|
+
text-align: center;
|
|
43
|
+
margin-bottom: 20px;
|
|
44
|
+
}
|
|
45
|
+
.success-badge {
|
|
46
|
+
background-color: #d4edda;
|
|
47
|
+
color: #155724;
|
|
48
|
+
padding: 15px;
|
|
49
|
+
border-left: 4px solid #28a745;
|
|
50
|
+
margin: 20px 0;
|
|
51
|
+
border-radius: 0 5px 5px 0;
|
|
52
|
+
}
|
|
53
|
+
.practitioner-card {
|
|
54
|
+
background-color: #f8f9fa;
|
|
55
|
+
padding: 20px;
|
|
56
|
+
border-radius: 8px;
|
|
57
|
+
margin: 20px 0;
|
|
58
|
+
border: 1px solid #dee2e6;
|
|
59
|
+
}
|
|
60
|
+
.practitioner-photo {
|
|
61
|
+
width: 80px;
|
|
62
|
+
height: 80px;
|
|
63
|
+
border-radius: 50%;
|
|
64
|
+
object-fit: cover;
|
|
65
|
+
float: left;
|
|
66
|
+
margin-right: 15px;
|
|
67
|
+
border: 3px solid #28a745;
|
|
68
|
+
}
|
|
69
|
+
.practitioner-info {
|
|
70
|
+
overflow: hidden;
|
|
71
|
+
}
|
|
72
|
+
.practitioner-name {
|
|
73
|
+
font-size: 18px;
|
|
74
|
+
font-weight: bold;
|
|
75
|
+
color: #333;
|
|
76
|
+
margin-bottom: 5px;
|
|
77
|
+
}
|
|
78
|
+
.practitioner-details {
|
|
79
|
+
color: #666;
|
|
80
|
+
font-size: 14px;
|
|
81
|
+
line-height: 1.4;
|
|
82
|
+
}
|
|
83
|
+
.details-grid {
|
|
84
|
+
display: grid;
|
|
85
|
+
grid-template-columns: 1fr 1fr;
|
|
86
|
+
gap: 15px;
|
|
87
|
+
margin: 20px 0;
|
|
88
|
+
}
|
|
89
|
+
.detail-item {
|
|
90
|
+
background-color: #f8f9fa;
|
|
91
|
+
padding: 10px;
|
|
92
|
+
border-radius: 5px;
|
|
93
|
+
border-left: 3px solid #28a745;
|
|
94
|
+
}
|
|
95
|
+
.detail-label {
|
|
96
|
+
font-weight: bold;
|
|
97
|
+
color: #495057;
|
|
98
|
+
font-size: 12px;
|
|
99
|
+
text-transform: uppercase;
|
|
100
|
+
margin-bottom: 5px;
|
|
101
|
+
}
|
|
102
|
+
.detail-value {
|
|
103
|
+
color: #333;
|
|
104
|
+
font-size: 14px;
|
|
105
|
+
}
|
|
106
|
+
.button {
|
|
107
|
+
display: inline-block;
|
|
108
|
+
background-color: #007bff;
|
|
109
|
+
color: white;
|
|
110
|
+
padding: 12px 25px;
|
|
111
|
+
text-decoration: none;
|
|
112
|
+
border-radius: 5px;
|
|
113
|
+
margin: 10px 5px;
|
|
114
|
+
font-weight: bold;
|
|
115
|
+
text-align: center;
|
|
116
|
+
}
|
|
117
|
+
.button:hover {
|
|
118
|
+
opacity: 0.9;
|
|
119
|
+
}
|
|
120
|
+
.action-section {
|
|
121
|
+
text-align: center;
|
|
122
|
+
margin: 30px 0;
|
|
123
|
+
padding: 20px;
|
|
124
|
+
background-color: #e9ecef;
|
|
125
|
+
border-radius: 5px;
|
|
126
|
+
}
|
|
127
|
+
.footer {
|
|
128
|
+
margin-top: 30px;
|
|
129
|
+
padding-top: 20px;
|
|
130
|
+
border-top: 1px solid #eee;
|
|
131
|
+
font-size: 14px;
|
|
132
|
+
color: #666;
|
|
133
|
+
text-align: center;
|
|
134
|
+
}
|
|
135
|
+
.working-hours {
|
|
136
|
+
background-color: #fff3cd;
|
|
137
|
+
border: 1px solid #ffeaa7;
|
|
138
|
+
border-radius: 5px;
|
|
139
|
+
padding: 15px;
|
|
140
|
+
margin: 15px 0;
|
|
141
|
+
}
|
|
142
|
+
.working-hours h4 {
|
|
143
|
+
color: #856404;
|
|
144
|
+
margin-top: 0;
|
|
145
|
+
}
|
|
146
|
+
</style>
|
|
147
|
+
</head>
|
|
148
|
+
<body>
|
|
149
|
+
<div class="container">
|
|
150
|
+
<div class="header">
|
|
151
|
+
<div class="logo">MetaEstetics</div>
|
|
152
|
+
<p>Clinic Management System</p>
|
|
153
|
+
</div>
|
|
154
|
+
|
|
155
|
+
<h1>🎉 Great News! Invitation Accepted</h1>
|
|
156
|
+
|
|
157
|
+
<div class="success-badge">
|
|
158
|
+
<strong>✅ Dr. {{practitionerName}} has accepted your invitation!</strong>
|
|
159
|
+
<p style="margin: 5px 0 0 0;">They are now part of the {{clinicName}} team.</p>
|
|
160
|
+
</div>
|
|
161
|
+
|
|
162
|
+
<p>Dear {{clinicAdminName}},</p>
|
|
163
|
+
|
|
164
|
+
<p>We're excited to inform you that <strong>Dr. {{practitionerName}}</strong> has accepted your invitation to join <strong>{{clinicName}}</strong>.</p>
|
|
165
|
+
|
|
166
|
+
<div class="practitioner-card">
|
|
167
|
+
{{#practitionerPhoto}}
|
|
168
|
+
<img src="{{practitionerPhoto}}" alt="{{practitionerName}}" class="practitioner-photo">
|
|
169
|
+
{{/practitionerPhoto}}
|
|
170
|
+
<div class="practitioner-info">
|
|
171
|
+
<div class="practitioner-name">Dr. {{practitionerName}}</div>
|
|
172
|
+
<div class="practitioner-details">
|
|
173
|
+
{{#practitionerSpecialties}}
|
|
174
|
+
<p><strong>Specialties:</strong> {{practitionerSpecialties}}</p>
|
|
175
|
+
{{/practitionerSpecialties}}
|
|
176
|
+
{{#practitionerExperience}}
|
|
177
|
+
<p><strong>Experience:</strong> {{practitionerExperience}} years</p>
|
|
178
|
+
{{/practitionerExperience}}
|
|
179
|
+
<p><strong>Joined:</strong> {{acceptedDate}}</p>
|
|
180
|
+
</div>
|
|
181
|
+
</div>
|
|
182
|
+
</div>
|
|
183
|
+
|
|
184
|
+
<div class="details-grid">
|
|
185
|
+
<div class="detail-item">
|
|
186
|
+
<div class="detail-label">Status</div>
|
|
187
|
+
<div class="detail-value">✅ Active Team Member</div>
|
|
188
|
+
</div>
|
|
189
|
+
<div class="detail-item">
|
|
190
|
+
<div class="detail-label">Invitation Date</div>
|
|
191
|
+
<div class="detail-value">{{invitationDate}}</div>
|
|
192
|
+
</div>
|
|
193
|
+
</div>
|
|
194
|
+
|
|
195
|
+
<div class="working-hours">
|
|
196
|
+
<h4>📅 Scheduled Working Hours</h4>
|
|
197
|
+
<p>{{workingHours}}</p>
|
|
198
|
+
</div>
|
|
199
|
+
|
|
200
|
+
<div class="action-section">
|
|
201
|
+
<p><strong>Next Steps:</strong></p>
|
|
202
|
+
<a href="{{clinicDashboardUrl}}" class="button">View Clinic Dashboard</a>
|
|
203
|
+
<a href="{{practitionerProfileUrl}}" class="button">View Practitioner Profile</a>
|
|
204
|
+
</div>
|
|
205
|
+
|
|
206
|
+
<p><strong>What happens next?</strong></p>
|
|
207
|
+
<ul>
|
|
208
|
+
<li>Dr. {{practitionerName}} is now visible on your clinic profile</li>
|
|
209
|
+
<li>Patients can book appointments with them during their scheduled hours</li>
|
|
210
|
+
<li>They have access to your clinic's patient management system</li>
|
|
211
|
+
<li>You can manage their schedule and availability from your dashboard</li>
|
|
212
|
+
</ul>
|
|
213
|
+
|
|
214
|
+
<p>Welcome Dr. {{practitionerName}} to the team! 🎊</p>
|
|
215
|
+
|
|
216
|
+
<div class="footer">
|
|
217
|
+
<p>Best regards,<br>
|
|
218
|
+
<strong>The MetaEstetics Team</strong></p>
|
|
219
|
+
<hr>
|
|
220
|
+
<p style="font-size: 12px; color: #999;">
|
|
221
|
+
This is an automated notification from MetaEstetics.
|
|
222
|
+
<br>© {{currentYear}} MetaEstetics. All rights reserved.
|
|
223
|
+
</p>
|
|
224
|
+
</div>
|
|
225
|
+
</div>
|
|
226
|
+
</body>
|
|
227
|
+
</html>
|
|
228
|
+
`;
|
package/src/admin/mailing/practitionerInvite/templates/invite-rejected-notification.template.ts
ADDED
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Email template for notifying clinic admins when a practitioner rejects an invitation
|
|
3
|
+
* This template is sent to the clinic admin when a practitioner declines their invitation
|
|
4
|
+
*/
|
|
5
|
+
export const inviteRejectedNotificationTemplate = `
|
|
6
|
+
<!DOCTYPE html>
|
|
7
|
+
<html lang="en">
|
|
8
|
+
<head>
|
|
9
|
+
<meta charset="UTF-8">
|
|
10
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
11
|
+
<title>Practitioner Invitation Declined - {{practitionerName}}</title>
|
|
12
|
+
<style>
|
|
13
|
+
body {
|
|
14
|
+
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
|
|
15
|
+
line-height: 1.6;
|
|
16
|
+
color: #333;
|
|
17
|
+
max-width: 600px;
|
|
18
|
+
margin: 0 auto;
|
|
19
|
+
padding: 20px;
|
|
20
|
+
background-color: #f4f4f4;
|
|
21
|
+
}
|
|
22
|
+
.container {
|
|
23
|
+
background-color: #ffffff;
|
|
24
|
+
padding: 30px;
|
|
25
|
+
border-radius: 10px;
|
|
26
|
+
box-shadow: 0 0 20px rgba(0,0,0,0.1);
|
|
27
|
+
}
|
|
28
|
+
.header {
|
|
29
|
+
text-align: center;
|
|
30
|
+
margin-bottom: 30px;
|
|
31
|
+
border-bottom: 2px solid #dc3545;
|
|
32
|
+
padding-bottom: 20px;
|
|
33
|
+
}
|
|
34
|
+
.logo {
|
|
35
|
+
font-size: 28px;
|
|
36
|
+
font-weight: bold;
|
|
37
|
+
color: #dc3545;
|
|
38
|
+
margin-bottom: 10px;
|
|
39
|
+
}
|
|
40
|
+
h1 {
|
|
41
|
+
color: #dc3545;
|
|
42
|
+
text-align: center;
|
|
43
|
+
margin-bottom: 20px;
|
|
44
|
+
}
|
|
45
|
+
.notice-badge {
|
|
46
|
+
background-color: #f8d7da;
|
|
47
|
+
color: #721c24;
|
|
48
|
+
padding: 15px;
|
|
49
|
+
border-left: 4px solid #dc3545;
|
|
50
|
+
margin: 20px 0;
|
|
51
|
+
border-radius: 0 5px 5px 0;
|
|
52
|
+
}
|
|
53
|
+
.practitioner-card {
|
|
54
|
+
background-color: #f8f9fa;
|
|
55
|
+
padding: 20px;
|
|
56
|
+
border-radius: 8px;
|
|
57
|
+
margin: 20px 0;
|
|
58
|
+
border: 1px solid #dee2e6;
|
|
59
|
+
}
|
|
60
|
+
.practitioner-photo {
|
|
61
|
+
width: 80px;
|
|
62
|
+
height: 80px;
|
|
63
|
+
border-radius: 50%;
|
|
64
|
+
object-fit: cover;
|
|
65
|
+
float: left;
|
|
66
|
+
margin-right: 15px;
|
|
67
|
+
border: 3px solid #dc3545;
|
|
68
|
+
}
|
|
69
|
+
.practitioner-info {
|
|
70
|
+
overflow: hidden;
|
|
71
|
+
}
|
|
72
|
+
.practitioner-name {
|
|
73
|
+
font-size: 18px;
|
|
74
|
+
font-weight: bold;
|
|
75
|
+
color: #333;
|
|
76
|
+
margin-bottom: 5px;
|
|
77
|
+
}
|
|
78
|
+
.practitioner-details {
|
|
79
|
+
color: #666;
|
|
80
|
+
font-size: 14px;
|
|
81
|
+
line-height: 1.4;
|
|
82
|
+
}
|
|
83
|
+
.details-grid {
|
|
84
|
+
display: grid;
|
|
85
|
+
grid-template-columns: 1fr 1fr;
|
|
86
|
+
gap: 15px;
|
|
87
|
+
margin: 20px 0;
|
|
88
|
+
}
|
|
89
|
+
.detail-item {
|
|
90
|
+
background-color: #f8f9fa;
|
|
91
|
+
padding: 10px;
|
|
92
|
+
border-radius: 5px;
|
|
93
|
+
border-left: 3px solid #dc3545;
|
|
94
|
+
}
|
|
95
|
+
.detail-label {
|
|
96
|
+
font-weight: bold;
|
|
97
|
+
color: #495057;
|
|
98
|
+
font-size: 12px;
|
|
99
|
+
text-transform: uppercase;
|
|
100
|
+
margin-bottom: 5px;
|
|
101
|
+
}
|
|
102
|
+
.detail-value {
|
|
103
|
+
color: #333;
|
|
104
|
+
font-size: 14px;
|
|
105
|
+
}
|
|
106
|
+
.button {
|
|
107
|
+
display: inline-block;
|
|
108
|
+
background-color: #007bff;
|
|
109
|
+
color: white;
|
|
110
|
+
padding: 12px 25px;
|
|
111
|
+
text-decoration: none;
|
|
112
|
+
border-radius: 5px;
|
|
113
|
+
margin: 10px 5px;
|
|
114
|
+
font-weight: bold;
|
|
115
|
+
text-align: center;
|
|
116
|
+
}
|
|
117
|
+
.button.secondary {
|
|
118
|
+
background-color: #6c757d;
|
|
119
|
+
}
|
|
120
|
+
.button:hover {
|
|
121
|
+
opacity: 0.9;
|
|
122
|
+
}
|
|
123
|
+
.action-section {
|
|
124
|
+
text-align: center;
|
|
125
|
+
margin: 30px 0;
|
|
126
|
+
padding: 20px;
|
|
127
|
+
background-color: #e9ecef;
|
|
128
|
+
border-radius: 5px;
|
|
129
|
+
}
|
|
130
|
+
.footer {
|
|
131
|
+
margin-top: 30px;
|
|
132
|
+
padding-top: 20px;
|
|
133
|
+
border-top: 1px solid #eee;
|
|
134
|
+
font-size: 14px;
|
|
135
|
+
color: #666;
|
|
136
|
+
text-align: center;
|
|
137
|
+
}
|
|
138
|
+
.suggestions {
|
|
139
|
+
background-color: #d1ecf1;
|
|
140
|
+
border: 1px solid #bee5eb;
|
|
141
|
+
border-radius: 5px;
|
|
142
|
+
padding: 15px;
|
|
143
|
+
margin: 15px 0;
|
|
144
|
+
}
|
|
145
|
+
.suggestions h4 {
|
|
146
|
+
color: #0c5460;
|
|
147
|
+
margin-top: 0;
|
|
148
|
+
}
|
|
149
|
+
.reason-box {
|
|
150
|
+
background-color: #fff3cd;
|
|
151
|
+
border: 1px solid #ffeaa7;
|
|
152
|
+
border-radius: 5px;
|
|
153
|
+
padding: 15px;
|
|
154
|
+
margin: 15px 0;
|
|
155
|
+
}
|
|
156
|
+
</style>
|
|
157
|
+
</head>
|
|
158
|
+
<body>
|
|
159
|
+
<div class="container">
|
|
160
|
+
<div class="header">
|
|
161
|
+
<div class="logo">MetaEstetics</div>
|
|
162
|
+
<p>Clinic Management System</p>
|
|
163
|
+
</div>
|
|
164
|
+
|
|
165
|
+
<h1>Invitation Update</h1>
|
|
166
|
+
|
|
167
|
+
<div class="notice-badge">
|
|
168
|
+
<strong>❌ Dr. {{practitionerName}} has declined your invitation</strong>
|
|
169
|
+
<p style="margin: 5px 0 0 0;">They will not be joining {{clinicName}} at this time.</p>
|
|
170
|
+
</div>
|
|
171
|
+
|
|
172
|
+
<p>Dear {{clinicAdminName}},</p>
|
|
173
|
+
|
|
174
|
+
<p>We wanted to let you know that <strong>Dr. {{practitionerName}}</strong> has declined your invitation to join <strong>{{clinicName}}</strong>.</p>
|
|
175
|
+
|
|
176
|
+
<div class="practitioner-card">
|
|
177
|
+
{{#practitionerPhoto}}
|
|
178
|
+
<img src="{{practitionerPhoto}}" alt="{{practitionerName}}" class="practitioner-photo">
|
|
179
|
+
{{/practitionerPhoto}}
|
|
180
|
+
<div class="practitioner-info">
|
|
181
|
+
<div class="practitioner-name">Dr. {{practitionerName}}</div>
|
|
182
|
+
<div class="practitioner-details">
|
|
183
|
+
{{#practitionerSpecialties}}
|
|
184
|
+
<p><strong>Specialties:</strong> {{practitionerSpecialties}}</p>
|
|
185
|
+
{{/practitionerSpecialties}}
|
|
186
|
+
<p><strong>Decision Date:</strong> {{rejectedDate}}</p>
|
|
187
|
+
</div>
|
|
188
|
+
</div>
|
|
189
|
+
</div>
|
|
190
|
+
|
|
191
|
+
<div class="details-grid">
|
|
192
|
+
<div class="detail-item">
|
|
193
|
+
<div class="detail-label">Status</div>
|
|
194
|
+
<div class="detail-value">❌ Invitation Declined</div>
|
|
195
|
+
</div>
|
|
196
|
+
<div class="detail-item">
|
|
197
|
+
<div class="detail-label">Original Invitation</div>
|
|
198
|
+
<div class="detail-value">{{invitationDate}}</div>
|
|
199
|
+
</div>
|
|
200
|
+
</div>
|
|
201
|
+
|
|
202
|
+
{{#rejectionReason}}
|
|
203
|
+
<div class="reason-box">
|
|
204
|
+
<h4>📝 Reason Provided:</h4>
|
|
205
|
+
<p>"{{rejectionReason}}"</p>
|
|
206
|
+
</div>
|
|
207
|
+
{{/rejectionReason}}
|
|
208
|
+
|
|
209
|
+
<div class="suggestions">
|
|
210
|
+
<h4>💡 What you can do next:</h4>
|
|
211
|
+
<ul>
|
|
212
|
+
<li><strong>Reach out directly:</strong> Consider contacting Dr. {{practitionerName}} to discuss their concerns</li>
|
|
213
|
+
<li><strong>Adjust your offer:</strong> Review your working hours, compensation, or clinic benefits</li>
|
|
214
|
+
<li><strong>Invite other practitioners:</strong> Look for other qualified professionals in your area</li>
|
|
215
|
+
<li><strong>Try again later:</strong> Their circumstances may change in the future</li>
|
|
216
|
+
</ul>
|
|
217
|
+
</div>
|
|
218
|
+
|
|
219
|
+
<div class="action-section">
|
|
220
|
+
<p><strong>Explore your options:</strong></p>
|
|
221
|
+
<a href="{{findPractitionersUrl}}" class="button">Find More Practitioners</a>
|
|
222
|
+
<a href="{{clinicDashboardUrl}}" class="button secondary">View Dashboard</a>
|
|
223
|
+
</div>
|
|
224
|
+
|
|
225
|
+
<p>Don't let this discourage you! Finding the right team members takes time, and there are many talented practitioners who would be excited to join your clinic.</p>
|
|
226
|
+
|
|
227
|
+
<div class="footer">
|
|
228
|
+
<p>Best regards,<br>
|
|
229
|
+
<strong>The MetaEstetics Team</strong></p>
|
|
230
|
+
<hr>
|
|
231
|
+
<p style="font-size: 12px; color: #999;">
|
|
232
|
+
This is an automated notification from MetaEstetics.
|
|
233
|
+
<br>© {{currentYear}} MetaEstetics. All rights reserved.
|
|
234
|
+
</p>
|
|
235
|
+
<p style="font-size: 12px; color: #999;">
|
|
236
|
+
<strong>Note:</strong> Practitioner contact information is not shared without their consent.
|
|
237
|
+
</p>
|
|
238
|
+
</div>
|
|
239
|
+
</div>
|
|
240
|
+
</body>
|
|
241
|
+
</html>
|
|
242
|
+
`;
|