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

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