PluginProbe ʕ •ᴥ•ʔ
Booking for Appointments and Events Calendar – Amelia / 1.2.11
Booking for Appointments and Events Calendar – Amelia v1.2.11
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 / Services / Reservation / EventReservationService.php
ameliabooking / src / Application / Services / Reservation Last commit date
AbstractReservationService.php 1 year ago AppointmentReservationService.php 1 year ago EventReservationService.php 1 year ago ReservationService.php 2 years ago
EventReservationService.php
1264 lines
1 <?php
2
3 namespace AmeliaBooking\Application\Services\Reservation;
4
5 use AmeliaBooking\Application\Commands\CommandResult;
6 use AmeliaBooking\Application\Services\Booking\EventApplicationService;
7 use AmeliaBooking\Application\Services\Coupon\CouponApplicationService;
8 use AmeliaBooking\Application\Services\Deposit\AbstractDepositApplicationService;
9 use AmeliaBooking\Application\Services\Helper\HelperService;
10 use AmeliaBooking\Application\Services\Tax\TaxApplicationService;
11 use AmeliaBooking\Domain\Collection\Collection;
12 use AmeliaBooking\Domain\Common\Exceptions\BookingCancellationException;
13 use AmeliaBooking\Domain\Common\Exceptions\BookingsLimitReachedException;
14 use AmeliaBooking\Domain\Common\Exceptions\BookingUnavailableException;
15 use AmeliaBooking\Domain\Common\Exceptions\CouponExpiredException;
16 use AmeliaBooking\Domain\Common\Exceptions\CouponInvalidException;
17 use AmeliaBooking\Domain\Common\Exceptions\CouponUnknownException;
18 use AmeliaBooking\Domain\Common\Exceptions\CustomerBookedException;
19 use AmeliaBooking\Domain\Common\Exceptions\InvalidArgumentException;
20 use AmeliaBooking\Domain\Entity\Bookable\AbstractBookable;
21 use AmeliaBooking\Domain\Entity\Booking\Appointment\CustomerBooking;
22 use AmeliaBooking\Domain\Entity\Booking\Appointment\CustomerBookingExtra;
23 use AmeliaBooking\Domain\Entity\Booking\Event\CustomerBookingEventPeriod;
24 use AmeliaBooking\Domain\Entity\Booking\Event\CustomerBookingEventTicket;
25 use AmeliaBooking\Domain\Entity\Booking\Event\Event;
26 use AmeliaBooking\Domain\Entity\Booking\Event\EventPeriod;
27 use AmeliaBooking\Domain\Entity\Booking\Event\EventTicket;
28 use AmeliaBooking\Domain\Entity\Booking\Reservation;
29 use AmeliaBooking\Domain\Entity\Coupon\Coupon;
30 use AmeliaBooking\Domain\Entity\Entities;
31 use AmeliaBooking\Domain\Entity\Location\Location;
32 use AmeliaBooking\Domain\Entity\Payment\Payment;
33 use AmeliaBooking\Domain\Entity\Tax\Tax;
34 use AmeliaBooking\Domain\Entity\User\AbstractUser;
35 use AmeliaBooking\Domain\Entity\User\Provider;
36 use AmeliaBooking\Domain\Factory\Booking\Appointment\CustomerBookingFactory;
37 use AmeliaBooking\Domain\Factory\Booking\Event\CustomerBookingEventPeriodFactory;
38 use AmeliaBooking\Domain\Factory\Booking\Event\CustomerBookingEventTicketFactory;
39 use AmeliaBooking\Domain\Services\DateTime\DateTimeService;
40 use AmeliaBooking\Domain\Services\Reservation\ReservationServiceInterface;
41 use AmeliaBooking\Domain\Services\Settings\SettingsService;
42 use AmeliaBooking\Domain\ValueObjects\BooleanValueObject;
43 use AmeliaBooking\Domain\ValueObjects\Number\Float\Price;
44 use AmeliaBooking\Domain\ValueObjects\Number\Integer\Id;
45 use AmeliaBooking\Domain\ValueObjects\Number\Integer\IntegerValue;
46 use AmeliaBooking\Domain\ValueObjects\String\AmountType;
47 use AmeliaBooking\Domain\ValueObjects\String\BookingStatus;
48 use AmeliaBooking\Domain\ValueObjects\String\PaymentType;
49 use AmeliaBooking\Domain\ValueObjects\String\Token;
50 use AmeliaBooking\Domain\ValueObjects\Json;
51 use AmeliaBooking\Infrastructure\Common\Exceptions\QueryExecutionException;
52 use AmeliaBooking\Infrastructure\Repository\Booking\Appointment\CustomerBookingExtraRepository;
53 use AmeliaBooking\Infrastructure\Repository\Booking\Appointment\CustomerBookingRepository;
54 use AmeliaBooking\Infrastructure\Repository\Booking\Event\CustomerBookingEventPeriodRepository;
55 use AmeliaBooking\Infrastructure\Repository\Booking\Event\CustomerBookingEventTicketRepository;
56 use AmeliaBooking\Infrastructure\Repository\Booking\Event\EventRepository;
57 use AmeliaBooking\Infrastructure\Repository\Location\LocationRepository;
58 use AmeliaBooking\Infrastructure\Repository\User\CustomerRepository;
59 use AmeliaBooking\Infrastructure\WP\Translations\FrontendStrings;
60 use DateTime;
61 use Exception;
62 use Slim\Exception\ContainerException;
63 use Slim\Exception\ContainerValueNotFoundException;
64
65 /**
66 * Class EventReservationService
67 *
68 * @package AmeliaBooking\Application\Services\Reservation
69 */
70 class EventReservationService extends AbstractReservationService
71 {
72 /**
73 * @return string
74 */
75 public function getType()
76 {
77 return Entities::EVENT;
78 }
79
80 /**
81 * @param array $eventData
82 * @param Reservation $reservation
83 * @param bool $save
84 *
85 * @return void
86 *
87 * @throws CouponExpiredException
88 * @throws CouponInvalidException
89 * @throws CouponUnknownException
90 * @throws BookingUnavailableException
91 * @throws ContainerValueNotFoundException
92 * @throws InvalidArgumentException
93 * @throws QueryExecutionException
94 * @throws Exception
95 */
96 public function book($eventData, $reservation, $save)
97 {
98 /** @var LocationRepository $locationRepository */
99 $locationRepository = $this->container->get('domain.locations.repository');
100
101 /** @var EventApplicationService $eventApplicationService */
102 $eventApplicationService = $this->container->get('application.booking.event.service');
103
104 /** @var CouponApplicationService $couponAS */
105 $couponAS = $this->container->get('application.coupon.service');
106
107 /** @var AbstractDepositApplicationService $depositAS */
108 $depositAS = $this->container->get('application.deposit.service');
109
110 $this->manageTaxes($eventData);
111
112 /** @var Coupon $coupon */
113 $coupon = !empty($eventData['couponCode']) ? $couponAS->processCoupon(
114 $eventData['couponCode'],
115 [$eventData['eventId']],
116 Entities::EVENT,
117 $eventData['bookings'][0]['customerId'],
118 $reservation->hasCouponValidation()->getValue()
119 ) : null;
120
121 if ($coupon) {
122 $eventData['bookings'][0]['coupon'] = $coupon->toArray();
123
124 $eventData['bookings'][0]['couponId'] = $coupon->getId()->getValue();
125 }
126
127 /** @var Event $event */
128 $event = $eventApplicationService->getEventById(
129 $eventData['eventId'],
130 [
131 'fetchEventsPeriods' => true,
132 'fetchEventsTickets' => true,
133 'fetchApprovedBookings' => true,
134 'fetchBookings' => true,
135 'fetchBookingsTickets' => true,
136 'fetchEventsProviders' => true,
137 ]
138 );
139
140 if ($event->getCustomPricing()->getValue()) {
141 $event->setCustomTickets($eventApplicationService->getTicketsPriceByDateRange($event->getCustomTickets()));
142 }
143
144 $bookingArray = array_merge($eventData['bookings'][0], empty($eventData['bookings'][0]['status']) ?
145 ['status' => BookingStatus::APPROVED] : ['status' => $eventData['bookings'][0]['status']]);
146
147 $bookingArray = apply_filters('amelia_before_event_booking_saved_filter', $bookingArray, $event ? $event->toArray() : null);
148
149 do_action('amelia_before_event_booking_saved', $bookingArray, $event ? $event->toArray() : null);
150
151 $booking = CustomerBookingFactory::create($bookingArray);
152
153 if ($event->getCustomPricing()->getValue()) {
154 $booking->setPersons(new IntegerValue(0));
155 }
156
157 $bookingStatus = empty($eventData['bookings'][0]['status']) ? BookingStatus::APPROVED : $eventData['bookings'][0]['status'];
158
159 if (!empty($eventData['payment']['gateway'])) {
160 $bookingStatus = in_array($eventData['payment']['gateway'], [PaymentType::MOLLIE, PaymentType::SQUARE]) ?
161 BookingStatus::PENDING : (empty($eventData['bookings'][0]['status']) ? BookingStatus::APPROVED : $eventData['bookings'][0]['status']);
162
163 if (!empty($eventData['payment']['orderStatus'])) {
164 $bookingStatus = $this->getWcStatus(
165 Entities::EVENT,
166 $eventData['payment']['orderStatus'],
167 'booking',
168 false
169 ) ?: $bookingStatus;
170 }
171 }
172
173 $booking->setStatus(new BookingStatus($bookingStatus));
174
175 $personsCount = 0;
176
177 /** @var CustomerBooking $customerBooking */
178 foreach ($event->getBookings()->getItems() as $customerBooking) {
179 if ($customerBooking->getStatus()->getValue() === BookingStatus::APPROVED) {
180 $personsCount += $customerBooking->getPersons()->getValue();
181 }
182 if ($customerBooking->getStatus()->getValue() !== BookingStatus::CANCELED &&
183 !$event->getBookMultipleTimes()->getValue() &&
184 $booking->getCustomerId() &&
185 $booking->getCustomerId()->getValue() === $customerBooking->getCustomerId()->getValue()
186 ) {
187 throw new CustomerBookedException(
188 FrontendStrings::getCommonStrings()['customer_already_booked_ev']
189 );
190 }
191 }
192
193 /** @var SettingsService $settingsDS */
194 $settingsDS = $this->container->get('domain.settings.service');
195
196 $limitPerCustomerEvents = $settingsDS->getSetting('roles', 'limitPerCustomerEvent');
197
198 if (!empty($limitPerCustomerEvents) &&
199 $limitPerCustomerEvents['enabled'] &&
200 empty($eventData['isBackendOrCabinet'])
201 ) {
202 /** @var EventRepository $eventRepository */
203 $eventRepository = $this->container->get('domain.booking.event.repository');
204
205 $count = $eventRepository->getRelevantBookingsCount(
206 $event,
207 $booking->toArray(),
208 $limitPerCustomerEvents
209 );
210
211 if ($count >= $limitPerCustomerEvents['numberOfApp']) {
212 throw new BookingsLimitReachedException(
213 FrontendStrings::getCommonStrings()['bookings_limit_reached']
214 );
215 }
216 }
217
218 /** @var AbstractUser $currentUser */
219 $currentUser = $this->container->get('logged.in.user');
220
221 $isCustomer = (!$currentUser || ($currentUser->getType() === AbstractUser::USER_ROLE_CUSTOMER));
222
223 $isProvider =
224 $reservation->getLoggedInUser() &&
225 $reservation->getLoggedInUser()->getType() === AbstractUser::USER_ROLE_PROVIDER;
226
227 if ($reservation->hasAvailabilityValidation()->getValue() &&
228 $isCustomer &&
229 !$isProvider &&
230 !$this->isBookable($event, $booking, DateTimeService::getNowDateTimeObject())
231 ) {
232 throw new BookingUnavailableException(
233 FrontendStrings::getCommonStrings()['time_slot_unavailable']
234 );
235 }
236
237
238 $booking->setAggregatedPrice(new BooleanValueObject($event->getAggregatedPrice() ? $event->getAggregatedPrice()->getValue() : true));
239
240 $paymentAmount = $this->getPaymentAmount($booking, $event)['price'];
241
242 $applyDeposit =
243 $eventData['bookings'][0]['deposit'] && $eventData['payment']['gateway'] !== PaymentType::ON_SITE;
244
245 if ($applyDeposit) {
246 $personsCount = $booking->getPersons()->getValue();
247
248 if ($booking->getTicketsBooking() && $event->getCustomPricing()->getValue()) {
249 $personsCount = 0;
250
251 /** @var CustomerBookingEventTicket $bookingToEventTicket */
252 foreach ($booking->getTicketsBooking()->getItems() as $bookingToEventTicket) {
253 $personsCount += ($bookingToEventTicket->getPersons() ?
254 $bookingToEventTicket->getPersons()->getValue() : 0);
255 }
256 }
257
258 $paymentDeposit = $depositAS->calculateDepositAmount(
259 $paymentAmount,
260 $event,
261 $personsCount
262 );
263
264 $eventData['payment']['deposit'] = $paymentAmount !== $paymentDeposit;
265
266 $paymentAmount = $paymentDeposit;
267 }
268
269 if ($save) {
270 /** @var CustomerBookingRepository $bookingRepository */
271 $bookingRepository = $this->container->get('domain.booking.customerBooking.repository');
272
273 /** @var CustomerBookingExtraRepository $bookingExtraRepository */
274 $bookingExtraRepository = $this->container->get('domain.booking.customerBookingExtra.repository');
275
276 /** @var CustomerBookingEventPeriodRepository $bookingEventPeriodRepository */
277 $bookingEventPeriodRepository =
278 $this->container->get('domain.booking.customerBookingEventPeriod.repository');
279
280 /** @var CustomerBookingEventTicketRepository $bookingEventTicketRepository */
281 $bookingEventTicketRepository = $this->container->get('domain.booking.customerBookingEventTicket.repository');
282
283 $booking->setPrice(new Price($event->getPrice()->getValue()));
284 $booking->setToken(new Token());
285
286 if ($booking->getTicketsBooking() && $event->getCustomPricing()->getValue()) {
287 $ticketSumPrice = 0;
288
289 /** @var CustomerBookingEventTicket $bookingToEventTicket */
290 foreach ($booking->getTicketsBooking()->getItems() as $bookingToEventTicket) {
291 /** @var EventTicket $ticket */
292 $ticket = $event->getCustomTickets()->getItem(
293 $bookingToEventTicket->getEventTicketId()->getValue()
294 );
295
296 $ticketPrice = $ticket->getDateRangePrice() ?
297 $ticket->getDateRangePrice()->getValue() : $ticket->getPrice()->getValue();
298
299 $ticketSumPrice += $bookingToEventTicket->getPersons() ?
300 ($booking->getAggregatedPrice()->getValue() ? $bookingToEventTicket->getPersons()->getValue() : 1)
301 * $ticketPrice : 0;
302 }
303
304 $booking->setPrice(new Price($ticketSumPrice));
305 }
306
307 $booking->setActionsCompleted(new BooleanValueObject(!empty($eventData['payment']['isBackendBooking'])));
308
309 $bookingId = $bookingRepository->add($booking);
310
311 /** @var CustomerBookingExtra $bookingExtra */
312 foreach ($booking->getExtras()->getItems() as $bookingExtra) {
313 $bookingExtra->setCustomerBookingId(new Id($bookingId));
314 $bookingExtraId = $bookingExtraRepository->add($bookingExtra);
315 $bookingExtra->setId(new Id($bookingExtraId));
316 }
317
318 $booking->setId(new Id($bookingId));
319
320 /** @var Payment $payment */
321 $payment = $this->addPayment(
322 $booking->getId()->getValue(),
323 null,
324 $eventData['payment'],
325 $paymentAmount,
326 $event->getPeriods()->getItem(0)->getPeriodStart()->getValue(),
327 Entities::EVENT
328 );
329
330 /** @var Collection $payments */
331 $payments = new Collection();
332
333 $payments->addItem($payment);
334
335 $booking->setPayments($payments);
336
337 /** @var EventPeriod $eventPeriod */
338 foreach ($event->getPeriods()->getItems() as $eventPeriod) {
339 /** @var CustomerBookingEventPeriod $bookingEventPeriod */
340 $bookingEventPeriod = CustomerBookingEventPeriodFactory::create(
341 [
342 'eventPeriodId' => $eventPeriod->getId()->getValue(),
343 'customerBookingId' => $bookingId
344 ]
345 );
346
347 $bookingEventPeriodRepository->add($bookingEventPeriod);
348 }
349
350 /** @var CustomerBookingEventTicket $eventTicket */
351 foreach ($booking->getTicketsBooking()->getItems() as $eventTicket) {
352 if ($eventTicket->getPersons()) {
353 /** @var EventTicket $ticket */
354 $ticket = $event->getCustomTickets()->getItem($eventTicket->getEventTicketId()->getValue());
355
356 $ticketPrice = $ticket->getDateRangePrice() ?
357 $ticket->getDateRangePrice()->getValue() : $ticket->getPrice()->getValue();
358
359 /** @var CustomerBookingEventTicket $bookingEventTicket */
360 $bookingEventTicket = CustomerBookingEventTicketFactory::create(
361 [
362 'eventTicketId' => $eventTicket->getEventTicketId()->getValue(),
363 'customerBookingId' => $bookingId,
364 'persons' => $eventTicket->getPersons()->getValue(),
365 'price' => $ticketPrice,
366 ]
367 );
368
369 $bookingEventTicketRepository->add($bookingEventTicket);
370 }
371 }
372
373 $event->getBookings()->addItem($booking, $booking->getId()->getValue());
374
375 do_action('amelia_after_event_booking_saved', $booking ? $booking->toArray() : null, $event ? $event->toArray() : null);
376 }
377
378 if ($event->getLocationId()) {
379 /** @var Location $location */
380 $location = $locationRepository->getById($event->getLocationId()->getValue());
381
382 $event->setLocation($location);
383 }
384
385 $reservation->setApplyDeposit(new BooleanValueObject($applyDeposit));
386 if ($booking->getCustomer()) {
387 $reservation->setCustomer($booking->getCustomer());
388 }
389 $reservation->setBookable($event);
390 $reservation->setBooking($booking);
391 $reservation->setReservation($event);
392 $reservation->setRecurring(new Collection());
393 $reservation->setPackageReservations(new Collection());
394 $reservation->setIsStatusChanged(new BooleanValueObject(false));
395 }
396
397 /**
398 * @param CustomerBooking $booking
399 * @param string $requestedStatus
400 *
401 * @return array
402 *
403 * @throws ContainerException
404 * @throws ContainerValueNotFoundException
405 * @throws InvalidArgumentException
406 * @throws QueryExecutionException
407 * @throws BookingCancellationException
408 */
409 public function updateStatus($booking, $requestedStatus)
410 {
411 /** @var CustomerBookingRepository $bookingRepository */
412 $bookingRepository = $this->container->get('domain.booking.customerBooking.repository');
413 /** @var SettingsService $settingsDS */
414 $settingsDS = $this->container->get('domain.settings.service');
415
416 /** @var Event $reservation */
417 $event = $this->getReservationByBookingId($booking->getId()->getValue());
418
419 if ($requestedStatus === BookingStatus::CANCELED) {
420 $minimumCancelTimeInSeconds = $settingsDS
421 ->getEntitySettings($event->getSettings())
422 ->getGeneralSettings()
423 ->getMinimumTimeRequirementPriorToCanceling();
424
425 $this->inspectMinimumCancellationTime(
426 $event->getPeriods()->getItem(0)->getPeriodStart()->getValue(),
427 $minimumCancelTimeInSeconds
428 );
429 }
430
431 $booking->setStatus(new BookingStatus($requestedStatus));
432
433 $bookingRepository->update($booking->getId()->getValue(), $booking);
434
435 return [
436 Entities::EVENT => $event->toArray(),
437 'appointmentStatusChanged' => false,
438 Entities::BOOKING => $booking->toArray()
439 ];
440 }
441
442 /**
443 * @param Event $reservation
444 * @param CustomerBooking $booking
445 * @param AbstractBookable $bookable
446 *
447 * @return array
448 */
449 public function getBookingPeriods($reservation, $booking, $bookable)
450 {
451 $dates = [];
452
453 /** @var EventPeriod $period */
454 foreach ($reservation->getPeriods()->getItems() as $period) {
455 $dates[] = [
456 'start' => DateTimeService::getCustomDateTimeInUtc(
457 $period->getPeriodStart()->getValue()->format('Y-m-d H:i:s')
458 ),
459 'end' => DateTimeService::getCustomDateTimeInUtc(
460 $period->getPeriodEnd()->getValue()->format('Y-m-d H:i:s')
461 )
462 ];
463 }
464
465 return $dates;
466 }
467
468 /**
469 * @param array $data
470 *
471 * @return AbstractBookable
472 *
473 * @throws ContainerValueNotFoundException
474 * @throws QueryExecutionException
475 * @throws InvalidArgumentException
476 */
477 public function getBookableEntity($data)
478 {
479 /** @var EventRepository $eventRepository */
480 $eventRepository = $this->container->get('domain.booking.event.repository');
481
482 return $eventRepository->getById($data['eventId']);
483 }
484
485 /**
486 * @param Event $bookable
487 *
488 * @return boolean
489 */
490 public function isAggregatedPrice($bookable)
491 {
492 return $bookable->getAggregatedPrice()->getValue();
493 }
494
495 /**
496 * @param BooleanValueObject $bookableAggregatedPrice
497 * @param BooleanValueObject $extraAggregatedPrice
498 *
499 * @return boolean
500 */
501 public function isExtraAggregatedPrice($extraAggregatedPrice, $bookableAggregatedPrice)
502 {
503 return true;
504 }
505
506 /**
507 * @param Reservation $reservation
508 * @param string $paymentGateway
509 * @param array $requestData
510 *
511 * @return array
512 *
513 * @throws InvalidArgumentException
514 */
515 public function getWooCommerceData($reservation, $paymentGateway, $requestData)
516 {
517 /** @var Event $event */
518 $event = $reservation->getBookable();
519
520 /** @var AbstractUser $customer */
521 $customer = $reservation->getCustomer();
522
523 /** @var CustomerBooking $booking */
524 $booking = $reservation->getBooking();
525
526 $dateTimeValues = [];
527
528 /** @var EventPeriod $period */
529 foreach ($event->getPeriods()->getItems() as $period) {
530 $dateTimeValues[] = [
531 'start' => $period->getPeriodStart()->getValue()->format('Y-m-d H:i'),
532 'end' => $period->getPeriodEnd()->getValue()->format('Y-m-d H:i')
533 ];
534 }
535
536 $info = [
537 'type' => Entities::EVENT,
538 'eventId' => $event->getId()->getValue(),
539 'name' => $event->getName()->getValue(),
540 'couponId' => $booking->getCoupon() ? $booking->getCoupon()->getId()->getValue() : '',
541 'couponCode' => $booking->getCoupon() ? $booking->getCoupon()->getCode()->getValue() : '',
542 'dateTimeValues' => $dateTimeValues,
543 'bookings' => [
544 [
545 'customerId' => $customer->getId() ? $customer->getId()->getValue() : null,
546 'customer' => [
547 'email' => $customer->getEmail()->getValue(),
548 'externalId' => $customer->getExternalId() ? $customer->getExternalId()->getValue() : null,
549 'firstName' => $customer->getFirstName()->getValue(),
550 'id' => $customer->getId() ? $customer->getId()->getValue() : null,
551 'lastName' => $customer->getLastName()->getValue(),
552 'phone' => $customer->getPhone()->getValue(),
553 'countryPhoneIso' => $customer->getCountryPhoneIso() ?
554 $customer->getCountryPhoneIso()->getValue() : null
555 ],
556 'info' => $booking->getInfo()->getValue(),
557 'persons' => $booking->getPersons()->getValue(),
558 'extras' => [],
559 'utcOffset' => $booking->getUtcOffset() ? $booking->getUtcOffset()->getValue() : null,
560 'customFields' => $booking->getCustomFields() ?
561 json_decode($booking->getCustomFields()->getValue(), true) : null,
562 'deposit' => $reservation->getApplyDeposit()->getValue(),
563 'ticketsData' => $requestData['bookings'][0]['ticketsData'],
564 ]
565 ],
566 'payment' => [
567 'gateway' => $paymentGateway
568 ],
569 'locale' => $reservation->getLocale()->getValue(),
570 'timeZone' => $reservation->getTimeZone()->getValue(),
571 'recurring' => [],
572 'package' => [],
573 ];
574
575 foreach ($booking->getExtras()->keys() as $extraKey) {
576 /** @var CustomerBookingExtra $bookingExtra */
577 $bookingExtra = $booking->getExtras()->getItem($extraKey);
578
579 $info['bookings'][0]['extras'][] = [
580 'extraId' => $bookingExtra->getExtraId()->getValue(),
581 'quantity' => $bookingExtra->getQuantity()->getValue()
582 ];
583 }
584
585 return $info;
586 }
587
588
589 /**
590 * @param array $reservation
591 *
592 * @return array
593 *
594 * @throws InvalidArgumentException
595 */
596 public function getWooCommerceDataFromArray($reservation, $index)
597 {
598 /** @var array $event */
599 $event = $reservation['bookable'];
600
601 /** @var array $customer */
602 $customer = !empty($reservation['customer'])
603 ? $reservation['customer']
604 : (!empty($reservation['booking']['customer']) ? $reservation['booking']['customer'] : null);
605
606 /** @var array $booking */
607 $booking = $reservation['booking'];
608
609 if (!empty($booking['ticketsData'])) {
610 foreach ($booking['ticketsData'] as &$ticket) {
611 $customTicketIndex = array_search(
612 $ticket['eventTicketId'],
613 array_column($reservation['event']['customTickets'], 'id')
614 );
615 if ($customTicketIndex !== false) {
616 $ticket['name'] = $reservation['event']['customTickets'][$customTicketIndex]['name'];
617 }
618 }
619 }
620
621 $dateTimeValues = [];
622
623 $customerInfo = !empty($booking['info']) ? json_decode($booking['info'], true) : null;
624
625 /** @var EventPeriod $period */
626 foreach ($event['periods'] as $period) {
627 $dateTimeValues[] = [
628 'start' => $period['periodStart'],
629 'end' => $period['periodEnd']
630 ];
631 }
632
633 $info = [
634 'type' => Entities::EVENT,
635 'eventId' => $event['id'],
636 'name' => $event['name'],
637 'couponId' => $booking['coupon'] ? $booking['coupon']['id'] : '',
638 'couponCode' => $booking['coupon'] ? $booking['coupon']['code'] : '',
639 'dateTimeValues' => $dateTimeValues,
640 'bookings' => [
641 [
642 'customerId' => $customer['id'],
643 'customer' => [
644 'email' => $customer['email'],
645 'externalId' => $customer['externalId'],
646 'firstName' => $customer['firstName'],
647 'id' => $customer['id'],
648 'lastName' => $customer['lastName'],
649 'phone' => $customer['phone'],
650 'countryPhoneIso' => $customer['countryPhoneIso']
651 ],
652 'info' => $booking['info'],
653 'persons' => $booking['persons'],
654 'extras' => [],
655 'utcOffset' => $booking['utcOffset'],
656 'customFields' => $booking['customFields'] ?
657 json_decode($booking['customFields'], true) : null,
658 'deposit' => $booking['price'] > $booking['payments'][0]['amount'],
659 'ticketsData' => $booking['ticketsData'],
660 ]
661 ],
662 'payment' => [
663 'gateway' => $booking['payments'][0]['gateway']
664 ],
665 'locale' => $customerInfo ? $customerInfo['locale'] : null,
666 'timeZone' => $customerInfo ? $customerInfo['timeZone'] : null,
667 'recurring' => [],
668 'package' => [],
669 ];
670
671 foreach ($booking['extras'] as $extra) {
672 $info['bookings'][0]['extras'][] = [
673 'extraId' => $extra['id'],
674 'quantity' => $extra['quantity']
675 ];
676 }
677
678 return $info;
679 }
680
681 /**
682 * @param int $id
683 *
684 * @return Event
685 *
686 * @throws ContainerValueNotFoundException
687 * @throws QueryExecutionException
688 * @throws InvalidArgumentException
689 */
690 public function getReservationByBookingId($id)
691 {
692 /** @var EventRepository $eventRepository */
693 $eventRepository = $this->container->get('domain.booking.event.repository');
694
695 /** @var Event $event */
696 $event = $eventRepository->getByBookingId(
697 $id,
698 [
699 'fetchEventsTickets' => true,
700 'fetchEventsTags' => true,
701 'fetchEventsProviders' => true,
702 'fetchEventsImages' => true,
703 ]
704 );
705
706 /** @var Collection $eventsBookings */
707 $eventsBookings = $eventRepository->getBookingsByCriteria(
708 [
709 'ids' => [$event->getId()->getValue()],
710 'fetchBookings' => true,
711 'fetchBookingsTickets' => true,
712 'fetchBookingsUsers' => true,
713 'fetchBookingsPayments' => true,
714 ]
715 );
716
717 if ($eventsBookings->keyExists($event->getId()->getValue())) {
718 $event->setBookings($eventsBookings->getItem($event->getId()->getValue()));
719 }
720
721 return $event;
722 }
723
724 /**
725 * @param Event $reservation
726 * @param CustomerBooking $newBooking
727 * @param DateTime $dateTime
728 *
729 * @return boolean
730 *
731 * @throws InvalidArgumentException
732 */
733 public function isBookable($reservation, $newBooking, $dateTime)
734 {
735 if ($reservation->getCustomPricing() && $reservation->getCustomPricing()->getValue() && !$reservation->getMaxCustomCapacity()) {
736 $availableTicketsSpots = [];
737
738 /** @var EventTicket $ticket */
739 foreach ($reservation->getCustomTickets()->getItems() as $ticket) {
740 $availableTicketsSpots[$ticket->getId()->getValue()] = $ticket->getSpots()->getValue();
741 }
742
743 $reservedTicketsSpots = [];
744
745 /** @var CustomerBooking $booking */
746 foreach ($reservation->getBookings()->getItems() as $booking) {
747 if ($booking->getStatus()->getValue() === BookingStatus::APPROVED) {
748 /** @var CustomerBookingEventTicket $bookingTicket */
749 foreach ($booking->getTicketsBooking()->getItems() as $bookingTicket) {
750 $eventTicketId = $bookingTicket->getEventTicketId()->getValue();
751
752 if (!array_key_exists($eventTicketId, $reservedTicketsSpots)) {
753 $reservedTicketsSpots[$eventTicketId] = 0;
754 }
755
756 $reservedTicketsSpots[$eventTicketId] += $bookingTicket->getPersons()->getValue();
757 }
758 }
759 }
760
761 if ($newBooking) {
762 /** @var CustomerBookingEventTicket $newBookingTicket */
763 foreach ($newBooking->getTicketsBooking()->getItems() as $newBookingTicket) {
764 $eventTicketId = $newBookingTicket->getEventTicketId()->getValue();
765
766 if (empty($reservedTicketsSpots[$eventTicketId])) {
767 $reservedTicketsSpots[$eventTicketId] = 0;
768 }
769
770 $reservedTicketsSpots[$eventTicketId] +=
771 $newBookingTicket->getPersons() ? $newBookingTicket->getPersons()->getValue() : 0;
772 }
773 }
774
775 $hasTicketCapacity = [];
776
777 foreach ($availableTicketsSpots as $eventTicketId => $availablePersons) {
778 $hasTicketCapacity[$eventTicketId] = array_key_exists($eventTicketId, $reservedTicketsSpots) ?
779 ($newBooking ?
780 $reservedTicketsSpots[$eventTicketId] <= $availablePersons :
781 $reservedTicketsSpots[$eventTicketId] < $availablePersons
782 ) : true;
783 }
784
785 $hasCapacity = false;
786
787 foreach ($hasTicketCapacity as $ticketId => $ticketCapacity) {
788 if ($newBooking) {
789 $hasCapacity = true;
790
791 /** @var EventTicket $ticket */
792 $ticket = $reservation->getCustomTickets()->getItem($ticketId);
793
794 /** @var CustomerBookingEventTicket $ticketBooking */
795 foreach ($newBooking->getTicketsBooking()->getItems() as $ticketBooking) {
796 if ($ticketBooking->getEventTicketId()->getValue() === $ticketId &&
797 $ticketBooking->getPersons() &&
798 $ticketBooking->getPersons()->getValue() &&
799 (!$ticketCapacity || !$ticket->getEnabled()->getValue())
800 ) {
801 $hasCapacity = false;
802
803 break 2;
804 }
805 }
806 } else {
807 $hasCapacity = $hasCapacity || $ticketCapacity;
808 }
809 }
810 } else if ($reservation->getMaxCustomCapacity()) {
811 $availableTicketsSpots = $reservation->getMaxCustomCapacity()->getValue();
812 $reservedTicketsSpots = 0;
813 /** @var CustomerBooking $booking */
814 foreach ($reservation->getBookings()->getItems() as $booking) {
815 if ($booking->getStatus()->getValue() === BookingStatus::APPROVED) {
816 /** @var CustomerBookingEventTicket $bookingTicket */
817 foreach ($booking->getTicketsBooking()->getItems() as $bookingTicket) {
818 $reservedTicketsSpots += $bookingTicket->getPersons()->getValue();
819 }
820 }
821 }
822
823 if ($newBooking) {
824 /** @var CustomerBookingEventTicket $newBookingTicket */
825 foreach ($newBooking->getTicketsBooking()->getItems() as $newBookingTicket) {
826 $reservedTicketsSpots += $newBookingTicket->getPersons() ? $newBookingTicket->getPersons()->getValue() : 0;
827 }
828 }
829
830 $hasCapacity = ($newBooking ? $reservedTicketsSpots <= $availableTicketsSpots : $reservedTicketsSpots < $availableTicketsSpots);
831
832 } else {
833 $persons = 0;
834
835 /** @var CustomerBooking $booking */
836 foreach ($reservation->getBookings()->getItems() as $booking) {
837 if ($booking->getStatus()->getValue() === BookingStatus::APPROVED) {
838 $persons += $booking->getPersons()->getValue();
839 }
840 }
841 if ($newBooking) {
842 $hasCapacity = ($reservation->getMaxCapacity()->getValue() - $persons - $newBooking->getPersons()->getValue()) >= 0;
843 } else {
844 $hasCapacity = $reservation->getMaxCapacity()->getValue() - $persons > 0;
845 }
846 }
847
848 $bookingCloses = $reservation->getBookingCloses() ?
849 $reservation->getBookingCloses()->getValue() :
850 $reservation->getPeriods()->getItem(0)->getPeriodStart()->getValue();
851
852 $bookingOpens = $reservation->getBookingOpens() ?
853 $reservation->getBookingOpens()->getValue() :
854 $reservation->getCreated()->getValue();
855
856 $hasWaitingList = false;
857 $eventSettings = $reservation->getSettings() ? json_decode($reservation->getSettings()->getValue(), true) : null;
858
859 /** @var SettingsService $settingsDS */
860 $settingsDS = $this->container->get('domain.settings.service');
861 $waitingListSettings = $settingsDS->getSetting('appointments', 'waitingListEvents');
862
863 if (
864 $waitingListSettings['enabled'] && $eventSettings && !empty($eventSettings['waitingList']) &&
865 $eventSettings['waitingList']['enabled']
866 ) {
867 $waitingCustomers = 0;
868
869 foreach ($reservation->getBookings()->getItems() as $booking) {
870 if ($booking->getStatus()->getValue() === BookingStatus::WAITING) {
871 if ($reservation->getCustomPricing()->getValue()) {
872 foreach ($booking->getTicketsBooking()->getItems() as $item) {
873 $waitingCustomers += $item->getPersons()->getValue();
874 }
875 } else {
876 $waitingCustomers += $booking->getPersons()->getValue();
877 }
878 }
879 }
880
881 if ($newBooking && $reservation->getCustomPricing() && $reservation->getCustomPricing()->getValue()) {
882 foreach ($newBooking->getTicketsBooking()->getItems() as $item) {
883 if (!$reservation->getMaxCustomCapacity()) {
884 $ticketData = $reservation->getCustomTickets()->getItem($item->getId()->getValue());
885
886 $hasWaitingList = $ticketData->getWaitingListSpots() && $ticketData->getWaitingListSpots()->getValue() >=
887 ($item->getPersons() ? $item->getPersons()->getValue() : 0
888 + ($ticketData->getWaiting() ? $ticketData->getWaiting()->getValue() : 0));
889 }
890 }
891
892 if ($reservation->getMaxCustomCapacity()) {
893 $hasWaitingList = $eventSettings['waitingList']['maxCapacity'] > $waitingCustomers;
894 }
895
896 } else {
897 $hasWaitingList = $eventSettings['waitingList']['maxCapacity'] > $waitingCustomers;
898 }
899
900 $eventSettings['waitingList']['peopleWaiting'] = $waitingCustomers;
901
902 $reservation->setSettings(new Json(json_encode($eventSettings)));
903 }
904
905 return $dateTime > $bookingOpens &&
906 $dateTime < $bookingCloses &&
907 ($hasCapacity || $hasWaitingList) &&
908 in_array($reservation->getStatus()->getValue(), [BookingStatus::APPROVED, BookingStatus::PENDING], true);
909 }
910
911 /**
912 * @param CustomerBooking $booking
913 * @param Event $bookable
914 * @param string|null $reduction
915 *
916 * @return array
917 *
918 * @throws InvalidArgumentException
919 */
920 public function getPaymentAmount($booking, $bookable, $invoice = false)
921 {
922 /** @var TaxApplicationService $taxApplicationService */
923 $taxApplicationService = $this->container->get('application.tax.service');
924
925 /** @var Tax $eventTax */
926 $eventTax = $this->getTax($booking->getTax());
927
928 $persons = $booking->getPersons()->getValue();
929
930 $unitPrice = (float)$bookable->getPrice()->getValue();
931
932 $price = $unitPrice * ($this->isAggregatedPrice($bookable) ? $persons : 1);
933
934 $taxAmount = 0;
935
936 $ticketsTax = [];
937
938 if ($booking->getTicketsBooking() &&
939 $booking->getTicketsBooking()->length() &&
940 $bookable->getCustomPricing() &&
941 $bookable->getCustomPricing()->getValue()
942 ) {
943 /** @var EventApplicationService $eventApplicationService */
944 $eventApplicationService = $this->container->get('application.booking.event.service');
945
946 $bookable->setCustomTickets(
947 $eventApplicationService->getTicketsPriceByDateRange($bookable->getCustomTickets())
948 );
949
950 $ticketSumPrice = 0;
951
952 /** @var CustomerBookingEventTicket $bookingToEventTicket */
953 foreach ($booking->getTicketsBooking()->getItems() as $bookingToEventTicket) {
954 /** @var EventTicket $ticket */
955 $ticket = $bookable->getCustomTickets()->getItem($bookingToEventTicket->getEventTicketId()->getValue());
956
957 $ticketPrice = $ticket->getDateRangePrice() ?
958 $ticket->getDateRangePrice()->getValue() : $ticket->getPrice()->getValue();
959
960 $ticketPersons = $bookingToEventTicket->getPersons() ?
961 ($booking->getAggregatedPrice()->getValue() ? $bookingToEventTicket->getPersons()->getValue() : 1)
962 : 0;
963
964 $ticketSubtotal = $ticketPersons * $ticketPrice;
965
966 $ticketSumPrice += $ticketSubtotal;
967
968 if ($bookingToEventTicket->getId()) {
969 if ($eventTax && $eventTax->getExcluded()->getValue()) {
970 $ticketsTax[$bookingToEventTicket->getId()->getValue()] = $this->getTaxAmount($eventTax, $ticketSubtotal);
971 } else if ($eventTax && !$eventTax->getExcluded()->getValue()) {
972 $ticketsTax[$bookingToEventTicket->getId()->getValue()] = $this->getTaxAmount($eventTax, $taxApplicationService->getBasePrice($ticketSubtotal, $eventTax));
973 } else {
974 $ticketsTax[$bookingToEventTicket->getId()->getValue()] = 0;
975 }
976 }
977 }
978
979 $price = $ticketSumPrice;
980 }
981
982 if ($eventTax && !$eventTax->getExcluded()->getValue() && ($booking->getCoupon() || $invoice)) {
983 $price = $taxApplicationService->getBasePrice($price, $eventTax);
984 }
985
986 $subtraction = 0;
987
988 $reductionAmount = [
989 'deduction' => 0,
990 'discount' => 0,
991 ];
992
993 if ($booking->getCoupon()) {
994 $reductionAmount['discount'] = $price / 100 * ($booking->getCoupon()->getDiscount()->getValue() ?: 0);
995
996 $reductionAmount['deduction'] = $booking->getCoupon()->getDeduction()->getValue();
997
998 $subtraction = $reductionAmount['discount'] + $reductionAmount['deduction'];
999
1000 $price = max($price - $subtraction, 0);
1001 }
1002
1003 if ($eventTax && ($eventTax->getExcluded()->getValue() || $subtraction || $invoice)) {
1004 $taxAmount = $this->getTaxAmount($eventTax, $price);
1005 $price += $taxAmount;
1006 }
1007
1008 $price = (float)max(round($price, 2), 0);
1009
1010 return [
1011 'price' => apply_filters('amelia_modify_payment_amount', $price, $booking),
1012 'discount' => $reductionAmount['discount'],
1013 'deduction' => $reductionAmount['deduction'],
1014 'unit_price' => $unitPrice,
1015 'qty' => $persons,
1016 'subtotal' => $unitPrice * ($this->isAggregatedPrice($bookable) ? $persons : 1),
1017 'tax' => !empty($ticketsTax) ? null : $taxAmount,
1018 'tax_rate' => $eventTax ? $this->getTaxRate($eventTax) : '',
1019 'tax_type' => $eventTax ? $eventTax->getType()->getValue() : '',
1020 'tax_excluded' => $eventTax ? $eventTax->getExcluded()->getValue() : false,
1021 'tickets_tax' => $ticketsTax,
1022 'full_discount' => $this->getCouponDiscountAmount($booking->getCoupon(), $unitPrice) + ($booking->getCoupon() && $booking->getCoupon()->getDeduction() ? $booking->getCoupon()->getDeduction()->getValue() : 0)
1023 ];
1024 }
1025
1026 /**
1027 * @param Reservation $reservation
1028 *
1029 * @return float
1030 *
1031 * @throws InvalidArgumentException
1032 */
1033 public function getReservationPaymentAmount($reservation)
1034 {
1035 /** @var AbstractDepositApplicationService $depositAS */
1036 $depositAS = $this->container->get('application.deposit.service');
1037
1038 /** @var Event $bookable */
1039 $bookable = $reservation->getBookable();
1040
1041 $paymentAmount = $this->getPaymentAmount($reservation->getBooking(), $bookable)['price'];
1042
1043 if ($reservation->getApplyDeposit()->getValue()) {
1044 $personsCount = $reservation->getBooking()->getPersons()->getValue();
1045
1046 if ($reservation->getBooking()->getTicketsBooking() && $bookable->getCustomPricing()->getValue()) {
1047 $personsCount = 0;
1048
1049 /** @var CustomerBookingEventTicket $bookingToEventTicket */
1050 foreach ($reservation->getBooking()->getTicketsBooking()->getItems() as $bookingToEventTicket) {
1051 $personsCount += ($bookingToEventTicket->getPersons() ?
1052 $bookingToEventTicket->getPersons()->getValue() : 0);
1053 }
1054 }
1055
1056 $paymentAmount = $depositAS->calculateDepositAmount(
1057 $paymentAmount,
1058 $bookable,
1059 $personsCount
1060 );
1061 }
1062
1063 return $paymentAmount;
1064 }
1065
1066 /**
1067 * @param Reservation $reservation
1068 *
1069 * @return array
1070 *
1071 * @throws InvalidArgumentException
1072 */
1073 public function getProvidersPaymentAmount($reservation)
1074 {
1075 $amountData = [];
1076
1077 /** @var Payment $payment */
1078 $payment = $reservation->getBooking()->getPayments()->getItem(0);
1079
1080 /** @var Event $event */
1081 $event = $reservation->getBookable();
1082
1083 /** @var Provider $provider */
1084 foreach ($event->getProviders()->getItems() as $provider) {
1085 $amountData[$provider->getId()->getValue()][] = [
1086 'paymentId' => $payment->getId()->getValue(),
1087 'amount' => $this->getReservationPaymentAmount($reservation),
1088 ];
1089 }
1090
1091 return $amountData;
1092 }
1093
1094 /**
1095 * @param Payment $payment
1096 * @param boolean $fromLink
1097 *
1098 * @return CommandResult
1099 * @throws InvalidArgumentException
1100 * @throws Exception
1101 * @throws \Interop\Container\Exception\ContainerException
1102 */
1103 public function getReservationByPayment($payment, $fromLink = false)
1104 {
1105 $result = new CommandResult();
1106
1107 /** @var CustomerRepository $customerRepository */
1108 $customerRepository = $this->container->get('domain.users.customers.repository');
1109
1110 /** @var LocationRepository $locationRepository */
1111 $locationRepository = $this->container->get('domain.locations.repository');
1112
1113 /** @var ReservationServiceInterface $reservationService */
1114 $reservationService = $this->container->get('application.reservation.service')->get(Entities::EVENT);
1115
1116 /** @var Event $event */
1117 $event = $reservationService->getReservationByBookingId(
1118 $payment->getCustomerBookingId()->getValue()
1119 );
1120
1121 if ($event->getLocationId()) {
1122 /** @var Location $location */
1123 $location = $locationRepository->getById($event->getLocationId()->getValue());
1124
1125 $event->setLocation($location);
1126 }
1127
1128 /** @var CustomerBooking $booking */
1129 $booking = $event->getBookings()->getItem($payment->getCustomerBookingId()->getValue());
1130
1131 $booking->setChangedStatus(new BooleanValueObject(true));
1132
1133 $this->setToken($booking);
1134
1135 /** @var AbstractUser $customer */
1136 $customer = $customerRepository->getById($booking->getCustomerId()->getValue());
1137
1138 $result->setData(
1139 [
1140 'type' => Entities::EVENT,
1141 Entities::EVENT => $event->toArray(),
1142 Entities::BOOKING => $booking->toArray(),
1143 'appointmentStatusChanged' => false,
1144 'customer' => $customer->toArray(),
1145 'packageId' => 0,
1146 'recurring' => [],
1147 'utcTime' => $reservationService->getBookingPeriods(
1148 $event,
1149 $booking,
1150 $event
1151 ),
1152 'isRetry' => !$fromLink,
1153 'fromLink' => $fromLink,
1154 'paymentId' => $payment->getId()->getValue(),
1155 'packageCustomerId' => null,
1156 'payment' => [
1157 'id' => $payment->getId()->getValue(),
1158 'amount' => $payment->getAmount()->getValue(),
1159 'gateway' => $payment->getGateway()->getName()->getValue(),
1160 'gatewayTitle' => $payment->getGatewayTitle() ? $payment->getGatewayTitle()->getValue() : '',
1161 'invoiceNumber' => $payment->getInvoiceNumber() ? $payment->getInvoiceNumber()->getValue() : '',
1162 ],
1163 ]
1164 );
1165
1166 return $result;
1167 }
1168
1169 /**
1170 * @param int $bookingId
1171 *
1172 * @return CommandResult
1173 * @throws InvalidArgumentException
1174 * @throws Exception
1175 * @throws \Interop\Container\Exception\ContainerException
1176 */
1177 public function getBookingResultByBookingId($bookingId)
1178 {
1179 $result = new CommandResult();
1180
1181 /** @var CustomerRepository $customerRepository */
1182 $customerRepository = $this->container->get('domain.users.customers.repository');
1183
1184 /** @var LocationRepository $locationRepository */
1185 $locationRepository = $this->container->get('domain.locations.repository');
1186
1187 /** @var ReservationServiceInterface $reservationService */
1188 $reservationService = $this->container->get('application.reservation.service')->get(Entities::EVENT);
1189
1190 /** @var Event $event */
1191 $event = $reservationService->getReservationByBookingId(
1192 $bookingId
1193 );
1194
1195 if ($event->getLocationId()) {
1196 /** @var Location $location */
1197 $location = $locationRepository->getById($event->getLocationId()->getValue());
1198
1199 $event->setLocation($location);
1200 }
1201
1202 /** @var CustomerBooking $booking */
1203 $booking = $event->getBookings()->getItem($bookingId);
1204
1205 $booking->setChangedStatus(new BooleanValueObject(true));
1206
1207 $this->setToken($booking);
1208
1209 /** @var AbstractUser $customer */
1210 $customer = $customerRepository->getById($booking->getCustomerId()->getValue());
1211
1212 $result->setData(
1213 [
1214 'type' => Entities::EVENT,
1215 Entities::EVENT => $event->toArray(),
1216 Entities::BOOKING => $booking->toArray(),
1217 'appointmentStatusChanged' => false,
1218 'customer' => $customer->toArray(),
1219 'packageId' => 0,
1220 'recurring' => [],
1221 'utcTime' => $reservationService->getBookingPeriods(
1222 $event,
1223 $booking,
1224 $event
1225 ),
1226 'isRetry' => true,
1227 'paymentId' => null,
1228 'packageCustomerId' => null,
1229 'payment' => null,
1230 ]
1231 );
1232
1233 return $result;
1234 }
1235
1236 /**
1237 * @param array $data
1238 *
1239 * @return void
1240 * @throws QueryExecutionException
1241 */
1242 public function manageTaxes(&$data)
1243 {
1244 /** @var TaxApplicationService $taxAS */
1245 $taxAS = $this->container->get('application.tax.service');
1246
1247 /** @var SettingsService $settingsService */
1248 $settingsService = $this->container->get('domain.settings.service');
1249
1250 $taxesSettings = $settingsService->getSetting('payments', 'taxes');
1251
1252 if ($taxesSettings['enabled']) {
1253 /** @var Collection $taxes */
1254 $taxes = $taxAS->getAll();
1255
1256 $data['bookings'][0]['tax'] = $taxAS->getTaxData(
1257 $data['eventId'],
1258 Entities::EVENT,
1259 $taxes
1260 );
1261 }
1262 }
1263 }
1264