@blackcode_sa/metaestetics-api 1.15.4 → 1.15.5

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.
@@ -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;">MetaEstetics</h1>
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 MetaEstetics app.
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 MetaEstetics. Please do not reply directly to this email.</p>
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">MetaEstetics</div>
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>MetaEstetics</strong> - Premium Aesthetic Services
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;">MetaEstetics</h1>
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 MetaEstetics app to browse available times and book a new appointment.
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 MetaEstetics app.
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 MetaEstetics. Please do not reply directly to this email.</p>
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;">MetaEstetics</h1>
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 MetaEstetics app to accept or decline this reschedule request. Your appointment will remain pending until you respond.
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 MetaEstetics. Please do not reply directly to this email.</p>
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
- `MetaEstetics <no-reply@${data.options?.mailgunDomain || this.DEFAULT_MAILGUN_DOMAIN}>`;
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
- `MetaEstetics <no-reply@${data.options?.mailgunDomain || this.DEFAULT_MAILGUN_DOMAIN}>`;
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
- `MetaEstetics <no-reply@${data.options?.mailgunDomain || this.DEFAULT_MAILGUN_DOMAIN}>`;
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
- `MetaEstetics <no-reply@${data.options?.mailgunDomain || this.DEFAULT_MAILGUN_DOMAIN}>`;
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 MetaEsthetics - Your Clinic Registration is Complete";
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
- `MetaEsthetics <no-reply@${
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 = `MetaEsthetics <no-reply@${this.DEFAULT_MAILGUN_DOMAIN}>`;
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 MetaEsthetics</title>
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;">MetaEsthetics</h1>
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 MetaEsthetics</p>
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 MetaEsthetics. Your account has been successfully created and you're now ready to start managing your aesthetic practice.
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 MetaEsthetics. We look forward to supporting your practice.
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;">MetaEsthetics</p>
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 MetaEsthetics. Please do not reply directly to this email.</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 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;">&copy; {{currentYear}} MetaEsthetics. All rights reserved.</p>
215
+ <p style="margin: 0; font-size: 11px; color: #aaaaaa; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;">&copy; {{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 - MetaEsthetics";
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
- `MetaEsthetics <no-reply@${
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 = `MetaEsthetics <no-reply@${this.DEFAULT_MAILGUN_DOMAIN}>`;
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 MetaEsthetics</h1>
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>MetaEsthetics</strong> app from the App Store (iOS) or Google Play Store (Android)</li>
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>&copy; {{currentYear}} MetaEsthetics. All rights reserved.</p>
99
+ <p>&copy; {{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
- "MetaEstetics <no-reply@mg.metaesthetics.net>";
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
- `MetaEstetics <no-reply@${
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 = `MetaEstetics <no-reply@${this.DEFAULT_MAILGUN_DOMAIN}>`;
341
+ mailgunConfig.fromAddress = `Metaesthetics <no-reply@${this.DEFAULT_MAILGUN_DOMAIN}>`;
342
342
  }
343
343
 
344
344
  // Prepare email data using typed data
@@ -97,7 +97,7 @@ export const existingPractitionerInvitationTemplate = `
97
97
  <body>
98
98
  <div class="container">
99
99
  <div class="header">
100
- <div class="logo">MetaEstetics</div>
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 MetaEstetics Team</strong></p>
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 MetaEstetics. If you received this email in error, please ignore it.
149
- <br>© {{currentYear}} MetaEstetics. All rights reserved.
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>
@@ -148,7 +148,7 @@ export const inviteAcceptedNotificationTemplate = `
148
148
  <body>
149
149
  <div class="container">
150
150
  <div class="header">
151
- <div class="logo">MetaEstetics</div>
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 MetaEstetics Team</strong></p>
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 MetaEstetics.
222
- <br>© {{currentYear}} MetaEstetics. All rights reserved.
221
+ This is an automated notification from Metaesthetics.
222
+ <br>© {{currentYear}} Metaesthetics. All rights reserved.
223
223
  </p>
224
224
  </div>
225
225
  </div>
@@ -158,7 +158,7 @@ export const inviteRejectedNotificationTemplate = `
158
158
  <body>
159
159
  <div class="container">
160
160
  <div class="header">
161
- <div class="logo">MetaEstetics</div>
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 MetaEstetics Team</strong></p>
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 MetaEstetics.
233
- <br>© {{currentYear}} MetaEstetics. All rights reserved.
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.
@@ -43,6 +43,8 @@ export interface PractitionerCertification {
43
43
  issueDate: Timestamp | Date;
44
44
  expiryDate?: Timestamp | Date | null;
45
45
  verificationStatus: "pending" | "verified" | "rejected";
46
+ diploma?: string;
47
+ diplomaNumber?: string;
46
48
  }
47
49
 
48
50
  /**
@@ -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
  /**