refactor: modularize notification job creation to support reminder-only flow for recurring appointments

This commit is contained in:
2026-08-02 21:38:32 -03:00
parent 3145beca65
commit f34b99b87b
2 changed files with 158 additions and 34 deletions
+91 -34
View File
@@ -533,47 +533,18 @@ class AppointmentManager implements IAppointmentsManager {
}
//Create jobs for email and whatsapp notifications
if (notification && newAppointment.id) {
const emailContent = await this.tryToSendNotification({
appointmentId: String(newAppointment.id),
sessionUser: String(companyCheck.ownerId),
type: APPOINTMENT_NOTIFICATION_TYPE.CREATION,
channel: "email",
});
const wapContent = await this.tryToSendNotification({
appointmentId: String(newAppointment.id),
sessionUser: String(companyCheck.ownerId),
type: APPOINTMENT_NOTIFICATION_TYPE.CREATION,
channel: "whatsapp",
});
const clientPhoneNumber = await this.getOptionalClientWapNumber(checkClient);
const reminderEmailContent = await this.tryToSendNotification({
appointmentId: String(newAppointment.id),
sessionUser: String(companyCheck.ownerId),
type: APPOINTMENT_NOTIFICATION_TYPE.REMINDER,
channel: "email",
});
const reminderWapContent = await this.tryToSendNotification({
appointmentId: String(newAppointment.id),
sessionUser: String(companyCheck.ownerId),
type: APPOINTMENT_NOTIFICATION_TYPE.REMINDER,
channel: "whatsapp",
});
await this.createCreationNotificationJobs({
if (this.shouldCreateCustomerNotificationJobs(notification, data.repeatId) && newAppointment.id) {
await this.createAppointmentNotificationJobs({
appointmentId: String(newAppointment.id),
companyId: String(companyCheck._id),
clientId: String(checkClient._id),
clientUserId: checkClient.userId ? String(checkClient.userId) : undefined,
clientEmail: checkClient.email,
clientPhoneNumber,
client: checkClient,
companyOwnerId: String(companyCheck.ownerId),
companyName: companyCheck.name,
appointmentStart: new Date(data.start),
emailMessage: emailContent.message,
wapMessage: wapContent.message,
reminderEmailMessage: reminderEmailContent.message,
reminderWapMessage: reminderWapContent.message,
notification,
});
}
@@ -2239,7 +2210,6 @@ public async updateAppointment(data: UpdateAppointmentParams): Promise<void> {
reminderWapMessage: string;
}): Promise<void> {
const systemSubject = `Turno reservado en ${data.companyName}`;
const reminderSystemSubject = `Recordatorio de turno en ${data.companyName}`;
const payload = {
email: data.clientEmail,
@@ -2263,6 +2233,93 @@ public async updateAppointment(data: UpdateAppointmentParams): Promise<void> {
payload,
});
await this.createReminderNotificationJobs(data);
}
private shouldCreateCustomerNotificationJobs(notification: boolean, repeatId?: string): boolean {
return notification || Boolean(repeatId);
}
private async createAppointmentNotificationJobs(data: {
appointmentId: string;
companyId: string;
clientId: string;
clientUserId?: string;
clientEmail?: string;
client: IClientDocument;
companyOwnerId: string;
companyName: string;
appointmentStart: Date;
notification: boolean;
}): Promise<void> {
const clientPhoneNumber = await this.getOptionalClientWapNumber(data.client);
const reminderEmailContent = await this.tryToSendNotification({
appointmentId: data.appointmentId,
sessionUser: data.companyOwnerId,
type: APPOINTMENT_NOTIFICATION_TYPE.REMINDER,
channel: "email",
});
const reminderWapContent = await this.tryToSendNotification({
appointmentId: data.appointmentId,
sessionUser: data.companyOwnerId,
type: APPOINTMENT_NOTIFICATION_TYPE.REMINDER,
channel: "whatsapp",
});
const notificationJobData = {
appointmentId: data.appointmentId,
companyId: data.companyId,
clientId: data.clientId,
clientUserId: data.clientUserId,
clientEmail: data.clientEmail,
clientPhoneNumber,
companyOwnerId: data.companyOwnerId,
companyName: data.companyName,
appointmentStart: data.appointmentStart,
reminderEmailMessage: reminderEmailContent.message,
reminderWapMessage: reminderWapContent.message,
};
if (!data.notification) {
await this.createReminderNotificationJobs(notificationJobData);
return;
}
const emailContent = await this.tryToSendNotification({
appointmentId: data.appointmentId,
sessionUser: data.companyOwnerId,
type: APPOINTMENT_NOTIFICATION_TYPE.CREATION,
channel: "email",
});
const wapContent = await this.tryToSendNotification({
appointmentId: data.appointmentId,
sessionUser: data.companyOwnerId,
type: APPOINTMENT_NOTIFICATION_TYPE.CREATION,
channel: "whatsapp",
});
await this.createCreationNotificationJobs({
...notificationJobData,
emailMessage: emailContent.message,
wapMessage: wapContent.message,
});
}
private async createReminderNotificationJobs(data: {
appointmentId: string;
companyId: string;
clientId: string;
clientUserId?: string;
clientEmail?: string;
clientPhoneNumber?: string;
companyOwnerId: string;
companyName: string;
appointmentStart: Date;
reminderEmailMessage: string;
reminderWapMessage: string;
}): Promise<void> {
const reminderSystemSubject = `Recordatorio de turno en ${data.companyName}`;
await this.jobService.createReminderJobs({
companyId: data.companyId,
clientId: data.clientId,