<?php
namespace Aviatur\HelicopterBundle\Controller;
use Aviatur\HelicopterBundle\Models\HelicopterModel;
use Aviatur\SearchBundle\Entity\SearchHeliports;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\HttpFoundation\Response;
use Aviatur\GeneralBundle\Services\AviaturErrorHandler;
use Aviatur\TwigBundle\Services\TwigFolder;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Routing\RouterInterface;
use Aviatur\GeneralBundle\Services\AviaturWebService;
use Aviatur\GeneralBundle\Services\AviaturLogSave;
use Aviatur\HelicopterBundle\Services\SearchHelicopterCookie;
use Aviatur\GeneralBundle\Services\AviaturXsltRender;
use Aviatur\FlightBundle\Services\GenerateFlightResumeEmail;
class HelicopterAvailabilityController extends AbstractController
{
public function searchAction()
{
return $this->redirect(
$this->generateUrl(
'aviatur_search_helicopters',
[]
)
);
}
public function availabilityAction(Request $request, AviaturLogSave $aviaturLogSave, SearchHelicopterCookie $helicopterSearchCookie, AviaturErrorHandler $aviaturErrorHandler, TwigFolder $twigFolder, SessionInterface $session, ManagerRegistry $registry, $origin1, $destination1, $date1, $adults, $children, $origin2 = null, $destination2 = null, $date2 = null, $helicopters)
{
$origins = [];
$destinations = [];
$urlDescription = [];
$infants = null;
$transactionId = null;
$em = $registry->getManager();
$fullRequest = $request;
$requestUrl = $this->generateUrl($fullRequest->attributes->get('_route'), $fullRequest->attributes->get('_route_params'));
$agency = $em->getRepository(\Aviatur\AgencyBundle\Entity\Agency::class)->find($session->get('agencyId'));
if ((2 == $helicopters) && !isset($origin2) && !isset($destination2)) {
$origin2 = $destination1;
$destination2 = $origin1;
}
$repositorySearchHeliports = $em->getRepository(SearchHeliports::class);
$route = $request->get('_route');
if (!$request->isXmlHttpRequest()) {
if ($adults + $children <= 9) {
$AvailabilityArray = [
'adults' => $adults,
'children' => $children, ];
$condition = '';
$dateError = [];
for ($i = 1; $i <= $helicopters; ++$i) {
$AvailabilityArray['date'.$i] = false !== strpos(${'date'.$i}, 'T') ? date('Y-m-d\TH:i:s', strtotime(substr(${'date'.$i}, 0, 10).sprintf('+%d hours', substr(${'date'.$i}, -2)))) : date('Y-m-d\TH:i:s', strtotime(substr(${'date'.$i}, 0, 10)));
$condition .= ' p.iata = :origin'.$i.' or p.iata = :destination'.$i.' or';
if ($i > 1) {
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')))) {
$dateError[$i] = $AvailabilityArray['date'.$i];
}
} else {
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')))) {
$dateError[$i] = $AvailabilityArray['date'.$i];
}
}
}
if (0 == sizeof($dateError)) {
$condition = \rtrim($condition, 'or');
$querySeachHeliports = $repositorySearchHeliports->createQueryBuilder('p')->where($condition);
for ($i = 1; $i <= $helicopters; ++$i) {
$querySeachHeliports->setParameter('origin'.$i, ${'origin'.$i})
->setParameter('destination'.$i, ${'destination'.$i});
$AvailabilityArray['origin'.$i] = ${'origin'.$i};
$origins[] = ${'origin'.$i};
$AvailabilityArray['destination'.$i] = ${'destination'.$i};
$destinations[] = ${'destination'.$i};
}
$intersect = array_intersect_assoc($origins, $destinations);
if (0 == sizeof($intersect)) {
$heliportInfo = $querySeachHeliports->getQuery()->getResult();
for ($i = 1; $i <= $helicopters; ++$i) {
$tempOriginCheck = 0;
$tempDestinationCheck = 0;
for ($j = 0; $j < sizeof($heliportInfo); ++$j) {
if (($AvailabilityArray['origin'.$i] == $heliportInfo[$j]->getIata()) && (!$tempOriginCheck)) {
$tempOriginCheck = 1;
$AvailabilityArray['originLabel'.$i] = $heliportInfo[$j]->getName().', '.$heliportInfo[$j]->getCity().', '.$heliportInfo[$j]->getCountry().'('.$heliportInfo[$j]->getIata().')';
$cityOriginName = $heliportInfo[$j]->getCity();
}
if (($AvailabilityArray['destination'.$i] == $heliportInfo[$j]->getIata()) && (!$tempDestinationCheck)) {
$tempDestinationCheck = 1;
$AvailabilityArray['destinationLabel'.$i] = $heliportInfo[$j]->getName().', '.$heliportInfo[$j]->getCity().', '.$heliportInfo[$j]->getCountry().'('.$heliportInfo[$j]->getIata().')';
$cityDestinationName = $heliportInfo[$j]->getCity();
}
if ($tempDestinationCheck && $tempOriginCheck) {
$j = sizeof($heliportInfo);
}
}
}
$response = new Response();
if ($agency->getDomainsecure() == $agency->getDomain() && '443' != $agency->getCustomport()) {
$safeUrl = 'https://'.$agency->getDomain();
} else {
$safeUrl = 'https://'.$agency->getDomainsecure();
}
$cookieLastSearch = $helicopterSearchCookie->searchHelicopterCookie(['helicopter' => base64_encode(json_encode($AvailabilityArray))]);
if ($session->has('operatorId')) {
$urlDescription['long'] = null;
$urlDescription['short'] = null;
$agencyFolder = $twigFolder->twigFlux();
$response = $this->render($twigFolder->twigExists('@AviaturTwig/'.$agencyFolder.'/Helicopter/Default/availability.html.twig'), [
'ajaxUrl' => $requestUrl,
'AvailabilityArray' => $AvailabilityArray,
'cityOriginName' => $cityOriginName,
'cityDestinationName' => $cityDestinationName,
'helicopters' => $helicopters,
'inlineEngine' => true,
'safeUrl' => $safeUrl,
'cookieLastSearch' => $cookieLastSearch,
'urlDescription' => $urlDescription,
'availabilityFront' => true,
]);
} else {
$seoUrl = $em->getRepository(\Aviatur\GeneralBundle\Entity\SeoUrl::class)->findByUrlorMaskedUrl($requestUrl);
$urlDescription['long'] = null != $seoUrl ? $seoUrl[0]->getDescription() : '';
$urlDescription['short'] = null != $seoUrl ? $seoUrl[0]->getShortdescription() : '';
$agencyFolder = $twigFolder->twigFlux();
$response = $this->render($twigFolder->twigExists('@AviaturTwig/'.$agencyFolder.'/Helicopter/Default/availability.html.twig'), [
'ajaxUrl' => $requestUrl,
'AvailabilityArray' => $AvailabilityArray,
'cityOriginName' => $cityOriginName,
'cityDestinationName' => $cityDestinationName,
'helicopters' => $helicopters,
'inlineEngine' => true,
'safeUrl' => $safeUrl,
'cookieLastSearch' => $cookieLastSearch,
'urlDescription' => $urlDescription,
'availabilityFront' => false,
]);
}
$response->headers->setCookie(new Cookie('_availability_array[helicopter]', base64_encode(json_encode($AvailabilityArray)), (time() + 3600 * 24 * 7), '/'));
return $response;
} else {
//test: /vuelos/BAQ-BAQ/2014-12-18/BAQ-BAQ/2014-12-23/BAQ-BAQ/2015-01-07/1-0-0
foreach ($intersect as $helicopter => $destination) {
if (($helicopter + 1) < $helicopters) {
if (('BOG' != ${'origin'.($helicopter + 2)}) && (${'origin'.($helicopter + 2)} != ${'origin'.($helicopter + 1)})) {
${'destination'.($helicopter + 1)} = ${'origin'.($helicopter + 2)};
} elseif ('BOG' != $destination) {
if ($helicopter > 0) {
if ('BOG' != ${'destination'.$helicopter}) {
${'destination'.($helicopter + 1)} = 'BOG';
} else {
${'origin'.($helicopter + 1)} = 'BOG';
}
} else {
${'destination'.($helicopter + 1)} = 'BOG';
}
} else {
${'destination'.($helicopter + 1)} = 'CTG';
}
} else {
if ('BOG' != $destination) {
${'destination'.($helicopter + 1)} = 'BOG';
} else {
${'destination'.($helicopter + 1)} = 'CTG';
}
}
}
}
} else {
//test: /vuelos/BAQ-BOG/2014-12-18+2014-12-15/1-0-0
foreach ($dateError as $key => $date) {
if ($date < date('Y-m-d\TH:i:s', strtotime('today +12 hour'))) {
${'date'.$key} = date('Y-m-d', strtotime('+1 day'));
} elseif ($date > date('Y-m-d\TH:i:s', strtotime('+11 month'))) {
if (isset($AvailabilityArray['date'.($key - 1)])) {
${'date'.$key} = date('Y-m-d', strtotime($AvailabilityArray['date'.($key - 1)].'+1 week'));
if (${'date'.$key} > date('Y-m-d\TH:i:s', strtotime('+11 month'))) {
${'date'.$key} = date('Y-m-d', strtotime('-1 day +11 month'));
}
} else {
${'date'.$key} = date('Y-m-d', strtotime(${'date'.$key}.'-12 month'));
}
} else {
${'date'.$key} = date('Y-m-d', strtotime($AvailabilityArray['date'.($key - 1)].'+1 week'));
}
}
}
} else {
//test: /vuelos/BAQ-BAQ/2014-12-18/5-3-2
if ($adults > 9) {
$adults = 9;
$children = 0;
$infants = 0;
} elseif ($adults + $children > 9) {
$children = 9 - $adults;
$infants = 0;
} elseif ($adults + $children + $infants > 9) {
$infants = 9 - $adults - $children;
} elseif ($infants > $adults) {
$infants = $adults;
}
}
if ('aviatur_helicopter_round' == $route) {
$origin2 = null;
$destination2 = null;
}
$url = $this->generateUrl(
$request->get('_route'),
[
'date1' => $date1,
'date2' => $date2,
'origin1' => $origin1,
'origin2' => $origin2,
'destination1' => $destination1,
'destination2' => $destination2,
'adults' => $adults,
'children' => $children,
'infants' => $infants,
]
);
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'));
} else {
$session->remove($session->get($transactionIdSessionName).'[helicopter][availability_file]');
$helicopterModel = new HelicopterModel();
if ($session->has('maxResults')) {
$maxResults = $session->get('maxResults');
$session->remove('maxResults');
} else {
$maxResults = $request->query->get('maxResults');
}
$xmlTemplate = $helicopterModel->getXmlAvailability();
$xmlRequest = $xmlTemplate[0];
for ($i = 1; $i <= $helicopters; ++$i) {
$xmlTempOriginDestination = str_replace(['{templateDate}', '{templateOrigin}', '{templateDestination}'], ['{date'.$i.'}', '{origin'.$i.'}', '{destination'.$i.'}'], $xmlTemplate[1]);
$xmlTempOriginDestination = str_replace(' CrossDateAllowedIndicator="true"', '', $xmlTempOriginDestination);
if (false !== strpos(${'date'.$i}, 'T')) {
${'date'.$i} = date('Y-m-d\TH:i:s', strtotime(substr(${'date'.$i}, 0, 10).sprintf('+%d hours', substr(${'date'.$i}, -2))));
} else {
${'date'.$i} = date('Y-m-d\TH:i:s', strtotime(substr(${'date'.$i}, 0, 10)));
}
$xmlRequest .= $xmlTempOriginDestination;
}
$xmlRequest .= $xmlTemplate[2];
$domain = str_replace('www.', '', $request->getHost());
$productType = $em->getRepository(\Aviatur\MpaBundle\Entity\ProductType::class)->findByCode('HELICOPTER');
$providers = [];
if ($session->has('helicopterAdapterId')) {
$providers = explode(';', $session->get('helicopterAdapterId'));
$configsHelicopterAgency = $em->getRepository(\Aviatur\MpaBundle\Entity\Provider::class)->findByProvideridentifier($providers);
foreach ($configsHelicopterAgency as $configHelicopterAgency) {
$provider = $configHelicopterAgency->getProvideridentifier();
if (!in_array($provider, $providers)) {
$providers[] = $provider;
}
}
} else {
$configsHelicopterAgency = $em->getRepository(\Aviatur\HelicopterBundle\Entity\ConfigHelicopterAgency::class)->findProviderForHelicopters($productType, $domain);
foreach ($configsHelicopterAgency as $configHelicopterAgency) {
$provider = $configHelicopterAgency->getProvider()->getProvideridentifier();
if (!in_array($provider, $providers)) {
$providers[] = $provider;
}
}
}
$providerIds = implode(';', $providers);
$xmlRequest .= $xmlTemplate['class'];
$date1 = strtotime($date1) < strtotime('now') ? date('Y-m-d\Th:i:s') : $date1;
$date2 = strtotime($date2) < strtotime('now') ? date('Y-m-d\Th:i:s') : $date2;
$variable = [
'ProviderId' => $providerIds,
'date1' => $date1,
'date2' => $date2,
'origin1' => $origin1,
'origin2' => $origin2,
'destination1' => $destination1,
'destination2' => $destination2,
'adults' => $adults,
'children' => $children,
'infants' => 0,
'cabin' => 'Economy',
'MaxResponses' => $maxResults,
];
$variable['ProviderId'] = $providerIds;
$variable['externalId'] = $agency->getExternalid();
$variable['officeId'] = $agency->getOfficeid();
if ($session->has('officeId')) {
$variable['externalId'] = $session->get('externalId');
$variable['officeId'] = $session->get('officeId');
}
$xmlRequest .= $xmlTemplate[3];
// AVAILABILITY XML
$makeLogin = true;
if ($session->has($transactionIdSessionName.'Multi')) {
$transactionDatetime = $session->get($transactionIdSessionName.'MultiTime');
if ((strtotime(date('Y-m-d H:i:s')) - strtotime($transactionDatetime)) < 60) {
$transactionId = $session->get($transactionIdSessionName.'Multi');
$session->set($transactionIdSessionName, $transactionId);
$variable['transaction'] = $transactionId;
$makeLogin = false;
} else {
$session->remove($transactionIdSessionName.'Multi');
}
}
if ($makeLogin) {
$transactionIdResponse = $aviaturWebService->loginService('SERVICIO_MPT', 'dummy|http://www.aviatur.com.co/dummy/', []);
if ('error' == $transactionIdResponse || is_array($transactionIdResponse)) {
$aviaturErrorHandler->errorRedirect('', 'Error MPA', 'No se creó Login!');
return new Response('Estamos experimentando dificultades técnicas en este momento.');
}
$transactionId = (string) $transactionIdResponse;
$variable['transaction'] = $transactionId;
$session->set($transactionIdSessionName, $transactionId);
}
$xmlResponse = $this->combinationGeneration($xmlRequest, $variable, $route);
if (isset($xmlResponse['error'])) {
$transactionId = (string) $aviaturWebService->loginService('SERVICIO_MPT', 'dummy|http://www.aviatur.com.co/dummy/', []);
if ('error' == $transactionId) {
$aviaturErrorHandler->errorRedirect('', 'Error MPA', 'No se creó Login!');
return new Response('Estamos experimentando dificultades técnicas en este momento.');
}
$variable['transaction'] = $transactionId;
$session->set($transactionIdSessionName, $transactionId);
$xmlResponse = $this->combinationGeneration($xmlRequest, $variable, $route);
if (isset($xmlResponse['error'])) {
if (false === strpos($xmlResponse['error'], '66002')) {
$aviaturErrorHandler->errorRedirect($requestUrl, 'Error Disponibilidad Helicopteros', $xmlResponse['error']);
}
return new Response($xmlResponse['error']);
}
}
if (!is_object($xmlResponse)) {
return new Response('Ocurrió un error inesperado en tu consulta, inténtalo nuevamente.');
}
$xmlResponse->Message->OTA_AirLowFareSearchRS['TransactionID'] = $transactionId;
$fileName = $aviaturLogSave->logSave($xmlResponse->asXML(), 'HelicopterAvailResponse', 'RS');
$session->set($transactionId.'[helicopter][availability_file]', $fileName);
return $this->generateAjaxResponse($xmlResponse);
}
}
public function getAvailabilityResultsAction(SessionInterface $session, ParameterBagInterface $parameterBag)
{
$transactionIdSessionName = $parameterBag->get('transaction_id_session_name');
if ($session->has($transactionIdSessionName)) {
$transactionId = $session->get($transactionIdSessionName);
if (true === $session->has($transactionId.'[helicopter][availability_file]')) {
$availFile = $session->get($transactionId.'[helicopter][availability_file]');
$response = \simplexml_load_file($availFile);
return $this->generateAjaxResponse($response);
} else {
if ($session->has($transactionId.'[availability_results_retry]')) {
$retry = $session->get($transactionId.'[availability_results_retry]');
if ($retry < 8) {
$session->set($transactionId.'[availability_results_retry]', $retry + 1);
return new Response('retry');
} else {
return new Response('error');
}
} else {
$session->set($transactionId.'[availability_results_retry]', 1);
return new Response('retry');
}
}
} else {
return new Response('error');
}
}
private function generateAjaxResponse(TwigFolder $twigFolder, GenerateFlightResumeEmail $generateFlightResumeEmail, $response)
{
$attributes = [
'Version' => $response->Message->OTA_AirLowFareSearchRS['Version'],
'SequenceNmbr' => $response->Message->OTA_AirLowFareSearchRS['SequenceNmbr'],
'CorrelationID' => $response->Message->OTA_AirLowFareSearchRS['CorrelationID'],
'TransactionID' => $response->Message->OTA_AirLowFareSearchRS['TransactionID'],
];
$transactionId = $response->Message->OTA_AirLowFareSearchRS['TransactionID'];
$response->Message->OTA_AirLowFareSearchRS['TransactionID'] = $transactionId;
$pricedItineraries = $response->Message->OTA_AirLowFareSearchRS->PricedItineraries;
$bestPrices = [];
foreach ($pricedItineraries->PricedItinerary as $pricedItinerary) {
$correlationID = str_replace('CorrelationID=', '', current(explode(';', (string) $pricedItinerary->Notes)));
$pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->Secure['Check'] = crypt($correlationID.'/'.$transactionId, 'OneFlewOvertheCuckoosNest');
$providerIdArray = explode('ProviderId=', (string) $pricedItinerary->Notes);
$providerIdArray = explode(';', $providerIdArray[1]);
$providerSegment = $providerIdArray[0];
foreach ($pricedItinerary->AirItinerary->OriginDestinationOptions->OriginDestinationOption as $originDestinationOption) {
$arrivalEscala = null;
$totalDuration = 0;
foreach ($originDestinationOption->FlightSegment as $flightSegment) {
$airlineCode = (string) $flightSegment->OperatingAirline['Code'];
if (!array_key_exists($airlineCode, $bestPrices)) {
$airlineName = (string) $flightSegment->OperatingAirline['CompanyShortName'];
$helicopterPrice = (string) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'];
$helicopterCurrency = (string) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['CurrencyCode'];
$bestPrices[$airlineCode] = [
'helicopterPrice' => $helicopterPrice,
'helicopterCurrency' => $helicopterCurrency,
'airlineName' => $airlineName, ];
}
$comments = (array) $flightSegment->Comment;
if (9 != $providerSegment) {
if (null != $arrivalEscala) {
$totalDuration += (int) abs(strtotime($flightSegment['DepartureDateTime']) - strtotime($arrivalEscala)) / 60;
}
$totalDuration += (int) substr($comments[12], strpos($comments[12], ':') + 2, 100);
$arrivalEscala = $flightSegment['ArrivalDateTime'];
} else {
$totalDuration = (string) $generateFlightResumeEmail->convertToHoursMins(substr($comments[12], strpos($comments[12], ':') + 2, 100));
}
}
if (is_int($totalDuration)) {
$totalDuration = (string) $generateFlightResumeEmail->convertToHoursMins($totalDuration);
}
$originDestinationOption['totalDuration'] = $totalDuration;
}
}
$helicopters = $pricedItineraries->PricedItinerary;
$agencyFolder = $twigFolder->twigFlux();
return $this->render($twigFolder->twigExists('@AviaturTwig/'.$agencyFolder.'/Helicopter/Default/availability_ajaxResults.html.twig'), [
'attributes' => $attributes,
'bestPrices' => $bestPrices,
'helicopters' => $helicopters, ]);
}
private function multiRequest(Request $request, AviaturLogSave $aviaturLogSave, SessionInterface $session, array $requests, $method = null, $transactionId = null)
{
$domain = $request->getHost();
$parametersJson = $session->get($domain.'[parameters]', '');
$parameters = json_decode($parametersJson);
$url = $parameters->aviatur_service_web_url_mpa;
$handles = [];
$timeout = 100;
$defaultOptions = [
CURLOPT_USERAGENT => 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)',
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYHOST => false,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_MAXREDIRS => 10,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CONNECTTIMEOUT => $timeout,
CURLOPT_POST => true,
];
// add curl options to each handle
foreach ($requests as $k => $request) {
$headers = [
'POST /AmadeusLATAM.Aviatur.Services/services/mpaservice.asmx HTTP/1.1',
'Content-Type: text/xml; charset=utf-8',
'Content-Length: '.strlen($request),
'SOAPAction: "http://tempuri.org/Execute"',
];
$options = $defaultOptions;
$options += [
CURLOPT_HTTPHEADER => $headers,
CURLOPT_POSTFIELDS => $request,
];
$ch[$k] = curl_init();
$opt = curl_setopt_array($ch[$k], $options);
$handles[$k] = $ch[$k];
$aviaturLogSave->logSave($request, $method, 'RQ', $transactionId);
}
$mh = curl_multi_init();
// add handles
foreach ($handles as $k => $handle) {
$err = curl_multi_add_handle($mh, $handle);
}
$running_handles = null;
do {
curl_multi_exec($mh, $running_handles);
curl_multi_select($mh);
} while ($running_handles > 0);
$response = [];
foreach ($requests as $k => $request) {
$response[$k]['error'] = curl_error($handles[$k]);
if (!empty($response[$k]['error'])) {
$response[$k]['data'] = '';
$aviaturLogSave->logSave($response[$k]['error'], $method, 'RS', $transactionId);
} else {
$response[$k]['data'] = curl_multi_getcontent($handles[$k]); // get results
$aviaturLogSave->logSave($response[$k]['data'], $method, 'RS', $transactionId);
}
// close current handler
curl_multi_remove_handle($mh, $handles[$k]);
}
curl_multi_close($mh);
return $response;
}
private function combinationGeneration(ManagerRegistry $registry, AviaturWebService $aviaturWebService, $xmlRequest, $variable, $route)
{
$em = $registry->getManager();
$providers = explode(';', $variable['ProviderId']);
$providerObjects = $em->getRepository(\Aviatur\MpaBundle\Entity\Provider::class)->findByProvideridentifier($providers);
$hasCombination = true;
foreach ($providerObjects as $providerObject) {
$configHelicopterAgency = $em->getRepository(\Aviatur\HelicopterBundle\Entity\ConfigHelicopterAgency::class)->findOneByProvider($providerObject);
if (0 == $configHelicopterAgency->getHascombination()) {
$hasCombination = false;
}
}
$variable['correlationId'] = '';
$xmlResponse = $aviaturWebService->callWebServiceAmadeus('SERVICIO_MPT', 'AirLowFareSearch', 'dummy|http://www.aviatur.com.co/dummy/', $xmlRequest, $variable, false);
return $xmlResponse;
}
private function orderCombinationResponse($xmlResponseSegment1)
{
$key = 0;
$options = [];
foreach ($xmlResponseSegment1->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary as $pricedItinerary) {
$options[$key]['amount'] = (float) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'];
$options[$key]['xml'] = $pricedItinerary->asXml();
++$key;
}
usort($options, fn($a, $b) => $a['amount'] - $b['amount']);
$responseXml = explode('<PricedItinerary>', str_replace('</PricedItinerary>', '<PricedItinerary>', $xmlResponseSegment1->asXml()));
$orderedResponse = $responseXml[0];
$key = 0;
foreach ($options as $option) {
if ($key < 10) {
$orderedResponse .= $option['xml'];
++$key;
}
}
$orderedResponse .= $responseXml[sizeof($responseXml) - 1];
return \simplexml_load_string($orderedResponse);
}
private function specialDiscount(Request $request, SessionInterface $session, $xmlResponse, $specialDiscountHelicopter, $isNational, $specialDiscountWithIva)
{
$parameters = json_decode($session->get($request->getHost().'[parameters]'));
if (null != $specialDiscountHelicopter) {
if ((1 == $specialDiscountHelicopter[0]->getHelicoptertype()) || ((null == $specialDiscountHelicopter[0]->getHelicoptertype())) && ($isNational)) {
$specialDiscountAirline = $specialDiscountHelicopter[0]->getAirline()->getIata();
$specialDiscountMaxStops = $specialDiscountHelicopter[0]->getMaxstops();
foreach ($xmlResponse->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary as $pricedItinerary) {
if (isset($pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->EquivFare['Amount']) && ($pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->EquivFare['Amount'] != $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->BaseFare['Amount'])) {
if (((string) $pricedItinerary->TicketingInfo->TicketingVendor['Code'] == $specialDiscountAirline) && (sizeof($pricedItinerary->AirItinerary->OriginDestinationOptions->OriginDestinationOption->FlightSegment) <= $specialDiscountMaxStops)) {
$passangerCount = 0;
foreach ($pricedItinerary->AirItineraryPricingInfo->PTC_FareBreakdowns->PTC_FareBreakdown as $passangers) {
if ('0' != (string) $passangers->PassengerFare->BaseFare['Amount']) {
$passangerCount += (string) $passangers->PassengerTypeQuantity['Quantity'];
}
}
$fuelFee = (int) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->EquivFare['Amount'];
$totalBaseFare = 0;
$totalTaxes = 0;
$totalTotalFare = 0;
foreach ($pricedItinerary->AirItineraryPricingInfo->PTC_FareBreakdowns->PTC_FareBreakdown as $fareBreakDown) {
$baseFare = (int) $fareBreakDown->PassengerFare->BaseFare['Amount'];
$taxes = (int) $fareBreakDown->PassengerFare->Taxes['Amount'];
$totalFare = (int) $fareBreakDown->PassengerFare->TotalFare['Amount'];
if (0 != $baseFare) {
$fuelFeePax = $fuelFee / $passangerCount;
$netFare = $baseFare - $fuelFeePax;
$extraFee = 100;
$ivaTaxBefore = $netFare * $parameters->aviatur_payment_iva;
if (1 == $specialDiscountHelicopter[0]->getDiscounttype()) {
$netFare = $netFare * (1 - ($specialDiscountHelicopter[0]->getDiscountamount() / 100)) + $extraFee;
$baseFare = $netFare + $fuelFeePax;
} else {
$baseFare = $baseFare - ($specialDiscountHelicopter[0]->getDiscountamount() / $passangerCount);
}
if ($specialDiscountWithIva) {
$taxes = ceil(($taxes - ($ivaTaxBefore - ($netFare * $parameters->aviatur_payment_iva))) / 10) * 10;
}
$baseFare = ceil($baseFare / 100) * 100;
$totalFare = $baseFare + $taxes;
$fareBreakDown->PassengerFare->BaseFare['Amount'] = $baseFare;
$fareBreakDown->PassengerFare->Taxes['Amount'] = $taxes;
$fareBreakDown->PassengerFare->TotalFare['Amount'] = $totalFare;
$paxQuantity = (int) $fareBreakDown->PassengerTypeQuantity['Quantity'];
$totalBaseFare += ($baseFare * $paxQuantity);
$totalTaxes += ($taxes * $paxQuantity);
$totalTotalFare += ($totalFare * $paxQuantity);
}
}
$pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->BaseFare['Amount'] = $totalBaseFare;
$pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->BaseFare['SpecialDiscount'] = true;
$pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->Taxes['Amount'] = $totalTaxes;
$pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'] = $totalTotalFare;
}
}
}
}
}
return $xmlResponse;
}
public function availabilityDetailAction(Request $request, TwigFolder $twigFolder, SessionInterface $session, $transactionId = null, $quoteId = null, $refNbr = null, $rph = null)
{
if ($request->isXmlHttpRequest()) {
if (null != $transactionId) {
if (true === $session->has($transactionId.'[helicopter][availability_file]')) {
$availFile = $session->get($transactionId.'[helicopter][availability_file]');
$availObj = \simplexml_load_file($availFile);
foreach ($availObj->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary as $PricedItinary) {
if ($PricedItinary->AirItineraryPricingInfo['QuoteID'] == $quoteId) {
$providerIdArray = explode('ProviderId=', (string) $PricedItinary->Notes);
$providerIdArray = explode(';', $providerIdArray[1]);
$providerSegment = $providerIdArray[0];
foreach ($PricedItinary->AirItinerary->OriginDestinationOptions->OriginDestinationOption as $originDestination) {
if (($originDestination['RefNumber'] == $refNbr) && ($originDestination->FlightSegment['RPH'] == $rph)) {
$helicopters = [];
$arrivalEscala = null;
$totalDuration = 0;
foreach ($originDestination->FlightSegment as $flightSegment) {
if (null != $arrivalEscala) {
$totalDuration += (int) abs(strtotime($flightSegment['DepartureDateTime']) - strtotime($arrivalEscala)) / 60;
$flightSegment->EscalaLength = $this->get('generate_helicopter_resume_email')->convertToHoursMins(abs(strtotime($flightSegment['DepartureDateTime']) - strtotime($arrivalEscala)) / 60);
}
$comments = (array) $flightSegment->Comment;
$flightSegment->departureAirport = (string) substr($comments[0], strpos($comments[0], ':') + 2, 100);
$flightSegment->arrivalAirport = (string) substr($comments[6], strpos($comments[6], ':') + 2, 100);
if (9 != $providerSegment) {
$flightSegment->HelicopterLength = (string) $this->get('generate_helicopter_resume_email')->convertToHoursMins(substr($comments[12], strpos($comments[12], ':') + 2, 100));
$totalDuration += (int) substr($comments[12], strpos($comments[12], ':') + 2, 100);
} else {
$totalDuration = (string) $this->get('generate_helicopter_resume_email')->convertToHoursMins(substr($comments[12], strpos($comments[12], ':') + 2, 100));
$flightSegment->HelicopterLength = $this->get('generate_helicopter_resume_email')->convertToHoursMins(abs(strtotime($flightSegment['DepartureDateTime']) - strtotime($flightSegment['ArrivalDateTime'])) / 60);
}
$arrivalEscala = $flightSegment['ArrivalDateTime'];
$helicopters[] = $flightSegment;
}
if (is_int($totalDuration)) {
$totalDuration = (string) $this->get('generate_helicopter_resume_email')->convertToHoursMins($totalDuration);
}
$agencyFolder = $twigFolder->twigFlux();
return $this->render($twigFolder->twigExists('@AviaturTwig/'.$agencyFolder.'/Helicopter/Default/availability_ajaxHelicopterDetail.html.twig'), ['helicopters' => $helicopters, 'totalDuration' => $totalDuration]);
}
}
}
}
return $this->json(['error' => 'no info found']);
} else {
return $this->json(['error' => 'no session found']);
}
} else {
return $this->json(['error' => 'no autorized access']);
}
} else {
return $this->json(['error' => 'no autorized access']);
}
}
public function availabilitySeoAction(Request $request, RouterInterface $router, SessionInterface $session, ManagerRegistry $registry, $url)
{
$em = $registry->getManager();
$seoUrl = $em->getRepository(\Aviatur\GeneralBundle\Entity\SeoUrl::class)->findOneByUrl('helicopteros/'.$url);
if (null != $seoUrl) {
$maskedUrl = $seoUrl->getMaskedurl();
$session->set('maxResults', $request->query->get('maxResults'));
if (false !== strpos($maskedUrl, '?')) {
$parameters = explode('&', substr($maskedUrl, strpos($maskedUrl, '?') + 1));
foreach ($parameters as $parameter) {
$sessionInfo = explode('=', $parameter);
if (2 == sizeof($sessionInfo)) {
$session->set($sessionInfo[0], $sessionInfo[1]);
}
}
$maskedUrl = substr($maskedUrl, 0, strpos($maskedUrl, '?'));
}
if (null != $seoUrl) {
$route = $router->match($maskedUrl);
$route['_route_params'] = [];
foreach ($route as $param => $val) {
// set route params without defaults
if ('_' !== \substr($param, 0, 1)) {
$route['_route_params'][$param] = $val;
}
}
return $this->forward($route['_controller'], $route);
} else {
throw $this->createNotFoundException('La página que solicitaste no existe o se ha movido permanentemente');
}
} else {
throw $this->createNotFoundException('La página que solicitaste no existe o se ha movido permanentemente');
}
}
public function detailAction(Request $request, GenerateFlightResumeEmail $generateFlightResumeEmail, AviaturErrorHandler $aviaturErrorHandler, TwigFolder $twigFolder, AviaturXsltRender $renderXslt, RouterInterface $router, AviaturWebService $aviaturWebService, SessionInterface $session, ManagerRegistry $registry, ParameterBagInterface $parameterBag)
{
$transactionIdSessionName = $parameterBag->get('transaction_id_session_name');
$correlationIdSessionName = $parameterBag->get('correlation_id_session_name');
$response = [];
$origin = [];
$destination = [];
$passangerTypes = [];
$provider = null;
$fullRequest = $request;
$request = $fullRequest->request;
// Generate Helicopter Detail
$em = $registry->getManager();
$server = $fullRequest->server;
$agency = $em->getRepository(\Aviatur\AgencyBundle\Entity\Agency::class)->find($session->get('agencyId'));
$returnUrl = $twigFolder->pathWithLocale('aviatur_general_homepage');
if (true === $request->has('referer')) {
$returnUrl = $request->get('http_referer');
}
if (true === $request->has('helicopterTransactionID')) {
$transactionId = $request->get('helicopterTransactionID');
if (false !== strpos($transactionId, '||')) {
$explodedTransaction = explode('||', $transactionId);
$transactionId = $explodedTransaction[0];
$request->set('helicopterTransactionID', $transactionId);
$metaseachId = $explodedTransaction[1];
$session->set('generals[metasearch]', $metaseachId);
$metatransaction = $em->getRepository(\Aviatur\HelicopterBundle\Entity\Metatransaction::class)->findOneByTransactionId($transactionId);
$d1 = $metatransaction->getDatetime();
$d2 = new \DateTime(date('Y-m-d H:i:s', time() - (15 * 60)));
if (false == $metatransaction->getIsactive()) {
$response['error'] = 'Por favor selecciona nuevamente tu itinerario de viaje';
return $this->redirect($aviaturErrorHandler->errorRedirectNoEmail($returnUrl, '', $response['error']));
} elseif ($d1 < $d2) {
$response['error'] = 'Por favor selecciona nuevamente tu itinerario de viaje';
return $this->redirect($aviaturErrorHandler->errorRedirectNoEmail($returnUrl, 'Tu consulta fue realizada hace más de 15 minutos', $response['error']));
} else {
$metatransaction->setIsactive(false);
$em->persist($metatransaction);
$em->flush();
}
}
} elseif ((true === $session->has('redirectedRetry')) && (true === $session->get('redirectedRetry'))) {
$session->set('redirectedRetry', false);
$transactionId = $session->get($transactionIdSessionName);
} else {
$response['error'] = 'No se encontró información de la transacción';
return $this->redirect($aviaturErrorHandler->errorRedirect($returnUrl, '', $response['error']));
}
$destinationsArray = null;
if ((true === $session->has($transactionId.'[helicopter][retry]')) || (true === $session->has($transactionId.'[helicopter][retry0]')) || (true === $session->has($transactionId.'[helicopter][retry1]'))) {
$response = \simplexml_load_string($session->get($transactionId.'[helicopter][detail]'));
$providerId = '';
foreach ($response->ProviderResults->ProviderResult as $providerIds) {
$providerId = (string) $providerIds['Provider'];
}
$provider = $em->getRepository(\Aviatur\MpaBundle\Entity\Provider::class)->findOneByProvideridentifier($providerId);
if ($session->get($transactionId.'[helicopter][prepayment0]')) {
$allDetails = \simplexml_load_string($session->get($transactionId.'[helicopter][prepayment0]'));
} else {
$allDetails = \simplexml_load_string($session->get($transactionId.'[helicopter][prepayment]'));
}
foreach ($allDetails->Message->OTA_AirBookRS->AirReservation->TravelerInfo->AirTraveler as $traveler) {
$travelers[] = [
'DocType' => $traveler->Document['DocType'],
'DocId' => $traveler->Document['DocID'],
'Nationality' => $traveler->Document['DocHolderNationality'],
'PassportExp' => $traveler->Document['ExpireDate'],
'GivenName' => $traveler->PersonName->GivenName,
'Surname' => $traveler->PersonName->Surname,
'typeCode' => $traveler['PassengerTypeCode'],
'BirthDate' => $traveler['BirthDate'],
'Gender' => $traveler['Gender'],
'Address' => $traveler->Address->AddressLine.'-'.$traveler->Address->CityName.'-'.$traveler->Address->CountryName,
'Email' => $traveler->Email,
'Telephone' => $traveler->Telephone['PhoneNumber'],
];
}
$postData = json_decode($session->get($transactionId.'[helicopter][detail_data_helicopter]'));
$passangerInfo = $postData->PI;
$billingData = $postData->BD;
$contactData = $postData->CD;
$baggageData = $postData->BI ?? null;
$twig_readonly = true;
$shortStopOver = false;
} else {
$RPHArray = $request->get('RPH');
$security = $request->get('helicopterSessionID');
$correlationID = $request->get('helicopterCorrelationID');
$session->set($transactionId.'[helicopter]['.$correlationIdSessionName.']', $correlationID);
$tempPF = explode('*', $request->get('helicopterPricedID'));
$pricedID = $tempPF[0];
$feeId = '';
if ($security == crypt($correlationID.'/'.$transactionId, 'OneFlewOvertheCuckoosNest')) {
$providersId = explode('|', $request->get('helicopterProviderID'));
if (true === $session->has($transactionId.'[helicopter][detail]')) {
$reloaded = 1;
if (sizeof($providersId) > 1) {
$providers = [];
$providerIdentifiers = [];
foreach ($providersId as $providerId) {
$providers[] = $em->getRepository(\Aviatur\MpaBundle\Entity\Provider::class)->findOneByProvideridentifier($providerId);
$providerIdentifiers[] = $providers[array_key_last($providers)]->getProvideridentifier();
}
} else {
$provider = $em->getRepository(\Aviatur\MpaBundle\Entity\Provider::class)->findOneByProvideridentifier($session->get($transactionId.'[helicopter][provider]'));
}
$response = \simplexml_load_string($session->get($transactionId.'[helicopter][detail]'));
} else {
$reloaded = 0;
if (sizeof($providersId) > 1) {
$providers = [];
$providerIdentifiers = [];
foreach ($providersId as $providerId) {
$providers[] = $em->getRepository(\Aviatur\MpaBundle\Entity\Provider::class)->findOneByProvideridentifier($providerId);
$providerIdentifiers[] = $providers[array_key_last($providers)]->getProvideridentifier();
}
$session->set($transactionId.'[helicopter][provider]', json_encode($providerIdentifiers));
$pricedIDs = explode('|', $pricedID);
$correlationIDs = explode('||', $correlationID);
foreach ($providerIdentifiers as $key => $providerIdentifier) {
$variable = [
'ProviderId' => $providerIdentifier,
'correlationID' => $correlationIDs[$key],
'pricedID' => $pricedIDs[$key],
'RPH' => $RPHArray[$key],
'timeStamp' => date('c'),
];
$helicopterModel = new HelicopterModel();
$xmlRequest = $helicopterModel->getXmlDetail();
$tempResponse = $aviaturWebService->callWebServiceAmadeus('SERVICIO_MPT', 'AirDetail', 'dummy|http://www.aviatur.com.co/dummy/', $xmlRequest, $variable, false, $transactionId);
if (!isset($tempResponse['error']) && ('error' != $tempResponse)) {
$responses[] = $tempResponse;
} else {
$response['error'] = 'Error en la respuesta de nuestro proveedor de servicios, inténtalo nuevamente';
return $this->redirect($aviaturErrorHandler->errorRedirect($returnUrl, '', $response['error']));
}
}
$baseFareCombination = 0;
$equivFareCombination = 0;
$taxesCombination = 0;
$totalFareCombination = 0;
$notesInfoCombination = '';
$ptcFareBreakdownCombination = $responses[0]->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItineraryPricingInfo->PTC_FareBreakdowns;
$ticketingVendorCombination = '';
foreach ($responses as $key => $response) {
$pricedItinerary = $response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary;
$xmlOrigin = (string) $pricedItinerary->AirItinerary->OriginDestinationOptions->OriginDestinationOption->FlightSegment->DepartureAirport['LocationCode'];
$xmlDestination = (string) $pricedItinerary->AirItinerary->OriginDestinationOptions->OriginDestinationOption->FlightSegment->ArrivalAirport['LocationCode'];
$xmlDate = (string) $pricedItinerary->AirItinerary->OriginDestinationOptions->OriginDestinationOption->FlightSegment['DepartureDateTime'];
$cities = $em->getRepository(\Aviatur\GeneralBundle\Entity\City::class)->findByIatacode([$xmlOrigin, $xmlDestination]);
if ((2 == sizeof($cities)) && (1 == sizeof($pricedItinerary->AirItinerary->OriginDestinationOptions->OriginDestinationOption))) {
$isNational = true;
$specialDiscountWithIva = false;
$noIvaCities = ['PVA', 'ADZ'];
foreach ($cities as $city) {
if ('CO' != $city->getCountry()->getIatacode()) {
$isNational = false;
}
if ((($city->getIatacode() == $xmlOrigin)) && (!in_array($xmlOrigin, $noIvaCities)) && (!in_array($xmlDestination, $noIvaCities))) {
$specialDiscountWithIva = true;
}
}
$originCity = $em->getRepository(\Aviatur\GeneralBundle\Entity\City::class)->findByIatacode([$xmlOrigin]);
$originCountry = $originCity[0]->getCountry()->getIatacode();
$specialDiscountHelicopter = $em->getRepository(\Aviatur\HelicopterBundle\Entity\SpecialDiscount::class)->findWithCities($xmlOrigin, $xmlDestination, $xmlDate, $agency);
if (null != $specialDiscountHelicopter) {
if (((1 == $specialDiscountHelicopter[0]->getHelicoptertype()) && ('CO' == $originCountry)) || ((null == $specialDiscountHelicopter[0]->getHelicoptertype())) && ($isNational)) {
$response = $this->specialDiscount($response, $specialDiscountHelicopter, $isNational, $specialDiscountWithIva);
}
}
}
$session->set($transactionId.'[helicopter][detail'.$key.']', $response->asXML());
$providerIdArray = explode('ProviderId=', (string) $pricedItinerary->Notes);
$providerIdArray = explode(';', $providerIdArray[1]);
$providerSegment = $providerIdArray[0];
foreach ($pricedItinerary->AirItinerary->OriginDestinationOptions->OriginDestinationOption as $originDestination) {
$arrivalEscala = null;
$totalDuration = 0;
foreach ($originDestination->FlightSegment as $flightSegment) {
$comments = (array) $flightSegment->Comment;
if (null != $arrivalEscala) {
$totalDuration += (int) abs(strtotime($flightSegment['DepartureDateTime']) - strtotime($arrivalEscala)) / 60;
}
if (9 != $providerSegment) {
$totalDuration += (int) substr($comments[12], strpos($comments[12], ':') + 2, 100);
} else {
$totalDuration = (string) $this->get('generate_helicopter_resume_email')->convertToHoursMins(substr($comments[14], strpos($comments[14], ':') + 2, 100));
}
$arrivalEscala = $flightSegment['ArrivalDateTime'];
}
if (is_int($totalDuration)) {
$totalDuration = (string) $this->get('generate_helicopter_resume_email')->convertToHoursMins($totalDuration);
}
$originDestination['totalDuration'] = $totalDuration;
}
${'originDestinationSegment'.($key + 1)} = str_replace(['<OriginDestinationOptions>', '</OriginDestinationOptions>', 'RefNumber="0"'], ['', '', 'RefNumber="'.$key.'"'], $pricedItinerary->AirItinerary->OriginDestinationOptions->asXml());
$baseFareCombination += (int) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->BaseFare['Amount'];
$equivFareCombination += (int) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->EquivFare['Amount'];
$taxesCombination += (int) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->Taxes['Amount'];
$totalFareCombination += (int) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'];
$notesInfoCombination .= (string) $pricedItinerary->Notes;
if ($key > 0) {
$i = 0;
foreach ($pricedItinerary->AirItineraryPricingInfo->PTC_FareBreakdowns->PTC_FareBreakdown as $fareBreakDown) {
$ptcFareBreakdownCombination->PTC_FareBreakdown[$i]->PassengerFare->BaseFare['Amount'] += (int) $fareBreakDown->PassengerFare->BaseFare['Amount'];
$ptcFareBreakdownCombination->PTC_FareBreakdown[$i]->PassengerFare->EquivFare['Amount'] += (int) $fareBreakDown->PassengerFare->EquivFare['Amount'];
$ptcFareBreakdownCombination->PTC_FareBreakdown[$i]->PassengerFare->Taxes['Amount'] += (int) $fareBreakDown->PassengerFare->Taxes['Amount'];
$ptcFareBreakdownCombination->PTC_FareBreakdown[$i]->PassengerFare->TotalFare['Amount'] += (int) $fareBreakDown->PassengerFare->TotalFare['Amount'];
++$i;
}
}
$ticketingVendorCombination .= $pricedItinerary->TicketingInfo->TicketingVendor->asXml();
}
$xmlCombinationTemplate = $helicopterModel->getXmlCombinations();
$searches = [
'{OriginDestinationOptionSegment1}',
'{OriginDestinationOptionSegment2}',
'{QuoteID}',
'{BaseFare}',
'{EquivFare}',
'{Taxes}',
'{TotalFare}',
'{PTC_FareBreakdowns}',
'{Notes}',
'{TicketingVendor}',
];
$replaces = [
$originDestinationSegment1,
$originDestinationSegment2,
'',
$baseFareCombination,
$equivFareCombination,
$taxesCombination,
$totalFareCombination,
$ptcFareBreakdownCombination->asXml(),
$notesInfoCombination,
$ticketingVendorCombination,
];
$xmlCombination = str_replace($searches, $replaces, $xmlCombinationTemplate);
unset($response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary);
$response = \simplexml_load_string(str_replace('<PricedItineraries>', '<PricedItineraries>'.$xmlCombination, $response->asXml()));
} else {
$provider = $em->getRepository(\Aviatur\MpaBundle\Entity\Provider::class)->findOneByProvideridentifier($request->get('helicopterProviderID'));
$session->set($transactionId.'[helicopter][provider]', $provider->getProvideridentifier());
ksort($RPHArray);
$RPH = implode(' ', $RPHArray);
$variable = [
'ProviderId' => $provider->getProvideridentifier(),
'correlationID' => $correlationID,
'pricedID' => $pricedID,
'RPH' => $RPH,
'timeStamp' => date('c'),
];
$helicopterModel = new HelicopterModel();
$xmlRequest = $helicopterModel->getXmlDetail();
$response = $aviaturWebService->callWebServiceAmadeus('SERVICIO_MPT', 'AirDetail', 'dummy|http://www.aviatur.com.co/dummy/', $xmlRequest, $variable, false, $transactionId);
if (isset($response['error']) || ('error' == $response)) {
$referer = $router->match(parse_url($server->get('HTTP_REFERER'), PHP_URL_PATH));
if (isset($referer['_controller']) && (false !== strpos($referer['_controller'], 'availabilityAction'))) {
$response['error'] ??= 'Error en la respuesta de nuestro proveedor de servicios, inténtalo nuevamente';
return $this->redirect($aviaturErrorHandler->errorRedirect($server->get('HTTP_REFERER'), '', $response['error']));
} else {
$response['error'] ??= 'Error en la respuesta de nuestro proveedor de servicios, inténtalo nuevamente';
return $this->redirect($aviaturErrorHandler->errorRedirect($returnUrl, '', $response['error']));
}
}
$pricedItinerary = $response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary;
$xmlOrigin = (string) $pricedItinerary->AirItinerary->OriginDestinationOptions->OriginDestinationOption->FlightSegment->DepartureAirport['LocationCode'];
$xmlDestination = (string) $pricedItinerary->AirItinerary->OriginDestinationOptions->OriginDestinationOption->FlightSegment->ArrivalAirport['LocationCode'];
$xmlDate = (string) $pricedItinerary->AirItinerary->OriginDestinationOptions->OriginDestinationOption->FlightSegment['DepartureDateTime'];
$cities = $em->getRepository(\Aviatur\GeneralBundle\Entity\City::class)->findByIatacode([$xmlOrigin, $xmlDestination]);
if ((2 == sizeof($cities)) && (1 == sizeof($pricedItinerary->AirItinerary->OriginDestinationOptions->OriginDestinationOption))) {
$isNational = true;
$specialDiscountWithIva = false;
$noIvaCities = ['PVA', 'ADZ'];
foreach ($cities as $city) {
if ('CO' != $city->getCountry()->getIatacode()) {
$isNational = false;
}
if ((($city->getIatacode() == $xmlOrigin)) && (!in_array($xmlOrigin, $noIvaCities)) && (!in_array($xmlDestination, $noIvaCities))) {
$specialDiscountWithIva = true;
}
}
$originCity = $em->getRepository(\Aviatur\GeneralBundle\Entity\City::class)->findByIatacode([$xmlOrigin]);
$originCountry = $originCity[0]->getCountry()->getIatacode();
$specialDiscountHelicopter = $em->getRepository(\Aviatur\HelicopterBundle\Entity\SpecialDiscount::class)->findWithCities($xmlOrigin, $xmlDestination, $xmlDate, $agency);
if (null != $specialDiscountHelicopter) {
if (((1 == $specialDiscountHelicopter[0]->getHelicoptertype()) && ('CO' == $originCountry)) || ((null == $specialDiscountHelicopter[0]->getHelicoptertype())) && ($isNational)) {
$response = $this->specialDiscount($response, $specialDiscountHelicopter, $isNational, $specialDiscountWithIva);
}
}
}
}
}
if (isset($response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItineraryPricingInfo->ItinTotalFare->BaseFare['Amount'])) {
if ($reloaded) {
$userHelicopters = 0;
$destinationsArray = [];
$shortStopOver = false;
foreach ($response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItinerary->OriginDestinationOptions->OriginDestinationOption as $originDestination) {
foreach ($originDestination->FlightSegment as $flightSegment) {
$origin[] = (string) $flightSegment->DepartureAirport['LocationCode'];
$destination[] = (string) $flightSegment->ArrivalAirport['LocationCode'];
$destinationsArray[$userHelicopters]['DateTime'] = substr((string) $flightSegment['DepartureDateTime'], 0, 10);
if (((int) $flightSegment['WaitingTime'] < 120) && ((int) $flightSegment['WaitingTime'] > 0)) {
$shortStopOver = true;
}
}
$firstHelicopter = $originDestination->FlightSegment[0];
$lastHelicopter = $originDestination->FlightSegment[sizeof($originDestination->FlightSegment) - 1];
$destinationsArray[$userHelicopters]['OriginCityCode'] = (string) $originDestination['OriginCityCode'];
$destinationsArray[$userHelicopters]['DestinationCityCode'] = (string) $originDestination['DestinationCityCode'];
$destinationsArray[$userHelicopters]['OriginCityName'] = (string) $originDestination['OriginCityName'];
$destinationsArray[$userHelicopters]['DestinationCityName'] = (string) $originDestination['DestinationCityName'];
++$userHelicopters;
}
} else {
$baseAmount = (string) $response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItineraryPricingInfo->ItinTotalFare->BaseFare['Amount'];
$helicopters = 0;
$userHelicopters = 0;
$description = 'Helicopteros - '.(string) $response->ProviderResults->ProviderResult['Provider'].' - ';
$destinationsArray = [];
$shortStopOver = false;
$providerIdArray = explode('ProviderId=', (string) $response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->Notes);
$providerIdArray = explode(';', $providerIdArray[1]);
$providerSegment = $providerIdArray[0];
foreach ($response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItinerary->OriginDestinationOptions->OriginDestinationOption as $originDestination) {
if (!isset($originDestination['totalDuration'])) {
$arrivalEscala = null;
$totalDuration = 0;
foreach ($originDestination->FlightSegment as $flightSegment) {
$comments = (array) $flightSegment->Comment;
if (null != $arrivalEscala) {
$totalDuration += (int) abs(strtotime($flightSegment['DepartureDateTime']) - strtotime($arrivalEscala)) / 60;
}
if (9 != $providerSegment) {
$totalDuration += (int) substr($comments[12], strpos($comments[12], ':') + 2, 100);
} else {
$totalDuration = (string) $generateFlightResumeEmail->convertToHoursMins(substr($comments[14], strpos($comments[14], ':') + 2, 100));
}
$arrivalEscala = $flightSegment['ArrivalDateTime'];
}
if (is_int($totalDuration)) {
$totalDuration = (string) $generateFlightResumeEmail->convertToHoursMins($totalDuration);
}
$originDestination['totalDuration'] = $totalDuration;
}
$flightSegmentNumber = 0;
$combinationDescription = '';
$origin[] = (string) $originDestination->FlightSegment[0]->DepartureAirport['LocationCode'];
$destination[] = (string) $originDestination->FlightSegment[sizeof($originDestination->FlightSegment) - 1]->ArrivalAirport['LocationCode'];
foreach ($originDestination->FlightSegment as $flightSegment) {
$description .= substr((string) $flightSegment['DepartureDateTime'], 0, 10).'('.(string) $flightSegment->DepartureAirport['LocationCode'].' a '.(string) $flightSegment->ArrivalAirport['LocationCode'].') ';
$combinationDescription .= substr((string) $flightSegment['DepartureDateTime'], 0, 10).'('.(string) $flightSegment->DepartureAirport['LocationCode'].' a '.(string) $flightSegment->ArrivalAirport['LocationCode'].') ';
$comments = (array) $flightSegment->Comment;
if (9 != $providerSegment) {
$flightSegment->HelicopterLength = (string) $generateFlightResumeEmail->convertToHoursMins(substr($comments[12], strpos($comments[12], ':') + 2, 100));
} else {
$flightSegment->HelicopterLength = $generateFlightResumeEmail->convertToHoursMins(abs(strtotime($flightSegment['DepartureDateTime']) - strtotime($flightSegment['ArrivalDateTime'])) / 60);
}
$flightSegment->Comment[14] = (string) $flightSegment->HelicopterLength;
if ($flightSegmentNumber > 0) {
$previousFlightSegment = $originDestination->FlightSegment[$flightSegmentNumber - 1];
$flightSegment['WaitingTime'] = abs(strtotime($flightSegment['DepartureDateTime']) - strtotime($previousFlightSegment['ArrivalDateTime'])) / 60;
if ((int) $flightSegment['WaitingTime'] < 120) {
$flightSegment['ShortStopOver'] = true;
$shortStopOver = true;
} else {
$flightSegment['ShortStopOver'] = false;
}
} else {
$flightSegment['WaitingTime'] = 0;
$flightSegment['ShortStopOver'] = false;
}
++$helicopters;
++$flightSegmentNumber;
$destinationsArray[$userHelicopters]['DateTime'] = substr((string) $flightSegment['DepartureDateTime'], 0, 10);
}
if (isset($responses)) {
$combinationResponse = \simplexml_load_string($session->get($transactionId.'[helicopter][detail'.$userHelicopters.']'));
$combinationResponse->Message->OTA_AirLowFareSearchRS['Description'] = 'Helicopteros - '.(string) $combinationResponse->ProviderResults->ProviderResult['Provider'].' - '.$combinationDescription;
$session->set($transactionId.'[helicopter][detail'.$userHelicopters.']', $combinationResponse->asXML());
}
$firstHelicopter = $originDestination->FlightSegment[0];
$lastHelicopter = $originDestination->FlightSegment[sizeof($originDestination->FlightSegment) - 1];
$originDestination['OriginCityCode'] = $firstHelicopter->DepartureAirport['LocationCode'];
$originDestination['DestinationCityCode'] = $lastHelicopter->ArrivalAirport['LocationCode'];
$originDestination['OriginCityName'] = $firstHelicopter->DepartureAirport['CodeContext'];
$originDestination['DestinationCityName'] = $lastHelicopter->ArrivalAirport['CodeContext'];
$destinationsArray[$userHelicopters]['OriginCityCode'] = (string) $originDestination['OriginCityCode'];
$destinationsArray[$userHelicopters]['DestinationCityCode'] = (string) $originDestination['DestinationCityCode'];
$destinationsArray[$userHelicopters]['OriginCityName'] = (string) $originDestination['OriginCityName'];
$destinationsArray[$userHelicopters]['DestinationCityName'] = (string) $originDestination['DestinationCityName'];
++$userHelicopters;
}
$response->Message->OTA_AirLowFareSearchRS['Description'] = $description;
$conditionIsInternational = '';
$repositorySearchCities = $em->getRepository(\Aviatur\SearchBundle\Entity\SearchCities::class);
$repositorySearchAirports = $em->getRepository(\Aviatur\SearchBundle\Entity\SearchAirports::class);
$querySeachCities = $repositorySearchCities->createQueryBuilder('p')
->where('p.countrycode != :countrycode')
->setParameter('countrycode', 'CO');
$querySeachAirports = $repositorySearchAirports->createQueryBuilder('p')
->where('p.countrycode != :countrycode')
->setParameter('countrycode', 'CO');
$querySeachCitiesNNS = $repositorySearchCities->createQueryBuilder('p')
->where('p.countrycode = :countrycode')
->setParameter('countrycode', 'CO');
$querySeachAirportsNNS = $repositorySearchAirports->createQueryBuilder('p')
->where('p.countrycode = :countrycode')
->setParameter('countrycode', 'CO');
for ($i = 0; $i < $userHelicopters; ++$i) {
$conditionIsInternational .= ' p.iata = :origin'.$i.' or p.iata = :destination'.$i.' or';
}
$conditionIsInternational = \rtrim($conditionIsInternational, 'or');
$querySeachCities->andWhere($conditionIsInternational);
$querySeachAirports->andWhere($conditionIsInternational);
$querySeachCitiesNNS->andWhere($conditionIsInternational);
$querySeachAirportsNNS->andWhere($conditionIsInternational);
for ($i = 0; $i < $userHelicopters; ++$i) {
$querySeachCities->setParameter('origin'.$i, $origin[$i])
->setParameter('destination'.$i, $destination[$i]);
$querySeachAirports->setParameter('origin'.$i, $origin[$i])
->setParameter('destination'.$i, $destination[$i]);
$querySeachCitiesNNS->setParameter('origin'.$i, $origin[$i])
->setParameter('destination'.$i, $destination[$i]);
$querySeachAirportsNNS->setParameter('origin'.$i, $origin[$i])
->setParameter('destination'.$i, $destination[$i]);
}
$internationalCity = $querySeachCities->getQuery()->getResult();
$internationalAirport = $querySeachAirports->getQuery()->getResult();
$CityNNS = $querySeachCitiesNNS->getQuery()->getResult();
$AirportNNS = $querySeachAirportsNNS->getQuery()->getResult();
$isINNS = 0;
if (sizeof($internationalCity) or sizeof($internationalAirport)) {
++$isINNS;
}
if (!sizeof($CityNNS) and !sizeof($AirportNNS)) {
++$isINNS;
}
$session->set($transactionId.'[isINNS]', $isINNS);
if ('' == $feeId) {
$administrativeCost = 0;
$passangerCount = 0;
foreach ($response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItineraryPricingInfo->PTC_FareBreakdowns->PTC_FareBreakdown as $passangers) {
if ('0' != (string) $passangers->PassengerFare->BaseFare['Amount']) {
$passangerCount += (string) $passangers->PassengerTypeQuantity['Quantity'];
}
}
}
if ($request->has('optionals')) {
$optionals = $request->get('optionals');
$i = 0;
foreach ($optionals as $optional) {
$optionalInfo = explode('-', $optional);
$response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'] += $optionalInfo[0];
$response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->Optionals[$i]['Amount'] = $optionalInfo[0];
$response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->Optionals[$i]['Name'] = $optionalInfo[1];
++$i;
}
}
$passangerTypes[1]['ADT'] = 0;
$passangerTypes[1]['CHD'] = 0;
$passangerTypes[1]['INF'] = 0;
foreach ($response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItineraryPricingInfo->PTC_FareBreakdowns->PTC_FareBreakdown as $passangers) {
$passangerTypes[1][(string) $passangers->PassengerTypeQuantity['Code']] += (string) $passangers->PassengerTypeQuantity['Quantity'];
$passangers->PassengerFare->AdminCost['Amount'] = 0;
if ('0' != (string) $passangers->PassengerFare->BaseFare['Amount']) {
$passangers->PassengerFare->AdminCost['Amount'] = $administrativeCost;
}
if ($request->has('optionals')) {
$optionals = $request->get('optionals');
$i = 0;
foreach ($optionals as $optional) {
$optionalInfo = explode('-', $optional);
$passangers->PassengerFare->TPA_Extensions->Optionals[$i]['Amount'] = 0;
$passangers->PassengerFare->TPA_Extensions->Optionals[$i]['Name'] = $optionalInfo[1];
if ('0' != (string) $passangers->PassengerFare->BaseFare['Amount']) {
$passangers->PassengerFare->TPA_Extensions->Optionals[$i]['Amount'] = $optionalInfo[0] / $passangerCount;
}
++$i;
}
}
}
$response->Message->OTA_AirLowFareSearchRS->PricedItineraries->
PricedItinerary->AirItinerary->
OriginDestinationOptions['AdtQuantity'] = $passangerTypes[1]['ADT'];
$response->Message->OTA_AirLowFareSearchRS->PricedItineraries->
PricedItinerary->AirItinerary->
OriginDestinationOptions['ChdQuantity'] = $passangerTypes[1]['CHD'];
$response->Message->OTA_AirLowFareSearchRS->PricedItineraries->
PricedItinerary->AirItinerary->
OriginDestinationOptions['InfQuantity'] = $passangerTypes[1]['INF'];
$administrativeCost = $administrativeCost * $passangerCount;
$response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->AdministrativeCost['Amount'] = $administrativeCost;
$response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'] += $administrativeCost;
$response->Message->OTA_AirLowFareSearchRS['TransactionID'] = base64_encode($transactionId);
$operatingAirlineCode = $response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->TicketingInfo->TicketingVendor['Code'];
$response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->TicketingInfo->TicketingVendor['Description'] = $operatingAirlineCode;
$session->set($transactionId.'[helicopter][detail]', $response->asXML());
if (true === $request->has('referer')) {
if (true === $request->has('http_referer')) {
$session->set($transactionId.'[availability_url]', $request->get('http_referer'));
} else {
$session->set($transactionId.'[availability_url]', $this->generateUrl('homepage', [], true));
}
$session->set($transactionId.'[referer]', $request->get('referer'));
} else {
$session->set($transactionId.'[availability_url]', $server->get('HTTP_REFERER'));
}
$request->get('helicopterSessionID');
}
$twig_readonly = false;
} else {
$referer = $router->match(parse_url($server->get('HTTP_REFERER'), PHP_URL_PATH));
if (false !== strpos($referer['_controller'], 'availabilityAction')) {
$response['error'] ??= 'Error en la respuesta de nuestro proveedor de servicios, inténtalo nuevamente';
return $this->redirect($aviaturErrorHandler->errorRedirect($returnUrl, '', $response['error']));
} else {
$response['error'] ??= 'Error en la respuesta de nuestro proveedor de servicios, inténtalo nuevamente';
return $this->redirect($aviaturErrorHandler->errorRedirect($returnUrl, '', $response['error']));
}
}
} else {
$response['error'] = 'La información ha sido alterada';
return $this->redirect($aviaturErrorHandler->errorRedirect($returnUrl, '', $response['error']));
}
}
$passangerCount = 0;
$passangerTypes[1]['ADT'] = 0;
$passangerTypes[1]['CHD'] = 0;
$passangerTypes[1]['INF'] = 0;
foreach ($response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItineraryPricingInfo->PTC_FareBreakdowns->PTC_FareBreakdown as $passangers) {
$passangerTypes[1][(string) $passangers->PassengerTypeQuantity['Code']] += (string) $passangers->PassengerTypeQuantity['Quantity'];
if ('0' != (string) $passangers->PassengerFare->BaseFare['Amount']) {
$passangerCount += (string) $passangers->PassengerTypeQuantity['Quantity'];
}
}
$plantilla = $renderXslt->render($response->Message->OTA_AirLowFareSearchRS->asXML(), 'Helicopter', 'Detail');
$documentType = $em->getRepository(\Aviatur\CustomerBundle\Entity\DocumentType::class)->findAll();
$genderType = $em->getRepository(\Aviatur\CustomerBundle\Entity\Gender::class)->findAll();
$repositoryDocumentType = $em->getRepository(\Aviatur\CustomerBundle\Entity\DocumentType::class);
$queryDocumentType = $repositoryDocumentType
->createQueryBuilder('p')
->where('p.paymentcode != :paymentcode')
->setParameter('paymentcode', '')
->getQuery();
$documentPaymentType = $queryDocumentType->getResult();
$resumeInfo = [
'passanger_count' => $passangerCount,
'passanger_type_fares' => $response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItineraryPricingInfo->PTC_FareBreakdowns,
'admin_amount' => (int) $response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->AdministrativeCost['Amount'],
'base_amount' => (int) $response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItineraryPricingInfo->ItinTotalFare->BaseFare['Amount'],
'fares_amount' => (int) $response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItineraryPricingInfo->ItinTotalFare->Taxes['Amount'],
'total_amount' => (int) $response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'],
'currency_code' => (string) $response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['CurrencyCode'],
];
if (isset($response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->Optionals)) {
$optionals = $response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TPA_Extensions->Optionals;
$i = 0;
$tempOptionals = [];
foreach ($optionals as $optional) {
$tempOptionals[$i]['Amount'] = (string) $optional['Amount'];
$tempOptionals[$i]['Name'] = (string) $optional['Name'];
++$i;
}
$resumeInfo['optionals'] = $tempOptionals;
}
$paymentMethodAgency = $em->getRepository(\Aviatur\GeneralBundle\Entity\PaymentMethodAgency::class)->findBy(['agency' => $agency, 'isactive' => 1]);
$paymentOptions = [];
foreach ($paymentMethodAgency as $payMethod) {
$paymentCode = $payMethod->getPaymentMethod()->getCode();
if (!in_array($paymentCode, $paymentOptions)) {
$paymentOptions[] = $paymentCode;
}
}
$banks = [];
if (in_array('pse', $paymentOptions)) {
$banks = $em->getRepository(\Aviatur\PaymentBundle\Entity\PseBank::class)->findAll();
}
$cybersource = [];
if (in_array('cybersource', $paymentOptions)) {
$cybersource['merchant_id'] = $paymentMethodAgency[array_search('cybersource', $paymentOptions)]->getSitecode();
$cybersource['org_id'] = $paymentMethodAgency[array_search('cybersource', $paymentOptions)]->getTrankey();
}
foreach ($paymentOptions as $key => $paymentOption) {
if ('cybersource' == $paymentOption) {
unset($paymentOptions[$key]); // strip from other renderizable payment methods
}
}
$conditions = $em->getRepository(\Aviatur\GeneralBundle\Entity\HistoricalInfo::class)->findMessageByAgencyOrNull($agency, 'reservation_conditions');
if (isset($providers)) {
foreach ($providers as $provider) {
$payment_type_form_name = $provider->getPaymentType()->getTwig();
}
} else {
$payment_type_form_name = $provider->getPaymentType()->getTwig();
}
$notes = ucfirst(mb_strtolower(htmlentities((string) $response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->Notes)));
$responseHelicopterDetail = [
'twig_readonly' => $twig_readonly,
'plantilla' => $plantilla,
'services' => $passangerTypes,
'payment_doc_type' => $documentPaymentType,
'payment_type_form_name' => $payment_type_form_name,
'doc_type' => $documentType,
'gender' => $genderType,
'additional' => base64_encode($transactionId.'/'.$session->get($transactionId.'[helicopter]['.$correlationIdSessionName.']').'/'.$session->get($transactionId.'[isINNS]')),
'referer' => $session->get($transactionId.'[availability_url]'),
'resume_info' => $resumeInfo,
'destination_array' => $destinationsArray,
'cards' => $em->getRepository(\Aviatur\GeneralBundle\Entity\Card::class)->findAll(),
'paymentOptions' => $paymentOptions,
'banks' => $banks,
'cybersource' => $cybersource,
'conditions' => $conditions,
'airlineCondition' => $notes,
'travelers' => $travelers ?? null,
'passengers' => $passangerInfo ?? null,
'billingData' => $billingData ?? null,
'contactData' => $contactData ?? null,
'baggageData' => $baggageData ?? null,
'internationalHelicopter' => $session->get($transactionId.'[isINNS]'),
'shortStopOver' => $shortStopOver,
];
$route = $router->match(str_replace($fullRequest->getSchemeAndHttpHost(), '', $fullRequest->getUri()));
$isMulti = false !== strpos($route['_route'], 'multi') ? true : false;
if ($isMulti) {
return $this->json($responseHelicopterDetail);
}
if (('error' == $responseHelicopterDetail) || (isset($responseHelicopterDetail['error']))) {
$message = $responseHelicopterDetail['error'] ?? 'Ha ocurrido un error inesperado';
$returnUrl = $twigFolder->pathWithLocale('aviatur_general_homepage');
if (true === $request->has('referer') && true === $request->has('http_referer')) {
$returnUrl = $request->get('http_referer');
}
if (isset($responseHelicopterDetail['no_message']) && (true == $responseHelicopterDetail['no_message'])) {
return $this->redirect($aviaturErrorHandler->errorRedirectNoEmail($returnUrl, '', $message));
} else {
return $this->redirect($aviaturErrorHandler->errorRedirect($returnUrl, '', $message));
}
} else {
// NNS0 eg. Bogota->Medellin, NNS1 eg. Bogota->Miami, NNS2 eg. Miami->New York
$agencyFolder = $twigFolder->twigFlux();
$view = $twigFolder->twigExists('@AviaturTwig/'.$agencyFolder.'/Helicopter/Default/detail.html.twig');
$response = $this->render($view, $responseHelicopterDetail);
if ($session->has('generals[metasearch]')) {
$response->headers->setCookie(new Cookie('_referer[helicopter]', base64_encode($session->get('generals[metasearch]')), (time() + 3600 * 24 * 3), '/'));
}
if ($fullRequest->cookies->has('_referer')) {
$cookie = $fullRequest->cookies->get('_referer');
$session->set('generals[metasearch]', base64_decode($cookie['helicopter']));
}
return $response;
}
}
public function detailInvalidAction(Request $request, AviaturErrorHandler $aviaturErrorHandler, TwigFolder $twigFolder, RouterInterface $router, SessionInterface $session, ParameterBagInterface $parameterBag)
{
$transactionIdSessionName = $parameterBag->get('transaction_id_session_name');
$server = $request->server;
if (true === $session->has($transactionIdSessionName)) {
$transactionId = $session->get($transactionIdSessionName);
$referer = $router->match(parse_url($server->get('HTTP_REFERER'), PHP_URL_PATH));
if (true === $session->has($transactionId.'[availability_url]')) {
return $this->redirect($aviaturErrorHandler->errorRedirect($session->get($transactionId.'[availability_url]'), 'Página no accesible', 'No puedes acceder al detalle sin disponibilidad'));
} elseif (false !== strpos($referer['_controller'], 'availabilityAction')) {
return $this->redirect($aviaturErrorHandler->errorRedirect($server->get('HTTP_REFERER'), '', 'Error en la respuesta de nuestro proveedor de servicios, inténtalo nuevamente'));
} else {
return $this->redirect($aviaturErrorHandler->errorRedirect($twigFolder->pathWithLocale('aviatur_general_homepage'), 'Página no accesible', 'No puedes acceder al detalle sin disponibilidad'));
}
} else {
return $this->redirect($aviaturErrorHandler->errorRedirect($twigFolder->pathWithLocale('aviatur_general_homepage'), 'Página no accesible', 'No puedes acceder al detalle sin disponibilidad'));
}
}
public function detailUpdateSessionAction(Request $request, AviaturWebService $aviaturWebService, SessionInterface $session, ParameterBagInterface $parameterBag)
{
$correlationIdSessionName = $parameterBag->get('correlation_id_session_name');
if ($request->isXmlHttpRequest()) {
$invalidHour = 1000;
$currentTime = (int) date('Gis');
if ($currentTime > $invalidHour) {
$request = $request->request;
$selectionData = $request->get('SD');
$transactionId = base64_decode($selectionData['selection']);
$correlationIds = explode('||', $session->get($transactionId.'[helicopter]['.$correlationIdSessionName.']'));
$combination = false;
if (sizeof($correlationIds) > 1) {
$combination = true;
}
$key = 0;
foreach ($correlationIds as $correlationId) {
if ($combination) {
$providers = json_decode($session->get($transactionId.'[helicopter][provider]'));
$provider = $providers[$key];
} else {
$provider = $session->get($transactionId.'[helicopter][provider]');
}
$variable = [
'correlationId' => $correlationId,
'ProviderId' => $provider,
];
$helicopterModel = new HelicopterModel();
$xmlRequest = $helicopterModel->getXmlExecute();
$response = $aviaturWebService->callWebServiceAmadeus('SERVICIO_MPT', 'AirCommandExecute', 'dummy|http://www.aviatur.com.co/dummy/', $xmlRequest, $variable, false);
++$key;
}
return $this->json($response);
} else {
return $this->json(['error' => 'day_change']);
}
} else {
return $this->json(['error' => 'Acceso no autorizado']);
}
}
}