PluginProbe
Yatra – Travel Booking & Tour Operator Software / 3.0.13
Yatra – Travel Booking & Tour Operator Software v3.0.13
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.13, at app/Services/NotificationService.php

191 lines 6.4 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 * Notify admin of new booking
47 */
48 private static function notifyAdminNewBooking(int $bookingId, $bookingData): void
49 {
50 if (!apply_filters('yatra_notify_admin_new_booking', true, $bookingId, $bookingData)) {
51 return;
52 }
53
54 $admin_email = SettingsService::getString('admin_email', (string) get_option('admin_email', ''));
55 if ($admin_email === '' || !is_email($admin_email)) {
56 return;
57 }
58
59 $repository = new BookingRepository();
60 $booking = $repository->findWithTrip($bookingId);
61 if (!$booking) {
62 return;
63 }
64
65 $adminNotifyContext = [
66 'booking_id' => $bookingId,
67 'reference' => $booking->reference ?? '',
68 'source' => 'yatra_booking_created',
69 ];
70 if (!apply_filters('yatra_send_checkout_admin_notification', true, $adminNotifyContext)) {
71 return;
72 }
73
74 $variables = TransactionalEmailTemplateService::variablesFromBooking($booking);
75
76 TransactionalEmailTemplateService::sendIfEnabled(
77 TransactionalEmailTemplateService::TYPE_ADMIN_NEW_BOOKING,
78 $admin_email,
79 $variables
80 );
81 }
82
83 /**
84 * Notify admin of payment received (template: admin_payment_received).
85 */
86 private static function notifyAdminPaymentReceived(array $paymentData): void
87 {
88 $admin_email = SettingsService::getString('admin_email', (string) get_option('admin_email', ''));
89 if ($admin_email === '' || !is_email($admin_email)) {
90 return;
91 }
92
93 $bookingRepository = new BookingRepository();
94 $booking = $bookingRepository->findWithTrip((int) ($paymentData['booking_id'] ?? 0));
95 if (!$booking) {
96 return;
97 }
98
99 $vars = TransactionalEmailTemplateService::variablesFromBooking($booking);
100 $vars['payment_amount_formatted'] = yatra_format_price((float) ($paymentData['amount'] ?? 0));
101 $vars['payment_method'] = (string) ($paymentData['payment_method'] ?? __('Online payment', 'yatra'));
102 $vars['transaction_id'] = (string) ($paymentData['transaction_id'] ?? '');
103
104 TransactionalEmailTemplateService::sendIfEnabled(
105 TransactionalEmailTemplateService::TYPE_ADMIN_PAYMENT_RECEIVED,
106 $admin_email,
107 $vars
108 );
109 }
110
111 /**
112 * Which payment email to send: the part-payment template or the full one.
113 *
114 * Defaults to the long-standing single template. The part-payment template
115 * is used only when ALL of these hold, so an existing site sees no change
116 * until its operator opts in:
117 *
118 * 1. a balance is genuinely still outstanding on the booking,
119 * 2. deposits / partial payments are switched on at all, and
120 * 3. the operator has enabled the separate part-payment template.
121 */
122 private static function paymentTemplateTypeFor(object $booking): string
123 {
124 $full = TransactionalEmailTemplateService::TYPE_PAYMENT_CONFIRMATION;
125
126 // Nothing left to pay → this is the full-payment confirmation.
127 if ((float) ($booking->amount_due ?? 0) <= 0) {
128 return $full;
129 }
130
131 if (!yatra_partial_payments_enabled()) {
132 return $full;
133 }
134
135 if (!SettingsService::isEnabled('email_template_partial_payment')) {
136 return $full;
137 }
138
139 return TransactionalEmailTemplateService::TYPE_PARTIAL_PAYMENT_RECEIVED;
140 }
141
142 /**
143 * Notify customer of payment received
144 */
145 private static function notifyCustomerPaymentReceived(array $paymentData): void
146 {
147 $bookingRepository = new BookingRepository();
148 $booking = $bookingRepository->findWithTrip((int) ($paymentData['booking_id'] ?? 0));
149
150 if (!$booking || empty($booking->contact_email)) {
151 return;
152 }
153
154 $vars = TransactionalEmailTemplateService::variablesFromBooking($booking);
155 $vars['payment_amount_formatted'] = yatra_format_price((float) ($paymentData['amount'] ?? 0));
156 $vars['payment_method'] = (string) ($paymentData['payment_method'] ?? __('Online payment', 'yatra'));
157 $vars['transaction_id'] = (string) ($paymentData['transaction_id'] ?? '');
158
159 TransactionalEmailTemplateService::sendIfEnabled(
160 self::paymentTemplateTypeFor($booking),
161 $booking->contact_email,
162 $vars
163 );
164 }
165
166 /**
167 * Notify admin of cancellation
168 */
169 private static function notifyAdminCancellation(int $bookingId, $bookingData): void
170 {
171 $admin_email = SettingsService::getString('admin_email', (string) get_option('admin_email', ''));
172 if ($admin_email === '' || !is_email($admin_email)) {
173 return;
174 }
175
176 $repository = new BookingRepository();
177 $booking = $repository->findWithTrip($bookingId);
178 if (!$booking) {
179 return;
180 }
181
182 $variables = TransactionalEmailTemplateService::variablesFromBooking($booking);
183
184 TransactionalEmailTemplateService::sendIfEnabled(
185 TransactionalEmailTemplateService::TYPE_ADMIN_BOOKING_CANCELLED,
186 $admin_email,
187 $variables
188 );
189 }
190 }
191