@blackcode_sa/metaestetics-api 1.15.4 → 1.15.6
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 +5 -0
- package/dist/admin/index.d.ts +5 -0
- package/dist/admin/index.js +61 -49
- package/dist/admin/index.mjs +61 -49
- package/dist/backoffice/index.d.mts +4 -0
- package/dist/backoffice/index.d.ts +4 -0
- package/dist/index.d.mts +4 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +3 -1
- package/dist/index.mjs +3 -1
- package/package.json +1 -1
- package/src/admin/mailing/appointment/appointment.mailing.service.ts +28 -16
- package/src/admin/mailing/clinicWelcome/clinicWelcome.mailing.ts +3 -3
- package/src/admin/mailing/clinicWelcome/templates/welcome.template.ts +8 -8
- package/src/admin/mailing/patientInvite/patientInvite.mailing.ts +3 -3
- package/src/admin/mailing/patientInvite/templates/invitation.template.ts +3 -3
- package/src/admin/mailing/practitionerInvite/existing-practitioner-invite.mailing.ts +1 -1
- package/src/admin/mailing/practitionerInvite/practitionerInvite.mailing.ts +2 -2
- package/src/admin/mailing/practitionerInvite/templates/existing-practitioner-invitation.template.ts +4 -4
- package/src/admin/mailing/practitionerInvite/templates/invite-accepted-notification.template.ts +4 -4
- package/src/admin/mailing/practitionerInvite/templates/invite-rejected-notification.template.ts +4 -4
- package/src/types/practitioner/index.ts +2 -0
- package/src/types/procedure/index.ts +2 -0
- package/src/validations/practitioner.schema.ts +2 -0
|
@@ -39,7 +39,7 @@ const patientAppointmentConfirmedTemplate = `
|
|
|
39
39
|
<table role="presentation" width="100%" cellspacing="0" cellpadding="0" border="0">
|
|
40
40
|
<tr>
|
|
41
41
|
<td>
|
|
42
|
-
<h1 style="margin: 0; font-size: 24px; font-weight: 400; color: #67574A; letter-spacing: 2px; text-transform: uppercase; font-family: Georgia, 'Times New Roman', serif;">
|
|
42
|
+
<h1 style="margin: 0; font-size: 24px; font-weight: 400; color: #67574A; letter-spacing: 2px; text-transform: uppercase; font-family: Georgia, 'Times New Roman', serif;">Metaesthetics</h1>
|
|
43
43
|
</td>
|
|
44
44
|
</tr>
|
|
45
45
|
</table>
|
|
@@ -97,6 +97,7 @@ const patientAppointmentConfirmedTemplate = `
|
|
|
97
97
|
<td>
|
|
98
98
|
<p style="margin: 0 0 2px 0; font-size: 11px; color: #868686; text-transform: uppercase; letter-spacing: 0.5px; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;">Location</p>
|
|
99
99
|
<p style="margin: 0; font-size: 15px; color: #333333; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;">{{clinicName}}</p>
|
|
100
|
+
<p style="margin: 4px 0 0 0; font-size: 13px; color: #555555; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;">{{clinicAddress}}</p>
|
|
100
101
|
</td>
|
|
101
102
|
</tr>
|
|
102
103
|
</table>
|
|
@@ -117,7 +118,7 @@ const patientAppointmentConfirmedTemplate = `
|
|
|
117
118
|
<td style="padding: 20px 24px; background-color: #faf9f7; border-left: 3px solid #a48a76;">
|
|
118
119
|
<p style="margin: 0 0 8px 0; font-size: 13px; font-weight: 600; color: #67574A; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;">Before Your Visit</p>
|
|
119
120
|
<p style="margin: 0; font-size: 14px; color: #555555; line-height: 1.6; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;">
|
|
120
|
-
Please arrive 15 minutes early. If you need to reschedule or cancel, contact us through the
|
|
121
|
+
Please arrive 15 minutes early. If you need to reschedule or cancel, contact us through the Metaesthetics app.
|
|
121
122
|
</p>
|
|
122
123
|
</td>
|
|
123
124
|
</tr>
|
|
@@ -139,7 +140,7 @@ const patientAppointmentConfirmedTemplate = `
|
|
|
139
140
|
<td>
|
|
140
141
|
<p style="margin: 0 0 8px 0; font-size: 14px; font-weight: 500; color: #67574A; font-family: Georgia, 'Times New Roman', serif;">{{clinicName}}</p>
|
|
141
142
|
<p style="margin: 0 0 16px 0; font-size: 13px; color: #868686; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;">Premium Aesthetic Services</p>
|
|
142
|
-
<p style="margin: 0; font-size: 11px; color: #aaaaaa; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;">This is an automated message from
|
|
143
|
+
<p style="margin: 0; font-size: 11px; color: #aaaaaa; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;">This is an automated message from Metaesthetics. Please do not reply directly to this email.</p>
|
|
143
144
|
</td>
|
|
144
145
|
</tr>
|
|
145
146
|
</table>
|
|
@@ -291,7 +292,7 @@ const clinicAppointmentRequestedTemplate = `
|
|
|
291
292
|
<body>
|
|
292
293
|
<div class="email-container">
|
|
293
294
|
<div class="header">
|
|
294
|
-
<div class="logo">
|
|
295
|
+
<div class="logo">Metaesthetics</div>
|
|
295
296
|
<h1>New Appointment Request</h1>
|
|
296
297
|
<div class="subtitle">Requires Your Attention</div>
|
|
297
298
|
</div>
|
|
@@ -344,7 +345,7 @@ const clinicAppointmentRequestedTemplate = `
|
|
|
344
345
|
|
|
345
346
|
<div class="footer">
|
|
346
347
|
<p style="margin: 0 0 10px 0;">
|
|
347
|
-
<strong>
|
|
348
|
+
<strong>Metaesthetics</strong> - Premium Aesthetic Services
|
|
348
349
|
</p>
|
|
349
350
|
<p style="margin: 0; font-size: 12px; color: #999;">
|
|
350
351
|
This is an automated message. Please do not reply to this email.
|
|
@@ -384,7 +385,7 @@ const appointmentCancelledTemplate = `
|
|
|
384
385
|
<table role="presentation" width="100%" cellspacing="0" cellpadding="0" border="0">
|
|
385
386
|
<tr>
|
|
386
387
|
<td>
|
|
387
|
-
<h1 style="margin: 0; font-size: 24px; font-weight: 400; color: #67574A; letter-spacing: 2px; text-transform: uppercase; font-family: Georgia, 'Times New Roman', serif;">
|
|
388
|
+
<h1 style="margin: 0; font-size: 24px; font-weight: 400; color: #67574A; letter-spacing: 2px; text-transform: uppercase; font-family: Georgia, 'Times New Roman', serif;">Metaesthetics</h1>
|
|
388
389
|
</td>
|
|
389
390
|
</tr>
|
|
390
391
|
</table>
|
|
@@ -468,6 +469,7 @@ const appointmentCancelledTemplate = `
|
|
|
468
469
|
<td>
|
|
469
470
|
<p style="margin: 0 0 2px 0; font-size: 11px; color: #999999; text-transform: uppercase; letter-spacing: 0.5px; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;">Location</p>
|
|
470
471
|
<p style="margin: 0; font-size: 15px; color: #888888; text-decoration: line-through; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;">{{clinicName}}</p>
|
|
472
|
+
<p style="margin: 4px 0 0 0; font-size: 13px; color: #999999; text-decoration: line-through; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;">{{clinicAddress}}</p>
|
|
471
473
|
</td>
|
|
472
474
|
</tr>
|
|
473
475
|
</table>
|
|
@@ -488,7 +490,7 @@ const appointmentCancelledTemplate = `
|
|
|
488
490
|
<td style="padding: 24px;">
|
|
489
491
|
<p style="margin: 0 0 8px 0; font-size: 14px; font-weight: 600; color: #00BB38; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;">Book a New Appointment</p>
|
|
490
492
|
<p style="margin: 0; font-size: 14px; color: #555555; line-height: 1.6; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;">
|
|
491
|
-
We'd love to see you again. Open the
|
|
493
|
+
We'd love to see you again. Open the Metaesthetics app to browse available times and book a new appointment.
|
|
492
494
|
</p>
|
|
493
495
|
</td>
|
|
494
496
|
</tr>
|
|
@@ -496,7 +498,7 @@ const appointmentCancelledTemplate = `
|
|
|
496
498
|
|
|
497
499
|
<!-- Support Info -->
|
|
498
500
|
<p style="margin: 0; font-size: 13px; color: #868686; line-height: 1.7; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;">
|
|
499
|
-
If you have any questions about this cancellation, please contact {{clinicName}} through the
|
|
501
|
+
If you have any questions about this cancellation, please contact {{clinicName}} through the Metaesthetics app.
|
|
500
502
|
</p>
|
|
501
503
|
|
|
502
504
|
</td>
|
|
@@ -510,7 +512,7 @@ const appointmentCancelledTemplate = `
|
|
|
510
512
|
<td>
|
|
511
513
|
<p style="margin: 0 0 8px 0; font-size: 14px; font-weight: 500; color: #67574A; font-family: Georgia, 'Times New Roman', serif;">{{clinicName}}</p>
|
|
512
514
|
<p style="margin: 0 0 16px 0; font-size: 13px; color: #868686; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;">Premium Aesthetic Services</p>
|
|
513
|
-
<p style="margin: 0; font-size: 11px; color: #aaaaaa; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;">This is an automated message from
|
|
515
|
+
<p style="margin: 0; font-size: 11px; color: #aaaaaa; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;">This is an automated message from Metaesthetics. Please do not reply directly to this email.</p>
|
|
514
516
|
</td>
|
|
515
517
|
</tr>
|
|
516
518
|
</table>
|
|
@@ -554,7 +556,7 @@ const appointmentRescheduledProposalTemplate = `
|
|
|
554
556
|
<table role="presentation" width="100%" cellspacing="0" cellpadding="0" border="0">
|
|
555
557
|
<tr>
|
|
556
558
|
<td>
|
|
557
|
-
<h1 style="margin: 0; font-size: 24px; font-weight: 400; color: #67574A; letter-spacing: 2px; text-transform: uppercase; font-family: Georgia, 'Times New Roman', serif;">
|
|
559
|
+
<h1 style="margin: 0; font-size: 24px; font-weight: 400; color: #67574A; letter-spacing: 2px; text-transform: uppercase; font-family: Georgia, 'Times New Roman', serif;">Metaesthetics</h1>
|
|
558
560
|
</td>
|
|
559
561
|
</tr>
|
|
560
562
|
</table>
|
|
@@ -639,7 +641,7 @@ const appointmentRescheduledProposalTemplate = `
|
|
|
639
641
|
<td style="padding: 28px;">
|
|
640
642
|
<p style="margin: 0 0 8px 0; font-size: 14px; font-weight: 600; color: #67574A; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;">How to Respond</p>
|
|
641
643
|
<p style="margin: 0; font-size: 14px; color: #555555; line-height: 1.6; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;">
|
|
642
|
-
Open the
|
|
644
|
+
Open the Metaesthetics app to accept or decline this reschedule request. Your appointment will remain pending until you respond.
|
|
643
645
|
</p>
|
|
644
646
|
</td>
|
|
645
647
|
</tr>
|
|
@@ -661,7 +663,7 @@ const appointmentRescheduledProposalTemplate = `
|
|
|
661
663
|
<td>
|
|
662
664
|
<p style="margin: 0 0 8px 0; font-size: 14px; font-weight: 500; color: #67574A; font-family: Georgia, 'Times New Roman', serif;">{{clinicName}}</p>
|
|
663
665
|
<p style="margin: 0 0 16px 0; font-size: 13px; color: #868686; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;">Premium Aesthetic Services</p>
|
|
664
|
-
<p style="margin: 0; font-size: 11px; color: #aaaaaa; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;">This is an automated message from
|
|
666
|
+
<p style="margin: 0; font-size: 11px; color: #aaaaaa; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;">This is an automated message from Metaesthetics. Please do not reply directly to this email.</p>
|
|
665
667
|
</td>
|
|
666
668
|
</tr>
|
|
667
669
|
</table>
|
|
@@ -804,6 +806,13 @@ export class AppointmentMailingService extends BaseMailingService {
|
|
|
804
806
|
}
|
|
805
807
|
}
|
|
806
808
|
|
|
809
|
+
private formatClinicAddress(appointment: Appointment): string {
|
|
810
|
+
const loc = appointment.clinicInfo?.location;
|
|
811
|
+
if (!loc) return '';
|
|
812
|
+
const parts = [loc.address, loc.postalCode, loc.city, loc.country].filter(Boolean);
|
|
813
|
+
return parts.join(', ');
|
|
814
|
+
}
|
|
815
|
+
|
|
807
816
|
async sendAppointmentConfirmedEmail(data: AppointmentConfirmationEmailData): Promise<any> {
|
|
808
817
|
Logger.info(
|
|
809
818
|
`[AppointmentMailingService] Preparing to send appointment confirmation email to ${data.recipientRole}: ${data.recipientProfile.id}`,
|
|
@@ -846,13 +855,14 @@ export class AppointmentMailingService extends BaseMailingService {
|
|
|
846
855
|
appointmentTime: `${formattedTime} (${timezoneName})`,
|
|
847
856
|
practitionerName: data.appointment.practitionerInfo.name,
|
|
848
857
|
clinicName: data.appointment.clinicInfo.name,
|
|
858
|
+
clinicAddress: this.formatClinicAddress(data.appointment),
|
|
849
859
|
};
|
|
850
860
|
|
|
851
861
|
const html = this.renderTemplate(patientAppointmentConfirmedTemplate, templateVariables);
|
|
852
862
|
const subject = data.options?.customSubject || 'Your Appointment is Confirmed!';
|
|
853
863
|
const fromAddress =
|
|
854
864
|
data.options?.fromAddress ||
|
|
855
|
-
`
|
|
865
|
+
`Metaesthetics <no-reply@${data.options?.mailgunDomain || this.DEFAULT_MAILGUN_DOMAIN}>`;
|
|
856
866
|
const domainToSendFrom = data.options?.mailgunDomain || this.DEFAULT_MAILGUN_DOMAIN;
|
|
857
867
|
|
|
858
868
|
const mailgunSendData = {
|
|
@@ -930,7 +940,7 @@ export class AppointmentMailingService extends BaseMailingService {
|
|
|
930
940
|
const subject = data.options?.customSubject || 'New Appointment Request Received';
|
|
931
941
|
const fromAddress =
|
|
932
942
|
data.options?.fromAddress ||
|
|
933
|
-
`
|
|
943
|
+
`Metaesthetics <no-reply@${data.options?.mailgunDomain || this.DEFAULT_MAILGUN_DOMAIN}>`;
|
|
934
944
|
const domainToSendFrom = data.options?.mailgunDomain || this.DEFAULT_MAILGUN_DOMAIN;
|
|
935
945
|
|
|
936
946
|
const mailgunSendData = {
|
|
@@ -1050,6 +1060,7 @@ export class AppointmentMailingService extends BaseMailingService {
|
|
|
1050
1060
|
appointmentTime: `${formattedTime} (${timezoneName})`,
|
|
1051
1061
|
practitionerName: data.appointment.practitionerInfo.name,
|
|
1052
1062
|
clinicName: data.appointment.clinicInfo.name,
|
|
1063
|
+
clinicAddress: this.formatClinicAddress(data.appointment),
|
|
1053
1064
|
cancelledByDisplay,
|
|
1054
1065
|
};
|
|
1055
1066
|
|
|
@@ -1076,7 +1087,7 @@ export class AppointmentMailingService extends BaseMailingService {
|
|
|
1076
1087
|
`Appointment Cancelled: ${data.appointment.procedureInfo.name}`;
|
|
1077
1088
|
const fromAddress =
|
|
1078
1089
|
data.options?.fromAddress ||
|
|
1079
|
-
`
|
|
1090
|
+
`Metaesthetics <no-reply@${data.options?.mailgunDomain || this.DEFAULT_MAILGUN_DOMAIN}>`;
|
|
1080
1091
|
const domainToSendFrom = data.options?.mailgunDomain || this.DEFAULT_MAILGUN_DOMAIN;
|
|
1081
1092
|
|
|
1082
1093
|
const mailgunSendData = {
|
|
@@ -1175,6 +1186,7 @@ export class AppointmentMailingService extends BaseMailingService {
|
|
|
1175
1186
|
procedureName: data.appointment.procedureInfo.name,
|
|
1176
1187
|
practitionerName: data.appointment.practitionerInfo.name,
|
|
1177
1188
|
clinicName: data.appointment.clinicInfo.name,
|
|
1189
|
+
clinicAddress: this.formatClinicAddress(data.appointment),
|
|
1178
1190
|
previousDate: previousFormattedDate,
|
|
1179
1191
|
previousTime: `${previousFormattedTime} (${previousTimezoneName})`,
|
|
1180
1192
|
newDate: newFormattedDate,
|
|
@@ -1187,7 +1199,7 @@ export class AppointmentMailingService extends BaseMailingService {
|
|
|
1187
1199
|
`Action Required: Reschedule Proposal for Your ${data.appointment.procedureInfo.name} Appointment`;
|
|
1188
1200
|
const fromAddress =
|
|
1189
1201
|
data.options?.fromAddress ||
|
|
1190
|
-
`
|
|
1202
|
+
`Metaesthetics <no-reply@${data.options?.mailgunDomain || this.DEFAULT_MAILGUN_DOMAIN}>`;
|
|
1191
1203
|
const domainToSendFrom = data.options?.mailgunDomain || this.DEFAULT_MAILGUN_DOMAIN;
|
|
1192
1204
|
|
|
1193
1205
|
const mailgunSendData = {
|
|
@@ -48,7 +48,7 @@ export class ClinicWelcomeMailingService extends BaseMailingService {
|
|
|
48
48
|
"https://app.metaesthetics.net/dashboard";
|
|
49
49
|
private readonly DEFAULT_SUPPORT_EMAIL = "support@metaesthetics.net";
|
|
50
50
|
private readonly DEFAULT_SUBJECT =
|
|
51
|
-
"Welcome to
|
|
51
|
+
"Welcome to Metaesthetics - Your Clinic Registration is Complete";
|
|
52
52
|
private readonly DEFAULT_MAILGUN_DOMAIN = "mg.metaesthetics.net";
|
|
53
53
|
|
|
54
54
|
/**
|
|
@@ -97,7 +97,7 @@ export class ClinicWelcomeMailingService extends BaseMailingService {
|
|
|
97
97
|
// Determine 'from' address
|
|
98
98
|
const fromAddress =
|
|
99
99
|
data.options?.fromAddress ||
|
|
100
|
-
`
|
|
100
|
+
`Metaesthetics <no-reply@${
|
|
101
101
|
data.options?.mailgunDomain || this.DEFAULT_MAILGUN_DOMAIN
|
|
102
102
|
}>`;
|
|
103
103
|
|
|
@@ -244,7 +244,7 @@ export class ClinicWelcomeMailingService extends BaseMailingService {
|
|
|
244
244
|
Logger.warn(
|
|
245
245
|
"[ClinicWelcomeMailingService] No fromAddress provided, using default"
|
|
246
246
|
);
|
|
247
|
-
mailgunConfig.fromAddress = `
|
|
247
|
+
mailgunConfig.fromAddress = `Metaesthetics <no-reply@${this.DEFAULT_MAILGUN_DOMAIN}>`;
|
|
248
248
|
}
|
|
249
249
|
|
|
250
250
|
// Prepare email data
|
|
@@ -9,7 +9,7 @@ export const clinicWelcomeTemplate = `
|
|
|
9
9
|
<head>
|
|
10
10
|
<meta charset="UTF-8">
|
|
11
11
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
12
|
-
<title>Welcome to
|
|
12
|
+
<title>Welcome to Metaesthetics</title>
|
|
13
13
|
<!--[if mso]>
|
|
14
14
|
<noscript>
|
|
15
15
|
<xml>
|
|
@@ -32,7 +32,7 @@ export const clinicWelcomeTemplate = `
|
|
|
32
32
|
<table role="presentation" width="100%" cellspacing="0" cellpadding="0" border="0">
|
|
33
33
|
<tr>
|
|
34
34
|
<td>
|
|
35
|
-
<h1 style="margin: 0; font-size: 24px; font-weight: 400; color: #67574A; letter-spacing: 2px; text-transform: uppercase; font-family: Georgia, 'Times New Roman', serif;">
|
|
35
|
+
<h1 style="margin: 0; font-size: 24px; font-weight: 400; color: #67574A; letter-spacing: 2px; text-transform: uppercase; font-family: Georgia, 'Times New Roman', serif;">Metaesthetics</h1>
|
|
36
36
|
</td>
|
|
37
37
|
</tr>
|
|
38
38
|
</table>
|
|
@@ -45,7 +45,7 @@ export const clinicWelcomeTemplate = `
|
|
|
45
45
|
<table role="presentation" width="100%" cellspacing="0" cellpadding="0" border="0" style="background-color: #00BB38;">
|
|
46
46
|
<tr>
|
|
47
47
|
<td style="padding: 20px 48px;">
|
|
48
|
-
<p style="margin: 0; font-size: 13px; font-weight: 600; color: #ffffff; letter-spacing: 1.5px; text-transform: uppercase; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;">Welcome to
|
|
48
|
+
<p style="margin: 0; font-size: 13px; font-weight: 600; color: #ffffff; letter-spacing: 1.5px; text-transform: uppercase; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;">Welcome to Metaesthetics</p>
|
|
49
49
|
</td>
|
|
50
50
|
</tr>
|
|
51
51
|
</table>
|
|
@@ -62,7 +62,7 @@ export const clinicWelcomeTemplate = `
|
|
|
62
62
|
</p>
|
|
63
63
|
|
|
64
64
|
<p style="margin: 0 0 32px 0; font-size: 16px; color: #555555; line-height: 1.7; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;">
|
|
65
|
-
Thank you for registering <strong style="color: #67574A;">{{clinicGroupName}}</strong> with
|
|
65
|
+
Thank you for registering <strong style="color: #67574A;">{{clinicGroupName}}</strong> with Metaesthetics. Your account has been successfully created and you're now ready to start managing your aesthetic practice.
|
|
66
66
|
</p>
|
|
67
67
|
|
|
68
68
|
<!-- Account Details Card -->
|
|
@@ -185,7 +185,7 @@ export const clinicWelcomeTemplate = `
|
|
|
185
185
|
|
|
186
186
|
<!-- Thank You -->
|
|
187
187
|
<p style="margin: 0; font-size: 14px; color: #868686; line-height: 1.7; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;">
|
|
188
|
-
Thank you for choosing
|
|
188
|
+
Thank you for choosing Metaesthetics. We look forward to supporting your practice.
|
|
189
189
|
</p>
|
|
190
190
|
|
|
191
191
|
</td>
|
|
@@ -197,9 +197,9 @@ export const clinicWelcomeTemplate = `
|
|
|
197
197
|
<table role="presentation" width="100%" cellspacing="0" cellpadding="0" border="0">
|
|
198
198
|
<tr>
|
|
199
199
|
<td>
|
|
200
|
-
<p style="margin: 0 0 8px 0; font-size: 14px; font-weight: 500; color: #67574A; font-family: Georgia, 'Times New Roman', serif;">
|
|
200
|
+
<p style="margin: 0 0 8px 0; font-size: 14px; font-weight: 500; color: #67574A; font-family: Georgia, 'Times New Roman', serif;">Metaesthetics</p>
|
|
201
201
|
<p style="margin: 0 0 16px 0; font-size: 13px; color: #868686; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;">Premium Aesthetic Services Platform</p>
|
|
202
|
-
<p style="margin: 0; font-size: 11px; color: #aaaaaa; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;">This is an automated message from
|
|
202
|
+
<p style="margin: 0; font-size: 11px; color: #aaaaaa; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;">This is an automated message from Metaesthetics. Please do not reply directly to this email.</p>
|
|
203
203
|
</td>
|
|
204
204
|
</tr>
|
|
205
205
|
</table>
|
|
@@ -212,7 +212,7 @@ export const clinicWelcomeTemplate = `
|
|
|
212
212
|
<table role="presentation" width="600" cellspacing="0" cellpadding="0" border="0" style="max-width: 600px;">
|
|
213
213
|
<tr>
|
|
214
214
|
<td style="padding: 24px 48px; text-align: center;">
|
|
215
|
-
<p style="margin: 0; font-size: 11px; color: #aaaaaa; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;">© {{currentYear}}
|
|
215
|
+
<p style="margin: 0; font-size: 11px; color: #aaaaaa; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;">© {{currentYear}} Metaesthetics. All rights reserved.</p>
|
|
216
216
|
</td>
|
|
217
217
|
</tr>
|
|
218
218
|
</table>
|
|
@@ -69,7 +69,7 @@ export class PatientInviteMailingService extends BaseMailingService {
|
|
|
69
69
|
private readonly DEFAULT_REGISTRATION_URL =
|
|
70
70
|
"https://metaesthetics.net/patient/register";
|
|
71
71
|
private readonly DEFAULT_SUBJECT =
|
|
72
|
-
"Claim Your Patient Profile -
|
|
72
|
+
"Claim Your Patient Profile - Metaesthetics";
|
|
73
73
|
private readonly DEFAULT_MAILGUN_DOMAIN = "mg.metaesthetics.net";
|
|
74
74
|
|
|
75
75
|
/**
|
|
@@ -120,7 +120,7 @@ export class PatientInviteMailingService extends BaseMailingService {
|
|
|
120
120
|
// Determine 'from' address
|
|
121
121
|
const fromAddress =
|
|
122
122
|
data.options?.fromAddress ||
|
|
123
|
-
`
|
|
123
|
+
`Metaesthetics <no-reply@${
|
|
124
124
|
data.options?.mailgunDomain || this.DEFAULT_MAILGUN_DOMAIN
|
|
125
125
|
}>`;
|
|
126
126
|
|
|
@@ -358,7 +358,7 @@ export class PatientInviteMailingService extends BaseMailingService {
|
|
|
358
358
|
Logger.warn(
|
|
359
359
|
"[PatientInviteMailingService] No fromAddress provided, using default"
|
|
360
360
|
);
|
|
361
|
-
mailgunConfig.fromAddress = `
|
|
361
|
+
mailgunConfig.fromAddress = `Metaesthetics <no-reply@${this.DEFAULT_MAILGUN_DOMAIN}>`;
|
|
362
362
|
}
|
|
363
363
|
|
|
364
364
|
// Prepare email data
|
|
@@ -59,7 +59,7 @@ export const patientInvitationTemplate = `
|
|
|
59
59
|
<body>
|
|
60
60
|
<div class="container">
|
|
61
61
|
<div class="header">
|
|
62
|
-
<h1>Welcome to
|
|
62
|
+
<h1>Welcome to Metaesthetics</h1>
|
|
63
63
|
</div>
|
|
64
64
|
<div class="content">
|
|
65
65
|
<p>Hello {{patientName}},</p>
|
|
@@ -86,7 +86,7 @@ export const patientInvitationTemplate = `
|
|
|
86
86
|
|
|
87
87
|
<p>To create your account:</p>
|
|
88
88
|
<ol>
|
|
89
|
-
<li>Download the <strong>
|
|
89
|
+
<li>Download the <strong>Metaesthetics</strong> app from the App Store (iOS) or Google Play Store (Android)</li>
|
|
90
90
|
<li>Open the app and create an account using your email address</li>
|
|
91
91
|
<li>When prompted, enter the token shown above</li>
|
|
92
92
|
<li>Your profile will be automatically linked to your new account</li>
|
|
@@ -96,7 +96,7 @@ export const patientInvitationTemplate = `
|
|
|
96
96
|
</div>
|
|
97
97
|
<div class="footer">
|
|
98
98
|
<p>This is an automated message from {{clinicName}}. Please do not reply to this email.</p>
|
|
99
|
-
<p>© {{currentYear}}
|
|
99
|
+
<p>© {{currentYear}} Metaesthetics. All rights reserved.</p>
|
|
100
100
|
</div>
|
|
101
101
|
</div>
|
|
102
102
|
</body>
|
|
@@ -114,7 +114,7 @@ export interface ClinicAdminNotificationData {
|
|
|
114
114
|
export class ExistingPractitionerInviteMailingService extends BaseMailingService {
|
|
115
115
|
private readonly DEFAULT_MAILGUN_DOMAIN = "mg.metaesthetics.net";
|
|
116
116
|
private readonly DEFAULT_FROM_ADDRESS =
|
|
117
|
-
"
|
|
117
|
+
"Metaesthetics <no-reply@mg.metaesthetics.net>";
|
|
118
118
|
|
|
119
119
|
/**
|
|
120
120
|
* Constructor for ExistingPractitionerInviteMailingService
|
|
@@ -113,7 +113,7 @@ export class PractitionerInviteMailingService extends BaseMailingService {
|
|
|
113
113
|
// Determine 'from' address
|
|
114
114
|
const fromAddress =
|
|
115
115
|
data.options?.fromAddress ||
|
|
116
|
-
`
|
|
116
|
+
`Metaesthetics <no-reply@${
|
|
117
117
|
data.options?.mailgunDomain || this.DEFAULT_MAILGUN_DOMAIN
|
|
118
118
|
}>`;
|
|
119
119
|
|
|
@@ -338,7 +338,7 @@ export class PractitionerInviteMailingService extends BaseMailingService {
|
|
|
338
338
|
Logger.warn(
|
|
339
339
|
"[PractitionerInviteMailingService] No fromAddress provided, using default"
|
|
340
340
|
);
|
|
341
|
-
mailgunConfig.fromAddress = `
|
|
341
|
+
mailgunConfig.fromAddress = `Metaesthetics <no-reply@${this.DEFAULT_MAILGUN_DOMAIN}>`;
|
|
342
342
|
}
|
|
343
343
|
|
|
344
344
|
// Prepare email data using typed data
|
package/src/admin/mailing/practitionerInvite/templates/existing-practitioner-invitation.template.ts
CHANGED
|
@@ -97,7 +97,7 @@ export const existingPractitionerInvitationTemplate = `
|
|
|
97
97
|
<body>
|
|
98
98
|
<div class="container">
|
|
99
99
|
<div class="header">
|
|
100
|
-
<div class="logo">
|
|
100
|
+
<div class="logo">Metaesthetics</div>
|
|
101
101
|
<p>Professional Medical Network</p>
|
|
102
102
|
</div>
|
|
103
103
|
|
|
@@ -141,12 +141,12 @@ export const existingPractitionerInvitationTemplate = `
|
|
|
141
141
|
|
|
142
142
|
<div class="footer">
|
|
143
143
|
<p>Best regards,<br>
|
|
144
|
-
<strong>The
|
|
144
|
+
<strong>The Metaesthetics Team</strong></p>
|
|
145
145
|
<p>This invitation will expire on {{expirationDate}}. Please respond before this date.</p>
|
|
146
146
|
<hr>
|
|
147
147
|
<p style="font-size: 12px; color: #999;">
|
|
148
|
-
This is an automated message from
|
|
149
|
-
<br>© {{currentYear}}
|
|
148
|
+
This is an automated message from Metaesthetics. If you received this email in error, please ignore it.
|
|
149
|
+
<br>© {{currentYear}} Metaesthetics. All rights reserved.
|
|
150
150
|
</p>
|
|
151
151
|
</div>
|
|
152
152
|
</div>
|
package/src/admin/mailing/practitionerInvite/templates/invite-accepted-notification.template.ts
CHANGED
|
@@ -148,7 +148,7 @@ export const inviteAcceptedNotificationTemplate = `
|
|
|
148
148
|
<body>
|
|
149
149
|
<div class="container">
|
|
150
150
|
<div class="header">
|
|
151
|
-
<div class="logo">
|
|
151
|
+
<div class="logo">Metaesthetics</div>
|
|
152
152
|
<p>Clinic Management System</p>
|
|
153
153
|
</div>
|
|
154
154
|
|
|
@@ -215,11 +215,11 @@ export const inviteAcceptedNotificationTemplate = `
|
|
|
215
215
|
|
|
216
216
|
<div class="footer">
|
|
217
217
|
<p>Best regards,<br>
|
|
218
|
-
<strong>The
|
|
218
|
+
<strong>The Metaesthetics Team</strong></p>
|
|
219
219
|
<hr>
|
|
220
220
|
<p style="font-size: 12px; color: #999;">
|
|
221
|
-
This is an automated notification from
|
|
222
|
-
<br>© {{currentYear}}
|
|
221
|
+
This is an automated notification from Metaesthetics.
|
|
222
|
+
<br>© {{currentYear}} Metaesthetics. All rights reserved.
|
|
223
223
|
</p>
|
|
224
224
|
</div>
|
|
225
225
|
</div>
|
package/src/admin/mailing/practitionerInvite/templates/invite-rejected-notification.template.ts
CHANGED
|
@@ -158,7 +158,7 @@ export const inviteRejectedNotificationTemplate = `
|
|
|
158
158
|
<body>
|
|
159
159
|
<div class="container">
|
|
160
160
|
<div class="header">
|
|
161
|
-
<div class="logo">
|
|
161
|
+
<div class="logo">Metaesthetics</div>
|
|
162
162
|
<p>Clinic Management System</p>
|
|
163
163
|
</div>
|
|
164
164
|
|
|
@@ -226,11 +226,11 @@ export const inviteRejectedNotificationTemplate = `
|
|
|
226
226
|
|
|
227
227
|
<div class="footer">
|
|
228
228
|
<p>Best regards,<br>
|
|
229
|
-
<strong>The
|
|
229
|
+
<strong>The Metaesthetics Team</strong></p>
|
|
230
230
|
<hr>
|
|
231
231
|
<p style="font-size: 12px; color: #999;">
|
|
232
|
-
This is an automated notification from
|
|
233
|
-
<br>© {{currentYear}}
|
|
232
|
+
This is an automated notification from Metaesthetics.
|
|
233
|
+
<br>© {{currentYear}} Metaesthetics. All rights reserved.
|
|
234
234
|
</p>
|
|
235
235
|
<p style="font-size: 12px; color: #999;">
|
|
236
236
|
<strong>Note:</strong> Practitioner contact information is not shared without their consent.
|
|
@@ -171,6 +171,8 @@ export interface ProcedureSummaryInfo {
|
|
|
171
171
|
brandName?: string; // Added: Name of the brand used (if applicable)
|
|
172
172
|
productName?: string; // Added: Name of the product used (if applicable)
|
|
173
173
|
price: number;
|
|
174
|
+
priceMin?: number;
|
|
175
|
+
priceMax?: number;
|
|
174
176
|
pricingMeasure: PricingMeasure;
|
|
175
177
|
currency: Currency;
|
|
176
178
|
duration: number;
|
|
@@ -47,6 +47,8 @@ export const practitionerCertificationSchema = z.object({
|
|
|
47
47
|
issueDate: z.instanceof(Timestamp).or(z.date()),
|
|
48
48
|
expiryDate: z.instanceof(Timestamp).or(z.date()).optional().nullable(),
|
|
49
49
|
verificationStatus: z.enum(["pending", "verified", "rejected"]),
|
|
50
|
+
diploma: z.string().max(200).optional(),
|
|
51
|
+
diplomaNumber: z.string().max(100).optional(),
|
|
50
52
|
});
|
|
51
53
|
|
|
52
54
|
/**
|