PluginProbe
Yatra – Travel Booking & Tour Operator Software / 3.0.15
Yatra – Travel Booking & Tour Operator Software v3.0.15
3.0.15 3.0.14 3.0.14.1 3.0.14.2 3.0.12 3.0.13 3.0.11 3.0.10 3.0.9 3.0.8 3.0.7 3.0.6 3.0.5 3.0.5.1 3.0.4 3.0.3 3.0.2.9 3.0.2.7 3.0.2.8 3.0.2.6 trunk 1.0.0 2.0.0 2.0.1 2.0.10 All 83 releases
yatra / app / Services / NotificationService.php

NotificationService.php in Yatra – Travel Booking & Tour Operator Software 3.0.15, at app/Services/NotificationService.php

214 lines 7.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Notification Service
4 *
5 * Admin / customer emails for booking lifecycle events. Enable/disable and copy are controlled
6 * under Yatra → Email → Templates (settings-backed flags), not Settings → Notifications.
7 *
8 * @package Yatra\Services
9 * @since 3.0.0
10 */
11
12 declare(strict_types=1);
13
14 namespace Yatra\Services;
15
16 use Yatra\Repositories\BookingRepository;
17
18 class NotificationService
19 {
20 /**
21 * Send booking created notification (admin: {@see TransactionalEmailTemplateService::TYPE_ADMIN_NEW_BOOKING}).
22 */
23 public static function sendBookingCreatedNotification(int $bookingId, $bookingData): void
24 {
25 self::notifyAdminNewBooking($bookingId, $bookingData);
26 }
27
28 /**
29 * Send payment completed notification (admin + customer templates).
30 */
31 public static function sendPaymentCompletedNotification(array $paymentData): void
32 {
33 self::notifyAdminPaymentReceived($paymentData);
34 self::notifyCustomerPaymentReceived($paymentData);
35 }
36
37 /**
38 * Send booking cancellation notification (admin template; customer email uses transactional templates from BookingService).
39 */
40 public static function sendCancellationNotification(int $bookingId, $bookingData): void
41 {
42 self::notifyAdminCancellation($bookingId, $bookingData);
43 }
44
45 /**
46 * Resend just the customer payment-received email (part- or full-payment
47 * template, exactly as the automated flow chooses it). Public entry for the
48 * admin "resend email" action.
49 */
50 public static function resendCustomerPaymentEmail(array $paymentData): void
51 {
52 self::notifyCustomerPaymentReceived($paymentData);
53 }
54
55 /**
56 * Resend just the admin payment-received notification. Public entry for the
57 * admin "resend email" action.
58 */
59 public static function resendAdminPaymentEmail(array $paymentData): void
60 {
61 self::notifyAdminPaymentReceived($paymentData);
62 }
63
64 /**
65 * Notify admin of new booking
66 */
67 private static function notifyAdminNewBooking(int $bookingId, $bookingData): void
68 {
69 if (!apply_filters('yatra_notify_admin_new_booking', true, $bookingId, $bookingData)) {
70 return;
71 }
72
73 $admin_email = SettingsService::getString('admin_email', (string) get_option('admin_email', ''));
74 if ($admin_email === '' || !is_email($admin_email)) {
75 return;
76 }
77
78 $repository = new BookingRepository();
79 $booking = $repository->findWithTrip($bookingId);
80 if (!$booking) {
81 return;
82 }
83
84 $adminNotifyContext = [
85 'booking_id' => $bookingId,
86 'reference' => $booking->reference ?? '',
87 'source' => 'yatra_booking_created',
88 ];
89 if (!apply_filters('yatra_send_checkout_admin_notification', true, $adminNotifyContext)) {
90 return;
91 }
92
93 $variables = TransactionalEmailTemplateService::variablesFromBooking($booking);
94
95 TransactionalEmailTemplateService::sendIfEnabled(
96 TransactionalEmailTemplateService::TYPE_ADMIN_NEW_BOOKING,
97 $admin_email,
98 $variables
99 );
100 }
101
102 /**
103 * Notify admin of payment received (template: admin_payment_received).
104 */
105 private static function notifyAdminPaymentReceived(array $paymentData): void
106 {
107 $admin_email = SettingsService::getString('admin_email', (string) get_option('admin_email', ''));
108 if ($admin_email === '' || !is_email($admin_email)) {
109 return;
110 }
111
112 $bookingRepository = new BookingRepository();
113 $booking = $bookingRepository->findWithTrip((int) ($paymentData['booking_id'] ?? 0));
114 if (!$booking) {
115 return;
116 }
117
118 $vars = TransactionalEmailTemplateService::variablesFromBooking($booking);
119 $vars['payment_amount_formatted'] = yatra_format_price((float) ($paymentData['amount'] ?? 0));
120 $vars['payment_method'] = (string) ($paymentData['payment_method'] ?? __('Online payment', 'yatra'));
121 $vars['transaction_id'] = (string) ($paymentData['transaction_id'] ?? '');
122
123 TransactionalEmailTemplateService::sendIfEnabled(
124 TransactionalEmailTemplateService::TYPE_ADMIN_PAYMENT_RECEIVED,
125 $admin_email,
126 $vars
127 );
128 }
129
130 /**
131 * Which payment email to send: the part-payment template or the full one.
132 *
133 * Defaults to the long-standing single template. The part-payment template
134 * is used only when ALL of these hold, so an existing site sees no change
135 * until its operator opts in:
136 *
137 * 1. a balance is genuinely still outstanding on the booking,
138 * 2. deposits / partial payments are switched on at all, and
139 * 3. the operator has enabled the separate part-payment template —
140 * either the free "Partial Payment Received" toggle, or (Pro Email
141 * Automation) the active "Partial Payment Received" DB template. On a
142 * Pro site the Email → Templates switch only writes the Pro row, so
143 * the free toggle stays at its default and must not be the sole gate.
144 */
145 private static function paymentTemplateTypeFor(object $booking): string
146 {
147 $full = TransactionalEmailTemplateService::TYPE_PAYMENT_CONFIRMATION;
148 $partial = TransactionalEmailTemplateService::TYPE_PARTIAL_PAYMENT_RECEIVED;
149
150 // Nothing left to pay → this is the full-payment confirmation.
151 if ((float) ($booking->amount_due ?? 0) <= 0) {
152 return $full;
153 }
154
155 if (!yatra_partial_payments_enabled()) {
156 return $full;
157 }
158
159 $partialEnabled = SettingsService::isEnabled('email_template_partial_payment')
160 || (bool) apply_filters('yatra_pro_email_automation_owns_transactional_type', false, $partial);
161
162 return $partialEnabled ? $partial : $full;
163 }
164
165 /**
166 * Notify customer of payment received
167 */
168 private static function notifyCustomerPaymentReceived(array $paymentData): void
169 {
170 $bookingRepository = new BookingRepository();
171 $booking = $bookingRepository->findWithTrip((int) ($paymentData['booking_id'] ?? 0));
172
173 if (!$booking || empty($booking->contact_email)) {
174 return;
175 }
176
177 $vars = TransactionalEmailTemplateService::variablesFromBooking($booking);
178 $vars['payment_amount_formatted'] = yatra_format_price((float) ($paymentData['amount'] ?? 0));
179 $vars['payment_method'] = (string) ($paymentData['payment_method'] ?? __('Online payment', 'yatra'));
180 $vars['transaction_id'] = (string) ($paymentData['transaction_id'] ?? '');
181
182 TransactionalEmailTemplateService::sendIfEnabled(
183 self::paymentTemplateTypeFor($booking),
184 $booking->contact_email,
185 $vars
186 );
187 }
188
189 /**
190 * Notify admin of cancellation
191 */
192 private static function notifyAdminCancellation(int $bookingId, $bookingData): void
193 {
194 $admin_email = SettingsService::getString('admin_email', (string) get_option('admin_email', ''));
195 if ($admin_email === '' || !is_email($admin_email)) {
196 return;
197 }
198
199 $repository = new BookingRepository();
200 $booking = $repository->findWithTrip($bookingId);
201 if (!$booking) {
202 return;
203 }
204
205 $variables = TransactionalEmailTemplateService::variablesFromBooking($booking);
206
207 TransactionalEmailTemplateService::sendIfEnabled(
208 TransactionalEmailTemplateService::TYPE_ADMIN_BOOKING_CANCELLED,
209 $admin_email,
210 $variables
211 );
212 }
213 }
214