src/Controller/AccomodationController.php line 36

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_from_formatted date_create($date_from);
  64.         $date_to $request->get('date_to');
  65.         $date_to_formatted date_create($date_to);
  66.         $occupation $request->get('accomodation_occupation');
  67.         $c_rooms $request->get('c_rooms');
  68.         $c_pax $request->get('c_pax');
  69.         $difference date_diff($date_to_formatted,$date_from_formatted);
  70.         $differenceFormat '%a';
  71.         $c_nights $difference->format($differenceFormat);
  72.         $session $this->get('session');
  73.         $session->remove('roomDistributionArray');
  74.         $roomDistribution '';
  75.         $roomDistributionArray = array();
  76.         for ($i=1$i <= $c_rooms$i++) {
  77.             $roomDistributionArray['room_'.$i.'_adults'] = intval($request->get('room_'.$i.'_adults'));
  78.             $roomDistributionArray['room_'.$i.'_childs'] = intval($request->get('room_'.$i.'_childs'));
  79.             $session->set('accomodation_room_'.$i.'_adults'intval($request->get('room_'.$i.'_adults')));
  80.             $session->set('accomodation_room_'.$i.'_childs'intval($request->get('room_'.$i.'_childs')));
  81.             $c_childs $request->get('room_'.$i.'_childs');
  82.             if ($c_childs 0) {
  83.                 $roomDistribution .= '{
  84.                                         "adults": '.intval($request->get('room_'.$i.'_adults')).',
  85.                                         "kids": '.intval($request->get('room_'.$i.'_childs')).',
  86.                                         "kidAges": [';
  87.                 for ($k=1$k <= $c_childs$k++) {
  88.                     $session->set('accomodation_room_'.$i.'_child_age_'.$kintval($request->get('room_'.$i.'_child_age_'.$k)));
  89.                     $roomDistributionArray['room_'.$i.'_child_age_'.$k] = intval($request->get('room_'.$i.'_child_age_'.$k));
  90.                     $roomDistribution .= intval($request->get('room_'.$i.'_child_age_'.$k));
  91.                     if ($k $c_childs) {
  92.                        $roomDistribution .= ',';
  93.                     }
  94.                 }
  95.                 $roomDistribution .= ']}';
  96.             } else {
  97.                 $roomDistribution .= '{
  98.                     "adults": '.intval($request->get('room_'.$i.'_adults')).'
  99.                 }';
  100.             }
  101.             if ($i $c_rooms) {
  102.                 $roomDistribution .= ',';
  103.             }
  104.         }
  105.         $session->set('roomDistributionArray'$roomDistributionArray);
  106.         $em $this->getDoctrine()->getManager();
  107.         $session->set('accomodation_destination'$destination);
  108.         $session->set('accomodation_zone_id'$zone_id);
  109.         $session->set('accomodation_nationality'$nationality);
  110.         $session->set('accomodation_nationality_name'$em->getRepository('App:Country')->findOneBy(array('code' => $nationality)));
  111.         $session->set('accomodation_bill_T'$bill_T);
  112.         $session->set('accomodation_date_from'$date_from);
  113.         $session->set('accomodation_date_to'$date_to);
  114.         $session->set('accomodation_occupation'$occupation);
  115.         $session->set('accomodation_c_rooms'$c_rooms);
  116.         $session->set('accomodation_c_pax'$c_pax);
  117.         $session->set('accomodation_c_nights'$c_nights);
  118.         $data '{
  119.             "nationality": "'.$nationality.'",
  120.             "factura_t": '.$bill_T.',';
  121.         if ($type == 'accomodation') {
  122.             $zone ' "HotelCodes": "'.$zone_id_num.'", ';
  123.         } else {
  124.             $zone ' "destination": "'.$zone_id_num.'", ';
  125.         }
  126.         $data .= $zone.
  127.             "checkin": "'.$date_from.'",
  128.             "checkout": "'.$date_to.'",
  129.             "roomsDistribution": ['.$roomDistribution.']
  130.         }';
  131.         
  132.         // Api call to search acommodations
  133.         $searchResultArray $this->apiService->search($data);
  134.         /* Descomentar para comenzar a guardar el historial de busquedas
  135.         $search = new Search();
  136.         $search->setUserName($this->getUser()->getUsername());
  137.         $search->setUserEmail($this->getUser()->getEmail());
  138.         $search->setUserId($this->getUser()->getId());
  139.         $search->setNationality($nationality);
  140.         $search->setBillT($bill_T);
  141.         $search->setDestinationName($destination);
  142.         $search->setDestinationId($zone_id);
  143.         $search->setDateFrom($date_from);
  144.         $search->setDateTo($date_to);
  145.         $search->setOccupation($occupation);
  146.         $em->persist($search);
  147.         $em->flush();
  148.         */
  149.         $accomodations = array();
  150.         if ($searchResultArray['SearchAM']['Hotels'] != null) {
  151.             $accomodations $searchResultArray['SearchAM']['Hotels'];
  152.         }
  153.         
  154.         $searchId $searchResultArray['SearchAM']['SearchId'];
  155.         $token $searchResultArray['SearchAM']['Token'];
  156.         $session->set('searchId'$searchId);
  157.         $session->set('token'$token);
  158.         $accService = new AccomodationService();
  159.         $locationsAndFilters $accService->getLocationsAndFilters($accomodations); 
  160.         $filters $locationsAndFilters['filters'];
  161.         $locations $locationsAndFilters['locations'];
  162.         // process acomodations
  163.         $processedHotels $accService->processHotels($accomodations);
  164.         /*
  165.         foreach ($processedHotels as $accomodation) {
  166.            dump($accomodation["Name"]);dump($accomodation["Rates"]);
  167.         } die;
  168.         */
  169.         /* Set accomodations redis*/
  170.         $redis = new \Redis();        
  171.         $redis->connect('127.0.0.1'6379);
  172.         $key 'mb-search-result-accomodation-'.$searchId;
  173.         if ($redis->exists($key)) {        
  174.             $content json_decode($redis->get($key), true);
  175.         } else {            
  176.             $content $processedHotels;
  177.             $redis->set($keyjson_encode($content));
  178.             $redis->expire($key3600);
  179.         }
  180.         /* Set filter redis*/
  181.         $filterKey 'mb-search-result-accomodation-'.$searchId.'-filters';
  182.         if ($redis->exists($filterKey)) {        
  183.             $content json_decode($redis->get($filterKey), true);
  184.         } else {            
  185.             $content $filters;
  186.             $redis->set($filterKeyjson_encode($content));
  187.             $redis->expire($key3600);
  188.         }        
  189.         $breadcrumbs = array(
  190.             $translator->trans('Homepage') => $this->generateUrl('accomodation_index'),
  191.             $translator->trans('Resultados') => null
  192.         );
  193.         //dump($locations);die;
  194.         return $this->render('frontend/accomodation/result.html.twig', [
  195.             'breadcrumbs' => $breadcrumbs,
  196.             'page_title' => $translator->trans('Alojamientos'),
  197.             'accomodations' => $processedHotels,
  198.             'filters' => $filters,
  199.             'locations' => json_encode($locations),
  200.             'countries' => $em->getRepository('App:Country')->findAll()
  201.         ]);
  202.     }
  203.     /**
  204.      * @Route("/results/map", name="accomodation_map", methods={"GET"})
  205.      */
  206.     public function map(TranslatorInterface $translator): Response
  207.     {
  208.         $breadcrumbs = array(
  209.             $translator->trans('Homepage') => $this->generateUrl('accomodation_index'),
  210.             $translator->trans('Resultados') => null
  211.         );
  212.         return $this->render('frontend/accomodation/map.html.twig', [
  213.             'breadcrumbs' => $breadcrumbs,
  214.             'page_title' => $translator->trans('Alojamientos')
  215.         ]);
  216.     }
  217.     /**
  218.      * @Route("/results/filter", name="accomodation_filter", methods={"GET","POST"})
  219.      */
  220.     public function filter(TranslatorInterface $translatorRequest $request): Response {
  221.         $session $this->get('session');
  222.         $searchId $session->get('searchId');
  223.         $filterToApply $request->query->all();
  224.         //dump($request->query->all());die;
  225.         
  226.         $redis = new \Redis();        
  227.         $redis->connect('127.0.0.1'6379);
  228.         $accomodations = array();
  229.         $searchKey 'mb-search-result-accomodation-'.$searchId;
  230.         if ($redis->exists($searchKey)) {        
  231.             $accomodations json_decode($redis->get($searchKey), true);
  232.         }
  233.         
  234.         $filters = array();
  235.         $filtersKey 'mb-search-result-accomodation-'.$searchId.'-filters';
  236.         if ($redis->exists($filtersKey)) {        
  237.             $filters json_decode($redis->get($filtersKey), true);
  238.         }
  239.         //dump(json_decode($redis->get($filtersKey)));die;
  240.         // Definimos todas las estrategias de filtrado, una por cada tipo de filtro existente.
  241.         $strategies = [new RatingFilter(), new BoardFilter()];
  242.         $orderFilter = new OrderFilter();
  243.         $filters = new AccommodationFilter($accomodations$strategies$orderFilter);
  244.         $filteredAccommodations $filters->filter($filterToApply);
  245.         dump(count($filteredAccommodations));
  246.         dump($filterToApply);
  247.         //recordar obtener todas las locations cuando filtro
  248.         $locations = [];
  249.         //$locations = $dataFiltered["locations"];
  250.         $em $this->getDoctrine()->getManager();
  251.         $breadcrumbs = array(
  252.             $translator->trans('Homepage') => $this->generateUrl('accomodation_index'),
  253.             $translator->trans('Resultados') => null
  254.         );
  255.         return $this->render('frontend/accomodation/result.html.twig', [
  256.             'breadcrumbs' => $breadcrumbs,
  257.             'page_title' => $translator->trans('Alojamientos'),
  258.             'accomodations' => $filteredAccommodations// $accomodationsFiltered;
  259.             'filters' => $filterToApply,
  260.             'locations' => json_encode($locations),
  261.             'countries' => $em->getRepository('App:Country')->findAll()
  262.         ]);
  263.     }
  264.     /**
  265.      * @Route("/results/{id}/detail", name="accomodation_detail", methods={"GET"})
  266.      */
  267.     public function detail(TranslatorInterface $translator$id): Response
  268.     {
  269.         $session $this->get('session');
  270.         $searchId $session->get('searchId');
  271.         $roomDistribution '';
  272.         for ($i=1$i <= $session->get('accomodation_c_rooms'); $i++) {
  273.             if ($session->get('accomodation_room_'.$i.'_childs') > 0) {
  274.                 $roomDistribution .= '{
  275.                                         "adults": '.intval($session->get('accomodation_room_'.$i.'_adults')).',
  276.                                         "childs": '.intval($session->get('accomodation_room_'.$i.'_childs')).'
  277.                                     }';
  278.             } else {
  279.                 $roomDistribution .= '{
  280.                     "adults": '.intval($session->get('accomodation_room_'.$i.'_adults')).'
  281.                 }';
  282.             }
  283.             if ($i $session->get('accomodation_c_rooms')) {
  284.                 $roomDistribution .= ',';
  285.             }
  286.         }
  287.         $redis = new \Redis();        
  288.         $redis->connect('127.0.0.1'6379);
  289.         $key 'mb-search-result-accomodation-'.$searchId;
  290.         $accomodation = array();
  291.         if ($redis->exists($key)) {        
  292.             $searchResult json_decode($redis->get($key), true);
  293.             $accomodation $searchResult[$id];
  294.         } else {
  295.             $data '{
  296.                 "nationality": "'.$session->get('accomodation_nationality').'",
  297.                 "factura_t": '.$session->get('accomodation_bill_T').',';
  298.             $zone ' "HotelCodes": "'.$id.'", ';
  299.             $data .= $zone.
  300.                 "checkin": "'.$session->get('accomodation_date_from').'",
  301.                 "checkout": "'.$session->get('accomodation_date_to').'",
  302.                 "roomsDistribution": ['.$roomDistribution.']
  303.             }';
  304.             $result $this->apiService->search($data);
  305.             $accomodation reset($result['SearchAM']['Hotels']);
  306.         }
  307.         $accomodationAditionalInfo $this->apiService->getAcommodationAditionalInfoById($id);
  308.         $locations = array();
  309.         if ($accomodation["Latitude"] & $accomodation["Longitude"]) {
  310.             $locations[] = [$accomodation["Name"],$accomodation["Longitude"],$accomodation["Latitude"]];
  311.         }
  312.         $em $this->getDoctrine()->getManager();
  313.         $breadcrumbs = array(
  314.             $translator->trans('Homepage') => $this->generateUrl('accomodation_index'),
  315.             $translator->trans('Detalle') => null
  316.         );
  317.         return $this->render('frontend/accomodation/detail.html.twig', [
  318.             'breadcrumbs' => $breadcrumbs,
  319.             'page_title' => $translator->trans('Detalle'),
  320.             'accomodation' => $accomodation,
  321.             'accomodationAditionalInfo' => $accomodationAditionalInfo,
  322.             'locations' => json_encode($locations),
  323.             'countries' => $em->getRepository('App:Country')->findAll()
  324.         ]);
  325.     }
  326.     /**
  327.      * @Route("/zones", name="zones_autocomplete", methods={"GET"}, options={"expose"=true})
  328.      */
  329.     public function zones(Request $requestTranslatorInterface $translator): Response
  330.     {
  331.         $term $request->get('term');
  332.         $data = array(
  333.             'term' => $term,
  334.             'source' => 'tb'
  335.         );        
  336.         $result $this->apiService->getZonesAutocomplete($data);
  337.         $response = new Response();
  338.         $response->setContent(json_encode($result));
  339.         $response->headers->set('Content-Type''application/json');
  340.         return $response;
  341.     }
  342.     /**
  343.      * @Route("/about_us", name="about_us", methods={"GET","POST"})
  344.      */
  345.     public function aboutUs(TranslatorInterface $translator): Response
  346.     {       
  347.         $breadcrumbs = array(
  348.             $translator->trans('Homepage') => $this->generateUrl('accomodation_index'),
  349.             $translator->trans('Quienes Somos') => null
  350.         );
  351.         return $this->render('frontend/about_us.html.twig', [
  352.             'breadcrumbs' => $breadcrumbs,
  353.             'page_title' => $translator->trans('Quienes Somos')
  354.         ]);
  355.     }
  356.     /**
  357.      * @Route("/discount", name="discount", methods={"GET","POST"})
  358.      */
  359.     public function discount(TranslatorInterface $translator): Response
  360.     {       
  361.         $breadcrumbs = array(
  362.             $translator->trans('Homepage') => $this->generateUrl('accomodation_index'),
  363.             $translator->trans('Locales Con Descuentos') => null
  364.         );
  365.         return $this->render('frontend/discount.html.twig', [
  366.             'breadcrumbs' => $breadcrumbs,
  367.             'page_title' => $translator->trans('Locales Con Descuentos')
  368.         ]);
  369.     }
  370.     /**
  371.      * @Route("/policies", name="policies", methods={"GET","POST"})
  372.      */
  373.     public function policies(TranslatorInterface $translator): Response
  374.     {       
  375.         $breadcrumbs = array(
  376.             $translator->trans('Homepage') => $this->generateUrl('accomodation_index'),
  377.             $translator->trans('Politicas De Uso') => null
  378.         );
  379.         return $this->render('frontend/policies.html.twig', [
  380.             'breadcrumbs' => $breadcrumbs,
  381.             'page_title' => $translator->trans('Politicas De Uso')
  382.         ]);
  383.     }
  384.     /**
  385.      * @Route("/car", name="car", methods={"GET","POST"})
  386.      */
  387.     public function car(TranslatorInterface $translator): Response
  388.     {       
  389.         $breadcrumbs = array(
  390.             $translator->trans('Homepage') => $this->generateUrl('accomodation_index'),
  391.             $translator->trans('Autos') => null
  392.         );
  393.         return $this->render('frontend/car.html.twig', [
  394.             'breadcrumbs' => $breadcrumbs,
  395.             'page_title' => $translator->trans('Autos')
  396.         ]);
  397.     }
  398. }