src/Controller/ConventionController.php line 240

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Service\CanonicalRedirectHelper;
  4. use App\Twig\LinkGenerator;
  5. use Carbon\Carbon;
  6. use Elements\Bundle\CmsToolsBundle\Tool\Helper\FunctionsHelper;
  7. use Knp\Component\Pager\PaginatorInterface;
  8. use Pimcore\Model\DataObject\ConventionIncentive;
  9. use Pimcore\Model\DataObject\ConventionPartner;
  10. use Pimcore\Model\DataObject\ConventionPartnerCategory;
  11. use Pimcore\Model\DataObject\DemiInfrastructure;
  12. use Pimcore\Model\DataObject\DemiInfrastructureTopic;
  13. use Pimcore\Model\DataObject\Region;
  14. use Pimcore\Model\DataObject\SiteConfig;
  15. use Pimcore\Model\WebsiteSetting;
  16. use Pimcore\Translation\Translator;
  17. use Symfony\Component\HttpFoundation\JsonResponse;
  18. use Symfony\Component\HttpFoundation\RedirectResponse;
  19. use Symfony\Component\HttpFoundation\Request;
  20. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  21. use Symfony\Component\Routing\Annotation\Route;
  22. class ConventionController extends AbstractController
  23. {
  24.     /**
  25.      * @var LinkGenerator
  26.      */
  27.     private $linkGenerator;
  28.     /**
  29.      * @var array
  30.      */
  31.     private array $mapIds = [];
  32.     private Translator $translator;
  33.     public function __construct(  LinkGenerator $linkGeneratorTranslator $translator)
  34.     {
  35.         $this->linkGenerator $linkGenerator;
  36.         $this->translator $translator;
  37.     }
  38.     public function portalAction(): ?\Symfony\Component\HttpFoundation\Response
  39.     {
  40.         return $this->render("Convention/portal.html.twig");
  41.     }
  42.     public function conventionIncentiveDetailAction(Request $requestLinkGenerator $linkGeneratorCanonicalRedirectHelper $redirectHelper) {
  43.         $incentive ConventionIncentive::getById($request->get('id'0));
  44.         if (!$incentive || !$incentive->isPublished()){
  45.             throw new NotFoundHttpException("the requested object doesn't exist anymore");
  46.         }
  47.         if (CanonicalRedirectHelper::ENABLE_CANONICAL_REDIRECT && $redirect $redirectHelper->canonicalRedirect($incentive)) {
  48.             return $redirect;
  49.         }
  50.         $formSendData = [];
  51.         if ($request->get('isSend'0) && $request->getMethod() == 'POST' ) {
  52.             $formSendData $this->sendContactRequest($request, [$incentive]);
  53.             if($formSendData && $formSendData['redirect']) {
  54.                 return $formSendData['redirect'];
  55.             }
  56.         }
  57.         $partnerTeaser $this->getRandomPartnerForTeaser($incentive$linkGenerator);
  58.         return $this->renderTemplate('Convention/conventionIncentiveDetail.html.twig', [
  59.             'incentive' => $incentive,
  60.             'partnerTeaser' => $partnerTeaser,
  61.             'formSendData' => $formSendData
  62.         ]);
  63.     }
  64.     public function conventionPartnerDetailAction(Request $requestLinkGenerator $linkGeneratorCanonicalRedirectHelper $redirectHelper) {
  65.         $convention ConventionPartner::getById($request->get('id'0));
  66.         if (!$convention || !$convention->isPublished()){
  67.             throw new NotFoundHttpException("the requested object doesn't exist anymore");
  68.         }
  69.         if (CanonicalRedirectHelper::ENABLE_CANONICAL_REDIRECT && $redirect $redirectHelper->canonicalRedirect($convention)) {
  70.             return $redirect;
  71.         }
  72.         $formSendData = [];
  73.         if ($request->get('isSend'0) && $request->getMethod() == 'POST' ) {
  74.             $formSendData $this->sendContactRequest($request, [$convention]);
  75.             if($formSendData && $formSendData['redirect']) {
  76.                 return $formSendData['redirect'];
  77.             }
  78.         }
  79.         $info $this->prepareInfoblocks($convention);
  80.         $incentiveTeaser $this->getRandomIncentivesForTeaser($convention$linkGenerator);
  81.         $demiInfrastructure $this->getDemiInfrastructureTeasers($convention$linkGenerator);
  82.         return $this->renderTemplate('Convention/conventionPartnerDetail.html.twig', [
  83.             'convention' => $convention,
  84.             'info' => $info,
  85.             'incentiveTeaser' => $incentiveTeaser,
  86.             'demiInfrastructure' => $demiInfrastructure,
  87.             'formSendData' => $formSendData
  88.         ]);
  89.     }
  90.     public function eventplannerAction(Request $requestPaginatorInterface $paginator): JsonResponse|\Symfony\Component\HttpFoundation\Response
  91.     {
  92.         $conventionCategories = new ConventionPartnerCategory\Listing();
  93.         $conventionCategories->addConditionParam("notShowInEventplannerFilter is null or notShowInEventplannerFilter = 0");
  94.         $excludedIds $this->getExcludedConventionCategoryIds();
  95.         $conventionPartners = new ConventionPartner\Listing();
  96.         //if locations use category => default every category
  97.         $partnerId null;
  98.         if(($partnerId $request->get('convention-partner')) && $request->get('convention-partner') != 'locations') {
  99.             $conventionPartners->addConditionParam('partnerType__id = :partnerId', ['partnerId' => (int)$partnerId]);
  100.         }
  101.         if(!empty($excludedIds)) {
  102.             $conventionPartners->addConditionParam("partnerType__id NOT IN (" implode(","$excludedIds) . ")");
  103.         }
  104.         $location null;
  105.         if($partnerId == 'locations') {
  106. //            if($location = $request->get('location')) {
  107. //                $conventionPartners->addConditionParam('', ['locations' => $location]);
  108. //            }
  109.             if($category $request->get('category')) {
  110.                 $conventionPartners->addConditionParam('partnerType__id = :category', ['category' => (int)$category]);
  111.             }
  112.             if($q $request->get('keyword')) {
  113.                 $conventionPartners->addConditionParam('name like :q or contactName like :q or city like :q or street like :q or zip like :q or firstname like :q or lastname like :q', ['q' => '%' $q '%']);
  114.             }
  115.             $partnerIds $this->checkCapacityAndSaalStyle($conventionPartners$request);
  116.             if(!empty($partnerIds)) {
  117.                 $conventionPartners->addConditionParam('o_id IN (' implode(','$partnerIds) . ')');
  118.             }
  119.             if($seminarrooms $request->get('seminarrooms')) {
  120.                 $conventionPartners->addConditionParam("length(saele) - length(replace(saele, ',', '')) > :seminarrooms", ['seminarrooms' => $seminarrooms]);
  121.             }
  122.             if($rooms $request->get('rooms')) {
  123.                 $conventionPartners->addConditionParam("roomCount >= :rooms", ['rooms' => (int)$rooms]);
  124.             }
  125.             if($request->get('pkw-checkbox')) {
  126.                 $conventionPartners->addConditionParam("pkwReachable = 1");
  127.             }
  128.         }
  129.         $preparedCategories $this->getConventionCategoriesSelect($conventionCategories$partnerId);
  130.         if ($request->isXmlHttpRequest() && $request->get('pois'false)) {
  131.             return $this->getMapdata($conventionPartners);
  132.         }
  133.         if ($this->getDocumentEditable('checkbox''randomize')->getData()){
  134.             $conventionPartners->setOrderKey('Rand(' Carbon::today()->unix() . ')'false);
  135.         }
  136.         $numTeaser = (int)$this->getDocumentEditable('numeric''teaserPerPage')->getData();
  137.         if($numTeaser 4) {
  138.             $numTeaser 8;
  139.         }
  140.         $pagination $paginator->paginate($conventionPartners$request->get('page'1), $numTeaser);
  141. //        $pagination->setPageRange(5); is default
  142.         if($request->get('ajax') && $request->isXmlHttpRequest() && !$request->get('pois')) {
  143.             $response =[
  144.                 "success" => true,
  145.                 "content" => [
  146.                     'result-main' => $this->render('Convention/Includes/eventplanner-list.html.twig', [
  147.                         'items' => $pagination,
  148.                     ])->getContent(),
  149.                     'result-paging' => $this->renderView('Navigation/paging.html.twig', [
  150.                         'styleModifier' => 'justify-content-center',
  151.                         'ajaxClass' => 'js-ajax-form-map__link',
  152.                         'ajaxPaging' => true,
  153.                         'paginator' => $pagination
  154.                     ]),
  155.                     'result-paging2' => $this->renderView('Navigation/paging.html.twig', [
  156.                         'styleModifier' => 'justify-content-center',
  157.                         'ajaxClass' => 'js-ajax-form-map__link',
  158.                         'ajaxPaging' => true,
  159.                         'paginator' => $pagination
  160.                     ]),
  161.                 ],
  162.             ];
  163.             return new JsonResponse($response);
  164.         }
  165.         $activeWishlistIds array_values(array_map('intval'$request->getSession()->get('wishlistIds', [])));
  166.         return $this->renderTemplate('Convention/eventplanner.html.twig', [
  167.             'partners' => $conventionPartners,
  168.             'conventionCategories' => $conventionCategories,
  169.             'conventionCategoriesSelect' => $preparedCategories['select'],
  170.             'conventionAllCategoriesSelect' => $preparedCategories['selectAll'],
  171.             'locationCategories' => $preparedCategories['locations'],
  172.             'paginator' => $pagination,
  173.             'regionSelect' => [], //$this->getRegionSelectData($location),
  174.             'partnerId' => $partnerId,
  175.             'activeWishlistIds' => $activeWishlistIds
  176.         ]);
  177.     }
  178.     public function conventionFormAction(Request $request) {
  179.         $partnerId $request->get('convention-partner'null);
  180.         $location $request->get('location'null);
  181.         if ($request->getMethod() == 'POST') {
  182.             $formSendData $this->processContactForm($request);
  183.             if($formSendData && $formSendData['redirect']) {
  184.                 return $formSendData['redirect'];
  185.             }
  186.         }
  187.         $conventionCategories = new ConventionPartnerCategory\Listing();
  188.         $preparedCategories $this->getConventionCategoriesSelect($conventionCategories$partnerId);
  189.         return $this->renderTemplate('Convention/conventionForm.html.twig', [
  190.             'conventionCategoriesSelect' => $preparedCategories['select'],
  191.             'regionSelect' => $this->getRegionSelectData($location),
  192.             'conventionAllCategoriesSelect' => $preparedCategories['selectAll'],
  193.             'params' => $request->request->all() ?? [],
  194.         ]);
  195.     }
  196.     public function wishlistEnquiryAction(Request $request) {
  197.         if($request->get('removeAllFromWishlist') !== null) {
  198.             $request->getSession()->set('wishlistIds', []);
  199.         }
  200.         $sessionIds $request->getSession()->get('wishlistIds', []);
  201.         $partners = [];
  202.         if(!empty($sessionIds)) {
  203.             foreach ($sessionIds as $id) {
  204.                 if($partner ConventionPartner::getById($id)) {
  205.                     $partners[] = $partner;
  206.                 }
  207.             }
  208.         }
  209.         if ($request->get('isSend'0) && $request->getMethod() == 'POST' ) {
  210.             $conventions = [];
  211.             foreach($request->get('pool-enquiries') as $enquiry) {
  212.                 if($convention ConventionPartner::getById($enquiry)) {
  213.                     $conventions[] = $convention;
  214.                 }
  215.             }
  216.             $formSendData $this->sendContactRequest($request$conventions);
  217.             if($formSendData && $formSendData['redirect']) {
  218.                 return $formSendData['redirect'];
  219.             }
  220.         }
  221.         return $this->renderTemplate('Convention/wishlistEnquiry.html.twig', [
  222.             'partners' => $partners,
  223.         ]);
  224.     }
  225.     public function incentivesOverviewAction(Request $requestPaginatorInterface $paginator): JsonResponse|\Symfony\Component\HttpFoundation\Response
  226.     {
  227.         $locationId $request->get('location');
  228.         $incentivesListing = new ConventionIncentive\Listing();
  229.         if($locationId) {
  230.             $incentivesListing->addConditionParam('region__id = :locationId', ['locationId' => $locationId]);
  231.         }
  232.         if($this->getDocumentEditable('checkbox''randomize') && $this->getDocumentEditable('checkbox''randomize')->getData()) {
  233.             $incentivesListing->setOrderKey('RAND(CURDATE())'false);
  234.         }
  235.         $numTeaser = (int)$this->getDocumentEditable('numeric''teaserPerPage')->getData();
  236.         if($numTeaser 4) {
  237.             $numTeaser 8;
  238.         }
  239.         $pagination $paginator->paginate($incentivesListing$request->get('page'1), $numTeaser);
  240.         if( $request->isXmlHttpRequest()) {
  241.             $response =[
  242.                 "success" => true,
  243.                 "content" => [
  244.                     'result-main' => $this->render('Convention/Includes/incentives-list.html.twig', [
  245.                         'items' => $pagination,
  246.                     ])->getContent(),
  247.                     'result-paging' => $this->renderView('Navigation/paging.html.twig', [
  248.                         'styleModifier' => 'justify-content-center',
  249.                         'ajaxClass' => 'js-ajax-form__link',
  250.                         'ajaxPaging' => true,
  251.                         'paginator' => $pagination
  252.                     ]),
  253.                 ],
  254.             ];
  255.             return new JsonResponse($response);
  256.         }
  257.         return $this->renderTemplate('Convention/incentivesOverview.html.twig', [
  258.             'paginator' => $pagination,
  259.             'regionSelect' => $this->getRegionSelectData($locationId),
  260.         ]);
  261.     }
  262.     private function getConventionCategoriesSelect(ConventionPartnerCategory\Listing $conventionCategories$partnerId null) : array{
  263.         $conventionCategoriesSelect $conventionAllCategoriesSelect = [[
  264.             "label" => "",
  265.             "value" => "",
  266.             "disabled" => true,
  267.             "selected" =>  !$partnerId,
  268.             "class" => "sr-only"
  269.         ]];
  270.         $locationNames = [];
  271.         $locations = [];
  272.         foreach ($conventionCategories as $category) {
  273.             if($category->getIsLocation()) {
  274.                 $locationNames[] = $category->getName();
  275.                 $locations[] = $category;
  276.                 $conventionAllCategoriesSelect[] = [
  277.                     "label" => $category->getName(),
  278.                     "value" => $category->getId(),
  279.                     "selected" =>  false,
  280.                     "class" => ""
  281.                 ];
  282.             } else {
  283.                 $conventionCategoriesSelect[] = $conventionAllCategoriesSelect[] = [
  284.                     "label" => $category->getName(),
  285.                     "value" => $category->getId(),
  286.                     "selected" =>  ($partnerId && $partnerId == $category->getId()),
  287.                     "class" => ""
  288.                 ];
  289.             }
  290.         }
  291.         $conventionCategoriesSelect[] = [
  292.             "label" => implode(', '$locationNames),
  293.             "value" => 'locations',
  294.             "class" => "",
  295.             "selected" =>  $partnerId && $partnerId === 'locations',
  296.         ];
  297.         return [
  298.             'select' => $conventionCategoriesSelect,
  299.             'selectAll' => $conventionAllCategoriesSelect,
  300.             'locations' => $locations,
  301.         ];
  302.     }
  303.     private function getRandomIncentivesForTeaser(ConventionPartner $partnerLinkGenerator $linkGenerator$numOfTeaser 3) : array {
  304.         $incentives $partner->getDetailRelatedincentives();
  305.         if(empty($incentives)) {
  306.             $incentives = new ConventionIncentive\Listing();
  307.             if($partner->getDetailRadius()) {
  308.                 $functionsHelper = new FunctionsHelper();
  309.                 $distance $functionsHelper->getGeoDistanceQuery($partner->getGeoposition(), 'geoposition');
  310.                 $incentives->addConditionParam('(:distance) <= :detailRadius', ['distance' => $distance'detailRadius' => $partner->getDetailRadius()]);
  311.             }
  312.             $incentives->setOrderKey(['name']);
  313.             $incentives->setOrder(['ASC']);
  314.         }
  315.         $count 0;
  316.         $teaserdata = [];
  317.         foreach ($incentives as $inc) {
  318.             $text '';
  319.             foreach($inc->getTeaserBullets() as $bullet) {
  320.                 $text .= '<li>' $bullet['item']->getData() . '</li>';
  321.             }
  322.             $teaserdata[] = [
  323.                 'title' => $inc->getName(),
  324.                 'badgeText' => $inc->getCity(),
  325.                 'image' => $inc->getTeaserimage(),
  326.                 'wysiwyg' => '<ul>' $text '</ul>',
  327.                 'link' => $linkGenerator->generate($inc),
  328.                 'linktext' => $this->translator->trans('convention-detail.Mehr anzeigen'),
  329.             ];
  330.             $count++;
  331.             if($count >= $numOfTeaser) break;
  332.         }
  333.         return $teaserdata;
  334.     }
  335.     private function getDemiInfrastructureTeasers(ConventionPartner $partnerLinkGenerator $linkGenerator$numOfTeaser 3) : array {
  336.         if($partner->getDetailRelated() && !empty($partner->getDetailRelated())) {
  337.             $demiInfrastructures $partner->getDetailRelated();
  338.         } else {
  339.             $demiInfrastructures DemiInfrastructure::getList();
  340.             $demiInfrastructures->addConditionParam('name is not null and name != ""');
  341.             if($partner->getDetailRadius()) {
  342.                 $functionsHelper = new FunctionsHelper();
  343.                 $distance $functionsHelper->getGeoDistanceQuery($partner->getGeoposition(), 'position');
  344.                 $demiInfrastructures->addConditionParam('(' $distance ') <= :detailRadius', [ 'detailRadius' => $partner->getDetailRadius()]);
  345.             }
  346.             $topics = [];
  347.             if(($infraTypes $partner->getDetailRadiusTypes()) && !empty($infraTypes)) {
  348.                 foreach($infraTypes as $type) {
  349.                     foreach($type->getChildren() as $child) {
  350.                         if($child instanceof DemiInfrastructureTopic) {
  351.                             $topics[] = $child->getId();
  352.                         }
  353.                     }
  354.                 }
  355.             }
  356.             if(($infraTopics $partner->getDetailRadiusTopics()) && !empty($infraTopics)) {
  357.                 foreach ($infraTopics as $topic) {
  358.                     $topics[] = $topic->getId();
  359.                 }
  360.             }
  361.             if(!empty($topics)) {
  362.                 $topics array_unique($topics);
  363.                 $subcondition = [];
  364.                 foreach ($topics as $topic) {
  365.                     $subcondition[] = 'topics LIKE "%,' $topic ',%"';
  366.                     $subcondition[] = 'subTopics LIKE "%,' $topic ',%"';
  367.                 }
  368.                 $demiInfrastructures->addConditionParam('(' implode(' OR '$subcondition) . ')');
  369.             }
  370.             $demiInfrastructures->setOrderKey("RAND()"false);
  371.             $demiInfrastructures->setLimit(3);
  372.         }
  373.         //prepare img-teasers
  374.         $count 0;
  375.         $teaserdata = [];
  376.         foreach ($demiInfrastructures as $infra) {
  377.             $teaserdata[] = [
  378.                 "title" => $infra->getName(),
  379.                 "href" => $this->linkGenerator->generate($infra),
  380.                 "image" => $infra->getFirstImage(),
  381. //                "badgeText" =>  $infra->get(),
  382.                 "isInNav" =>  false,
  383.                 "isSearchTeaser" =>  false,
  384.                 "ratio" =>  null
  385.             ];
  386.             $count++;
  387.             if($count >= $numOfTeaser) break;
  388.         }
  389.         return $teaserdata;
  390.     }
  391.     private function getRegionSelectData($location null): array
  392.     {
  393.         $regions = new Region\Listing();
  394.         $regions->setOrderKey('sorting');
  395.         $regionsSelect = [[
  396.             "label" => "",
  397.             "value" =>  "",
  398.             "disabled" => true,
  399.             "selected" => !$location,
  400.             "class"=>  "sr-only"
  401.         ]];
  402.         foreach ($regions as $region) {
  403.             $regionsSelect[] = [
  404.                 "label" => $region->getName(),
  405.                 "value" => $region->getId(),
  406.                 "class" => "",
  407.                 "selected" => $location && $location == $region->getId(),
  408.             ];
  409.         }
  410.         return $regionsSelect;
  411.     }
  412.     private function prepareInfoblocks(ConventionPartner $convention) : array {
  413.         $infos = ['hotel' => [], 'convention' => []];
  414.         if(!empty($convention->getRoomInfo())) {
  415.             $infos['hotel']['roominfo'] = [
  416.                 "icon" => "bed",
  417.                 "title" => $this->translator->trans("convention-detail.Zimmer"),
  418.                 'data' => [],
  419.             ];
  420.             foreach($convention->getRoomInfo() as $item) {
  421.                 $infos['hotel']['roominfo']['data'][] = $item['item']->getData();
  422.             }
  423.         }
  424.         if(!empty($convention->getHotelInfo())) {
  425.             $infos['hotel']['hotelinfo'] = [
  426.                 "icon" => "house",
  427.                 "title" => $this->translator->trans("convention-detail.Hoteleinrichtungen"),
  428.                 'data' => [],
  429.             ];
  430.             foreach($convention->getHotelInfo() as $item) {
  431.                 $infos['hotel']['hotelinfo']['data'][] = $item['item']->getData();
  432.             }
  433.         }
  434.         if(!empty($convention->getDayroomInfo())) {
  435.             $infos['hotel']['dayrooms'] = [
  436.                 "icon" => "calendar",
  437.                 "title" => $this->translator->trans("convention-detail.Tagungsräume"),
  438.                 'data' => [],
  439.             ];
  440.             foreach($convention->getDayroomInfo() as $item) {
  441.                 $infos['hotel']['dayrooms']['data'][] = $item['item']->getData();
  442.             }
  443.         }
  444.         if(!empty($convention->getGastronomyInfo())) {
  445.             $infos['hotel']['gastronomy'] = [
  446.                 "icon" => "cutlery",
  447.                 "title" => $this->translator->trans("convention-detail.Gastronomie"),
  448.                 'data' => [],
  449.             ];
  450.             foreach($convention->getGastronomyInfo() as $item) {
  451.                 $infos['hotel']['gastronomy']['data'][] = $item['item']->getData();
  452.             }
  453.         }
  454.         if(!empty($convention->getFreetimeInfo())) {
  455.             $infos['hotel']['freetime'] = [
  456.                 "icon" => "shoe",
  457.                 "title" => $this->translator->trans("convention-detail.Freizeiteinrichtungen"),
  458.                 'data' => [],
  459.             ];
  460.             foreach($convention->getFreetimeInfo() as $item) {
  461.                 $infos['hotel']['freetime']['data'][] = $item['item']->getData();
  462.             }
  463.         }
  464.         if(!empty($convention->getSpecialInfo())) {
  465.             $infos['hotel']['special'] = [
  466.                 "icon" => "star",
  467.                 "title" => $this->translator->trans("convention-detail.Besonderheiten"),
  468.                 'data' => [],
  469.             ];
  470.             foreach($convention->getSpecialInfo() as $item) {
  471.                 $infos['hotel']['special']['data'][] = $item['item']->getData();
  472.             }
  473.         }
  474.         if(!empty($convention->getSaele())) {
  475.             foreach ($convention->getSaele() as $saal) {
  476.                 $infos['convention'][$saal->getName()] = [
  477.                     "title" => $saal->getName(),
  478.                     'data' => [],
  479.                     'bestuhlung' => [],
  480.                 ];
  481.                 $infos['convention'][$saal->getName()]['data'][] = $this->translator->trans('convention-detail.saal.Personen(maximal)') . ': ' max($saal->getCapacityBankett(), $saal->getCapacityTheater(), $saal->getCapacityParlament(), $saal->getCapacityUStyle(), $saal->getCapacityReception());
  482.                 $infos['convention'][$saal->getName()]['data'][] =  $this->translator->trans('convention-detail.saal.Größe') . ': ' $saal->getSize();
  483.                 $infos['convention'][$saal->getName()]['data'][]= $this->translator->trans('convention-detail.saal.Tageslicht') . ': ' . ($saal->getDaylight() ? $this->translator->trans('generic.yes') : $this->translator->trans('generic.no'));
  484.                 if($saal->getSpecials()) {
  485.                     $infos['convention'][$saal->getName()]['data'][] = $this->translator->trans('convention-detail.saal.Bodenbelag') . ': ' $saal->getFloorType();
  486.                     $infos['convention'][$saal->getName()]['data'][] = $this->translator->trans('convention-detail.saal.Besonderheiten') . ': ' $saal->getSpecials();
  487.                 }
  488.                 if($saal->getCapacityBankett() > 0) {
  489.                     $infos['convention'][$saal->getName()]['bestuhlung'][] = [
  490.                         'icon' => 'bankett',
  491.                         'text' =>  $this->translator->trans('convention-detail.saal.Bankett') .  ': ' $saal->getCapacityBankett()
  492.                     ];
  493.                 }
  494.                 if($saal->getCapacityTheater() > 0) {
  495.                     $infos['convention'][$saal->getName()]['bestuhlung'][] = [
  496.                         'icon' => 'theater',
  497.                         'text' =>  $this->translator->trans('convention-detail.saal.Theater') .  ': ' $saal->getCapacityTheater()
  498.                     ];
  499.                 }
  500.                 if($saal->getCapacityParlament() > 0) {
  501.                     $infos['convention'][$saal->getName()]['bestuhlung'][] = [
  502.                         'icon' => 'parliament',
  503.                         'text' =>  $this->translator->trans('convention-detail.saal.Parlament') .  ': ' $saal->getCapacityParlament()
  504.                     ];
  505.                 }
  506.                 if($saal->getCapacityUStyle() > 0) {
  507.                     $infos['convention'][$saal->getName()]['bestuhlung'][] = [
  508.                         'icon' => 'u-style',
  509.                         'text' =>  $this->translator->trans('convention-detail.saal.U-Style') .  ': ' $saal->getCapacityUStyle()
  510.                     ];
  511.                 }
  512.                 if($saal->getCapacityReception() > 0) {
  513.                     $infos['convention'][$saal->getName()]['bestuhlung'][] = [
  514.                         'icon' => 'cocktail',
  515.                         'text' =>  $this->translator->trans('convention-detail.saal.Empfang') .  ': ' $saal->getCapacityReception()
  516.                     ];
  517.                 }
  518.             }
  519.         }
  520.         return $infos;
  521.     }
  522.     private function sendContactRequest(Request $request, array $partners) {
  523.         if ($request->get('isSend'0) && !empty($partners) ) {
  524.             $requiredParams = [
  525.                 'arrival' => Carbon::createFromFormat('Y-m-d H:i:s'str_replace('T'''$request->get('arrival')))->format('d.m.Y') ?? null,
  526.                 'departure' => Carbon::createFromFormat('Y-m-d H:i:s',  str_replace('T'''$request->get('departure')))->format('d.m.Y') ?? null,
  527.                 'company' => $request->get('company'),
  528.                 'participants' => $request->get('participants'),
  529.                 'salutation' => $request->get('salutation'),
  530.                 'firstname' => $request->get('firstname'),
  531.                 'lastname' => $request->get('lastname'),
  532.                 'street' => $request->get('street'),
  533.                 'zip' => $request->get('zip'),
  534.                 'city' => $request->get('city'),
  535.                 'country' => $request->get('country'),
  536.                 'phone' => $request->get('phone'),
  537.                 'email' => $request->get('email'),
  538.             ];
  539.             $optionalParams = [
  540.                 'contactType phone' => $request->get('contactType') && $request->get('contactType') == '1' 'checked' 'not checked',
  541.                 'contactType mail' => $request->get('contactType') && $request->get('contactType') == '2''checked' 'not checked',
  542.                 'message' => $request->get('message'),
  543.                 'title' => $request->get('title'),
  544.             ];
  545.             $errors = [];
  546.             foreach ($requiredParams as $key => $param) {
  547.                 if(empty($param)) {
  548.                     $errors[] = $key;
  549.                 }
  550.             }
  551.             foreach ($optionalParams as $key => $param) {
  552.                 if(empty($param)) {
  553.                     unset($optionalParams[$key]);
  554.                 }
  555.             }
  556.             if(!$requiredParams['email'] || !filter_var($requiredParams['email'], FILTER_VALIDATE_EMAIL) ) {
  557.                 $errors[] = 'no valid email';
  558.             }
  559.             $websiteSetting WebsiteSetting::getByName('DefaultSiteConfig');
  560.             if ($websiteSetting instanceof WebsiteSetting) {
  561.                 $config $websiteSetting->getData();
  562.             }
  563.             $success false;
  564.             if(empty($errors) && $config && $config instanceof SiteConfig) {
  565.                 foreach ($partners as $partner) {
  566.                     //build param
  567.                     $params array_merge($requiredParams$optionalParams);
  568.                     $params['items'] = [];
  569.                     if ($partner instanceof ConventionPartner) {
  570.                         $params array_merge($params, ['hotels' => $partner->getName()]); //is overridden later
  571.                         $params['items'] = array_merge($params['items'], ['hotels']);
  572.                     } elseif($partner instanceof ConventionIncentive) {
  573.                         $params array_merge($params, ['incentives' => $partner->getName()]);
  574.                         $params['items'] = array_merge($params['items'], ['incentives']);
  575.                     }
  576.                     $params['items'] = array_merge($params['items'], [
  577.                         'arrival''departure''company''participants''salutation''title',
  578.                         'firstname''lastname',
  579.                         'street''zip''city''country''phone''email',
  580.                         'contactType phone''contactType mail''message'
  581.                     ]);
  582.                     $docs $this->getEmailDocuments($partner$config$request->getLocale());
  583.                     $adminMailDoc $docs['adminMail'];
  584.                     $userMailDoc $docs['userMail'];
  585.                     $successPage $docs['successPage'];
  586.                     if($adminMailDoc) {
  587.                         $adminmail = new \Pimcore\Mail();
  588.                         $adminmail->setDocument($adminMailDoc);
  589.                         if($partner instanceof ConventionPartner && !empty($partner->getEmail())) {
  590.                             $adminmail->addTo($partner->getEmail());
  591.                         } elseif($partner instanceof ConventionIncentive && $partner->getEmail()) {
  592.                             $adminmail->addTo($partner->getEmail());
  593.                         }
  594.                         $adminmail->addReplyTo($requiredParams['email']);
  595.                         $adminmail->setParams($params);
  596.                         $adminmail->send();
  597.                     }
  598.                     if($userMailDoc) {
  599.                         $usermail = new \Pimcore\Mail();
  600.                         $usermail->setDocument($userMailDoc);
  601.                         $usermail->addTo$requiredParams['email']);
  602.                         $usermail->setParams($params);
  603.                         $usermail->send();
  604.                         $success true;
  605.                     }
  606.                     if($successPage) {
  607.                         $redirect = new RedirectResponse($successPage->getFullPath());
  608.                     }
  609.                 }
  610.             }
  611.         }
  612.         return [
  613.             'errors' => $errors ?? [],
  614.             'success' => $success ?? false,
  615.             'redirect' => $redirect ?? null,
  616.         ];
  617.     }
  618.     private function checkCapacityAndSaalStyle(ConventionPartner\Listing $conventionPartnersRequest $request): array
  619.     {
  620.         $idList = [];
  621.         $participant $request->get('participant'); // is a required field
  622.         $any = !($request->get('bankett') | $request->get('theater') | $request->get('parliament') | $request->get('u-style') | $request->get('cocktail'));
  623.         foreach($conventionPartners as $partner) {
  624.             $capacities = [];
  625.             $roomcount $maxAmount 0;
  626.             $bankett $theater $parliament $u_style $cocktail false;
  627.             if (!empty($partner->getSaele())) {
  628.                 foreach ($partner->getSaele() as $saal) {
  629.                     if ($request->get('daylight') && !$saal->getDaylight()) {
  630.                         continue;
  631.                     }
  632.                     $saalmax 0;
  633.                     if($request->get('bankett') || $any) {
  634.                         $saalmax $saal->getCapacityBankett();
  635.                     }
  636.                     if($request->get('theater') || $any) {
  637.                         $saalmax max($saal->getCapacityTheater(), $saalmax);
  638.                     }
  639.                     if($request->get('parliament') || $any) {
  640.                         $saalmax max($saal->getCapacityParlament(), $saalmax);
  641.                     }
  642.                     if($request->get('u_style') || $any) {
  643.                         $saalmax max($saal->getCapacityUStyle(), $saalmax);
  644.                     }
  645.                     if($request->get('cocktail') || $any) {
  646.                         $saalmax max($saal->getCapacityReception(), $saalmax);
  647.                     }
  648.                     $capacities[] = $saalmax;
  649.                     $roomcount++;
  650.                 }
  651.             }
  652.             rsort($capacities);
  653.             for ($i 0$i count($capacities); $i++) {
  654.                 $maxAmount += intval($capacities[$i]);
  655.             }
  656.             if($maxAmount >= $participant ) {
  657.                 $idList[] = $partner->getId();
  658.             }
  659.         }
  660.         return $idList;
  661.     }
  662.     private function processContactForm(Request $request): array
  663.     {
  664.         $requiredParams = [
  665.             "participant" =>  $request->get('participant'),
  666.             "seminarrooms" =>  $request->get('seminarrooms'),
  667.             "rooms" =>  $request->get('rooms'),
  668.             "company" =>  $request->get('company'),
  669.             "salutation" =>  $request->get('salutation'),
  670.             "firstname" =>  $request->get('firstname'),
  671.             "lastname" =>  $request->get('lastname'),
  672.             "street" =>  $request->get('street'),
  673.             "zip" =>  $request->get('zip'),
  674.             "city" =>  $request->get('city'),
  675.             "country" =>  $request->get('country'),
  676.             "email" =>  $request->get('email'),
  677.         ];
  678.         if($request->get('location')) {
  679.             $region Region::getById$request->get('location'));
  680.         }
  681.         if($request->get('category')) {
  682.             $partnerCategory ConventionPartnerCategory::getById($request->get('category'));
  683.         }
  684.         $optionalParams = [
  685.             "convention-partner" =>  $request->get('convention-partner'),
  686.             "region" => $region $region->getName() : null,
  687.             "keyword" =>  $request->get('keyword'),
  688.             "category" =>  $partnerCategory $partnerCategory->getName() : null,
  689.             "bankett" =>  $request->get('bankett') ? 'Checked' 'Not Checked',
  690.             "theater" =>  $request->get('theater') ? 'Checked' 'Not Checked',
  691.             "parliament" =>  $request->get('parliament') ? 'Checked' 'Not Checked',
  692.             "u-style" =>  $request->get('u-style') ? 'Checked' 'Not Checked',
  693.             "cocktail" =>  $request->get('cocktail') ? 'Checked' 'Not Checked',
  694.             "daylight" =>  $request->get"daylight-checkbox") ? 'Checked' 'Not Checked',
  695.             "pkw-available" =>  $request->get('pkw-checkbox') ? 'Checked' 'Not Checked',
  696.             'arrival' => $request->get('arrival') ?  Carbon::createFromFormat('Y-m-d H:i:s'str_replace('T'' '$request->get('arrival')))->format('d.m.Y') : null,
  697.             'departure' => $request->get('departure') ? Carbon::createFromFormat('Y-m-d H:i:s'str_replace('T'' '$request->get('departure')))->format('d.m.Y') : null,
  698.             'title' => $request->get('title'),
  699.             'phone' => $request->get('phone'),
  700.             'contactType phone' => $request->get('contactType') && $request->get('contactType') == '1'  'Checked' 'Not Checked',
  701.             'contactType mail' => $request->get('contactType') && $request->get('contactType') == '2'  'Checked' 'Not Checked',
  702.             'message' => $request->get('message'),
  703.         ];
  704.         $errors = [];
  705.         foreach ($requiredParams as $key => $param) {
  706.             if(empty($param)) {
  707.                 $errors[] = $key;
  708.             }
  709.         }
  710.         if(!$requiredParams['email'] || !filter_var($requiredParams['email'], FILTER_VALIDATE_EMAIL) ) {
  711.             $errors[] = 'no valid email';
  712.         }
  713.         $success false;
  714.         $config $this->document->getProperty('siteConfig');
  715.         if(empty($errors) && $config && $config instanceof SiteConfig) {
  716.             $adminMailDoc $this->getDocumentEditable('relation''adminmail')->getElement();
  717.             $userMailDoc $this->getDocumentEditable('relation''usermail')->getElement();
  718.             $successPage $this->getDocumentEditable('relation''successpage')->getElement();
  719.             $params array_merge($requiredParams$optionalParams);
  720.             $params['items'] = ['salutation''firstname''lastname''category''participant''seminarrooms''bankett''theater''parliament''u-style''cocktail''daylight''pkw-available''rooms''region''keyword''company''street''zip''city''country''phone''email''contactType phone''contactType mail''arrival''departure''message'];
  721.             if($adminMailDoc) {
  722.                 $adminmail = new \Pimcore\Mail();
  723.                 $adminmail->setDocument($adminMailDoc);
  724.                 $adminmail->setReplyTo($requiredParams['email']);
  725.                 $adminmail->setParams($params);
  726.                 $adminmail->send();
  727.             }
  728.             if($userMailDoc) {
  729.                 $usermail = new \Pimcore\Mail();
  730.                 $usermail->setDocument($userMailDoc);
  731.                 $usermail->addTo$requiredParams['email']);
  732.                 $usermail->setParams($params);
  733.                 $usermail->send();
  734.             }
  735.             if($successPage) {
  736.                 $redirect = new RedirectResponse($successPage->getFullPath());
  737.             }
  738.             $success true;
  739.         }
  740.         return [
  741.             'errors' => $errors ?? [],
  742.             'success' => $success ?? false,
  743.             'redirect' => $redirect ?? null,
  744.         ];
  745.     }
  746.     private function getRandomPartnerForTeaser(ConventionIncentive $incentiveLinkGenerator $linkGenerator$numOfTeaser 3) : array {
  747.         //see if manual incentive
  748.         //if not take radom
  749.             //if detailradius
  750.             //if detailradiusCategories
  751.             //if detailradiusClassifications
  752.         $partners = [];
  753.         if($incentive->getDetailRelated() && !empty($incentive->getDetailRelated())) {
  754.             $partners $incentive->getDetailRelated();
  755.         } else {
  756.             $partners = new ConventionPartner\Listing();
  757.             $partners->addConditionParam('name is not null and name != ""');
  758.             if($incentive->getDetailRadius()) {
  759.                 $functionsHelper = new FunctionsHelper();
  760.                 $distance $functionsHelper->getGeoDistanceQuery($incentive->getGeoposition(), 'geoposition');
  761.                 $partners->addConditionParam('(:distance) <= :detailRadius', ['distance' => $distance'detailRadius' => $incentive->getDetailRadius()]);
  762.             }
  763.             $partners $partners->getObjects();
  764.             shuffle($partners);
  765.         }
  766.         //prepare img-teasers
  767.         $count 0;
  768.         $teaserdata = [];
  769.         foreach ($partners as $partner) {
  770.             $teaserdata[] = [
  771.                 "title" => $partner->getName(),
  772.                 "href" => $linkGenerator->generate($partner),
  773.                 "image" => $partner->getTeaserimage(),
  774.                 "badgeText" =>  $partner->getCity(),
  775.                 "isInNav" =>  false,
  776.                 "isSearchTeaser" =>  false,
  777.                 "ratio" =>  null
  778.             ];
  779.             $count++;
  780.             if($count >= $numOfTeaser) break;
  781.         }
  782.         return $teaserdata;
  783.     }
  784.     private function getMailFromDemi(ConventionPartner $partner)
  785.     {
  786.         if (!empty($mails) && method_exists($partner'getDemiAccommodation') && $partner->getDemiAccommodation()) {
  787.             $addressPriorities = ['Venue''Object''ExternalAddress''Organizer''Owner'];
  788.             $addresses $partner->getDemiAccommodation() ? $partner->getDemiAccommodation()->getAddresses() : [];
  789.             foreach ($addresses as $address) {
  790.                 $addressType $address->getAddressType();
  791.                 if (in_array($addressType$addressPriorities)) {
  792.                     $mainAddress $address;
  793.                     break;
  794.                 }
  795.             }
  796.             if ($mainAddress && $mainAddress->getEmail()) {
  797.                 return $mainAddress->getEmail();
  798.             }
  799.         }
  800.         return null;
  801.     }
  802.     /**
  803.      * @Route("/{_locale}/interactive-map-info-box", name="interactive-map-info-box")
  804.      */
  805.     public function getMapInfoBox(Request $requestLinkGenerator $linkGenerator) {
  806.         $partner ConventionPartner::getById($request->get('id'null));
  807.         $document $this->document;
  808.         $locale $document->getProperty('language') ?? $request->getLocale();
  809.         if($partner) {
  810.             $wysiwyg '<ul>';
  811.             foreach($partner->getTeaserBullets($locale) as $bulletpoint) {
  812.                 $wysiwyg .= '<li>'  $bulletpoint['item']->getData() . '</li>';
  813.             }
  814.             $wysiwyg .= '</ul>';
  815.             return $this->json([
  816.                 'success' => true,
  817.                 'html' => $this->renderView('Convention/Includes/interactive-map-info-box.html.twig', [
  818.                     'image' => $partner->getTeaserimage(),
  819.                     'subtitle' => $partner->getShortdescription($locale),
  820.                     'title' => $partner->getName($locale),
  821.                     'wysiwyg' => $wysiwyg,
  822.                     'link' => $linkGenerator->generate($partner, ['document' => $document]),
  823.                     'id' => $request->get('id')
  824.                 ])
  825.             ]);
  826.         }
  827.     }
  828.     public function getMapdata($items): JsonResponse
  829.     {
  830.         $geoData = [];
  831.         foreach ($items as $partner) {
  832.             if($partner) {
  833.                 $geo $partner->getGeoposition();
  834.                 if($geo) {
  835.                     $geoData[] = [
  836.                         "id" => $partner->getId(),
  837.                         "lat" => $geo->getLatitude(),
  838.                         "lng" => $geo->getLongitude(),
  839.                         "detailInfoBoxUrl" => $this->generateUrl('interactive-map-info-box',[
  840.                             'id' => $partner->getId(),
  841.                             ])
  842.                     ];
  843.                 }
  844.             }
  845.         }
  846.         return new JsonResponse([
  847.             "success" => true,
  848.             "pois" => $geoData
  849.         ]);
  850.     }
  851.     /**
  852.      * @Route("/{_locale}/add-to-wishlist", name="add-to-wishlist")
  853.      */
  854.     public function addToWishlist(Request $request): JsonResponse
  855.     {
  856.         $id $request->get('id');
  857.         $wishlistId $request->get('wishlistId');
  858.         $sessionIds $request->getSession()->get('wishlistIds', []);
  859.         $sessionIds[] = $id;
  860.         $request->getSession()->set('wishlistIds'$sessionIds);
  861.         $returnArr['ids'] = $sessionIds;
  862.         $url $this->document->getProperty('siteConfig') ? ($this->document->getProperty('siteConfig')->getWatchlistOverview() ?: '#') : '#';
  863.         return new JsonResponse([
  864.             "success" => true,
  865.             "activeIds" => array_values(array_map('intval',$sessionIds)),
  866.             "__alertNotification" => [
  867.                 "type" => "notification-default",
  868.                 "content" =>  $this->renderView('Convention/Includes/add-wishlist-notification-content.html.twig', [
  869.                     'url' => $url
  870.                 ])
  871.             ]
  872.         ]);
  873.     }
  874.     /**
  875.      * @Route("/{_locale}/remove-from-wishlist", name="remove-from-wishlist")
  876.      */
  877.     public function removeFromWishlist(Request $request): JsonResponse
  878.     {
  879.         $id $request->get('id');
  880.         $wishlistId $request->get('wishlistId');
  881.         $sessionIds $request->getSession()->get('wishlistIds', []);
  882.         if (($key array_search($id$sessionIds)) !== false) {
  883.             unset($sessionIds[$key]);
  884.         }
  885.         $request->getSession()->set('wishlistIds'$sessionIds);
  886.         $returnArr['ids'] = $sessionIds;
  887.         $url $this->document->getProperty('siteConfig') ? ($this->document->getProperty('siteConfig')->getWatchlistOverview() ?: '#') : '#';
  888.         return new JsonResponse([
  889.             "success" => true,
  890.             "activeIds" =>  array_values(array_map('intval',$sessionIds)),
  891.             "__alertNotification" => [
  892.                 "type" => "notification-default",
  893.                 "content" =>  $this->renderView('Convention/Includes/remove-wishlist-notification-content.html.twig', [
  894.                     'url' => $url,
  895.                 ])
  896.             ]
  897.         ]);
  898.     }
  899.     private function getExcludedConventionCategoryIds()
  900.     {
  901.         $excludedCategories = new ConventionPartnerCategory\Listing();
  902.         $excludedCategories->addConditionParam("notShowInEventplannerFilter is not null and notShowInEventplannerFilter = 1");
  903.         $ids = [];
  904.         if($excludedCategories->getCount() > 0) {
  905.             $ids array_map(function ($cat) {
  906.                 return $cat->getId();
  907.             }, $excludedCategories->getObjects());
  908.         }
  909.         return $ids;
  910.     }
  911.     /**
  912.      * @param mixed $partner
  913.      * @param SiteConfig $fallbackConfig
  914.      * @param string $locale
  915.      * @return array
  916.      */
  917.     private function getEmailDocuments(mixed $partnerSiteConfig $fallbackConfigstring $locale)
  918.     {
  919.         //initalize with fallback values
  920.         $adminmail =  $fallbackConfig->getConventionPartnerDetailContactFormAdminMail($locale);
  921.         $usermail =  $fallbackConfig->getConventionPartnerDetailContactFormUserMail($locale);
  922.         $successPage =  $fallbackConfig->getConventionPartnerDetailContactFormSuccessPage($locale);
  923.         $regionconfig null;
  924.         if($partner instanceof ConventionPartner && count($partner->getRegions()) > && ($region $partner->getRegions()[0]) && $region->getSiteConfig() && $region->getSiteConfig()->getId() !== $fallbackConfig->getId()) {
  925.             $regionconfig $region->getSiteConfig();
  926.         } elseif( $partner instanceof ConventionIncentive && ($region $partner->getRegion()) &&  $region->getSiteConfig() && $region->getSiteConfig()->getId() !== $fallbackConfig->getId()) {
  927.             $regionconfig $region->getSiteConfig();
  928.         }
  929.         if($regionconfig) {
  930.             if($regionconfig->getConventionPartnerDetailContactFormAdminMail($locale)) {
  931.                 $adminmail $regionconfig->getConventionPartnerDetailContactFormAdminMail($locale);
  932.             }
  933.             if($regionconfig->getConventionPartnerDetailContactFormUserMail($locale)) {
  934.                 $usermail =  $regionconfig->getConventionPartnerDetailContactFormUserMail($locale);
  935.             }
  936.             if($regionconfig->getConventionPartnerDetailContactFormSuccessPage($locale)) {
  937.                 $successPage $regionconfig->getConventionPartnerDetailContactFormSuccessPage($locale);
  938.             }
  939.         }
  940.         return [
  941.             'adminMail' => $adminmail,
  942.             'userMail' => $usermail,
  943.             'successPage' => $successPage,
  944.         ];
  945.     }
  946. }