From ffc75ba1746d91bdbdb8d595d3e9bb59b35e30d6 Mon Sep 17 00:00:00 2001 From: shancheas Date: Tue, 10 Jun 2025 13:28:58 +0700 Subject: [PATCH] feat: integrate WhatsApp notifications for booking registration and rescheduling --- .../managers/create-booking.manager.ts | 17 +++ .../reschedule-verification.manager.ts | 5 +- src/services/whatsapp/whatsapp.service.ts | 112 ++++++++++++++++++ 3 files changed, 133 insertions(+), 1 deletion(-) diff --git a/src/modules/booking-online/order/domain/usecases/managers/create-booking.manager.ts b/src/modules/booking-online/order/domain/usecases/managers/create-booking.manager.ts index 16bbd05..750006b 100644 --- a/src/modules/booking-online/order/domain/usecases/managers/create-booking.manager.ts +++ b/src/modules/booking-online/order/domain/usecases/managers/create-booking.manager.ts @@ -5,6 +5,7 @@ import { TransactionType } from 'src/modules/transaction/transaction/constants'; import { CreateTransactionManager } from 'src/modules/transaction/transaction/domain/usecases/managers/create-transaction.manager'; import { generateInvoiceCodeHelper } from 'src/modules/transaction/transaction/domain/usecases/managers/helpers/generate-invoice-code.helper'; import { mappingRevertTransaction } from 'src/modules/transaction/transaction/domain/usecases/managers/helpers/mapping-transaction.helper'; +import { WhatsappService } from 'src/services/whatsapp/whatsapp.service'; import { v4 as uuidv4 } from 'uuid'; export class CreateBookingManager extends CreateTransactionManager { @@ -43,4 +44,20 @@ export class CreateBookingManager extends CreateTransactionManager { }); return; } + + async afterProcess(): Promise { + const whatsapp = new WhatsappService(); + console.log(`/snap/v4/redirection/${this.data.payment_midtrans_token}`); + console.log(this.data.payment_midtrans_url); + await whatsapp.bookingRegister( + { + phone: this.data.customer_phone, + code: this.data.invoice_code, + name: this.data.customer_name, + time: this.data.booking_date, + id: this.data.id, + }, + `snap/v4/redirection/${this.data.payment_midtrans_token}`, + ); + } } diff --git a/src/modules/booking-online/order/domain/usecases/managers/reschedule-verification.manager.ts b/src/modules/booking-online/order/domain/usecases/managers/reschedule-verification.manager.ts index 168b6f6..3ab8717 100644 --- a/src/modules/booking-online/order/domain/usecases/managers/reschedule-verification.manager.ts +++ b/src/modules/booking-online/order/domain/usecases/managers/reschedule-verification.manager.ts @@ -53,9 +53,12 @@ export class RescheduleVerificationManager { }); const whatsapp = new WhatsappService(); - whatsapp.sendOtpNotification({ + whatsapp.bookingReschedule({ phone: transaction.customer_phone, code: otp.toString(), + name: transaction.customer_name, + time: new Date(request.reschedule_date).getTime(), + id: transaction.id, }); return result; } catch (error) { diff --git a/src/services/whatsapp/whatsapp.service.ts b/src/services/whatsapp/whatsapp.service.ts index cad1b36..3f95eae 100644 --- a/src/services/whatsapp/whatsapp.service.ts +++ b/src/services/whatsapp/whatsapp.service.ts @@ -199,6 +199,118 @@ export class WhatsappService { ); } + async bookingRegister(data: WhatsappBookingCreate, paymentUrl: string) { + const momentDate = moment(data.time); + const fallbackValue = momentDate.locale('id').format('dddd, DD MMMM YYYY'); + + const payload = { + messaging_product: 'whatsapp', + to: phoneNumberOnly(data.phone), // recipient's phone number + type: 'template', + template: { + name: 'booking_register', + language: { + code: 'id', // language code + }, + components: [ + { + type: 'body', + parameters: [ + { + type: 'text', + parameter_name: 'customer', + text: data.name, // replace with name variable + }, + { + type: 'text', + parameter_name: 'booking_date', + text: fallbackValue, + }, + ], + }, + { + type: 'button', + sub_type: 'url', + index: '0', + parameters: [ + { + type: 'text', + text: paymentUrl, // replace with dynamic URL + }, + ], + }, + ], + }, + }; + + const response = await this.sendMessage(payload); + if (response) + Logger.log( + `Notification register Booking for ${data.code} send to ${data.phone}`, + ); + } + + async bookingReschedule(data: WhatsappBookingCreate) { + const momentDate = moment(data.time); + const fallbackValue = momentDate.locale('id').format('dddd, DD MMMM YYYY'); + + const payload = { + messaging_product: 'whatsapp', + to: phoneNumberOnly(data.phone), // recipient's phone number + type: 'template', + template: { + name: 'booking_reschedule', + language: { + code: 'id', // language code + }, + components: [ + { + type: 'body', + parameters: [ + { + type: 'text', + parameter_name: 'customer', + text: data.name, // replace with name variable + }, + { + type: 'text', + parameter_name: 'booking_code', + text: data.code, // replace with queue_code variable + }, + { + type: 'text', + parameter_name: 'booking_date', + text: fallbackValue, + }, + { + type: 'text', + parameter_name: 'otp', + text: data.code, + }, + ], + }, + { + type: 'button', + sub_type: 'copy_code', + index: '0', + parameters: [ + { + type: 'coupon_code', + coupon_code: data.code, + }, + ], + }, + ], + }, + }; + + const response = await this.sendMessage(payload); + if (response) + Logger.log( + `Notification reschedule Booking for ${data.code} send to ${data.phone}`, + ); + } + async sendOtpNotification(data: { phone: string; code: string }) { // Compose the WhatsApp message payload for OTP using Facebook WhatsApp API const payload = {