container->get('domain.settings.service'); $itemsPerPage = $settingsDS->getSetting('general', 'itemsPerPage'); /** @var ReservationServiceInterface $reservationService */ $reservationService = $this->container->get('application.reservation.service')->get(Entities::EVENT); /** @var EventRepository $eventRepository */ $eventRepository = $this->container->get('domain.booking.event.repository'); $params = $command->getField('params'); $isFrontEnd = isset($params['page']); /** @var AbstractUser $currentUser */ $currentUser = null; $isCustomer = true; $isLoggedInCustomer = false; $isProvider = false; if (!$isFrontEnd) { $currentUser = $this->container->get('logged.in.user'); $isCustomer = $currentUser === null || ($currentUser && $currentUser->getType() === AbstractUser::USER_ROLE_CUSTOMER); $isLoggedInCustomer = $currentUser && $currentUser->getType() === AbstractUser::USER_ROLE_CUSTOMER; $isProvider = $currentUser && $currentUser->getType() === AbstractUser::USER_ROLE_PROVIDER; if ($isProvider) { $params['providers'] = [$currentUser->getId()->getValue()]; } } if (isset($params['dates'][0])) { $params['dates'][0] ? $params['dates'][0] .= ' 00:00:00' : null; } if (isset($params['dates'][1])) { $params['dates'][1] ? $params['dates'][1] .= ' 23:59:59' : null; } $filteredEventIds = $eventRepository->getFilteredIds($params, $itemsPerPage); /** @var Collection $events */ $events = $filteredEventIds ? $eventRepository->getFiltered(array_merge($params, ['ids' => array_column($filteredEventIds, 'id')])) : new Collection(); if (!$events instanceof AbstractCollection) { $result->setResult(CommandResult::RESULT_ERROR); $result->setMessage('Could not get appointments'); return $result; } $currentDateTime = DateTimeService::getNowDateTimeObject(); $eventsArray = []; /** @var Event $event */ foreach ($events->getItems() as $event) { if (($isFrontEnd || $isCustomer) && !$event->getShow()->getValue()) { continue; } if (!$isFrontEnd && $isProvider) { $isProviderEvent = false; /** @var Provider $provider */ foreach ($event->getProviders()->getItems() as $provider) { if ($provider->getId()->getValue() === $currentUser->getId()->getValue()) { $isProviderEvent = true; } } if (!$isProviderEvent) { continue; } } $persons = 0; /** @var CustomerBooking $booking */ foreach ($event->getBookings()->getItems() as $booking) { if ($booking->getStatus()->getValue() === BookingStatus::APPROVED) { $persons += $booking->getPersons()->getValue(); } } if ($isCustomer) { if ($isLoggedInCustomer && !$isFrontEnd) { $removeEvent = true; foreach ($event->getBookings()->getItems() as $key => $booking) { if ($booking->getCustomerId()->getValue() === $currentUser->getId()->getValue()) { $removeEvent = false; } } if ($removeEvent) { continue; } } else { $event->setBookings(new Collection()); } } if ($isFrontEnd && $settingsDS->getSetting('general', 'showClientTimeZone')) { /** @var EventPeriod $period */ foreach ($event->getPeriods()->getItems() as $period) { $period->getPeriodStart()->getValue()->setTimezone(new \DateTimeZone('UTC')); $period->getPeriodEnd()->getValue()->setTimezone(new \DateTimeZone('UTC')); } } $bookingOpens = $event->getBookingOpens() ? $event->getBookingOpens()->getValue() : $event->getCreated()->getValue(); $bookingCloses = $event->getBookingCloses() ? $event->getBookingCloses()->getValue() : $event->getPeriods()->getItem(0)->getPeriodStart()->getValue(); $eventsArray[] = array_merge( $event->toArray(), [ 'bookable' => $reservationService->isBookable($event, null, $currentDateTime), 'opened' => ($currentDateTime > $bookingOpens) && ($currentDateTime < $bookingCloses), 'closed' => $currentDateTime > $bookingCloses, 'places' => $event->getMaxCapacity()->getValue() - $persons ] ); } $result->setResult(CommandResult::RESULT_SUCCESS); $result->setMessage('Successfully retrieved events'); $result->setData([ Entities::EVENTS => $eventsArray, 'count' => (int)$eventRepository->getFilteredIdsCount($params) ]); return $result; } }