PluginProbe ʕ •ᴥ•ʔ
Booking for Appointments and Events Calendar – Amelia / 2.0.2
Booking for Appointments and Events Calendar – Amelia v2.0.2
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 / Calendar / GetCalendarSlotAvailabilityHandler.php
ameliabooking / src / Application / Commands / Calendar Last commit date
CalendarRescheduleEventCommand.php 6 months ago CalendarRescheduleEventCommandHandler.php 6 months ago GetCalendarEventsCommand.php 6 months ago GetCalendarEventsCommandHandler.php 6 months ago GetCalendarSlotAvailabilityCommand.php 6 months ago GetCalendarSlotAvailabilityHandler.php 6 months ago GetCalendarSlotEntitiesCommand.php 6 months ago GetCalendarSlotEntitiesCommandHandler.php 6 months ago GetCalendarSlotsCommand.php 6 months ago GetCalendarSlotsCommandHandler.php 6 months ago
GetCalendarSlotAvailabilityHandler.php
114 lines
1 <?php
2
3 /**
4 * @copyright © Melograno Ventures. All rights reserved.
5 * @licence See LICENCE.md for license details.
6 */
7
8 namespace AmeliaBooking\Application\Commands\Calendar;
9
10 use AmeliaBooking\Application\Commands\CommandHandler;
11 use AmeliaBooking\Application\Commands\CommandResult;
12 use AmeliaBooking\Application\Services\Bookable\BookableApplicationService;
13 use AmeliaBooking\Application\Services\Booking\AppointmentApplicationService;
14 use AmeliaBooking\Application\Services\User\UserApplicationService;
15 use AmeliaBooking\Domain\Common\Exceptions\AuthorizationException;
16 use AmeliaBooking\Domain\Common\Exceptions\InvalidArgumentException;
17 use AmeliaBooking\Domain\Entity\Bookable\Service\Service;
18 use AmeliaBooking\Domain\Entity\Booking\Appointment\Appointment;
19 use AmeliaBooking\Domain\Entity\User\AbstractUser;
20 use AmeliaBooking\Domain\Services\DateTime\DateTimeService;
21 use AmeliaBooking\Domain\Services\Settings\SettingsService;
22 use AmeliaBooking\Domain\ValueObjects\DateTime\DateTimeValue;
23 use AmeliaBooking\Infrastructure\Common\Exceptions\QueryExecutionException;
24 use AmeliaBooking\Infrastructure\Repository\Booking\Appointment\AppointmentRepository;
25 use AmeliaBooking\Infrastructure\WP\Translations\FrontendStrings;
26 use Interop\Container\Exception\ContainerException;
27 use Psr\Container\ContainerExceptionInterface;
28
29 class GetCalendarSlotAvailabilityHandler extends CommandHandler
30 {
31 /**
32 * @var array
33 */
34 public $mandatoryFields = [
35 'bookingStart',
36 'appointmentId'
37 ];
38
39 /**
40 * @throws ContainerException
41 * @throws InvalidArgumentException
42 * @throws ContainerExceptionInterface
43 * @throws QueryExecutionException
44 */
45 public function handle(GetCalendarSlotAvailabilityCommand $command): CommandResult
46 {
47 $this->checkMandatoryFields($command);
48
49 $result = new CommandResult();
50
51 /** @var UserApplicationService $userAS */
52 $userAS = $this->container->get('application.user.service');
53 /** @var SettingsService $settingsDS */
54 $settingsDS = $this->container->get('domain.settings.service');
55 /** @var AppointmentRepository $appointmentRepo */
56 $appointmentRepo = $this->container->get('domain.booking.appointment.repository');
57 /** @var AppointmentApplicationService $appointmentAS */
58 $appointmentAS = $this->container->get('application.booking.appointment.service');
59 /** @var BookableApplicationService $bookableAS */
60 $bookableAS = $this->container->get('application.bookable.service');
61
62 try {
63 /** @var AbstractUser $user */
64 $user = $command->getUserApplicationService()->authorization(
65 $command->getPage() === 'cabinet' ? $command->getToken() : null,
66 $command->getCabinetType()
67 );
68 } catch (AuthorizationException $e) {
69 $result->setResult(CommandResult::RESULT_ERROR);
70 $result->setData(
71 [
72 'reauthorize' => true
73 ]
74 );
75
76 return $result;
77 }
78
79 /** @var Appointment $appointment */
80 $appointment = $appointmentRepo->getById($command->getField('appointmentId'));
81
82 /** @var Service $service */
83 $service = $bookableAS->getAppointmentService(
84 $appointment->getServiceId()->getValue(),
85 $appointment->getProviderId()->getValue()
86 );
87
88 $bookingStart = $command->getField('bookingStart');
89
90 $appointment->setBookingStart(new DateTimeValue(DateTimeService::getCustomDateTimeObject($bookingStart)));
91
92 $appointment->setBookingEnd(
93 new DateTimeValue(
94 DateTimeService::getCustomDateTimeObject($bookingStart)
95 ->modify('+' . $appointmentAS->getAppointmentLengthTime($appointment, $service) . ' second')
96 )
97 );
98
99 if (!$appointmentAS->canBeBooked($appointment, $userAS->isCustomer($user), null, null)) {
100 $result->setResult(CommandResult::RESULT_ERROR);
101 $result->setMessage(FrontendStrings::getCommonStrings()['time_slot_unavailable']);
102 $result->setData(
103 [
104 'timeSlotUnavailable' => true
105 ]
106 );
107
108 return $result;
109 }
110
111 return $result;
112 }
113 }
114