src/Aviatur/GeneralBundle/Services/AviaturWebService.php line 102

Open in your IDE?
  1. <?php
  2. namespace Aviatur\GeneralBundle\Services;
  3. /*
  4.  * To change this template, choose Tools | Templates
  5.  * and open the template in the editor.
  6.  */
  7. use Aviatur\GeneralBundle\Entity\ProviderResponse;
  8. use Aviatur\GeneralBundle\Services\Exception\WebServiceException;
  9. use Doctrine\Bundle\DoctrineBundle\Registry;
  10. use Firebase\JWT\JWT;
  11. use Symfony\Component\HttpFoundation\RequestStack;
  12. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  13. /**
  14.  * Description of AviaturWebService.
  15.  *
  16.  * @author andres.ramirez
  17.  */
  18. class AviaturWebService
  19. {
  20.     private $url;
  21.     private $urlMpa;
  22.     private $serviceNameMpa;
  23.     private $invoker;
  24.     private $requestId;
  25.     private $requestType;
  26.     private $projectDir;
  27.     private $loginKey;
  28.     private \Symfony\Component\HttpFoundation\Session\SessionInterface $session;
  29.     private \Symfony\Component\HttpFoundation\RequestStack $requestStack;
  30.     private \Doctrine\Bundle\DoctrineBundle\Registry $doctrine;
  31.     private \Aviatur\GeneralBundle\Services\AviaturLogSave $aviaturLogSave;
  32.     private \Aviatur\GeneralBundle\Services\ExceptionLog $aviaturRegisterException;
  33.     private $transactionIdSessionName;
  34.     /**
  35.      * Establece la url del bus.
  36.      *
  37.      * @param type $url
  38.      */
  39.     public function setUrl($url)
  40.     {
  41.         $this->url $url;
  42.     }
  43.     /**
  44.      * Establece la url del mpa.
  45.      *
  46.      * @param type $urlMpa
  47.      */
  48.     public function setUrlMpa($urlMpa)
  49.     {
  50.         $this->urlMpa $urlMpa;
  51.     }
  52.     /**
  53.      * Establece el tipo de consulta si es MPA o BUS.
  54.      *
  55.      * @param type $requestType
  56.      */
  57.     public function setRequestType($requestType)
  58.     {
  59.         $this->requestType $requestType;
  60.     }
  61.     /**
  62.      * Obtener el valor del requestType para consltar en clases que van a extender
  63.      *
  64.      * @return mixed
  65.      */
  66.     public function getRequestType()
  67.     {
  68.         return $this->requestType;
  69.     }
  70.     /**
  71.      * @param $projectDir
  72.      * @param $invoker
  73.      * @param SessionInterface $session
  74.      * @param RequestStack $requestStack
  75.      * @param Registry $doctrine
  76.      * @param AviaturLogSave $aviaturLogSave
  77.      * @param ExceptionLog $aviaturRegisterException
  78.      * @param $transactionIdSessionName
  79.      */
  80.     public function __construct(RequestStack $requestStackSessionInterface $sessionRegistry $doctrineAviaturLogSave $aviaturLogSaveExceptionLog $aviaturRegisterException$projectDir$invoker$transactionIdSessionName)
  81.     {
  82.         $this->projectDir $projectDir;
  83.         $this->session $session;
  84.         $this->requestStack $requestStack;
  85.         $this->doctrine $doctrine;
  86.         $this->aviaturLogSave $aviaturLogSave;
  87.         $this->aviaturRegisterException $aviaturRegisterException;
  88.         $this->transactionIdSessionName $transactionIdSessionName;
  89.         $request $this->requestStack->getCurrentRequest();
  90.         if (null !== $request) {
  91.             $domain $request->getHost();
  92.             $parametersJson $this->session->get($domain '[parameters]''');
  93.             $parameters json_decode($parametersJson);
  94.             if (!empty($parameters)) {
  95.                 $this->url $parameters->aviatur_service_web_url;
  96.                 $this->urlMpa $parameters->aviatur_service_web_url_mpa;
  97.                 $this->urlLoginMpb $parameters->aviatur_service_web_url_login_mpb;
  98.                 $this->urlAirMpb $parameters->aviatur_service_web_url_air_mpb;
  99.                 $this->urlHotelMpb $parameters->aviatur_service_web_url_hotel_mpb;
  100.                 $this->urlCarMpb $parameters->aviatur_service_web_url_car_mpb;
  101.                 $this->urlTicketMpb $parameters->aviatur_service_web_url_ticket_mpb;
  102.                 $this->urlCruiseMpb $parameters->aviatur_service_web_url_cruise_mpb;
  103.                 $this->urlEmission $parameters->aviatur_service_web_url_emission;
  104.                 $this->invoker $invoker;
  105.                 $this->requestId $parameters->aviatur_service_web_request_id;
  106.                 $this->requestType $parameters->aviatur_service_web_request_type;
  107.                 $this->serviceNameMpa $parameters->aviatur_service_web_mpa_method;
  108.                 $this->urlPackageMpt $parameters->aviatur_service_web_mpb_mpt;
  109.                 $this->urlInsuranceMpb $parameters->aviatur_service_web_url_insurance_mpb;
  110.                 $this->urlBusMpb $parameters->aviatur_service_web_url_bus_mpb;
  111.                 $this->urlTrainMpb $parameters->aviatur_service_web_url_train_mpb;
  112.                 $this->urlExperience $parameters->aviatur_service_web_mpb_experience;
  113.             }
  114.         }
  115.         $this->loginKey base64_decode('Tj6qJt6p2QYECN4Z+4iqQMbLFuz8u5ff');
  116.     }
  117.     /**
  118.      * @param string $xml
  119.      *
  120.      * @return string
  121.      *
  122.      * @throws FatalErrorException
  123.      */
  124.     public function callWebService($service$provider$xmlRequest)
  125.     {
  126.         $xmlResponseObject $this->callServiceBus($this->projectDir$service$provider$xmlRequest);
  127.         return $xmlResponseObject;
  128.     }
  129.     /**
  130.      * Realiza la consulta en los servicios de amadeus usando un entrypoint diferente dependiendo de la configuracion.
  131.      *
  132.      * @param string $service
  133.      * @param string $provider
  134.      * @param string $xmlRequest
  135.      *
  136.      * @return \simplexml_object
  137.      */
  138.     public function callWebServiceAmadeus($service$method$provider$xmlRequest, array $variable$login false$transactionId null$isTicket true)
  139.     {
  140.         $xmlResponseObject null;
  141.         $availableAirMethods = ['AirOverride''AirLowFareSearch''AirDetail''AirAvail''AirCommandExecute''AirAddDataPassenger''AirBook''AirCancel'];
  142.         $availableCarMethods = ['VehOverride''VehAvailRate''VehDetail''VehRes'];
  143.         $availableHotelMethods = ['HotelAvail''HotelRoomList''HotelDetail''HotelRes'];
  144.         $availableTicketMethods = ['SvcDetail'];
  145.         $availablePackageMethods = ['PkgAvail''PkgDetail''PkgFares''PkgOptions''PkgPromo'];
  146.         $availableCruiseMethods = ['CruiseAvail''CruiseDetail''CruiseCabin''CruiseReserve'];
  147.         $availableInsuranceMethods = ['InsuranceQuote''InsuranceBook'];
  148.         $availableBusMethods = ['BusAvail''BusDetail''BusBook'];
  149.         $availableTrainMethods = ['TrainAvail''TrainDetail''TrainBook'];
  150.         $availableExperienceMethods = ['SvcAvail''SvcDetail''SvcAvailComb''SvcFares''SvcAvailPOS''SvcAvailPROMO''SvcQuotas'];
  151.         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)) {
  152.             $this->requestType 'MPA';
  153.         }
  154.         if (null == $transactionId) {
  155.             if ($login || !$this->session->has($this->transactionIdSessionName)) {
  156.                 $transactionId $this->loginService($service$provider$variable['ProviderId']);
  157.                 if (isset($transactionId['error'])) {
  158.                     return $transactionId;
  159.                 } else {
  160.                     $this->session->set($this->transactionIdSessionName, (string) $transactionId);
  161.                 }
  162.             } else {
  163.                 $transactionId $this->session->get($this->transactionIdSessionName);
  164.             }
  165.             // $transactionId2 = $this->getTransactionId($service, $method, $variable); // de prueba para reempazar codigo anterior
  166.         }
  167.         $infoToken JWT::decode(explode('.'JWT::encode(''$this->loginKey))[0] . '.' $transactionId$this->loginKey, ['HS256']);
  168.         $timeValidation explode('_'$infoToken->e);
  169.         /*if($this->session->has($transactionId.'external')) {
  170.             if (strtotime(date("Y-m-d H:i:s")."- 5 hour") - (int) $this->session->get('timeValidationAPI') >= 900) {
  171.                 return array('error' => 'La sesión ha expirado por favor vuelve a realizar tu consulta. (66002 ) ');
  172.             }
  173.          }else{*/
  174.         if ((int) $timeValidation[0] <= ((int) time() - 900)) {
  175.             return ['error' => 'La sesión ha expirado por favor vuelve a realizar tu consulta. (66002 ) '];
  176.         }
  177.         //}
  178.         switch ($this->requestType) {
  179.             case 'BUS':
  180.                 $xmlRequest $this->getXmlBusHeader($xmlRequest$method$transactionId$variable);
  181.                 $xmlResponseObject $this->callServiceBusUser($service$provider$xmlRequest$transactionId);
  182.                 break;
  183.             case 'MPA':
  184.                 $xmlRequest $this->getXmlMpxHeader($xmlRequest$method$transactionId$variable);
  185.                 $xmlResponseObject $this->callServiceMpa($this->projectDir$method$xmlRequest$transactionId);
  186.                 break;
  187.             case 'MPB':
  188.                 $xmlRequest $this->getXmlMpxHeader($xmlRequest$method$transactionId$variable);
  189.                 if (in_array($method$availableAirMethods)) {
  190.                     $xmlResponseObject $this->callServiceMpb($method$xmlRequest$this->urlAirMpb$transactionId);
  191.                 } elseif (in_array($method$availableCarMethods)) {
  192.                     $xmlResponseObject $this->callServiceMpb($method$xmlRequest$this->urlCarMpb$transactionId);
  193.                 } elseif (in_array($method$availableHotelMethods)) {
  194.                     //$this->urlHotelMpb = "http://mpb06.grupoaviatur.com/Aviatur.MPBQA.Adapter/HotelService.ashx";
  195.                     $xmlResponseObject $this->callServiceMpb($method$xmlRequest$this->urlHotelMpb$transactionId);
  196.                 } elseif (in_array($method$availableTicketMethods) && $isTicket) {
  197.                     $xmlResponseObject $this->callServiceMpb($method$xmlRequest$this->urlTicketMpb$transactionId);
  198.                 } elseif (in_array($method$availablePackageMethods)) {
  199.                     $xmlResponseObject $this->callServiceMpb($method$xmlRequest$this->urlPackageMpt$transactionId);
  200.                 } elseif (in_array($method$availableCruiseMethods)) {
  201.                     $xmlResponseObject $this->callServiceMpb($method$xmlRequest$this->urlCruiseMpb$transactionId);
  202.                 } elseif (in_array($method$availableInsuranceMethods)) {
  203.                     $xmlResponseObject $this->callServiceMpb($method$xmlRequest$this->urlInsuranceMpb$transactionId);
  204.                 } elseif (in_array($method$availableBusMethods)) {
  205.                     $xmlResponseObject $this->callServiceMpb($method$xmlRequest$this->urlBusMpb$transactionId);
  206.                 } elseif (in_array($method$availableTrainMethods)) {
  207.                     $xmlResponseObject $this->callServiceMpb($method$xmlRequest$this->urlTrainMpb$transactionId);
  208.                 } elseif (in_array($method$availableExperienceMethods)) {
  209.                     $xmlResponseObject $this->callServiceMpb($method$xmlRequest$this->urlExperience$transactionId);
  210.                 } else {
  211.                     $xmlResponseObject $this->callServiceMpa($this->projectDir$method$xmlRequest$transactionId);
  212.                 }
  213.                 break;
  214.         }
  215.         return $xmlResponseObject;
  216.     }
  217.     /**
  218.      * Realiza la consulta en en servicio para mirar si el usuario existe en la base de Aviatur.
  219.      *
  220.      * @param string $service
  221.      * @param string $provider
  222.      * @param string $xmlRequest
  223.      *
  224.      * @return \simplexml_object
  225.      */
  226.     public function busWebServiceAmadeus($service$provider$xmlRequest)
  227.     {
  228.         $xmlResponseObject $this->callServiceBusUser($service$provider$xmlRequest);
  229.         return $xmlResponseObject;
  230.     }
  231.     /**
  232.      * Consulta el bus enviando los xml mediante curl.
  233.      *
  234.      * @param $projectDir
  235.      * @param string $service
  236.      * @param string $provider
  237.      * @param xml    $xmlRequest
  238.      *
  239.      * @return \simplexml_object
  240.      *
  241.      * @throws WebServiceException
  242.      */
  243.     private function callServiceBus($projectDir$service$provider$xmlRequest)
  244.     {
  245.         $xmlResponseObject null;
  246.         try {
  247.             if (null != $service) {
  248.                 $path $projectDir '/app/xmlService/aviaturRequest.xml';
  249.                 //Valores a remplazar
  250.                 $arrayIndex = [
  251.                     '{xmlBody}',
  252.                     '{service}',
  253.                     '{invoker}',
  254.                     '{provider}',
  255.                     '{requestId}',
  256.                 ];
  257.                 //Nuevos valores
  258.                 $arrayValues = [
  259.                     $xmlRequest,
  260.                     $service,
  261.                     $this->invoker,
  262.                     $provider,
  263.                     $this->requestId,
  264.                 ];
  265.                 //obtengo el xml base
  266.                 $xmlBase simplexml_load_file((string) $path)->asXML();
  267.                 $xmlBase str_replace($arrayIndex$arrayValues$xmlBase);
  268.                 $xmlBase str_replace('<?xml version="1.0"?>'''$xmlBase);
  269.                 $xmlBase trim($xmlBase);
  270.             } else {
  271.                 $xmlBase $xmlRequest;
  272.                 $service 'DIRECT';
  273.             }
  274.             $client = new \SoapClient(null, [
  275.                 'location' => $this->url,
  276.                 'uri' => $this->url,
  277.                 'trace' => 1,
  278.             ]);
  279.             $this->aviaturLogSave->logSave($xmlBase$service'RQ');
  280.             $response $client->__doRequest($xmlBase$this->url$this->serviceNameMpa1);
  281.             $this->aviaturLogSave->logSave($response$service'RS');
  282.             $response str_replace('<?xml version="1.0"?>'''$response);
  283.             $xmlResponseObject = \simplexml_load_string($response, \SimpleXMLElement::class, 0'NS1'true);
  284.             if (isset($xmlResponseObject->Body->mbus->response->fault)) {
  285.                 $this->aviaturRegisterException->log(
  286.                     $xmlBase,
  287.                     $response
  288.                 );
  289.                 return ['error' => 'Error en la respuesta del servicio: ' . (string) $xmlResponseObject->Body->mbus->response->fault->faultDescription];
  290.             }
  291.             if (false === strpos($response'<body>')) {
  292.                 $this->aviaturRegisterException->log(
  293.                     $xmlBase,
  294.                     $response
  295.                 );
  296.                 return ['error' => 'Respuesta vacia del servicio'];
  297.             }
  298.             //Si no existe error Extraigo el body de la respuesta
  299.             $firstPartBody explode('<body>'$response);
  300.             $secondPartBody explode('</body>'$firstPartBody[1]);
  301.             $xmlResponseObject str_replace('mpa:'''utf8_encode($secondPartBody[0]));
  302.             $xmlResponseObject = \simplexml_load_string($xmlResponseObject, \SimpleXMLElement::class, LIBXML_NOCDATA);
  303.         } catch (\SoapFault $e) {
  304.             $this->aviaturRegisterException->log(
  305.                 'SoapFault Exception',
  306.                 json_encode($e)
  307.             );
  308.             throw new WebServiceException('No se pudo realizar la consulta en el servidor. ' $this->url''100);
  309.         }
  310.         return $xmlResponseObject;
  311.     }
  312.     /**
  313.      * @param type $service
  314.      * @param type $provider
  315.      * @param type $xmlRequest
  316.      * @param type $transactionId
  317.      *
  318.      * @return type
  319.      *
  320.      * @throws WebServiceException
  321.      */
  322.     private function callServiceBusUser($service$provider$xmlRequest$transactionId null)
  323.     {
  324.         $error null;
  325.         $xmlResponseObject null;
  326.         try {
  327.             if (null != $service) {
  328.                 $path $this->projectDir '/app/xmlService/aviaturRequest.xml';
  329.                 //Valores a remplazar
  330.                 $arrayIndex = [
  331.                     '{xmlBody}',
  332.                     '{service}',
  333.                     '{invoker}',
  334.                     '{provider}',
  335.                     '{requestId}',
  336.                 ];
  337.                 //Nuevos valores
  338.                 $arrayValues = [
  339.                     $xmlRequest,
  340.                     $service,
  341.                     $this->invoker,
  342.                     $provider,
  343.                     $this->requestId,
  344.                 ];
  345.                 //obtengo el xml base
  346.                 $xmlBase simplexml_load_file($path)->asXML();
  347.                 $xmlBase str_replace($arrayIndex$arrayValues$xmlBase);
  348.                 $xmlBase str_replace('<?xml version="1.0"?>'''$xmlBase);
  349.                 $xmlBase trim($xmlBase);
  350.             } else {
  351.                 $xmlBase $xmlRequest;
  352.                 $service 'DIRECT';
  353.             }
  354.             $client = new \SoapClient(null, [
  355.                 'location' => $this->url,
  356.                 'uri' => $this->url,
  357.                 'trace' => 1,
  358.             ]);
  359.             $this->aviaturLogSave->logSave($xmlBase$service'RQ'$transactionId);
  360.             $response $client->__doRequest($xmlBase$this->url$this->serviceNameMpa1);
  361.             $this->aviaturLogSave->logSave($response$service'RS'$transactionId);
  362.             $response str_replace(['<?xml version="1.0"?>''&amp;''&'], ['''y''y'], $response);
  363.             libxml_use_internal_errors(true);
  364.             $xmlResponseObject = \simplexml_load_string($response, \SimpleXMLElement::class, 0'NS1'true);
  365.             if (false === $xmlResponseObject) {
  366.                 foreach (libxml_get_errors() as $error) {
  367.                     echo "\t"$error->message;
  368.                 }
  369.                 return ['error' => 'Error en la respuesta del servicio: ' . (string) $error->message '\n Response: ' $response];
  370.             }
  371.             if (isset($xmlResponseObject->Body->mbus->response->fault)) {
  372.                 $this->aviaturRegisterException->log(
  373.                     $xmlBase,
  374.                     $response
  375.                 );
  376.                 return ['error' => 'Error en la respuesta del servicio: ' . (string) $xmlResponseObject->Body->mbus->response->fault->faultDescription];
  377.             }
  378.             if (false === strrpos($response'<body>')) {
  379.                 $this->aviaturRegisterException->log(
  380.                     $xmlBase,
  381.                     $response
  382.                 );
  383.                 return ['error' => 'Respuesta vacia del servicio'];
  384.             }
  385.             //Si no existe error Extraigo el body de la respuesta
  386.             $firstPartBody explode('<body>'$response);
  387.             $secondPartBody explode('</body>'$firstPartBody[1]);
  388.             $xmlResponseObject str_replace('mpa:'''utf8_encode($secondPartBody[0]));
  389.             if ('DIRECT' == $service) {
  390.                 $xmlResponseObject '<ROW>' $xmlResponseObject '</ROW>';
  391.             }
  392.             $xmlResponseObject = \simplexml_load_string(utf8_decode(htmlspecialchars_decode($xmlResponseObject)));
  393.             $validResponse false;
  394.             if (isset($xmlResponseObject->ProviderResults)) {
  395.                 foreach ($xmlResponseObject->ProviderResults->ProviderResult as $providerResult) {
  396.                     if (isset($providerResult['Code']) && ('0' == $providerResult['Code'])) {
  397.                         $validResponse true;
  398.                     } else {
  399.                         $message = (string) $xmlResponseObject->ProviderResults->ProviderResult[0]['Message'];
  400.                     }
  401.                 }
  402.             } else {
  403.                 $validResponse true;
  404.             }
  405.             if (!$validResponse) {
  406.                 $this->aviaturRegisterException->log(
  407.                     $xmlBase,
  408.                     $response
  409.                 );
  410.                 return ['error' => $message];
  411.             }
  412.         } catch (\SoapFault $e) {
  413.             $this->aviaturRegisterException->log(
  414.                 $xmlRequest,
  415.                 json_encode($e)
  416.             );
  417.             return ['error' => 'No se pudo realizar la consulta en el servidor.'];
  418.         }
  419.         if (isset($xmlResponseObject->error)) {
  420.             unset($xmlResponseObject->error);
  421.         }
  422.         return $xmlResponseObject;
  423.     }
  424.     /**
  425.      * Realiza la consulta directamente en el servicio del mpa.
  426.      *
  427.      * @param string $xmlRequest
  428.      *
  429.      * @return \simplexml_object
  430.      *
  431.      * @throws WebServiceException
  432.      */
  433.     private function callServiceMpa($projectDir$method$xmlRequest$transactionId null)
  434.     {
  435.         $xmlResponseObject null;
  436.         try {
  437.             $client = new \SoapClient($path $projectDir '/app/services.wsdl');
  438.             $this->aviaturLogSave->logSave($xmlRequest$method'RQ'$transactionId);
  439.             $response $client->__doRequest($xmlRequest$this->urlMpa$this->serviceNameMpa1);
  440.             $this->aviaturLogSave->logSave($response$method'RS'$transactionId);
  441.             return $this->processMpxResponse($xmlRequest$response$method$transactionId);
  442.         } catch (\SoapFault $e) {
  443.             $this->aviaturRegisterException->log(
  444.                 $xmlRequest,
  445.                 json_encode($e)
  446.             );
  447.             return ['error' => 'No se pudo realizar la consulta en el servidor.'];
  448.         }
  449.     }
  450.     /**
  451.      * Realiza la consulta directamente en el servicio del mpa.
  452.      *
  453.      * @param string $xmlRequest
  454.      *
  455.      * @return \$1|false|\simplexml_object|\SimpleXMLElement|string[]
  456.      *
  457.      * @throws WebServiceException
  458.      */
  459.     private function callServiceMpb($method$xmlRequest$url$transactionId null)
  460.     {
  461.         $timeout 100;
  462.         $defaultOptions = [
  463.             CURLOPT_USERAGENT => 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)',
  464.             CURLOPT_URL => $url,
  465.             CURLOPT_RETURNTRANSFER => true,
  466.             CURLOPT_SSL_VERIFYHOST => false,
  467.             CURLOPT_SSL_VERIFYPEER => false,
  468.             CURLOPT_MAXREDIRS => 10,
  469.             CURLOPT_FOLLOWLOCATION => true,
  470.             CURLOPT_CONNECTTIMEOUT => $timeout,
  471.             CURLOPT_POST => true,
  472.         ];
  473.         // add curl options to each handle
  474.         $request $xmlRequest;
  475.         $headers = [
  476.             'POST /AmadeusLATAM.Aviatur.Services/services/mpaservice.asmx HTTP/1.1',
  477.             'Content-Type: text/xml; charset=utf-8',
  478.             'Content-Length: ' strlen($request),
  479.             'SOAPAction: "http://tempuri.org/Execute"',
  480.         ];
  481.         $options $defaultOptions;
  482.         $options += [
  483.             CURLOPT_HTTPHEADER => $headers,
  484.             CURLOPT_POSTFIELDS => $request,
  485.         ];
  486.         $ch curl_init();
  487.         $opt curl_setopt_array($ch$options);
  488.         $handle $ch;
  489.         $this->aviaturLogSave->logSave($request$method'RQ'$transactionId);
  490.         $mh curl_multi_init();
  491.         // add handles
  492.         $err curl_multi_add_handle($mh$handle);
  493.         $running_handles null;
  494.         do {
  495.             curl_multi_exec($mh$running_handles);
  496.             curl_multi_select($mh);
  497.         } while ($running_handles 0);
  498.         $response = [];
  499.         $response['error'] = curl_error($handle);
  500.         if (!empty($response['error'])) {
  501.             $response['data'] = '';
  502.             $this->aviaturLogSave->logSave($response['error'], $method'RS'$transactionId);
  503.         } else {
  504.             $response['data'] = curl_multi_getcontent($handle);  // get results
  505.             $this->aviaturLogSave->logSave($response['data'], $method'RS'$transactionId);
  506.         }
  507.         // close current handler
  508.         curl_multi_remove_handle($mh$handle);
  509.         curl_multi_close($mh);
  510.         return $this->processMpxResponse($xmlRequeststr_replace('&''&amp;'$response['data']), $method$transactionId);
  511.     }
  512.     public function processMpxResponse($xmlRequest$response$method$transactionId$route ''$providerArray = [], $agency null$isNational null$ancillaries null)
  513.     {
  514.         $providerResult = [];
  515.         if (strpos($response'<faultcode>')) {
  516.             $this->aviaturRegisterException->log(
  517.                 $xmlRequest,
  518.                 $response
  519.             );
  520.             return ['error' => (string) 'Ha ocurrido un error inesperado en tu proceso de reserva'];
  521.         }
  522.         $applyMethods = ['PkgDetail''SvcDetail''SvcAvailComb'];
  523.         if (!in_array($method$applyMethods)) {
  524.             $response str_replace(['&''LLC "NORD WIND"''LLC &quot;NORD WIND&quot;'], ['&amp;''LLC NORD WIND''LLC NORD WIND'], $response);
  525.         }
  526.         $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 '], ['''&lt;serviceDebug&gt;''string: CR''0"''1"''2"''3"''4"''5"''6"''7"''8"''9"''PremiumEconomy''(66002 ) NO ITINERARY FOUND FOR '], htmlspecialchars_decode($response)));
  527.         // $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 '], ['', '&lt;serviceDebug&gt;', 'string: CR', '0"', '1"', '2"', '3"', '4"', '5"', '6"', '7"', '8"', '9"', '(66002 ) NO ITINERARY FOUND FOR '], htmlspecialchars_decode($response)));
  528.         if (isset($values[1])) {
  529.             $em $this->doctrine->getManager();
  530.             $verb $em->getRepository(\Aviatur\GeneralBundle\Entity\Verb::class)->findOneByName($method);
  531.             if (null === $ancillaries) {
  532.                 $values explode('</Response>'$values[1]);
  533.                 $value '<Response>' $values[0] . '</Response>';
  534.             } else {
  535.                 if ($ancillaries) {
  536.                     $values explode('</ExecuteResult>'$values[1]);
  537.                     $value '<Response>' $values[0];
  538.                 } else {
  539.                     $values explode('</Response>'$values[1]);
  540.                     $value '<Response>' $values[0] . '</Response>';
  541.                 }
  542.             }
  543.             $xmlResponseObject simplexml_load_string($value);
  544.             if ('' != $route && != sizeof($providerArray) && isset($xmlResponseObject->ProviderResults) && isset($xmlResponseObject->ProviderResults->ProviderResult)) {
  545.                 $dataFare = [];
  546.                 $count 1;
  547.                 foreach ($xmlResponseObject->ProviderResults->ProviderResult as $providerResult) {
  548.                     $providerResponse = new ProviderResponse();
  549.                     $providerResponse->setType(explode('|'$route)[0]);
  550.                     $providerResponse->setRoute(explode('|'$route)[1]);
  551.                     $providerResponse->setMessage((string) $providerResult['Message']);
  552.                     $providerResponse->setCode((int) $providerResult['Code']);
  553.                     $providerResponse->setResponsetime((float) explode('TimeLapse=', (string) $providerResult['Information'])[1]);
  554.                     $providerResponse->setProvider($providerArray[(int) $providerResult['Provider']]);
  555.                     $providerResponse->setAgency($agency);
  556.                     $providerResponse->setVerb($verb);
  557.                     $providerResponse->setTransactionid($transactionId);
  558.                     $providerResponse->setDatetime(new \DateTime());
  559.                     if (isset($xmlResponseObject->Message->OTA_AirLowFareSearchRS->PricedItineraries)) {
  560.                         if (== $count) {
  561.                             $providersSuccesful = [];
  562.                             foreach ($xmlResponseObject->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary as $pricedItinerary) {
  563.                                 $providerId = \preg_replace('/^.*ProviderId=([^;]*).*$/''$1', (string) $pricedItinerary->Notes1);
  564.                                 if (!isset($providersSuccesful[$providerId])) {
  565.                                     $providersSuccesful[] = $providerId;
  566.                                 }
  567.                                 if (isset($dataFare[$providerId])) {
  568.                                     $dataFare[$providerId][] = [
  569.                                         'fare' => (string) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'],
  570.                                         'airline' => (string) $pricedItinerary->TicketingInfo->TicketingVendor['Code'],
  571.                                     ];
  572.                                 } else {
  573.                                     $dataFare[$providerId][] = [
  574.                                         'fare' => (string) $pricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount'],
  575.                                         'airline' => (string) $pricedItinerary->TicketingInfo->TicketingVendor['Code'],
  576.                                     ];
  577.                                 }
  578.                             }
  579.                             // Ordenamiento de tarifa
  580.                             for ($k 0$k sizeof($providersSuccesful); ++$k) {
  581.                                 for ($i 0$i sizeof($dataFare[$providersSuccesful[$k]]); ++$i) {
  582.                                     for ($j $i 1$j sizeof($dataFare[$providersSuccesful[$k]]); ++$j) {
  583.                                         if ($dataFare[$providersSuccesful[$k]][$i]['fare'] > $dataFare[$providersSuccesful[$k]][$j]['fare']) {
  584.                                             $fare $dataFare[$providersSuccesful[$k]][$i]; // aux
  585.                                             // intercambio
  586.                                             $dataFare[$providersSuccesful[$k]][$i] = $dataFare[$providersSuccesful[$k]][$j]; // fare lowest
  587.                                             $dataFare[$providersSuccesful[$k]][$j] = $fare// fare hightest
  588.                                         }
  589.                                     }
  590.                                 }
  591.                             }
  592.                         }
  593.                         if (isset($dataFare[(int) $providerResult['Provider']])) {
  594.                             $providerResponse->setlowestfare($dataFare[(int) $providerResult['Provider']][0]['fare']);
  595.                             $providerResponse->setAirlineForLowest($dataFare[(int) $providerResult['Provider']][0]['airline']);
  596.                             $providerResponse->setHighestfare($dataFare[(int) $providerResult['Provider']][sizeof($dataFare[(int) $providerResult['Provider']]) - 1]['fare']);
  597.                             $providerResponse->setAirlineForHighest($dataFare[(int) $providerResult['Provider']][sizeof($dataFare[(int) $providerResult['Provider']]) - 1]['airline']);
  598.                         }
  599.                     }
  600.                     if (null != $isNational) {
  601.                         $providerResponse->setMarket('Domestic');
  602.                     } else {
  603.                         $providerResponse->setMarket('International');
  604.                     }
  605.                     $em->persist($providerResponse);
  606.                     ++$count;
  607.                 }
  608.                 $em->flush();
  609.             }
  610.             if (isset($xmlResponseObject->ProviderResults)) {
  611.                 foreach ($xmlResponseObject->ProviderResults->ProviderResult as $providerResult) {
  612.                     if (isset($providerResult['Code']) && ('AirDetail' == $method || 'AirAddDataPassenger' == $method)) {
  613.                         $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 '], ['''&lt;serviceDebug&gt;''string: CR''0"''1"''2"''3"''4"''5"''6"''7"''8"''9"''PremiumEconomy''(66002 ) NO ITINERARY FOUND FOR '], htmlspecialchars_decode($xmlRequest)));
  614.                         // $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 '], ['', '&lt;serviceDebug&gt;', 'string: CR', '0"', '1"', '2"', '3"', '4"', '5"', '6"', '7"', '8"', '9"', '(66002 ) NO ITINERARY FOUND FOR '], htmlspecialchars_decode($xmlRequest)));
  615.                         $valuesRQ explode('</Request>'$valuesRQ[1]);
  616.                         $valueRQ '<Request>' $valuesRQ[0] . '</Request>';
  617.                         $xmlRequestObject simplexml_load_string($valueRQ);
  618.                         $route '-';
  619.                         $type 'M';
  620.                         $provider $em->getRepository(\Aviatur\MpaBundle\Entity\Provider::class)->findOneByProvideridentifier((int) $providerResult['Provider']);
  621.                         $providerResponse = new ProviderResponse();
  622.                         if ('AirDetail' == $method) {
  623.                             // Detail direct
  624.                             if (isset($xmlRequestObject->Message->OTA_AirPriceRQ)) {
  625.                                 $origins $xmlRequestObject->Message->OTA_AirPriceRQ->AirItinerary->OriginDestinationOptions;
  626.                                 $firstFlightSegment $origins->OriginDestinationOption[0]->FlightSegment[0];
  627.                                 if ((is_countable($origins->OriginDestinationOption) ? count($origins->OriginDestinationOption) : 0) == 1) {
  628.                                     $lastFlightSegment $origins->OriginDestinationOption[0]
  629.                                         ->FlightSegment[(is_countable($origins->OriginDestinationOption[0]->FlightSegment) ? count($origins->OriginDestinationOption[0]->FlightSegment) : 0) - 1];
  630.                                     $route $firstFlightSegment->DepartureAirport['LocationCode'] . '-' $lastFlightSegment->ArrivalAirport['LocationCode'];
  631.                                 } else {
  632.                                     $lnlastOption = (is_countable($origins->OriginDestinationOption) ? count($origins->OriginDestinationOption) : 0) - 1;
  633.                                     $lastFlightSegment $origins->OriginDestinationOption[$lnlastOption]->FlightSegment[0];
  634.                                     $route $firstFlightSegment->DepartureAirport['LocationCode'] . '-' $lastFlightSegment->DepartureAirport['LocationCode'];
  635.                                 }
  636.                                 if (isset($origins->OriginDestinationOption[1])) {
  637.                                     $type 'R';
  638.                                 } else {
  639.                                     $type 'O';
  640.                                 }
  641.                                 $providerResponse->setMarket('Domestic');
  642.                             } else if (isset($xmlRequestObject->Message->OTA_AirLowFareSearchRS)) {
  643.                                 $origins $xmlResponseObject->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItinerary->OriginDestinationOptions;
  644.                                 $firstFlightSegment $origins->OriginDestinationOption[0]->FlightSegment[0];
  645.                                 if ((is_countable($origins->OriginDestinationOption) ? count($origins->OriginDestinationOption) : 0) == 1) {
  646.                                     $lastFlightSegment $origins->OriginDestinationOption[0]
  647.                                         ->FlightSegment[(is_countable($origins->OriginDestinationOption[0]->FlightSegment) ? count($origins->OriginDestinationOption[0]->FlightSegment) : 0) - 1];
  648.                                     $route $firstFlightSegment->DepartureAirport['LocationCode'] . '-' $lastFlightSegment->ArrivalAirport['LocationCode'];
  649.                                 } else {
  650.                                     $lnlastOption = (is_countable($origins->OriginDestinationOption) ? count($origins->OriginDestinationOption) : 0) - 1;
  651.                                     $lastFlightSegment $origins->OriginDestinationOption[$lnlastOption]->FlightSegment[0];
  652.                                     $route $firstFlightSegment->DepartureAirport['LocationCode'] . '-' $lastFlightSegment->DepartureAirport['LocationCode'];
  653.                                 }
  654.                                 $providerResponse->setMarket('International');
  655.                             }
  656.                             if ($xmlResponseObject->Message->OTA_AirLowFareSearchRS->PricedItineraries) {
  657.                                 $providerResponse->setlowestfare($xmlResponseObject->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItineraryPricingInfo->ItinTotalFare->TotalFare['Amount']);
  658.                                 $providerResponse->setAirlineForLowest($xmlResponseObject->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->TicketingInfo->TicketingVendor['Code']);
  659.                             }
  660.                         }
  661.                         $providerResponse->setType($type);
  662.                         $providerResponse->setRoute($route);
  663.                         $providerResponse->setMessage((string) $providerResult['Message']);
  664.                         $providerResponse->setCode((int) $providerResult['Code']);
  665.                         $providerResponse->setResponsetime((float) explode('TimeLapse=', (string) $providerResult['Information'])[1]);
  666.                         $providerResponse->setProvider($provider);
  667.                         $providerResponse->setVerb($verb);
  668.                         $providerResponse->setTransactionid($transactionId);
  669.                         $providerResponse->setDatetime(new \DateTime());
  670.                         $em->persist($providerResponse);
  671.                         $em->flush();
  672.                     }
  673.                     if (isset($providerResult['Code']) && ('0' == $providerResult['Code'])) {
  674.                         break;
  675.                     }
  676.                 }
  677.             } else {
  678.                 $providerResult null;
  679.             }
  680.             if (isset($providerResult['Code']) && ('0' != $providerResult['Code']) && (false === strpos($xmlRequest'AirCommandExecute'))) {
  681.                 if ((false !== strpos($providerResult['Message'], 'NO ITINERARY FOUND FOR REQUESTED')) ||
  682.                     (false !== strpos($providerResult['Message'], 'NO FARE FOUND FOR REQUESTED ITINERARY')) ||
  683.                     (false !== strpos($providerResult['Message'], 'No available flight found for the requested')) ||
  684.                     (false !== strpos($providerResult['Message'], 'No existe disponibilidad en estas fechas')) ||
  685.                     (false !== strpos($providerResult['Message'], 'Error en la respuesta del servicio, no se encontr')) ||
  686.                     (false !== strpos($providerResult['Message'], 'NO JOURNEY FOUND FOR REQUESTED ITINERARY')) ||
  687.                     (false !== strpos($providerResult['Message'], 'No se encontraron resultados o no se encontraron tarifas aplicables')) ||
  688.                     (false !== strpos($providerResult['Message'], 'No se permiten busquedas multidestino'))
  689.                 ) {
  690.                     $providerResult['Message'] = 'No existe disponibilidad para esta solicitud, por favor intenta con diferentes fechas o destinos.(66002 )';
  691.                 } elseif (!strpos($providerResult['Message'], '(66002 ')) {
  692.                     $this->aviaturRegisterException->log(
  693.                         $xmlRequest,
  694.                         $response
  695.                     );
  696.                 }
  697.                 return ['error' => (string) $providerResult['Message']];
  698.             }
  699.             if (isset($xmlResponseObject->Message) && (empty($xmlResponseObject->Message))) {
  700.                 $this->aviaturRegisterException->log(
  701.                     $xmlRequest,
  702.                     $response
  703.                 );
  704.                 return ['error' => 'Respuesta vacia de nuestro proveedor de servicios'];
  705.             }
  706.         } else {
  707.             $this->aviaturRegisterException->log(
  708.                 $xmlRequest,
  709.                 $response
  710.             );
  711.             return ['error' => '(66002 ) Error en la respuesta del servicio, no se encontró información'];
  712.         }
  713.         return $xmlResponseObject;
  714.     }
  715.     /**
  716.      * @param type $service
  717.      * @param type $provider
  718.      * @param type $providerId
  719.      *
  720.      * @return type
  721.      */
  722.     public function loginService($service$provider$providerId null)
  723.     {
  724.         $xmlResponseObject = [];
  725.         switch ($this->requestType) {
  726.             case 'BUS':
  727.                 $xml $this->getXmlLogin($providerId);
  728.                 $xmlResponseObject $this->callServiceBus($this->projectDir$service$provider$xml);
  729.                 break;
  730.             case 'MPA':
  731.             case 'MPB':
  732.             case 'MPB3':
  733.                 $expire time() + 7200;
  734.                 $token = [
  735.                     'e' => $expire '_' $this->random_str(4),
  736.                 ];
  737.                 $jwt explode('.'JWT::encode($token$this->loginKey));
  738.                 return $jwt[1] . '.' $jwt[2];
  739.                 break;
  740.             default:
  741.                 $expire time() + 7200;
  742.                 $token = [
  743.                     'e' => $expire '_' $this->random_str(4),
  744.                 ];
  745.                 $jwt explode('.'JWT::encode($token$this->loginKey));
  746.                 return $jwt[1] . '.' $jwt[2];
  747.         }
  748.         if (isset($xmlResponseObject['error'])) {
  749.             return $xmlResponseObject;
  750.         } else {
  751.             return $xmlResponseObject->Message->LoginRS->TransactionIdentifier;
  752.         }
  753.     }
  754.     /**
  755.      * @param type $providerId
  756.      *
  757.      * @return string
  758.      */
  759.     private function getXmlLogin($providerId)
  760.     {
  761.         $xml '<Request xmlns:mpa="http://amadeus.com/latam/mpa/2010/1">
  762.             <mpa:Command>Login</mpa:Command>
  763.             <mpa:Version>1.0</mpa:Version>
  764.             <mpa:Language>es</mpa:Language>
  765.             <mpa:ResponseType>XML</mpa:ResponseType>
  766.             <mpa:Target>Test</mpa:Target>
  767.             <mpa:MaxExecutionTime>200</mpa:MaxExecutionTime>
  768.             <mpa:PageSize>0</mpa:PageSize>
  769.             <mpa:PageNumber>1</mpa:PageNumber>
  770.             <mpa:CacheRefresh>true</mpa:CacheRefresh>
  771.             <mpa:Message>
  772.               <LoginRQ xmlns:mpa="http://amadeus.com/latam/mpa/2010/1">
  773.                 <mpa:UserIdentification>
  774.                   <mpa:Corporation>10000</mpa:Corporation>
  775.                   <mpa:Password>1234</mpa:Password>
  776.                       <mpa:Office>10001</mpa:Office>
  777.                 </mpa:UserIdentification>
  778.               </LoginRQ>
  779.             </mpa:Message>
  780.             <mpa:ProviderSettings>
  781.               <mpa:ProviderSetting>
  782.                 <mpa:Setting Key="ProviderId" Value="' $providerId '" />
  783.                 <mpa:Setting Key="Language" Value="ES" />
  784.               </mpa:ProviderSetting>
  785.             </mpa:ProviderSettings>
  786.           </Request>';
  787.         return $xml;
  788.     }
  789.     /**
  790.      * @param type $providerId
  791.      *
  792.      * @return string
  793.      */
  794.     private function getMpxXmlLogin()
  795.     {
  796.         $xml '<LoginRQ xmlns:mpa="http://amadeus.com/latam/mpa/2010/1">
  797.                 <mpa:UserIdentification>
  798.                   <mpa:Corporation>10000</mpa:Corporation>
  799.                   <mpa:Password>1234</mpa:Password>
  800.                   <mpa:Office>' $this->random_str(4) . '</mpa:Office>
  801.                 </mpa:UserIdentification>
  802.               </LoginRQ>';
  803.         return $xml;
  804.     }
  805.     public function random_str($length$keyspace '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')
  806.     {
  807.         $str '';
  808.         $max mb_strlen($keyspace'8bit') - 1;
  809.         for ($i 0$i $length; ++$i) {
  810.             $str .= $keyspace[random_int(0$max)];
  811.         }
  812.         return $str;
  813.     }
  814.     /**
  815.      * @param type $body
  816.      * @param type $method
  817.      * @param type $transactionId
  818.      * @param type $variable
  819.      *
  820.      * @return type
  821.      */
  822.     public function getXmlBusHeader($body$method$transactionId$variable)
  823.     {
  824.         $path $this->projectDir '/app/xmlService/busHeader.xml';
  825.         if ($this->session->has('officeId')) {
  826.             $xmlBase str_replace('{officeId}'$this->session->get('officeId'), simplexml_load_file($path)->asXML());
  827.         } else {
  828.             $xmlBase simplexml_load_file($path)->asXML();
  829.         }
  830.         if (isset($variable)) {
  831.             foreach (array_keys($variable) as $key) {
  832.                 if ('ProviderId' != $key) {
  833.                     $body str_replace('{' $key '}'$variable[$key], $body);
  834.                 }
  835.             }
  836.         }
  837.         $body str_replace('{transactionId}'$transactionId$body);
  838.         $arrayIndex = [
  839.             '{method}',
  840.             '{body}',
  841.         ];
  842.         $arrayValues = [
  843.             $method,
  844.             $body,
  845.         ];
  846.         $xmlBase simplexml_load_file($path)->asXML();
  847.         $xmlBase str_replace('{ProviderId}'$variable['ProviderId'], $xmlBase);
  848.         $xmlBase str_replace($arrayIndex$arrayValues$xmlBase);
  849.         return $xmlBase;
  850.     }
  851.     /**
  852.      * @param $body
  853.      * @param $method
  854.      * @param $transactionId
  855.      * @param $variable
  856.      * @param $ancillaries
  857.      *
  858.      * @return array|string|string[]|null
  859.      */
  860.     public function getXmlMpxHeader($body$method$transactionId$variable$ancillaries NULL)
  861.     {
  862.         $cacheRefresh $variable['cacheRefresh'] ?? 'true';
  863.         $cacheKey $variable['cacheKey'] ?? '';
  864.         $path $this->projectDir '/app/xmlService/' mb_strtolower($this->requestType) . 'Request.xml';
  865.         if ($this->session->has('officeId')) {
  866.             $xmlBase str_replace('{officeId}'$this->session->get('officeId'), simplexml_load_file($path)->asXML());
  867.         } else {
  868.             try {
  869.                 $xml simplexml_load_file($path);
  870.                 if ($xml === false) {
  871.                     throw new \Exception("Error cargando XML desde: " $path);
  872.                 }
  873.                 $xmlBase $xml->asXML();
  874.             } catch (\Exception $e) {
  875.                 throw new \Exception($e->getMessage() . " path: " $path);
  876.             }
  877.         }
  878.         if (isset($variable)) {
  879.             foreach (array_keys($variable) as $key) {
  880.                 if ('ProviderId' != $key && 'CoveredTraveler' != $key) {
  881.                     $body str_replace('{' $key '}'trim($variable[$key]), $body);
  882.                 }
  883.             }
  884.         }
  885.         $body str_replace('{transactionId}'$transactionId$body);
  886.         // If null or zero change it to zero
  887.         if (!$ancillaries) {
  888.             $ancillaries 0;
  889.         }
  890.         $body str_replace('{ancillaries}'$ancillaries$body);
  891.         $arrayIndex = [
  892.             '{method}',
  893.             '{body}',
  894.             '{cacheRefresh}',
  895.             '{cacheKey}',
  896.         ];
  897.         $arrayValues = [
  898.             $method,
  899.             $body,
  900.             $cacheRefresh,
  901.             $cacheKey,
  902.         ];
  903.         $xmlBase str_replace($arrayIndex$arrayValues$xmlBase);
  904.         $xmlBase str_replace('{ProviderId}'$variable['ProviderId'], $xmlBase);
  905.         $xmlBase preg_replace('/<\?xml.*?\?>/i'''$xmlBase);
  906.         return $xmlBase;
  907.     }
  908.     /**
  909.      * @param type $DocumentType
  910.      * @param type $Documentnumber
  911.      *
  912.      * @return type
  913.      */
  914.     public function getXmlUserB2C($DocumentType$Documentnumber)
  915.     {
  916.         $path $this->projectDir '/app/xmlService/mpaUserB2C.xml';
  917.         //Valores a remplazar
  918.         $arrayIndex = [
  919.             '{DocumentType}',
  920.             '{DocumentNumber}',
  921.         ];
  922.         //Nuevos valores
  923.         $arrayValues = [
  924.             $DocumentType,
  925.             $Documentnumber,
  926.         ];
  927.         //obtengo el xml base
  928.         $xmlBase simplexml_load_file($path)->asXML();
  929.         $xmlBase str_replace($arrayIndex$arrayValues$xmlBase);
  930.         return $xmlBase;
  931.     }
  932.     /**
  933.      * @param type $user
  934.      * @param type $secretKey
  935.      *
  936.      * @return type
  937.      */
  938.     public function encryptUser($user$secretKey)
  939.     {
  940.         $encryptUser '';
  941.         if ('test1' !== $user) {
  942.             $encryptUser hash_hmac('sha512'$user$secretKey false);
  943.         } else {
  944.             $encryptUser $user;
  945.         }
  946.         return $encryptUser;
  947.     }
  948.     public function setUrls($parameters)
  949.     {
  950.         $this->url $parameters->aviatur_service_web_url;
  951.         $this->urlMpa $parameters->aviatur_service_web_url_mpa;
  952.         $this->urlLoginMpb $parameters->aviatur_service_web_url_login_mpb;
  953.         $this->urlAirMpb $parameters->aviatur_service_web_url_air_mpb;
  954.         $this->urlHotelMpb $parameters->aviatur_service_web_url_hotel_mpb;
  955.         $this->urlCarMpb $parameters->aviatur_service_web_url_car_mpb;
  956.         $this->urlTicketMpb $parameters->aviatur_service_web_url_ticket_mpb;
  957.         $this->urlCruiseMpb $parameters->aviatur_service_web_url_cruise_mpb;
  958.         $this->urlEmission $parameters->aviatur_service_web_url_emission;
  959.         $this->requestId $parameters->aviatur_service_web_request_id;
  960.         $this->requestType $parameters->aviatur_service_web_request_type;
  961.         $this->serviceNameMpa $parameters->aviatur_service_web_mpa_method;
  962.         $this->urlPackageMpt $parameters->aviatur_service_web_mpb_mpt;
  963.         $this->urlInsuranceMpb $parameters->aviatur_service_web_url_insurance_mpb;
  964.         $this->urlBusMpb $parameters->aviatur_service_web_url_bus_mpb;
  965.         $this->urlTrainMpb $parameters->aviatur_service_web_url_train_mpb;
  966.         $this->urlExperience $parameters->aviatur_service_web_mpb_experience;
  967.     }
  968.     /**
  969.      * @param $service
  970.      * @param $provider
  971.      * @param $variable
  972.      *
  973.      * @return mixed
  974.      */
  975.     public function getTransactionId($service$provider$variable)
  976.     {
  977.         if ($this->session->has('transactionId')) {
  978.             $transactionId $this->loginService($service$provider$variable['ProviderId']);
  979.             if (isset($transactionId['error'])) {
  980.                 return $transactionId;
  981.             } else {
  982.                 $this->session->set($this->transactionIdSessionName, (string) $transactionId);
  983.             }
  984.         } else {
  985.             $transactionId $this->session->get('transactionId');
  986.         }
  987.         return $transactionId;
  988.     }
  989. }