<?php
namespace DestiSuiteBundle\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use DestiSuiteBundle\Controller\BaseController;
use DestiSuiteBundle\Model\DataObject\Accommodation\Accommodation;
use DestiSuiteBundle\Importer\Accommodation\Importer\AccommodationImporter;
use DestiSuiteBundle\Model\DataObject\Accommodation\AccoCustomOffer;
use DestiSuiteBundle\Model\DataObject\Accommodation\AccoCustomFilterCategory;
use DestiSuiteBundle\Model\DataObject\Accommodation\AccoCustomFilterLocation;
use DestiSuiteBundle\Model\DataObject\Accommodation\AccommodationMarketingGroup;
use DestiSuiteBundle\Model\DataObject\Accommodation\AccommodationStar;
use DestiSuiteBundle\Model\DataObject\Accommodation\AccoCustomFilterClassification;
use DestiSuiteBundle\Model\DataObject\Accommodation\AccoCustomFacilityGroup;
use DestiSuiteBundle\Model\DataObject\Accommodation\AccoCustomFilterOfferFacility;
use DestiSuiteBundle\Model\DataObject\Accommodation\AccommodationPackage;
use DestiSuiteBundle\Model\DataObject\Accommodation\AccoCustomFilterMarketingGroup;
use DestiSuiteBundle\Importer\Accommodation\RequestHelper\AccommodationAvailabilityHelper;
use DestiSuiteBundle\Importer\Accommodation\RequestHelper\AccommodationAvailabilityByNameHelper;
use DestiSuiteBundle\Importer\Accommodation\RequestHelper\AccommodationAvailabilityInternalHelper;
use DestiSuiteBundle\Importer\Accommodation\RequestHelper\AccommodationSearchByOfferHelper;
use DestiSuiteBundle\Model\DataObject\Accommodation\AccommodationFacility;
use DestiSuiteBundle\Model\DataObject\MultisiteOwner;
use DestiSuiteBundle\Twig\Extension\AccommodationExtension;
use DestiSuiteBundle\Importer\Accommodation\RequestHelper\AccommodationAvailabilityHelperAbstract;
class AccommodationsController extends BaseController
{
const DATE_TO_MIN_INTERVAL = 1;
const DATE_TO_DEFAULT_INTERVAL = 1;
const DEFAULT_AGES_PRO_ROOM = ['18,18'];
/**
* @Template
* @Route("/{_locale}/testtosc5", name="accommodations-testtosc5")
*/
public function testtosc5Action(Request $request)
{
}
/**
* @Template
* @Route("/{_locale}/testtosc5landing/{fid}", name="accommodations-testtosc5-landing")
*/
public function testtosc5landingAction(Request $request, $fid)
{
$entity = Accommodation::getByFid($fid, 1);
return [
'entity' => $entity
];
}
/**
* @Template
* @Route("/{_locale}/acco-custom-search", name="accommodations-custom-search")
*/
public function customsearchredirectAction(Request $request)
{
}
/**
* @Template
*/
public function indexAction(Request $request)
{
return [
'scrollToWidget' => !empty($request->get('ds-autoscroll'))
];
}
/**
* @Template
* @Route("/{_locale}/accommodations-listing", name="accommodations-listing")
*/
public function listingAction(Request $request)
{
$multisiteOwner = $this->document->getProperty('multisiteOwner');
$filters = $this->getCurrentFilter($request);
$arrival = $filters['arrival'];
$departure = $filters['departure'];
$categories = $filters['custom_categories'];
$subcategory = $filters['custom_subcategory'];
$mealCode = $filters['mealCode'];
$currentLocations = $filters['custom_locations'];
$currentCustomFacilities = $filters['currentCustomFacilities'];
$currentCustomOfferFacilities = $filters['currentCustomOfferFacilities'];
$currentCustomMarketingGroups = $filters['currentCustomMarketingGroups'];
$forceFids = $filters['force-fids'];
$feratel_package_id = $filters['feratel_package_id'];
$validDates = $filters['validDates'];
$return = array(
'special_layout' => $request->get('special_layout'),
'arrival' => $arrival,
'departure' => $departure,
'mealCode' => $mealCode,
'no_date' => $filters['no_date'],
'bookable_only' => $filters['bookable_only'],
'today' => new \DateTime(),
);
$datepickerDateTo = new \DateTime();
$datepickerDateTo->add(new \DateInterval('P'.self::DATE_TO_MIN_INTERVAL.'D'));
$return['datepickerDateTo'] = $datepickerDateTo;
$limit = 10;
$isMapView = false;
if ($request->get('view') == 'map') {
$isMapView = true;
$limit = 9999999;
}
$lifetime = 60 * 60;
$cacheKey = md5('acco_listing_seed');
if(!$randomSeed = \Pimcore\Cache::load($cacheKey)) {
$randomSeed = time();
\Pimcore\Cache::save(
$randomSeed,
$cacheKey,
["seed"],
$lifetime
);
}
/*
$randomSeed = $request->get('randomSeed');
if (empty($randomSeed)) {
$randomSeed = time();
}
if (!$request->query->has('randomSeed')) {
$request->query->add(['randomSeed' => $randomSeed]);
}
*/
$roomType = null;
if (!empty($categories)) {
$roomTypes_tmp = [];
foreach ($categories as $catTmp) {
if (!isset($roomTypes_tmp[$catTmp->getOnlyRoomType()])) {
$roomTypes_tmp[$catTmp->getOnlyRoomType()] = 0;
}
$roomTypes_tmp[$catTmp->getOnlyRoomType()]++;
}
foreach ($roomTypes_tmp as $catTmpIndex => $counterTmp) {
if (count($categories) == $counterTmp) {
$roomType = $catTmpIndex;
}
}
}
$orderBy = $request->get('order_by');
$availabilityHelper = $this->search($request->get('_locale'), $limit, $arrival, $departure, [
'forceFids' => $forceFids,
'classifications' => $filters['classifications'],
'marketingGroupFids' => $filters['marketingGroupFids'],
'cmsOfferId' => $filters['cmsOfferId'],
'cmsOfferPeriod' => $filters['cmsOfferPeriod'],
'custom_categories' => $categories,
'custom_subcategory' => $subcategory,
'mealCode' => $mealCode,
'custom_locations' => $currentLocations,
'customFacilities' => $currentCustomFacilities,
'customOfferFacilities' => $currentCustomOfferFacilities,
'customMarketingGroups' => $currentCustomMarketingGroups,
'accommodation_name' => $request->get('accommodation_name'),
'no_date' => $filters['no_date'],
'bookable_only' => $filters['bookable_only'],
'page' => $request->get('page'),
'ages' => $request->get('ages'),
'roomType' => $roomType,
'randomSeed' => $randomSeed,
'apiResultId' => $request->get('apiResultId'),
'feratel_package_id' => $feratel_package_id,
], false, $orderBy);
if ($isMapView) {
$markerDatas = Accommodation::getMapMarkerData($request->get('_locale'), $availabilityHelper->getCurrentPageFids(), $arrival, $departure, $request);
$return['markerDatas'] = $markerDatas;
} else {
$entities = Accommodation::getByFids( $availabilityHelper->getCurrentPageFids() );
$return['entities'] = $entities;
$paginator = $availabilityHelper->getPaginator($request->get('page', 1), $limit);
$return['paginator'] = $paginator;
}
try {
$allFids = $availabilityHelper->getAllFids();
} catch (\DestiSuiteBundle\Exception\ComplexRequestException $ex) {
$allFids = null;
$return['all_fids_request_fid'] = $ex->getLtsSearchFid();
}
$return['all_fids'] = $allFids;
$return['classifications'] = AccoCustomFilterClassification::getEntities();
$return['priceMap'] = $availabilityHelper->getPriceFromMap();
$return['hasOneBookable_map'] = $availabilityHelper->getHasOneBookableMap();
$return['numTotalResults'] = $availabilityHelper->getNumResult();
$return['categories'] = AccoCustomFilterCategory::getEntities();
$return['subcategory'] = $subcategory;
$return['mealCodes'] = AccommodationAvailabilityHelper::getMealCodes();
$return['mealCode'] = $mealCode;
$locations = AccoCustomFilterLocation::getEntities($multisiteOwner);
$return['locations'] = $locations;
$return['custom_facilities'] = AccoCustomFacilityGroup::getOrderedList($multisiteOwner);
$return['currentCustomFacilities'] = $currentCustomFacilities;
$return['currentCustomFacilitiesIds'] = $request->get('custom_facilities');
$return['custom_offer_facilities'] = AccoCustomFilterOfferFacility::getOrderedList($multisiteOwner);
$return['currentCustomOfferFacilities'] = $currentCustomOfferFacilities;
$return['currentCustomOfferFacilitiesIds'] = $request->get('custom_offer_facilities');
$return['custom_mktGroups'] = AccoCustomFilterMarketingGroup::getOrderedList($multisiteOwner);
$return['currentCustomMarketingGroups'] = $currentCustomMarketingGroups;
$return['currentCustomMarketingGroupsIds'] = $this->removeEmptyValFromRequest($request, 'custom_mktGroups');
$return['viewType'] = $request->get('view');
$return['noLayout'] = $request->get('noLayout');
$return['feratel_package_id'] = $feratel_package_id;
$return['validDates'] = $validDates;
$cmsOfferPeriodItem = null;
// LAYOUT FOR A SPECIFIC OFFER
if (!empty($request->get('cmsOffer'))) {
$offer = AccoCustomOffer::getById( $request->get('cmsOffer') );
$cmsOfferPeriod = $request->get('cmsOfferPeriod');
if (!empty($offer) && empty($cmsOfferPeriod)) {
$cmsOfferPeriod = 0;
}
if (!empty($offer)) {
$cmsOfferPeriodItem = $offer->getValidPeriodByIndex($cmsOfferPeriod);
}
$return['offer'] = $offer;
$return['cmsOfferPeriod'] = $cmsOfferPeriod;
} else {
$offers = AccoCustomOffer::getEntities($multisiteOwner);
$return['offers'] = $offers;
}
$return['cmsOfferPeriodItem'] = $cmsOfferPeriodItem;
$return['marketingGroupFids'] = $filters['marketingGroupFids'];
// LAYOUT FOR MARKETING GROUPS
$displayMarketingGroups = array();
if (!empty($filters['displayMarketingGroupFids'])) {
$displayMarketingGroups = AccommodationMarketingGroup::getByFids($filters['displayMarketingGroupFids']);
}
$return['displayMarketingGroups'] = $displayMarketingGroups;
// $this->setCurrentDocumentOrRouteCanonical('accommodations-listing'); // TODO GF - DS canonical thema, reinsert
$return['bundleType'] = \Pimcore::getContainer()->getParameter('ds_accommodation_bundle')['type'];
return $return;
}
private function getCurrentFilter(Request $request)
{
$feratel_package_id = $request->get('feratel_package_id');
$validDates = [];
if (!empty($feratel_package_id)) {
$packageObj = AccommodationPackage::getByFid($feratel_package_id, 1);
if (!empty($packageObj)) {
$singleDates = $packageObj->getSingleDates(null, true);
foreach ($singleDates as $singleDateTmp) {
$validDates[] = $singleDateTmp['date']->format('Y-m-d');
}
}
}
$cmsOfferId = $request->get('cmsOffer');
$cmsOfferPeriod = (int) $request->get('cmsOfferPeriod');
$offer = AccoCustomOffer::getById( $request->get('cmsOffer') );
$offerPeriod = null;
if (!empty($offer)) {
$offerPeriod = $offer->getValidPeriodByIndex($cmsOfferPeriod);
}
$explicitSearch = false;
$arrival = null;
$departure = null;
$noDates = null;
$bookableOnly = null;
if (!empty($request->get('bookable_only'))) {
$bookableOnly = $request->get('bookable_only');
}
if (!empty($offerPeriod)) {
$tmp = AccoCustomOffer::getPeriodInitialSearchDates($offerPeriod);
if (!empty($tmp['arrival']) && !empty($tmp['departure'])) {
$arrival = $tmp['arrival'];
$departure = $tmp['departure'];
} else {
$arrival = new \DateTime();
$departure = clone $arrival;
$departure->add( new \DateInterval('P'.self::DATE_TO_DEFAULT_INTERVAL.'D') );
}
} else {
if (\Pimcore::getContainer()->getParameter('ds_accommodation_bundle')['type'] == 'custom' ||
!empty($request->get('no_date'))
|| (empty($request->get('arrival')) && empty($request->get('departure')) && $this->document->getProperty('ds_acco_listing_no_dates') )) {
$noDates = true;
} else {
if (!empty($request->get('arrival')) && !empty($request->get('departure'))) {
$explicitSearch = true;
}
if (empty($request->get('arrival'))) {
if (empty($validDates)) {
$arrival = new \DateTime('now');
} else {
$arrival = new \DateTime($validDates[0]);
}
} else {
$arrival = explode('.', $request->get('arrival'));
if (count($arrival) == 3) {
$arrival = $arrival[2].'-'.$arrival[1].'-'.$arrival[0];
} else {
$arrival = 'now';
}
try {
$arrival = new \DateTime( $arrival );
} catch (\Exception $ex) {
$arrival = new \DateTime('now');
}
}
if (empty($request->get('departure'))) {
$departure = clone $arrival;
$departure->add( new \DateInterval('P'.self::DATE_TO_DEFAULT_INTERVAL.'D') );
} else {
$departure = explode('.', $request->get('departure'));
if (count($departure) == 3) {
try {
$departure = $departure[2].'-'.$departure[1].'-'.$departure[0];
$departure = new \DateTime( $departure );
$departure = $departure;
} catch (\Exception $ex) {
$departure = new \DateTime('now');
$departure->add( new \DateInterval('P'.self::DATE_TO_DEFAULT_INTERVAL.'D') );
}
} else {
$departure = new \DateTime( 'now' );
$departure->add( new \DateInterval('P'.self::DATE_TO_DEFAULT_INTERVAL.'D') );
}
}
}
}
$categories = array();
if (!empty($request->get('accommodationCategory'))) {
foreach ($request->get('accommodationCategory') as $catTmp) {
$tmp = AccoCustomFilterCategory::getById($catTmp);
if (!empty($tmp)) {
$categories[] = $tmp;
}
}
// $category = AccommodationCategory::getByFid($request->get('accommodationCategory'), 1);
}
$subcategory = null;
/*
if (!empty($request->get('accommodationCategory'))) {
$subcategory = AccoCustomFilterCategory::getById($request->get('accommodationSubcategory'), 1);
}*/
$mealCode = null;
if (!empty($categories) && count($categories) == 1 && !empty($categories[0]->getOrMealCodes())) {
$mealCode = $categories[0]->getOrMealCodes();
}
if (!empty($request->get('mealCode'))) {
$mealCodeTmp = array();
foreach ($request->get('mealCode') as $tmp) {
if (!empty($tmp)) {
$mealCodeTmp[] = $tmp;
}
}
if (!empty($mealCodeTmp)) {
$mealCode = $mealCodeTmp;
}
}
$locations = array();
if (!empty($request->get('accommodationLocation'))) {
foreach ($request->get('accommodationLocation') as $locId) {
$tmp = AccoCustomFilterLocation::getById($locId);
if (!empty($tmp)) {
$locations[] = $tmp;
}
}
}
$currentCustomFacilities = null;
if (!empty($request->get('custom_facilities'))) {
$currentCustomFacilities = AccoCustomFacilityGroup::getByIds($request->get('custom_facilities'));
}
$currentCustomOfferFacilities = null;
if (!empty($request->get('custom_offer_facilities'))) {
$currentCustomOfferFacilities = AccoCustomFilterOfferFacility::getByIds($request->get('custom_offer_facilities'));
}
$currentCustomMarketingGroups = null;
if (!empty($request->get('custom_mktGroups'))) {
$currentCustomMarketingGroups = AccoCustomFilterMarketingGroup::getByIds( $this->removeEmptyValFromRequest($request, 'custom_mktGroups') );
}
$marketingGroupFids = null;
if (!empty($request->get('marketingGroupFids'))) {
$marketingGroupFids = $request->get('marketingGroupFids');
}
$displayMarketingGroupFids = null;
if (!empty($request->get('displayMarketingGroupFids'))) {
$displayMarketingGroupFids = $request->get('displayMarketingGroupFids');
if (empty($marketingGroupFids)) {
$marketingGroupFids = array($displayMarketingGroupFids[0]);
}
if (!empty($request->get('displayMarketingGroupFids_hide_first'))) {
array_shift($displayMarketingGroupFids);
}
}
$classifications = array();
if (!empty($request->get('classifications'))) {
foreach ($request->get('classifications') as $classificationId) {
$eTmp = AccoCustomFilterClassification::getById($classificationId);
if (!empty($eTmp)) {
$classifications[] = $eTmp;
}
}
}
if (!empty($arrival)) {
$arrival->setTime(0,0,0);
}
if (!empty($departure)) {
$departure->setTime(0,0,0);
}
return array(
'arrival' => $arrival,
'departure' => $departure,
'custom_categories' => $categories,
'custom_subcategory' => $subcategory,
'mealCode' => $mealCode,
'custom_locations' => $locations,
'currentCustomFacilities' => $currentCustomFacilities,
'currentCustomOfferFacilities' => $currentCustomOfferFacilities,
'currentCustomMarketingGroups' => $currentCustomMarketingGroups,
'explicitSearch' => $explicitSearch,
'cmsOfferId' => $cmsOfferId,
'cmsOfferPeriod' => $cmsOfferPeriod,
'displayMarketingGroupFids' => $displayMarketingGroupFids,
'marketingGroupFids' => $marketingGroupFids,
'classifications' => $classifications,
'no_date' => $noDates,
'bookable_only' => $bookableOnly,
'force-fids' => $request->get('force-fids'),
'feratel_package_id' => $feratel_package_id,
'validDates' => $validDates,
);
}
/**
*
* @param \DateTime $datetimeFrom
* @param \DateTime $datetimeTo
* @param type $filters --- 'custom_categories', 'mealCode', 'custom_locations', 'facilities', 'page', 'accommodation_name', 'no_date', 'bookable_only', 'accommodation_fid'
* 'ages' (array of comma separated ages. one element of array correspond to occupancy of one room)
*
* @param $orderBy --- AccommodationAvailabilityHelperAbstract::ORDER_BY_**** constant
*/
private function search($locale, $limit, \DateTime $datetimeFrom = null, \DateTime $datetimeTo = null, $filters = array(), $isDetailRequest = false, $orderBy = null)
{
// multisiteOwner
$multisiteOwner = $this->document->getProperty('multisiteOwner');
if (!empty($filters['cmsOfferId'])) {
$offer = AccoCustomOffer::getById($filters['cmsOfferId']);
$period = null;
if (!empty($offer)) {
$cmsOfferPeriod = (int) $filters['cmsOfferPeriod'];
$period = $offer->getValidPeriodByIndex($cmsOfferPeriod);
}
$helper = new AccommodationSearchByOfferHelper();
$helper->setOfferFilter($offer, $period);
$helper->language = $locale;
} else if (!empty($filters['accommodation_name'])) {
$helper = new AccommodationAvailabilityByNameHelper();
$helper->language = $locale;
$helper->accommodationName = $filters['accommodation_name'];
} elseif (!empty($filters['no_date']) || (empty($datetimeFrom) || empty($datetimeTo))) {
$helper = new AccommodationAvailabilityInternalHelper();
$helper->language = $locale;
} else {
if (\Pimcore::getContainer()->getParameter('ds_accommodation_bundle')['type'] == 'custom') {
$helper = new AccommodationAvailabilityInternalHelper();
$helper->language = $locale;
} else {
$helper = new AccommodationAvailabilityHelper($datetimeFrom, $datetimeTo);
$helper->language = $locale;
if (!empty($filters['mealCode'])) {
$helper->mealCode = $filters['mealCode'];
}
}
if (!empty($filters['accommodation_fid'])) {
$entity = Accommodation::getByFid($filters['accommodation_fid'], 1);
if (!empty($entity)) {
$helper->setAccommodationsFidsFilter([$entity->getFid()]);
}
}
}
if (method_exists($helper, 'setDsBoardCodes')) {
$boardCodes = array();
if (!empty($filters['mealCode'])) {
if (\Pimcore::getContainer()->getParameter('ds_accommodation_bundle')['type'] == 'lts') {
$boardMap = \DestiSuiteBundle\Importer\LTS\Accommodation\Request\AccommodationDataSearchRQRequest::$mealTypeMapping_destisuiteCodes;
foreach ($filters['mealCode'] as $mealCodeTmp) {
if (!empty($boardMap[ $mealCodeTmp ])) {
$boardCodes[] = $boardMap[ $mealCodeTmp ];
}
}
} elseif (\Pimcore::getContainer()->getParameter('ds_accommodation_bundle')['type'] == 'feratel' ||
\Pimcore::getContainer()->getParameter('ds_accommodation_bundle')['type'] == 'custom') {
foreach ($filters['mealCode'] as $mealCodeTmp) {
$tmp = AccommodationAvailabilityHelperAbstract::convertFeratelToInternalMealCode($mealCodeTmp);
if (!empty($tmp)) {
$boardCodes[] = $tmp;
}
}
}
}
$helper->setDsBoardCodes($boardCodes);
}
if (method_exists($helper, 'setIsDetailRequest')) {
if (!empty($isDetailRequest)) {
$helper->setIsDetailRequest(true);
} else {
$helper->setIsDetailRequest(false);
}
}
if (method_exists($helper, 'setOfferPackageFidsFilter') && !empty($filters['feratel_package_id'])) {
$helper->setOfferPackageFidsFilter( [$filters['feratel_package_id']] );
}
// filter by multiple fids
if (method_exists($helper, 'setAccommodationsFidsFilter') && !empty($filters['forceFids'])) {
/*$accoTmps = array();
foreach ($filters['forceFids'] as $fidTmp) {
$entity = Accommodation::getByFid($fidTmp, 1);
if (!empty($entity)) {
$accoTmps[] = $entity;
}
}*/
$helper->setAccommodationsFidsFilter($filters['forceFids']);
}
if (method_exists($helper, 'setWebsite')) {
$helper->setWebsite($multisiteOwner);
}
/*
if (method_exists($helper, 'setLocationFilter') && !empty($filters['custom_location'])) {
$helper->setLocationsFilter(array($filters['custom_location']));
}
*/
if (method_exists($helper, 'setCustomLocationFilter')) {
$locationFilter = $filters['custom_locations'];
if (empty($locationFilter) && !empty($multisiteOwner) && !empty($multisiteOwner->getAccoCustomFilterLocations())) {
$locationFilter = $multisiteOwner->getAccoCustomFilterLocations();
}
$helper->setCustomLocationFilter($locationFilter);
}
/*
if (method_exists($helper, 'setCategoriesFilter') && !empty($filters['category'])) {
$helper->setCategoriesFilter(array($filters['category']));
}
*/
if (method_exists($helper, 'setCustomCategoryFilter')) {
if (!empty($filters['custom_subcategory'])) {
$helper->setCustomCategoryFilter($filters['custom_subcategory']);
} elseif (!empty($filters['custom_categories'])) {
$helper->setCustomCategoryFilter($filters['custom_categories']);
}
}
if (method_exists($helper, 'setFacilitiesFilter') && !empty($filters['facilities'])) {
$helper->setFacilitiesFilter($filters['facilities']);
}
if (method_exists($helper, 'setCustomFacilitiesFilter') && !empty($filters['customFacilities'])) {
$helper->setCustomFacilitiesFilter($filters['customFacilities']);
}
if (method_exists($helper, 'setCustomOfferFacilitiesFilter') && !empty($filters['customOfferFacilities'])) {
$helper->setCustomOfferFacilitiesFilter($filters['customOfferFacilities']);
}
if (method_exists($helper, 'setCustomMarketingGroupFilter') && !empty($filters['customMarketingGroups'])) {
$helper->setCustomMarketingGroupFilter($filters['customMarketingGroups']);
}
if (!empty($filters['ages'])) {
for ($i=0; $i<count($filters['ages']); $i++) {
$filters['ages'][$i] = explode(',', $filters['ages'][$i]);
}
} else {
$filters['ages'][0] = array(18,18); // default value
}
if (method_exists($helper, 'setAgesProRooom') && !empty($filters['ages'])) {
$helper->setAgesProRooom($filters['ages']);
}
if (method_exists($helper, 'setMarketingGroupFidsFilter')) {
if (!empty($filters['marketingGroupFids'])) {
$helper->setMarketingGroupFidsFilter($filters['marketingGroupFids']);
} else {
if (!empty($multisiteOwner) && $multisiteOwner->getAccoFilterByMarketingGroup()) {
$mktGrpFids = array();
foreach ($multisiteOwner->getAccoFilterByMarketingGroup() as $mktTmp) {
$mktGrpFids[] = $mktTmp->getFid();
}
$helper->setMarketingGroupFidsFilter($mktGrpFids);
}
}
}
if (method_exists($helper, 'setClassificationFidsFilter') && !empty($filters['classifications'])) {
$classificationFids = array();
foreach ($filters['classifications'] as $classEntity) {
foreach ($classEntity->getClassifications() as $c) {
if (!in_array($c->getFid(), $classificationFids)) {
$classificationFids[] = $c->getFid();
}
}
}
$helper->setClassificationFidsFilter( $classificationFids );
}
if (method_exists($helper, 'setRoomType') && !empty($filters['roomType'])) {
$helper->setRoomType($filters['roomType']);
}
if (method_exists($helper, 'setBookableOnly') && !empty($filters['bookable_only'])) {
$helper->setBookableOnly($filters['bookable_only']);
}
if (!empty($filters['page'])) {
$helper->page = $filters['page'];
} else {
$helper->page = 1;
}
$helper->setLimit($limit);
if (method_exists($helper, 'setRandomSeed') && !empty($filters['randomSeed'])) {
$helper->setRandomSeed($filters['randomSeed']);
}
if (method_exists($helper, 'setApiResultId') && !empty($filters['apiResultId'])) {
$helper->setApiResultId($filters['apiResultId']);
}
$helper->setOrderBy($orderBy);
$helper->search();
return $helper;
}
/**
* @Template
* @Route("/{_locale}/ajax-accommodation", name="accommodations-ajax-detail")
*/
public function ajaxdetailAction(Request $request)
{
$translateUrls = array();
foreach (self::getModuleLanguages() as $lang) {
$translateUrls[$lang] = $this->get('router')->generate('accommodations-ajax-detail', ['_locale' => $lang]);
}
return [
'special_layout' => $request->get('special_layout'),
'bodyClass' => 'ds-body-obj-detail',
'translateUrls' => $translateUrls
];
}
/**
* @Route("/{_locale}/ajax-accommodation-url/{id}", name="accommodations-ajax-detail-url")
*/
public function ajaxdetailurlAction(Request $request)
{
$entity = Accommodation::getById($request->get('id'));
if (empty($entity)) {
throw new NotFoundHttpException('Not found.');
}
$multisiteOrigin = $request->get('multisiteOrigin');
$url = \Pimcore::getContainer()->get('DestiSuiteBundle\LinkGenerator\AccommodationLinkGenerator')->generate($entity, $_GET);
$languageSwitch = \Pimcore::getContainer()->get('DestiSuiteBundle\LinkGenerator\AccommodationLinkGenerator')->languageSwitchUrls($entity, self::getModuleLanguages());
$url = $this->addDsBasicAuth([$url])[0];
return $this->json([
'url' => $url,
'languageSwitch' => $languageSwitch,
'url_relative' => \Pimcore::getContainer()->get('DestiSuiteBundle\LinkGenerator\AccommodationLinkGenerator')->generate($entity, ['multisiteOrigin' => $multisiteOrigin], true),
'title' => $entity->getName(),
]);
}
/**
* Calculated locally
* $mealCode - list of submitted meal codes
*/
private function initializeRoomPrice($roomEntites, $mealCodes, $arrival, $departure, $ages)
{
$numPerson = 2;// default
$requestedRoom = 1;
if (!empty($ages)) {
$numPerson = 0;
$requestedRoom = 0;
foreach($ages as $agesProRoom) {
$agesProRoom = explode(',', $agesProRoom);
$numPerson += count($agesProRoom);
$requestedRoom++;
}
}
$roomPriceMap = array();
$roomMealcodeMap = array();
$converted = array();
if (empty($mealCodes)) {
if (\Pimcore::getContainer()->getParameter('ds_accommodation_bundle')['type'] == 'lts') {
$mealCodes = AccommodationAvailabilityHelperAbstract::getLtsMealCodes();
} else {
$mealCodes = AccommodationAvailabilityHelperAbstract::getFeratelMealCodes();
}
}
foreach ($mealCodes as $mealCodeEl) {
$feratelMealCode = AccommodationAvailabilityHelperAbstract::convertLtsToFeratelMealCode($mealCodeEl);
$converted[] = $feratelMealCode;
}
// fill with first possible price
foreach ($roomEntites as $roomEntity) {
if (empty($roomPriceMap[$roomEntity->getFid()])) {
foreach ($converted as $cosideredMealCode) {
$priceTmp = \DestiSuiteBundle\Model\DataObject\Accommodation\AccommodationRoom::calculatePrice($roomEntity, $arrival, $departure, $cosideredMealCode);
if (!empty($priceTmp)) {
$roomPriceMap[$roomEntity->getFid()] = $priceTmp;
$roomMealcodeMap[$roomEntity->getFid()] = $cosideredMealCode;
}
}
}
}
// re-convert meal codes
if (\Pimcore::getContainer()->getParameter('ds_accommodation_bundle')['type'] == 'lts') {
foreach ($roomMealcodeMap as $roomFid => $code) {
$roomMealcodeMap[$roomFid] = AccommodationAvailabilityHelperAbstract::convertFeratelToLtsMealCode($code);
}
}
// calculate price for total person
$totalPriceMap = array();
foreach ($roomEntites as $roomEntity) {
$numNecessaryRoom = 0;
if (!empty($roomEntity->getMaxOccupancy())) {
$numNecessaryRoom = ceil( $numPerson / $roomEntity->getMaxOccupancy() );
if ($requestedRoom > $numNecessaryRoom) {
$numNecessaryRoom = $requestedRoom;
}
if (!empty($roomPriceMap[ $roomEntity->getFid() ])) {
$totalPriceMap[ $roomEntity->getFid() ] = $numNecessaryRoom * $roomPriceMap[ $roomEntity->getFid() ];
}
}
}
return [
'roomPriceMap' => $totalPriceMap,
'roomPriceMap_unit' => $roomPriceMap,
'roomMealcodeMap' => $roomMealcodeMap,
];
}
/**
* @Template
* @Route({
"en": "/{_locale}/where-to-stay-lrq/{slug}_{id}",
"de": "/{_locale}/unterkuenfte-lrq/{slug}_{id}",
"it": "/{_locale}/dove-dormire-lrq/{slug}_{id}",
"nl": "/{_locale}/where-to-stay-lrq/{slug}_{id}",
"pl": "/{_locale}/where-to-stay-lrq/{slug}_{id}",
"cs": "/{_locale}/where-to-stay-lrq/{slug}_{id}",
"fr": "/{_locale}/where-to-stay-lrq/{slug}_{id}"
}, name="accommodations-detail-for-request")
*/
public function detailforrequestAction(Request $request)
{
$this->addResponseHeader('X-Robots-Tag', 'noindex', false, $request);
$this->addResponseHeader('Access-Control-Allow-Origin', '*', false, $request);
$this->addResponseHeader('Access-Control-Allow-Headers', "origin, x-requested-with, content-type, authorization", false, $request);
// $this->addResponseHeader('Access-Control-Allow-Methods', "GET,POST,OPTIONS,DELETE,PUT", false, $request);
$multisiteOwner = $this->document->getProperty('multisiteOwner');
$id = $request->get('id');
$entity = Accommodation::getById($id);
if (empty($entity)) {
throw new NotFoundHttpException('Not found.');
}
if(empty($this->verifyPreviewRequest($request, $entity)) && !in_array($request->get('_locale'), self::getModuleLanguages())) {
throw new NotFoundHttpException('Not found.');
}
if (empty($entity->hasDetailPageInWebsite($multisiteOwner)) && !$this->verifyPreviewRequest($request, $entity)) {
throw new NotFoundHttpException('Accommodation not found.');
}
$multisiteOrigin = $request->get('multisiteOrigin');
if (!empty($multisiteOrigin)) {
$multisiteOrigin = MultisiteOwner::getById($multisiteOrigin);
$multisiteOwner = $multisiteOrigin;
}
return [
'translateUrls' => \Pimcore::getContainer()->get('DestiSuiteBundle\LinkGenerator\AccommodationLinkGenerator')->languageSwitchUrls($entity, self::getModuleLanguages()),
'hasCaptcha' => true,
'entity' => $entity,
'bundleType' => \Pimcore::getContainer()->getParameter('ds_accommodation_bundle')['type'],
'today' => new \DateTime(),
'multisiteOrigin' => $multisiteOwner,
'mealCodes' => AccommodationAvailabilityHelper::getMealCodes($entity),
];
}
/**
* @Template
* @Route({
"en": "/{_locale}/where-to-stay/{slug}_{id}",
"de": "/{_locale}/unterkuenfte/{slug}_{id}",
"it": "/{_locale}/dove-dormire/{slug}_{id}",
"nl": "/{_locale}/where-to-stay/{slug}_{id}",
"pl": "/{_locale}/where-to-stay/{slug}_{id}",
"cs": "/{_locale}/where-to-stay/{slug}_{id}",
"fr": "/{_locale}/where-to-stay/{slug}_{id}"
}, name="accommodations-detail")
*/
public function detailAction(Request $request)
{
$this->addResponseHeader('Access-Control-Allow-Origin', '*', false, $request);
$this->addResponseHeader('Access-Control-Allow-Headers', "origin, x-requested-with, content-type, authorization", false, $request);
// $this->addResponseHeader('Access-Control-Allow-Methods', "GET,POST,OPTIONS,DELETE,PUT", false, $request);
$multisiteOwner = $this->document->getProperty('multisiteOwner');
$id = $request->get('id');
$entity = Accommodation::getById($id);
if (empty($entity)) {
throw new NotFoundHttpException('Not found.');
}
if(empty($this->verifyPreviewRequest($request, $entity)) && !in_array($request->get('_locale'), self::getModuleLanguages())) {
throw new NotFoundHttpException('Not found.');
}
if (empty($entity->hasDetailPageInWebsite($multisiteOwner)) && !$this->verifyPreviewRequest($request, $entity)) {
throw new NotFoundHttpException('Accommodation not found.');
}
$multisiteOrigin = $request->get('multisiteOrigin');
if (!empty($multisiteOrigin)) {
$multisiteOrigin = MultisiteOwner::getById($multisiteOrigin);
$multisiteOwner = $multisiteOrigin;
}
$filters = $this->getCurrentFilter($request);
$arrival = $filters['arrival'];
$departure = $filters['departure'];
$categories = $filters['custom_categories'];
$mealCode = $filters['mealCode'];
$locations = $filters['custom_locations'];
$currentCustomFacilities = $filters['currentCustomFacilities'];
$feratel_package_id = $filters['feratel_package_id'];
$availabilityHelper = $this->search($request->get('_locale'), 1, $arrival, $departure, [
'custom_categories' => $categories,
'mealCode' => $mealCode,
'custom_locations' => $locations,
'customFacilities' => $currentCustomFacilities,
'accommodation_fid' => $entity->getFid(),
'no_date' => $filters['no_date'],
//'page' => $request->get('page'),
'ages' => $request->get('ages'),
'feratel_package_id' => $feratel_package_id,
], true, null);
$priceMap = $availabilityHelper->getPriceFromMap();
$hasOneBookable_map = $availabilityHelper->getHasOneBookableMap();
if (empty($arrival) || empty($departure)) {
$arrival = new \DateTime( 'now' );
$departure = new \DateTime( 'now' );
$departure->add( new \DateInterval('P'.self::DATE_TO_DEFAULT_INTERVAL.'D') );
}
$offers = AccoCustomOffer::getOfferByAccommodation($entity,$multisiteOwner);
$bodyClass = 'ds-body-obj-detail ds-accoDetail';
if (!empty($priceMap) && !empty($priceMap[$entity->getFid()]) && !empty($priceMap[$entity->getFid()]['price'])) {
$bodyClass .= ' ds-hasBookingBar';
}
$adultNum = 2;
$childAges = [];
if (method_exists($availabilityHelper, 'getAdultNum')) {
$adultNum = $availabilityHelper->getAdultNum();
}
if (method_exists($availabilityHelper, 'getChildAges')) {
$childAges = $availabilityHelper->getChildAges();
}
$datepickerDateTo = new \DateTime();
$datepickerDateTo->add(new \DateInterval('P'.self::DATE_TO_MIN_INTERVAL.'D'));
// rooms data
########## DISABLE LOCAL CALULCATION ##########
# // initialize with entity datas
# $tmpData = $this->initializeRoomPrice($entity->getRooms(), $mealCode, $arrival, $departure, $request->get('ages'));
#// echo "<!-- local prices \n" . print_r($tmpData, true) . "\n -->";
# $roomPricesMap = $tmpData['roomPriceMap'];
# $roomMealMap = $tmpData['roomMealcodeMap'];
##########
$roomPricesMap = [];
$roomMealMap = [];
if (method_exists($availabilityHelper, 'getRoomPriceMap')) {
$roomPricesMapTmp = $availabilityHelper->getRoomPriceMap();
foreach ($roomPricesMapTmp as $roomFid => $priceTmp) {
$roomPricesMap[ $roomFid ] = $priceTmp;
}
}
if (method_exists($availabilityHelper, 'getRoomMealMap')) {
$roomMealMapTmp = $availabilityHelper->getRoomMealMap();
foreach ($roomMealMapTmp as $roomFid => $roomMealTmp) {
$roomMealMap[ $roomFid ] = $roomMealTmp;
}
}
// echo "<!-- api data \n" . print_r([$roomPricesMap, $roomMealMap], true) . "\n -->";
$roomNumBookableMap = array();
if (method_exists($availabilityHelper, 'getRoomNumAvailableMap')) {
$roomNumBookableMap = $availabilityHelper->getRoomNumAvailableMap();
}
$bookableRooms = $this->buildBookableRoomData($entity, $roomPricesMap, $roomNumBookableMap, $roomMealMap, $arrival, $departure);
// end rooms data
$ltsWidgetData = null;
if (\Pimcore::getContainer()->getParameter('ds_accommodation_bundle')['type'] == 'lts') {
$ltsWidgetData = $this->ltsWidgetUrlData($request, $availabilityHelper, $filters, $multisiteOwner);
}
return [
'openBookingTag' => $request->get('openBookingTag') || !empty( $request->get('datatransTrxId') ),
'special_layout' => $request->get('special_layout'),
'explicitSearch' => $filters['explicitSearch'],
'arrival' => $arrival,
'departure' => $departure,
'feratel_package_id' => $feratel_package_id,
'datepickerDateTo' => $datepickerDateTo,
'mealCode' => $mealCode,
'adultNum' => $adultNum,
'childAges' => $childAges,
'mealCodes' => AccommodationAvailabilityHelper::getMealCodes($entity),
'translateUrls' => \Pimcore::getContainer()->get('DestiSuiteBundle\LinkGenerator\AccommodationLinkGenerator')->languageSwitchUrls($entity, self::getModuleLanguages()),
'offers' => $offers,
'bodyClass' => $bodyClass,
'hasCaptcha' => true,
'priceMap' => $priceMap,
'hasOneBookable_map' => $hasOneBookable_map,
'entity' => $entity,
'bundleType' => \Pimcore::getContainer()->getParameter('ds_accommodation_bundle')['type'],
'bookableRooms' => $bookableRooms,
'ltsWidgetData' => $ltsWidgetData,
'today' => new \DateTime(),
'multisiteOrigin' => $multisiteOwner,
];
}
private function ltsWidgetUrlData(Request $request, $availabilityHelper, $filters, $multisiteOwner)
{
$today = new \DateTime();
$today->setTime(0,0,0);
$arrival = $filters['arrival'];
$departure = $filters['departure'];
if (empty($arrival) || empty($departure) ||
$arrival->getTimestamp() < $today->getTimestamp() || $departure->getTimestamp() < $today->getTimestamp()) {
$arrival = clone $today;
$departure = clone $today;
$departure->add(new \DateInterval('P1D'));
}
$arrival = $arrival->format('Y-m-d');
$departure = $departure->format('Y-m-d');
$ages = $request->get('ages');
$numRoom = 1;
if (!empty($ages)) {
$numRoom = count($ages);
}
$adultCounterPerRoom = [];
$childCounterPerRoom = [];
$childAges = [];
if (!empty($ages)) {
foreach ($ages as $roomAgeList) {
$roomAgeList = explode(',', $roomAgeList);
$childPerRoomTmp = 0;
$adultPerRoomTmp = 0;
$childAgesPerRoomTmp = [];
foreach ($roomAgeList as $ageTmp) {
if ($ageTmp < 18) {
$childPerRoomTmp++;
$childAgesPerRoomTmp[] = $ageTmp;
} else {
$adultPerRoomTmp++;
}
}
$childAges[] = implode(',', $childAgesPerRoomTmp);
$childCounterPerRoom[] = $childPerRoomTmp;
$adultCounterPerRoom[] = $adultPerRoomTmp;
}
}
$mealCode = $filters['mealCode'];
$boardTransformed = '';
if (!empty($mealCode)) {
if (is_array($mealCode)) {
$boardTransformed = AccommodationExtension::app_acco_lts_meal_type_to_bookingwidget($mealCode[0]);
} else {
$boardTransformed = AccommodationExtension::app_acco_lts_meal_type_to_bookingwidget($mealCode);
}
}
$ltsWidgetId = \Pimcore::getContainer()->getParameter('lts_interface')['widgetId'];
if (!empty($multisiteOwner) && !empty($multisiteOwner->getLtsAccoBookingWidgetId())) {
$ltsWidgetId = $multisiteOwner->getLtsAccoBookingWidgetId();
}
return array(
'ltsWidgetId' => $ltsWidgetId,
'ltsTypeRoom' => 15, // TODO GF DS LTS - change
'ltsNumRooms' => $numRoom,
'ltsNumAdults' => implode(';', $adultCounterPerRoom),
'ltsNumChildren' => implode(';', $childCounterPerRoom), // num children pro room
'ltsChildrenAges' => implode(';', $childAges),
'ltsArrival' => $arrival,
'ltsDeparture' => $departure,
'boardTransformed' => $boardTransformed,
);
}
private function buildBookableRoomData($entity, $roomPrices, $roomNumBookable, $roomMealMap, $arrival, $departure)
{
$databookableRooms = array();
// $searchResult['roomPrices'];//
$roomObjs = $entity->getRooms();
if (!empty($roomObjs)) {
foreach ($roomObjs as $roomObj) {
$dataImages = array();
if (!empty($roomObj->getImages())) {
foreach ($roomObj->getImages() as $imgTmp) {
$dataImages[] = AccommodationExtension::ds_acco_resizeImgUrl($imgTmp->getUrl(), 'listing');
}
}
$roomPrice = null;
if (!empty( $roomPrices[$roomObj->getFid()] )) {
$roomPrice = $roomPrices[$roomObj->getFid()];
}
$roomNumOnlineBookable = null;
if (isset( $roomNumBookable[$roomObj->getFid()] )) {
$roomNumOnlineBookable = $roomNumBookable[$roomObj->getFid()];
}
$roomMeal = null;
if (!empty($roomMealMap) && !empty($roomMealMap[$roomObj->getFid()])) {
$roomMeal = $roomMealMap[$roomObj->getFid()];
}
$roomData = array(
'id' => $roomObj->getId(),
'fid' => $roomObj->getFid(),
'roomCode' => $roomObj->getRoomCode(),
'name' => $roomObj->getName(),
'serviceList' => $roomObj->getServiceList(),
'images' => $dataImages,
'roomPrice' => $roomPrice,
'roomMeal' => $roomMeal,
'roomNumOnlineBookable' => $roomNumOnlineBookable,
'areaSize' => $roomObj->getAreaSize(),
'minOccupancy' => $roomObj->getMinOccupancy(),
'maxOccupancy' => $roomObj->getMaxOccupancy(),
'isSingleRoomNotAvailable' => \DestiSuiteBundle\Model\DataObject\Accommodation\AccommodationRoom::isSingleRoomNotAvailable($roomObj, $arrival, $departure),
);
if (empty($roomData['isSingleRoomNotAvailable'])) {
$databookableRooms[] = $roomData;
}
}
}
return $databookableRooms;
}
/**
* @Template
* @Route("/{_locale}/accommodation-preferites", name="accommodations-preferites")
*/
public function preferitesAction(Request $request)
{
$multisiteOwner = $this->document->getProperty('multisiteOwner');
$idsAsArray = $request->get('ids');
$accommodationObjs = array();
$accommodationObjsTmp = Accommodation::getByIds($idsAsArray);
foreach ($accommodationObjsTmp as $accommodationObjTmp) {
if ($accommodationObjTmp->isPartnerInWebsite($multisiteOwner)) {
$accommodationObjs[] = $accommodationObjTmp;
}
}
$idsAsArray = array();
$isInWatchlist = array();
foreach ($accommodationObjs as $accommodationObj) {
$isInWatchlist[$accommodationObj->getId()] = true;
$idsAsArray[] = $accommodationObj->getId();
}
// overwrite translation urls
$moduleLocales = self::getModuleLanguages();
$translateUrls = array();
foreach ($moduleLocales as $lang) {
$translateUrls[$lang] = $this->get('router')->generate('accommodations-preferites', [
'_locale' => $lang,
], \Symfony\Component\Routing\Generator\UrlGeneratorInterface::ABSOLUTE_URL);
}
return [
'entities' => $accommodationObjs,
'isInWatchlist' => $isInWatchlist,
'accommodationIds' => $idsAsArray,
'mealCodes' => AccommodationAvailabilityHelper::getMealCodes(),
'hasCaptcha' => true,
'translateUrls' => $translateUrls,
'entityMetaTitle' => \Pimcore::getContainer()->get('translator')->trans('ds_accommodation.preferites.your_request_will_be_sent_to')
];
/* todo gf - remove ?
$html = $this->render("MfLtsBundle:Enquiry:preferites.html.php", [
'entities' => $accommodationObjs,
'language' => $this->language,
'isInWatchlist' => $isInWatchlist,
]);
$html = $html->getContent();
return $this->json(array(
'success' => true,
'entity_ids' => $ids,
'num_entities' => count( $accommodationObjs ),
'html' => $html,
));*/
}
/**
* @Template
* @Route("/{_locale}/map_popup/accommodations/{id}", name="accommodation-map-popup")
*/
public function mappopupAction(Request $request, $id)
{
$entity = Accommodation::getById($id);
return [
'entity' => $entity
];
}
/**
* @Template
* @Route("/{_locale}/accommodation-booking-widget/{id}", name="accommodation-booking-widget")
*/
public function bookingwidgetAction(Request $request, $id)
{
$entity = Accommodation::getById($id);
$feratel_package_ids = $request->get('feratel_package_ids');
return [
'entity' => $entity,
'feratel_package_ids' => $feratel_package_ids,
];
}
public static function getModuleLanguages()
{
$locales = array();
foreach (\Pimcore\Tool::getValidLanguages() as $locale) {
$doc = null;
if (\Pimcore\Model\Site::isSiteRequest()) {
$site = \Pimcore\Model\Site::getCurrentSite();
$navStartNode = $site->getRootDocument();
$doc = \Pimcore\Model\Document::getByPath($navStartNode->getRealFullPath().'/'.$locale);
} else {
$doc = \Pimcore\Model\Document::getByPath('/'.$locale);
}
if (!empty($doc) && $doc->isPublished()) {
$locales[] = $locale;
}
}
return $locales;
}
}