<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Serializer\Serializer;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Contracts\Translation\TranslatorInterface;
use App\Entity\Search;
use App\Service\AccomodationService;
use App\Service\RatingFilter;
use App\Service\BoardFilter;
use App\Service\OrderFilter;
use App\Service\AccommodationFilter;
use App\Service\ApiService;
/**
* @Route("/accomodation")
*/
class AccomodationController extends BaseController {
private $apiService;
public function __construct(ApiService $apiService) {
$this->apiService = $apiService;
}
/**
* @Route("/", name="accomodation_index", methods={"GET"})
*/
public function index(TranslatorInterface $translator): Response
{
$em = $this->getDoctrine()->getManager();
$breadcrumbs = array(
$translator->trans('Homepage') => $this->generateUrl('accomodation_index'),
$translator->trans('Alojamientos') => null
);
return $this->render('frontend/accomodation/index.html.twig', [
'breadcrumbs' => $breadcrumbs,
'page_title' => $translator->trans('Alojamientos'),
'countries' => $em->getRepository('App:Country')->findAll()
]);
}
/**
* @Route("/", name="accomodation_search", methods={"POST"})
*/
public function search(TranslatorInterface $translator, Request $request): Response
{
$destination = $request->get('destination');
$zone_id = $request->get('zone_id');
if (substr($zone_id, 0, 1) == 'c') {
// city
$type = 'city';
$zone_id_num = substr($zone_id, 2);
} else {
// accomodation
$type = 'accomodation';
$zone_id_num = substr($zone_id, 3);
}
$nationality = $request->get('nationality');
$bill_T = intval($request->get('bill_T'));
$date_from = $request->get('date_from');
$date_from_formatted = date_create($date_from);
$date_to = $request->get('date_to');
$date_to_formatted = date_create($date_to);
$occupation = $request->get('accomodation_occupation');
$c_rooms = $request->get('c_rooms');
$c_pax = $request->get('c_pax');
$difference = date_diff($date_to_formatted,$date_from_formatted);
$differenceFormat = '%a';
$c_nights = $difference->format($differenceFormat);
$session = $this->get('session');
$session->remove('roomDistributionArray');
$roomDistribution = '';
$roomDistributionArray = array();
for ($i=1; $i <= $c_rooms; $i++) {
$roomDistributionArray['room_'.$i.'_adults'] = intval($request->get('room_'.$i.'_adults'));
$roomDistributionArray['room_'.$i.'_childs'] = intval($request->get('room_'.$i.'_childs'));
$session->set('accomodation_room_'.$i.'_adults', intval($request->get('room_'.$i.'_adults')));
$session->set('accomodation_room_'.$i.'_childs', intval($request->get('room_'.$i.'_childs')));
$c_childs = $request->get('room_'.$i.'_childs');
if ($c_childs > 0) {
$roomDistribution .= '{
"adults": '.intval($request->get('room_'.$i.'_adults')).',
"kids": '.intval($request->get('room_'.$i.'_childs')).',
"kidAges": [';
for ($k=1; $k <= $c_childs; $k++) {
$session->set('accomodation_room_'.$i.'_child_age_'.$k, intval($request->get('room_'.$i.'_child_age_'.$k)));
$roomDistributionArray['room_'.$i.'_child_age_'.$k] = intval($request->get('room_'.$i.'_child_age_'.$k));
$roomDistribution .= intval($request->get('room_'.$i.'_child_age_'.$k));
if ($k < $c_childs) {
$roomDistribution .= ',';
}
}
$roomDistribution .= ']}';
} else {
$roomDistribution .= '{
"adults": '.intval($request->get('room_'.$i.'_adults')).'
}';
}
if ($i < $c_rooms) {
$roomDistribution .= ',';
}
}
$session->set('roomDistributionArray', $roomDistributionArray);
$em = $this->getDoctrine()->getManager();
$session->set('accomodation_destination', $destination);
$session->set('accomodation_zone_id', $zone_id);
$session->set('accomodation_nationality', $nationality);
$session->set('accomodation_nationality_name', $em->getRepository('App:Country')->findOneBy(array('code' => $nationality)));
$session->set('accomodation_bill_T', $bill_T);
$session->set('accomodation_date_from', $date_from);
$session->set('accomodation_date_to', $date_to);
$session->set('accomodation_occupation', $occupation);
$session->set('accomodation_c_rooms', $c_rooms);
$session->set('accomodation_c_pax', $c_pax);
$session->set('accomodation_c_nights', $c_nights);
$data = '{
"nationality": "'.$nationality.'",
"factura_t": '.$bill_T.',';
if ($type == 'accomodation') {
$zone = ' "HotelCodes": "'.$zone_id_num.'", ';
} else {
$zone = ' "destination": "'.$zone_id_num.'", ';
}
$data .= $zone.'
"checkin": "'.$date_from.'",
"checkout": "'.$date_to.'",
"roomsDistribution": ['.$roomDistribution.']
}';
// Api call to search acommodations
$searchResultArray = $this->apiService->search($data);
/* Descomentar para comenzar a guardar el historial de busquedas
$search = new Search();
$search->setUserName($this->getUser()->getUsername());
$search->setUserEmail($this->getUser()->getEmail());
$search->setUserId($this->getUser()->getId());
$search->setNationality($nationality);
$search->setBillT($bill_T);
$search->setDestinationName($destination);
$search->setDestinationId($zone_id);
$search->setDateFrom($date_from);
$search->setDateTo($date_to);
$search->setOccupation($occupation);
$em->persist($search);
$em->flush();
*/
$accomodations = array();
if ($searchResultArray['SearchAM']['Hotels'] != null) {
$accomodations = $searchResultArray['SearchAM']['Hotels'];
}
$searchId = $searchResultArray['SearchAM']['SearchId'];
$token = $searchResultArray['SearchAM']['Token'];
$session->set('searchId', $searchId);
$session->set('token', $token);
$accService = new AccomodationService();
$locationsAndFilters = $accService->getLocationsAndFilters($accomodations);
$filters = $locationsAndFilters['filters'];
$locations = $locationsAndFilters['locations'];
// process acomodations
$processedHotels = $accService->processHotels($accomodations);
/*
foreach ($processedHotels as $accomodation) {
dump($accomodation["Name"]);dump($accomodation["Rates"]);
} die;
*/
/* Set accomodations redis*/
$redis = new \Redis();
$redis->connect('127.0.0.1', 6379);
$key = 'mb-search-result-accomodation-'.$searchId;
if ($redis->exists($key)) {
$content = json_decode($redis->get($key), true);
} else {
$content = $processedHotels;
$redis->set($key, json_encode($content));
$redis->expire($key, 3600);
}
/* Set filter redis*/
$filterKey = 'mb-search-result-accomodation-'.$searchId.'-filters';
if ($redis->exists($filterKey)) {
$content = json_decode($redis->get($filterKey), true);
} else {
$content = $filters;
$redis->set($filterKey, json_encode($content));
$redis->expire($key, 3600);
}
$breadcrumbs = array(
$translator->trans('Homepage') => $this->generateUrl('accomodation_index'),
$translator->trans('Resultados') => null
);
//dump($locations);die;
return $this->render('frontend/accomodation/result.html.twig', [
'breadcrumbs' => $breadcrumbs,
'page_title' => $translator->trans('Alojamientos'),
'accomodations' => $processedHotels,
'filters' => $filters,
'locations' => json_encode($locations),
'countries' => $em->getRepository('App:Country')->findAll()
]);
}
/**
* @Route("/results/map", name="accomodation_map", methods={"GET"})
*/
public function map(TranslatorInterface $translator): Response
{
$breadcrumbs = array(
$translator->trans('Homepage') => $this->generateUrl('accomodation_index'),
$translator->trans('Resultados') => null
);
return $this->render('frontend/accomodation/map.html.twig', [
'breadcrumbs' => $breadcrumbs,
'page_title' => $translator->trans('Alojamientos')
]);
}
/**
* @Route("/results/filter", name="accomodation_filter", methods={"GET","POST"})
*/
public function filter(TranslatorInterface $translator, Request $request): Response {
$session = $this->get('session');
$searchId = $session->get('searchId');
$filterToApply = $request->query->all();
//dump($request->query->all());die;
$redis = new \Redis();
$redis->connect('127.0.0.1', 6379);
$accomodations = array();
$searchKey = 'mb-search-result-accomodation-'.$searchId;
if ($redis->exists($searchKey)) {
$accomodations = json_decode($redis->get($searchKey), true);
}
$filters = array();
$filtersKey = 'mb-search-result-accomodation-'.$searchId.'-filters';
if ($redis->exists($filtersKey)) {
$filters = json_decode($redis->get($filtersKey), true);
}
//dump(json_decode($redis->get($filtersKey)));die;
// Definimos todas las estrategias de filtrado, una por cada tipo de filtro existente.
$strategies = [new RatingFilter(), new BoardFilter()];
$orderFilter = new OrderFilter();
$filters = new AccommodationFilter($accomodations, $strategies, $orderFilter);
$filteredAccommodations = $filters->filter($filterToApply);
dump(count($filteredAccommodations));
dump($filterToApply);
//recordar obtener todas las locations cuando filtro
$locations = [];
//$locations = $dataFiltered["locations"];
$em = $this->getDoctrine()->getManager();
$breadcrumbs = array(
$translator->trans('Homepage') => $this->generateUrl('accomodation_index'),
$translator->trans('Resultados') => null
);
return $this->render('frontend/accomodation/result.html.twig', [
'breadcrumbs' => $breadcrumbs,
'page_title' => $translator->trans('Alojamientos'),
'accomodations' => $filteredAccommodations, // $accomodationsFiltered;
'filters' => $filterToApply,
'locations' => json_encode($locations),
'countries' => $em->getRepository('App:Country')->findAll()
]);
}
/**
* @Route("/results/{id}/detail", name="accomodation_detail", methods={"GET"})
*/
public function detail(TranslatorInterface $translator, $id): Response
{
$session = $this->get('session');
$searchId = $session->get('searchId');
$roomDistribution = '';
for ($i=1; $i <= $session->get('accomodation_c_rooms'); $i++) {
if ($session->get('accomodation_room_'.$i.'_childs') > 0) {
$roomDistribution .= '{
"adults": '.intval($session->get('accomodation_room_'.$i.'_adults')).',
"childs": '.intval($session->get('accomodation_room_'.$i.'_childs')).'
}';
} else {
$roomDistribution .= '{
"adults": '.intval($session->get('accomodation_room_'.$i.'_adults')).'
}';
}
if ($i < $session->get('accomodation_c_rooms')) {
$roomDistribution .= ',';
}
}
$redis = new \Redis();
$redis->connect('127.0.0.1', 6379);
$key = 'mb-search-result-accomodation-'.$searchId;
$accomodation = array();
if ($redis->exists($key)) {
$searchResult = json_decode($redis->get($key), true);
$accomodation = $searchResult[$id];
} else {
$data = '{
"nationality": "'.$session->get('accomodation_nationality').'",
"factura_t": '.$session->get('accomodation_bill_T').',';
$zone = ' "HotelCodes": "'.$id.'", ';
$data .= $zone.'
"checkin": "'.$session->get('accomodation_date_from').'",
"checkout": "'.$session->get('accomodation_date_to').'",
"roomsDistribution": ['.$roomDistribution.']
}';
$result = $this->apiService->search($data);
$accomodation = reset($result['SearchAM']['Hotels']);
}
$accomodationAditionalInfo = $this->apiService->getAcommodationAditionalInfoById($id);
$locations = array();
if ($accomodation["Latitude"] & $accomodation["Longitude"]) {
$locations[] = [$accomodation["Name"],$accomodation["Longitude"],$accomodation["Latitude"]];
}
$em = $this->getDoctrine()->getManager();
$breadcrumbs = array(
$translator->trans('Homepage') => $this->generateUrl('accomodation_index'),
$translator->trans('Detalle') => null
);
return $this->render('frontend/accomodation/detail.html.twig', [
'breadcrumbs' => $breadcrumbs,
'page_title' => $translator->trans('Detalle'),
'accomodation' => $accomodation,
'accomodationAditionalInfo' => $accomodationAditionalInfo,
'locations' => json_encode($locations),
'countries' => $em->getRepository('App:Country')->findAll()
]);
}
/**
* @Route("/zones", name="zones_autocomplete", methods={"GET"}, options={"expose"=true})
*/
public function zones(Request $request, TranslatorInterface $translator): Response
{
$term = $request->get('term');
$data = array(
'term' => $term,
'source' => 'tb'
);
$result = $this->apiService->getZonesAutocomplete($data);
$response = new Response();
$response->setContent(json_encode($result));
$response->headers->set('Content-Type', 'application/json');
return $response;
}
/**
* @Route("/about_us", name="about_us", methods={"GET","POST"})
*/
public function aboutUs(TranslatorInterface $translator): Response
{
$breadcrumbs = array(
$translator->trans('Homepage') => $this->generateUrl('accomodation_index'),
$translator->trans('Quienes Somos') => null
);
return $this->render('frontend/about_us.html.twig', [
'breadcrumbs' => $breadcrumbs,
'page_title' => $translator->trans('Quienes Somos')
]);
}
/**
* @Route("/discount", name="discount", methods={"GET","POST"})
*/
public function discount(TranslatorInterface $translator): Response
{
$breadcrumbs = array(
$translator->trans('Homepage') => $this->generateUrl('accomodation_index'),
$translator->trans('Locales Con Descuentos') => null
);
return $this->render('frontend/discount.html.twig', [
'breadcrumbs' => $breadcrumbs,
'page_title' => $translator->trans('Locales Con Descuentos')
]);
}
/**
* @Route("/policies", name="policies", methods={"GET","POST"})
*/
public function policies(TranslatorInterface $translator): Response
{
$breadcrumbs = array(
$translator->trans('Homepage') => $this->generateUrl('accomodation_index'),
$translator->trans('Politicas De Uso') => null
);
return $this->render('frontend/policies.html.twig', [
'breadcrumbs' => $breadcrumbs,
'page_title' => $translator->trans('Politicas De Uso')
]);
}
/**
* @Route("/car", name="car", methods={"GET","POST"})
*/
public function car(TranslatorInterface $translator): Response
{
$breadcrumbs = array(
$translator->trans('Homepage') => $this->generateUrl('accomodation_index'),
$translator->trans('Autos') => null
);
return $this->render('frontend/car.html.twig', [
'breadcrumbs' => $breadcrumbs,
'page_title' => $translator->trans('Autos')
]);
}
}