vendor/marketingfactory/destisuite/src/DestiSuiteBundle/Controller/AccommodationsController.php line 949

Open in your IDE?
  1. <?php
  2. namespace DestiSuiteBundle\Controller;
  3. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
  4. use Symfony\Component\HttpFoundation\Request;
  5. use Symfony\Component\Routing\Annotation\Route;
  6. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  7. use DestiSuiteBundle\Controller\BaseController;
  8. use DestiSuiteBundle\Model\DataObject\Accommodation\Accommodation;
  9. use DestiSuiteBundle\Importer\Accommodation\Importer\AccommodationImporter;
  10. use DestiSuiteBundle\Model\DataObject\Accommodation\AccoCustomOffer;
  11. use DestiSuiteBundle\Model\DataObject\Accommodation\AccoCustomFilterCategory;
  12. use DestiSuiteBundle\Model\DataObject\Accommodation\AccoCustomFilterLocation;
  13. use DestiSuiteBundle\Model\DataObject\Accommodation\AccommodationMarketingGroup;
  14. use DestiSuiteBundle\Model\DataObject\Accommodation\AccommodationStar;
  15. use DestiSuiteBundle\Model\DataObject\Accommodation\AccoCustomFilterClassification;
  16. use DestiSuiteBundle\Model\DataObject\Accommodation\AccoCustomFacilityGroup;
  17. use DestiSuiteBundle\Model\DataObject\Accommodation\AccoCustomFilterOfferFacility;
  18. use DestiSuiteBundle\Model\DataObject\Accommodation\AccommodationPackage;
  19. use DestiSuiteBundle\Model\DataObject\Accommodation\AccoCustomFilterMarketingGroup;
  20. use DestiSuiteBundle\Importer\Accommodation\RequestHelper\AccommodationAvailabilityHelper;
  21. use DestiSuiteBundle\Importer\Accommodation\RequestHelper\AccommodationAvailabilityByNameHelper;
  22. use DestiSuiteBundle\Importer\Accommodation\RequestHelper\AccommodationAvailabilityInternalHelper;
  23. use DestiSuiteBundle\Importer\Accommodation\RequestHelper\AccommodationSearchByOfferHelper;
  24. use DestiSuiteBundle\Model\DataObject\Accommodation\AccommodationFacility;
  25. use DestiSuiteBundle\Model\DataObject\MultisiteOwner;
  26. use DestiSuiteBundle\Twig\Extension\AccommodationExtension;
  27. use DestiSuiteBundle\Importer\Accommodation\RequestHelper\AccommodationAvailabilityHelperAbstract;
  28. class AccommodationsController extends BaseController
  29. {
  30.     const DATE_TO_MIN_INTERVAL 1;
  31.     const DATE_TO_DEFAULT_INTERVAL 1;
  32.     const DEFAULT_AGES_PRO_ROOM = ['18,18'];
  33.     
  34.     /**
  35.      * @Template
  36.      * @Route("/{_locale}/testtosc5", name="accommodations-testtosc5")
  37.      */
  38.     public function testtosc5Action(Request $request)
  39.     {
  40.         
  41.     }
  42.     /**
  43.      * @Template
  44.      * @Route("/{_locale}/testtosc5landing/{fid}", name="accommodations-testtosc5-landing")
  45.      */
  46.     public function testtosc5landingAction(Request $request$fid)
  47.     {
  48.         $entity Accommodation::getByFid($fid1);
  49.         
  50.         return [
  51.             'entity' => $entity
  52.         ];
  53.     }
  54.     /**
  55.      * @Template
  56.      * @Route("/{_locale}/acco-custom-search", name="accommodations-custom-search")
  57.      */    
  58.     public function customsearchredirectAction(Request $request)
  59.     {
  60.         
  61.     }
  62.     
  63.     /**
  64.      * @Template
  65.      */    
  66.     public function indexAction(Request $request)
  67.     {
  68.         return [
  69.             'scrollToWidget' => !empty($request->get('ds-autoscroll')) 
  70.         ];
  71.     }
  72.     
  73.     
  74.     /**
  75.      * @Template
  76.      * @Route("/{_locale}/accommodations-listing", name="accommodations-listing")
  77.      */
  78.     public function listingAction(Request $request)
  79.     {
  80.         $multisiteOwner $this->document->getProperty('multisiteOwner');
  81.         
  82.         $filters $this->getCurrentFilter($request);
  83.         $arrival $filters['arrival'];
  84.         $departure $filters['departure'];
  85.         $categories $filters['custom_categories'];
  86.         $subcategory $filters['custom_subcategory'];
  87.         $mealCode $filters['mealCode'];
  88.         $currentLocations $filters['custom_locations'];
  89.         $currentCustomFacilities $filters['currentCustomFacilities'];
  90.         $currentCustomOfferFacilities $filters['currentCustomOfferFacilities'];
  91.         $currentCustomMarketingGroups $filters['currentCustomMarketingGroups'];
  92.         $forceFids $filters['force-fids'];
  93.         $feratel_package_id $filters['feratel_package_id'];
  94.         $validDates $filters['validDates'];
  95.         
  96.         $return = array(
  97.             'special_layout' => $request->get('special_layout'),
  98.             'arrival' => $arrival,
  99.             'departure' => $departure,
  100.             'mealCode' => $mealCode,
  101.             'no_date' => $filters['no_date'],
  102.             'bookable_only' => $filters['bookable_only'],
  103.             'today' => new \DateTime(),
  104.         );
  105.         
  106.         $datepickerDateTo = new \DateTime();
  107.         $datepickerDateTo->add(new \DateInterval('P'.self::DATE_TO_MIN_INTERVAL.'D'));
  108.         $return['datepickerDateTo'] = $datepickerDateTo;
  109.         
  110.         $limit 10;
  111.         
  112.         $isMapView false;
  113.         if ($request->get('view') == 'map') {
  114.             $isMapView true;
  115.             $limit 9999999;
  116.         }
  117.         
  118.         $lifetime 60 60;
  119.         $cacheKey md5('acco_listing_seed');
  120.         if(!$randomSeed \Pimcore\Cache::load($cacheKey)) {
  121.             $randomSeed time();
  122.             \Pimcore\Cache::save(
  123.                 $randomSeed,
  124.                 $cacheKey,
  125.                 ["seed"],
  126.                 $lifetime
  127.             );
  128.         }
  129.         /*
  130.         $randomSeed = $request->get('randomSeed');
  131.         if (empty($randomSeed)) {
  132.             $randomSeed = time();
  133.         }
  134.         if (!$request->query->has('randomSeed')) {
  135.             $request->query->add(['randomSeed' => $randomSeed]);
  136.         }
  137.          */
  138.         
  139.         $roomType null;
  140.         if (!empty($categories)) {
  141.             $roomTypes_tmp = [];
  142.             foreach ($categories as $catTmp) {
  143.                 if (!isset($roomTypes_tmp[$catTmp->getOnlyRoomType()])) {
  144.                     $roomTypes_tmp[$catTmp->getOnlyRoomType()] = 0;
  145.                 }
  146.                 $roomTypes_tmp[$catTmp->getOnlyRoomType()]++;
  147.             }
  148.             
  149.             foreach ($roomTypes_tmp as $catTmpIndex => $counterTmp) {
  150.                 if (count($categories) == $counterTmp) {
  151.                     $roomType $catTmpIndex;
  152.                 }
  153.             }
  154.         }
  155.         
  156.         $orderBy $request->get('order_by');
  157.         $availabilityHelper $this->search($request->get('_locale'), $limit$arrival$departure, [
  158.             'forceFids' => $forceFids,
  159.             'classifications' => $filters['classifications'],
  160.             'marketingGroupFids' => $filters['marketingGroupFids'],
  161.             'cmsOfferId' => $filters['cmsOfferId'],
  162.             'cmsOfferPeriod' => $filters['cmsOfferPeriod'],
  163.             'custom_categories' => $categories,
  164.             'custom_subcategory' => $subcategory,
  165.             'mealCode' => $mealCode,
  166.             'custom_locations' => $currentLocations,
  167.             'customFacilities' => $currentCustomFacilities,
  168.             'customOfferFacilities' => $currentCustomOfferFacilities,
  169.             'customMarketingGroups' => $currentCustomMarketingGroups,
  170.             'accommodation_name' => $request->get('accommodation_name'),
  171.             'no_date' => $filters['no_date'],
  172.             'bookable_only' => $filters['bookable_only'],
  173.             'page' => $request->get('page'),
  174.             'ages' => $request->get('ages'),
  175.             'roomType' => $roomType,
  176.             'randomSeed' => $randomSeed,
  177.             'apiResultId' => $request->get('apiResultId'),
  178.             'feratel_package_id' => $feratel_package_id,
  179.         ], false$orderBy);
  180.         if ($isMapView) {
  181.             
  182.             $markerDatas Accommodation::getMapMarkerData($request->get('_locale'), $availabilityHelper->getCurrentPageFids(), $arrival$departure$request);
  183.             
  184.             $return['markerDatas'] = $markerDatas;
  185.             
  186.         } else {
  187.             
  188.             $entities Accommodation::getByFids$availabilityHelper->getCurrentPageFids() );
  189.             $return['entities'] = $entities;
  190.             $paginator $availabilityHelper->getPaginator($request->get('page'1), $limit);
  191.             $return['paginator'] = $paginator;
  192.             
  193.         }
  194.         
  195.         try {
  196.             $allFids $availabilityHelper->getAllFids();
  197.         } catch (\DestiSuiteBundle\Exception\ComplexRequestException $ex) {
  198.             $allFids null;
  199.             $return['all_fids_request_fid'] = $ex->getLtsSearchFid();
  200.         }
  201.         $return['all_fids'] = $allFids;
  202.         
  203.         $return['classifications'] = AccoCustomFilterClassification::getEntities();
  204.         $return['priceMap'] = $availabilityHelper->getPriceFromMap();
  205.         $return['hasOneBookable_map'] = $availabilityHelper->getHasOneBookableMap();
  206.         $return['numTotalResults'] = $availabilityHelper->getNumResult();
  207.         
  208.         
  209.         $return['categories'] = AccoCustomFilterCategory::getEntities();
  210.         
  211.         $return['subcategory'] = $subcategory;
  212.         
  213.         $return['mealCodes'] = AccommodationAvailabilityHelper::getMealCodes();
  214.         $return['mealCode'] = $mealCode;
  215.         
  216.         $locations AccoCustomFilterLocation::getEntities($multisiteOwner);
  217.         $return['locations'] = $locations;
  218.         
  219.         $return['custom_facilities'] = AccoCustomFacilityGroup::getOrderedList($multisiteOwner); 
  220.         
  221.         $return['currentCustomFacilities'] = $currentCustomFacilities;
  222.         $return['currentCustomFacilitiesIds'] = $request->get('custom_facilities');
  223.         
  224.         $return['custom_offer_facilities'] = AccoCustomFilterOfferFacility::getOrderedList($multisiteOwner); 
  225.         $return['currentCustomOfferFacilities'] = $currentCustomOfferFacilities;
  226.         $return['currentCustomOfferFacilitiesIds'] = $request->get('custom_offer_facilities');
  227.         
  228.         $return['custom_mktGroups'] = AccoCustomFilterMarketingGroup::getOrderedList($multisiteOwner); 
  229.         $return['currentCustomMarketingGroups'] = $currentCustomMarketingGroups;
  230.         $return['currentCustomMarketingGroupsIds'] = $this->removeEmptyValFromRequest($request'custom_mktGroups');
  231.         
  232.         $return['viewType'] = $request->get('view');
  233.         
  234.         $return['noLayout'] = $request->get('noLayout');
  235.         
  236.         $return['feratel_package_id'] = $feratel_package_id;
  237.         
  238.         $return['validDates'] = $validDates;
  239.         
  240.         $cmsOfferPeriodItem null;
  241.         // LAYOUT FOR A SPECIFIC OFFER
  242.         if (!empty($request->get('cmsOffer'))) {
  243.             $offer AccoCustomOffer::getById$request->get('cmsOffer') );
  244.             $cmsOfferPeriod $request->get('cmsOfferPeriod');
  245.             if (!empty($offer) && empty($cmsOfferPeriod)) {
  246.                 $cmsOfferPeriod 0;
  247.             }
  248.             if (!empty($offer)) {
  249.                 $cmsOfferPeriodItem $offer->getValidPeriodByIndex($cmsOfferPeriod);
  250.             }
  251.             $return['offer'] = $offer;
  252.             $return['cmsOfferPeriod'] = $cmsOfferPeriod;
  253.             
  254.         } else {
  255.             
  256.             $offers AccoCustomOffer::getEntities($multisiteOwner);
  257.             $return['offers'] = $offers;
  258.             
  259.         }
  260.         $return['cmsOfferPeriodItem'] = $cmsOfferPeriodItem;
  261.         
  262.         
  263.         $return['marketingGroupFids'] = $filters['marketingGroupFids'];
  264.         // LAYOUT FOR MARKETING GROUPS
  265.         $displayMarketingGroups = array();
  266.         if (!empty($filters['displayMarketingGroupFids'])) {
  267.             $displayMarketingGroups AccommodationMarketingGroup::getByFids($filters['displayMarketingGroupFids']);
  268.         }
  269.         $return['displayMarketingGroups'] = $displayMarketingGroups;
  270.         
  271.         // $this->setCurrentDocumentOrRouteCanonical('accommodations-listing'); // TODO GF - DS canonical thema, reinsert
  272.         
  273.         $return['bundleType'] = \Pimcore::getContainer()->getParameter('ds_accommodation_bundle')['type'];
  274.         
  275.         return $return;
  276.     }   
  277.     
  278.     private function getCurrentFilter(Request $request)
  279.     {
  280.         $feratel_package_id $request->get('feratel_package_id');
  281.         
  282.         $validDates = [];
  283.         if (!empty($feratel_package_id)) {
  284.             $packageObj AccommodationPackage::getByFid($feratel_package_id1);
  285.             if (!empty($packageObj)) {
  286.                 $singleDates $packageObj->getSingleDates(nulltrue);
  287.                 foreach ($singleDates as $singleDateTmp) {
  288.                     $validDates[] = $singleDateTmp['date']->format('Y-m-d');
  289.                 }
  290.             }
  291.         }
  292.         
  293.         $cmsOfferId $request->get('cmsOffer');
  294.         $cmsOfferPeriod = (int) $request->get('cmsOfferPeriod');
  295.         
  296.         $offer AccoCustomOffer::getById$request->get('cmsOffer') );
  297.         $offerPeriod null;
  298.         if (!empty($offer)) {
  299.             $offerPeriod $offer->getValidPeriodByIndex($cmsOfferPeriod);
  300.         }
  301.         
  302.         
  303.         $explicitSearch false;
  304.         $arrival null;
  305.         $departure null;
  306.         $noDates null;
  307.         $bookableOnly null;
  308.         
  309.         if (!empty($request->get('bookable_only'))) {
  310.             $bookableOnly $request->get('bookable_only');
  311.         }
  312.         
  313.         if (!empty($offerPeriod)) {
  314.             
  315.             $tmp AccoCustomOffer::getPeriodInitialSearchDates($offerPeriod);
  316.             if (!empty($tmp['arrival']) && !empty($tmp['departure'])) {
  317.                 $arrival $tmp['arrival'];
  318.                 $departure $tmp['departure'];
  319.             } else {
  320.                 $arrival = new \DateTime();
  321.                 $departure = clone $arrival;
  322.                 $departure->add( new \DateInterval('P'.self::DATE_TO_DEFAULT_INTERVAL.'D') );
  323.             }
  324.         } else {
  325.             
  326.             if (\Pimcore::getContainer()->getParameter('ds_accommodation_bundle')['type'] == 'custom' ||
  327.                     !empty($request->get('no_date')) 
  328.                     || (empty($request->get('arrival')) && empty($request->get('departure')) && $this->document->getProperty('ds_acco_listing_no_dates') )) {
  329.                 
  330.                 $noDates true;
  331.                 
  332.             } else {
  333.                 
  334.                 if (!empty($request->get('arrival')) && !empty($request->get('departure'))) {
  335.                     $explicitSearch true;
  336.                 }
  337.                 if (empty($request->get('arrival'))) {
  338.                     if (empty($validDates)) {
  339.                         $arrival = new \DateTime('now');
  340.                     } else {
  341.                         $arrival = new \DateTime($validDates[0]);
  342.                     }
  343.                 } else {
  344.                     $arrival explode('.'$request->get('arrival'));
  345.                     if (count($arrival) == 3) {
  346.                         $arrival $arrival[2].'-'.$arrival[1].'-'.$arrival[0];
  347.                     } else {
  348.                         $arrival 'now';
  349.                     }
  350.                     try {
  351.                         $arrival = new \DateTime$arrival );
  352.                     } catch (\Exception $ex) {
  353.                         $arrival = new \DateTime('now');
  354.                     }
  355.                 }
  356.                 if (empty($request->get('departure'))) {
  357.                     $departure = clone $arrival;
  358.                     $departure->add( new \DateInterval('P'.self::DATE_TO_DEFAULT_INTERVAL.'D') );
  359.                 } else {
  360.                     $departure explode('.'$request->get('departure'));
  361.                     if (count($departure) == 3) {
  362.                         try {
  363.                             $departure $departure[2].'-'.$departure[1].'-'.$departure[0];
  364.                             $departure = new \DateTime$departure );
  365.                             $departure $departure;
  366.                         } catch (\Exception $ex) {
  367.                             $departure = new \DateTime('now');
  368.                             $departure->add( new \DateInterval('P'.self::DATE_TO_DEFAULT_INTERVAL.'D') );
  369.                         }
  370.                     } else {
  371.                         $departure = new \DateTime'now' );
  372.                         $departure->add( new \DateInterval('P'.self::DATE_TO_DEFAULT_INTERVAL.'D') );
  373.                     }
  374.                 }
  375.                 
  376.             }
  377.             
  378.         }
  379.         
  380.         
  381.         $categories = array();
  382.         if (!empty($request->get('accommodationCategory'))) {
  383.             foreach ($request->get('accommodationCategory') as $catTmp) {
  384.                 $tmp AccoCustomFilterCategory::getById($catTmp);
  385.                 if (!empty($tmp)) {
  386.                     $categories[] = $tmp;
  387.                 }
  388.             }
  389.             // $category = AccommodationCategory::getByFid($request->get('accommodationCategory'), 1);
  390.         }
  391.         
  392.         $subcategory null;
  393.         /*
  394.         if (!empty($request->get('accommodationCategory'))) {
  395.             $subcategory = AccoCustomFilterCategory::getById($request->get('accommodationSubcategory'), 1);
  396.         }*/
  397.         
  398.         $mealCode null;
  399.         if (!empty($categories) && count($categories) == && !empty($categories[0]->getOrMealCodes())) {
  400.             $mealCode $categories[0]->getOrMealCodes();
  401.         }
  402.         if (!empty($request->get('mealCode'))) {
  403.             $mealCodeTmp = array();
  404.             foreach ($request->get('mealCode') as $tmp) {
  405.                 if (!empty($tmp)) {
  406.                     $mealCodeTmp[] = $tmp;
  407.                 }
  408.             }
  409.             
  410.             if (!empty($mealCodeTmp)) {
  411.                 $mealCode $mealCodeTmp;
  412.             }
  413.         }
  414.         
  415.         $locations = array();
  416.         if (!empty($request->get('accommodationLocation'))) {
  417.             foreach ($request->get('accommodationLocation') as $locId) {
  418.                 $tmp AccoCustomFilterLocation::getById($locId);
  419.                 if (!empty($tmp)) {
  420.                     $locations[] = $tmp;
  421.                 }
  422.             }
  423.         }
  424.         
  425.         $currentCustomFacilities null;
  426.         if (!empty($request->get('custom_facilities'))) {
  427.             $currentCustomFacilities AccoCustomFacilityGroup::getByIds($request->get('custom_facilities'));
  428.         }
  429.         
  430.         $currentCustomOfferFacilities null;
  431.         if (!empty($request->get('custom_offer_facilities'))) {
  432.             $currentCustomOfferFacilities AccoCustomFilterOfferFacility::getByIds($request->get('custom_offer_facilities'));
  433.         }
  434.         
  435.         $currentCustomMarketingGroups null;
  436.         if (!empty($request->get('custom_mktGroups'))) {
  437.             $currentCustomMarketingGroups AccoCustomFilterMarketingGroup::getByIds$this->removeEmptyValFromRequest($request'custom_mktGroups') );
  438.         }
  439.         
  440.         $marketingGroupFids null;
  441.         if (!empty($request->get('marketingGroupFids'))) {
  442.             $marketingGroupFids $request->get('marketingGroupFids');
  443.         }
  444.         
  445.         $displayMarketingGroupFids null;
  446.         if (!empty($request->get('displayMarketingGroupFids'))) {
  447.             $displayMarketingGroupFids $request->get('displayMarketingGroupFids');
  448.             
  449.             if (empty($marketingGroupFids)) {
  450.                 $marketingGroupFids = array($displayMarketingGroupFids[0]);
  451.             }
  452.             
  453.             if (!empty($request->get('displayMarketingGroupFids_hide_first'))) {
  454.                 array_shift($displayMarketingGroupFids);
  455.             }
  456.         }
  457.         
  458.         $classifications = array();
  459.         if (!empty($request->get('classifications'))) {
  460.             foreach ($request->get('classifications') as $classificationId) {
  461.                 $eTmp AccoCustomFilterClassification::getById($classificationId);
  462.                 if (!empty($eTmp)) {
  463.                     $classifications[] = $eTmp;
  464.                 }
  465.             }
  466.         }
  467.         
  468.         if (!empty($arrival)) {
  469.             $arrival->setTime(0,0,0);
  470.         }
  471.         if (!empty($departure)) {
  472.             $departure->setTime(0,0,0);
  473.         }
  474.         
  475.         return array(
  476.             'arrival' => $arrival,
  477.             'departure' => $departure,
  478.             'custom_categories' => $categories,
  479.             'custom_subcategory' => $subcategory,
  480.             'mealCode' => $mealCode,
  481.             'custom_locations' => $locations,
  482.             'currentCustomFacilities' => $currentCustomFacilities,
  483.             'currentCustomOfferFacilities' => $currentCustomOfferFacilities,
  484.             'currentCustomMarketingGroups' => $currentCustomMarketingGroups,
  485.             'explicitSearch' => $explicitSearch,
  486.             
  487.             'cmsOfferId' => $cmsOfferId,
  488.             'cmsOfferPeriod' => $cmsOfferPeriod,
  489.             
  490.             'displayMarketingGroupFids' => $displayMarketingGroupFids,
  491.             'marketingGroupFids' => $marketingGroupFids,
  492.             
  493.             'classifications' => $classifications,
  494.             
  495.             'no_date' => $noDates,
  496.             'bookable_only' => $bookableOnly,
  497.             'force-fids' => $request->get('force-fids'),
  498.             
  499.             'feratel_package_id' => $feratel_package_id,
  500.             'validDates' => $validDates,
  501.         );
  502.     }
  503.     
  504.     /**
  505.      * 
  506.      * @param \DateTime $datetimeFrom
  507.      * @param \DateTime $datetimeTo
  508.      * @param type $filters --- 'custom_categories', 'mealCode', 'custom_locations', 'facilities', 'page', 'accommodation_name', 'no_date', 'bookable_only', 'accommodation_fid'
  509.      *      'ages' (array of comma separated ages. one element of array correspond to occupancy of one room)
  510.      * 
  511.      * @param $orderBy --- AccommodationAvailabilityHelperAbstract::ORDER_BY_**** constant
  512.      */
  513.     private function search($locale$limit\DateTime $datetimeFrom null\DateTime $datetimeTo null$filters = array(), $isDetailRequest false$orderBy null)
  514.     {
  515.         // multisiteOwner
  516.         $multisiteOwner $this->document->getProperty('multisiteOwner');
  517.             
  518.         if (!empty($filters['cmsOfferId'])) {
  519.             $offer AccoCustomOffer::getById($filters['cmsOfferId']);
  520.             $period null;
  521.             if (!empty($offer)) {
  522.                 $cmsOfferPeriod = (int) $filters['cmsOfferPeriod'];
  523.                 $period $offer->getValidPeriodByIndex($cmsOfferPeriod);
  524.             }
  525.             
  526.             $helper = new AccommodationSearchByOfferHelper();
  527.             $helper->setOfferFilter($offer$period);
  528.             $helper->language $locale;
  529.             
  530.         } else if (!empty($filters['accommodation_name'])) {
  531.             
  532.             $helper = new AccommodationAvailabilityByNameHelper();
  533.             $helper->language $locale;
  534.             $helper->accommodationName $filters['accommodation_name'];
  535.             
  536.         } elseif (!empty($filters['no_date']) || (empty($datetimeFrom) || empty($datetimeTo))) {
  537.             
  538.             $helper = new AccommodationAvailabilityInternalHelper();
  539.             $helper->language $locale;
  540.             
  541.         } else {
  542.             
  543.             if (\Pimcore::getContainer()->getParameter('ds_accommodation_bundle')['type'] == 'custom') {
  544.                 
  545.                 $helper = new AccommodationAvailabilityInternalHelper();
  546.                 $helper->language $locale;
  547.                 
  548.             } else {
  549.                 
  550.                 $helper = new AccommodationAvailabilityHelper($datetimeFrom$datetimeTo);
  551.                 $helper->language $locale;
  552.                 if (!empty($filters['mealCode'])) {
  553.                     $helper->mealCode $filters['mealCode'];
  554.                 }
  555.                 
  556.             }
  557.             
  558.             if (!empty($filters['accommodation_fid'])) {
  559.                 $entity Accommodation::getByFid($filters['accommodation_fid'], 1);
  560.                 if (!empty($entity)) {
  561.                     $helper->setAccommodationsFidsFilter([$entity->getFid()]);
  562.                 }
  563.             }
  564.         }
  565.         
  566.         if (method_exists($helper'setDsBoardCodes')) {
  567.             $boardCodes = array();
  568.             
  569.             if (!empty($filters['mealCode'])) {
  570.                 if (\Pimcore::getContainer()->getParameter('ds_accommodation_bundle')['type'] == 'lts') {
  571.                     $boardMap \DestiSuiteBundle\Importer\LTS\Accommodation\Request\AccommodationDataSearchRQRequest::$mealTypeMapping_destisuiteCodes;
  572.                     foreach ($filters['mealCode'] as $mealCodeTmp) {
  573.                         if (!empty($boardMap$mealCodeTmp ])) {
  574.                             $boardCodes[] = $boardMap$mealCodeTmp ];
  575.                         }
  576.                     }
  577.                 } elseif (\Pimcore::getContainer()->getParameter('ds_accommodation_bundle')['type'] == 'feratel' || 
  578.                         \Pimcore::getContainer()->getParameter('ds_accommodation_bundle')['type'] == 'custom') {
  579.                     foreach ($filters['mealCode'] as $mealCodeTmp) {
  580.                         $tmp AccommodationAvailabilityHelperAbstract::convertFeratelToInternalMealCode($mealCodeTmp);
  581.                         if (!empty($tmp)) {
  582.                             $boardCodes[] = $tmp;
  583.                         }
  584.                     }
  585.                 }
  586.             }
  587.             $helper->setDsBoardCodes($boardCodes);
  588.         }
  589.         
  590.         if (method_exists($helper'setIsDetailRequest')) {
  591.             if (!empty($isDetailRequest)) {
  592.                 $helper->setIsDetailRequest(true);
  593.             } else {
  594.                 $helper->setIsDetailRequest(false);
  595.             }
  596.         }
  597.         
  598.         if (method_exists($helper'setOfferPackageFidsFilter') && !empty($filters['feratel_package_id'])) {
  599.             $helper->setOfferPackageFidsFilter( [$filters['feratel_package_id']] );
  600.         }
  601.         
  602.         // filter by multiple fids
  603.         if (method_exists($helper'setAccommodationsFidsFilter') && !empty($filters['forceFids'])) {
  604.             /*$accoTmps = array();
  605.             foreach ($filters['forceFids'] as $fidTmp) {
  606.                 $entity = Accommodation::getByFid($fidTmp, 1);
  607.                 if (!empty($entity)) {
  608.                     $accoTmps[] = $entity;
  609.                 }
  610.             }*/
  611.             
  612.             $helper->setAccommodationsFidsFilter($filters['forceFids']);
  613.         }
  614.         
  615.         if (method_exists($helper'setWebsite')) {
  616.             $helper->setWebsite($multisiteOwner);
  617.         }
  618.         
  619.         /*
  620.         if (method_exists($helper, 'setLocationFilter') && !empty($filters['custom_location'])) {
  621.             $helper->setLocationsFilter(array($filters['custom_location']));
  622.         }
  623.          */
  624.         if (method_exists($helper'setCustomLocationFilter')) {
  625.             $locationFilter $filters['custom_locations'];
  626.             if (empty($locationFilter) && !empty($multisiteOwner) && !empty($multisiteOwner->getAccoCustomFilterLocations())) {
  627.                 $locationFilter $multisiteOwner->getAccoCustomFilterLocations();
  628.             }
  629.             
  630.             $helper->setCustomLocationFilter($locationFilter);
  631.         }
  632.         /*
  633.         if (method_exists($helper, 'setCategoriesFilter') && !empty($filters['category'])) {
  634.             $helper->setCategoriesFilter(array($filters['category']));
  635.         }
  636.         */
  637.         
  638.         if (method_exists($helper'setCustomCategoryFilter')) {
  639.             if (!empty($filters['custom_subcategory'])) {
  640.                 $helper->setCustomCategoryFilter($filters['custom_subcategory']);
  641.             } elseif (!empty($filters['custom_categories'])) {
  642.                 $helper->setCustomCategoryFilter($filters['custom_categories']);
  643.             }
  644.         }
  645.         if (method_exists($helper'setFacilitiesFilter') && !empty($filters['facilities'])) {
  646.             $helper->setFacilitiesFilter($filters['facilities']);
  647.         }
  648.         
  649.         if (method_exists($helper'setCustomFacilitiesFilter') && !empty($filters['customFacilities'])) {
  650.             $helper->setCustomFacilitiesFilter($filters['customFacilities']);
  651.         }
  652.         
  653.         if (method_exists($helper'setCustomOfferFacilitiesFilter') && !empty($filters['customOfferFacilities'])) {
  654.             $helper->setCustomOfferFacilitiesFilter($filters['customOfferFacilities']);
  655.         }
  656.         
  657.         if (method_exists($helper'setCustomMarketingGroupFilter') && !empty($filters['customMarketingGroups'])) {
  658.             $helper->setCustomMarketingGroupFilter($filters['customMarketingGroups']);
  659.         }
  660.         
  661.         if (!empty($filters['ages'])) {
  662.             for ($i=0$i<count($filters['ages']); $i++) {
  663.                 $filters['ages'][$i] = explode(','$filters['ages'][$i]);
  664.             }
  665.         } else {
  666.             $filters['ages'][0] = array(18,18); // default value
  667.         }
  668.         if (method_exists($helper'setAgesProRooom') && !empty($filters['ages'])) {
  669.             $helper->setAgesProRooom($filters['ages']);
  670.         }
  671.         
  672.         if (method_exists($helper'setMarketingGroupFidsFilter')) {
  673.             if (!empty($filters['marketingGroupFids'])) {
  674.                 $helper->setMarketingGroupFidsFilter($filters['marketingGroupFids']);
  675.             } else {
  676.                 if (!empty($multisiteOwner) && $multisiteOwner->getAccoFilterByMarketingGroup()) {
  677.                     $mktGrpFids = array();
  678.                     foreach ($multisiteOwner->getAccoFilterByMarketingGroup() as $mktTmp) {
  679.                         $mktGrpFids[] = $mktTmp->getFid();
  680.                     }
  681.                     $helper->setMarketingGroupFidsFilter($mktGrpFids);
  682.                 }
  683.             }
  684.         }
  685.         if (method_exists($helper'setClassificationFidsFilter') && !empty($filters['classifications'])) {
  686.             $classificationFids = array();
  687.             foreach ($filters['classifications'] as $classEntity) {
  688.                 foreach ($classEntity->getClassifications() as $c) {
  689.                     if (!in_array($c->getFid(), $classificationFids)) {
  690.                         $classificationFids[] = $c->getFid();
  691.                     }
  692.                 }
  693.             }
  694.             $helper->setClassificationFidsFilter$classificationFids );
  695.         }
  696.         
  697.         if (method_exists($helper'setRoomType') && !empty($filters['roomType'])) {
  698.             $helper->setRoomType($filters['roomType']);
  699.         }
  700.         
  701.         if (method_exists($helper'setBookableOnly') && !empty($filters['bookable_only'])) {
  702.             $helper->setBookableOnly($filters['bookable_only']);
  703.         }
  704.         
  705.         if (!empty($filters['page'])) {
  706.             $helper->page $filters['page'];
  707.         } else {
  708.             $helper->page 1;
  709.         }
  710.         
  711.         $helper->setLimit($limit);
  712.         
  713.         if (method_exists($helper'setRandomSeed') && !empty($filters['randomSeed'])) {
  714.             $helper->setRandomSeed($filters['randomSeed']);
  715.         }
  716.         
  717.         if (method_exists($helper'setApiResultId') && !empty($filters['apiResultId'])) {
  718.             $helper->setApiResultId($filters['apiResultId']);
  719.         }
  720.         $helper->setOrderBy($orderBy);
  721.         
  722.         $helper->search();
  723.         
  724.         return $helper;
  725.     }
  726.     
  727.     
  728.     /**
  729.      * @Template
  730.      * @Route("/{_locale}/ajax-accommodation", name="accommodations-ajax-detail")
  731.      */
  732.     public function ajaxdetailAction(Request $request)
  733.     {
  734.         $translateUrls = array();
  735.         
  736.         foreach (self::getModuleLanguages() as $lang) {
  737.             $translateUrls[$lang] = $this->get('router')->generate('accommodations-ajax-detail', ['_locale' => $lang]);
  738.         }
  739.         
  740.         return [
  741.             'special_layout' => $request->get('special_layout'),
  742.             'bodyClass' => 'ds-body-obj-detail',
  743.             'translateUrls' => $translateUrls
  744.         ];
  745.     }
  746.     
  747.     /**
  748.      * @Route("/{_locale}/ajax-accommodation-url/{id}", name="accommodations-ajax-detail-url")
  749.      */
  750.     public function ajaxdetailurlAction(Request $request)
  751.     {
  752.         $entity Accommodation::getById($request->get('id'));
  753.         if (empty($entity)) {
  754.             throw new NotFoundHttpException('Not found.');
  755.         }
  756.         
  757.         $multisiteOrigin $request->get('multisiteOrigin');
  758.         $url \Pimcore::getContainer()->get('DestiSuiteBundle\LinkGenerator\AccommodationLinkGenerator')->generate($entity$_GET);
  759.         
  760.         $languageSwitch \Pimcore::getContainer()->get('DestiSuiteBundle\LinkGenerator\AccommodationLinkGenerator')->languageSwitchUrls($entityself::getModuleLanguages());
  761.         
  762.         $url $this->addDsBasicAuth([$url])[0];
  763.         
  764.         return $this->json([
  765.             'url' => $url,
  766.             'languageSwitch' => $languageSwitch,
  767.             'url_relative' => \Pimcore::getContainer()->get('DestiSuiteBundle\LinkGenerator\AccommodationLinkGenerator')->generate($entity, ['multisiteOrigin' => $multisiteOrigin], true),
  768.             'title' => $entity->getName(),
  769.         ]);
  770.     }
  771.     
  772.     /**
  773.      * Calculated locally
  774.      * $mealCode - list of submitted meal codes
  775.      */
  776.     private function initializeRoomPrice($roomEntites$mealCodes$arrival$departure$ages)
  777.     {
  778.         $numPerson 2;// default
  779.         $requestedRoom 1;
  780.         if (!empty($ages)) {
  781.             $numPerson 0;
  782.             $requestedRoom 0;
  783.             foreach($ages as $agesProRoom) {
  784.                 $agesProRoom explode(','$agesProRoom);
  785.                 $numPerson += count($agesProRoom);
  786.                 $requestedRoom++;
  787.             }
  788.         }
  789.         
  790.         $roomPriceMap = array();
  791.         $roomMealcodeMap = array();
  792.         
  793.         $converted = array();
  794.         if (empty($mealCodes)) {
  795.             if (\Pimcore::getContainer()->getParameter('ds_accommodation_bundle')['type'] == 'lts') {
  796.                 $mealCodes AccommodationAvailabilityHelperAbstract::getLtsMealCodes();
  797.             } else {
  798.                 $mealCodes AccommodationAvailabilityHelperAbstract::getFeratelMealCodes();
  799.             }
  800.         }
  801.         
  802.         foreach ($mealCodes as $mealCodeEl) {
  803.             $feratelMealCode AccommodationAvailabilityHelperAbstract::convertLtsToFeratelMealCode($mealCodeEl);
  804.             $converted[] = $feratelMealCode;
  805.         }
  806.         
  807.         // fill with first possible price
  808.         foreach ($roomEntites as $roomEntity) {
  809.             if (empty($roomPriceMap[$roomEntity->getFid()])) {
  810.                 foreach ($converted as $cosideredMealCode) {
  811.                     $priceTmp \DestiSuiteBundle\Model\DataObject\Accommodation\AccommodationRoom::calculatePrice($roomEntity$arrival$departure$cosideredMealCode);
  812.                     if (!empty($priceTmp)) {
  813.                         $roomPriceMap[$roomEntity->getFid()] = $priceTmp;
  814.                         $roomMealcodeMap[$roomEntity->getFid()] = $cosideredMealCode;
  815.                     }
  816.                 }
  817.             }
  818.         }
  819.         
  820.         // re-convert meal codes
  821.         if (\Pimcore::getContainer()->getParameter('ds_accommodation_bundle')['type'] == 'lts') {
  822.             foreach ($roomMealcodeMap as $roomFid => $code) {
  823.                 $roomMealcodeMap[$roomFid] = AccommodationAvailabilityHelperAbstract::convertFeratelToLtsMealCode($code);
  824.             } 
  825.         }
  826.         
  827.         // calculate price for total person
  828.         $totalPriceMap = array();
  829.         foreach ($roomEntites as $roomEntity) {
  830.             $numNecessaryRoom 0;
  831.             if (!empty($roomEntity->getMaxOccupancy())) {
  832.                 $numNecessaryRoom ceil$numPerson $roomEntity->getMaxOccupancy() );
  833.                 if ($requestedRoom $numNecessaryRoom) {
  834.                     $numNecessaryRoom $requestedRoom;
  835.                 }
  836.                 
  837.                 if (!empty($roomPriceMap$roomEntity->getFid() ])) {
  838.                     $totalPriceMap$roomEntity->getFid() ] = $numNecessaryRoom $roomPriceMap$roomEntity->getFid() ];
  839.                 }
  840.             }
  841.         }
  842.         return [
  843.             'roomPriceMap' => $totalPriceMap,
  844.             'roomPriceMap_unit' => $roomPriceMap,
  845.             'roomMealcodeMap' => $roomMealcodeMap,
  846.         ];
  847.     }
  848.     
  849.     /** 
  850.      * @Template
  851.      * @Route({
  852.          "en": "/{_locale}/where-to-stay-lrq/{slug}_{id}",
  853.          "de": "/{_locale}/unterkuenfte-lrq/{slug}_{id}",
  854.          "it": "/{_locale}/dove-dormire-lrq/{slug}_{id}",
  855.          "nl": "/{_locale}/where-to-stay-lrq/{slug}_{id}",
  856.          "pl": "/{_locale}/where-to-stay-lrq/{slug}_{id}",
  857.          "cs": "/{_locale}/where-to-stay-lrq/{slug}_{id}",
  858.          "fr": "/{_locale}/where-to-stay-lrq/{slug}_{id}"
  859.         },  name="accommodations-detail-for-request")
  860.      */
  861.     public function detailforrequestAction(Request $request)
  862.     {
  863.         $this->addResponseHeader('X-Robots-Tag''noindex'false$request);
  864.         
  865.         $this->addResponseHeader('Access-Control-Allow-Origin''*'false$request);
  866.         $this->addResponseHeader('Access-Control-Allow-Headers'"origin, x-requested-with, content-type, authorization"false$request);
  867.         // $this->addResponseHeader('Access-Control-Allow-Methods', "GET,POST,OPTIONS,DELETE,PUT", false, $request);
  868.         
  869.         $multisiteOwner $this->document->getProperty('multisiteOwner');
  870.         $id $request->get('id');
  871.         $entity Accommodation::getById($id);
  872.         
  873.         if (empty($entity)) {
  874.             throw new NotFoundHttpException('Not found.');
  875.         }
  876.         if(empty($this->verifyPreviewRequest($request$entity)) && !in_array($request->get('_locale'), self::getModuleLanguages())) {
  877.             throw new NotFoundHttpException('Not found.');
  878.         }
  879.         
  880.         if (empty($entity->hasDetailPageInWebsite($multisiteOwner)) && !$this->verifyPreviewRequest($request$entity)) {
  881.             throw new NotFoundHttpException('Accommodation not found.');
  882.         }
  883.         
  884.         $multisiteOrigin $request->get('multisiteOrigin');
  885.         if (!empty($multisiteOrigin)) {
  886.             $multisiteOrigin MultisiteOwner::getById($multisiteOrigin);
  887.             $multisiteOwner $multisiteOrigin;
  888.         }
  889.         
  890.         
  891.         return [
  892.             'translateUrls' => \Pimcore::getContainer()->get('DestiSuiteBundle\LinkGenerator\AccommodationLinkGenerator')->languageSwitchUrls($entityself::getModuleLanguages()),
  893.             'hasCaptcha' => true,
  894.             'entity' => $entity,
  895.             'bundleType' => \Pimcore::getContainer()->getParameter('ds_accommodation_bundle')['type'],
  896.             'today' => new \DateTime(),
  897.             'multisiteOrigin' => $multisiteOwner,
  898.             'mealCodes' => AccommodationAvailabilityHelper::getMealCodes($entity),
  899.         ];
  900.     }
  901.     
  902.     /** 
  903.      * @Template
  904.      * @Route({
  905.          "en": "/{_locale}/where-to-stay/{slug}_{id}",
  906.          "de": "/{_locale}/unterkuenfte/{slug}_{id}",
  907.          "it": "/{_locale}/dove-dormire/{slug}_{id}",
  908.          "nl": "/{_locale}/where-to-stay/{slug}_{id}",
  909.          "pl": "/{_locale}/where-to-stay/{slug}_{id}",
  910.          "cs": "/{_locale}/where-to-stay/{slug}_{id}",
  911.          "fr": "/{_locale}/where-to-stay/{slug}_{id}"
  912.         },  name="accommodations-detail")
  913.      */
  914.     public function detailAction(Request $request)
  915.     {
  916.         $this->addResponseHeader('Access-Control-Allow-Origin''*'false$request);
  917.         $this->addResponseHeader('Access-Control-Allow-Headers'"origin, x-requested-with, content-type, authorization"false$request);
  918.         // $this->addResponseHeader('Access-Control-Allow-Methods', "GET,POST,OPTIONS,DELETE,PUT", false, $request);
  919.         
  920.         $multisiteOwner $this->document->getProperty('multisiteOwner');
  921.         $id $request->get('id');
  922.         $entity Accommodation::getById($id);
  923.         
  924.         if (empty($entity)) {
  925.             throw new NotFoundHttpException('Not found.');
  926.         }
  927.         if(empty($this->verifyPreviewRequest($request$entity)) && !in_array($request->get('_locale'), self::getModuleLanguages())) {
  928.             throw new NotFoundHttpException('Not found.');
  929.         }
  930.         
  931.         if (empty($entity->hasDetailPageInWebsite($multisiteOwner)) && !$this->verifyPreviewRequest($request$entity)) {
  932.             throw new NotFoundHttpException('Accommodation not found.');
  933.         }
  934.         
  935.         $multisiteOrigin $request->get('multisiteOrigin');
  936.         if (!empty($multisiteOrigin)) {
  937.             $multisiteOrigin MultisiteOwner::getById($multisiteOrigin);
  938.             $multisiteOwner $multisiteOrigin;
  939.         }
  940.         
  941.         $filters $this->getCurrentFilter($request);
  942.         $arrival $filters['arrival'];
  943.         $departure $filters['departure'];
  944.         $categories $filters['custom_categories'];
  945.         $mealCode $filters['mealCode'];
  946.         $locations $filters['custom_locations'];
  947.         $currentCustomFacilities $filters['currentCustomFacilities'];
  948.         $feratel_package_id $filters['feratel_package_id'];
  949.         
  950.         $availabilityHelper $this->search($request->get('_locale'), 1$arrival$departure, [
  951.             'custom_categories' => $categories,
  952.             'mealCode' => $mealCode,
  953.             'custom_locations' => $locations,
  954.             'customFacilities' => $currentCustomFacilities,
  955.             'accommodation_fid' => $entity->getFid(),
  956.             'no_date' => $filters['no_date'],
  957.             //'page' => $request->get('page'),
  958.             'ages' => $request->get('ages'),
  959.             'feratel_package_id' => $feratel_package_id,
  960.         ], truenull);
  961.         
  962.         $priceMap $availabilityHelper->getPriceFromMap();
  963.         $hasOneBookable_map $availabilityHelper->getHasOneBookableMap();
  964.         
  965.         if (empty($arrival) || empty($departure)) {
  966.             $arrival = new \DateTime'now' );
  967.             $departure = new \DateTime'now' );
  968.             $departure->add( new \DateInterval('P'.self::DATE_TO_DEFAULT_INTERVAL.'D') );
  969.         }
  970.         
  971.         $offers AccoCustomOffer::getOfferByAccommodation($entity,$multisiteOwner); 
  972.         
  973.         $bodyClass 'ds-body-obj-detail ds-accoDetail';
  974.         if (!empty($priceMap) && !empty($priceMap[$entity->getFid()]) && !empty($priceMap[$entity->getFid()]['price'])) {
  975.             $bodyClass .= ' ds-hasBookingBar';
  976.         }
  977.         
  978.         $adultNum 2;
  979.         $childAges = [];
  980.         if (method_exists($availabilityHelper'getAdultNum')) {
  981.             $adultNum $availabilityHelper->getAdultNum();
  982.         }
  983.         if (method_exists($availabilityHelper'getChildAges')) {
  984.             $childAges $availabilityHelper->getChildAges();
  985.         }
  986.         
  987.         $datepickerDateTo = new \DateTime();
  988.         $datepickerDateTo->add(new \DateInterval('P'.self::DATE_TO_MIN_INTERVAL.'D'));
  989.         
  990.         
  991.         // rooms data
  992. ########## DISABLE LOCAL CALULCATION ##########
  993. #        // initialize with entity datas
  994. #        $tmpData = $this->initializeRoomPrice($entity->getRooms(), $mealCode, $arrival, $departure, $request->get('ages'));
  995. #// echo "<!-- local prices \n" . print_r($tmpData, true) . "\n -->";
  996. #        $roomPricesMap = $tmpData['roomPriceMap'];
  997. #        $roomMealMap = $tmpData['roomMealcodeMap'];
  998. ##########
  999.         
  1000.         $roomPricesMap = [];
  1001.         $roomMealMap = [];
  1002.         
  1003.         if (method_exists($availabilityHelper'getRoomPriceMap')) {
  1004.             $roomPricesMapTmp $availabilityHelper->getRoomPriceMap();
  1005.             foreach ($roomPricesMapTmp as $roomFid => $priceTmp) {
  1006.                 $roomPricesMap$roomFid ] = $priceTmp;
  1007.             }
  1008.         }
  1009.         
  1010.         if (method_exists($availabilityHelper'getRoomMealMap')) {
  1011.             $roomMealMapTmp $availabilityHelper->getRoomMealMap();
  1012.             foreach ($roomMealMapTmp as $roomFid => $roomMealTmp) {
  1013.                 $roomMealMap$roomFid ] = $roomMealTmp;
  1014.             }
  1015.         }
  1016.         
  1017. // echo "<!-- api data \n" .  print_r([$roomPricesMap, $roomMealMap], true) . "\n -->";
  1018.         $roomNumBookableMap = array();
  1019.         if (method_exists($availabilityHelper'getRoomNumAvailableMap')) {
  1020.             $roomNumBookableMap $availabilityHelper->getRoomNumAvailableMap();
  1021.         }
  1022.         
  1023.         $bookableRooms $this->buildBookableRoomData($entity$roomPricesMap$roomNumBookableMap$roomMealMap$arrival$departure);
  1024.         // end rooms data
  1025.         
  1026.         
  1027.         $ltsWidgetData null;
  1028.         if (\Pimcore::getContainer()->getParameter('ds_accommodation_bundle')['type'] == 'lts') {
  1029.             $ltsWidgetData $this->ltsWidgetUrlData($request$availabilityHelper$filters$multisiteOwner);
  1030.         }
  1031.         
  1032.         
  1033.         return [
  1034.             'openBookingTag' => $request->get('openBookingTag') || !empty( $request->get('datatransTrxId') ),
  1035.             'special_layout' => $request->get('special_layout'),
  1036.             'explicitSearch' => $filters['explicitSearch'],
  1037.             'arrival' => $arrival,
  1038.             'departure' => $departure,
  1039.             'feratel_package_id' => $feratel_package_id,
  1040.             'datepickerDateTo' => $datepickerDateTo,
  1041.             'mealCode' => $mealCode,
  1042.             'adultNum' => $adultNum,
  1043.             'childAges' => $childAges,
  1044.             'mealCodes' => AccommodationAvailabilityHelper::getMealCodes($entity),
  1045.             'translateUrls' => \Pimcore::getContainer()->get('DestiSuiteBundle\LinkGenerator\AccommodationLinkGenerator')->languageSwitchUrls($entityself::getModuleLanguages()),
  1046.             'offers' => $offers,
  1047.             
  1048.             'bodyClass' => $bodyClass,
  1049.             
  1050.             'hasCaptcha' => true,
  1051.             
  1052.             'priceMap' => $priceMap,
  1053.             'hasOneBookable_map' => $hasOneBookable_map,
  1054.             'entity' => $entity,
  1055.             
  1056.             'bundleType' => \Pimcore::getContainer()->getParameter('ds_accommodation_bundle')['type'],
  1057.             'bookableRooms' => $bookableRooms,
  1058.             
  1059.             'ltsWidgetData' => $ltsWidgetData,
  1060.             
  1061.             'today' => new \DateTime(),
  1062.             'multisiteOrigin' => $multisiteOwner,
  1063.         ];
  1064.     }
  1065.     
  1066.     private function ltsWidgetUrlData(Request $request$availabilityHelper$filters$multisiteOwner)
  1067.     {
  1068.         $today = new \DateTime();
  1069.         $today->setTime(0,0,0);
  1070.         $arrival $filters['arrival'];
  1071.         $departure $filters['departure'];
  1072.         if (empty($arrival) || empty($departure) || 
  1073.                 $arrival->getTimestamp() < $today->getTimestamp() || $departure->getTimestamp() < $today->getTimestamp()) {
  1074.             $arrival = clone $today;
  1075.             $departure = clone $today;
  1076.             $departure->add(new \DateInterval('P1D'));
  1077.         }
  1078.         $arrival $arrival->format('Y-m-d');
  1079.         $departure $departure->format('Y-m-d');
  1080.         
  1081.         
  1082.         $ages $request->get('ages');
  1083.         $numRoom 1;
  1084.         if (!empty($ages)) {
  1085.             $numRoom count($ages);
  1086.         }
  1087.         
  1088.         
  1089.         $adultCounterPerRoom = [];
  1090.         $childCounterPerRoom = [];
  1091.         $childAges = [];
  1092.         if (!empty($ages)) {
  1093.             foreach ($ages as $roomAgeList) {
  1094.                 $roomAgeList explode(','$roomAgeList);
  1095.                 $childPerRoomTmp 0;
  1096.                 $adultPerRoomTmp 0;
  1097.                 $childAgesPerRoomTmp = [];
  1098.                 foreach ($roomAgeList as $ageTmp) {
  1099.                     if ($ageTmp 18) {
  1100.                         $childPerRoomTmp++;
  1101.                         $childAgesPerRoomTmp[] = $ageTmp;
  1102.                     } else {
  1103.                         $adultPerRoomTmp++;
  1104.                     }
  1105.                 }
  1106.                 
  1107.                 $childAges[] = implode(','$childAgesPerRoomTmp);
  1108.                 $childCounterPerRoom[] = $childPerRoomTmp;
  1109.                 $adultCounterPerRoom[] = $adultPerRoomTmp;
  1110.             }
  1111.         }
  1112.         
  1113.         $mealCode $filters['mealCode'];
  1114.         $boardTransformed '';
  1115.         if (!empty($mealCode)) {
  1116.             if (is_array($mealCode)) {
  1117.                 $boardTransformed AccommodationExtension::app_acco_lts_meal_type_to_bookingwidget($mealCode[0]);
  1118.             } else {
  1119.                 $boardTransformed AccommodationExtension::app_acco_lts_meal_type_to_bookingwidget($mealCode);
  1120.             }
  1121.         }
  1122.         
  1123.         $ltsWidgetId \Pimcore::getContainer()->getParameter('lts_interface')['widgetId'];
  1124.         if (!empty($multisiteOwner) && !empty($multisiteOwner->getLtsAccoBookingWidgetId())) {
  1125.             $ltsWidgetId $multisiteOwner->getLtsAccoBookingWidgetId();
  1126.         }
  1127.         
  1128.         return array(
  1129.             'ltsWidgetId' => $ltsWidgetId,
  1130.             'ltsTypeRoom' => 15// TODO GF DS LTS - change
  1131.             'ltsNumRooms' => $numRoom,
  1132.             'ltsNumAdults' => implode(';'$adultCounterPerRoom),
  1133.             'ltsNumChildren' => implode(';'$childCounterPerRoom), // num children pro room
  1134.             'ltsChildrenAges' => implode(';'$childAges),
  1135.             'ltsArrival' => $arrival,
  1136.             'ltsDeparture' => $departure,
  1137.             'boardTransformed' => $boardTransformed,
  1138.         );
  1139.     }
  1140.     
  1141.     private function buildBookableRoomData($entity$roomPrices$roomNumBookable$roomMealMap$arrival$departure)
  1142.     {
  1143.         $databookableRooms = array();
  1144.         // $searchResult['roomPrices'];//
  1145.         $roomObjs $entity->getRooms();
  1146.         
  1147.         if (!empty($roomObjs)) {
  1148.             foreach ($roomObjs as $roomObj) {
  1149.                 $dataImages = array();
  1150.                 if (!empty($roomObj->getImages())) {
  1151.                     foreach ($roomObj->getImages() as $imgTmp) {
  1152.                         $dataImages[] = AccommodationExtension::ds_acco_resizeImgUrl($imgTmp->getUrl(), 'listing');
  1153.                     }
  1154.                 }
  1155.                 $roomPrice null;
  1156.                 if (!empty( $roomPrices[$roomObj->getFid()] )) {
  1157.                     $roomPrice $roomPrices[$roomObj->getFid()];
  1158.                 }
  1159.                 $roomNumOnlineBookable null;
  1160.                 if (isset( $roomNumBookable[$roomObj->getFid()] )) {
  1161.                     $roomNumOnlineBookable $roomNumBookable[$roomObj->getFid()];
  1162.                 }
  1163.                 
  1164.                 $roomMeal null;
  1165.                 if (!empty($roomMealMap) && !empty($roomMealMap[$roomObj->getFid()])) {
  1166.                     $roomMeal $roomMealMap[$roomObj->getFid()];
  1167.                 }
  1168.     
  1169.                 $roomData = array(
  1170.                     'id' => $roomObj->getId(),
  1171.                     'fid' => $roomObj->getFid(),
  1172.                     'roomCode' => $roomObj->getRoomCode(),
  1173.                     'name' => $roomObj->getName(),
  1174.                     'serviceList' => $roomObj->getServiceList(),
  1175.                     'images' => $dataImages,
  1176.                     'roomPrice' => $roomPrice,
  1177.                     'roomMeal' => $roomMeal,
  1178.                     'roomNumOnlineBookable' => $roomNumOnlineBookable,
  1179.                     'areaSize' => $roomObj->getAreaSize(),
  1180.                     'minOccupancy' => $roomObj->getMinOccupancy(),
  1181.                     'maxOccupancy' => $roomObj->getMaxOccupancy(),
  1182.                     'isSingleRoomNotAvailable' => \DestiSuiteBundle\Model\DataObject\Accommodation\AccommodationRoom::isSingleRoomNotAvailable($roomObj$arrival$departure),
  1183.                 );
  1184.                 if (empty($roomData['isSingleRoomNotAvailable'])) {
  1185.                     $databookableRooms[] = $roomData;
  1186.                 }
  1187.             }
  1188.         }
  1189.         return $databookableRooms;
  1190.     }
  1191.     
  1192.     /**
  1193.      * @Template
  1194.      * @Route("/{_locale}/accommodation-preferites", name="accommodations-preferites")  
  1195.      */
  1196.     public function preferitesAction(Request $request)
  1197.     {   
  1198.         $multisiteOwner $this->document->getProperty('multisiteOwner');
  1199.         
  1200.         $idsAsArray $request->get('ids');
  1201.         $accommodationObjs = array();
  1202.         $accommodationObjsTmp Accommodation::getByIds($idsAsArray);
  1203.         foreach ($accommodationObjsTmp as $accommodationObjTmp) {
  1204.             if ($accommodationObjTmp->isPartnerInWebsite($multisiteOwner)) {
  1205.                 $accommodationObjs[] = $accommodationObjTmp;
  1206.             }
  1207.         }
  1208.         $idsAsArray = array();
  1209.         $isInWatchlist = array();
  1210.         foreach ($accommodationObjs as $accommodationObj) {
  1211.             $isInWatchlist[$accommodationObj->getId()] = true;
  1212.             $idsAsArray[] = $accommodationObj->getId();
  1213.         }
  1214.         
  1215.         // overwrite translation urls
  1216.         $moduleLocales self::getModuleLanguages();
  1217.         $translateUrls = array();
  1218.         foreach ($moduleLocales as $lang) {
  1219.             $translateUrls[$lang] = $this->get('router')->generate('accommodations-preferites', [
  1220.                 '_locale' => $lang,
  1221.             ], \Symfony\Component\Routing\Generator\UrlGeneratorInterface::ABSOLUTE_URL);
  1222.         }
  1223.         return [
  1224.            'entities' => $accommodationObjs,
  1225.            'isInWatchlist' => $isInWatchlist,
  1226.            'accommodationIds' => $idsAsArray,
  1227.            'mealCodes' => AccommodationAvailabilityHelper::getMealCodes(),
  1228.             
  1229.            'hasCaptcha' => true,
  1230.             
  1231.            'translateUrls' => $translateUrls,
  1232.            'entityMetaTitle' => \Pimcore::getContainer()->get('translator')->trans('ds_accommodation.preferites.your_request_will_be_sent_to')
  1233.         ];
  1234.         
  1235.         /* todo gf - remove ?
  1236.         $html = $this->render("MfLtsBundle:Enquiry:preferites.html.php", [
  1237.            'entities' => $accommodationObjs,
  1238.            'language' => $this->language,
  1239.            'isInWatchlist' => $isInWatchlist,
  1240.         ]);
  1241.         $html = $html->getContent();
  1242.         return $this->json(array(
  1243.             'success' => true,
  1244.             'entity_ids' => $ids,
  1245.             'num_entities' => count( $accommodationObjs ),
  1246.             'html' => $html,
  1247.         ));*/
  1248.     }
  1249.     
  1250.     
  1251.     /**
  1252.      * @Template
  1253.      * @Route("/{_locale}/map_popup/accommodations/{id}", name="accommodation-map-popup")
  1254.      */
  1255.     public function mappopupAction(Request $request$id)
  1256.     {   
  1257.         $entity Accommodation::getById($id);
  1258.         
  1259.         return [
  1260.             'entity' => $entity
  1261.         ];
  1262.     }
  1263.     
  1264.     /**
  1265.      * @Template
  1266.      * @Route("/{_locale}/accommodation-booking-widget/{id}", name="accommodation-booking-widget")
  1267.      */
  1268.     public function bookingwidgetAction(Request $request$id)
  1269.     {   
  1270.         $entity Accommodation::getById($id);
  1271.         
  1272.         $feratel_package_ids $request->get('feratel_package_ids');
  1273.         
  1274.         return [
  1275.             'entity' => $entity,
  1276.             'feratel_package_ids' => $feratel_package_ids,
  1277.         ];
  1278.     }
  1279.     
  1280.     public static function getModuleLanguages()
  1281.     {
  1282.         $locales = array();
  1283.         
  1284.         foreach (\Pimcore\Tool::getValidLanguages() as $locale) {
  1285.             $doc null;
  1286.             if (\Pimcore\Model\Site::isSiteRequest()) {
  1287.                 $site \Pimcore\Model\Site::getCurrentSite();
  1288.                 $navStartNode $site->getRootDocument();
  1289.                 $doc \Pimcore\Model\Document::getByPath($navStartNode->getRealFullPath().'/'.$locale);
  1290.             } else {
  1291.                 $doc \Pimcore\Model\Document::getByPath('/'.$locale);
  1292.             }
  1293.             
  1294.             if (!empty($doc) && $doc->isPublished()) {
  1295.                 $locales[] = $locale;
  1296.             }
  1297.         }
  1298.         return $locales;
  1299.     }
  1300.     
  1301.     
  1302. }