src/Controller/UserBookingController.php line 32

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace Harmonizely\Controller;
  4. use Harmonizely\Availability\FirstAvailableDateProvider;
  5. use Harmonizely\EventTypes\LocationTypeProvider;
  6. use Harmonizely\Model\EventTypeInterface;
  7. use Harmonizely\Model\User;
  8. use Harmonizely\Service\CancellationPolicy\Contract\IGetCancellationPolicyService;
  9. use Harmonizely\Service\Common\Contract\IGetTimezoneListService;
  10. use Harmonizely\Service\CustomTranslation\Event\SetCustomTranslationEvent;
  11. use Harmonizely\Service\Locale\Event\SetLocaleEvent;
  12. use Harmonizely\Service\Subscription\Voter\SubscriptionVoter;
  13. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Entity;
  14. use Symfony\Component\HttpFoundation\Request;
  15. use Symfony\Component\HttpFoundation\Response;
  16. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  17. use Harmonizely\Service\Panel\Api\UserEventTypeTag\Contract\IUserEventTypeTagListService;
  18. class UserBookingController extends AbstractBookingController
  19. {
  20.     /**
  21.      * @Entity("user", expr="repository.findOneEnabledBySlug(slug)")
  22.      * @param Request $request
  23.      * @param User $user
  24.      * @param IUserEventTypeTagListService $userEventTypeTagListService
  25.      * @return Response
  26.      */
  27.     public function index(Request $requestUser $userIUserEventTypeTagListService $userEventTypeTagListService): Response
  28.     {
  29.         if ($this->reverseRedirectResolver->shouldRedirect($request$user)) {
  30.             return $this->reverseRedirectResolver->resolve($request$user);
  31.         }
  32.         $this->eventDispatcher->dispatch(new SetLocaleEvent(null$user), SetLocaleEvent::NAME);
  33.         $this->eventDispatcher->dispatch(new SetCustomTranslationEvent($user->getId()), SetCustomTranslationEvent::NAME);
  34.         $selectedUserEventTypeTag $request->get('userEventTypeTag');
  35.         /** @var EventTypeInterface[] $eventTypes */
  36.         $eventTypes $this->eventTypeRepository->findByUserSlug($user->getSlug(), $selectedUserEventTypeTag);
  37.         $isAllowGroupBooking SubscriptionVoter::staticVoteOnAttribute(SubscriptionVoter::GROUP_BOOKING$user);
  38.         $eventTypeList = [];
  39.         foreach ($eventTypes as $eventType) {
  40.             if ($eventType->getGroupMeetingLimit() > && !$isAllowGroupBooking) {
  41.                 continue;
  42.             }
  43.             $eventTypeList[] = $eventType;
  44.         }
  45.         $userEventTypeTags $userEventTypeTagListService->perform($user);
  46.         $userEventTypeTagsList = [];
  47.         foreach ($userEventTypeTags as $tag) {
  48.             $userEventTypeTagsList[] = [
  49.                 'id' => $tag->getId(),
  50.                 'name' => $tag->getName(),
  51.                 'color' => $tag->getColor(),
  52.             ];
  53.         }
  54.         return $this->render('booking/index.html.twig', [
  55.             'eventTypes' => $eventTypeList,
  56.             'user' => $user,
  57.             'userEventTypeTags' => $selectedUserEventTypeTag null $userEventTypeTagsList,
  58.             'selectedUserEventTypeTags' => $request->get('userEventTypeTag'),
  59.         ]);
  60.     }
  61.     /**
  62.      * @Entity("user", expr="repository.findOneEnabledBySlug(slug)")
  63.      */
  64.     public function eventType(
  65.         Request $request,
  66.         User $user,
  67.         LocationTypeProvider $locationTypeProvider,
  68.         FirstAvailableDateProvider $firstAvailableDateProvider,
  69.         IGetCancellationPolicyService $getCancellationPolicyService,
  70.         IGetTimezoneListService  $getTimezoneListService,
  71.         string $eventTypeSlug,
  72.         string $singleUseLinkCode ''
  73.     ): Response
  74.     {
  75.         $eventType $this->eventTypeRepository->findOneBySlugAndUser($eventTypeSlug$user);
  76.         if (false === $eventType instanceof EventTypeInterface) {
  77.             return $this->redirect(
  78.                 $this->generateUrl(
  79.                     'hrm_booking_index',
  80.                     ['slug' => $user->getSlug()],
  81.                     UrlGeneratorInterface::ABSOLUTE_URL
  82.                 )
  83.             );
  84.         }
  85.         if ($eventType->getType() === EventTypeInterface::TYPE_REGULAR && $user->getCalendarAccounts()->isEmpty()) {
  86.             return $this->renderCalendarNotConnected($user);
  87.         }
  88.         if ($singleUseLinkCode === '' && $this->reverseRedirectResolver->shouldRedirect($request$user)) {
  89.             return $this->reverseRedirectResolver->resolve($request$user);
  90.         }
  91.         if ($eventType->getGroupMeetingLimit() > && !SubscriptionVoter::staticVoteOnAttribute(SubscriptionVoter::GROUP_BOOKING$user)) {
  92.             throw $this->createNotFoundException();
  93.         }
  94.         $this->eventDispatcher->dispatch(new SetLocaleEvent($eventType), SetLocaleEvent::NAME);
  95.         $this->eventDispatcher->dispatch(new SetCustomTranslationEvent($user->getId()), SetCustomTranslationEvent::NAME);
  96.         if (SubscriptionVoter::staticVoteOnAttribute(SubscriptionVoter::QUESTION$user)) {
  97.             $questions $this->getQuestions($eventType);
  98.         } else {
  99.             $questions = [];
  100.         }
  101.         $locationType $locationTypeProvider->provideFor($eventType$user);
  102.         $startDate $firstAvailableDateProvider->provideFor($eventType, (string) $eventType->getTimezone());
  103.         $duration $eventType->getRealDuration($request->query->get('duration_id'));
  104.         return $this->render('booking/event_type.html.twig', [
  105.             'user' => $user,
  106.             'eventType' => $eventType,
  107.             'timezones' => json_encode($getTimezoneListService->perform()),
  108.             'questions' => json_encode($questions),
  109.             'simplypayPaymentSystems' => json_encode($this->getAllowedPaymentSystems($user)),
  110.             'integration' => $this->findIntegration($user$locationType),
  111.             'singleUseLinkCode' => $singleUseLinkCode,
  112.             'calendarLayout' => $this->getCalendarLayoutService->perform($eventType),
  113.             'isHideUnavailableDates' => $this->isHideUnavailableDatesService->perform($eventType),
  114.             'isSundayIsFirstDayService' => $this->isSundayIsFirstDayService->perform($eventType),
  115.             'startDate' => $startDate->format('Y-m-d'),
  116.             'eventTypeDuration' => $duration,
  117.             'cancellationPolicy' => $getCancellationPolicyService->perform($eventType$user),
  118.         ]);
  119.     }
  120. }