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

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