src/Aviatur/HelicopterBundle/Controller/HelicopterAvailabilityController.php line 25

Open in your IDE?
  1. <?php
  2. namespace Aviatur\HelicopterBundle\Controller;
  3. use Aviatur\HelicopterBundle\Models\HelicopterModel;
  4. use Aviatur\SearchBundle\Entity\SearchHeliports;
  5. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  6. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  7. use Symfony\Component\HttpFoundation\Cookie;
  8. use Symfony\Component\HttpFoundation\Response;
  9. use Aviatur\GeneralBundle\Services\AviaturErrorHandler;
  10. use Aviatur\TwigBundle\Services\TwigFolder;
  11. use Doctrine\Persistence\ManagerRegistry;
  12. use Symfony\Component\HttpFoundation\Request;
  13. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  14. use Symfony\Component\Routing\RouterInterface;
  15. use Aviatur\GeneralBundle\Services\AviaturWebService;
  16. use Aviatur\GeneralBundle\Services\AviaturLogSave;
  17. use Aviatur\HelicopterBundle\Services\SearchHelicopterCookie;
  18. use Aviatur\GeneralBundle\Services\AviaturXsltRender;
  19. use Aviatur\FlightBundle\Services\GenerateFlightResumeEmail;
  20. class HelicopterAvailabilityController extends AbstractController
  21. {
  22.     public function searchAction()
  23.     {
  24.         return $this->redirect(
  25.             $this->generateUrl(
  26.                             'aviatur_search_helicopters',
  27.                             []
  28.                         )
  29.         );
  30.     }
  31.     public function availabilityAction(Request $requestAviaturLogSave $aviaturLogSaveSearchHelicopterCookie $helicopterSearchCookieAviaturErrorHandler $aviaturErrorHandlerTwigFolder $twigFolderSessionInterface $sessionManagerRegistry $registry$origin1$destination1$date1$adults$children$origin2 null$destination2 null$date2 null$helicopters)
  32.     {
  33.         $origins = [];
  34.         $destinations = [];
  35.         $urlDescription = [];
  36.         $infants null;
  37.         $transactionId null;
  38.         $em $registry->getManager();
  39.         $fullRequest $request;
  40.         $requestUrl $this->generateUrl($fullRequest->attributes->get('_route'), $fullRequest->attributes->get('_route_params'));
  41.         $agency $em->getRepository(\Aviatur\AgencyBundle\Entity\Agency::class)->find($session->get('agencyId'));
  42.         if ((== $helicopters) && !isset($origin2) && !isset($destination2)) {
  43.             $origin2 $destination1;
  44.             $destination2 $origin1;
  45.         }
  46.         $repositorySearchHeliports $em->getRepository(SearchHeliports::class);
  47.         $route $request->get('_route');
  48.         if (!$request->isXmlHttpRequest()) {
  49.             if ($adults $children <= 9) {
  50.                 $AvailabilityArray = [
  51.                     'adults' => $adults,
  52.                     'children' => $children, ];
  53.                 $condition '';
  54.                 $dateError = [];
  55.                 for ($i 1$i <= $helicopters; ++$i) {
  56.                     $AvailabilityArray['date'.$i] = false !== strpos(${'date'.$i}, 'T') ? date('Y-m-d\TH:i:s'strtotime(substr(${'date'.$i}, 010).sprintf('+%d hours'substr(${'date'.$i}, -2)))) : date('Y-m-d\TH:i:s'strtotime(substr(${'date'.$i}, 010)));
  57.                     $condition .= ' p.iata = :origin'.$i.' or p.iata = :destination'.$i.' or';
  58.                     if ($i 1) {
  59.                         if (($AvailabilityArray['date'.$i] < $AvailabilityArray['date'.($i 1)]) || ((date('Y-m-d\TH:i:s'strtotime($AvailabilityArray['date'.$i])) < date('Y-m-d\TH:i:s'strtotime('today +12 hour'))) && ((date('H'strtotime('now')) >= 12) || (date('Y-m-d'strtotime('today')) > date('Y-m-d'strtotime($AvailabilityArray['date1']))))) || ($AvailabilityArray['date'.$i] > date('Y-m-d\TH:i:s'strtotime('+11 month')))) {
  60.                             $dateError[$i] = $AvailabilityArray['date'.$i];
  61.                         }
  62.                     } else {
  63.                         if (((date('Y-m-d\TH:i:s'strtotime($AvailabilityArray['date'.$i])) < date('Y-m-d\TH:i:s'strtotime('today +12 hour'))) && ((date('H'strtotime('now')) >= 12) || (date('Y-m-d'strtotime('today')) > date('Y-m-d'strtotime($AvailabilityArray['date'.$i]))))) || ($AvailabilityArray['date'.$i] > date('Y-m-d\TH:i:s'strtotime('+11 month')))) {
  64.                             $dateError[$i] = $AvailabilityArray['date'.$i];
  65.                         }
  66.                     }
  67.                 }
  68.                 if (== sizeof($dateError)) {
  69.                     $condition = \rtrim($condition'or');
  70.                     $querySeachHeliports $repositorySearchHeliports->createQueryBuilder('p')->where($condition);
  71.                     for ($i 1$i <= $helicopters; ++$i) {
  72.                         $querySeachHeliports->setParameter('origin'.$i, ${'origin'.$i})
  73.                                 ->setParameter('destination'.$i, ${'destination'.$i});
  74.                         $AvailabilityArray['origin'.$i] = ${'origin'.$i};
  75.                         $origins[] = ${'origin'.$i};
  76.                         $AvailabilityArray['destination'.$i] = ${'destination'.$i};
  77.                         $destinations[] = ${'destination'.$i};
  78.                     }
  79.                     $intersect array_intersect_assoc($origins$destinations);
  80.                     if (== sizeof($intersect)) {
  81.                         $heliportInfo $querySeachHeliports->getQuery()->getResult();
  82.                         for ($i 1$i <= $helicopters; ++$i) {
  83.                             $tempOriginCheck 0;
  84.                             $tempDestinationCheck 0;
  85.                             for ($j 0$j sizeof($heliportInfo); ++$j) {
  86.                                 if (($AvailabilityArray['origin'.$i] == $heliportInfo[$j]->getIata()) && (!$tempOriginCheck)) {
  87.                                     $tempOriginCheck 1;
  88.                                     $AvailabilityArray['originLabel'.$i] = $heliportInfo[$j]->getName().', '.$heliportInfo[$j]->getCity().', '.$heliportInfo[$j]->getCountry().'('.$heliportInfo[$j]->getIata().')';
  89.                                     $cityOriginName $heliportInfo[$j]->getCity();
  90.                                 }
  91.                                 if (($AvailabilityArray['destination'.$i] == $heliportInfo[$j]->getIata()) && (!$tempDestinationCheck)) {
  92.                                     $tempDestinationCheck 1;
  93.                                     $AvailabilityArray['destinationLabel'.$i] = $heliportInfo[$j]->getName().', '.$heliportInfo[$j]->getCity().', '.$heliportInfo[$j]->getCountry().'('.$heliportInfo[$j]->getIata().')';
  94.                                     $cityDestinationName $heliportInfo[$j]->getCity();
  95.                                 }
  96.                                 if ($tempDestinationCheck && $tempOriginCheck) {
  97.                                     $j sizeof($heliportInfo);
  98.                                 }
  99.                             }
  100.                         }
  101.                         $response = new Response();
  102.                         if ($agency->getDomainsecure() == $agency->getDomain() && '443' != $agency->getCustomport()) {
  103.                             $safeUrl 'https://'.$agency->getDomain();
  104.                         } else {
  105.                             $safeUrl 'https://'.$agency->getDomainsecure();
  106.                         }
  107.                         $cookieLastSearch $helicopterSearchCookie->searchHelicopterCookie(['helicopter' => base64_encode(json_encode($AvailabilityArray))]);
  108.                         if ($session->has('operatorId')) {
  109.                             $urlDescription['long'] = null;
  110.                             $urlDescription['short'] = null;
  111.                             $agencyFolder $twigFolder->twigFlux();
  112.                             $response $this->render($twigFolder->twigExists('@AviaturTwig/'.$agencyFolder.'/Helicopter/Default/availability.html.twig'), [
  113.                                 'ajaxUrl' => $requestUrl,
  114.                                 'AvailabilityArray' => $AvailabilityArray,
  115.                                 'cityOriginName' => $cityOriginName,
  116.                                 'cityDestinationName' => $cityDestinationName,
  117.                                 'helicopters' => $helicopters,
  118.                                 'inlineEngine' => true,
  119.                                 'safeUrl' => $safeUrl,
  120.                                 'cookieLastSearch' => $cookieLastSearch,
  121.                                 'urlDescription' => $urlDescription,
  122.                                 'availabilityFront' => true,
  123.                             ]);
  124.                         } else {
  125.                             $seoUrl $em->getRepository(\Aviatur\GeneralBundle\Entity\SeoUrl::class)->findByUrlorMaskedUrl($requestUrl);
  126.                             $urlDescription['long'] = null != $seoUrl $seoUrl[0]->getDescription() : '';
  127.                             $urlDescription['short'] = null != $seoUrl $seoUrl[0]->getShortdescription() : '';
  128.                             $agencyFolder $twigFolder->twigFlux();
  129.                             $response $this->render($twigFolder->twigExists('@AviaturTwig/'.$agencyFolder.'/Helicopter/Default/availability.html.twig'), [
  130.                                 'ajaxUrl' => $requestUrl,
  131.                                 'AvailabilityArray' => $AvailabilityArray,
  132.                                 'cityOriginName' => $cityOriginName,
  133.                                 'cityDestinationName' => $cityDestinationName,
  134.                                 'helicopters' => $helicopters,
  135.                                 'inlineEngine' => true,
  136.                                 'safeUrl' => $safeUrl,
  137.                                 'cookieLastSearch' => $cookieLastSearch,
  138.                                 'urlDescription' => $urlDescription,
  139.                                 'availabilityFront' => false,
  140.                             ]);
  141.                         }
  142.                         $response->headers->setCookie(new Cookie('_availability_array[helicopter]'base64_encode(json_encode($AvailabilityArray)), (time() + 3600 24 7), '/'));
  143.                         return $response;
  144.                     } else {
  145.                         //test: /vuelos/BAQ-BAQ/2014-12-18/BAQ-BAQ/2014-12-23/BAQ-BAQ/2015-01-07/1-0-0
  146.                         foreach ($intersect as $helicopter => $destination) {
  147.                             if (($helicopter 1) < $helicopters) {
  148.                                 if (('BOG' != ${'origin'.($helicopter 2)}) && (${'origin'.($helicopter 2)} != ${'origin'.($helicopter 1)})) {
  149.                                     ${'destination'.($helicopter 1)} = ${'origin'.($helicopter 2)};
  150.                                 } elseif ('BOG' != $destination) {
  151.                                     if ($helicopter 0) {
  152.                                         if ('BOG' != ${'destination'.$helicopter}) {
  153.                                             ${'destination'.($helicopter 1)} = 'BOG';
  154.                                         } else {
  155.                                             ${'origin'.($helicopter 1)} = 'BOG';
  156.                                         }
  157.                                     } else {
  158.                                         ${'destination'.($helicopter 1)} = 'BOG';
  159.                                     }
  160.                                 } else {
  161.                                     ${'destination'.($helicopter 1)} = 'CTG';
  162.                                 }
  163.                             } else {
  164.                                 if ('BOG' != $destination) {
  165.                                     ${'destination'.($helicopter 1)} = 'BOG';
  166.                                 } else {
  167.                                     ${'destination'.($helicopter 1)} = 'CTG';
  168.                                 }
  169.                             }
  170.                         }
  171.                     }
  172.                 } else {
  173.                     //test: /vuelos/BAQ-BOG/2014-12-18+2014-12-15/1-0-0
  174.                     foreach ($dateError as $key => $date) {
  175.                         if ($date date('Y-m-d\TH:i:s'strtotime('today +12 hour'))) {
  176.                             ${'date'.$key} = date('Y-m-d'strtotime('+1 day'));
  177.                         } elseif ($date date('Y-m-d\TH:i:s'strtotime('+11 month'))) {
  178.                             if (isset($AvailabilityArray['date'.($key 1)])) {
  179.                                 ${'date'.$key} = date('Y-m-d'strtotime($AvailabilityArray['date'.($key 1)].'+1 week'));
  180.                                 if (${'date'.$key} > date('Y-m-d\TH:i:s'strtotime('+11 month'))) {
  181.                                     ${'date'.$key} = date('Y-m-d'strtotime('-1 day +11 month'));
  182.                                 }
  183.                             } else {
  184.                                 ${'date'.$key} = date('Y-m-d'strtotime(${'date'.$key}.'-12 month'));
  185.                             }
  186.                         } else {
  187.                             ${'date'.$key} = date('Y-m-d'strtotime($AvailabilityArray['date'.($key 1)].'+1 week'));
  188.                         }
  189.                     }
  190.                 }
  191.             } else {
  192.                 //test: /vuelos/BAQ-BAQ/2014-12-18/5-3-2
  193.                 if ($adults 9) {
  194.                     $adults 9;
  195.                     $children 0;
  196.                     $infants 0;
  197.                 } elseif ($adults $children 9) {
  198.                     $children $adults;
  199.                     $infants 0;
  200.                 } elseif ($adults $children $infants 9) {
  201.                     $infants $adults $children;
  202.                 } elseif ($infants $adults) {
  203.                     $infants $adults;
  204.                 }
  205.             }
  206.             if ('aviatur_helicopter_round' == $route) {
  207.                 $origin2 null;
  208.                 $destination2 null;
  209.             }
  210.             $url $this->generateUrl(
  211.                 $request->get('_route'),
  212.                 [
  213.                 'date1' => $date1,
  214.                 'date2' => $date2,
  215.                 'origin1' => $origin1,
  216.                 'origin2' => $origin2,
  217.                 'destination1' => $destination1,
  218.                 'destination2' => $destination2,
  219.                 'adults' => $adults,
  220.                 'children' => $children,
  221.                 'infants' => $infants,
  222.                     ]
  223.             );
  224.             return $this->redirect($aviaturErrorHandler->errorRedirectNoEmail($url'Recomendación Automática''La consulta que realizaste no era válida, hemos analizado tu búsqueda y esta es nuestra recomendación'));
  225.         } else {
  226.             $session->remove($session->get($transactionIdSessionName).'[helicopter][availability_file]');
  227.             $helicopterModel = new HelicopterModel();
  228.             if ($session->has('maxResults')) {
  229.                 $maxResults $session->get('maxResults');
  230.                 $session->remove('maxResults');
  231.             } else {
  232.                 $maxResults $request->query->get('maxResults');
  233.             }
  234.             $xmlTemplate $helicopterModel->getXmlAvailability();
  235.             $xmlRequest $xmlTemplate[0];
  236.             for ($i 1$i <= $helicopters; ++$i) {
  237.                 $xmlTempOriginDestination str_replace(['{templateDate}''{templateOrigin}''{templateDestination}'], ['{date'.$i.'}''{origin'.$i.'}''{destination'.$i.'}'], $xmlTemplate[1]);
  238.                 $xmlTempOriginDestination str_replace(' CrossDateAllowedIndicator="true"'''$xmlTempOriginDestination);
  239.                 if (false !== strpos(${'date'.$i}, 'T')) {
  240.                     ${'date'.$i} = date('Y-m-d\TH:i:s'strtotime(substr(${'date'.$i}, 010).sprintf('+%d hours'substr(${'date'.$i}, -2))));
  241.                 } else {
  242.                     ${'date'.$i} = date('Y-m-d\TH:i:s'strtotime(substr(${'date'.$i}, 010)));
  243.                 }
  244.                 $xmlRequest .= $xmlTempOriginDestination;
  245.             }
  246.             $xmlRequest .= $xmlTemplate[2];
  247.             $domain str_replace('www.'''$request->getHost());
  248.             $productType $em->getRepository(\Aviatur\MpaBundle\Entity\ProductType::class)->findByCode('HELICOPTER');
  249.             $providers = [];
  250.             if ($session->has('helicopterAdapterId')) {
  251.                 $providers explode(';'$session->get('helicopterAdapterId'));
  252.                 $configsHelicopterAgency $em->getRepository(\Aviatur\MpaBundle\Entity\Provider::class)->findByProvideridentifier($providers);
  253.                 foreach ($configsHelicopterAgency as $configHelicopterAgency) {
  254.                     $provider $configHelicopterAgency->getProvideridentifier();
  255.                     if (!in_array($provider$providers)) {
  256.                         $providers[] = $provider;
  257.                     }
  258.                 }
  259.             } else {
  260.                 $configsHelicopterAgency $em->getRepository(\Aviatur\HelicopterBundle\Entity\ConfigHelicopterAgency::class)->findProviderForHelicopters($productType$domain);
  261.                 foreach ($configsHelicopterAgency as $configHelicopterAgency) {
  262.                     $provider $configHelicopterAgency->getProvider()->getProvideridentifier();
  263.                     if (!in_array($provider$providers)) {
  264.                         $providers[] = $provider;
  265.                     }
  266.                 }
  267.             }
  268.             $providerIds implode(';'$providers);
  269.             $xmlRequest .= $xmlTemplate['class'];
  270.             $date1 strtotime($date1) < strtotime('now') ? date('Y-m-d\Th:i:s') : $date1;
  271.             $date2 strtotime($date2) < strtotime('now') ? date('Y-m-d\Th:i:s') : $date2;
  272.             $variable = [
  273.                 'ProviderId' => $providerIds,
  274.                 'date1' => $date1,
  275.                 'date2' => $date2,
  276.                 'origin1' => $origin1,
  277.                 'origin2' => $origin2,
  278.                 'destination1' => $destination1,
  279.                 'destination2' => $destination2,
  280.                 'adults' => $adults,
  281.                 'children' => $children,
  282.                 'infants' => 0,
  283.                 'cabin' => 'Economy',
  284.                 'MaxResponses' => $maxResults,
  285.             ];
  286.             $variable['ProviderId'] = $providerIds;
  287.             $variable['externalId'] = $agency->getExternalid();
  288.             $variable['officeId'] = $agency->getOfficeid();
  289.             if ($session->has('officeId')) {
  290.                 $variable['externalId'] = $session->get('externalId');
  291.                 $variable['officeId'] = $session->get('officeId');
  292.             }
  293.             $xmlRequest .= $xmlTemplate[3];
  294.             // AVAILABILITY XML
  295.             $makeLogin true;
  296.             if ($session->has($transactionIdSessionName.'Multi')) {
  297.                 $transactionDatetime $session->get($transactionIdSessionName.'MultiTime');
  298.                 if ((strtotime(date('Y-m-d H:i:s')) - strtotime($transactionDatetime)) < 60) {
  299.                     $transactionId $session->get($transactionIdSessionName.'Multi');
  300.                     $session->set($transactionIdSessionName$transactionId);
  301.                     $variable['transaction'] = $transactionId;
  302.                     $makeLogin false;
  303.                 } else {
  304.                     $session->remove($transactionIdSessionName.'Multi');
  305.                 }
  306.             }
  307.             if ($makeLogin) {
  308.                 $transactionIdResponse $aviaturWebService->loginService('SERVICIO_MPT''dummy|http://www.aviatur.com.co/dummy/', []);
  309.                 if ('error' == $transactionIdResponse || is_array($transactionIdResponse)) {
  310.                     $aviaturErrorHandler->errorRedirect('''Error MPA''No se creó Login!');
  311.                     return new Response('Estamos experimentando dificultades técnicas en este momento.');
  312.                 }
  313.                 $transactionId = (string) $transactionIdResponse;
  314.                 $variable['transaction'] = $transactionId;
  315.                 $session->set($transactionIdSessionName$transactionId);
  316.             }
  317.             $xmlResponse $this->combinationGeneration($xmlRequest$variable$route);
  318.             if (isset($xmlResponse['error'])) {
  319.                 $transactionId = (string) $aviaturWebService->loginService('SERVICIO_MPT''dummy|http://www.aviatur.com.co/dummy/', []);
  320.                 if ('error' == $transactionId) {
  321.                     $aviaturErrorHandler->errorRedirect('''Error MPA''No se creó Login!');
  322.                     return new Response('Estamos experimentando dificultades técnicas en este momento.');
  323.                 }
  324.                 $variable['transaction'] = $transactionId;
  325.                 $session->set($transactionIdSessionName$transactionId);
  326.                 $xmlResponse $this->combinationGeneration($xmlRequest$variable$route);
  327.                 if (isset($xmlResponse['error'])) {
  328.                     if (false === strpos($xmlResponse['error'], '66002')) {
  329.                         $aviaturErrorHandler->errorRedirect($requestUrl'Error Disponibilidad Helicopteros'$xmlResponse['error']);
  330.                     }
  331.                     return new Response($xmlResponse['error']);
  332.                 }
  333.             }
  334.             if (!is_object($xmlResponse)) {
  335.                 return new Response('Ocurrió un error inesperado en tu consulta, inténtalo nuevamente.');
  336.             }
  337.             $xmlResponse->Message->OTA_AirLowFareSearchRS['TransactionID'] = $transactionId;
  338.             $fileName $aviaturLogSave->logSave($xmlResponse->asXML(), 'HelicopterAvailResponse''RS');
  339.             $session->set($transactionId.'[helicopter][availability_file]'$fileName);
  340.             return $this->generateAjaxResponse($xmlResponse);
  341.         }
  342.     }
  343.     public function getAvailabilityResultsAction(SessionInterface $sessionParameterBagInterface $parameterBag)
  344.     {
  345.         $transactionIdSessionName $parameterBag->get('transaction_id_session_name');
  346.         if ($session->has($transactionIdSessionName)) {
  347.             $transactionId $session->get($transactionIdSessionName);
  348.             if (true === $session->has($transactionId.'[helicopter][availability_file]')) {
  349.                 $availFile $session->get($transactionId.'[helicopter][availability_file]');
  350.                 $response = \simplexml_load_file($availFile);
  351.                 return $this->generateAjaxResponse($response);
  352.             } else {
  353.                 if ($session->has($transactionId.'[availability_results_retry]')) {
  354.                     $retry $session->get($transactionId.'[availability_results_retry]');
  355.                     if ($retry 8) {
  356.                         $session->set($transactionId.'[availability_results_retry]'$retry 1);
  357.                         return new Response('retry');
  358.                     } else {
  359.                         return new Response('error');
  360.                     }
  361.                 } else {
  362.                     $session->set($transactionId.'[availability_results_retry]'1);
  363.                     return new Response('retry');
  364.                 }
  365.             }
  366.         } else {
  367.             return new Response('error');
  368.         }
  369.     }
  370.     private function generateAjaxResponse(TwigFolder $twigFolderGenerateFlightResumeEmail $generateFlightResumeEmail$response)
  371.     {
  372.         $attributes = [
  373.             'Version' => $response->Message->OTA_AirLowFareSearchRS['Version'],
  374.             'SequenceNmbr' => $response->Message->OTA_AirLowFareSearchRS['SequenceNmbr'],
  375.             'CorrelationID' => $response->Message->OTA_AirLowFareSearchRS['CorrelationID'],
  376.             'TransactionID' => $response->Message->OTA_AirLowFareSearchRS['TransactionID'],
  377.         ];
  378.         $transactionId $response->Message->OTA_AirLowFareSearchRS['TransactionID'];
  379.         $response->Message->OTA_AirLowFareSearchRS['TransactionID'] = $transactionId;
  380.         $pricedItineraries $response->Message->OTA_AirLowFareSearchRS->PricedItineraries;
  381.         $bestPrices = [];
  382.         foreach ($pricedItineraries->PricedItinerary as $pricedItinerary) {
  383.             $correlationID str_replace('CorrelationID='''current(explode(';', (string) $pricedItinerary->Notes)));
  384.             $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->Secure['Check'] = crypt($correlationID.'/'.$transactionId'OneFlewOvertheCuckoosNest');
  385.             $providerIdArray explode('ProviderId=', (string) $pricedItinerary->Notes);
  386.             $providerIdArray explode(';'$providerIdArray[1]);
  387.             $providerSegment $providerIdArray[0];
  388.             foreach ($pricedItinerary->AirItinerary->OriginDestinationOptions->OriginDestinationOption as $originDestinationOption) {
  389.                 $arrivalEscala null;
  390.                 $totalDuration 0;
  391.                 foreach ($originDestinationOption->FlightSegment as $flightSegment) {
  392.                     $airlineCode = (string) $flightSegment->OperatingAirline['Code'];
  393.                     if (!array_key_exists($airlineCode$bestPrices)) {
  394.                         $airlineName = (string) $flightSegment->OperatingAirline['CompanyShortName'];
  395.                         $helicopterPrice = (string) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'];
  396.                         $helicopterCurrency = (string) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['CurrencyCode'];
  397.                         $bestPrices[$airlineCode] = [
  398.                             'helicopterPrice' => $helicopterPrice,
  399.                             'helicopterCurrency' => $helicopterCurrency,
  400.                             'airlineName' => $airlineName, ];
  401.                     }
  402.                     $comments = (array) $flightSegment->Comment;
  403.                     if (!= $providerSegment) {
  404.                         if (null != $arrivalEscala) {
  405.                             $totalDuration += (int) abs(strtotime($flightSegment['DepartureDateTime']) - strtotime($arrivalEscala)) / 60;
  406.                         }
  407.                         $totalDuration += (int) substr($comments[12], strpos($comments[12], ':') + 2100);
  408.                         $arrivalEscala $flightSegment['ArrivalDateTime'];
  409.                     } else {
  410.                         $totalDuration = (string) $generateFlightResumeEmail->convertToHoursMins(substr($comments[12], strpos($comments[12], ':') + 2100));
  411.                     }
  412.                 }
  413.                 if (is_int($totalDuration)) {
  414.                     $totalDuration = (string) $generateFlightResumeEmail->convertToHoursMins($totalDuration);
  415.                 }
  416.                 $originDestinationOption['totalDuration'] = $totalDuration;
  417.             }
  418.         }
  419.         $helicopters $pricedItineraries->PricedItinerary;
  420.         $agencyFolder $twigFolder->twigFlux();
  421.         return $this->render($twigFolder->twigExists('@AviaturTwig/'.$agencyFolder.'/Helicopter/Default/availability_ajaxResults.html.twig'), [
  422.                     'attributes' => $attributes,
  423.                     'bestPrices' => $bestPrices,
  424.                     'helicopters' => $helicopters, ]);
  425.     }
  426.     private function multiRequest(Request $requestAviaturLogSave $aviaturLogSaveSessionInterface $session, array $requests$method null$transactionId null)
  427.     {
  428.         $domain $request->getHost();
  429.         $parametersJson $session->get($domain.'[parameters]''');
  430.         $parameters json_decode($parametersJson);
  431.         $url $parameters->aviatur_service_web_url_mpa;
  432.         $handles = [];
  433.         $timeout 100;
  434.         $defaultOptions = [
  435.             CURLOPT_USERAGENT => 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)',
  436.             CURLOPT_URL => $url,
  437.             CURLOPT_RETURNTRANSFER => true,
  438.             CURLOPT_SSL_VERIFYHOST => false,
  439.             CURLOPT_SSL_VERIFYPEER => false,
  440.             CURLOPT_MAXREDIRS => 10,
  441.             CURLOPT_FOLLOWLOCATION => true,
  442.             CURLOPT_CONNECTTIMEOUT => $timeout,
  443.             CURLOPT_POST => true,
  444.         ];
  445.         // add curl options to each handle
  446.         foreach ($requests as $k => $request) {
  447.             $headers = [
  448.                 'POST /AmadeusLATAM.Aviatur.Services/services/mpaservice.asmx HTTP/1.1',
  449.                 'Content-Type: text/xml; charset=utf-8',
  450.                 'Content-Length: '.strlen($request),
  451.                 'SOAPAction: "http://tempuri.org/Execute"',
  452.             ];
  453.             $options $defaultOptions;
  454.             $options += [
  455.                 CURLOPT_HTTPHEADER => $headers,
  456.                 CURLOPT_POSTFIELDS => $request,
  457.             ];
  458.             $ch[$k] = curl_init();
  459.             $opt curl_setopt_array($ch[$k], $options);
  460.             $handles[$k] = $ch[$k];
  461.             $aviaturLogSave->logSave($request$method'RQ'$transactionId);
  462.         }
  463.         $mh curl_multi_init();
  464.         // add handles
  465.         foreach ($handles as $k => $handle) {
  466.             $err curl_multi_add_handle($mh$handle);
  467.         }
  468.         $running_handles null;
  469.         do {
  470.             curl_multi_exec($mh$running_handles);
  471.             curl_multi_select($mh);
  472.         } while ($running_handles 0);
  473.         $response = [];
  474.         foreach ($requests as $k => $request) {
  475.             $response[$k]['error'] = curl_error($handles[$k]);
  476.             if (!empty($response[$k]['error'])) {
  477.                 $response[$k]['data'] = '';
  478.                 $aviaturLogSave->logSave($response[$k]['error'], $method'RS'$transactionId);
  479.             } else {
  480.                 $response[$k]['data'] = curl_multi_getcontent($handles[$k]);  // get results
  481.                 $aviaturLogSave->logSave($response[$k]['data'], $method'RS'$transactionId);
  482.             }
  483.             // close current handler
  484.             curl_multi_remove_handle($mh$handles[$k]);
  485.         }
  486.         curl_multi_close($mh);
  487.         return $response;
  488.     }
  489.     private function combinationGeneration(ManagerRegistry $registryAviaturWebService $aviaturWebService$xmlRequest$variable$route)
  490.     {
  491.         $em $registry->getManager();
  492.         $providers explode(';'$variable['ProviderId']);
  493.         $providerObjects $em->getRepository(\Aviatur\MpaBundle\Entity\Provider::class)->findByProvideridentifier($providers);
  494.         $hasCombination true;
  495.         foreach ($providerObjects as $providerObject) {
  496.             $configHelicopterAgency $em->getRepository(\Aviatur\HelicopterBundle\Entity\ConfigHelicopterAgency::class)->findOneByProvider($providerObject);
  497.             if (== $configHelicopterAgency->getHascombination()) {
  498.                 $hasCombination false;
  499.             }
  500.         }
  501.         $variable['correlationId'] = '';
  502.         $xmlResponse $aviaturWebService->callWebServiceAmadeus('SERVICIO_MPT''AirLowFareSearch''dummy|http://www.aviatur.com.co/dummy/'$xmlRequest$variablefalse);
  503.         return $xmlResponse;
  504.     }
  505.     private function orderCombinationResponse($xmlResponseSegment1)
  506.     {
  507.         $key 0;
  508.         $options = [];
  509.         foreach ($xmlResponseSegment1->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary as $pricedItinerary) {
  510.             $options[$key]['amount'] = (float) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'];
  511.             $options[$key]['xml'] = $pricedItinerary->asXml();
  512.             ++$key;
  513.         }
  514.         usort($options, fn($a$b) => $a['amount'] - $b['amount']);
  515.         $responseXml explode('<PricedItinerary>'str_replace('</PricedItinerary>''<PricedItinerary>'$xmlResponseSegment1->asXml()));
  516.         $orderedResponse $responseXml[0];
  517.         $key 0;
  518.         foreach ($options as $option) {
  519.             if ($key 10) {
  520.                 $orderedResponse .= $option['xml'];
  521.                 ++$key;
  522.             }
  523.         }
  524.         $orderedResponse .= $responseXml[sizeof($responseXml) - 1];
  525.         return \simplexml_load_string($orderedResponse);
  526.     }
  527.     private function specialDiscount(Request $requestSessionInterface $session$xmlResponse$specialDiscountHelicopter$isNational$specialDiscountWithIva)
  528.     {
  529.         $parameters json_decode($session->get($request->getHost().'[parameters]'));
  530.         if (null != $specialDiscountHelicopter) {
  531.             if ((== $specialDiscountHelicopter[0]->getHelicoptertype()) || ((null == $specialDiscountHelicopter[0]->getHelicoptertype())) && ($isNational)) {
  532.                 $specialDiscountAirline $specialDiscountHelicopter[0]->getAirline()->getIata();
  533.                 $specialDiscountMaxStops $specialDiscountHelicopter[0]->getMaxstops();
  534.                 foreach ($xmlResponse->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary as $pricedItinerary) {
  535.                     if (isset($pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->EquivFare['Amount']) && ($pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->EquivFare['Amount'] != $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->BaseFare['Amount'])) {
  536.                         if (((string) $pricedItinerary->TicketingInfo->TicketingVendor['Code'] == $specialDiscountAirline) && (sizeof($pricedItinerary->AirItinerary->OriginDestinationOptions->OriginDestinationOption->FlightSegment) <= $specialDiscountMaxStops)) {
  537.                             $passangerCount 0;
  538.                             foreach ($pricedItinerary->AirItineraryPricingInfo->PTC_FareBreakdowns->PTC_FareBreakdown as $passangers) {
  539.                                 if ('0' != (string) $passangers->PassengerFare->BaseFare['Amount']) {
  540.                                     $passangerCount += (string) $passangers->PassengerTypeQuantity['Quantity'];
  541.                                 }
  542.                             }
  543.                             $fuelFee = (int) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->EquivFare['Amount'];
  544.                             $totalBaseFare 0;
  545.                             $totalTaxes 0;
  546.                             $totalTotalFare 0;
  547.                             foreach ($pricedItinerary->AirItineraryPricingInfo->PTC_FareBreakdowns->PTC_FareBreakdown as $fareBreakDown) {
  548.                                 $baseFare = (int) $fareBreakDown->PassengerFare->BaseFare['Amount'];
  549.                                 $taxes = (int) $fareBreakDown->PassengerFare->Taxes['Amount'];
  550.                                 $totalFare = (int) $fareBreakDown->PassengerFare->TotalFare['Amount'];
  551.                                 if (!= $baseFare) {
  552.                                     $fuelFeePax $fuelFee $passangerCount;
  553.                                     $netFare $baseFare $fuelFeePax;
  554.                                     $extraFee 100;
  555.                                     $ivaTaxBefore $netFare $parameters->aviatur_payment_iva;
  556.                                     if (== $specialDiscountHelicopter[0]->getDiscounttype()) {
  557.                                         $netFare $netFare * (- ($specialDiscountHelicopter[0]->getDiscountamount() / 100)) + $extraFee;
  558.                                         $baseFare $netFare $fuelFeePax;
  559.                                     } else {
  560.                                         $baseFare $baseFare - ($specialDiscountHelicopter[0]->getDiscountamount() / $passangerCount);
  561.                                     }
  562.                                     if ($specialDiscountWithIva) {
  563.                                         $taxes ceil(($taxes - ($ivaTaxBefore - ($netFare $parameters->aviatur_payment_iva))) / 10) * 10;
  564.                                     }
  565.                                     $baseFare ceil($baseFare 100) * 100;
  566.                                     $totalFare $baseFare $taxes;
  567.                                     $fareBreakDown->PassengerFare->BaseFare['Amount'] = $baseFare;
  568.                                     $fareBreakDown->PassengerFare->Taxes['Amount'] = $taxes;
  569.                                     $fareBreakDown->PassengerFare->TotalFare['Amount'] = $totalFare;
  570.                                     $paxQuantity = (int) $fareBreakDown->PassengerTypeQuantity['Quantity'];
  571.                                     $totalBaseFare += ($baseFare $paxQuantity);
  572.                                     $totalTaxes += ($taxes $paxQuantity);
  573.                                     $totalTotalFare += ($totalFare $paxQuantity);
  574.                                 }
  575.                             }
  576.                             $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->BaseFare['Amount'] = $totalBaseFare;
  577.                             $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->BaseFare['SpecialDiscount'] = true;
  578.                             $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->Taxes['Amount'] = $totalTaxes;
  579.                             $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'] = $totalTotalFare;
  580.                         }
  581.                     }
  582.                 }
  583.             }
  584.         }
  585.         return $xmlResponse;
  586.     }
  587.     public function availabilityDetailAction(Request $requestTwigFolder $twigFolderSessionInterface $session$transactionId null$quoteId null$refNbr null$rph null)
  588.     {
  589.         if ($request->isXmlHttpRequest()) {
  590.             if (null != $transactionId) {
  591.                 if (true === $session->has($transactionId.'[helicopter][availability_file]')) {
  592.                     $availFile $session->get($transactionId.'[helicopter][availability_file]');
  593.                     $availObj = \simplexml_load_file($availFile);
  594.                     foreach ($availObj->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary as $PricedItinary) {
  595.                         if ($PricedItinary->AirItineraryPricingInfo['QuoteID'] == $quoteId) {
  596.                             $providerIdArray explode('ProviderId=', (string) $PricedItinary->Notes);
  597.                             $providerIdArray explode(';'$providerIdArray[1]);
  598.                             $providerSegment $providerIdArray[0];
  599.                             foreach ($PricedItinary->AirItinerary->OriginDestinationOptions->OriginDestinationOption as $originDestination) {
  600.                                 if (($originDestination['RefNumber'] == $refNbr) && ($originDestination->FlightSegment['RPH'] == $rph)) {
  601.                                     $helicopters = [];
  602.                                     $arrivalEscala null;
  603.                                     $totalDuration 0;
  604.                                     foreach ($originDestination->FlightSegment as $flightSegment) {
  605.                                         if (null != $arrivalEscala) {
  606.                                             $totalDuration += (int) abs(strtotime($flightSegment['DepartureDateTime']) - strtotime($arrivalEscala)) / 60;
  607.                                             $flightSegment->EscalaLength $this->get('generate_helicopter_resume_email')->convertToHoursMins(abs(strtotime($flightSegment['DepartureDateTime']) - strtotime($arrivalEscala)) / 60);
  608.                                         }
  609.                                         $comments = (array) $flightSegment->Comment;
  610.                                         $flightSegment->departureAirport = (string) substr($comments[0], strpos($comments[0], ':') + 2100);
  611.                                         $flightSegment->arrivalAirport = (string) substr($comments[6], strpos($comments[6], ':') + 2100);
  612.                                         if (!= $providerSegment) {
  613.                                             $flightSegment->HelicopterLength = (string) $this->get('generate_helicopter_resume_email')->convertToHoursMins(substr($comments[12], strpos($comments[12], ':') + 2100));
  614.                                             $totalDuration += (int) substr($comments[12], strpos($comments[12], ':') + 2100);
  615.                                         } else {
  616.                                             $totalDuration = (string) $this->get('generate_helicopter_resume_email')->convertToHoursMins(substr($comments[12], strpos($comments[12], ':') + 2100));
  617.                                             $flightSegment->HelicopterLength $this->get('generate_helicopter_resume_email')->convertToHoursMins(abs(strtotime($flightSegment['DepartureDateTime']) - strtotime($flightSegment['ArrivalDateTime'])) / 60);
  618.                                         }
  619.                                         $arrivalEscala $flightSegment['ArrivalDateTime'];
  620.                                         $helicopters[] = $flightSegment;
  621.                                     }
  622.                                     if (is_int($totalDuration)) {
  623.                                         $totalDuration = (string) $this->get('generate_helicopter_resume_email')->convertToHoursMins($totalDuration);
  624.                                     }
  625.                                     $agencyFolder $twigFolder->twigFlux();
  626.                                     return $this->render($twigFolder->twigExists('@AviaturTwig/'.$agencyFolder.'/Helicopter/Default/availability_ajaxHelicopterDetail.html.twig'), ['helicopters' => $helicopters'totalDuration' => $totalDuration]);
  627.                                 }
  628.                             }
  629.                         }
  630.                     }
  631.                     return $this->json(['error' => 'no info found']);
  632.                 } else {
  633.                     return $this->json(['error' => 'no session found']);
  634.                 }
  635.             } else {
  636.                 return $this->json(['error' => 'no autorized access']);
  637.             }
  638.         } else {
  639.             return $this->json(['error' => 'no autorized access']);
  640.         }
  641.     }
  642.     public function availabilitySeoAction(Request $requestRouterInterface $routerSessionInterface $sessionManagerRegistry $registry$url)
  643.     {
  644.         $em $registry->getManager();
  645.         $seoUrl $em->getRepository(\Aviatur\GeneralBundle\Entity\SeoUrl::class)->findOneByUrl('helicopteros/'.$url);
  646.         if (null != $seoUrl) {
  647.             $maskedUrl $seoUrl->getMaskedurl();
  648.             $session->set('maxResults'$request->query->get('maxResults'));
  649.             if (false !== strpos($maskedUrl'?')) {
  650.                 $parameters explode('&'substr($maskedUrlstrpos($maskedUrl'?') + 1));
  651.                 foreach ($parameters as $parameter) {
  652.                     $sessionInfo explode('='$parameter);
  653.                     if (== sizeof($sessionInfo)) {
  654.                         $session->set($sessionInfo[0], $sessionInfo[1]);
  655.                     }
  656.                 }
  657.                 $maskedUrl substr($maskedUrl0strpos($maskedUrl'?'));
  658.             }
  659.             if (null != $seoUrl) {
  660.                 $route $router->match($maskedUrl);
  661.                 $route['_route_params'] = [];
  662.                 foreach ($route as $param => $val) {
  663.                     // set route params without defaults
  664.                     if ('_' !== \substr($param01)) {
  665.                         $route['_route_params'][$param] = $val;
  666.                     }
  667.                 }
  668.                 return $this->forward($route['_controller'], $route);
  669.             } else {
  670.                 throw $this->createNotFoundException('La página que solicitaste no existe o se ha movido permanentemente');
  671.             }
  672.         } else {
  673.             throw $this->createNotFoundException('La página que solicitaste no existe o se ha movido permanentemente');
  674.         }
  675.     }
  676.     public function detailAction(Request $requestGenerateFlightResumeEmail $generateFlightResumeEmailAviaturErrorHandler $aviaturErrorHandlerTwigFolder $twigFolderAviaturXsltRender $renderXsltRouterInterface $routerAviaturWebService $aviaturWebServiceSessionInterface $sessionManagerRegistry $registryParameterBagInterface $parameterBag)
  677.     {
  678.         $transactionIdSessionName $parameterBag->get('transaction_id_session_name');
  679.         $correlationIdSessionName $parameterBag->get('correlation_id_session_name');
  680.         $response = [];
  681.         $origin = [];
  682.         $destination = [];
  683.         $passangerTypes = [];
  684.         $provider null;
  685.         $fullRequest $request;
  686.         $request $fullRequest->request;
  687.         // Generate Helicopter Detail
  688.         $em $registry->getManager();
  689.         $server $fullRequest->server;
  690.         $agency $em->getRepository(\Aviatur\AgencyBundle\Entity\Agency::class)->find($session->get('agencyId'));
  691.         $returnUrl $twigFolder->pathWithLocale('aviatur_general_homepage');
  692.         if (true === $request->has('referer')) {
  693.             $returnUrl $request->get('http_referer');
  694.         }
  695.         if (true === $request->has('helicopterTransactionID')) {
  696.             $transactionId $request->get('helicopterTransactionID');
  697.             if (false !== strpos($transactionId'||')) {
  698.                 $explodedTransaction explode('||'$transactionId);
  699.                 $transactionId $explodedTransaction[0];
  700.                 $request->set('helicopterTransactionID'$transactionId);
  701.                 $metaseachId $explodedTransaction[1];
  702.                 $session->set('generals[metasearch]'$metaseachId);
  703.                 $metatransaction $em->getRepository(\Aviatur\HelicopterBundle\Entity\Metatransaction::class)->findOneByTransactionId($transactionId);
  704.                 $d1 $metatransaction->getDatetime();
  705.                 $d2 = new \DateTime(date('Y-m-d H:i:s'time() - (15 60)));
  706.                 if (false == $metatransaction->getIsactive()) {
  707.                     $response['error'] = 'Por favor selecciona nuevamente tu itinerario de viaje';
  708.                     return $this->redirect($aviaturErrorHandler->errorRedirectNoEmail($returnUrl''$response['error']));
  709.                 } elseif ($d1 $d2) {
  710.                     $response['error'] = 'Por favor selecciona nuevamente tu itinerario de viaje';
  711.                     return $this->redirect($aviaturErrorHandler->errorRedirectNoEmail($returnUrl'Tu consulta fue realizada hace más de 15 minutos'$response['error']));
  712.                 } else {
  713.                     $metatransaction->setIsactive(false);
  714.                     $em->persist($metatransaction);
  715.                     $em->flush();
  716.                 }
  717.             }
  718.         } elseif ((true === $session->has('redirectedRetry')) && (true === $session->get('redirectedRetry'))) {
  719.             $session->set('redirectedRetry'false);
  720.             $transactionId $session->get($transactionIdSessionName);
  721.         } else {
  722.             $response['error'] = 'No se encontró información de la transacción';
  723.             return $this->redirect($aviaturErrorHandler->errorRedirect($returnUrl''$response['error']));
  724.         }
  725.         $destinationsArray null;
  726.         if ((true === $session->has($transactionId.'[helicopter][retry]')) || (true === $session->has($transactionId.'[helicopter][retry0]')) || (true === $session->has($transactionId.'[helicopter][retry1]'))) {
  727.             $response = \simplexml_load_string($session->get($transactionId.'[helicopter][detail]'));
  728.             $providerId '';
  729.             foreach ($response->ProviderResults->ProviderResult as $providerIds) {
  730.                 $providerId = (string) $providerIds['Provider'];
  731.             }
  732.             $provider $em->getRepository(\Aviatur\MpaBundle\Entity\Provider::class)->findOneByProvideridentifier($providerId);
  733.             if ($session->get($transactionId.'[helicopter][prepayment0]')) {
  734.                 $allDetails = \simplexml_load_string($session->get($transactionId.'[helicopter][prepayment0]'));
  735.             } else {
  736.                 $allDetails = \simplexml_load_string($session->get($transactionId.'[helicopter][prepayment]'));
  737.             }
  738.             foreach ($allDetails->Message->OTA_AirBookRS->AirReservation->TravelerInfo->AirTraveler as $traveler) {
  739.                 $travelers[] = [
  740.                     'DocType' => $traveler->Document['DocType'],
  741.                     'DocId' => $traveler->Document['DocID'],
  742.                     'Nationality' => $traveler->Document['DocHolderNationality'],
  743.                     'PassportExp' => $traveler->Document['ExpireDate'],
  744.                     'GivenName' => $traveler->PersonName->GivenName,
  745.                     'Surname' => $traveler->PersonName->Surname,
  746.                     'typeCode' => $traveler['PassengerTypeCode'],
  747.                     'BirthDate' => $traveler['BirthDate'],
  748.                     'Gender' => $traveler['Gender'],
  749.                     'Address' => $traveler->Address->AddressLine.'-'.$traveler->Address->CityName.'-'.$traveler->Address->CountryName,
  750.                     'Email' => $traveler->Email,
  751.                     'Telephone' => $traveler->Telephone['PhoneNumber'],
  752.                 ];
  753.             }
  754.             $postData json_decode($session->get($transactionId.'[helicopter][detail_data_helicopter]'));
  755.             $passangerInfo $postData->PI;
  756.             $billingData $postData->BD;
  757.             $contactData $postData->CD;
  758.             $baggageData $postData->BI ?? null;
  759.             $twig_readonly true;
  760.             $shortStopOver false;
  761.         } else {
  762.             $RPHArray $request->get('RPH');
  763.             $security $request->get('helicopterSessionID');
  764.             $correlationID $request->get('helicopterCorrelationID');
  765.             $session->set($transactionId.'[helicopter]['.$correlationIdSessionName.']'$correlationID);
  766.             $tempPF explode('*'$request->get('helicopterPricedID'));
  767.             $pricedID $tempPF[0];
  768.             $feeId '';
  769.             if ($security == crypt($correlationID.'/'.$transactionId'OneFlewOvertheCuckoosNest')) {
  770.                 $providersId explode('|'$request->get('helicopterProviderID'));
  771.                 if (true === $session->has($transactionId.'[helicopter][detail]')) {
  772.                     $reloaded 1;
  773.                     if (sizeof($providersId) > 1) {
  774.                         $providers = [];
  775.                         $providerIdentifiers = [];
  776.                         foreach ($providersId as $providerId) {
  777.                             $providers[] = $em->getRepository(\Aviatur\MpaBundle\Entity\Provider::class)->findOneByProvideridentifier($providerId);
  778.                             $providerIdentifiers[] = $providers[array_key_last($providers)]->getProvideridentifier();
  779.                         }
  780.                     } else {
  781.                         $provider $em->getRepository(\Aviatur\MpaBundle\Entity\Provider::class)->findOneByProvideridentifier($session->get($transactionId.'[helicopter][provider]'));
  782.                     }
  783.                     $response = \simplexml_load_string($session->get($transactionId.'[helicopter][detail]'));
  784.                 } else {
  785.                     $reloaded 0;
  786.                     if (sizeof($providersId) > 1) {
  787.                         $providers = [];
  788.                         $providerIdentifiers = [];
  789.                         foreach ($providersId as $providerId) {
  790.                             $providers[] = $em->getRepository(\Aviatur\MpaBundle\Entity\Provider::class)->findOneByProvideridentifier($providerId);
  791.                             $providerIdentifiers[] = $providers[array_key_last($providers)]->getProvideridentifier();
  792.                         }
  793.                         $session->set($transactionId.'[helicopter][provider]'json_encode($providerIdentifiers));
  794.                         $pricedIDs explode('|'$pricedID);
  795.                         $correlationIDs explode('||'$correlationID);
  796.                         foreach ($providerIdentifiers as $key => $providerIdentifier) {
  797.                             $variable = [
  798.                                 'ProviderId' => $providerIdentifier,
  799.                                 'correlationID' => $correlationIDs[$key],
  800.                                 'pricedID' => $pricedIDs[$key],
  801.                                 'RPH' => $RPHArray[$key],
  802.                                 'timeStamp' => date('c'),
  803.                             ];
  804.                             $helicopterModel = new HelicopterModel();
  805.                             $xmlRequest $helicopterModel->getXmlDetail();
  806.                             $tempResponse $aviaturWebService->callWebServiceAmadeus('SERVICIO_MPT''AirDetail''dummy|http://www.aviatur.com.co/dummy/'$xmlRequest$variablefalse$transactionId);
  807.                             if (!isset($tempResponse['error']) && ('error' != $tempResponse)) {
  808.                                 $responses[] = $tempResponse;
  809.                             } else {
  810.                                 $response['error'] = 'Error en la respuesta de nuestro proveedor de servicios, inténtalo nuevamente';
  811.                                 return $this->redirect($aviaturErrorHandler->errorRedirect($returnUrl''$response['error']));
  812.                             }
  813.                         }
  814.                         $baseFareCombination 0;
  815.                         $equivFareCombination 0;
  816.                         $taxesCombination 0;
  817.                         $totalFareCombination 0;
  818.                         $notesInfoCombination '';
  819.                         $ptcFareBreakdownCombination $responses[0]->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItineraryPricingInfo->PTC_FareBreakdowns;
  820.                         $ticketingVendorCombination '';
  821.                         foreach ($responses as $key => $response) {
  822.                             $pricedItinerary $response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary;
  823.                             $xmlOrigin = (string) $pricedItinerary->AirItinerary->OriginDestinationOptions->OriginDestinationOption->FlightSegment->DepartureAirport['LocationCode'];
  824.                             $xmlDestination = (string) $pricedItinerary->AirItinerary->OriginDestinationOptions->OriginDestinationOption->FlightSegment->ArrivalAirport['LocationCode'];
  825.                             $xmlDate = (string) $pricedItinerary->AirItinerary->OriginDestinationOptions->OriginDestinationOption->FlightSegment['DepartureDateTime'];
  826.                             $cities $em->getRepository(\Aviatur\GeneralBundle\Entity\City::class)->findByIatacode([$xmlOrigin$xmlDestination]);
  827.                             if ((== sizeof($cities)) && (== sizeof($pricedItinerary->AirItinerary->OriginDestinationOptions->OriginDestinationOption))) {
  828.                                 $isNational true;
  829.                                 $specialDiscountWithIva false;
  830.                                 $noIvaCities = ['PVA''ADZ'];
  831.                                 foreach ($cities as $city) {
  832.                                     if ('CO' != $city->getCountry()->getIatacode()) {
  833.                                         $isNational false;
  834.                                     }
  835.                                     if ((($city->getIatacode() == $xmlOrigin)) && (!in_array($xmlOrigin$noIvaCities)) && (!in_array($xmlDestination$noIvaCities))) {
  836.                                         $specialDiscountWithIva true;
  837.                                     }
  838.                                 }
  839.                                 $originCity $em->getRepository(\Aviatur\GeneralBundle\Entity\City::class)->findByIatacode([$xmlOrigin]);
  840.                                 $originCountry $originCity[0]->getCountry()->getIatacode();
  841.                                 $specialDiscountHelicopter $em->getRepository(\Aviatur\HelicopterBundle\Entity\SpecialDiscount::class)->findWithCities($xmlOrigin$xmlDestination$xmlDate$agency);
  842.                                 if (null != $specialDiscountHelicopter) {
  843.                                     if (((== $specialDiscountHelicopter[0]->getHelicoptertype()) && ('CO' == $originCountry)) || ((null == $specialDiscountHelicopter[0]->getHelicoptertype())) && ($isNational)) {
  844.                                         $response $this->specialDiscount($response$specialDiscountHelicopter$isNational$specialDiscountWithIva);
  845.                                     }
  846.                                 }
  847.                             }
  848.                             $session->set($transactionId.'[helicopter][detail'.$key.']'$response->asXML());
  849.                             $providerIdArray explode('ProviderId=', (string) $pricedItinerary->Notes);
  850.                             $providerIdArray explode(';'$providerIdArray[1]);
  851.                             $providerSegment $providerIdArray[0];
  852.                             foreach ($pricedItinerary->AirItinerary->OriginDestinationOptions->OriginDestinationOption as $originDestination) {
  853.                                 $arrivalEscala null;
  854.                                 $totalDuration 0;
  855.                                 foreach ($originDestination->FlightSegment as $flightSegment) {
  856.                                     $comments = (array) $flightSegment->Comment;
  857.                                     if (null != $arrivalEscala) {
  858.                                         $totalDuration += (int) abs(strtotime($flightSegment['DepartureDateTime']) - strtotime($arrivalEscala)) / 60;
  859.                                     }
  860.                                     if (!= $providerSegment) {
  861.                                         $totalDuration += (int) substr($comments[12], strpos($comments[12], ':') + 2100);
  862.                                     } else {
  863.                                         $totalDuration = (string) $this->get('generate_helicopter_resume_email')->convertToHoursMins(substr($comments[14], strpos($comments[14], ':') + 2100));
  864.                                     }
  865.                                     $arrivalEscala $flightSegment['ArrivalDateTime'];
  866.                                 }
  867.                                 if (is_int($totalDuration)) {
  868.                                     $totalDuration = (string) $this->get('generate_helicopter_resume_email')->convertToHoursMins($totalDuration);
  869.                                 }
  870.                                 $originDestination['totalDuration'] = $totalDuration;
  871.                             }
  872.                             ${'originDestinationSegment'.($key 1)} = str_replace(['<OriginDestinationOptions>''</OriginDestinationOptions>''RefNumber="0"'], ['''''RefNumber="'.$key.'"'], $pricedItinerary->AirItinerary->OriginDestinationOptions->asXml());
  873.                             $baseFareCombination += (int) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->BaseFare['Amount'];
  874.                             $equivFareCombination += (int) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->EquivFare['Amount'];
  875.                             $taxesCombination += (int) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->Taxes['Amount'];
  876.                             $totalFareCombination += (int) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'];
  877.                             $notesInfoCombination .= (string) $pricedItinerary->Notes;
  878.                             if ($key 0) {
  879.                                 $i 0;
  880.                                 foreach ($pricedItinerary->AirItineraryPricingInfo->PTC_FareBreakdowns->PTC_FareBreakdown as $fareBreakDown) {
  881.                                     $ptcFareBreakdownCombination->PTC_FareBreakdown[$i]->PassengerFare->BaseFare['Amount'] += (int) $fareBreakDown->PassengerFare->BaseFare['Amount'];
  882.                                     $ptcFareBreakdownCombination->PTC_FareBreakdown[$i]->PassengerFare->EquivFare['Amount'] += (int) $fareBreakDown->PassengerFare->EquivFare['Amount'];
  883.                                     $ptcFareBreakdownCombination->PTC_FareBreakdown[$i]->PassengerFare->Taxes['Amount'] += (int) $fareBreakDown->PassengerFare->Taxes['Amount'];
  884.                                     $ptcFareBreakdownCombination->PTC_FareBreakdown[$i]->PassengerFare->TotalFare['Amount'] += (int) $fareBreakDown->PassengerFare->TotalFare['Amount'];
  885.                                     ++$i;
  886.                                 }
  887.                             }
  888.                             $ticketingVendorCombination .= $pricedItinerary->TicketingInfo->TicketingVendor->asXml();
  889.                         }
  890.                         $xmlCombinationTemplate $helicopterModel->getXmlCombinations();
  891.                         $searches = [
  892.                             '{OriginDestinationOptionSegment1}',
  893.                             '{OriginDestinationOptionSegment2}',
  894.                             '{QuoteID}',
  895.                             '{BaseFare}',
  896.                             '{EquivFare}',
  897.                             '{Taxes}',
  898.                             '{TotalFare}',
  899.                             '{PTC_FareBreakdowns}',
  900.                             '{Notes}',
  901.                             '{TicketingVendor}',
  902.                         ];
  903.                         $replaces = [
  904.                             $originDestinationSegment1,
  905.                             $originDestinationSegment2,
  906.                             '',
  907.                             $baseFareCombination,
  908.                             $equivFareCombination,
  909.                             $taxesCombination,
  910.                             $totalFareCombination,
  911.                             $ptcFareBreakdownCombination->asXml(),
  912.                             $notesInfoCombination,
  913.                             $ticketingVendorCombination,
  914.                         ];
  915.                         $xmlCombination str_replace($searches$replaces$xmlCombinationTemplate);
  916.                         unset($response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary);
  917.                         $response = \simplexml_load_string(str_replace('<PricedItineraries>''<PricedItineraries>'.$xmlCombination$response->asXml()));
  918.                     } else {
  919.                         $provider $em->getRepository(\Aviatur\MpaBundle\Entity\Provider::class)->findOneByProvideridentifier($request->get('helicopterProviderID'));
  920.                         $session->set($transactionId.'[helicopter][provider]'$provider->getProvideridentifier());
  921.                         ksort($RPHArray);
  922.                         $RPH implode(' '$RPHArray);
  923.                         $variable = [
  924.                             'ProviderId' => $provider->getProvideridentifier(),
  925.                             'correlationID' => $correlationID,
  926.                             'pricedID' => $pricedID,
  927.                             'RPH' => $RPH,
  928.                             'timeStamp' => date('c'),
  929.                         ];
  930.                         $helicopterModel = new HelicopterModel();
  931.                         $xmlRequest $helicopterModel->getXmlDetail();
  932.                         $response $aviaturWebService->callWebServiceAmadeus('SERVICIO_MPT''AirDetail''dummy|http://www.aviatur.com.co/dummy/'$xmlRequest$variablefalse$transactionId);
  933.                         if (isset($response['error']) || ('error' == $response)) {
  934.                             $referer $router->match(parse_url($server->get('HTTP_REFERER'), PHP_URL_PATH));
  935.                             if (isset($referer['_controller']) && (false !== strpos($referer['_controller'], 'availabilityAction'))) {
  936.                                 $response['error'] ??= 'Error en la respuesta de nuestro proveedor de servicios, inténtalo nuevamente';
  937.                                 return $this->redirect($aviaturErrorHandler->errorRedirect($server->get('HTTP_REFERER'), ''$response['error']));
  938.                             } else {
  939.                                 $response['error'] ??= 'Error en la respuesta de nuestro proveedor de servicios, inténtalo nuevamente';
  940.                                 return $this->redirect($aviaturErrorHandler->errorRedirect($returnUrl''$response['error']));
  941.                             }
  942.                         }
  943.                         $pricedItinerary $response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary;
  944.                         $xmlOrigin = (string) $pricedItinerary->AirItinerary->OriginDestinationOptions->OriginDestinationOption->FlightSegment->DepartureAirport['LocationCode'];
  945.                         $xmlDestination = (string) $pricedItinerary->AirItinerary->OriginDestinationOptions->OriginDestinationOption->FlightSegment->ArrivalAirport['LocationCode'];
  946.                         $xmlDate = (string) $pricedItinerary->AirItinerary->OriginDestinationOptions->OriginDestinationOption->FlightSegment['DepartureDateTime'];
  947.                         $cities $em->getRepository(\Aviatur\GeneralBundle\Entity\City::class)->findByIatacode([$xmlOrigin$xmlDestination]);
  948.                         if ((== sizeof($cities)) && (== sizeof($pricedItinerary->AirItinerary->OriginDestinationOptions->OriginDestinationOption))) {
  949.                             $isNational true;
  950.                             $specialDiscountWithIva false;
  951.                             $noIvaCities = ['PVA''ADZ'];
  952.                             foreach ($cities as $city) {
  953.                                 if ('CO' != $city->getCountry()->getIatacode()) {
  954.                                     $isNational false;
  955.                                 }
  956.                                 if ((($city->getIatacode() == $xmlOrigin)) && (!in_array($xmlOrigin$noIvaCities)) && (!in_array($xmlDestination$noIvaCities))) {
  957.                                     $specialDiscountWithIva true;
  958.                                 }
  959.                             }
  960.                             $originCity $em->getRepository(\Aviatur\GeneralBundle\Entity\City::class)->findByIatacode([$xmlOrigin]);
  961.                             $originCountry $originCity[0]->getCountry()->getIatacode();
  962.                             $specialDiscountHelicopter $em->getRepository(\Aviatur\HelicopterBundle\Entity\SpecialDiscount::class)->findWithCities($xmlOrigin$xmlDestination$xmlDate$agency);
  963.                             if (null != $specialDiscountHelicopter) {
  964.                                 if (((== $specialDiscountHelicopter[0]->getHelicoptertype()) && ('CO' == $originCountry)) || ((null == $specialDiscountHelicopter[0]->getHelicoptertype())) && ($isNational)) {
  965.                                     $response $this->specialDiscount($response$specialDiscountHelicopter$isNational$specialDiscountWithIva);
  966.                                 }
  967.                             }
  968.                         }
  969.                     }
  970.                 }
  971.                 if (isset($response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItineraryPricingInfo->ItinTotalFare->BaseFare['Amount'])) {
  972.                     if ($reloaded) {
  973.                         $userHelicopters 0;
  974.                         $destinationsArray = [];
  975.                         $shortStopOver false;
  976.                         foreach ($response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItinerary->OriginDestinationOptions->OriginDestinationOption as $originDestination) {
  977.                             foreach ($originDestination->FlightSegment as $flightSegment) {
  978.                                 $origin[] = (string) $flightSegment->DepartureAirport['LocationCode'];
  979.                                 $destination[] = (string) $flightSegment->ArrivalAirport['LocationCode'];
  980.                                 $destinationsArray[$userHelicopters]['DateTime'] = substr((string) $flightSegment['DepartureDateTime'], 010);
  981.                                 if (((int) $flightSegment['WaitingTime'] < 120) && ((int) $flightSegment['WaitingTime'] > 0)) {
  982.                                     $shortStopOver true;
  983.                                 }
  984.                             }
  985.                             $firstHelicopter $originDestination->FlightSegment[0];
  986.                             $lastHelicopter $originDestination->FlightSegment[sizeof($originDestination->FlightSegment) - 1];
  987.                             $destinationsArray[$userHelicopters]['OriginCityCode'] = (string) $originDestination['OriginCityCode'];
  988.                             $destinationsArray[$userHelicopters]['DestinationCityCode'] = (string) $originDestination['DestinationCityCode'];
  989.                             $destinationsArray[$userHelicopters]['OriginCityName'] = (string) $originDestination['OriginCityName'];
  990.                             $destinationsArray[$userHelicopters]['DestinationCityName'] = (string) $originDestination['DestinationCityName'];
  991.                             ++$userHelicopters;
  992.                         }
  993.                     } else {
  994.                         $baseAmount = (string) $response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItineraryPricingInfo->ItinTotalFare->BaseFare['Amount'];
  995.                         $helicopters 0;
  996.                         $userHelicopters 0;
  997.                         $description 'Helicopteros - '.(string) $response->ProviderResults->ProviderResult['Provider'].' - ';
  998.                         $destinationsArray = [];
  999.                         $shortStopOver false;
  1000.                         $providerIdArray explode('ProviderId=', (string) $response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->Notes);
  1001.                         $providerIdArray explode(';'$providerIdArray[1]);
  1002.                         $providerSegment $providerIdArray[0];
  1003.                         foreach ($response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItinerary->OriginDestinationOptions->OriginDestinationOption as $originDestination) {
  1004.                             if (!isset($originDestination['totalDuration'])) {
  1005.                                 $arrivalEscala null;
  1006.                                 $totalDuration 0;
  1007.                                 foreach ($originDestination->FlightSegment as $flightSegment) {
  1008.                                     $comments = (array) $flightSegment->Comment;
  1009.                                     if (null != $arrivalEscala) {
  1010.                                         $totalDuration += (int) abs(strtotime($flightSegment['DepartureDateTime']) - strtotime($arrivalEscala)) / 60;
  1011.                                     }
  1012.                                     if (!= $providerSegment) {
  1013.                                         $totalDuration += (int) substr($comments[12], strpos($comments[12], ':') + 2100);
  1014.                                     } else {
  1015.                                         $totalDuration = (string) $generateFlightResumeEmail->convertToHoursMins(substr($comments[14], strpos($comments[14], ':') + 2100));
  1016.                                     }
  1017.                                     $arrivalEscala $flightSegment['ArrivalDateTime'];
  1018.                                 }
  1019.                                 if (is_int($totalDuration)) {
  1020.                                     $totalDuration = (string) $generateFlightResumeEmail->convertToHoursMins($totalDuration);
  1021.                                 }
  1022.                                 $originDestination['totalDuration'] = $totalDuration;
  1023.                             }
  1024.                             $flightSegmentNumber 0;
  1025.                             $combinationDescription '';
  1026.                             $origin[] = (string) $originDestination->FlightSegment[0]->DepartureAirport['LocationCode'];
  1027.                             $destination[] = (string) $originDestination->FlightSegment[sizeof($originDestination->FlightSegment) - 1]->ArrivalAirport['LocationCode'];
  1028.                             foreach ($originDestination->FlightSegment as $flightSegment) {
  1029.                                 $description .= substr((string) $flightSegment['DepartureDateTime'], 010).'('.(string) $flightSegment->DepartureAirport['LocationCode'].' a '.(string) $flightSegment->ArrivalAirport['LocationCode'].') ';
  1030.                                 $combinationDescription .= substr((string) $flightSegment['DepartureDateTime'], 010).'('.(string) $flightSegment->DepartureAirport['LocationCode'].' a '.(string) $flightSegment->ArrivalAirport['LocationCode'].') ';
  1031.                                 $comments = (array) $flightSegment->Comment;
  1032.                                 if (!= $providerSegment) {
  1033.                                     $flightSegment->HelicopterLength = (string) $generateFlightResumeEmail->convertToHoursMins(substr($comments[12], strpos($comments[12], ':') + 2100));
  1034.                                 } else {
  1035.                                     $flightSegment->HelicopterLength $generateFlightResumeEmail->convertToHoursMins(abs(strtotime($flightSegment['DepartureDateTime']) - strtotime($flightSegment['ArrivalDateTime'])) / 60);
  1036.                                 }
  1037.                                 $flightSegment->Comment[14] = (string) $flightSegment->HelicopterLength;
  1038.                                 if ($flightSegmentNumber 0) {
  1039.                                     $previousFlightSegment $originDestination->FlightSegment[$flightSegmentNumber 1];
  1040.                                     $flightSegment['WaitingTime'] = abs(strtotime($flightSegment['DepartureDateTime']) - strtotime($previousFlightSegment['ArrivalDateTime'])) / 60;
  1041.                                     if ((int) $flightSegment['WaitingTime'] < 120) {
  1042.                                         $flightSegment['ShortStopOver'] = true;
  1043.                                         $shortStopOver true;
  1044.                                     } else {
  1045.                                         $flightSegment['ShortStopOver'] = false;
  1046.                                     }
  1047.                                 } else {
  1048.                                     $flightSegment['WaitingTime'] = 0;
  1049.                                     $flightSegment['ShortStopOver'] = false;
  1050.                                 }
  1051.                                 ++$helicopters;
  1052.                                 ++$flightSegmentNumber;
  1053.                                 $destinationsArray[$userHelicopters]['DateTime'] = substr((string) $flightSegment['DepartureDateTime'], 010);
  1054.                             }
  1055.                             if (isset($responses)) {
  1056.                                 $combinationResponse = \simplexml_load_string($session->get($transactionId.'[helicopter][detail'.$userHelicopters.']'));
  1057.                                 $combinationResponse->Message->OTA_AirLowFareSearchRS['Description'] = 'Helicopteros - '.(string) $combinationResponse->ProviderResults->ProviderResult['Provider'].' - '.$combinationDescription;
  1058.                                 $session->set($transactionId.'[helicopter][detail'.$userHelicopters.']'$combinationResponse->asXML());
  1059.                             }
  1060.                             $firstHelicopter $originDestination->FlightSegment[0];
  1061.                             $lastHelicopter $originDestination->FlightSegment[sizeof($originDestination->FlightSegment) - 1];
  1062.                             $originDestination['OriginCityCode'] = $firstHelicopter->DepartureAirport['LocationCode'];
  1063.                             $originDestination['DestinationCityCode'] = $lastHelicopter->ArrivalAirport['LocationCode'];
  1064.                             $originDestination['OriginCityName'] = $firstHelicopter->DepartureAirport['CodeContext'];
  1065.                             $originDestination['DestinationCityName'] = $lastHelicopter->ArrivalAirport['CodeContext'];
  1066.                             $destinationsArray[$userHelicopters]['OriginCityCode'] = (string) $originDestination['OriginCityCode'];
  1067.                             $destinationsArray[$userHelicopters]['DestinationCityCode'] = (string) $originDestination['DestinationCityCode'];
  1068.                             $destinationsArray[$userHelicopters]['OriginCityName'] = (string) $originDestination['OriginCityName'];
  1069.                             $destinationsArray[$userHelicopters]['DestinationCityName'] = (string) $originDestination['DestinationCityName'];
  1070.                             ++$userHelicopters;
  1071.                         }
  1072.                         $response->Message->OTA_AirLowFareSearchRS['Description'] = $description;
  1073.                         $conditionIsInternational '';
  1074.                         $repositorySearchCities $em->getRepository(\Aviatur\SearchBundle\Entity\SearchCities::class);
  1075.                         $repositorySearchAirports $em->getRepository(\Aviatur\SearchBundle\Entity\SearchAirports::class);
  1076.                         $querySeachCities $repositorySearchCities->createQueryBuilder('p')
  1077.                                 ->where('p.countrycode != :countrycode')
  1078.                                 ->setParameter('countrycode''CO');
  1079.                         $querySeachAirports $repositorySearchAirports->createQueryBuilder('p')
  1080.                                 ->where('p.countrycode != :countrycode')
  1081.                                 ->setParameter('countrycode''CO');
  1082.                         $querySeachCitiesNNS $repositorySearchCities->createQueryBuilder('p')
  1083.                                 ->where('p.countrycode = :countrycode')
  1084.                                 ->setParameter('countrycode''CO');
  1085.                         $querySeachAirportsNNS $repositorySearchAirports->createQueryBuilder('p')
  1086.                                 ->where('p.countrycode = :countrycode')
  1087.                                 ->setParameter('countrycode''CO');
  1088.                         for ($i 0$i $userHelicopters; ++$i) {
  1089.                             $conditionIsInternational .= ' p.iata = :origin'.$i.' or p.iata = :destination'.$i.' or';
  1090.                         }
  1091.                         $conditionIsInternational = \rtrim($conditionIsInternational'or');
  1092.                         $querySeachCities->andWhere($conditionIsInternational);
  1093.                         $querySeachAirports->andWhere($conditionIsInternational);
  1094.                         $querySeachCitiesNNS->andWhere($conditionIsInternational);
  1095.                         $querySeachAirportsNNS->andWhere($conditionIsInternational);
  1096.                         for ($i 0$i $userHelicopters; ++$i) {
  1097.                             $querySeachCities->setParameter('origin'.$i$origin[$i])
  1098.                                     ->setParameter('destination'.$i$destination[$i]);
  1099.                             $querySeachAirports->setParameter('origin'.$i$origin[$i])
  1100.                                     ->setParameter('destination'.$i$destination[$i]);
  1101.                             $querySeachCitiesNNS->setParameter('origin'.$i$origin[$i])
  1102.                                     ->setParameter('destination'.$i$destination[$i]);
  1103.                             $querySeachAirportsNNS->setParameter('origin'.$i$origin[$i])
  1104.                                     ->setParameter('destination'.$i$destination[$i]);
  1105.                         }
  1106.                         $internationalCity $querySeachCities->getQuery()->getResult();
  1107.                         $internationalAirport $querySeachAirports->getQuery()->getResult();
  1108.                         $CityNNS $querySeachCitiesNNS->getQuery()->getResult();
  1109.                         $AirportNNS $querySeachAirportsNNS->getQuery()->getResult();
  1110.                         $isINNS 0;
  1111.                         if (sizeof($internationalCity) or sizeof($internationalAirport)) {
  1112.                             ++$isINNS;
  1113.                         }
  1114.                         if (!sizeof($CityNNS) and !sizeof($AirportNNS)) {
  1115.                             ++$isINNS;
  1116.                         }
  1117.                         $session->set($transactionId.'[isINNS]'$isINNS);
  1118.                         if ('' == $feeId) {
  1119.                             $administrativeCost 0;
  1120.                             $passangerCount 0;
  1121.                             foreach ($response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItineraryPricingInfo->PTC_FareBreakdowns->PTC_FareBreakdown as $passangers) {
  1122.                                 if ('0' != (string) $passangers->PassengerFare->BaseFare['Amount']) {
  1123.                                     $passangerCount += (string) $passangers->PassengerTypeQuantity['Quantity'];
  1124.                                 }
  1125.                             }
  1126.                         }
  1127.                         if ($request->has('optionals')) {
  1128.                             $optionals $request->get('optionals');
  1129.                             $i 0;
  1130.                             foreach ($optionals as $optional) {
  1131.                                 $optionalInfo explode('-'$optional);
  1132.                                 $response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'] += $optionalInfo[0];
  1133.                                 $response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->Optionals[$i]['Amount'] = $optionalInfo[0];
  1134.                                 $response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->Optionals[$i]['Name'] = $optionalInfo[1];
  1135.                                 ++$i;
  1136.                             }
  1137.                         }
  1138.                         $passangerTypes[1]['ADT'] = 0;
  1139.                         $passangerTypes[1]['CHD'] = 0;
  1140.                         $passangerTypes[1]['INF'] = 0;
  1141.                         foreach ($response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItineraryPricingInfo->PTC_FareBreakdowns->PTC_FareBreakdown as $passangers) {
  1142.                             $passangerTypes[1][(string) $passangers->PassengerTypeQuantity['Code']] += (string) $passangers->PassengerTypeQuantity['Quantity'];
  1143.                             $passangers->PassengerFare->AdminCost['Amount'] = 0;
  1144.                             if ('0' != (string) $passangers->PassengerFare->BaseFare['Amount']) {
  1145.                                 $passangers->PassengerFare->AdminCost['Amount'] = $administrativeCost;
  1146.                             }
  1147.                             if ($request->has('optionals')) {
  1148.                                 $optionals $request->get('optionals');
  1149.                                 $i 0;
  1150.                                 foreach ($optionals as $optional) {
  1151.                                     $optionalInfo explode('-'$optional);
  1152.                                     $passangers->PassengerFare->TPA_Extensions->Optionals[$i]['Amount'] = 0;
  1153.                                     $passangers->PassengerFare->TPA_Extensions->Optionals[$i]['Name'] = $optionalInfo[1];
  1154.                                     if ('0' != (string) $passangers->PassengerFare->BaseFare['Amount']) {
  1155.                                         $passangers->PassengerFare->TPA_Extensions->Optionals[$i]['Amount'] = $optionalInfo[0] / $passangerCount;
  1156.                                     }
  1157.                                     ++$i;
  1158.                                 }
  1159.                             }
  1160.                         }
  1161.                         $response->Message->OTA_AirLowFareSearchRS->PricedItineraries->
  1162.                                 PricedItinerary->AirItinerary->
  1163.                                 OriginDestinationOptions['AdtQuantity'] = $passangerTypes[1]['ADT'];
  1164.                         $response->Message->OTA_AirLowFareSearchRS->PricedItineraries->
  1165.                                 PricedItinerary->AirItinerary->
  1166.                                 OriginDestinationOptions['ChdQuantity'] = $passangerTypes[1]['CHD'];
  1167.                         $response->Message->OTA_AirLowFareSearchRS->PricedItineraries->
  1168.                                 PricedItinerary->AirItinerary->
  1169.                                 OriginDestinationOptions['InfQuantity'] = $passangerTypes[1]['INF'];
  1170.                         $administrativeCost $administrativeCost $passangerCount;
  1171.                         $response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->AdministrativeCost['Amount'] = $administrativeCost;
  1172.                         $response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'] += $administrativeCost;
  1173.                         $response->Message->OTA_AirLowFareSearchRS['TransactionID'] = base64_encode($transactionId);
  1174.                         $operatingAirlineCode $response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->TicketingInfo->TicketingVendor['Code'];
  1175.                         $response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->TicketingInfo->TicketingVendor['Description'] = $operatingAirlineCode;
  1176.                         $session->set($transactionId.'[helicopter][detail]'$response->asXML());
  1177.                         if (true === $request->has('referer')) {
  1178.                             if (true === $request->has('http_referer')) {
  1179.                                 $session->set($transactionId.'[availability_url]'$request->get('http_referer'));
  1180.                             } else {
  1181.                                 $session->set($transactionId.'[availability_url]'$this->generateUrl('homepage', [], true));
  1182.                             }
  1183.                             $session->set($transactionId.'[referer]'$request->get('referer'));
  1184.                         } else {
  1185.                             $session->set($transactionId.'[availability_url]'$server->get('HTTP_REFERER'));
  1186.                         }
  1187.                         $request->get('helicopterSessionID');
  1188.                     }
  1189.                     $twig_readonly false;
  1190.                 } else {
  1191.                     $referer $router->match(parse_url($server->get('HTTP_REFERER'), PHP_URL_PATH));
  1192.                     if (false !== strpos($referer['_controller'], 'availabilityAction')) {
  1193.                         $response['error'] ??= 'Error en la respuesta de nuestro proveedor de servicios, inténtalo nuevamente';
  1194.                         return $this->redirect($aviaturErrorHandler->errorRedirect($returnUrl''$response['error']));
  1195.                     } else {
  1196.                         $response['error'] ??= 'Error en la respuesta de nuestro proveedor de servicios, inténtalo nuevamente';
  1197.                         return $this->redirect($aviaturErrorHandler->errorRedirect($returnUrl''$response['error']));
  1198.                     }
  1199.                 }
  1200.             } else {
  1201.                 $response['error'] = 'La información ha sido alterada';
  1202.                 return $this->redirect($aviaturErrorHandler->errorRedirect($returnUrl''$response['error']));
  1203.             }
  1204.         }
  1205.         $passangerCount 0;
  1206.         $passangerTypes[1]['ADT'] = 0;
  1207.         $passangerTypes[1]['CHD'] = 0;
  1208.         $passangerTypes[1]['INF'] = 0;
  1209.         foreach ($response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItineraryPricingInfo->PTC_FareBreakdowns->PTC_FareBreakdown as $passangers) {
  1210.             $passangerTypes[1][(string) $passangers->PassengerTypeQuantity['Code']] += (string) $passangers->PassengerTypeQuantity['Quantity'];
  1211.             if ('0' != (string) $passangers->PassengerFare->BaseFare['Amount']) {
  1212.                 $passangerCount += (string) $passangers->PassengerTypeQuantity['Quantity'];
  1213.             }
  1214.         }
  1215.         $plantilla $renderXslt->render($response->Message->OTA_AirLowFareSearchRS->asXML(), 'Helicopter''Detail');
  1216.         $documentType $em->getRepository(\Aviatur\CustomerBundle\Entity\DocumentType::class)->findAll();
  1217.         $genderType $em->getRepository(\Aviatur\CustomerBundle\Entity\Gender::class)->findAll();
  1218.         $repositoryDocumentType $em->getRepository(\Aviatur\CustomerBundle\Entity\DocumentType::class);
  1219.         $queryDocumentType $repositoryDocumentType
  1220.                 ->createQueryBuilder('p')
  1221.                 ->where('p.paymentcode != :paymentcode')
  1222.                 ->setParameter('paymentcode''')
  1223.                 ->getQuery();
  1224.         $documentPaymentType $queryDocumentType->getResult();
  1225.         $resumeInfo = [
  1226.             'passanger_count' => $passangerCount,
  1227.             'passanger_type_fares' => $response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItineraryPricingInfo->PTC_FareBreakdowns,
  1228.             'admin_amount' => (int) $response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->AdministrativeCost['Amount'],
  1229.             'base_amount' => (int) $response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItineraryPricingInfo->ItinTotalFare->BaseFare['Amount'],
  1230.             'fares_amount' => (int) $response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItineraryPricingInfo->ItinTotalFare->Taxes['Amount'],
  1231.             'total_amount' => (int) $response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'],
  1232.             'currency_code' => (string) $response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['CurrencyCode'],
  1233.         ];
  1234.         if (isset($response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->Optionals)) {
  1235.             $optionals $response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->Optionals;
  1236.             $i 0;
  1237.             $tempOptionals = [];
  1238.             foreach ($optionals as $optional) {
  1239.                 $tempOptionals[$i]['Amount'] = (string) $optional['Amount'];
  1240.                 $tempOptionals[$i]['Name'] = (string) $optional['Name'];
  1241.                 ++$i;
  1242.             }
  1243.             $resumeInfo['optionals'] = $tempOptionals;
  1244.         }
  1245.         $paymentMethodAgency $em->getRepository(\Aviatur\GeneralBundle\Entity\PaymentMethodAgency::class)->findBy(['agency' => $agency'isactive' => 1]);
  1246.         $paymentOptions = [];
  1247.         foreach ($paymentMethodAgency as $payMethod) {
  1248.             $paymentCode $payMethod->getPaymentMethod()->getCode();
  1249.             if (!in_array($paymentCode$paymentOptions)) {
  1250.                 $paymentOptions[] = $paymentCode;
  1251.             }
  1252.         }
  1253.         $banks = [];
  1254.         if (in_array('pse'$paymentOptions)) {
  1255.             $banks $em->getRepository(\Aviatur\PaymentBundle\Entity\PseBank::class)->findAll();
  1256.         }
  1257.         $cybersource = [];
  1258.         if (in_array('cybersource'$paymentOptions)) {
  1259.             $cybersource['merchant_id'] = $paymentMethodAgency[array_search('cybersource'$paymentOptions)]->getSitecode();
  1260.             $cybersource['org_id'] = $paymentMethodAgency[array_search('cybersource'$paymentOptions)]->getTrankey();
  1261.         }
  1262.         foreach ($paymentOptions as $key => $paymentOption) {
  1263.             if ('cybersource' == $paymentOption) {
  1264.                 unset($paymentOptions[$key]); // strip from other renderizable payment methods
  1265.             }
  1266.         }
  1267.         $conditions $em->getRepository(\Aviatur\GeneralBundle\Entity\HistoricalInfo::class)->findMessageByAgencyOrNull($agency'reservation_conditions');
  1268.         if (isset($providers)) {
  1269.             foreach ($providers as $provider) {
  1270.                 $payment_type_form_name $provider->getPaymentType()->getTwig();
  1271.             }
  1272.         } else {
  1273.             $payment_type_form_name $provider->getPaymentType()->getTwig();
  1274.         }
  1275.         $notes ucfirst(mb_strtolower(htmlentities((string) $response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->Notes)));
  1276.         $responseHelicopterDetail = [
  1277.             'twig_readonly' => $twig_readonly,
  1278.             'plantilla' => $plantilla,
  1279.             'services' => $passangerTypes,
  1280.             'payment_doc_type' => $documentPaymentType,
  1281.             'payment_type_form_name' => $payment_type_form_name,
  1282.             'doc_type' => $documentType,
  1283.             'gender' => $genderType,
  1284.             'additional' => base64_encode($transactionId.'/'.$session->get($transactionId.'[helicopter]['.$correlationIdSessionName.']').'/'.$session->get($transactionId.'[isINNS]')),
  1285.             'referer' => $session->get($transactionId.'[availability_url]'),
  1286.             'resume_info' => $resumeInfo,
  1287.             'destination_array' => $destinationsArray,
  1288.             'cards' => $em->getRepository(\Aviatur\GeneralBundle\Entity\Card::class)->findAll(),
  1289.             'paymentOptions' => $paymentOptions,
  1290.             'banks' => $banks,
  1291.             'cybersource' => $cybersource,
  1292.             'conditions' => $conditions,
  1293.             'airlineCondition' => $notes,
  1294.             'travelers' => $travelers ?? null,
  1295.             'passengers' => $passangerInfo ?? null,
  1296.             'billingData' => $billingData ?? null,
  1297.             'contactData' => $contactData ?? null,
  1298.             'baggageData' => $baggageData ?? null,
  1299.             'internationalHelicopter' => $session->get($transactionId.'[isINNS]'),
  1300.             'shortStopOver' => $shortStopOver,
  1301.         ];
  1302.         $route $router->match(str_replace($fullRequest->getSchemeAndHttpHost(), ''$fullRequest->getUri()));
  1303.         $isMulti false !== strpos($route['_route'], 'multi') ? true false;
  1304.         if ($isMulti) {
  1305.             return $this->json($responseHelicopterDetail);
  1306.         }
  1307.         if (('error' == $responseHelicopterDetail) || (isset($responseHelicopterDetail['error']))) {
  1308.             $message $responseHelicopterDetail['error'] ?? 'Ha ocurrido un error inesperado';
  1309.             $returnUrl $twigFolder->pathWithLocale('aviatur_general_homepage');
  1310.             if (true === $request->has('referer') && true === $request->has('http_referer')) {
  1311.                 $returnUrl $request->get('http_referer');
  1312.             }
  1313.             if (isset($responseHelicopterDetail['no_message']) && (true == $responseHelicopterDetail['no_message'])) {
  1314.                 return $this->redirect($aviaturErrorHandler->errorRedirectNoEmail($returnUrl''$message));
  1315.             } else {
  1316.                 return $this->redirect($aviaturErrorHandler->errorRedirect($returnUrl''$message));
  1317.             }
  1318.         } else {
  1319.             // NNS0 eg. Bogota->Medellin, NNS1 eg. Bogota->Miami, NNS2 eg. Miami->New York
  1320.             $agencyFolder $twigFolder->twigFlux();
  1321.             $view $twigFolder->twigExists('@AviaturTwig/'.$agencyFolder.'/Helicopter/Default/detail.html.twig');
  1322.             $response $this->render($view$responseHelicopterDetail);
  1323.             if ($session->has('generals[metasearch]')) {
  1324.                 $response->headers->setCookie(new Cookie('_referer[helicopter]'base64_encode($session->get('generals[metasearch]')), (time() + 3600 24 3), '/'));
  1325.             }
  1326.             if ($fullRequest->cookies->has('_referer')) {
  1327.                 $cookie $fullRequest->cookies->get('_referer');
  1328.                 $session->set('generals[metasearch]'base64_decode($cookie['helicopter']));
  1329.             }
  1330.             return $response;
  1331.         }
  1332.     }
  1333.     public function detailInvalidAction(Request $requestAviaturErrorHandler $aviaturErrorHandlerTwigFolder $twigFolderRouterInterface $routerSessionInterface $sessionParameterBagInterface $parameterBag)
  1334.     {
  1335.         $transactionIdSessionName $parameterBag->get('transaction_id_session_name');
  1336.         $server $request->server;
  1337.         if (true === $session->has($transactionIdSessionName)) {
  1338.             $transactionId $session->get($transactionIdSessionName);
  1339.             $referer $router->match(parse_url($server->get('HTTP_REFERER'), PHP_URL_PATH));
  1340.             if (true === $session->has($transactionId.'[availability_url]')) {
  1341.                 return $this->redirect($aviaturErrorHandler->errorRedirect($session->get($transactionId.'[availability_url]'), 'Página no accesible''No puedes acceder al detalle sin disponibilidad'));
  1342.             } elseif (false !== strpos($referer['_controller'], 'availabilityAction')) {
  1343.                 return $this->redirect($aviaturErrorHandler->errorRedirect($server->get('HTTP_REFERER'), '''Error en la respuesta de nuestro proveedor de servicios, inténtalo nuevamente'));
  1344.             } else {
  1345.                 return $this->redirect($aviaturErrorHandler->errorRedirect($twigFolder->pathWithLocale('aviatur_general_homepage'), 'Página no accesible''No puedes acceder al detalle sin disponibilidad'));
  1346.             }
  1347.         } else {
  1348.             return $this->redirect($aviaturErrorHandler->errorRedirect($twigFolder->pathWithLocale('aviatur_general_homepage'), 'Página no accesible''No puedes acceder al detalle sin disponibilidad'));
  1349.         }
  1350.     }
  1351.     public function detailUpdateSessionAction(Request $requestAviaturWebService $aviaturWebServiceSessionInterface $sessionParameterBagInterface $parameterBag)
  1352.     {
  1353.         $correlationIdSessionName $parameterBag->get('correlation_id_session_name');
  1354.         if ($request->isXmlHttpRequest()) {
  1355.             $invalidHour 1000;
  1356.             $currentTime = (int) date('Gis');
  1357.             if ($currentTime $invalidHour) {
  1358.                 $request $request->request;
  1359.                 $selectionData $request->get('SD');
  1360.                 $transactionId base64_decode($selectionData['selection']);
  1361.                 $correlationIds explode('||'$session->get($transactionId.'[helicopter]['.$correlationIdSessionName.']'));
  1362.                 $combination false;
  1363.                 if (sizeof($correlationIds) > 1) {
  1364.                     $combination true;
  1365.                 }
  1366.                 $key 0;
  1367.                 foreach ($correlationIds as $correlationId) {
  1368.                     if ($combination) {
  1369.                         $providers json_decode($session->get($transactionId.'[helicopter][provider]'));
  1370.                         $provider $providers[$key];
  1371.                     } else {
  1372.                         $provider $session->get($transactionId.'[helicopter][provider]');
  1373.                     }
  1374.                     $variable = [
  1375.                         'correlationId' => $correlationId,
  1376.                         'ProviderId' => $provider,
  1377.                     ];
  1378.                     $helicopterModel = new HelicopterModel();
  1379.                     $xmlRequest $helicopterModel->getXmlExecute();
  1380.                     $response $aviaturWebService->callWebServiceAmadeus('SERVICIO_MPT''AirCommandExecute''dummy|http://www.aviatur.com.co/dummy/'$xmlRequest$variablefalse);
  1381.                     ++$key;
  1382.                 }
  1383.                 return $this->json($response);
  1384.             } else {
  1385.                 return $this->json(['error' => 'day_change']);
  1386.             }
  1387.         } else {
  1388.             return $this->json(['error' => 'Acceso no autorizado']);
  1389.         }
  1390.     }
  1391. }