src/Controller/AccomodationController.php line 56

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use Symfony\Component\HttpFoundation\Request;
  5. use Symfony\Component\HttpFoundation\Response;
  6. use Symfony\Component\Serializer\Serializer;
  7. use Symfony\Component\Serializer\Encoder\JsonEncoder;
  8. use Symfony\Component\HttpFoundation\JsonResponse;
  9. use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
  10. use Symfony\Component\Routing\Annotation\Route;
  11. use Symfony\Contracts\Translation\TranslatorInterface;
  12. use App\Entity\Search;
  13. use App\Service\AccomodationService;
  14. use App\Service\RatingFilter;
  15. use App\Service\BoardFilter;
  16. use App\Service\OrderFilter;
  17. use App\Service\AccommodationFilter;
  18. use App\Service\ApiService;
  19. /**
  20.  * @Route("/accomodation")
  21.  */
  22. class AccomodationController extends BaseController {
  23.     private $apiService;
  24.     public function __construct(ApiService $apiService) {
  25.         $this->apiService $apiService;
  26.     }
  27.     /**
  28.      * @Route("/", name="accomodation_index", methods={"GET"})
  29.      */
  30.     public function index(TranslatorInterface $translator): Response
  31.     {
  32.         $em $this->getDoctrine()->getManager();
  33.         
  34.         $breadcrumbs = array(
  35.             $translator->trans('Homepage') => $this->generateUrl('accomodation_index'),
  36.             $translator->trans('Alojamientos') => null
  37.         );
  38.         return $this->render('frontend/accomodation/index.html.twig', [
  39.             'breadcrumbs' => $breadcrumbs,
  40.             'page_title' => $translator->trans('Alojamientos'),
  41.             'countries' => $em->getRepository('App:Country')->findAll()
  42.         ]);
  43.     }
  44.     /**
  45.      * @Route("/", name="accomodation_search", methods={"POST"})
  46.      */
  47.     public function search(TranslatorInterface $translatorRequest $request): Response
  48.     {
  49.         $destination $request->get('destination');
  50.         $zone_id $request->get('zone_id');
  51.         if (substr($zone_id01) == 'c') {
  52.             // city
  53.             $type 'city';
  54.             $zone_id_num substr($zone_id2);
  55.         } else {
  56.             // accomodation
  57.             $type 'accomodation';
  58.             $zone_id_num substr($zone_id3);
  59.         }
  60.         $nationality $request->get('nationality');
  61.         $bill_T intval($request->get('bill_T'));
  62.         $date_from $request->get('date_from');
  63.         $date_to $request->get('date_to');
  64.         $occupation $request->get('accomodation_occupation');
  65.         $c_rooms $request->get('c_rooms');
  66.         $c_pax $request->get('c_pax');
  67.         $session $this->get('session');
  68.         $session->remove('roomDistributionArray');
  69.         $roomDistribution '';
  70.         $roomDistributionArray = array();
  71.         for ($i=1$i <= $c_rooms$i++) {
  72.             $roomDistributionArray['room_'.$i.'_adults'] = intval($request->get('room_'.$i.'_adults'));
  73.             $roomDistributionArray['room_'.$i.'_childs'] = intval($request->get('room_'.$i.'_childs'));
  74.             $session->set('accomodation_room_'.$i.'_adults'intval($request->get('room_'.$i.'_adults')));
  75.             $session->set('accomodation_room_'.$i.'_childs'intval($request->get('room_'.$i.'_childs')));
  76.             $c_childs $request->get('room_'.$i.'_childs');
  77.             if ($c_childs 0) {
  78.                 $roomDistribution .= '{
  79.                                         "adults": '.intval($request->get('room_'.$i.'_adults')).',
  80.                                         "kids": '.intval($request->get('room_'.$i.'_childs')).',
  81.                                         "kidAges": [';
  82.                 for ($k=1$k <= $c_childs$k++) {
  83.                     $session->set('accomodation_room_'.$i.'_child_age_'.$kintval($request->get('room_'.$i.'_child_age_'.$k)));
  84.                     $roomDistributionArray['room_'.$i.'_child_age_'.$k] = intval($request->get('room_'.$i.'_child_age_'.$k));
  85.                     $roomDistribution .= intval($request->get('room_'.$i.'_child_age_'.$k));
  86.                     if ($k $c_childs) {
  87.                        $roomDistribution .= ',';
  88.                     }
  89.                 }
  90.                 $roomDistribution .= ']}';
  91.             } else {
  92.                 $roomDistribution .= '{
  93.                     "adults": '.intval($request->get('room_'.$i.'_adults')).'
  94.                 }';
  95.             }
  96.             if ($i $c_rooms) {
  97.                 $roomDistribution .= ',';
  98.             }
  99.         }
  100.         $session->set('roomDistributionArray'$roomDistributionArray);
  101.         $em $this->getDoctrine()->getManager();
  102.         $session->set('accomodation_destination'$destination);
  103.         $session->set('accomodation_zone_id'$zone_id);
  104.         $session->set('accomodation_nationality'$nationality);
  105.         $session->set('accomodation_nationality_name'$em->getRepository('App:Country')->findOneBy(array('code' => $nationality)));
  106.         $session->set('accomodation_bill_T'$bill_T);
  107.         $session->set('accomodation_date_from'$date_from);
  108.         $session->set('accomodation_date_to'$date_to);
  109.         $session->set('accomodation_occupation'$occupation);
  110.         $session->set('accomodation_c_rooms'$c_rooms);
  111.         $session->set('accomodation_c_pax'$c_pax);
  112.         $data '{
  113.             "nationality": "'.$nationality.'",
  114.             "factura_t": '.$bill_T.',';
  115.         if ($type == 'accomodation') {
  116.             $zone ' "HotelCodes": "'.$zone_id_num.'", ';
  117.         } else {
  118.             $zone ' "destination": "'.$zone_id_num.'", ';
  119.         }
  120.         $data .= $zone.
  121.             "checkin": "'.$date_from.'",
  122.             "checkout": "'.$date_to.'",
  123.             "roomsDistribution": ['.$roomDistribution.']
  124.         }';
  125.         
  126.         // Api call to search acommodations
  127.         $searchResultArray $this->apiService->search($data);
  128.         /* Descomentar para comenzar a guardar el historial de busquedas
  129.         $search = new Search();
  130.         $search->setUserName($this->getUser()->getUsername());
  131.         $search->setUserEmail($this->getUser()->getEmail());
  132.         $search->setUserId($this->getUser()->getId());
  133.         $search->setNationality($nationality);
  134.         $search->setBillT($bill_T);
  135.         $search->setDestinationName($destination);
  136.         $search->setDestinationId($zone_id);
  137.         $search->setDateFrom($date_from);
  138.         $search->setDateTo($date_to);
  139.         $search->setOccupation($occupation);
  140.         $em->persist($search);
  141.         $em->flush();
  142.         */
  143.         $accomodations = array();
  144.         if ($searchResultArray['SearchAM']['Hotels'] != null) {
  145.             $accomodations $searchResultArray['SearchAM']['Hotels'];
  146.         }
  147.         
  148.         $searchId $searchResultArray['SearchAM']['SearchId'];
  149.         $token $searchResultArray['SearchAM']['Token'];
  150.         $session->set('searchId'$searchId);
  151.         $session->set('token'$token);
  152.         $locationsAndFilters = (new AccomodationService())->getLocationsAndFilters($accomodations); 
  153.         $filters $locationsAndFilters['filters'];
  154.         $locations $locationsAndFilters['locations'];
  155.         /* Set accomodations redis*/
  156.         $redis = new \Redis();        
  157.         $redis->connect('127.0.0.1'6379);
  158.         $key 'mb-search-result-accomodation-'.$searchId;
  159.         if ($redis->exists($key)) {        
  160.             $content json_decode($redis->get($key), true);
  161.         } else {            
  162.             $content $accomodations;
  163.             $redis->set($keyjson_encode($content));
  164.             $redis->expire($key3600);
  165.         }
  166.         /* Set filter redis*/
  167.         $filterKey 'mb-search-result-accomodation-'.$searchId.'-filters';
  168.         if ($redis->exists($filterKey)) {        
  169.             $content json_decode($redis->get($filterKey), true);
  170.         } else {            
  171.             $content $filters;
  172.             $redis->set($filterKeyjson_encode($content));
  173.             $redis->expire($key3600);
  174.         }        
  175.         $breadcrumbs = array(
  176.             $translator->trans('Homepage') => $this->generateUrl('accomodation_index'),
  177.             $translator->trans('Resultados') => null
  178.         );
  179.         return $this->render('frontend/accomodation/result.html.twig', [
  180.             'breadcrumbs' => $breadcrumbs,
  181.             'page_title' => $translator->trans('Alojamientos'),
  182.             'accomodations' => $accomodations,
  183.             'filters' => $filters,
  184.             'locations' => json_encode($locations),
  185.             'countries' => $em->getRepository('App:Country')->findAll()
  186.         ]);
  187.     }
  188.     /**
  189.      * @Route("/results/map", name="accomodation_map", methods={"GET"})
  190.      */
  191.     public function map(TranslatorInterface $translator): Response
  192.     {
  193.         $breadcrumbs = array(
  194.             $translator->trans('Homepage') => $this->generateUrl('accomodation_index'),
  195.             $translator->trans('Resultados') => null
  196.         );
  197.         return $this->render('frontend/accomodation/map.html.twig', [
  198.             'breadcrumbs' => $breadcrumbs,
  199.             'page_title' => $translator->trans('Alojamientos')
  200.         ]);
  201.     }
  202.     /**
  203.      * @Route("/results/filter", name="accomodation_filter", methods={"GET","POST"})
  204.      */
  205.     public function filter(TranslatorInterface $translatorRequest $request): Response {
  206.         $session $this->get('session');
  207.         $searchId $session->get('searchId');
  208.         $filterToApply $request->query->all(); 
  209.           //dump($request->query->all());die;
  210.         
  211.         $redis = new \Redis();        
  212.         $redis->connect('127.0.0.1'6379);
  213.         $accomodations = array();
  214.         $searchKey 'mb-search-result-accomodation-'.$searchId;
  215.         if ($redis->exists($searchKey)) {        
  216.             $accomodations json_decode($redis->get($searchKey), true);
  217.         }
  218.         
  219.         $filters = array();
  220.         $filtersKey 'mb-search-result-accomodation-'.$searchId.'-filters';
  221.         if ($redis->exists($filtersKey)) {        
  222.             $filters json_decode($redis->get($filtersKey), true);
  223.         }
  224.         //dump(json_decode($redis->get($filtersKey)));die;
  225.         // Definimos todas las estrategias de filtrado, una por cada tipo de filtro existente.
  226.         $strategies = [new RatingFilter(), new BoardFilter()];
  227.         $orderFilter = new OrderFilter();
  228.         $filters = new AccommodationFilter($accomodations$strategies$orderFilter);
  229.         $filteredAccommodations $filters->filter($filterToApply);
  230.         dump(count($filteredAccommodations));
  231.         dump($filterToApply);
  232.         //recordar obtener todas las locations cuando filtro
  233.         $locations = [];
  234.         //$locations = $dataFiltered["locations"];
  235.         $em $this->getDoctrine()->getManager();
  236.         $breadcrumbs = array(
  237.             $translator->trans('Homepage') => $this->generateUrl('accomodation_index'),
  238.             $translator->trans('Resultados') => null
  239.         );
  240.         return $this->render('frontend/accomodation/result.html.twig', [
  241.             'breadcrumbs' => $breadcrumbs,
  242.             'page_title' => $translator->trans('Alojamientos'),
  243.             'accomodations' => $filteredAccommodations// $accomodationsFiltered;
  244.             'filters' => $filterToApply,
  245.             'locations' => json_encode($locations),
  246.             'countries' => $em->getRepository('App:Country')->findAll()
  247.         ]);
  248.     }
  249.     /**
  250.      * @Route("/results/{id}/detail", name="accomodation_detail", methods={"GET"})
  251.      */
  252.     public function detail(TranslatorInterface $translator$id): Response
  253.     {
  254.         $session $this->get('session');
  255.         $searchId $session->get('searchId');
  256.         $roomDistribution '';
  257.         for ($i=1$i <= $session->get('accomodation_c_rooms'); $i++) {
  258.             if ($session->get('accomodation_room_'.$i.'_childs') > 0) {
  259.                 $roomDistribution .= '{
  260.                                         "adults": '.intval($session->get('accomodation_room_'.$i.'_adults')).',
  261.                                         "childs": '.intval($session->get('accomodation_room_'.$i.'_childs')).'
  262.                                     }';
  263.             } else {
  264.                 $roomDistribution .= '{
  265.                     "adults": '.intval($session->get('accomodation_room_'.$i.'_adults')).'
  266.                 }';
  267.             }
  268.             if ($i $session->get('accomodation_c_rooms')) {
  269.                 $roomDistribution .= ',';
  270.             }
  271.         }
  272.         $redis = new \Redis();        
  273.         $redis->connect('127.0.0.1'6379);
  274.         $key 'mb-search-result-accomodation-'.$searchId;
  275.         $accomodation = array();
  276.         if ($redis->exists($key)) {        
  277.             $searchResult json_decode($redis->get($key), true);
  278.             $accomodation $searchResult[$id];
  279.         } else {
  280.             $data '{
  281.                 "nationality": "'.$session->get('accomodation_nationality').'",
  282.                 "factura_t": '.$session->get('accomodation_bill_T').',';
  283.             $zone ' "HotelCodes": "'.$id.'", ';
  284.             $data .= $zone.
  285.                 "checkin": "'.$session->get('accomodation_date_from').'",
  286.                 "checkout": "'.$session->get('accomodation_date_to').'",
  287.                 "roomsDistribution": ['.$roomDistribution.']
  288.             }';
  289.             $result $this->apiService->search($data);
  290.             $accomodation reset($result['SearchAM']['Hotels']);
  291.         }
  292.         $accomodationAditionalInfo $this->apiService->getAcommodationAditionalInfoById($id);
  293.         $locations = array();
  294.         if ($accomodation["Latitude"] & $accomodation["Longitude"]) {
  295.             $locations[] = [$accomodation["Name"],$accomodation["Longitude"],$accomodation["Latitude"]];
  296.         }
  297.         $em $this->getDoctrine()->getManager();
  298.         $breadcrumbs = array(
  299.             $translator->trans('Homepage') => $this->generateUrl('accomodation_index'),
  300.             $translator->trans('Detalle') => null
  301.         );
  302.         return $this->render('frontend/accomodation/detail.html.twig', [
  303.             'breadcrumbs' => $breadcrumbs,
  304.             'page_title' => $translator->trans('Detalle'),
  305.             'accomodation' => $accomodation,
  306.             'accomodationAditionalInfo' => $accomodationAditionalInfo,
  307.             'locations' => json_encode($locations),
  308.             'countries' => $em->getRepository('App:Country')->findAll()
  309.         ]);
  310.     }
  311.     /**
  312.      * @Route("/zones", name="zones_autocomplete", methods={"GET"}, options={"expose"=true})
  313.      */
  314.     public function zones(Request $requestTranslatorInterface $translator): Response
  315.     {
  316.         $term $request->get('term');
  317.         $data = array(
  318.             'term' => $term
  319.         );        
  320.         $result $this->apiService->getZonesAutocomplete($data);
  321.         $response = new Response();
  322.         $response->setContent(json_encode($result));
  323.         $response->headers->set('Content-Type''application/json');
  324.         return $response;
  325.     }
  326. }