<?php
namespace Aviatur\GeneralBundle\Services;
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
use Aviatur\GeneralBundle\Entity\ProviderResponse;
use Aviatur\GeneralBundle\Services\Exception\WebServiceException;
use Doctrine\Bundle\DoctrineBundle\Registry;
use Firebase\JWT\JWT;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
/**
* Description of AviaturWebService.
*
* @author andres.ramirez
*/
class AviaturWebService
{
private $url;
private $urlMpa;
private $serviceNameMpa;
private $invoker;
private $requestId;
private $requestType;
private $projectDir;
private $loginKey;
private \Symfony\Component\HttpFoundation\Session\SessionInterface $session;
private \Symfony\Component\HttpFoundation\RequestStack $requestStack;
private \Doctrine\Bundle\DoctrineBundle\Registry $doctrine;
private \Aviatur\GeneralBundle\Services\AviaturLogSave $aviaturLogSave;
private \Aviatur\GeneralBundle\Services\ExceptionLog $aviaturRegisterException;
private $transactionIdSessionName;
/**
* Establece la url del bus.
*
* @param type $url
*/
public function setUrl($url)
{
$this->url = $url;
}
/**
* Establece la url del mpa.
*
* @param type $urlMpa
*/
public function setUrlMpa($urlMpa)
{
$this->urlMpa = $urlMpa;
}
/**
* Establece el tipo de consulta si es MPA o BUS.
*
* @param type $requestType
*/
public function setRequestType($requestType)
{
$this->requestType = $requestType;
}
/**
* Obtener el valor del requestType para consltar en clases que van a extender
*
* @return mixed
*/
public function getRequestType()
{
return $this->requestType;
}
/**
* @param $projectDir
* @param $invoker
* @param SessionInterface $session
* @param RequestStack $requestStack
* @param Registry $doctrine
* @param AviaturLogSave $aviaturLogSave
* @param ExceptionLog $aviaturRegisterException
* @param $transactionIdSessionName
*/
public function __construct(RequestStack $requestStack, SessionInterface $session, Registry $doctrine, AviaturLogSave $aviaturLogSave, ExceptionLog $aviaturRegisterException, $projectDir, $invoker, $transactionIdSessionName)
{
$this->projectDir = $projectDir;
$this->session = $session;
$this->requestStack = $requestStack;
$this->doctrine = $doctrine;
$this->aviaturLogSave = $aviaturLogSave;
$this->aviaturRegisterException = $aviaturRegisterException;
$this->transactionIdSessionName = $transactionIdSessionName;
$request = $this->requestStack->getCurrentRequest();
if (null !== $request) {
$domain = $request->getHost();
$parametersJson = $this->session->get($domain . '[parameters]', '');
$parameters = json_decode($parametersJson);
if (!empty($parameters)) {
$this->url = $parameters->aviatur_service_web_url;
$this->urlMpa = $parameters->aviatur_service_web_url_mpa;
$this->urlLoginMpb = $parameters->aviatur_service_web_url_login_mpb;
$this->urlAirMpb = $parameters->aviatur_service_web_url_air_mpb;
$this->urlHotelMpb = $parameters->aviatur_service_web_url_hotel_mpb;
$this->urlCarMpb = $parameters->aviatur_service_web_url_car_mpb;
$this->urlTicketMpb = $parameters->aviatur_service_web_url_ticket_mpb;
$this->urlCruiseMpb = $parameters->aviatur_service_web_url_cruise_mpb;
$this->urlEmission = $parameters->aviatur_service_web_url_emission;
$this->invoker = $invoker;
$this->requestId = $parameters->aviatur_service_web_request_id;
$this->requestType = $parameters->aviatur_service_web_request_type;
$this->serviceNameMpa = $parameters->aviatur_service_web_mpa_method;
$this->urlPackageMpt = $parameters->aviatur_service_web_mpb_mpt;
$this->urlInsuranceMpb = $parameters->aviatur_service_web_url_insurance_mpb;
$this->urlBusMpb = $parameters->aviatur_service_web_url_bus_mpb;
$this->urlTrainMpb = $parameters->aviatur_service_web_url_train_mpb;
$this->urlExperience = $parameters->aviatur_service_web_mpb_experience;
}
}
$this->loginKey = base64_decode('Tj6qJt6p2QYECN4Z+4iqQMbLFuz8u5ff');
}
/**
* @param string $xml
*
* @return string
*
* @throws FatalErrorException
*/
public function callWebService($service, $provider, $xmlRequest)
{
$xmlResponseObject = $this->callServiceBus($this->projectDir, $service, $provider, $xmlRequest);
return $xmlResponseObject;
}
/**
* Realiza la consulta en los servicios de amadeus usando un entrypoint diferente dependiendo de la configuracion.
*
* @param string $service
* @param string $provider
* @param string $xmlRequest
*
* @return \simplexml_object
*/
public function callWebServiceAmadeus($service, $method, $provider, $xmlRequest, array $variable, $login = false, $transactionId = null, $isTicket = true)
{
$xmlResponseObject = null;
$availableAirMethods = ['AirOverride', 'AirLowFareSearch', 'AirDetail', 'AirAvail', 'AirCommandExecute', 'AirAddDataPassenger', 'AirBook', 'AirCancel'];
$availableCarMethods = ['VehOverride', 'VehAvailRate', 'VehDetail', 'VehRes'];
$availableHotelMethods = ['HotelAvail', 'HotelRoomList', 'HotelDetail', 'HotelRes'];
$availableTicketMethods = ['SvcDetail'];
$availablePackageMethods = ['PkgAvail', 'PkgDetail', 'PkgFares', 'PkgOptions', 'PkgPromo'];
$availableCruiseMethods = ['CruiseAvail', 'CruiseDetail', 'CruiseCabin', 'CruiseReserve'];
$availableInsuranceMethods = ['InsuranceQuote', 'InsuranceBook'];
$availableBusMethods = ['BusAvail', 'BusDetail', 'BusBook'];
$availableTrainMethods = ['TrainAvail', 'TrainDetail', 'TrainBook'];
$availableExperienceMethods = ['SvcAvail', 'SvcDetail', 'SvcAvailComb', 'SvcFares', 'SvcAvailPOS', 'SvcAvailPROMO', 'SvcQuotas'];
if (!in_array($method, $availableExperienceMethods) && !in_array($method, $availableAirMethods) && !in_array($method, $availableCarMethods) && !in_array($method, $availableHotelMethods) && !in_array($method, $availableTicketMethods) && !in_array($method, $availablePackageMethods) && !in_array($method, $availableCruiseMethods) && !in_array($method, $availableInsuranceMethods) && !in_array($method, $availableBusMethods) && !in_array($method, $availableTrainMethods) && ('MPB' == $this->requestType)) {
$this->requestType = 'MPA';
}
if (null == $transactionId) {
if ($login || !$this->session->has($this->transactionIdSessionName)) {
$transactionId = $this->loginService($service, $provider, $variable['ProviderId']);
if (isset($transactionId['error'])) {
return $transactionId;
} else {
$this->session->set($this->transactionIdSessionName, (string) $transactionId);
}
} else {
$transactionId = $this->session->get($this->transactionIdSessionName);
}
// $transactionId2 = $this->getTransactionId($service, $method, $variable); // de prueba para reempazar codigo anterior
}
$infoToken = JWT::decode(explode('.', JWT::encode('', $this->loginKey))[0] . '.' . $transactionId, $this->loginKey, ['HS256']);
$timeValidation = explode('_', $infoToken->e);
/*if($this->session->has($transactionId.'external')) {
if (strtotime(date("Y-m-d H:i:s")."- 5 hour") - (int) $this->session->get('timeValidationAPI') >= 900) {
return array('error' => 'La sesión ha expirado por favor vuelve a realizar tu consulta. (66002 ) ');
}
}else{*/
if ((int) $timeValidation[0] <= ((int) time() - 900)) {
return ['error' => 'La sesión ha expirado por favor vuelve a realizar tu consulta. (66002 ) '];
}
//}
switch ($this->requestType) {
case 'BUS':
$xmlRequest = $this->getXmlBusHeader($xmlRequest, $method, $transactionId, $variable);
$xmlResponseObject = $this->callServiceBusUser($service, $provider, $xmlRequest, $transactionId);
break;
case 'MPA':
$xmlRequest = $this->getXmlMpxHeader($xmlRequest, $method, $transactionId, $variable);
$xmlResponseObject = $this->callServiceMpa($this->projectDir, $method, $xmlRequest, $transactionId);
break;
case 'MPB':
$xmlRequest = $this->getXmlMpxHeader($xmlRequest, $method, $transactionId, $variable);
if (in_array($method, $availableAirMethods)) {
$xmlResponseObject = $this->callServiceMpb($method, $xmlRequest, $this->urlAirMpb, $transactionId);
} elseif (in_array($method, $availableCarMethods)) {
$xmlResponseObject = $this->callServiceMpb($method, $xmlRequest, $this->urlCarMpb, $transactionId);
} elseif (in_array($method, $availableHotelMethods)) {
//$this->urlHotelMpb = "http://mpb06.grupoaviatur.com/Aviatur.MPBQA.Adapter/HotelService.ashx";
$xmlResponseObject = $this->callServiceMpb($method, $xmlRequest, $this->urlHotelMpb, $transactionId);
} elseif (in_array($method, $availableTicketMethods) && $isTicket) {
$xmlResponseObject = $this->callServiceMpb($method, $xmlRequest, $this->urlTicketMpb, $transactionId);
} elseif (in_array($method, $availablePackageMethods)) {
$xmlResponseObject = $this->callServiceMpb($method, $xmlRequest, $this->urlPackageMpt, $transactionId);
} elseif (in_array($method, $availableCruiseMethods)) {
$xmlResponseObject = $this->callServiceMpb($method, $xmlRequest, $this->urlCruiseMpb, $transactionId);
} elseif (in_array($method, $availableInsuranceMethods)) {
$xmlResponseObject = $this->callServiceMpb($method, $xmlRequest, $this->urlInsuranceMpb, $transactionId);
} elseif (in_array($method, $availableBusMethods)) {
$xmlResponseObject = $this->callServiceMpb($method, $xmlRequest, $this->urlBusMpb, $transactionId);
} elseif (in_array($method, $availableTrainMethods)) {
$xmlResponseObject = $this->callServiceMpb($method, $xmlRequest, $this->urlTrainMpb, $transactionId);
} elseif (in_array($method, $availableExperienceMethods)) {
$xmlResponseObject = $this->callServiceMpb($method, $xmlRequest, $this->urlExperience, $transactionId);
} else {
$xmlResponseObject = $this->callServiceMpa($this->projectDir, $method, $xmlRequest, $transactionId);
}
break;
}
return $xmlResponseObject;
}
/**
* Realiza la consulta en en servicio para mirar si el usuario existe en la base de Aviatur.
*
* @param string $service
* @param string $provider
* @param string $xmlRequest
*
* @return \simplexml_object
*/
public function busWebServiceAmadeus($service, $provider, $xmlRequest)
{
$xmlResponseObject = $this->callServiceBusUser($service, $provider, $xmlRequest);
return $xmlResponseObject;
}
/**
* Consulta el bus enviando los xml mediante curl.
*
* @param $projectDir
* @param string $service
* @param string $provider
* @param xml $xmlRequest
*
* @return \simplexml_object
*
* @throws WebServiceException
*/
private function callServiceBus($projectDir, $service, $provider, $xmlRequest)
{
$xmlResponseObject = null;
try {
if (null != $service) {
$path = $projectDir . '/app/xmlService/aviaturRequest.xml';
//Valores a remplazar
$arrayIndex = [
'{xmlBody}',
'{service}',
'{invoker}',
'{provider}',
'{requestId}',
];
//Nuevos valores
$arrayValues = [
$xmlRequest,
$service,
$this->invoker,
$provider,
$this->requestId,
];
//obtengo el xml base
$xmlBase = simplexml_load_file((string) $path)->asXML();
$xmlBase = str_replace($arrayIndex, $arrayValues, $xmlBase);
$xmlBase = str_replace('<?xml version="1.0"?>', '', $xmlBase);
$xmlBase = trim($xmlBase);
} else {
$xmlBase = $xmlRequest;
$service = 'DIRECT';
}
$client = new \SoapClient(null, [
'location' => $this->url,
'uri' => $this->url,
'trace' => 1,
]);
$this->aviaturLogSave->logSave($xmlBase, $service, 'RQ');
$response = $client->__doRequest($xmlBase, $this->url, $this->serviceNameMpa, 1);
$this->aviaturLogSave->logSave($response, $service, 'RS');
$response = str_replace('<?xml version="1.0"?>', '', $response);
$xmlResponseObject = \simplexml_load_string($response, \SimpleXMLElement::class, 0, 'NS1', true);
if (isset($xmlResponseObject->Body->mbus->response->fault)) {
$this->aviaturRegisterException->log(
$xmlBase,
$response
);
return ['error' => 'Error en la respuesta del servicio: ' . (string) $xmlResponseObject->Body->mbus->response->fault->faultDescription];
}
if (false === strpos($response, '<body>')) {
$this->aviaturRegisterException->log(
$xmlBase,
$response
);
return ['error' => 'Respuesta vacia del servicio'];
}
//Si no existe error Extraigo el body de la respuesta
$firstPartBody = explode('<body>', $response);
$secondPartBody = explode('</body>', $firstPartBody[1]);
$xmlResponseObject = str_replace('mpa:', '', utf8_encode($secondPartBody[0]));
$xmlResponseObject = \simplexml_load_string($xmlResponseObject, \SimpleXMLElement::class, LIBXML_NOCDATA);
} catch (\SoapFault $e) {
$this->aviaturRegisterException->log(
'SoapFault Exception',
json_encode($e)
);
throw new WebServiceException('No se pudo realizar la consulta en el servidor. ' . $this->url, '', 100);
}
return $xmlResponseObject;
}
/**
* @param type $service
* @param type $provider
* @param type $xmlRequest
* @param type $transactionId
*
* @return type
*
* @throws WebServiceException
*/
private function callServiceBusUser($service, $provider, $xmlRequest, $transactionId = null)
{
$error = null;
$xmlResponseObject = null;
try {
if (null != $service) {
$path = $this->projectDir . '/app/xmlService/aviaturRequest.xml';
//Valores a remplazar
$arrayIndex = [
'{xmlBody}',
'{service}',
'{invoker}',
'{provider}',
'{requestId}',
];
//Nuevos valores
$arrayValues = [
$xmlRequest,
$service,
$this->invoker,
$provider,
$this->requestId,
];
//obtengo el xml base
$xmlBase = simplexml_load_file($path)->asXML();
$xmlBase = str_replace($arrayIndex, $arrayValues, $xmlBase);
$xmlBase = str_replace('<?xml version="1.0"?>', '', $xmlBase);
$xmlBase = trim($xmlBase);
} else {
$xmlBase = $xmlRequest;
$service = 'DIRECT';
}
$client = new \SoapClient(null, [
'location' => $this->url,
'uri' => $this->url,
'trace' => 1,
]);
$this->aviaturLogSave->logSave($xmlBase, $service, 'RQ', $transactionId);
$response = $client->__doRequest($xmlBase, $this->url, $this->serviceNameMpa, 1);
$this->aviaturLogSave->logSave($response, $service, 'RS', $transactionId);
$response = str_replace(['<?xml version="1.0"?>', '&', '&'], ['', 'y', 'y'], $response);
libxml_use_internal_errors(true);
$xmlResponseObject = \simplexml_load_string($response, \SimpleXMLElement::class, 0, 'NS1', true);
if (false === $xmlResponseObject) {
foreach (libxml_get_errors() as $error) {
echo "\t", $error->message;
}
return ['error' => 'Error en la respuesta del servicio: ' . (string) $error->message . '\n Response: ' . $response];
}
if (isset($xmlResponseObject->Body->mbus->response->fault)) {
$this->aviaturRegisterException->log(
$xmlBase,
$response
);
return ['error' => 'Error en la respuesta del servicio: ' . (string) $xmlResponseObject->Body->mbus->response->fault->faultDescription];
}
if (false === strrpos($response, '<body>')) {
$this->aviaturRegisterException->log(
$xmlBase,
$response
);
return ['error' => 'Respuesta vacia del servicio'];
}
//Si no existe error Extraigo el body de la respuesta
$firstPartBody = explode('<body>', $response);
$secondPartBody = explode('</body>', $firstPartBody[1]);
$xmlResponseObject = str_replace('mpa:', '', utf8_encode($secondPartBody[0]));
if ('DIRECT' == $service) {
$xmlResponseObject = '<ROW>' . $xmlResponseObject . '</ROW>';
}
$xmlResponseObject = \simplexml_load_string(utf8_decode(htmlspecialchars_decode($xmlResponseObject)));
$validResponse = false;
if (isset($xmlResponseObject->ProviderResults)) {
foreach ($xmlResponseObject->ProviderResults->ProviderResult as $providerResult) {
if (isset($providerResult['Code']) && ('0' == $providerResult['Code'])) {
$validResponse = true;
} else {
$message = (string) $xmlResponseObject->ProviderResults->ProviderResult[0]['Message'];
}
}
} else {
$validResponse = true;
}
if (!$validResponse) {
$this->aviaturRegisterException->log(
$xmlBase,
$response
);
return ['error' => $message];
}
} catch (\SoapFault $e) {
$this->aviaturRegisterException->log(
$xmlRequest,
json_encode($e)
);
return ['error' => 'No se pudo realizar la consulta en el servidor.'];
}
if (isset($xmlResponseObject->error)) {
unset($xmlResponseObject->error);
}
return $xmlResponseObject;
}
/**
* Realiza la consulta directamente en el servicio del mpa.
*
* @param string $xmlRequest
*
* @return \simplexml_object
*
* @throws WebServiceException
*/
private function callServiceMpa($projectDir, $method, $xmlRequest, $transactionId = null)
{
$xmlResponseObject = null;
try {
$client = new \SoapClient($path = $projectDir . '/app/services.wsdl');
$this->aviaturLogSave->logSave($xmlRequest, $method, 'RQ', $transactionId);
$response = $client->__doRequest($xmlRequest, $this->urlMpa, $this->serviceNameMpa, 1);
$this->aviaturLogSave->logSave($response, $method, 'RS', $transactionId);
return $this->processMpxResponse($xmlRequest, $response, $method, $transactionId);
} catch (\SoapFault $e) {
$this->aviaturRegisterException->log(
$xmlRequest,
json_encode($e)
);
return ['error' => 'No se pudo realizar la consulta en el servidor.'];
}
}
/**
* Realiza la consulta directamente en el servicio del mpa.
*
* @param string $xmlRequest
*
* @return \$1|false|\simplexml_object|\SimpleXMLElement|string[]
*
* @throws WebServiceException
*/
private function callServiceMpb($method, $xmlRequest, $url, $transactionId = null)
{
$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
$request = $xmlRequest;
$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 = curl_init();
$opt = curl_setopt_array($ch, $options);
$handle = $ch;
$this->aviaturLogSave->logSave($request, $method, 'RQ', $transactionId);
$mh = curl_multi_init();
// add handles
$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 = [];
$response['error'] = curl_error($handle);
if (!empty($response['error'])) {
$response['data'] = '';
$this->aviaturLogSave->logSave($response['error'], $method, 'RS', $transactionId);
} else {
$response['data'] = curl_multi_getcontent($handle); // get results
$this->aviaturLogSave->logSave($response['data'], $method, 'RS', $transactionId);
}
// close current handler
curl_multi_remove_handle($mh, $handle);
curl_multi_close($mh);
return $this->processMpxResponse($xmlRequest, str_replace('&', '&', $response['data']), $method, $transactionId);
}
public function processMpxResponse($xmlRequest, $response, $method, $transactionId, $route = '', $providerArray = [], $agency = null, $isNational = null, $ancillaries = null)
{
$providerResult = [];
if (strpos($response, '<faultcode>')) {
$this->aviaturRegisterException->log(
$xmlRequest,
$response
);
return ['error' => (string) 'Ha ocurrido un error inesperado en tu proceso de reserva'];
}
$applyMethods = ['PkgDetail', 'SvcDetail', 'SvcAvailComb'];
if (!in_array($method, $applyMethods)) {
$response = str_replace(['&', 'LLC "NORD WIND"', 'LLC "NORD WIND"'], ['&', 'LLC NORD WIND', 'LLC NORD WIND'], $response);
}
$values = explode('<Response xmlns:mpa="http://amadeus.com/latam/mpa/2010/1">', str_replace(['mpa:', '<serviceDebug>', 'string: "CR', '0""', '1""', '2""', '3""', '4""', '5""', '6""', '7""', '8""', '9""', 'PremiumEconomy', 'NO ITINERARY FOUND FOR '], ['', '<serviceDebug>', 'string: CR', '0"', '1"', '2"', '3"', '4"', '5"', '6"', '7"', '8"', '9"', 'PremiumEconomy', '(66002 ) NO ITINERARY FOUND FOR '], htmlspecialchars_decode($response)));
// $values = explode('<Response xmlns:mpa="http://amadeus.com/latam/mpa/2010/1">', str_replace(['mpa:', '<serviceDebug>', 'string: "CR', '0""', '1""', '2""', '3""', '4""', '5""', '6""', '7""', '8""', '9""', 'NO ITINERARY FOUND FOR '], ['', '<serviceDebug>', 'string: CR', '0"', '1"', '2"', '3"', '4"', '5"', '6"', '7"', '8"', '9"', '(66002 ) NO ITINERARY FOUND FOR '], htmlspecialchars_decode($response)));
if (isset($values[1])) {
$em = $this->doctrine->getManager();
$verb = $em->getRepository(\Aviatur\GeneralBundle\Entity\Verb::class)->findOneByName($method);
if (null === $ancillaries) {
$values = explode('</Response>', $values[1]);
$value = '<Response>' . $values[0] . '</Response>';
} else {
if ($ancillaries) {
$values = explode('</ExecuteResult>', $values[1]);
$value = '<Response>' . $values[0];
} else {
$values = explode('</Response>', $values[1]);
$value = '<Response>' . $values[0] . '</Response>';
}
}
$xmlResponseObject = simplexml_load_string($value);
if ('' != $route && 0 != sizeof($providerArray) && isset($xmlResponseObject->ProviderResults) && isset($xmlResponseObject->ProviderResults->ProviderResult)) {
$dataFare = [];
$count = 1;
foreach ($xmlResponseObject->ProviderResults->ProviderResult as $providerResult) {
$providerResponse = new ProviderResponse();
$providerResponse->setType(explode('|', $route)[0]);
$providerResponse->setRoute(explode('|', $route)[1]);
$providerResponse->setMessage((string) $providerResult['Message']);
$providerResponse->setCode((int) $providerResult['Code']);
$providerResponse->setResponsetime((float) explode('TimeLapse=', (string) $providerResult['Information'])[1]);
$providerResponse->setProvider($providerArray[(int) $providerResult['Provider']]);
$providerResponse->setAgency($agency);
$providerResponse->setVerb($verb);
$providerResponse->setTransactionid($transactionId);
$providerResponse->setDatetime(new \DateTime());
if (isset($xmlResponseObject->Message->OTA_AirLowFareSearchRS->PricedItineraries)) {
if (1 == $count) {
$providersSuccesful = [];
foreach ($xmlResponseObject->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary as $pricedItinerary) {
$providerId = \preg_replace('/^.*ProviderId=([^;]*).*$/', '$1', (string) $pricedItinerary->Notes, 1);
if (!isset($providersSuccesful[$providerId])) {
$providersSuccesful[] = $providerId;
}
if (isset($dataFare[$providerId])) {
$dataFare[$providerId][] = [
'fare' => (string) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'],
'airline' => (string) $pricedItinerary->TicketingInfo->TicketingVendor['Code'],
];
} else {
$dataFare[$providerId][] = [
'fare' => (string) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'],
'airline' => (string) $pricedItinerary->TicketingInfo->TicketingVendor['Code'],
];
}
}
// Ordenamiento de tarifa
for ($k = 0; $k < sizeof($providersSuccesful); ++$k) {
for ($i = 0; $i < sizeof($dataFare[$providersSuccesful[$k]]); ++$i) {
for ($j = $i + 1; $j < sizeof($dataFare[$providersSuccesful[$k]]); ++$j) {
if ($dataFare[$providersSuccesful[$k]][$i]['fare'] > $dataFare[$providersSuccesful[$k]][$j]['fare']) {
$fare = $dataFare[$providersSuccesful[$k]][$i]; // aux
// intercambio
$dataFare[$providersSuccesful[$k]][$i] = $dataFare[$providersSuccesful[$k]][$j]; // fare lowest
$dataFare[$providersSuccesful[$k]][$j] = $fare; // fare hightest
}
}
}
}
}
if (isset($dataFare[(int) $providerResult['Provider']])) {
$providerResponse->setlowestfare($dataFare[(int) $providerResult['Provider']][0]['fare']);
$providerResponse->setAirlineForLowest($dataFare[(int) $providerResult['Provider']][0]['airline']);
$providerResponse->setHighestfare($dataFare[(int) $providerResult['Provider']][sizeof($dataFare[(int) $providerResult['Provider']]) - 1]['fare']);
$providerResponse->setAirlineForHighest($dataFare[(int) $providerResult['Provider']][sizeof($dataFare[(int) $providerResult['Provider']]) - 1]['airline']);
}
}
if (null != $isNational) {
$providerResponse->setMarket('Domestic');
} else {
$providerResponse->setMarket('International');
}
$em->persist($providerResponse);
++$count;
}
$em->flush();
}
if (isset($xmlResponseObject->ProviderResults)) {
foreach ($xmlResponseObject->ProviderResults->ProviderResult as $providerResult) {
if (isset($providerResult['Code']) && ('AirDetail' == $method || 'AirAddDataPassenger' == $method)) {
$valuesRQ = explode('<Request xmlns:mpa="http://amadeus.com/latam/mpa/2010/1">', str_replace(['mpa:', '<serviceDebug>', 'string: "CR', '0""', '1""', '2""', '3""', '4""', '5""', '6""', '7""', '8""', '9""', 'PremiumEconomy', 'NO ITINERARY FOUND FOR '], ['', '<serviceDebug>', 'string: CR', '0"', '1"', '2"', '3"', '4"', '5"', '6"', '7"', '8"', '9"', 'PremiumEconomy', '(66002 ) NO ITINERARY FOUND FOR '], htmlspecialchars_decode($xmlRequest)));
// $valuesRQ = explode('<Request xmlns:mpa="http://amadeus.com/latam/mpa/2010/1">', str_replace(['mpa:', '<serviceDebug>', 'string: "CR', '0""', '1""', '2""', '3""', '4""', '5""', '6""', '7""', '8""', '9""', 'NO ITINERARY FOUND FOR '], ['', '<serviceDebug>', 'string: CR', '0"', '1"', '2"', '3"', '4"', '5"', '6"', '7"', '8"', '9"', '(66002 ) NO ITINERARY FOUND FOR '], htmlspecialchars_decode($xmlRequest)));
$valuesRQ = explode('</Request>', $valuesRQ[1]);
$valueRQ = '<Request>' . $valuesRQ[0] . '</Request>';
$xmlRequestObject = simplexml_load_string($valueRQ);
$route = '-';
$type = 'M';
$provider = $em->getRepository(\Aviatur\MpaBundle\Entity\Provider::class)->findOneByProvideridentifier((int) $providerResult['Provider']);
$providerResponse = new ProviderResponse();
if ('AirDetail' == $method) {
// Detail direct
if (isset($xmlRequestObject->Message->OTA_AirPriceRQ)) {
$origins = $xmlRequestObject->Message->OTA_AirPriceRQ->AirItinerary->OriginDestinationOptions;
$firstFlightSegment = $origins->OriginDestinationOption[0]->FlightSegment[0];
if ((is_countable($origins->OriginDestinationOption) ? count($origins->OriginDestinationOption) : 0) == 1) {
$lastFlightSegment = $origins->OriginDestinationOption[0]
->FlightSegment[(is_countable($origins->OriginDestinationOption[0]->FlightSegment) ? count($origins->OriginDestinationOption[0]->FlightSegment) : 0) - 1];
$route = $firstFlightSegment->DepartureAirport['LocationCode'] . '-' . $lastFlightSegment->ArrivalAirport['LocationCode'];
} else {
$lnlastOption = (is_countable($origins->OriginDestinationOption) ? count($origins->OriginDestinationOption) : 0) - 1;
$lastFlightSegment = $origins->OriginDestinationOption[$lnlastOption]->FlightSegment[0];
$route = $firstFlightSegment->DepartureAirport['LocationCode'] . '-' . $lastFlightSegment->DepartureAirport['LocationCode'];
}
if (isset($origins->OriginDestinationOption[1])) {
$type = 'R';
} else {
$type = 'O';
}
$providerResponse->setMarket('Domestic');
} else if (isset($xmlRequestObject->Message->OTA_AirLowFareSearchRS)) {
$origins = $xmlResponseObject->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItinerary->OriginDestinationOptions;
$firstFlightSegment = $origins->OriginDestinationOption[0]->FlightSegment[0];
if ((is_countable($origins->OriginDestinationOption) ? count($origins->OriginDestinationOption) : 0) == 1) {
$lastFlightSegment = $origins->OriginDestinationOption[0]
->FlightSegment[(is_countable($origins->OriginDestinationOption[0]->FlightSegment) ? count($origins->OriginDestinationOption[0]->FlightSegment) : 0) - 1];
$route = $firstFlightSegment->DepartureAirport['LocationCode'] . '-' . $lastFlightSegment->ArrivalAirport['LocationCode'];
} else {
$lnlastOption = (is_countable($origins->OriginDestinationOption) ? count($origins->OriginDestinationOption) : 0) - 1;
$lastFlightSegment = $origins->OriginDestinationOption[$lnlastOption]->FlightSegment[0];
$route = $firstFlightSegment->DepartureAirport['LocationCode'] . '-' . $lastFlightSegment->DepartureAirport['LocationCode'];
}
$providerResponse->setMarket('International');
}
if ($xmlResponseObject->Message->OTA_AirLowFareSearchRS->PricedItineraries) {
$providerResponse->setlowestfare($xmlResponseObject->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount']);
$providerResponse->setAirlineForLowest($xmlResponseObject->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->TicketingInfo->TicketingVendor['Code']);
}
}
$providerResponse->setType($type);
$providerResponse->setRoute($route);
$providerResponse->setMessage((string) $providerResult['Message']);
$providerResponse->setCode((int) $providerResult['Code']);
$providerResponse->setResponsetime((float) explode('TimeLapse=', (string) $providerResult['Information'])[1]);
$providerResponse->setProvider($provider);
$providerResponse->setVerb($verb);
$providerResponse->setTransactionid($transactionId);
$providerResponse->setDatetime(new \DateTime());
$em->persist($providerResponse);
$em->flush();
}
if (isset($providerResult['Code']) && ('0' == $providerResult['Code'])) {
break;
}
}
} else {
$providerResult = null;
}
if (isset($providerResult['Code']) && ('0' != $providerResult['Code']) && (false === strpos($xmlRequest, 'AirCommandExecute'))) {
if ((false !== strpos($providerResult['Message'], 'NO ITINERARY FOUND FOR REQUESTED')) ||
(false !== strpos($providerResult['Message'], 'NO FARE FOUND FOR REQUESTED ITINERARY')) ||
(false !== strpos($providerResult['Message'], 'No available flight found for the requested')) ||
(false !== strpos($providerResult['Message'], 'No existe disponibilidad en estas fechas')) ||
(false !== strpos($providerResult['Message'], 'Error en la respuesta del servicio, no se encontr')) ||
(false !== strpos($providerResult['Message'], 'NO JOURNEY FOUND FOR REQUESTED ITINERARY')) ||
(false !== strpos($providerResult['Message'], 'No se encontraron resultados o no se encontraron tarifas aplicables')) ||
(false !== strpos($providerResult['Message'], 'No se permiten busquedas multidestino'))
) {
$providerResult['Message'] = 'No existe disponibilidad para esta solicitud, por favor intenta con diferentes fechas o destinos.(66002 )';
} elseif (!strpos($providerResult['Message'], '(66002 ')) {
$this->aviaturRegisterException->log(
$xmlRequest,
$response
);
}
return ['error' => (string) $providerResult['Message']];
}
if (isset($xmlResponseObject->Message) && (empty($xmlResponseObject->Message))) {
$this->aviaturRegisterException->log(
$xmlRequest,
$response
);
return ['error' => 'Respuesta vacia de nuestro proveedor de servicios'];
}
} else {
$this->aviaturRegisterException->log(
$xmlRequest,
$response
);
return ['error' => '(66002 ) Error en la respuesta del servicio, no se encontró información'];
}
return $xmlResponseObject;
}
/**
* @param type $service
* @param type $provider
* @param type $providerId
*
* @return type
*/
public function loginService($service, $provider, $providerId = null)
{
$xmlResponseObject = [];
switch ($this->requestType) {
case 'BUS':
$xml = $this->getXmlLogin($providerId);
$xmlResponseObject = $this->callServiceBus($this->projectDir, $service, $provider, $xml);
break;
case 'MPA':
case 'MPB':
case 'MPB3':
$expire = time() + 7200;
$token = [
'e' => $expire . '_' . $this->random_str(4),
];
$jwt = explode('.', JWT::encode($token, $this->loginKey));
return $jwt[1] . '.' . $jwt[2];
break;
default:
$expire = time() + 7200;
$token = [
'e' => $expire . '_' . $this->random_str(4),
];
$jwt = explode('.', JWT::encode($token, $this->loginKey));
return $jwt[1] . '.' . $jwt[2];
}
if (isset($xmlResponseObject['error'])) {
return $xmlResponseObject;
} else {
return $xmlResponseObject->Message->LoginRS->TransactionIdentifier;
}
}
/**
* @param type $providerId
*
* @return string
*/
private function getXmlLogin($providerId)
{
$xml = '<Request xmlns:mpa="http://amadeus.com/latam/mpa/2010/1">
<mpa:Command>Login</mpa:Command>
<mpa:Version>1.0</mpa:Version>
<mpa:Language>es</mpa:Language>
<mpa:ResponseType>XML</mpa:ResponseType>
<mpa:Target>Test</mpa:Target>
<mpa:MaxExecutionTime>200</mpa:MaxExecutionTime>
<mpa:PageSize>0</mpa:PageSize>
<mpa:PageNumber>1</mpa:PageNumber>
<mpa:CacheRefresh>true</mpa:CacheRefresh>
<mpa:Message>
<LoginRQ xmlns:mpa="http://amadeus.com/latam/mpa/2010/1">
<mpa:UserIdentification>
<mpa:Corporation>10000</mpa:Corporation>
<mpa:Password>1234</mpa:Password>
<mpa:Office>10001</mpa:Office>
</mpa:UserIdentification>
</LoginRQ>
</mpa:Message>
<mpa:ProviderSettings>
<mpa:ProviderSetting>
<mpa:Setting Key="ProviderId" Value="' . $providerId . '" />
<mpa:Setting Key="Language" Value="ES" />
</mpa:ProviderSetting>
</mpa:ProviderSettings>
</Request>';
return $xml;
}
/**
* @param type $providerId
*
* @return string
*/
private function getMpxXmlLogin()
{
$xml = '<LoginRQ xmlns:mpa="http://amadeus.com/latam/mpa/2010/1">
<mpa:UserIdentification>
<mpa:Corporation>10000</mpa:Corporation>
<mpa:Password>1234</mpa:Password>
<mpa:Office>' . $this->random_str(4) . '</mpa:Office>
</mpa:UserIdentification>
</LoginRQ>';
return $xml;
}
public function random_str($length, $keyspace = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')
{
$str = '';
$max = mb_strlen($keyspace, '8bit') - 1;
for ($i = 0; $i < $length; ++$i) {
$str .= $keyspace[random_int(0, $max)];
}
return $str;
}
/**
* @param type $body
* @param type $method
* @param type $transactionId
* @param type $variable
*
* @return type
*/
public function getXmlBusHeader($body, $method, $transactionId, $variable)
{
$path = $this->projectDir . '/app/xmlService/busHeader.xml';
if ($this->session->has('officeId')) {
$xmlBase = str_replace('{officeId}', $this->session->get('officeId'), simplexml_load_file($path)->asXML());
} else {
$xmlBase = simplexml_load_file($path)->asXML();
}
if (isset($variable)) {
foreach (array_keys($variable) as $key) {
if ('ProviderId' != $key) {
$body = str_replace('{' . $key . '}', $variable[$key], $body);
}
}
}
$body = str_replace('{transactionId}', $transactionId, $body);
$arrayIndex = [
'{method}',
'{body}',
];
$arrayValues = [
$method,
$body,
];
$xmlBase = simplexml_load_file($path)->asXML();
$xmlBase = str_replace('{ProviderId}', $variable['ProviderId'], $xmlBase);
$xmlBase = str_replace($arrayIndex, $arrayValues, $xmlBase);
return $xmlBase;
}
/**
* @param $body
* @param $method
* @param $transactionId
* @param $variable
* @param $ancillaries
*
* @return array|string|string[]|null
*/
public function getXmlMpxHeader($body, $method, $transactionId, $variable, $ancillaries = NULL)
{
$cacheRefresh = $variable['cacheRefresh'] ?? 'true';
$cacheKey = $variable['cacheKey'] ?? '';
$path = $this->projectDir . '/app/xmlService/' . mb_strtolower($this->requestType) . 'Request.xml';
if ($this->session->has('officeId')) {
$xmlBase = str_replace('{officeId}', $this->session->get('officeId'), simplexml_load_file($path)->asXML());
} else {
try {
$xml = simplexml_load_file($path);
if ($xml === false) {
throw new \Exception("Error cargando XML desde: " . $path);
}
$xmlBase = $xml->asXML();
} catch (\Exception $e) {
throw new \Exception($e->getMessage() . " path: " . $path);
}
}
if (isset($variable)) {
foreach (array_keys($variable) as $key) {
if ('ProviderId' != $key && 'CoveredTraveler' != $key) {
$body = str_replace('{' . $key . '}', trim($variable[$key]), $body);
}
}
}
$body = str_replace('{transactionId}', $transactionId, $body);
// If null or zero change it to zero
if (!$ancillaries) {
$ancillaries = 0;
}
$body = str_replace('{ancillaries}', $ancillaries, $body);
$arrayIndex = [
'{method}',
'{body}',
'{cacheRefresh}',
'{cacheKey}',
];
$arrayValues = [
$method,
$body,
$cacheRefresh,
$cacheKey,
];
$xmlBase = str_replace($arrayIndex, $arrayValues, $xmlBase);
$xmlBase = str_replace('{ProviderId}', $variable['ProviderId'], $xmlBase);
$xmlBase = preg_replace('/<\?xml.*?\?>/i', '', $xmlBase);
return $xmlBase;
}
/**
* @param type $DocumentType
* @param type $Documentnumber
*
* @return type
*/
public function getXmlUserB2C($DocumentType, $Documentnumber)
{
$path = $this->projectDir . '/app/xmlService/mpaUserB2C.xml';
//Valores a remplazar
$arrayIndex = [
'{DocumentType}',
'{DocumentNumber}',
];
//Nuevos valores
$arrayValues = [
$DocumentType,
$Documentnumber,
];
//obtengo el xml base
$xmlBase = simplexml_load_file($path)->asXML();
$xmlBase = str_replace($arrayIndex, $arrayValues, $xmlBase);
return $xmlBase;
}
/**
* @param type $user
* @param type $secretKey
*
* @return type
*/
public function encryptUser($user, $secretKey)
{
$encryptUser = '';
if ('test1' !== $user) {
$encryptUser = hash_hmac('sha512', $user, $secretKey . false);
} else {
$encryptUser = $user;
}
return $encryptUser;
}
public function setUrls($parameters)
{
$this->url = $parameters->aviatur_service_web_url;
$this->urlMpa = $parameters->aviatur_service_web_url_mpa;
$this->urlLoginMpb = $parameters->aviatur_service_web_url_login_mpb;
$this->urlAirMpb = $parameters->aviatur_service_web_url_air_mpb;
$this->urlHotelMpb = $parameters->aviatur_service_web_url_hotel_mpb;
$this->urlCarMpb = $parameters->aviatur_service_web_url_car_mpb;
$this->urlTicketMpb = $parameters->aviatur_service_web_url_ticket_mpb;
$this->urlCruiseMpb = $parameters->aviatur_service_web_url_cruise_mpb;
$this->urlEmission = $parameters->aviatur_service_web_url_emission;
$this->requestId = $parameters->aviatur_service_web_request_id;
$this->requestType = $parameters->aviatur_service_web_request_type;
$this->serviceNameMpa = $parameters->aviatur_service_web_mpa_method;
$this->urlPackageMpt = $parameters->aviatur_service_web_mpb_mpt;
$this->urlInsuranceMpb = $parameters->aviatur_service_web_url_insurance_mpb;
$this->urlBusMpb = $parameters->aviatur_service_web_url_bus_mpb;
$this->urlTrainMpb = $parameters->aviatur_service_web_url_train_mpb;
$this->urlExperience = $parameters->aviatur_service_web_mpb_experience;
}
/**
* @param $service
* @param $provider
* @param $variable
*
* @return mixed
*/
public function getTransactionId($service, $provider, $variable)
{
if ($this->session->has('transactionId')) {
$transactionId = $this->loginService($service, $provider, $variable['ProviderId']);
if (isset($transactionId['error'])) {
return $transactionId;
} else {
$this->session->set($this->transactionIdSessionName, (string) $transactionId);
}
} else {
$transactionId = $this->session->get('transactionId');
}
return $transactionId;
}
}