PluginProbe ʕ •ᴥ•ʔ
Booking for Appointments and Events Calendar – Amelia / 2.4.6
Booking for Appointments and Events Calendar – Amelia v2.4.6
2.4.7 2.4.6 2.4.5 2.4.4 2.4.3 2.4.2 2.4.1 2.4 trunk 1.2.1 1.2.10 1.2.11 1.2.12 1.2.13 1.2.14 1.2.15 1.2.16 1.2.17 1.2.18 1.2.19 1.2.2 1.2.20 1.2.21 1.2.22 1.2.23 1.2.24 1.2.25 1.2.26 1.2.27 1.2.28 1.2.29 1.2.3 1.2.30 1.2.31 1.2.32 1.2.33 1.2.34 1.2.35 1.2.36 1.2.37 1.2.38 1.2.4 1.2.5 1.2.6 1.2.7 1.2.8 1.2.9 2.0 2.0.1 2.0.2 2.1 2.1.1 2.1.2 2.1.3 2.2 2.2.1 2.3
ameliabooking / src / Application / Commands / Booking / Event / GetEventBookingsCommandHandler.php
ameliabooking / src / Application / Commands / Booking / Event Last commit date
Tag 3 months ago AddEventCommand.php 1 year ago AddEventCommandHandler.php 1 week ago DeleteEventBookingCommand.php 7 years ago DeleteEventBookingCommandHandler.php 1 week ago DeleteEventCommand.php 1 year ago DeleteEventCommandHandler.php 7 months ago DeleteEventsCommand.php 7 months ago DeleteEventsCommandHandler.php 4 months ago GenerateEventWpaCustomPostCommand.php 4 weeks ago GenerateEventWpaCustomPostCommandHandler.php 4 weeks ago GetCalendarEventsCommand.php 1 year ago GetCalendarEventsCommandHandler.php 1 week ago GetEventBookingCommand.php 7 months ago GetEventBookingCommandHandler.php 1 week ago GetEventBookingsCommand.php 1 year ago GetEventBookingsCommandHandler.php 1 week ago GetEventCommand.php 7 years ago GetEventCommandHandler.php 1 week ago GetEventsCommand.php 1 year ago GetEventsCommandHandler.php 1 week ago UpdateEventBookingCommand.php 7 years ago UpdateEventBookingCommandHandler.php 7 months ago UpdateEventCommand.php 1 year ago UpdateEventCommandHandler.php 1 week ago UpdateEventStatusCommand.php 1 year ago UpdateEventStatusCommandHandler.php 7 months ago UpdateEventVisibilityCommand.php 7 months ago UpdateEventVisibilityCommandHandler.php 7 months ago
GetEventBookingsCommandHandler.php
393 lines
1 <?php
2
3 namespace AmeliaBooking\Application\Commands\Booking\Event;
4
5 use AmeliaBooking\Application\Commands\CommandHandler;
6 use AmeliaBooking\Application\Commands\CommandResult;
7 use AmeliaBooking\Application\Common\Exceptions\AccessDeniedException;
8 use AmeliaBooking\Application\Services\Booking\EventApplicationService;
9 use AmeliaBooking\Application\Services\CustomField\AbstractCustomFieldApplicationService;
10 use AmeliaBooking\Application\Services\Payment\PaymentApplicationService;
11 use AmeliaBooking\Application\Services\User\ProviderApplicationService;
12 use AmeliaBooking\Application\Services\User\UserApplicationService;
13 use AmeliaBooking\Domain\Collection\Collection;
14 use AmeliaBooking\Domain\Common\Exceptions\InvalidArgumentException;
15 use AmeliaBooking\Domain\Entity\Booking\Appointment\CustomerBooking;
16 use AmeliaBooking\Domain\Entity\Booking\Event\CustomerBookingEventTicket;
17 use AmeliaBooking\Domain\Entity\Booking\Event\Event;
18 use AmeliaBooking\Domain\Entity\Booking\Event\EventTicket;
19 use AmeliaBooking\Domain\Entity\Entities;
20 use AmeliaBooking\Domain\Entity\User\AbstractUser;
21 use AmeliaBooking\Domain\Entity\User\Provider;
22 use AmeliaBooking\Domain\Factory\Booking\Appointment\CustomerBookingFactory;
23 use AmeliaBooking\Domain\Factory\Booking\Event\EventFactory;
24 use AmeliaBooking\Domain\Services\DateTime\DateTimeService;
25 use AmeliaBooking\Domain\Services\Settings\SettingsService;
26 use AmeliaBooking\Domain\ValueObjects\String\BookableType;
27 use AmeliaBooking\Domain\ValueObjects\String\BookingStatus;
28 use AmeliaBooking\Infrastructure\Common\Exceptions\QueryExecutionException;
29 use AmeliaBooking\Infrastructure\Repository\Booking\Appointment\CustomerBookingRepository;
30 use AmeliaBooking\Infrastructure\Repository\CustomField\CustomFieldRepository;
31 use Exception;
32
33 /**
34 * Class GetEventBookingsCommandHandler
35 *
36 * @package AmeliaBooking\Application\Commands\Booking\Event
37 */
38 class GetEventBookingsCommandHandler extends CommandHandler
39 {
40 /**
41 * @param GetEventBookingsCommand $command
42 *
43 * @return CommandResult
44 *
45 * @throws AccessDeniedException
46 * @throws InvalidArgumentException
47 * @throws QueryExecutionException
48 * @throws Exception
49 */
50 public function handle(GetEventBookingsCommand $command)
51 {
52 /** @var AbstractUser $user */
53 $user = $command->authorize();
54
55 $result = new CommandResult();
56
57 /** @var SettingsService $settingsDS */
58 $settingsDS = $this->container->get('domain.settings.service');
59 /** @var UserApplicationService $userAS */
60 $userAS = $this->container->get('application.user.service');
61 /** @var PaymentApplicationService $paymentAS */
62 $paymentAS = $this->container->get('application.payment.service');
63 /** @var EventApplicationService $eventApplicationService */
64 $eventApplicationService = $this->container->get('application.booking.event.service');
65 /** @var CustomerBookingRepository $bookingRepository */
66 $bookingRepository = $this->container->get('domain.booking.customerBooking.repository');
67 /** @var CustomFieldRepository $customFieldRepository */
68 $customFieldRepository = $this->container->get('domain.customField.repository');
69 /** @var ProviderApplicationService $providerAS */
70 $providerAS = $this->container->get('application.user.provider.service');
71 /** @var AbstractCustomFieldApplicationService $customFieldService */
72 $customFieldService = $this->container->get('application.customField.service');
73
74 $params = $command->getField('params');
75
76 if (isset($params['dates']) && empty($params['dates'][0]) && empty($params['dates'][1])) {
77 unset($params['dates']);
78 }
79
80 $isCabinetPage = $command->getPage() === 'cabinet';
81
82 if ($user && $userAS->isAmeliaUser($user) && $userAS->isCustomer($user)) {
83 $params['customers'] = [$user->getId()->getValue()];
84 }
85
86 if ($user && $user->getType() === AbstractUser::USER_ROLE_PROVIDER) {
87 $params['providers'] = [$user->getId()->getValue()];
88 }
89
90 $providerTimeZoneSet = ($user instanceof Provider) && $user->getTimeZone() && $user->getTimeZone()->getValue();
91
92 if (!empty($params['dates'])) {
93 if (!empty($params['dates'][0])) {
94 $params['dates'][0] .= ' 00:00:00';
95 }
96 if (!empty($params['dates'][1])) {
97 $params['dates'][1] .= ' 23:59:59';
98 }
99 }
100
101 $attendeeCount = 0;
102
103 $waitingCount = 0;
104
105 $maxCapacity = 0;
106
107 $waitingCapacity = 0;
108
109 if ($isCabinetPage) {
110 /** @var Event $event */
111 $event = $eventApplicationService->getEventById(
112 (int)$params['events'][0],
113 [
114 'fetchEventsTickets' => true,
115 'fetchBookings' => true,
116 'fetchBookingsTickets' => true,
117 ]
118 );
119
120
121 if ($event->getCustomPricing()->getValue()) {
122 /** @var CustomerBooking $customerBooking */
123 foreach ($event->getBookings()->getItems() as $customerBooking) {
124 if (
125 $customerBooking->getStatus()->getValue() === BookingStatus::APPROVED ||
126 $customerBooking->getStatus()->getValue() === BookingStatus::PENDING
127 ) {
128 /** @var CustomerBookingEventTicket $bookingToEventTicket */
129 foreach ($customerBooking->getTicketsBooking()->getItems() as $bookingToEventTicket) {
130 $attendeeCount += $bookingToEventTicket->getPersons()->getValue();
131 }
132 }
133
134 if ($customerBooking->getStatus()->getValue() === BookingStatus::WAITING) {
135 /** @var CustomerBookingEventTicket $bookingToEventTicket */
136 foreach ($customerBooking->getTicketsBooking()->getItems() as $bookingToEventTicket) {
137 $waitingCount += $bookingToEventTicket->getPersons()->getValue();
138 }
139 }
140 }
141
142 /** @var EventTicket $ticket */
143 foreach ($event->getCustomTickets()->getItems() as $ticket) {
144 $maxCapacity += $ticket->getSpots()->getValue();
145 }
146 } else {
147 $maxCapacity = $event->getMaxCapacity()->getValue();
148
149 /** @var CustomerBooking $customerBooking */
150 foreach ($event->getBookings()->getItems() as $customerBooking) {
151 if (
152 $customerBooking->getStatus()->getValue() === BookingStatus::APPROVED ||
153 $customerBooking->getStatus()->getValue() === BookingStatus::PENDING
154 ) {
155 $attendeeCount += $customerBooking->getPersons()->getValue();
156 }
157 }
158
159 /** @var CustomerBooking $customerBooking */
160 foreach ($event->getBookings()->getItems() as $customerBooking) {
161 if ($customerBooking->getStatus()->getValue() === BookingStatus::WAITING) {
162 $waitingCount += $customerBooking->getPersons()->getValue();
163 }
164 }
165 }
166
167 $eventSettings = $settingsDS->isFeatureEnabled('waitingList') && $event->getSettings() && $event->getSettings()->getValue()
168 ? json_decode($event->getSettings()->getValue(), true)
169 : null;
170
171
172 if ($eventSettings && !empty($eventSettings['waitingList']['enabled'])) {
173 if ($event->getCustomPricing()->getValue()) {
174 /** @var EventTicket $ticket */
175 foreach ($event->getCustomTickets()->getItems() as $ticket) {
176 $waitingCapacity += $ticket->getWaitingListSpots()->getValue();
177 }
178 } else {
179 $waitingCapacity = $eventSettings['waitingList']['maxCapacity'];
180 }
181 }
182 }
183
184 $bookingIds = $bookingRepository->getEventBookingIdsByCriteria($params, !empty($params['limit']) ? $params['limit'] : 10);
185
186 if (!$bookingIds && $params['page'] && (int)$params['page'] > 1) {
187 $params['page'] = 1;
188
189 $bookingIds = $bookingRepository->getEventBookingIdsByCriteria($params, !empty($params['limit']) ? $params['limit'] : 10);
190 }
191
192 if (empty($bookingIds)) {
193 $result->setResult(CommandResult::RESULT_SUCCESS);
194 $result->setMessage('Successfully retrieved event bookings');
195 $result->setData(
196 [
197 Entities::BOOKINGS => [],
198 'totalCount' => sizeof($bookingRepository->getEventBookingIdsByCriteria()),
199 'filteredCount' => 0,
200 'attendeeCount' => 0,
201 'waitingCount' => 0,
202 'waitingCapacity' => $waitingCapacity,
203 'maxCapacity' => $maxCapacity,
204 ]
205 );
206
207 return $result;
208 }
209
210 $bookings = $bookingRepository->getEventBookingsByIds(
211 $bookingIds,
212 array_merge(
213 !empty($params['sort']) ? ['sort' => $params['sort']] : [],
214 !empty($params['dates']) ? ['dates' => $params['dates']] : [],
215 [
216 'fetchBookingsPayments' => true,
217 'fetchBookingsCoupons' => true,
218 'fetchProviders' => true,
219 'fetchCustomers' => true,
220 'fetchEvent' => true,
221 ]
222 )
223 );
224
225
226 /** @var Collection $customFieldsCollection */
227 $customFieldsCollection = $customFieldRepository->getAll([], false);
228
229 $customersNoShowCountIds = [];
230
231 $noShowTagEnabled = $settingsDS->isFeatureEnabled('noShowTag');
232
233 $eventBookings = [];
234
235 foreach ($bookings as &$booking) {
236 $customFields = [];
237
238 ksort($booking['payments']);
239
240 if ($noShowTagEnabled) {
241 $customersNoShowCountIds[] = $booking['customer']['id'];
242 }
243
244 foreach ($booking['event']['periods'] as &$period) {
245 $period['periodStart'] = DateTimeService::getCustomDateTimeFromUtc($period['periodStart']);
246 $period['periodEnd'] = DateTimeService::getCustomDateTimeFromUtc($period['periodEnd']);
247 if ($providerTimeZoneSet) {
248 $period['periodStart'] =
249 DateTimeService::getCustomDateTimeObjectInTimeZone($period['periodStart'], $user->getTimeZone()->getValue())->format('Y-m-d H:i:s');
250 $period['periodEnd'] =
251 DateTimeService::getCustomDateTimeObjectInTimeZone($period['periodEnd'], $user->getTimeZone()->getValue())->format('Y-m-d H:i:s');
252 }
253 }
254
255 $persons = $booking['persons'];
256 if (!empty($booking['event']['customPricing']) && !empty($booking['ticketsData'])) {
257 /** @var CustomerBookingEventTicket $bookedTicket */
258 foreach ($booking['ticketsData'] as $bookedTicket) {
259 $persons += $bookedTicket['persons'];
260 }
261 }
262
263 if ($booking['tax']) {
264 $booking['tax'] = json_decode($booking['tax'], true);
265 }
266
267 $booking['ticketsData'] = !empty($booking['ticketsData']) ? $booking['ticketsData'] : [];
268
269 if (!empty($booking['event']['providers'])) {
270 foreach ($booking['event']['providers'] as &$provider) {
271 if (!empty($provider['badgeId'])) {
272 $provider['badge'] = $providerAS->getBadge($provider['badgeId']);
273 }
274 }
275 }
276
277 if (!empty($booking['event']['organizer']) && !empty($booking['event']['organizer']['badgeId'])) {
278 $booking['event']['organizer']['badge'] = $providerAS->getBadge($booking['event']['organizer']['badgeId']);
279 }
280
281 $wcTax = 0;
282 $wcDiscount = 0;
283 $paid = 0;
284
285 foreach ($booking['payments'] as $payment) {
286 $paymentAS->addWcFields($payment);
287
288 $wcTax += !empty($payment['wcItemTaxValue']) ? $payment['wcItemTaxValue'] : 0;
289
290 $wcDiscount += !empty($payment['wcItemCouponValue']) ? $payment['wcItemCouponValue'] : 0;
291
292 $paid = $paid + $payment['amount'];
293 }
294
295 $customFields = $customFieldService->reformatCustomField(
296 CustomerBookingFactory::create($booking),
297 $customFields,
298 $customFieldsCollection
299 );
300
301 $eventBooking = [
302 'id' => $booking['id'],
303 'bookedSpots' => $persons,
304 'status' => $booking['event']['status'] === 'canceled' || $booking['event']['status'] === 'rejected' ? 'canceled' : $booking['status'],
305 'persons' => $persons,
306 'checked' => false,
307 'customer' => [
308 'id' => $booking['customer']['id'],
309 'firstName' => $booking['customer']['firstName'],
310 'lastName' => $booking['customer']['lastName'],
311 'phone' => $booking['customer']['phone'],
312 'email' => $booking['customer']['email'],
313 'note' => $booking['customer']['note']
314 ],
315 'code' => !empty($booking['token']) ? substr($booking['token'], 0, 5) : '',
316 'event' => [
317 'id' => (int)$booking['event']['id'],
318 'name' => $booking['event']['name'],
319 'startDate' => explode(' ', array_values($booking['event']['periods'])[0]['periodStart'])[0],
320 'endDate' => explode(' ', array_values($booking['event']['periods'])[sizeof($booking['event']['periods']) - 1]['periodEnd'])[0],
321 'startTime' => explode(' ', array_values($booking['event']['periods'])[0]['periodStart'])[1],
322 'organizer' => !empty($booking['event']['organizer']) ? $booking['event']['organizer'] : null,
323 'staff' => !empty($booking['event']['providers']) ? array_values($booking['event']['providers']) : [],
324 'isZoom' => !empty(array_values($booking['event']['periods'])[0]['zoomMeeting']),
325 'isGoogleMeet' => !empty(array_values($booking['event']['periods'])[0]['googleMeetUrl']),
326 'isMicrosoftTeams' => !empty(array_values($booking['event']['periods'])[0]['microsoftTeamsUrl']),
327 'isLessonSpace' => !empty(array_values($booking['event']['periods'])[0]['lessonSpace']),
328 'isWaitingList' => !empty($booking['event']['settings']) ?
329 json_decode($booking['event']['settings'], true)['waitingList']['enabled'] :
330 false,
331 ],
332 'ticketsData' => $booking['ticketsData'],
333 'tax' => $booking['tax'],
334 'price' => $booking['price'],
335 'aggregatedPrice' => $booking['aggregatedPrice'],
336 'coupon' => !empty($booking['coupon']) ? $booking['coupon'] : null,
337 'payment' => [
338 'status' => $paymentAS->getFullStatus($booking, BookableType::EVENT),
339 'total' => $paymentAS->calculateAppointmentPrice($booking, BookableType::EVENT) + $wcTax - $wcDiscount,
340 'paid' => $paid,
341 ],
342 'customFields' => $customFields,
343 'payments' => array_values($booking['payments']),
344 'qrCodes' => !empty($booking['qrCodes']) ? $booking['qrCodes'] : null,
345 'cancelable' => $eventApplicationService->isCancelable(EventFactory::create($booking['event']), $user),
346 'created' => !empty($booking['created']) ? explode(' ', $booking['created'])[0] : null,
347 ];
348
349 if ($isCabinetPage) {
350 $eventBooking['customFields'] = $booking['customFields'];
351 }
352
353 $eventBookings[] = $eventBooking;
354 }
355
356
357 if ($noShowTagEnabled && !empty($customersNoShowCountIds)) {
358 /** @var CustomerBookingRepository $bookingRepository */
359 $bookingRepository = $this->container->get('domain.booking.customerBooking.repository');
360
361 $customersNoShowCount = $bookingRepository->countByNoShowStatus($customersNoShowCountIds);
362
363 foreach ($eventBookings as &$eventBooking) {
364 if (!empty($customersNoShowCount[$eventBooking['customer']['id']])) {
365 $eventBooking['customer']['noShowCount'] = $customersNoShowCount[$eventBooking['customer']['id']]['count'];
366 }
367 }
368 }
369
370 $eventBookings = apply_filters('amelia_get_event_bookings_filter', $eventBookings);
371
372 do_action('amelia_get_event_bookings', $eventBookings);
373
374 $result->setResult(CommandResult::RESULT_SUCCESS);
375 $result->setMessage('Successfully retrieved event bookings');
376 $result->setData(
377 [
378 Entities::BOOKINGS => $eventBookings,
379 'totalCount' => sizeof($bookingRepository->getEventBookingIdsByCriteria()),
380 'filteredCount' => sizeof(
381 $bookingRepository->getEventBookingIdsByCriteria($params)
382 ),
383 'attendeeCount' => $attendeeCount,
384 'waitingCount' => $waitingCount,
385 'waitingCapacity' => $waitingCapacity,
386 'maxCapacity' => $maxCapacity,
387 ]
388 );
389
390 return $result;
391 }
392 }
393