src/Aviatur/FlightBundle/Controller/FlightResumeController.php line 128

Open in your IDE?
  1. <?php
  2. namespace Aviatur\FlightBundle\Controller;
  3. use Aviatur\DocumentationBundle\Models\DocumentationModel;
  4. use Aviatur\FlightBundle\Services\FlightResumeServices;
  5. use Aviatur\FlightBundle\Services\GenerateFlightResumeEmail;
  6. use Aviatur\FlightBundle\Services\SkyscannerTracker;
  7. use Aviatur\GeneralBundle\Services\AviaturEncoder;
  8. use Aviatur\GeneralBundle\Services\AviaturErrorHandler;
  9. use Aviatur\GeneralBundle\Services\AviaturWebService;
  10. use Aviatur\GeneralBundle\Services\ExceptionLog;
  11. use Aviatur\GeneralBundle\Util\DeviceData;
  12. use Aviatur\GeneralBundle\Util\GeneralUtilMethods;
  13. use Aviatur\InsuranceBundle\Services\InsuranceService;
  14. use Aviatur\PaymentBundle\Models\WorldModel;
  15. use Aviatur\TwigBundle\Services\TwigFolder;
  16. use Doctrine\Persistence\ManagerRegistry;
  17. use Knp\Snappy\Pdf;
  18. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  19. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  20. use Symfony\Component\HttpFoundation\Request;
  21. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  22. use Symfony\Component\Routing\RouterInterface;
  23. use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
  24. // use Knp\Snappy\GeneratorInterface;
  25. class FlightResumeController extends AbstractController
  26. {
  27.     /**
  28.      * @var ManagerRegistry
  29.      */
  30.     protected ManagerRegistry $managerRegistry;
  31.     protected $paymentMethod;
  32.     protected SessionInterface $session;
  33.     protected SkyscannerTracker $skyscannerTracker;
  34.     private $em;
  35.     private FlightResumeServices $flightResumeServices;
  36.     public function __construct(ManagerRegistry $managerRegistrySessionInterface $sessionSkyscannerTracker $skyscannerTrackerFlightResumeServices $flightResumeServices) {
  37.         $this->managerRegistry $managerRegistry;
  38.         $this->session $session;
  39.         $this->skyscannerTracker $skyscannerTracker;
  40.         $em $this->managerRegistry->getManager();
  41.         $this->em $em;
  42.         $agencyId $session->has('agencyId') ? $session->get('agencyId') : 1;
  43.         $agency $em->getRepository(\Aviatur\AgencyBundle\Entity\Agency::class)->find($agencyId);
  44.         $paymentMethods $this->managerRegistry->getRepository(\Aviatur\GeneralBundle\Entity\PaymentMethod::class)->findByCode(['pse''pseRest']);
  45.         $activePayments array_filter($paymentMethods, function($payment) use ($agency$em) {
  46.             $paymentMethodAgency $em->getRepository(\Aviatur\GeneralBundle\Entity\PaymentMethodAgency::class)
  47.                 ->findOneBy(['agency' => $agency->getId(), 'paymentMethod' => $payment->getId()]);
  48.             return $payment->getIsactive() && $paymentMethodAgency && $paymentMethodAgency->getIsactive();
  49.         });
  50.         switch (count($activePayments)) {
  51.             case 0:
  52.                 $this->paymentMethod null;
  53.                 break;
  54.             case 1:
  55.                 $this->paymentMethod reset($activePayments);
  56.                 break;
  57.             default:
  58.                 $paymentMethod $em->getRepository(\Aviatur\GeneralBundle\Entity\PaymentMethod::class)->findOneByCode('pseRest');
  59.                 $this->paymentMethod $paymentMethod;
  60.                 break;
  61.         }
  62.         $this->flightResumeServices $flightResumeServices;
  63.     }
  64.     public function paymentOutputAction(
  65.         Request $request,
  66.         RouterInterface $router,
  67.         SessionInterface $session,
  68.         ParameterBagInterface $parameterBag,
  69.         TwigFolder $twigFolder,
  70.         AuthorizationCheckerInterface $authorizationChecker,
  71.         AviaturEncoder $aviaturEncoder,
  72.         GenerateFlightResumeEmail $generateFlightResumeEmail,
  73.         AviaturWebService $webService,
  74.         InsuranceService $insuranceService,
  75.         Pdf $pdf,
  76.         AviaturErrorHandler $errorHandler,
  77.         ExceptionLog $exceptionLog,
  78.         \Swift_Mailer $mailer
  79.     ) {
  80.         $projectDir $parameterBag->get('kernel.project_dir');
  81.         $transactionIdSessionName $parameterBag->get('transaction_id_session_name');
  82.         $correlationIdSessionName $parameterBag->get('correlation_id_session_name');
  83.         $emailNotification $parameterBag->get('email_notification');
  84.         $em $this->em;
  85.         $transactionId $session->get($transactionIdSessionName);
  86.         $orderProductCode $session->get($transactionId '[flight][order]');
  87.         if (isset($orderProductCode->products) && $orderProductCode->products != null) {
  88.             $productId str_replace('PN'''json_decode($orderProductCode)->products ?? null);
  89.             $orderProduct $em->getRepository(\Aviatur\GeneralBundle\Entity\OrderProduct::class)->find($productId);
  90.         } else {
  91.             $bookingIds = [];
  92.             
  93.             // Verificamos los posibles índices de prepayment (0, 1 y el base)
  94.             $prepaymentKeys = ['[flight][prepayment]''[flight][prepayment0]''[flight][prepayment1]'];
  95.             
  96.             foreach ($prepaymentKeys as $key) {
  97.                 $xmlString $session->get($transactionId $key);
  98.                 if ($xmlString) {
  99.                     $xml simplexml_load_string($xmlString);
  100.                     if ($xml && isset($xml->Message->OTA_AirBookRS->AirReservation->BookingReferenceID['ID'])) {
  101.                         $id = (string) $xml->Message->OTA_AirBookRS->AirReservation->BookingReferenceID['ID'];
  102.                         if (!in_array($id$bookingIds)) {
  103.                             $bookingIds[] = $id;
  104.                         }
  105.                     }
  106.                 }
  107.             }
  108.             // Buscamos todos los productos asociados a esos PNRs
  109.             $orderProducts $em
  110.                 ->getRepository(\Aviatur\GeneralBundle\Entity\OrderProduct::class)
  111.                 ->findBy(['booking' => $bookingIds]);
  112.             // Para mantener la compatibilidad con el código siguiente que usa $orderProduct (singular)
  113.             $orderProduct = !empty($orderProducts) ? $orderProducts[0] : null;
  114.         }
  115.         $addProductDataStrXml explode('FILTRO'$orderProduct->getAddProductData());
  116.         $addProductData = \simplexml_load_string('<FILTRO'.$addProductDataStrXml[1].'FILTRO>');
  117.         $decodedResponseExperience null;
  118.         $voucherFilePDF null;
  119.         $fullRequest $request;
  120.         $transactionId $session->get($transactionIdSessionName);
  121.         if ($session->has($transactionId.'[flight][orderToValidateDuplicatePassengerOnFlight]')) {
  122.             $session->remove($transactionId.'[flight][orderToValidateDuplicatePassengerOnFlight]');
  123.         }
  124.         if ($session->has($transactionId '[typeCoin]')) {
  125.             $session->set('typeCoin'$session->get($transactionId '[typeCoin]'));
  126.         }
  127.         $orderProducts = [];
  128.         $resumeArray = [
  129.             'backDetail' => $this->generateUrl('aviatur_flight_retry_secure'),
  130.             'retryCount' => 0,
  131.             'transactionState' => [
  132.                 'combined_states' => false
  133.             ],
  134.             'infos' => [],
  135.         ];
  136.         $worldPayConciliacion $session->has($transactionId '[flight][worldpay_conciliacion]') ? $session->get($transactionId '[flight][worldpay_conciliacion]') : [];
  137.         if (!empty($worldPayConciliacion) && is_array($worldPayConciliacion)) {
  138.             $resumeArray['worldPayConciliacion'] = $worldPayConciliacion;
  139.         }
  140.         if ($session->has($transactionId '[flight][detail_data_flight]')) {
  141.             $correlationId $session->get($transactionId '[flight][' $correlationIdSessionName ']');
  142.             $isFront $session->has('operatorId');
  143.             $datosAgente simplexml_load_string($session->get('front_user'));
  144.             $gdsPnrs = [];
  145.             $airlinePnrs = [];
  146.             if (false !== strpos($correlationId'||')) {
  147.                 $correlationIds explode('||'$correlationId);
  148.                 $cantFlight count($correlationIds);
  149.                 
  150.                 foreach ($correlationIds as $key => $correlationId) {
  151.                     if (!$isFront && !$session->has($transactionId '[paylater]') &&  !$session->has($transactionId '[paylink]')) {
  152.                         $cantFlight count($resumeArray['infos']) > count($resumeArray['infos'][0]['journeySummaries'][0]['flightDetails']) : 0;
  153.                         $resumeTemp $this->resumeOutput($request$session$parameterBag$twigFolder$authorizationChecker,
  154.                             $aviaturEncoder$insuranceService$mailertrue$cantFlight$router$key
  155.                         );
  156.                         
  157.                         $gdsPnrs[] = $resumeTemp['resumeView']['paymentResume']['id'] ?? '';
  158.                         $airlinePnrs[] = $resumeTemp['resumeView']['paymentResume']['recordBooking'] ?? '';
  159.                         // combined_states cambia a true si los estados de pago de las transacciones son distintos
  160.                         if(isset($resumeArray['transactionState']['transaction_state']) && $resumeArray['transactionState']['transaction_state'] != $resumeTemp['resumeView']['paymentResume']['transaction_state']){
  161.                             $resumeArray['transactionState']['combined_states'] = true;
  162.                         }
  163.                         // Guardando el último método de pago
  164.                         $resumeArray['paymentMethod'] = $resumeTemp['resumeView']['paymentResume']['payment_gateway'];
  165.                         switch ($resumeTemp['resumeView']['paymentResume']['transaction_state']) {
  166.                             case 'OK':
  167.                             case 'APPROVED':
  168.                             case 1:
  169.                                 $resumeArray['transactionState']['transaction_state'] = 1;
  170.                                 break;
  171.                             case 'NOT_AUTHORIZED':
  172.                             case 2:
  173.                                 $resumeArray['transactionState']['transaction_state'] = 2;
  174.                                 break;
  175.                             case 'PENDING':
  176.                             case 3:
  177.                                 $resumeArray['transactionState']['transaction_state'] = 3;
  178.                                 break;
  179.                             default:
  180.                                 $resumeArray['transactionState']['transaction_state'] = 4;
  181.                                 break;
  182.                         }
  183.                         switch ($resumeTemp['resumeView']['paymentResume']['transaction_state_cyber']) {
  184.                             case 1:
  185.                                 if (!isset($resumeArray['transactionState']['transaction_state_cyber'])) {
  186.                                     $resumeArray['transactionState']['transaction_state_cyber'] = 1;
  187.                                 }
  188.                                 break;
  189.                             case 2:
  190.                                 if (!isset($resumeArray['transactionState']['transaction_state_cyber']) || ((isset($resumeArray['transactionState']['transaction_state_cyber'])) && (== $resumeArray['transactionState']['transaction_state_cyber']))) {
  191.                                     $resumeArray['transactionState']['transaction_state_cyber'] = 2;
  192.                                 }
  193.                                 break;
  194.                             default:
  195.                                 $resumeArray['transactionState']['transaction_state'] = 3;
  196.                                 break;
  197.                         }
  198.                         if (isset($resumeTemp['resumeView']['paymentResume']['paymentMethod']) && 'world' == $resumeTemp['resumeView']['paymentResume']['paymentMethod']) {
  199.                             $resumeArray['transactionState']['paymentMethod'] = $resumeTemp['resumeView']['paymentResume']['paymentMethod'];
  200.                         }
  201.                         $resumeArray['retryCount'] = (int) $session->get($transactionId '[flight][retry' $key ']');
  202.                         $resumeArray['infos'][] = $resumeTemp['resumeView'];
  203.                         $orderProducts[] = $resumeTemp['orderProduct'];
  204.                         if (isset($resumeArray['infos'][$key]['paymentResume'])) {
  205.                             if ('NOT_AUTHORIZED' == $resumeArray['infos'][$key]['paymentResume']['transaction_state']) {
  206.                                 $resumeArray['infos'][$key]['paymentResume']['transaction_state'] = '2';
  207.                             } elseif ('FAILED' == $resumeArray['infos'][$key]['paymentResume']['transaction_state']) {
  208.                                 $resumeArray['infos'][$key]['paymentResume']['transaction_state'] = '4';
  209.                             } elseif ('OK' == $resumeArray['infos'][$key]['paymentResume']['transaction_state'] || 'APPROVED' == $resumeArray['infos'][$key]['paymentResume']['transaction_state']) {
  210.                                 $resumeArray['infos'][$key]['paymentResume']['transaction_state'] = '1';
  211.                             } elseif ('PENDING' == $resumeArray['infos'][$key]['paymentResume']['transaction_state']) {
  212.                                 $resumeArray['infos'][$key]['paymentResume']['transaction_state'] = '3';
  213.                             }
  214.                         }
  215.                     } else {
  216.                         $orderInfo json_decode($session->get($transactionId '[flight][order' $key ']'));
  217.                         $productId str_replace('PN'''$orderInfo->products);
  218.                         $orderProduct $em->getRepository(\Aviatur\GeneralBundle\Entity\OrderProduct::class)->find($productId);
  219.                         $orderProducts[] = $orderProduct;
  220.                         $resumeArray['infos'][$key] = json_decode($generateFlightResumeEmail->GenerateEmail($orderProducttrue$key), true);
  221.                         
  222.                         // Fallback para llaves de sesión de prepago por tramo
  223.                         $pKey = ($key === && !$session->has($transactionId '[flight][prepayment0]')) 
  224.                             ? '[flight][prepayment]' 
  225.                             '[flight][prepayment' $key ']';
  226.                         
  227.                         $xmlSegment $session->get($transactionId $pKey);
  228.                         $currentGds '';
  229.                         $currentAir '';
  230.                         if ($xmlSegment) {
  231.                             $xmlObj simplexml_load_string($xmlSegment);
  232.                             if ($xmlObj && isset($xmlObj->Message->OTA_AirBookRS->AirReservation->BookingReferenceID['ID'])) {
  233.                                 $currentGds = (string) $xmlObj->Message->OTA_AirBookRS->AirReservation->BookingReferenceID['ID'];
  234.                                 $currentAir = (string) $xmlObj->Message->OTA_AirBookRS->AirReservation->BookingReferenceID->TPA_Extensions->AirlineBookingCode;
  235.                             }
  236.                         }
  237.                         if (empty($currentAir)) { $currentAir $orderProduct->getBooking(); }
  238.                         if (empty($currentGds)) { $currentGds $orderProduct->getBooking(); }
  239.                         $resumeArray['infos'][$key]['paymentResume']['id'] = $currentGds;
  240.                         $resumeArray['infos'][$key]['paymentResume']['recordBooking'] = $currentAir;
  241.                         $gdsPnrs[] = $currentGds;
  242.                         $airlinePnrs[] = $currentAir;
  243.                     }
  244.                     if ($session->has($transactionId '[multi][cash_result]')) {
  245.                         $resumeArray['infos'][$key]['paymentResume']['transaction_state'] = 3;
  246.                     }
  247.                 }
  248.             } else {
  249.                 if (!$isFront && !$session->has($transactionId '[paylater]') && !$session->has($transactionId '[paylink]')) {
  250.                     $resumeTemp $this->resumeOutput($request$session$parameterBag$twigFolder,
  251.                         $authorizationChecker$aviaturEncoder$insuranceService$mailerfalse0$router0
  252.                     );
  253.                     $resumeArray['transactionState']['transaction_state_cyber'] = $resumeTemp['resumeView']['paymentResume']['transaction_state_cyber'];
  254.                     $resumeArray['transactionState']['transaction_state'] = $resumeTemp['resumeView']['paymentResume']['transaction_state'];
  255.                     $resumeArray['paymentMethod'] = $resumeTemp['resumeView']['paymentResume']['payment_gateway'];
  256.                     $resumeArray['retryCount'] = (int) $session->get($transactionId '[flight][retry]');
  257.                     $resumeArray['infos'][0] = $resumeTemp['resumeView'];
  258.                     $orderProducts[0] = $resumeTemp['orderProduct'];
  259.                     $gdsPnrs[] = $resumeTemp['resumeView']['paymentResume']['id'] ?? '';
  260.                     $airlinePnrs[] = $resumeTemp['resumeView']['paymentResume']['recordBooking'] ?? '';
  261.                 } else {
  262.                     $resumeArray['transactionState']['transaction_front'] = 1;
  263.                     $orderInfo json_decode($session->get($transactionId '[flight][order]'));
  264.                     $productId str_replace('PN'''$orderInfo->products);
  265.                     $orderProducts[0] = $em->getRepository(\Aviatur\GeneralBundle\Entity\OrderProduct::class)->find($productId);
  266.                     $resumeArray['infos'][0] = json_decode($generateFlightResumeEmail->GenerateEmail($orderProducts[0], false), true);
  267.                     // Extraemos códigos del XML en sesión para el segmento único
  268.                     $xmlSegment $session->get($transactionId '[flight][prepayment]');
  269.                     if ($xmlSegment) {
  270.                         $xmlObj simplexml_load_string($xmlSegment);
  271.                         if ($xmlObj && isset($xmlObj->Message->OTA_AirBookRS->AirReservation->BookingReferenceID['ID'])) {
  272.                             $resumeArray['infos'][0]['paymentResume']['id'] = (string) $xmlObj->Message->OTA_AirBookRS->AirReservation->BookingReferenceID['ID'];
  273.                             $resumeArray['infos'][0]['paymentResume']['recordBooking'] = (string) $xmlObj->Message->OTA_AirBookRS->AirReservation->BookingReferenceID->TPA_Extensions->AirlineBookingCode;
  274.                         }
  275.                     }
  276.                     if (empty($resumeArray['infos'][0]['paymentResume']['recordBooking'])) {
  277.                         $resumeArray['infos'][0]['paymentResume']['recordBooking'] = $orderProducts[0]->getBooking();
  278.                     }
  279.                     $resumeArray['infos'][0]['paymentResume']['id'] = !empty($resumeArray['infos'][0]['paymentResume']['id']) ? $resumeArray['infos'][0]['paymentResume']['id'] : $orderProducts[0]->getBooking();
  280.                     
  281.                     $gdsPnrs[] = $resumeArray['infos'][0]['paymentResume']['id'];
  282.                     $airlinePnrs[] = $resumeArray['infos'][0]['paymentResume']['recordBooking'];
  283.                 }
  284.                 if ($session->has($transactionId '[multi][cash_result]')) {
  285.                     $resumeArray['infos'][0]['paymentResume']['transaction_state'] = 3;
  286.                 }
  287.             }
  288.             if (!$isFront && !$session->has($transactionId '[paylater]') && !$session->has($transactionId '[paylink]')) {
  289.                 if ('NOT_AUTHORIZED' == $resumeArray['transactionState']['transaction_state']) {
  290.                     $resumeArray['transactionState']['transaction_state'] = '2';
  291.                 } elseif ('FAILED' == $resumeArray['transactionState']['transaction_state']) {
  292.                     $resumeArray['transactionState']['transaction_state'] = '4';
  293.                 } elseif ('OK' == $resumeArray['transactionState']['transaction_state'] || 'APPROVED' == $resumeArray['transactionState']['transaction_state']) {
  294.                     $resumeArray['transactionState']['transaction_state'] = '1';
  295.                 } elseif ('PENDING' == $resumeArray['transactionState']['transaction_state']) {
  296.                     $resumeArray['transactionState']['transaction_state'] = '3';
  297.                 }
  298.                 if ('NOT_AUTHORIZED' == $resumeArray['infos'][0]['paymentResume']['transaction_state']) {
  299.                     $resumeArray['infos'][0]['paymentResume']['transaction_state'] = '2';
  300.                 } elseif ('FAILED' == $resumeArray['infos'][0]['paymentResume']['transaction_state']) {
  301.                     $resumeArray['infos'][0]['paymentResume']['transaction_state'] = '4';
  302.                 } elseif ('OK' == $resumeArray['infos'][0]['paymentResume']['transaction_state'] || 'APPROVED' == $resumeArray['infos'][0]['paymentResume']['transaction_state']) {
  303.                     $resumeArray['infos'][0]['paymentResume']['transaction_state'] = '1';
  304.                 } elseif ('PENDING' == $resumeArray['infos'][0]['paymentResume']['transaction_state']) {
  305.                     $resumeArray['infos'][0]['paymentResume']['transaction_state'] = '3';
  306.                 }
  307.             }
  308.             //get passenger infos for Front
  309.             if ($isFront || $session->has($transactionId '[paylater]') || $session->has($transactionId '[paylink]')) {
  310.                 $productXml explode('FILTRO'$orderProducts[0]->getAddproductdata());
  311.                 $productObj = \simplexml_load_string('<FILTRO' $productXml[1] . 'FILTRO>');
  312.                 $resumeArray['travelers'] = [];
  313.                 $key 0;
  314.                 foreach ($productObj->data->product->passengers->passenger as $passenger) {
  315.                     $resumeArray['travelers'][$key]['typeCode'] = (string) $passenger->type;
  316.                     $resumeArray['travelers'][$key]['GivenName'] = (string) $passenger->first_name;
  317.                     $resumeArray['travelers'][$key]['Surname'] = (string) $passenger->first_last_name;
  318.                     ++$key;
  319.                 }
  320.             }
  321.             $agencyFolder $twigFolder->twigFlux();
  322.             $route $router->match(str_replace($fullRequest->getSchemeAndHttpHost(), ''$fullRequest->getUri()));
  323.             $isMulti false !== strpos($route['_route'], 'multi') ? true false;
  324.             if ($session->has($transactionId '[flight][cash_result]')) {
  325.                 $resumeArray['cash_result'] = json_decode($session->get($transactionId '[flight][cash_result]'), true);
  326.             }
  327.             if (isset($resumeArray['infos'][0]['paymentResume']['id_context'])) {
  328.                 $voucherFilePDF $projectDir '/app/serviceLogs/CashTransaction/ON' $resumeArray['infos'][0]['paymentResume']['id_context'] . '_' $transactionId '.pdf';
  329.                 if (file_exists($voucherFilePDF)) {
  330.                     $resumeArray['NameArchive'] = 'ON' $resumeArray['infos'][0]['paymentResume']['id_context'] . '_' $transactionId '.pdf';
  331.                 }
  332.             }
  333.             $TotalInfos count($resumeArray['infos']);
  334.             if ($session->has($transactionId '[assist][payout_extra]')) {
  335.                 $orderInsurance json_decode($session->get($transactionId '[assist][order]'));
  336.                 $productInsurance str_replace('PN'''$orderInsurance->products);
  337.                 $orderProductInsurance $em->getRepository(\Aviatur\GeneralBundle\Entity\OrderProduct::class)->find($productInsurance);
  338.                 $decodedResponseInsurance json_decode($aviaturEncoder->AviaturDecode($orderProductInsurance->getPayresponse(), $orderProductInsurance->getPublicKey()));
  339.                 if (isset($decodedResponseInsurance->x_response_code)) {
  340.                     $resumeArray['transaction_state_insurance'] = $decodedResponseInsurance->x_response_code;
  341.                     $resumeArray['transaction_state_cyber_insurance'] = $decodedResponseInsurance->x_response_code;
  342.                 } elseif (isset($decodedResponseExperience->getTransactionInformationResult)) {
  343.                     $resumeArray['transaction_state_insurance'] = $decodedResponseExperience->getTransactionInformationResult->responseCode;
  344.                     $resumeArray['transaction_state_cyber_insurance'] = $decodedResponseExperience->getTransactionInformationResult->responseCode;
  345.                 }
  346.                 $returnInfo $insuranceService->addInfoResume($resumeArray$transactionId);
  347.                 $resumeArray['InsuranceTransaction'] = $returnInfo['InsuranceTransaction'];
  348.                 $resumeArray['OrderInsurance'] = $returnInfo['OrderInsurance'];
  349.                 $resumeArray['InsuranceDescription'] = $returnInfo['InsuranceDescription'];
  350.                 $resumeArray['descriptionInsurance'] = $returnInfo['descriptionInsurance'];
  351.                 $resumeArray['InsuranceType'] = $returnInfo['InsuranceType'];
  352.                 $resumeArray['infos'][$TotalInfos] = $returnInfo;
  353.                 if ($session->has($transactionId '[assist][Emision]')) {
  354.                     $xml simplexml_load_string($session->get($transactionId '[assist][Emision]'), \SimpleXMLElement::class, LIBXML_NOCDATA);
  355.                     if (isset($xml->RESPUESTA->ESTADO) && 'ERROR' == $xml->RESPUESTA->ESTADO) {
  356.                         $resumeArray['ErrorInsurance'] = $xml->RESPUESTA->ESTADO;
  357.                     }
  358.                 }
  359.             }
  360.             if ($session->has($transactionId '[experience][payout_extra]')) {
  361.                 $TotalInfos count($resumeArray['infos']);
  362.                 $payoutExtrasValues json_decode($session->get($transactionId '[flight][payout_extra_values]'));
  363.                 $count 0;
  364.                 foreach ($payoutExtrasValues as $key => $payoutExtraValues) {
  365.                     if ('EXPERIENCE' == $payoutExtraValues->name) {
  366.                         $infoDates json_decode($session->get($transactionId '[experience][infoDates][' $key ']'), true);
  367.                         $orderExperience json_decode($session->get($transactionId '[experience][order' $key ']'));
  368.                         $productExperience str_replace('PN'''$orderExperience->products);
  369.                         $orderProductExperience $em->getRepository(\Aviatur\GeneralBundle\Entity\OrderProduct::class)->find($productExperience);
  370.                         $decodedResponseExperience json_decode($aviaturEncoder->AviaturDecode($orderProductExperience->getPayresponse(), $orderProductExperience->getPublicKey()));
  371.                         if (isset($decodedResponseExperience->x_response_code)) {
  372.                             $resumeArray['Experiences'][$count]['transaction_state_experience'] = $decodedResponseExperience->x_response_code;
  373.                             $resumeArray['Experiences'][$count]['transaction_state_cyber_experience'] = $decodedResponseExperience->x_response_code;
  374.                             $resumeArray['Experiences'][$count]['x_response_reason_text'] = $decodedResponseExperience->x_response_reason_text;
  375.                         } elseif (isset($decodedResponseExperience->getTransactionInformationResult)) {
  376.                             $resumeArray['Experiences'][$count]['transaction_state_experience'] = $decodedResponseExperience->getTransactionInformationResult->responseCode;
  377.                             $resumeArray['Experiences'][$count]['transaction_state_cyber_experience'] = $decodedResponseExperience->getTransactionInformationResult->responseCode;
  378.                             $resumeArray['Experiences'][$count]['x_response_reason_text'] = $decodedResponseExperience->getTransactionInformationResult->responseReasonText;
  379.                         } else {
  380.                             $resumeArray['Experiences'][$count]['transaction_state_experience'] = 2;
  381.                             $resumeArray['Experiences'][$count]['x_response_reason_text'] = '';
  382.                         }
  383.                         $resumeArray['Experiences'][$count]['ProductName'] = (string) $infoDates['datesTransaction']['ProductName'];
  384.                         $resumeArray['Experiences'][$count]['description'] = (string) $infoDates['datesTransaction']['Description'];
  385.                         $resumeArray['Experiences'][$count]['reference'] = (string) $orderExperience->products;
  386.                         $resumeArray['Experiences'][$count]['id_booking'] = (string) $orderExperience->products;
  387.                         $resumeArray['Experiences'][$count]['id_context'] = (string) $orderExperience->products;
  388.                         $resumeArray['Experiences'][$count]['total_amount'] = (string) $infoDates['AmountTotal'];
  389.                         $resumeArray['Experiences'][$count]['CurrencyCode'] = (string) $infoDates['datesTransaction']['CurrencyCode'];
  390.                         $resumeArray['Experiences'][$count]['Incluye'] = (string) $infoDates['datesTransaction']['Incluye'];
  391.                         $resumeArray['Experiences'][$count]['type'] = 'Experiencias';
  392.                         ++$count;
  393.                     }
  394.                 }
  395.             }
  396.             $resumeArray['routerType'] = $resumeArray['infos'][0]['routerType'];
  397.             if (($session->has($transactionId '[flight][cash_result]') && !$isMulti) && !$session->has($transactionId '[emission_baloto_email]')) {
  398.                 $resumeArray['exportPDF'] = true;
  399.                 $resumeArray array_merge($resumeArray$resumeArray['infos'][0]);
  400.                 $ruta '@AviaturTwig/' $agencyFolder '/General/Templates/email.html.twig';
  401.                 if (!file_exists($voucherFilePDF)) {
  402.                     $resumeArray['NameArchive'] = 'ON' $resumeArray['infos'][0]['paymentResume']['id_context'] . '_' $transactionId '.pdf';
  403.                     $pdf->generateFromHtml($this->renderView($twigFolder->twigExists('@AviaturTwig/' $agencyFolder '/General/Templates/email_cash.html.twig'), $resumeArray), $voucherFilePDF);
  404.                 }
  405.                 $clientEmail $resumeArray['infos'][0]['paymentResume']['client_email'];
  406.                 $setTo = ['soportepagoelectronico@aviatur.com.co''soptepagelectronic@aviatur.com'$clientEmail];
  407.                 $resumeArray['exportPDF'] = false;
  408.                 $vouchersFiles = [];
  409.                 $documentationChild false;
  410.                 $doradoPass false;
  411.                 $EOHProtocol false;
  412.                 $destinationADZ false;
  413.                 $internationalDestination false;
  414.                 $infoCovidTest false;
  415.                 $passengerChild 0;
  416.                 $response = \simplexml_load_string($session->get($transactionId '[flight][detail]'));
  417.                 $childrens $response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItinerary->OriginDestinationOptions['ChdQuantity'];
  418.                 $infants $response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItinerary->OriginDestinationOptions['InfQuantity'];
  419.                 if ($childrens || $infants 0) {
  420.                     $passengerChild $passengerChild 1;
  421.                 }
  422.                 foreach ($resumeArray['infos'] as $info) {
  423.                     $fJourney $info['journeySummaries'];
  424.                     foreach ($fJourney as $segmentJourney) {
  425.                         $fDetail $segmentJourney['flightDetails'];
  426.                         foreach ($fDetail as $segmentFlight) {
  427.                             if ('CO' != $segmentFlight['ArrivalCountryCode'] && $passengerChild 0) {
  428.                                 $documentationChild true;
  429.                             }
  430.                             if ('BOG' == $segmentFlight['DepartureAirport'] && null == $segmentFlight['waitingTime']) {
  431.                                 $doradoPass true;
  432.                             }
  433.                             if ('EOH' == $segmentFlight['DepartureAirport'] && null == $segmentFlight['waitingTime']) {
  434.                                 $EOHProtocol true;
  435.                             }
  436.                             if ('ADZ' == $segmentFlight['DepartureAirport']) {
  437.                                 $destinationADZ true;
  438.                             }
  439.                             if ('CO' != $segmentFlight['ArrivalCountryCode']) {
  440.                                 $internationalDestination true;
  441.                             }
  442.                         }
  443.                     }
  444.                 }
  445.                 $resumeArray['documentationChild'] = $documentationChild;
  446.                 /* Validación ADZ o destinos internacionales boton pruebas COVID-19 */
  447.                 if (true == $destinationADZ || true == $internationalDestination) {
  448.                     $infoCovidTest true;
  449.                 }
  450.                 $resumeArray['infoCovidTest'] = $infoCovidTest;
  451.                 $resumeArray['redirectParams'] = $resumeArray['redirectParams'] ?? null;
  452.                 $resumeArray['skyscanner_pixel'] = $resumeArray['skyscanner_pixel'] ?? null;
  453.                 $message = (new \Swift_Message())
  454.                     ->setContentType('text/html')
  455.                     ->setFrom($session->get('emailNoReply'))
  456.                     ->setTo($setTo)
  457.                     ->setBcc($emailNotification)
  458.                     ->setSubject($session->get('agencyShortName') . ' - Transacción Efectivo Creada ' $resumeArray['infos'][0]['paymentResume']['id_context'])
  459.                     ->attach(\Swift_Attachment::fromPath($voucherFilePDF))
  460.                     ->setBody(
  461.                         $this->renderView($twigFolder->twigExists($ruta), $resumeArray)
  462.                     );
  463.                 if (count($vouchersFiles) > 0) {
  464.                     foreach ($vouchersFiles as $file) {
  465.                         $message->attach(\Swift_Attachment::fromPath($file));
  466.                     }
  467.                 }
  468.                 try {
  469.                     $mailer->send($message);
  470.                     $session->set($transactionId '[emission_baloto_email]''emailed');
  471.                 } catch (\Exception $ex) {
  472.                     $exceptionLog->log(var_dump($message), $ex);
  473.                 }
  474.             }
  475.                 if($session->has($transactionId '[paylater]') || $session->has($transactionId '[paylink]')){
  476.                 $resumeArray['typePay'] = $session->has($transactionId '[paylink]') ? 'paylink' 'paylater';
  477.                 $resumeArray['paymentMethod'] = $session->has($transactionId '[paylink]') ? 'paylink' 'paylater';                                                         
  478.                 $urlResume $twigFolder->twigExists('@AviaturTwig/' $agencyFolder '/Flight/Default/resumeC.html.twig');
  479.             }else{
  480.                 /* La ruta de las plantillas de ancillaries es aviatur/Flux, y se debe enviar una variable para no dejarla quemada en los Twig */
  481.                 $resumeArray['ancTwigRoute'] = "aviatur/Flux";
  482.                 $urlResume $twigFolder->twigExists('@AviaturTwig/' $agencyFolder '/Flight/Default/resume.html.twig');
  483.             }
  484.             // expose supposedly unique transaction info
  485.             $resumeArray['agencyData'] = $resumeArray['infos'][0]['agencyData'];
  486.             if (isset($resumeArray['infos'][0]['travelers'])) {
  487.                 $resumeArray['travelers'] = $resumeArray['infos'][0]['travelers'];
  488.             }
  489.             if (isset($resumeArray['infos'][0]['facturationResume'])) {
  490.                 $resumeArray['transactionInfo'] = [
  491.                     'facturationResume' => $resumeArray['infos'][0]['facturationResume'],
  492.                 ];
  493.             }
  494.             if (isset($resumeArray['transactionState']['transaction_state'])) {
  495.                 if (== $resumeArray['transactionState']['transaction_state']) {
  496.                     $resumeArray['transactionPayments'][] = $resumeArray['infos'][0]['paymentResume'];
  497.                 } elseif (isset($resumeArray['transactionState']['paymentMethod']) && 'world' == $resumeArray['transactionState']['paymentMethod']) {
  498.                     $resumeArray['transactionPayments'][] = $resumeArray['infos'][0]['paymentResume'];
  499.                 } else {
  500.                     foreach ($resumeArray['infos'] as $info) {
  501.                         $resumeArray['transactionPayments'][] = $info['paymentResume'];
  502.                     }
  503.                 }
  504.             }
  505.             if (!$isFront) {
  506.                 $resumeArray['infos'][0]['renderWebbingInfo'] = $this->verifyWebbingCandidate($request,$parameterBag,$mailer,$orderProducts);
  507.             }
  508.             if ($isMulti) {
  509.                 return $this->json($resumeArray);
  510.             }
  511.             $confirmedTickets = [];
  512.             $emission_error false;
  513.             foreach ($resumeArray['travelers'] as $tickets) {
  514.                 if(!empty($tickets['Ticket'])){
  515.                     array_push($confirmedTickets$tickets['Ticket']);
  516.                 }
  517.             }
  518.             if (empty($confirmedTickets)) {
  519.                 $emission_error true;
  520.             }
  521.             $totalPaymentStatus =  $this->flightResumeServices->formatThankYouPageData($resumeArray['infos'],!$isFront $resumeArray['paymentMethod']: null);
  522.             $resumeArray['totalPaymentStatus'] = $totalPaymentStatus;
  523.             $sentTickets false;
  524.             if ($session->has($transactionId '[PriceType]')) {
  525.                 $priceTypeF = (false === \strpos((string) $session->get($transactionId '[PriceType]'), '|')) ? (string) $session->get($transactionId '[PriceType]') : \explode('|', (string) $session->get($transactionId '[PriceType]'));
  526.                 $resumeArray['PriceType'] = $priceTypeF;
  527.             }
  528.             if(isset($resumeTemp['resumeView']['redirectParams'])){
  529.                 $resumeArray['redirectParams'] = $resumeTemp['resumeView']['redirectParams'];
  530.             }
  531.             if (isset($resumeTemp['resumeView']['skyscanner_pixel'])) {
  532.                 $resumeArray['skyscanner_pixel'] = $resumeTemp['resumeView']['skyscanner_pixel'];
  533.             }
  534.             $resumeArray += ['redirectParams' => $resumeArray['redirectParams'] ?? null,
  535.             'skyscanner_pixel' => $resumeArray['skyscanner_pixel'] ?? null,];
  536.             if($isFront){
  537.                 date_default_timezone_set('UTC');
  538.                 $timefront = (int) floor(microtime(true));
  539.                 $cotizacion $session->get($transactionId.'[cotizacion]');
  540.                 $componente $session->get($transactionId.'[componente]');
  541.                 $aviaturPlusPay $em->getRepository(\Aviatur\GeneralBundle\Entity\Parameter::class)->findOneByName('Aviatur_plus_pay')->getValue();
  542.                 $resumeArray['Total'] = $session->get($transactionId.'[valueButton]');
  543.                 $resumeArray['cotizacion'] = $cotizacion;
  544.                 $resumeArray['agent'] = $datosAgente->USUARIO_ORACLE;
  545.                 $resumeArray['componente'] = $componente;
  546.                 $resumeArray['timefront'] = $timefront;
  547.                 $resumeArray['aviaturPlusPay'] = json_decode($aviaturPlusPay true);
  548.                 $resumeArray['aviaturPlusAllow'] = $datosAgente->AVIATURPLUS ?? 0;
  549.                 
  550.                 // Consolidar todos los PNRs de los trayectos en el campo global para visualización en facturación
  551.                 $resumeArray['paymentResume']['id'] = implode(' / '$gdsPnrs);
  552.                 $resumeArray['paymentResume']['recordBooking'] = implode(' / '$airlinePnrs);
  553.                 
  554.                 $resumeArray['journeySummaries']['flightDetails'][0]['CodeAirline'] = $addProductData->data->product->aerolinea;
  555.             }
  556.             $resumeOrderProducts $this->render($urlResume$resumeArray);
  557.             foreach ($orderProducts as $orderProduct) {
  558.                 $emailData = \json_decode($orderProduct->getEmail());
  559.                 if (empty($emailData)) {
  560.                     $emailData = new \stdClass();
  561.                 }
  562.                 $emailData->resumeInfo = [
  563.                     'travelers' => $resumeArray['travelers'] ?? null,
  564.                     'agencyData' => $resumeArray['agencyData'],
  565.                     'transactionInfo' => $resumeArray['transactionInfo'] ?? null,
  566.                     'transactionState' => $resumeArray['transactionState'] ?? null,
  567.                     'transactionPayments' => $resumeArray['transactionPayments'] ?? null,
  568.                     'infos' => $resumeArray['infos'],
  569.                     'agencyId' => $session->get('agencyId'),
  570.                     'deviceUser' => (new DeviceData())->getInfo()
  571.                 ];
  572.                 $orderProduct->setEmail(\json_encode($emailData));
  573.                 $orderProduct->setResume(base64_encode(gzcompress($resumeOrderProducts)));
  574.                 $em->persist($orderProduct);
  575.                 $em->flush();
  576.                 // generate resume tickets email
  577.                 if (!$isFront && !$session->has($transactionId '[paylater]') && !$session->has($transactionId '[paylink]') && isset($resumeArray['transactionState']['transaction_state']) && isset($resumeArray['transactionState']['transaction_state_cyber']) && == $resumeArray['transactionState']['transaction_state'] && != $resumeArray['transactionState']['transaction_state_cyber'] && !$session->has($transactionId '[emission][ticket_mail]')) {
  578.                     try {
  579.                         // $generateFlightTicketEmail->GenerateTicketEmail($orderProduct);
  580.                         $session->set($transactionId '[emission][ticket_mail]'true);
  581.                     } catch (\Exception $th) {
  582.                     }
  583.                 }
  584.             }
  585.             if(isset($resumeArray["transactionPayments"][0]["paymentMethod"]) && $resumeArray["transactionPayments"][0]["paymentMethod"] == "world") {
  586.                 $tickets = []; // Array para almacenar todos los tickets
  587.                 foreach ($resumeArray['infos'] as $info) {
  588.                     // Verifica si 'travelers' existe y es un array
  589.                     if (isset($info['travelers']) && is_array($info['travelers'])) {
  590.                         // Extrae los tickets y los añade al array principal
  591.                         $tickets array_merge($ticketsarray_column($info['travelers'], 'Ticket'));
  592.                     }
  593.                 }
  594.                 // Une todos los tickets con "/"
  595.                 $resumeArray['worldPayConciliacion']['totalPasajeros'] = implode('/'$tickets);
  596.                 $WorldModel = new WorldModel();
  597.                 $rqConciliacion $WorldModel->sendConciliacionesWorldPay($resumeArray['worldPayConciliacion']);
  598.                 $sendConciliacionWorldPay $webService->callWebService('GENERALLAVE''dummy|http://www.aviatur.com.co/dummy/'$rqConciliacion);
  599.             }
  600.             if ($session->has($transactionId '[experience][payout_extra]')) {
  601.                 $payoutExtrasValues json_decode($session->get($transactionId '[flight][payout_extra_values]'));
  602.                 foreach ($payoutExtrasValues as $key => $payoutExtraValues) {
  603.                     if ('EXPERIENCE' == $payoutExtraValues->name) {
  604.                         $orderProductCode $session->get($transactionId '[experience][order' $key ']');
  605.                         $productId str_replace('PN'''json_decode($orderProductCode)->products);
  606.                         $orderProductExperience $em->getRepository(\Aviatur\GeneralBundle\Entity\OrderProduct::class)->find($productId);
  607.                         $orderProductExperience->setEmail(\json_encode($emailData));
  608.                         $orderProductExperience->setResume(base64_encode(gzcompress($resumeOrderProducts)));
  609.                     }
  610.                 }
  611.             }
  612.             if ($session->has($transactionId '[assist][payout_extra]')) {
  613.                 $insuranceService->InsuranceResume($transactionId$resumeOrderProducts);
  614.             }
  615.             if ($session->has($transactionId '[redemptionPoints][isRedimed]')) {
  616.                 $session->remove($transactionId '[redemptionPoints][isRedimed]');
  617.             }
  618.             return $resumeOrderProducts;
  619.         } else {
  620.             return $this->redirect($errorHandler->errorRedirect($twigFolder->pathWithLocale('aviatur_general_homepage'), '''Acceso no autorizado'));
  621.         }
  622.     }
  623.     public function resumeOutput(
  624.         Request $request,
  625.         SessionInterface $session,
  626.         ParameterBagInterface $parameterBag,
  627.         TwigFolder $twigFolder,
  628.         AuthorizationCheckerInterface $authorizationChecker,
  629.         AviaturEncoder $aviaturEncoder,
  630.         InsuranceService $insuranceService,
  631.         \Swift_Mailer $mailer,
  632.         $combination,
  633.         $cantFlight,
  634.         RouterInterface $router,
  635.         $segment null
  636.     ) {
  637.         //$baseURL = $request->server->get('HTTP_X_FORWARDED_PROTO')."://".$request->server->get('HTTP_X_FORWARDED_HOST')."/";
  638.         $baseURL 'https://'$request->getHost().'/';
  639.         $paymentCode $this->paymentMethod->getCode() === 'pse' 'pse' 'pseRest';
  640.         $projectDir $parameterBag->get('kernel.project_dir');
  641.         $transactionIdSessionName $parameterBag->get('transaction_id_session_name');
  642.         $route $router->match(str_replace($request->getSchemeAndHttpHost(), ''$request->getUri()));
  643.         $isMulti false !== strpos($route['_route'], 'multi');
  644.         $clientFranquice = [];
  645.         $messageAgent null;
  646.         $detailXml null;
  647.         $dateBirth = [];
  648.         $passanger_type = [];
  649.         $em $this->em;
  650.         $agency $em->getRepository(\Aviatur\AgencyBundle\Entity\Agency::class)->find($session->get('agencyId'));
  651.         $transactionId $session->get($transactionIdSessionName);
  652.         $postDataJson $session->get($transactionId '[flight][detail_data_flight]');
  653.         $paymentData json_decode($postDataJson);
  654.         $dataPayment json_decode($postDataJsontrue);
  655.         $customer $em->getRepository(\Aviatur\CustomerBundle\Entity\Customer::class)->find($paymentData->BD->id);
  656.         if ($combination) {
  657.             $orderProductCode $session->get($transactionId '[flight][order' $segment ']');
  658.             
  659.             $pKey = ($segment === || $segment === '0' || $segment === null) && !$session->has($transactionId '[flight][prepayment' $segment ']')
  660.                 ? '[flight][prepayment]'
  661.                 '[flight][prepayment' $segment ']';
  662.             $prepaymentInfo = \simplexml_load_string((string) $session->get($transactionId $pKey));
  663.             $valueBaseAmount = (string) $prepaymentInfo->Message->OTA_AirBookRS->AirReservation->PriceInfo->ItinTotalFare->BaseFare['Amount'];
  664.         } else {
  665.             $orderProductCode $session->get($transactionId '[flight][order]');
  666.             $prepaymentInfo = \simplexml_load_string($session->get($transactionId '[flight][prepayment]'));
  667.             $valueBaseAmount = (string) $prepaymentInfo->Message->OTA_AirBookRS->AirReservation->PriceInfo->ItinTotalFare->BaseFare['Amount'];
  668.         }
  669.         $productId str_replace('PN'''json_decode($orderProductCode)->products);
  670.         $orderProduct $em->getRepository(\Aviatur\GeneralBundle\Entity\OrderProduct::class)->find($productId);
  671.         $currentGds = (string) ($prepaymentInfo->Message->OTA_AirBookRS->AirReservation->BookingReferenceID['ID'] ?? $orderProduct->getBooking());
  672.         $currentAir = (string) ($prepaymentInfo->Message->OTA_AirBookRS->AirReservation->BookingReferenceID->TPA_Extensions->AirlineBookingCode ?? $orderProduct->getBooking());
  673.         if (empty($currentAir)) { $currentAir $orderProduct->getBooking(); }
  674.         if (empty($currentGds)) { $currentGds $orderProduct->getBooking(); }
  675.         $productRequest $aviaturEncoder->AviaturDecode($orderProduct->getPayRequest(), $orderProduct->getPublicKey());
  676.         $productResponse $aviaturEncoder->AviaturDecode($orderProduct->getPayResponse(), $orderProduct->getPublicKey());
  677.         $opRequest json_decode($productRequest);
  678.         $opResponse json_decode($productResponse);
  679.         $updatePaymentDataStrXML explode('FILTRO'$orderProduct->getUpdatePaymentData());
  680.         $updatePaymentData = \simplexml_load_string('<FILTRO'.$updatePaymentDataStrXML[1].'FILTRO>');
  681.         $addProductDataStrXml explode('FILTRO'$orderProduct->getAddProductData());
  682.         $addProductData = \simplexml_load_string('<FILTRO'.$addProductDataStrXml[1].'FILTRO>');
  683.         if (isset($opResponse->x_franchise) && ('' != $opResponse->x_franchise)) {
  684.             $franquiceCode str_replace(['CR_''RM_''CDNSA'], ['''''CS'], $opResponse->x_franchise);
  685.             if (isset($opRequest->paymentMethod) && 'world' == $opRequest->paymentMethod) {
  686.                 $clientFranquice $em->getRepository(\Aviatur\GeneralBundle\Entity\Card::class)->findOneByWorldpaycode($franquiceCode);
  687.             } else {
  688.                 $clientFranquice $em->getRepository(\Aviatur\GeneralBundle\Entity\Card::class)->findOneByPaymentgatewaycode($franquiceCode);
  689.             }
  690.         } else {
  691.             $clientFranquice['description'] = '----';
  692.             if (isset($opRequest->paymentMethod) && 'world' == $opRequest->paymentMethod) {
  693.                 $clientFranquice['description'] = 'World Pay';
  694.             }
  695.         }
  696.         // ARRAY FOR PASSENGERS INFOS //-----
  697.         $travelers = [];
  698.         $passengersInfo = [];
  699.         if ((true === $session->has($transactionId '[emission]')) || (true === $session->has($transactionId '[emission' $segment ']'))) {
  700.             if ($combination) {
  701.                 $tiquetEmission simplexml_load_string((string) $session->get($transactionId '[emission' $segment ']'));
  702.             } else {
  703.                 $tiquetEmission simplexml_load_string((string) $session->get($transactionId '[emission]'));
  704.             }
  705.             $count 1;
  706.             foreach ($tiquetEmission->dataElementsMaster->dataElementsIndiv as $ticket) {
  707.                 if ('FA' == $ticket->elementManagementData->segmentName) {
  708.                     $ticketInfo preg_split('/[\/,\s,-]+/'$ticket->otherDataFreetext->longFreetext);
  709.                     foreach ($ticket->referenceForDataElement->reference as $reference) {
  710.                         if ('PT' == $reference->qualifier) {
  711.                             $referenceNumber = (string) $reference->number;
  712.                             if ('' == $referenceNumber) {
  713.                                 $referenceNumber $count;
  714.                             }
  715.                         }
  716.                     }
  717.                     $passengersInfo[$referenceNumber][$ticketInfo[0]]['Ticket'] = $ticketInfo[2];
  718.                     ++$count;
  719.                 }
  720.             }
  721.             $passengerCount 1;
  722.             foreach ($tiquetEmission->travellerInfo as $passengersData) {
  723.                 $referenceNumber = (int) $passengersData->elementManagementPassenger->reference->number;
  724.                 if (count($passengersData->passengerData) >= 2) {
  725.                     foreach ($passengersData->passengerData as $passangerData) {
  726.                         $passangerData->travellerInformation->passenger->type trim((string) $passangerData->travellerInformation->passenger->type);
  727.                         $passengerType = ('INF' != (string) $passangerData->travellerInformation->passenger->type) ? 'PAX' : (string) $passangerData->travellerInformation->passenger->type;
  728.                         $passengersInfo[$referenceNumber][$passengerType]['Count'] = $passengerCount;
  729.                         $passengersInfo[$referenceNumber][$passengerType]['typeCode'] = (string) $passangerData->travellerInformation->passenger->type;
  730.                         $passengersInfo[$referenceNumber][$passengerType]['GivenName'] = ucwords(mb_strtolower((string) $passangerData->travellerInformation->passenger->firstName));
  731.                         $passengersInfo[$referenceNumber][$passengerType]['Surname'] = ucwords(mb_strtolower((string) $passangerData->travellerInformation->traveller->surname));
  732.                         /* Para incluir la nacionalidad como dato que se debe considerar en la documentación del viaje */
  733.                         $passengersInfo[$referenceNumber][$passengerType]['Nationality'] = (string) (isset($addProductData) ? $this->getNationalityByAddProductData($addProductData, (string)mb_strtolower($passangerData->travellerInformation->passenger->type), (string)mb_strtolower($passangerData->travellerInformation->passenger->firstName), (string)mb_strtolower($passangerData->travellerInformation->traveller->surname)) : "CO");
  734.                         /* Se va a incluir un arreglo vacío para los links de documentación de viaje */
  735.                         $passengersInfo[$referenceNumber][$passengerType]['docLinks'] = [];
  736.                         ++$passengerCount;
  737.                     }
  738.                 } else {
  739.                     foreach ($passengersData->passengerData->travellerInformation->passenger as $passangerData) {
  740.                         $passangerData->type trim((string) $passangerData->type);
  741.                         $passengerType = ('INF' != (string) $passangerData->type) ? 'PAX' : (string) $passangerData->type;
  742.                         $passengersInfo[$referenceNumber][$passengerType]['Count'] = $passengerCount;
  743.                         $passengersInfo[$referenceNumber][$passengerType]['typeCode'] = (string) $passangerData->type;
  744.                         $passengersInfo[$referenceNumber][$passengerType]['GivenName'] = ucwords(mb_strtolower((string) $passangerData->firstName));
  745.                         $passengersInfo[$referenceNumber][$passengerType]['Surname'] = ucwords(mb_strtolower(isset($passangerData->surname) ? (string) $passangerData->surname : (string) $passengersData->passengerData->travellerInformation->traveller->surname));
  746.                         /* Para incluir la nacionalidad como dato que se debe considerar en la documentación del viaje */
  747.                         $passengersInfo[$referenceNumber][$passengerType]['Nationality'] = (string) (isset($addProductData) ? $this->getNationalityByAddProductData($addProductData, (string)mb_strtolower($passangerData->type), (string)mb_strtolower($passangerData->firstName), (string)mb_strtolower(isset($passangerData->surname) ? (string) $passangerData->surname : (string) $passengersData->passengerData->travellerInformation->traveller->surname)) : "CO");
  748.                         /* Se va a incluir un arreglo vacío para los links de documentación de viaje */
  749.                         $passengersInfo[$referenceNumber][$passengerType]['docLinks'] = [];
  750.                         ++$passengerCount;
  751.                     }
  752.                 }
  753.             }
  754.             foreach ($passengersInfo as $passengers) {
  755.                 foreach ($passengers as $passenger) {
  756.                     $travelers[@$passenger['Count']] = $passenger;
  757.                     unset($travelers[@$passenger['Count']]['Count']);
  758.                 }
  759.             }
  760.         }else{
  761.             $travelers = [];
  762.             if(isset($addProductData)){
  763.                 foreach ($addProductData->data->product->passengers->passenger as $passenger) {
  764.                     $numPassanger = (int) $passenger->passenger_number;
  765.                     $travelers[$numPassanger]['Ticket'] = "";
  766.                     $travelers[$numPassanger]['typeCode'] = (string) $passenger->type;
  767.                     $travelers[$numPassanger]['GivenName'] = (string) $passenger->first_name;
  768.                     $travelers[$numPassanger]['Surname'] = (string) $passenger->first_last_name;
  769.                     /* Para incluir la nacionalidad como dato que se debe considerar en la documentación del viaje */
  770.                     $travelers[$numPassanger]['Nationality'] = (string) $passenger->nationality;
  771.                     /* Se va a incluir un arreglo vacío para los links de documentación de viaje */
  772.                     $travelers[$numPassanger]['docLinks'] = [];
  773.                 }
  774.             }
  775.         }
  776.         // Array
  777.         if (isset($opRequest->x_service_fee_base) && !isset($opResponse->createTransactionPaymentResponseInformation)) {
  778.             $reasonDescription utf8_decode($opResponse->x_response_reason_text);
  779.             if(isset($opResponse->x_ta_response_reason_text)){
  780.                 $taReasonDescription utf8_decode($opResponse->x_ta_response_reason_text);
  781.             }
  782.             // En caso de iva = 0, agregamos como otros impuestos el airport tax
  783.             if ($opRequest->x_tax === 0) {
  784.                 $airport_tax $opRequest->x_airport_tax;
  785.             } else {
  786.                 $airport_tax $opResponse->x_amount $opRequest->x_airport_tax $opRequest->x_tax - (!= $opRequest->x_amount_base $opRequest->x_amount_base $opResponse->x_amount);
  787.             }
  788.             $paymentResume = [
  789.                 'transaction_state' => $opResponse->x_response_code,
  790.                 'ta_transaction_state' => $opResponse->x_ta_response_code ?? '',
  791.                 'id' => $currentGds,
  792.                 'recordBooking' => $currentAir,
  793.                 'id_context' => $opRequest->x_invoice_num,
  794.                 'total_amount' => $opResponse->x_amount $opRequest->x_airport_tax $opRequest->x_service_fee,
  795.                 'currency' => $opResponse->x_bank_currency,
  796.                 'amount' => != $opRequest->x_amount_base $opRequest->x_amount_base $opResponse->x_amount,
  797.                 'base_amount' => $valueBaseAmount,
  798.                 'iva' => $opRequest->x_tax,
  799.                 'airport_tax' => $airport_tax,
  800.                 'x_service_fee' => (int) $opRequest->x_service_fee,
  801.                 'fee_base' => $opRequest->x_service_fee_base,
  802.                 'fee_tax' => $opRequest->x_service_fee_tax,
  803.                 'ip_address' => $opRequest->x_customer_ip,
  804.                 'bank_name' => $opResponse->x_bank_name ?? '',
  805.                 'client_franquice' => ['description' => (is_object($clientFranquice) ? $clientFranquice->getDescription() : $clientFranquice['description'])],
  806.                 'cuotas' => $opRequest->x_differed,
  807.                 'card_num' => isset($opRequest->x_card_num) ? '************' substr($opRequest->x_card_numstrlen($opRequest->x_card_num) - 4) : '',
  808.                 'reference' => $opResponse->x_transaction_id,
  809.                 'auth' => $opResponse->x_approval_code,
  810.                 'transaction_date' => $opResponse->x_transaction_date,
  811.                 'description' => $opResponse->x_description,
  812.                 'reason_code' => $opResponse->x_response_reason_code,
  813.                 'reason_description' => utf8_encode($reasonDescription),
  814.                 'client_names' => $opResponse->x_first_name ' ' $opResponse->x_last_name,
  815.                 'client_email' => $opResponse->x_email,
  816.                 'client_document_number' => isset($opResponse->x_cust_id) ? $opResponse->x_cust_id $opRequest->x_cust_id,
  817.                 'client_phone' => isset($opResponse ->x_phone) ? $opResponse ->x_phone $opRequest->x_phone,
  818.                 'ta_reason_code' => $opResponse->x_ta_response_reason_code,
  819.                 'ta_auth' => $opResponse->x_ta_approval_code,
  820.                 'ta_reference' => $opResponse->x_ta_transaction_id ?? ''
  821.             ];
  822.             if(isset($opResponse->x_ta_response_reason_text)){
  823.                 $paymentResume["ta_reason_description"] = $taReasonDescription;
  824.             }
  825.             if (isset($opRequest->paymentMethod) && 'world' == $opRequest->paymentMethod) {
  826.                 if ($session->has($transactionId '[Fligth_Markup_Kiwi]')) {
  827.                     $paymentResume['total_amount'] += $session->get($transactionId '[Fligth_Markup_Kiwi]');
  828.                 }
  829.                 $paymentResume['paymentMethod'] = $opRequest->paymentMethod;
  830.             }
  831.             if (isset($opRequest->paymentMethod) && 'davivienda' == $opRequest->paymentMethod) {
  832.                 if (isset($opResponse->davivienda)) {
  833.                     $paymentResume['davivienda'] = $opResponse->davivienda;
  834.                 } elseif (isset($opResponse->onlyRedemption) && $opResponse->onlyRedemption) {
  835.                     $paymentResume['davivienda'] = $opResponse;
  836.                     $paymentResume['airport_tax'] = $opRequest->x_airport_tax;
  837.                     if ($combination) {
  838.                         $paymentResume['total_amount'] = ($opRequest->x_amount $opRequest->x_airport_tax $opRequest->x_service_fee);
  839.                         $paymentResume['amount'] = != $opRequest->x_amount_base $opRequest->x_amount_base $opRequest->x_amount;
  840.                     } else {
  841.                         $paymentResume['total_amount'] = ($opRequest->x_amount $opRequest->x_airport_tax $opRequest->x_service_fee);
  842.                     }
  843.                 } else {
  844.                     $paymentResume['davivienda'] = $opResponse;
  845.                     $paymentResume['amount'] = != $opRequest->x_amount_base $opRequest->x_amount_base $opRequest->x_amount;
  846.                     $paymentResume['total_amount'] = ($opRequest->x_amount $opRequest->x_airport_tax $opRequest->x_service_fee);
  847.                 }
  848.                 $points 0;
  849.                 $pointsAmount 0;
  850.                 if (isset($opRequest->redemptionValue) && isset($opRequest->x_davivienda_pricePoints) && $opRequest->x_davivienda_pricePoints 0) {
  851.                     $points ceil($opRequest->redemptionValue $opRequest->x_davivienda_pricePoints);
  852.                     $pointsAmount = ($points $opRequest->x_davivienda_pricePoints);
  853.                 }
  854.                 if (isset($paymentResume['davivienda'])) {
  855.                     $paymentResume['davivienda']->points $points;
  856.                     $paymentResume['davivienda']->points_amount $pointsAmount;
  857.                     $paymentResume['davivienda']->onlyRedemption $opRequest->onlyRedemption ?? false;
  858.                 }
  859.                 if (isset($opResponse->x_total_amount_card)) {
  860.                     /* the transaction is rejected */
  861.                     $paymentResume['total_amount'] = $opResponse->x_total_amount_card;
  862.                     $paymentResume['amount'] = $opResponse->x_amount_card;
  863.                 }
  864.             }
  865.             // Agregar informacion relacionada a redencion de puntos aval
  866.             if (isset($opRequest->redemptionValue) && isset($opRequest->redemptionPoints)) {
  867.                 $paymentResume['isRedeemingAvalPoints'] = true;
  868.                 if (isset($opRequest->onlyRedemption)) {
  869.                     $paymentResume['isOnlyRedemption'] = true;
  870.                     $paymentResume['messageRedemption'] = 'Esta transacción se realizó únicamente con puntos.';
  871.                     $paymentResume['redemptionPoints'] = $opRequest->redemptionPoints;
  872.                     $paymentResume['redemptionValue'] = $opRequest->redemptionValue;
  873.                 } elseif (isset($opRequest->combinedEmission)) {
  874.                     $paymentResume['isCombinedEmission'] = true;
  875.                     $paymentResume['messageRedemption'] = 'Transacción realizada mediante combinación de puntos y tarjeta de crédito.';
  876.                     $paymentResume['redemptionPoints'] = $opRequest->redemptionPoints;
  877.                     $paymentResume['redemptionValue'] = $opRequest->redemptionValue;
  878.                 }
  879.             }
  880.         } elseif (isset($opResponse->x_description) && !isset($opResponse->createTransactionPaymentResponseInformation)) {
  881.             $paymentResume = [
  882.                 'transaction_state' => $opResponse->x_response_code,
  883.                 'ta_transaction_state' => $opResponse->x_ta_response_code,
  884.                 'id' => $currentGds,
  885.                 'recordBooking' => $currentAir,
  886.                 'id_context' => $opRequest->x_invoice_num,
  887.                 'total_amount' => $opResponse->x_amount + ($opRequest->x_airport_tax ?? 0),
  888.                 'currency' => $opResponse->x_bank_currency,
  889.                 'amount' => $opRequest->x_amount_base,
  890.                 'base_amount' => $valueBaseAmount,
  891.                 'iva' => $opRequest->x_tax,
  892.                 'airport_tax' => $opResponse->x_amount + ($opRequest->x_airport_tax ?? 0) - $opRequest->x_amount_base $opRequest->x_tax,
  893.                 'ip_address' => $opRequest->x_customer_ip,
  894.                 'bank_name' => $opResponse->x_bank_name,
  895.                 'client_franquice' => ['description' => $clientFranquice->getDescription()],
  896.                 'cuotas' => $opRequest->x_differed,
  897.                 'card_num' => '************' substr($opRequest->x_card_numstrlen($opRequest->x_card_num) - 4),
  898.                 'reference' => $opResponse->x_transaction_id,
  899.                 'auth' => $opResponse->x_approval_code,
  900.                 'transaction_date' => $opResponse->x_transaction_date,
  901.                 'description' => $opResponse->x_description,
  902.                 'reason_code' => $opResponse->x_response_reason_code,
  903.                 'reason_description' => $opResponse->x_response_reason_text,
  904.                 'client_names' => $opResponse->x_first_name ' ' $opResponse->x_last_name,
  905.                 'client_email' => $opResponse->x_email,
  906.                 'ta_reason_code' => $opResponse->x_ta_response_reason_code,
  907.                 'ta_auth' => $opResponse->x_ta_approval_code,
  908.                 'ta_reference' => $opResponse->x_ta_transaction_id,
  909.             ];
  910.         } elseif (isset($opRequest->dataTransf) && !isset($opResponse->createTransactionPaymentResponseInformation)) {
  911.             if (isset($opRequest->notificationRequest->{'urn:OperationActivityNotifiedRequest'})) :
  912.                 $state $opRequest->notificationRequest->{'urn:OperationActivityNotifiedRequest'}->{'urn:ListOfOperationsActivityNotified'}->{'urn1:ConfirmOperation'}->{'urn1:OperationStatus'};
  913.                 if (102 == $state) :
  914.                     $state 1;
  915.                     $reason_description 'Pago de la transacción fue notificada al Usuario';
  916.                 elseif (101 == $state) :
  917.                     $state 2;
  918.                     $reason_description 'SafetyPay recibe la confirmación de pago del Banco';
  919.                 endif;
  920.                 $paymentResume = [
  921.                     'transaction_state' => $state,
  922.                     'id' => $currentGds,
  923.                     'recordBooking' => $currentAir,
  924.                     'client_franquice' => ['description' => 'SafetyPay'],
  925.                     'id_context' => $opRequest->tokenRequest->{'urn:ExpressTokenRequest'}->{'urn:MerchantSalesID'},
  926.                     'currency' => $opRequest->dataTransf->x_currency,
  927.                     'total_amount' => $opRequest->tokenRequest->{'urn:ExpressTokenRequest'}->{'urn:Amount'},
  928.                     'amount' => null,
  929.                     'base_amount' => $valueBaseAmount,
  930.                     'iva' => null,
  931.                     'airport_tax' => null,
  932.                     'ip_address' => $opRequest->dataTransf->dirIp,
  933.                     'reference' => $opRequest->tokenRequest->{'urn:ExpressTokenRequest'}->{'urn:MerchantSalesID'},
  934.                     'auth' => $opRequest->notificationRequest->{'urn:OperationActivityNotifiedRequest'}->{'urn:ListOfOperationsActivityNotified'}->{'urn1:ConfirmOperation'}->{'urn1:OperationID'},
  935.                     'transaction_date' => $opResponse->payResponse->OperationResponse->ResponseDateTime,
  936.                     'description' => $opRequest->dataTransf->x_description,
  937.                     'reason_code' => $opRequest->notificationRequest->{'urn:OperationActivityNotifiedRequest'}->{'urn:ListOfOperationsActivityNotified'}->{'urn1:ConfirmOperation'}->{'urn1:OperationStatus'},
  938.                     'reason_description' => $reason_description,
  939.                     'client_names' => $opRequest->dataTransf->x_first_name ' ' $opRequest->dataTransf->x_last_name,
  940.                     'client_email' => $opRequest->dataTransf->x_email,
  941.                 ];
  942.             else :
  943.                 $paymentResume = [
  944.                     'transaction_state' => 2,
  945.                     'id' => $currentGds,
  946.                     'recordBooking' => $currentAir,
  947.                     'id_context' => $opRequest->tokenRequest->{'urn:ExpressTokenRequest'}->{'urn:MerchantSalesID'},
  948.                     'currency' => $opRequest->dataTransf->x_currency,
  949.                     'total_amount' => $opRequest->dataTransf->x_total_amount,
  950.                     'client_franquice' => ['description' => 'SafetyPay'],
  951.                     'amount' => null,
  952.                     'base_amount' => $valueBaseAmount,
  953.                     'iva' => null,
  954.                     'ip_address' => $opRequest->dataTransf->dirIp,
  955.                     'airport_tax' => null,
  956.                     'reference' => $opRequest->dataTransf->x_reference,
  957.                     'auth' => null,
  958.                     'transaction_date' => $opRequest->tokenRequest->{'urn:ExpressTokenRequest'}->{'urn:RequestDateTime'},
  959.                     'description' => $opRequest->dataTransf->x_description,
  960.                     'reason_code' => 101,
  961.                     'reason_description' => 'Transacción creada',
  962.                     'client_names' => $opRequest->dataTransf->x_first_name ' ' $opRequest->dataTransf->x_last_name,
  963.                     'client_email' => $opRequest->dataTransf->x_email,
  964.                 ];
  965.             endif;
  966.         } elseif (isset($opRequest->infoCash)) {
  967.             $paymentResume = [
  968.                 'transaction_state' => 2,
  969.                 'id' => $currentGds,
  970.                 'recordBooking' => $currentAir,
  971.                 'id_booking' => $opRequest->infoCash->x_booking,
  972.                 'id_context' => $opRequest->infoCash->x_reference,
  973.                 'currency' => $opRequest->infoCash->x_currency,
  974.                 'total_amount' => $opRequest->infoCash->x_total_amount,
  975.                 'client_franquice' => ['description' => 'Efectivo'],
  976.                 'amount' => null,
  977.                 'base_amount' => $valueBaseAmount,
  978.                 'iva' => null,
  979.                 'ip_address' => $opRequest->infoCash->dirIp,
  980.                 'airport_tax' => null,
  981.                 'reference' => $opRequest->infoCash->x_reference,
  982.                 'auth' => null,
  983.                 'transaction_date' => $opRequest->infoCash->x_fechavigencia,
  984.                 'description' => $opRequest->infoCash->x_description,
  985.                 'reason_code' => 101,
  986.                 'reason_description' => 'Transacción creada',
  987.                 'client_names' => $opRequest->infoCash->x_first_name ' ' $opRequest->infoCash->x_last_name,
  988.                 'client_email' => $opRequest->infoCash->x_email,
  989.                 'client_document_number' => $opRequest->infoCash->x_doc_num,
  990.                 'client_phone' => $opRequest->infoCash->x_phone,
  991.                 'fecha_vigencia' => $opRequest->infoCash->x_fechavigencia,
  992.             ];
  993.             $cash_result json_decode($session->get($transactionId '[flight][cash_result]'));
  994.             $paymentResume['transaction_state'] = 3;
  995.             if ('' == $cash_result) {
  996.                 $paymentResume['transaction_state'] = 2;
  997.             }
  998.         } else {
  999.             // Obtener codigo de banco por metodo de pago seleccionado
  1000.             if ($paymentCode === 'pse') {
  1001.                 $bank_code = isset($opRequest->bankCode) ? (int) $opRequest->bankCode 0;
  1002.             } else {
  1003.                 $bank_code = isset($opRequest->instrument->redirection->additional->bankCode) ? (int) $opRequest->instrument->redirection->additional->bankCode 0;
  1004.             }
  1005.             $bank_info $em->getRepository(\Aviatur\PaymentBundle\Entity\PseBank::class)->findOneByCode($bank_code);
  1006.             $bank_name $bank_info->getName();
  1007.             $devolutionBase $paymentCode === 'pse' $opRequest->devolutionBase ?? $opRequest->x_devolution_base 0;
  1008.             $taxAmount $paymentCode === 'pse' $opRequest->taxAmount ?? $opRequest->x_tax_amount 0;
  1009.             $totalAmount $paymentCode === 'pse' $opRequest->totalAmount ?? $opRequest->x_total_amount $opRequest->payment->amount->total;
  1010.             if ((== $devolutionBase) && (== $taxAmount)) {
  1011.                 $addProductXml explode('FILTRO'$orderProduct->getAddproductdata());
  1012.                 $addProductObj = \simplexml_load_string('<FILTRO' $addProductXml[1] . 'FILTRO>');
  1013.                 $amount = (string) $addProductObj->data->product->fare_data->fare->base_amount;
  1014.                 $airportTax $totalAmount $amount;
  1015.             } else {
  1016.                 $amount $devolutionBase;
  1017.                 $airportTax $totalAmount - ($devolutionBase $taxAmount);
  1018.             }
  1019.             if($paymentCode != 'pse' && isset($opResponse->getTransactionInformationResult->status->status)) {
  1020.                 switch ($opResponse->getTransactionInformationResult->status->status) {
  1021.                     case 'OK':
  1022.                     case 'APPROVED':
  1023.                     case 'APPROVED_PARTIAL':
  1024.                     case 1:
  1025.                         $opResponse->getTransactionInformationResult->status->status "1";
  1026.                         break;
  1027.                     case 'REJECTED':
  1028.                     case 'PARTIAL_EXPIRED':
  1029.                     case 'NOT_AUTHORIZED':
  1030.                     case 2:
  1031.                         $opResponse->getTransactionInformationResult->status->status "2";
  1032.                         break;
  1033.                     case strpos($opResponse->getTransactionInformationResult->status->status"PENDING"):
  1034.                     case 'MANUAL':
  1035.                     case 3:
  1036.                         $opResponse->getTransactionInformationResult->status->status "3";
  1037.                         break;
  1038.                     default:
  1039.                         $opResponse->getTransactionInformationResult->status->status "4";
  1040.                         break;
  1041.                 }
  1042.             }
  1043.             $responseCode $paymentCode === 'pse' $opResponse->getTransactionInformationResult->responseCode ?? $opResponse->getTransactionInformationResult->transactionState
  1044.                 $opResponse->getTransactionInformationResult->status->status;
  1045.             $currency $paymentCode === 'pse' $opRequest->currency ?? $opRequest->x_currency
  1046.                 $opRequest->payment->amount->currency ?? $opRequest->x_currency;
  1047.             $reference $paymentCode === 'pse' $opRequest->reference ?? $opRequest->x_reference
  1048.                 $opRequest->payment->reference ?? $opRequest->x_reference;
  1049.             $transactionID $paymentCode === 'pse' $opResponse->createTransactionResult->transactionID ?? $opResponse->id_transaccion
  1050.                 $opResponse->getTransactionInformationResult->receipt ?? $opResponse->internalReference ?? $opResponse->id_transaccion;
  1051.             $responseReasonCode $paymentCode === 'pse' $opResponse->getTransactionInformationResult->responseReasonCode ?? null
  1052.                 $opResponse->getTransactionInformationResult->status->reason ?? null;
  1053.             $responseReasonText $paymentCode === 'pse' $opResponse->getTransactionInformationResult->responseReasonText ?? null
  1054.                 $opResponse->getTransactionInformationResult->status->message ?? null;
  1055.             $description $paymentCode === 'pse' $opRequest->description ?? $opRequest->x_description
  1056.                 $opRequest->payment->description ?? $opRequest->x_description;
  1057.             $emailAddress $paymentCode === 'pse' $opRequest->payer->emailAddress ?? $opRequest->x_email
  1058.                 $opRequest->payer->email ?? $opRequest->x_email;
  1059.             $auth $paymentCode === 'pse' $opResponse->getTransactionInformationResult->trazabilityCode $opResponse->getTransactionInformationResult->authorization ?? $opResponse->getTransactionInformationResult->receipt;
  1060.             $transactionDate $paymentCode === 'pse' $opResponse->getTransactionInformationResult->bankProcessDate $opResponse->getTransactionInformationResult->status->date;
  1061.             $clientNames $paymentCode === 'pse' $opRequest->payer->firstName ' ' $opRequest->payer->lastName $opRequest->payer->name ' ' $opRequest->payer->surname;
  1062.             /* Datos complementarios */
  1063.             $payerDocumentNumber = ($opRequest->payer->document ?? $opRequest->x_cust_id);
  1064.             $payerMobile $opRequest->payer->mobile ?? $opRequest->x_phone ?? '';
  1065.             $fee_base $opRequest->feeBase ?? $opRequest->x_service_fee_base ?? 0;
  1066.             $fee_tax $opRequest->feeTax ?? $opRequest->x_service_fee_tax ?? 0;
  1067.             $paymentResume = [
  1068.                 'transaction_state' => $responseCode,
  1069.                 'id' => $currentGds,
  1070.                 'recordBooking' => $currentAir,
  1071.                 'id_context' => $reference,
  1072.                 'currency' => $currency,
  1073.                 'total_amount' => $totalAmount,
  1074.                 'amount' => $amount,
  1075.                 'base_amount' => $valueBaseAmount,
  1076.                 'iva' => $taxAmount,
  1077.                 'airport_tax' => $airportTax,
  1078.                 'ip_address' => $opRequest->ipAddress,
  1079.                 'bank_name' => $bank_name,
  1080.                 'client_franquice' => ['description' => is_object($clientFranquice) ? $clientFranquice->getDescription() : 'PSE'],
  1081.                 'reference' => $transactionID,
  1082.                 'auth' => $auth,
  1083.                 'transaction_date' => $transactionDate,
  1084.                 'description' => $description,
  1085.                 'reason_code' => $responseReasonCode,
  1086.                 'reason_description' => $responseReasonText,
  1087.                 'client_names' => $clientNames,
  1088.                 'client_email' => $emailAddress,
  1089.                 'client_document_number' => $payerDocumentNumber,
  1090.                 'client_phone' => $payerMobile,
  1091.                 'card_num' => '--',
  1092.                 'cuotas' => '--',
  1093.                 'fee_base' => $fee_base,
  1094.                 'fee_tax' => $fee_tax,
  1095.             ];
  1096.         }
  1097.         $paymentResume['transaction_state_cyber'] = $opResponse->x_response_code_cyber ?? '1';
  1098.         // Método de pago desde los datos de pago del detalle o el campo payment_gateway del XML de updatePaymentData
  1099.         $payment_gateway_type '';
  1100.         if(isset($updatePaymentData)){
  1101.             $payment_gateway_type = (string) ($updatePaymentData->data->products->product->payment_data->payment_gateway) ?? '';
  1102.         }
  1103.         $paymentResume['payment_gateway'] = $dataPayment['PD']['type'] ?? $payment_gateway_type ?? '';
  1104.         // Array for facturation infos
  1105.         if ($session->has($transactionId '[flight][provider]')) {
  1106.             $providersId json_decode($session->get($transactionId '[flight][provider]'), true);
  1107.             $providersName = [];
  1108.             if (is_array($providersId)) {
  1109.                 foreach ($providersId as $idprovider) {
  1110.                     $providerObject $em->getRepository(\Aviatur\MpaBundle\Entity\Provider::class)->findOneByProvideridentifier($idprovider);
  1111.                     $providerName str_replace(' ''_'$providerObject->getName());
  1112.                     if (!in_array($providerName$providersName)) {
  1113.                         $providersName[] = $providerName;
  1114.                     }
  1115.                 }
  1116.             } else {
  1117.                 $providersName[] = (string) $providersId;
  1118.             }
  1119.             if (!empty($providersName)) {
  1120.                 $paymentResume['providers'] = $providersName;
  1121.             }
  1122.         }
  1123.         if (false !== strpos($paymentData->BD->first_name'***')) {
  1124.             $facturationResume = [
  1125.                 'customer_names' => $customer->getFirstname() . ' ' $customer->getLastname(),
  1126.                 'customer_address' => $customer->getAddress(),
  1127.                 'customer_doc_num' => $customer->getDocumentnumber(),
  1128.                 'customer_phone' => $customer->getPhone(),
  1129.                 'customer_email' => $customer->getEmail(),
  1130.             ];
  1131.         } else {
  1132.             $facturationResume = [
  1133.                 'customer_names' => $paymentData->BD->first_name ' ' $paymentData->BD->last_name,
  1134.                 'customer_address' => $paymentData->BD->address,
  1135.                 'customer_doc_num' => $paymentData->BD->doc_num,
  1136.                 'customer_phone' => $paymentData->BD->phone,
  1137.                 'customer_email' => $paymentData->BD->email,
  1138.             ];
  1139.         }
  1140.         // Send confirmation email if success
  1141.         $emailData json_decode($orderProduct->getEmail(), true);
  1142.         if (empty($emailData)) {
  1143.             $emailData = [];
  1144.         }
  1145.         //Se quita condicional por autorizacion de geo 
  1146.         // if ((string) $prepaymentInfo->Message->OTA_AirBookRS->AirReservation->Ticketing->TicketingVendor['Code'] === 'CM') {
  1147.         // Código GDS y Aerolínea específicos del trayecto actual
  1148.         $currentGds = (string) $prepaymentInfo->Message->OTA_AirBookRS->AirReservation->BookingReferenceID['ID'];
  1149.         $currentAir = (string) $prepaymentInfo->Message->OTA_AirBookRS->AirReservation->BookingReferenceID->TPA_Extensions->AirlineBookingCode;
  1150.         if (empty($currentAir) && isset($addProductData->data->product->bill_number)) {
  1151.             $currentAir = (string) $addProductData->data->product->bill_number;
  1152.         }
  1153.         $paymentResume['id'] = $currentGds;
  1154.         $paymentResume['recordBooking'] = $currentAir;
  1155.         // } else {
  1156.         //     $paymentResume['recordBooking'] = '' != $session->get($transactionId . '[flight][recordBooking' . $segment . ']') ? ' - ' . $session->get($transactionId . '[flight][recordBooking' . $segment . ']') : '';
  1157.         // } 
  1158.         $emailData['paymentResume'] = $paymentResume;
  1159.         /* La idea es que en el correo, se puedan cargar los links de documentación de viaje por cada trayecto, y que lleguen al final para el gracias por tu compra en pantalla */
  1160.         if(isset($emailData['journeySummaries'])){ /* En caso de que no esté el journeySummaries, no se pueden generar los links por que ahí está el detalle de cada trayecto con paradas y escalas */
  1161.             $this->includingDataForDocumentationPerSegment($travelers$emailData['journeySummaries'], $baseURL);
  1162.         }
  1163.         $emailData['travelers'] = $travelers;
  1164.         // Número de vuelo desde los datos de pago del detalle o el campo flight_number del XML de addProductData
  1165.         $flightNumbers = [];
  1166.         foreach ($dataPayment['CDD'] as $key => $value) {
  1167.             if (strpos($key'flight_number_') === 0) {
  1168.                 $flightNumbers[] = $value;
  1169.             }
  1170.         }
  1171.         if(isset($addProductData) && count($flightNumbers) <= ){
  1172.             $bookingData = (string) $addProductData->data->product->booking_data;
  1173.             $bookingDataXml = \simplexml_load_string("<booking_data>" $bookingData "</booking_data>");
  1174.             foreach ($bookingDataXml->itineraries->itinerary as $itinerary) {
  1175.                 $airlineCode = (string) $itinerary->airline->code;
  1176.                 $flightNumber = (string) $itinerary->flight_number;
  1177.                 $flightNumbers[] = $airlineCode '-' $flightNumber;
  1178.             }
  1179.         }
  1180.         $keyFlightNumbers $cantFlight ?? 0;
  1181.         foreach ($emailData['journeySummaries'] as $keyj => $journeySummary) {
  1182.             $fDetail $journeySummary['flightDetails'];
  1183.             foreach ($fDetail as $keyf => $segmentFlight) {
  1184.                 $emailData['journeySummaries'][$keyj]['flightDetails'][$keyf]['flightNumber'] = $flightNumbers[$keyFlightNumbers];
  1185.                 $keyFlightNumbers++;
  1186.             }
  1187.         }
  1188.         $orderProduct->setEmail(json_encode($emailData));
  1189.         $em->persist($orderProduct);
  1190.         $em->flush();
  1191.         if ($session->has($transactionId '[experience][payout_extra]')) {
  1192.             $payoutExtrasValues json_decode($session->get($transactionId '[flight][payout_extra_values]'));
  1193.             foreach ($payoutExtrasValues as $key => $payoutExtraValues) {
  1194.                 if ('EXPERIENCE' == $payoutExtraValues->name) {
  1195.                     $orderProductCode $session->get($transactionId '[experience][order' $key ']');
  1196.                     $productId str_replace('PN'''json_decode($orderProductCode)->products);
  1197.                     $orderProductExperience $em->getRepository(\Aviatur\GeneralBundle\Entity\OrderProduct::class)->find($productId);
  1198.                     $orderProductExperience->setEmail(\json_encode($emailData));
  1199.                 }
  1200.             }
  1201.         }
  1202.         $agencyFolder $twigFolder->twigFlux();
  1203.         //generate pDF documentation for attachment
  1204.         $emailData['infoDocumentation'] = false;
  1205.         $vouchersFiles = [];
  1206.         $countriesDocumentation = [];
  1207.         $journeySummary $emailData['journeySummaries']['0'];
  1208.         if (true === $session->has('countriesDocumentation')) {
  1209.             $countriesDocumentation $session->get('countriesDocumentation');
  1210.         } else {
  1211.             $countriesDocumentation = [];
  1212.             if ('BOG' != $journeySummary['destinationCode']) {
  1213.                 $citySearch $journeySummary['destinationCode'];
  1214.             } else {
  1215.                 $citySearch $journeySummary['originCode'];
  1216.             }
  1217.             $countryObject $this->getCountryByCityOrAirport($citySearch);
  1218.             $country $countryObject->getIataCode();
  1219.             if ('CO' != $country) {
  1220.                 foreach ($emailData['journeySummaries'] as $journeySummary) {
  1221.                     $fDetail $journeySummary['flightDetails'];
  1222.                     foreach ($fDetail as $segment) {
  1223.                         if ('BOG' != $segment['DepartureAirport']) {
  1224.                             $city $em->getRepository(\Aviatur\GeneralBundle\Entity\City::class)->findOneByIatacode($segment['DepartureAirport']);
  1225.                             $countryObject $em->getRepository(\Aviatur\GeneralBundle\Entity\Country::class)->findOneByCode($city->getCountryStateCode());
  1226.                             $country $countryObject->getIataCode();
  1227.                             if ('CO' !== $country && !in_array($country$countriesDocumentation)) {
  1228.                                 $countriesDocumentation[$country] = $countryObject->getDescription();
  1229.                             }
  1230.                         }
  1231.                     }
  1232.                 }
  1233.             }
  1234.         }
  1235.         $searchDestination $em->getRepository(\Aviatur\SearchBundle\Entity\SearchCities::class)->findByIata($journeySummary['destinationCode']);
  1236.         if (!empty($searchDestination)) {
  1237.             $search = ['á''é''í''ó''ú''ñ'' '];
  1238.             $replace = ['a''e''i''o''u''n''-'];
  1239.             $destinationName str_replace($search$replace$searchDestination[0]->getCity());
  1240.             $destinationName strtolower($destinationName);
  1241.             $iata $journeySummary['destinationCode'];
  1242.             switch ($iata) {
  1243.                 case 'FLR':
  1244.                     $fileContent 'https://www.aviatur.com/vuelos/tiquetes-baratos-a-florencia-italia';
  1245.                     $destinationContent $searchDestination[0]->getCity() . ' - ' $searchDestination[0]->getCountry();
  1246.                     break;
  1247.                 case 'FLA':
  1248.                     $fileContent 'https://www.aviatur.com/vuelos/tiquetes-baratos-a-' $destinationName;
  1249.                     $destinationContent $searchDestination[0]->getCity() . ' - ' $searchDestination[0]->getCountry();
  1250.                     break;
  1251.                 case 'UIO':
  1252.                     $fileContent 'https://www.aviatur.com/vuelos/tiquetes-baratos-a-' $destinationName '-ecuador';
  1253.                     $destinationContent $searchDestination[0]->getCity() . ' - ' $searchDestination[0]->getCountry();
  1254.                     break;
  1255.                 case 'HAV':
  1256.                     $fileContent 'https://www.aviatur.com/vuelos/tiquetes-baratos-a-' $destinationName '-cuba';
  1257.                     $destinationContent $searchDestination[0]->getCity();
  1258.                     break;
  1259.                 case 'ORL':
  1260.                     $fileContent 'https://www.aviatur.com/vuelos/tiquetes-baratos-a-' $destinationName '-florida';
  1261.                     $destinationContent $searchDestination[0]->getCity();
  1262.                     break;
  1263.                 case 'EYP':
  1264.                     $fileContent 'https://www.aviatur.com/vuelos/tiquetes-baratos-a-yopal';
  1265.                     $destinationContent 'Yopal';
  1266.                     break;
  1267.                 case 'ADZ':
  1268.                     $fileContent 'https://www.aviatur.com/vuelos/tiquetes-baratos-a-san-andres';
  1269.                     $destinationContent $searchDestination[0]->getCity();
  1270.                     break;
  1271.                 case 'TLV':
  1272.                     $fileContent 'https://www.aviatur.com/vuelos/tiquetes-baratos-a-tel-aviv';
  1273.                     $destinationContent $searchDestination[0]->getCity();
  1274.                     break;
  1275.                 case 'BRC':
  1276.                     $fileContent 'https://www.aviatur.com/vuelos/tiquetes-baratos-a-bariloche';
  1277.                     $destinationContent $searchDestination[0]->getCity();
  1278.                     break;
  1279.                 case 'SSA':
  1280.                     $fileContent 'https://www.aviatur.com/vuelos/tiquetes-baratos-a-' $destinationName '-de-bahia';
  1281.                     $destinationContent $searchDestination[0]->getCity() . ' - ' $searchDestination[0]->getCountry();
  1282.                     break;
  1283.                 case 'VLC':
  1284.                     $fileContent 'https://www.aviatur.com/vuelos/tiquetes-baratos-a-' $destinationName;
  1285.                     $destinationContent $searchDestination[0]->getCity() . ' - ' $searchDestination[0]->getCountry();
  1286.                     break;
  1287.                 case 'VLN':
  1288.                     $fileContent 'https://www.aviatur.com/vuelos/tiquetes-baratos-a-' $destinationName '-venezuela';
  1289.                     $destinationContent $searchDestination[0]->getCity() . ' - ' $searchDestination[0]->getCountry();
  1290.                     break;
  1291.                 case 'PTY':
  1292.                     $fileContent 'https://www.aviatur.com/vuelos/tiquetes-baratos-a-panama';
  1293.                     $destinationContent 'Panamá';
  1294.                     break;
  1295.                 default:
  1296.                     $fileContent 'https://www.aviatur.com/vuelos/tiquetes-baratos-a-' $destinationName;
  1297.                     $destinationContent $searchDestination[0]->getCity();
  1298.                     break;
  1299.             }
  1300.         } else {
  1301.             $searchDestination $em->getRepository(\Aviatur\SearchBundle\Entity\SearchAirports::class)->findByIata($journeySummary['destinationCode']);
  1302.             $search = ['á''é''í''ó''ú''ñ'' '];
  1303.             $replace = ['a''e''i''o''u''n''-'];
  1304.             $destinationName str_replace($search$replace$searchDestination[0]->getCity());
  1305.             $destinationName strtolower($destinationName);
  1306.             $fileContent 'https://www.aviatur.com/vuelos/tiquetes-baratos-a-' $destinationName;
  1307.             $destinationContent $searchDestination[0]->getCity();
  1308.         }
  1309.         $url curl_init($fileContent);
  1310.         curl_setopt($urlCURLOPT_TIMEOUT5);
  1311.         curl_setopt($urlCURLOPT_CONNECTTIMEOUT5);
  1312.         curl_setopt($urlCURLOPT_RETURNTRANSFERtrue);
  1313.         curl_setopt($urlCURLOPT_SSL_VERIFYPEERfalse);
  1314.         curl_exec($url);
  1315.         $httpcode curl_getinfo($urlCURLINFO_HTTP_CODE);
  1316.         curl_close($url);
  1317.         if (200 == $httpcode || 301 == $httpcode) {
  1318.             $contentDestination = ['urlContent' => $fileContent'nameCity' => $destinationContent];
  1319.         } else {
  1320.             $contentDestination = ['urlContent' => 'no_existe''nameCity' => $destinationContent];
  1321.         }
  1322.         $emailData += ['contentDestination' => $contentDestination];
  1323.         $isFront $session->has('operatorId');
  1324.         if ((is_countable($countriesDocumentation) ? count($countriesDocumentation) : 0) > 0) {
  1325.             //get documentation info
  1326.             $documentationModel = new DocumentationModel();
  1327.             foreach ($countriesDocumentation as $key => $value) {
  1328.             }
  1329.             $emailData['infoDocumentation'] = true;
  1330.         }
  1331.         $doradoPass false;
  1332.         $EOHProtocol false;
  1333.         $DestinationADZ false;
  1334.         $internationalDestination false;
  1335.         $infoCovidTest false;
  1336.         foreach ($emailData['journeySummaries'] as $journeySummary) {
  1337.             $fDetail $journeySummary['flightDetails'];
  1338.             foreach ($fDetail as $segmentFlight) {
  1339.                 if ('BOG' == $segmentFlight['DepartureAirport'] && null == $segmentFlight['waitingTime']) {
  1340.                     $doradoPass true;
  1341.                 }
  1342.                 if ('EOH' == $segmentFlight['DepartureAirport'] && null == $segmentFlight['waitingTime']) {
  1343.                     $EOHProtocol true;
  1344.                 }
  1345.                 if ('ADZ' == $segmentFlight['ArrivalAirport']) {
  1346.                     $DestinationADZ true;
  1347.                 }
  1348.                 if ('CO' != $segmentFlight['ArrivalCountryCode']) {
  1349.                     $internationalDestination true;
  1350.                 }
  1351.             }
  1352.         }
  1353.         if (false !== strpos($agency->getName(), 'Aviatur')) {
  1354.             $voucherFile $projectDir '/app/reservationLogs/ProtocolosAeropuertosPDF/travel-for-conservation.pdf';
  1355.         }
  1356.         /* Validación ADZ o destinos internacionales boton pruebas COVID-19 */
  1357.         if (true == $DestinationADZ || true == $internationalDestination) {
  1358.             $infoCovidTest true;
  1359.         }
  1360.         $emailData += ['infoCovidTest' => $infoCovidTest];
  1361.         /* Documento autorización salida menores de edad */
  1362.         $documentationChild false;
  1363.         foreach ($emailData['journeySummaries'] as $journeySummary) {
  1364.             $fDetail $journeySummary['flightDetails'];
  1365.             $travelersDetail $emailData['travelers'];
  1366.             $passengerChild 0;
  1367.             if (null == $travelersDetail) {
  1368.                 $response = \simplexml_load_string($session->get($transactionId '[flight][detail]'));
  1369.                 $childrens $response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItinerary->OriginDestinationOptions['ChdQuantity'];
  1370.                 $infants $response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItinerary->OriginDestinationOptions['InfQuantity'];
  1371.                 if ($childrens || $infants 0) {
  1372.                     $passengerChild $passengerChild 1;
  1373.                 }
  1374.             } else {
  1375.                 foreach ($travelersDetail as $traveler) {
  1376.                     if ('ADT' != $traveler['typeCode']) {
  1377.                         $passengerChild $passengerChild 1;
  1378.                     }
  1379.                 }
  1380.             }
  1381.             foreach ($fDetail as $segmentFlight) {
  1382.                 if ('CO' != $segmentFlight['ArrivalCountryCode'] && $passengerChild 0) {
  1383.                     $documentationChild true;
  1384.                 }
  1385.             }
  1386.         }
  1387.         if (true == $documentationChild) {
  1388.             $voucherFile $projectDir '/app/reservationLogs/DocumentationPDF/FORMATO-PERMISO-SALIDA-DEL-PAIS-MENORES.pdf';
  1389.             if (file_exists($voucherFile)) {
  1390.                 $vouchersFiles[] = $voucherFile;
  1391.             }
  1392.         }
  1393.         $emailData += ['documentationChild' => $documentationChild];
  1394.         $routeName $request->get('_route');
  1395.         $pixelInfo = [];
  1396.         $emailData['renderWebbingInfo'] = $session->has($transactionId '[RenderWebbingInfo]');
  1397.         $isAgent false;
  1398.         $azure $em->getRepository(\Aviatur\GeneralBundle\Entity\Parameter::class)->findOneByName('blob_azure_assets')->getValue();
  1399.         $emailData['assets'] = $agency->getAssetsFolder();
  1400.         $emailData['azure'] = $azure;
  1401.         /* Se debe realizar la iteración por order_product de todo lo guardado por cada vuelo (por ahora aplica para Oneway) */
  1402.         $resultadoDataAncillaries $this->getListAncillaries($session$transactionId$orderProduct$passengersInfo$prepaymentInfo);
  1403.         if(null !== $resultadoDataAncillaries){
  1404.             /* Para aplicar al correo */
  1405.             $emailData['ancillaries'] = $resultadoDataAncillaries;
  1406.         }
  1407.         /* La ruta de las plantillas de ancillaries es aviatur/Flux, y se debe enviar una variable para no dejarla quemada en los Twig */
  1408.         $emailData["ancTwigRoute"] = "aviatur/Flux";
  1409.         $session->remove('[base_segments_baggage]');
  1410.         $stateOrder $orderProduct->getstatus();
  1411.         $emailData['stateOrder'] = $stateOrder;
  1412.         $infoResumenPaymentStatus $this->flightResumeServices->formatThankYouPageData(array($emailData), $paymentResume['payment_gateway']);
  1413.         $emailData['infoResumenPaymentStatus'] = $infoResumenPaymentStatus;
  1414.         $emailData['isCombination'] = $combination;
  1415.         $emailData['isNational'] = $session->get($transactionId '[flight][isNational]');
  1416.         $emailData['policies'] = $session->get($transactionId '[flight][policies]');
  1417.         if ($session->has($transactionId '[PriceType]')) {
  1418.             $priceTypeF = (false === \strpos((string) $session->get($transactionId '[PriceType]'), '|')) ? (string) $session->get($transactionId '[PriceType]') : \explode('|', (string) $session->get($transactionId '[PriceType]'));
  1419.             $emailData['PriceType'] = $priceTypeF;
  1420.         }
  1421.         // Obtiene tipo de ruta oneway, round o multi
  1422.         if($session->has($transactionId.'[flight][availability_type]')) {
  1423.             $getRouterType $session->get($transactionId.'[flight][availability_type]');
  1424.             $uncompressedRouterType gzuncompress($getRouterType);
  1425.             $routerTypeDecode json_decode($uncompressedRouterTypetrue);
  1426.             $routerType $routerTypeDecode["route_type"];
  1427.         } else {
  1428.             $getTypeFlight $session->get($transactionId "[flight][flight_type]");
  1429.             $partsRoutes explode("_"$getTypeFlight);
  1430.             $routerType end($partsRoutes);
  1431.         }
  1432.         $emailData['routerType'] = $routerType;
  1433.         if ('aviatur_flight_payment_success_secure' == $routeName or 'aviatur_flight_reservation_success_secure' ==  $routeName) {
  1434.             if ((true !== $session->has($transactionId '[emission_email]')) && (true !== $session->has($transactionId '[emission_email' $segment ']'))) {
  1435.                 try {
  1436.                     // Agente Octopus
  1437.                     // Cambiar logo Correo Gracias por tu compra.
  1438.                     $emails = [
  1439.                         $customer->getEmail(),
  1440.                     ];
  1441.                     if ($authorizationChecker->isGranted('ROLE_AVIATUR_ADMIN_ADMIN_AGENT_OPERATOR')) {
  1442.                         $agent $em->getRepository(\Aviatur\AgentBundle\Entity\Agent::class)->findOneByCustomer($this->getUser());
  1443.                         if (!empty($agent)) {
  1444.                             $isAgent true;
  1445.                             $idAgentLogo $agent->getId();
  1446.                             $folderImg 'assets/octopus_assets/img/custom/logoAgent/' $idAgentLogo '.png';
  1447.                             $domain 'https://' $agency->getDomain();
  1448.                             $folderLogoAgent $domain '/' $folderImg;
  1449.                             $emails = [
  1450.                                 $customer->getEmail(),
  1451.                                 'laura.amaya@octopus.com.co'
  1452.                             ];
  1453.                             if (file_exists($folderImg)) {
  1454.                                 $emailData['imgLogoAgent'] = $folderLogoAgent;
  1455.                             }
  1456.                         }
  1457.                     }
  1458.                     //entrega de tarjeta One-timeUnited
  1459.                     $originCyty $journeySummary['originCode'];
  1460.                     $airlineGift $journeySummary['flightDetails'][0]['CodeAirline'];
  1461.                     //Fin entrega de tarjeta One-timeUnited
  1462.                     $bccMails = [$agency->getMailBooking(), 'notificacionessitioweb@aviatur.com'];
  1463.                     $agencyName '';
  1464.                     if ($session->has('whitemark')) {
  1465.                         if ('' != $session->get('whitemarkMail')) {
  1466.                             $bccMails[] = $session->get('whitemarkMail');
  1467.                             $bccMails[] = 'notificacionessitioweb@aviatur.com';
  1468.                         }
  1469.                         $agencyName $session->get('whitemarkName');
  1470.                     } else {
  1471.                         $bccMails[] = $agency->getMailcontact();
  1472.                         $agencyName $session->get("agencyDataInfo")['agency_name'];
  1473.                     }
  1474.                     if($stateOrder == 'approved'){
  1475.                         $subject 'Gracias por su compra';
  1476.                     }elseif($stateOrder == 'pending'){
  1477.                         $subject 'Pago pendiente';
  1478.                     }else{
  1479.                         $subject 'Pago rechazado';
  1480.                     }
  1481.                     if($emailData["paymentResume"]["payment_gateway"] != 'cash' && !$session->has($transactionId '[multi][detail_cash]')) {
  1482.                         $message = (new \Swift_Message())
  1483.                             ->setContentType('text/html')
  1484.                             ->setFrom($session->get('emailNoReply'))
  1485.                             ->setTo($emails)
  1486.                             ->setBcc($bccMails)
  1487.                             ->setSubject($agencyName ' - '$subject)
  1488.                             ->setBody(
  1489.                                 //$this->renderView($twigFolder->twigExists('@AviaturTwig/'.$agencyFolder.'/General/Templates/email_old.html.twig'), $emailData)
  1490.                                 $this->renderView($twigFolder->twigExists('@AviaturTwig/'.$agencyFolder.'/General/Templates/email.html.twig'), $emailData)
  1491.                             );
  1492.                         /*
  1493.                          * Agente Octopus
  1494.                          * Email de la reserva del agente hijo enviado al agente Padre Octopus.
  1495.                          */
  1496.                         if ($isAgent) {
  1497.                             $agent $em->getRepository(\Aviatur\AgentBundle\Entity\Agent::class)->findOneByCustomer($this->getUser());
  1498.                             if (!empty($agent)) {
  1499.                                 $parent $agent->getparentAgent();
  1500.                                 if (!= $parent) {
  1501.                                     $myParent $em->createQuery('SELECT a,b FROM AviaturAgentBundle:Agent a  JOIN a.customer b WHERE a.id= :idAgent');
  1502.                                     $myParent $myParent->setParameter('idAgent'$parent);
  1503.                                     $parentInfo $myParent->getResult();
  1504.                                     $emailParent $parentInfo[0]->getCustomer()->getEmail();
  1505.                                     $emailData['infoSubAgent'] = ['nameSubAgent' => strtoupper($agent->getCustomer()->__toString()), 'emailSubAgent' => strtoupper($agent->getCustomer()->getEmail())];
  1506.                                     $messageAgent = (new \Swift_Message())
  1507.                                         ->setContentType('text/html')
  1508.                                         ->setFrom($session->get('emailNoReply'))
  1509.                                         ->setTo([$agent->getCustomer()->getEmail(), $emailParent])
  1510.                                         ->setBcc($bccMails)
  1511.                                         ->setSubject($agencyName ' - Gracias por su compra - ' $customer->getFirstname() . ' ' $customer->getLastname() . ' Vendedor - ' $agent->getCustomer()->getFirstName() . ' ' $agent->getCustomer()->getLastName())
  1512.                                         ->setBody(
  1513.                                             $this->renderView($twigFolder->twigExists('@AviaturTwig/' $agencyFolder '/General/Templates/email.html.twig'), $emailData)
  1514.                                         );
  1515.                                 } else {
  1516.                                     $messageAgent = (new \Swift_Message())
  1517.                                         ->setContentType('text/html')
  1518.                                         ->setFrom($session->get('emailNoReply'))
  1519.                                         ->setTo($agent->getCustomer()->getEmail())
  1520.                                         ->setBcc($bccMails)
  1521.                                         ->setSubject($agencyName ' - Gracias por su compra - ' $customer->getFirstname() . ' ' $customer->getLastname() . ' Vendedor - ' $agent->getCustomer()->getFirstName() . ' ' $agent->getCustomer()->getLastName())
  1522.                                         ->setBody(
  1523.                                             $this->renderView($twigFolder->twigExists('@AviaturTwig/' $agencyFolder '/General/Templates/email.html.twig'), $emailData)
  1524.                                         );
  1525.                                 }
  1526.                             }
  1527.                         }
  1528.                         if (count($vouchersFiles) > 0) {
  1529.                             foreach ($vouchersFiles as $file) {
  1530.                                 $message->attach(\Swift_Attachment::fromPath($file));
  1531.                             }
  1532.                         }
  1533.                         if ($session->has($transactionId '[flight][unitedGift]') && $session->get($transactionId '[flight][unitedGift]') && 'UA' == $airlineGift && 'BOG' == $originCyty) {
  1534.                             $emailData['unitedGiftCard'] = true;
  1535.                             $promotional_codes_gift $em->getRepository(\Aviatur\GeneralBundle\Entity\PromotionalCodeGift::class)->findBy(['status' => 0]);
  1536.                             $passengerCountVoucher 0;
  1537.                             foreach ($travelers as $traveler) {
  1538.                                 if ('INF' != $traveler['typeCode']) {
  1539.                                     $passengerCountVoucher $passengerCountVoucher 1;
  1540.                                 }
  1541.                             }
  1542.                             for ($i 0$i $passengerCountVoucher; ++$i) {
  1543.                                 $codeToDeliver $promotional_codes_gift[$i];
  1544.                                 $codeToDeliver->setOrderproduct($orderProduct);
  1545.                                 $codeToDeliver->setStatus(1);
  1546.                                 $em->persist($codeToDeliver);
  1547.                                 $em->flush();
  1548.                                 $pdfCard $projectDir '/app/reservationLogs/OneTimePass/' substr($codeToDeliver->getCode(), 43) . '.pdf';
  1549.                                 $message->attach(\Swift_Attachment::fromPath($pdfCard));
  1550.                             }
  1551.                         }
  1552.                         if(!$isMulti) {
  1553.                             $mailer->send($message);
  1554.                         }
  1555.                     }
  1556.                     /**
  1557.                      * Agente Octopus
  1558.                      * Envio Correo -  Email de la reserva del agente hijo enviado al agente Padre Octopus.
  1559.                      */
  1560.                     if ($isAgent) {
  1561.                         if (count($vouchersFiles) > 0) {
  1562.                             foreach ($vouchersFiles as $file) {
  1563.                                 $messageAgent->attach(\Swift_Attachment::fromPath($file));
  1564.                             }
  1565.                         }
  1566.                         if(isset($messageAgent))
  1567.                             $mailer->send($messageAgent);
  1568.                     }
  1569.                     if ($combination) {
  1570.                         $session->set($transactionId '[emission_email' $segment ']''emailed');
  1571.                     } else {
  1572.                         $session->set($transactionId '[emission_email]''emailed');
  1573.                     }
  1574.                 } catch (\Exception $ex) {
  1575.                     $message = (new \Swift_Message())
  1576.                         ->setContentType('text/html')
  1577.                         ->setFrom($session->get('emailNoReply'))
  1578.                         ->setTo($agency->getMailBooking())
  1579.                         ->setSubject($session->get("agencyDataInfo")['agency_name'] . ' - Gracias por su compra(Error en Mail Usuario)')
  1580.                         ->setBody(
  1581.                             $this->renderView($twigFolder->twigExists('@AviaturTwig/' $agencyFolder '/General/Templates/email.html.twig'), $emailData)
  1582.                         );
  1583.                 }
  1584.             }
  1585.         } elseif ('aviatur_flight_payment_rejected_secure' == $routeName) {
  1586.             try {
  1587.                 $bccMails = [$agency->getMailBooking(), 'notificacionessitioweb@aviatur.com'];
  1588.                 $agencyName '';
  1589.                 if ($session->has('whitemark')) {
  1590.                     if ('' != $session->get('whitemarkMail')) {
  1591.                         $bccMails[] = $session->get('whitemarkMail');
  1592.                         $bccMails[] = 'sebastian.huertas@aviatur.com';
  1593.                     }
  1594.                     $agencyName $session->get('whitemarkName');
  1595.                 } else {
  1596.                     $bccMails[] = $agency->getMailcontact();
  1597.                     $agencyName $session->get('agencyShortName');
  1598.                 }
  1599.                 if(isset($paymentResume['transaction_state_cyber']) && $paymentResume['transaction_state_cyber'] == ){
  1600.                     $subject ='Pago en validación';
  1601.                 }elseif($paymentResume['transaction_state']  != '2' && (!isset($paymentResume['transaction_state_cyber']) || $paymentResume['transaction_state_cyber'] != 2) && $stateOrder == 'approved'){
  1602.                     $subject 'Gracias por su compra';
  1603.                 }else{
  1604.                     $subject 'Pago rechazado';
  1605.                 }
  1606.                 $message = (new \Swift_Message())
  1607.                     ->setContentType('text/html')
  1608.                     ->setFrom($session->get('emailNoReply'))
  1609.                     ->setTo($customer->getEmail())
  1610.                     ->setBcc($bccMails)
  1611.                     ->setSubject($agencyName ' - ' $subject)
  1612.                     ->setBody(
  1613.                         $this->renderView($twigFolder->twigExists('@AviaturTwig/'.$agencyFolder.'/General/Templates/email.html.twig'), $emailData)
  1614.                     );;
  1615.                     if(!$isMulti) {
  1616.                         $mailer->send($message);
  1617.                     }
  1618.             } catch (\Exception $ex) {
  1619.                 $message = (new \Swift_Message())
  1620.                     ->setContentType('text/html')
  1621.                     ->setFrom($session->get('emailNoReply'))
  1622.                     ->setTo($agency->getMailBooking())
  1623.                     ->setSubject($session->get('agencyShortName') . ' - Gracias por su compra(Error en Mail Usuario)')
  1624.                     ->setBody(
  1625.                         $this->renderView($twigFolder->twigExists('@AviaturTwig/' $agencyFolder '/General/Templates/email.html.twig'), $emailData)
  1626.                     );
  1627.             }
  1628.         }
  1629.         //CRITEO TAGS
  1630.         if (!$isFront) {
  1631.             $url parse_url($session->get($transactionId '[availability_url]'), PHP_URL_PATH);
  1632.             $seoUrl $em->getRepository(\Aviatur\GeneralBundle\Entity\SeoUrl::class)->findByUrlorMaskedUrl($url);
  1633.             $detailXml simplexml_load_string($session->get($transactionId '[flight][detail]'));
  1634.             $passengerCount 0;
  1635.             try {
  1636.                 $PTC_FareBreakdown $detailXml->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItineraryPricingInfo->PTC_FareBreakdowns->PTC_FareBreakdown;
  1637.                 foreach ($PTC_FareBreakdown->PassengerTypeQuantity as $passengerType) {
  1638.                     $passengerCount += (int) $passengerType['Quantity'];
  1639.                 }
  1640.             } catch (\Exception $e) {
  1641.                 $passengerCount 1;
  1642.             }
  1643.             $pixel json_decode($session->get($transactionId '[capaDatosinfo]'), true);
  1644.             $pixel['partner_datalayer']['event'] = 'purchase';
  1645.             unset($pixel['partner_datalayer']['ecommerce']['checkout']);
  1646.             $purchase = [
  1647.                 'purchase' => [
  1648.                     'products' => [
  1649.                         'actionField' => "{'id': '" $paymentResume['id_context'] . "', 'affiliation': 'Portal Web', 'revenue': '" $paymentResume['total_amount'] . "', 'tax':'" $paymentResume['iva'] . "', 'coupon': ''}",
  1650.                         'name' => $journeySummary['originCode'] . ($journeySummary['destinationCode'] ?? ''),
  1651.                         'price' => $paymentResume['total_amount'],
  1652.                         'brand' => $journeySummary['flightDetails'][0]['CodeAirline'] ?? '',
  1653.                         'category' => $journeySummary['flightDetails'][0]['BookingClassAvails'] ?? 'Economy',
  1654.                         'variant' => $emailData['roundtrip'] ? ('RoundTrip') : ('OneWay'),
  1655.                         'quantity' => $passengerCount,
  1656.                     ],
  1657.                 ],
  1658.             ];
  1659.             $pixel['partner_datalayer']['ecommerce'] = $purchase;
  1660.             if (isset($opResponse->x_response_code) && == $opResponse->x_response_code) {
  1661.                 if ($session->get($transactionId '[flight][kayakclickid]') && 'aviatur_flight_payment_success_secure' == $routeName) {
  1662.                     $pixel['kayakclickid'] = $session->get($transactionId '[flight][kayakclickid]');
  1663.                     if (isset($pixel['kayakclickid'])) {
  1664.                         $kayakclickid = [
  1665.                             'kayakclickid' => $pixel['kayakclickid'],
  1666.                             'price' => $paymentResume['total_amount'],
  1667.                             'currency' => $paymentResume['currency'],
  1668.                             'confirmation' => $paymentResume['id_context'],
  1669.                             'rand' => microtime(true),
  1670.                         ];
  1671.                         $pixel['kayakclickid'] = $kayakclickid;
  1672.                     }
  1673.                 }
  1674.             }
  1675.             if (isset($opResponse->infoCash)) {
  1676.                 if ($session->get($transactionId '[flight][kayakclickid]') && 'aviatur_flight_payment_success_secure' == $routeName) {
  1677.                     $pixel['kayakclickid'] = $session->get($transactionId '[flight][kayakclickid]');
  1678.                     if (isset($pixel['kayakclickid'])) {
  1679.                         $kayakclickid = [
  1680.                             'kayakclickid' => $pixel['kayakclickid'],
  1681.                             'price' => $paymentResume['total_amount'],
  1682.                             'currency' => $paymentResume['currency'],
  1683.                             'confirmation' => $paymentResume['id_context'],
  1684.                             'rand' => microtime(true),
  1685.                         ];
  1686.                         $pixel['kayakclickid'] = $kayakclickid;
  1687.                     }
  1688.                 }
  1689.             }
  1690.             if (isset($pixel['clickId'])) {
  1691.                 $clickid = [
  1692.                     'clickid' => $pixel['clickId'],
  1693.                     'price' => $paymentResume['total_amount'],
  1694.                 ];
  1695.                 $pixel['clickId'] = $clickid;
  1696.             }
  1697.             $id_context explode('-'$paymentResume['id_context']);
  1698.             $pixel['skyscanner'] = [
  1699.                 'cost' => $paymentResume['amount'],
  1700.                 'order' => (isset($id_context[1])) ? str_replace('PN'''$id_context[1]) : $paymentResume['id_context'],
  1701.             ];
  1702.             if ($session->has('generals[metasearch]')) {
  1703.                 $metasearch $em->getRepository(\Aviatur\GeneralBundle\Entity\Metasearch::class)
  1704.                     ->find($session->get('generals[metasearch]'));
  1705.                 // SkyScanner pixel
  1706.                 if ($session->has('skyscanner_redirectid') && $routeName === 'aviatur_flight_payment_success_secure') {
  1707.                     $itinerarySegments = [];
  1708.                     if ($session->has('generals[metasearch]')) {
  1709.                         $metasearchId $session->get('generals[metasearch]');
  1710.                         $metasearch $em->getRepository(\Aviatur\GeneralBundle\Entity\Metasearch::class)
  1711.                             ->find($metasearchId);
  1712.                         if ($session->has('skyscanner_redirectid') && $routeName === 'aviatur_flight_payment_success_secure') {
  1713.                             $itinerarySegments = [];
  1714.                             if (isset(
  1715.                                 $journeySummary['originCode'],
  1716.                                 $journeySummary['destinationCode'],
  1717.                                 $journeySummary['departureTime'],
  1718.                                 $journeySummary['arrivalTime']
  1719.                             )) {
  1720.                                 $itinerarySegments[] = [
  1721.                                     'departure_airport' => $journeySummary['originCode'],
  1722.                                     'arrival_airport' => $journeySummary['destinationCode'],
  1723.                                     'departure_datetime' => $journeySummary['departureTime'],
  1724.                                     'arrival_datetime' => $journeySummary['arrivalTime'],
  1725.                                 ];
  1726.                             }
  1727.                             $cabinClass = !empty($journeySummary['flightDetails'][0]['BookingClassAvails'])
  1728.                                 ? strtolower($journeySummary['flightDetails'][0]['BookingClassAvails'])
  1729.                                 : 'economy';
  1730.                             $airlineCode = !empty($journeySummary['flightDetails'][0]['CodeAirline'])
  1731.                                 ? strtoupper($journeySummary['flightDetails'][0]['CodeAirline'])
  1732.                                 : '';
  1733.                             $paymentMethod = !empty($paymentResume['client_franquice']['description'])
  1734.                                 ? strtolower($paymentResume['client_franquice']['description'])
  1735.                                 : ($paymentResume['payment_gateway'] ?? 'unknown');
  1736.                             $tripType = !empty($emailData['roundtrip']) ? 'return' 'one-way';
  1737.                             $platform $journeySummary['agencyName'] ?? 'Aviatur.com';
  1738.                             $skyscannerConversionParams = [
  1739.                                 'redirect_id' => $session->get('skyscanner_redirectid'),
  1740.                                 'conversion_id' => $paymentResume['id_context'],
  1741.                                 'total_amount' => $paymentResume['total_amount'],
  1742.                                 'flight_amount' => $paymentResume['amount'],
  1743.                                 'currency' => $paymentResume['currency'],
  1744.                                 'payment_method' => $paymentMethod,
  1745.                                 'fare_basis' => $paymentResume['id'],
  1746.                                 'airline_code' => $airlineCode,
  1747.                                 'itinerary' => $itinerarySegments,
  1748.                                 'cabin_class' => $cabinClass,
  1749.                                 'trip_type' => $tripType,
  1750.                                 'platform' => $platform,
  1751.                             ];
  1752.                             $skyscannerPixel $this->skyscannerTracker->generateConversionPixel($skyscannerConversionParams);
  1753.                             $resumeView['skyscanner_pixel'] = $skyscannerPixel;
  1754.                         }
  1755.                         if ($metasearch && str_contains($metasearch->getName(), 'viajala')) {
  1756.                             $redirectParams = [
  1757.                                 'supplier' => 'aviatur',
  1758.                                 'origin' => $journeySummary['originCode'] ?? '',
  1759.                                 'destination' => $journeySummary['destinationCode'] ?? '',
  1760.                                 'grossBooking' => $paymentResume['total_amount'],
  1761.                                 'currency' => $session->get('typeCoin''COP'),
  1762.                                 'bookingId' => $paymentResume['recordBooking'],
  1763.                             ];
  1764.                             $resumeView['viajala'] = $redirectParams;
  1765.                         }
  1766.                     }
  1767.                 }
  1768.             }
  1769.         }
  1770.         // END Send confirmation email if success
  1771.         $resumeView = [
  1772.             'agencyData' => $emailData['agencyData'],
  1773.             'facturationResume' => $facturationResume,
  1774.             'paymentResume' => $paymentResume,
  1775.             'infoResumenPaymentStatus' => $emailData["infoResumenPaymentStatus"],
  1776.             'routerType' => $routerType,
  1777.             'travelers' => $travelers,
  1778.             'journeySummaries' => $emailData['journeySummaries'],
  1779.             'roundtrip' => $emailData['roundtrip'],
  1780.             'transactionID' => $transactionId,
  1781.             'redirectParams' => $resumeView['viajala'] ?? null,
  1782.             'skyscanner_pixel' => $resumeView['skyscanner_pixel'] ?? null,
  1783.             'airlineCondition' => ucfirst(mb_strtolower(htmlentities((string) $detailXml->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->Notes))),
  1784.         ];
  1785.         //Add flight Information for cross-selling ASSIST CARD and HOTEL
  1786.         $calculoEdades = [];
  1787.         $resumeView['birthdayDate'] = '';
  1788.         for ($i 1$i <= count($resumeView['travelers']); ++$i) {
  1789.             if (== $resumeView['travelers']) {
  1790.                 $dateBirth[] = $dataPayment['PI']['birthday_1_1'];
  1791.             } else {
  1792.                 $dateBirth[] = $dataPayment['PI']['birthday_1_' $i];
  1793.             }
  1794.             $calculoEdades[] = $insuranceService->calcular_edad($dateBirth[($i 1)]);
  1795.             if ($calculoEdades[($i 1)] >= && $calculoEdades[($i 1)] < 2) {
  1796.                 $passanger_type[] = 1;
  1797.             } elseif ($calculoEdades[($i 1)] >= && $calculoEdades[($i 1)] < 12) {
  1798.                 $passanger_type[] = 2;
  1799.             } else {
  1800.                 $passanger_type[] = 3;
  1801.             }
  1802.             $resumeView['birthdayDate'] =  array();
  1803.             $resumeView['birthdayDate'][] = [
  1804.                 'BirthDate' => $dateBirth[($i 1)],
  1805.                 'Age' => $calculoEdades[($i 1)],
  1806.                 'passanger_type' => $passanger_type[($i 1)],
  1807.             ];
  1808.         }
  1809.         $session->set($transactionId '[crossed][infoBirth]'json_encode($resumeView['birthdayDate']));
  1810.         $origin $resumeView['journeySummaries'][0]['originCode'];
  1811.         $destination $resumeView['journeySummaries'][0]['destinationCode'];
  1812.         // obtain values to generate url's Insurance and hotel when sale is crossed
  1813.         if (true == $resumeView['roundtrip']) {
  1814.             $departureTime explode('T'$resumeView['journeySummaries'][0]['departureTime']);
  1815.             $departureArrival explode('T'$resumeView['journeySummaries'][0]['arrivalTime']);
  1816.             $departureTimeEnd explode('T'$resumeView['journeySummaries'][((is_countable($resumeView['journeySummaries']) ? count($resumeView['journeySummaries']) : 0) - 1)]['departureTime']);
  1817.             $departureArrivalEnd explode('T'$resumeView['journeySummaries'][((is_countable($resumeView['journeySummaries']) ? count($resumeView['journeySummaries']) : 0) - 1)]['arrivalTime']);
  1818.         } else {
  1819.             $departureTime explode('T'$resumeView['journeySummaries'][0]['departureTime']);
  1820.             $departureArrival explode('T'$resumeView['journeySummaries'][0]['arrivalTime']);
  1821.             $departureTimeEnd explode('T'$resumeView['journeySummaries'][0]['departureTime']);
  1822.             $departureArrivalEnd explode('T'$resumeView['journeySummaries'][0]['arrivalTime']);
  1823.         }
  1824.         // Obtain values of city origen and city destination for sale crossed
  1825.         $Origin $em->getRepository(\Aviatur\SearchBundle\Entity\SearchCities::class)->findOneByIata($origin);
  1826.         $Destination $em->getRepository(\Aviatur\SearchBundle\Entity\SearchCities::class)->findOneByIata($destination);
  1827.         if ($Origin) {
  1828.             $originCity $Origin->getIata();
  1829.             $originName $Origin->getCity();
  1830.         } else {
  1831.             $originAirports $em->getRepository(\Aviatur\SearchBundle\Entity\SearchAirports::class)->findOneByIata($origin)->getSearchCities();
  1832.             $originCity $originAirports->getIata();
  1833.             $originName $originAirports->getCity();
  1834.         }
  1835.         if ($Destination) {
  1836.             $destinationCity $Destination->getIata();
  1837.             $destinationName $Destination->getCity();
  1838.         } else {
  1839.             $destinationAirports $em->getRepository(\Aviatur\SearchBundle\Entity\SearchAirports::class)->findOneByIata($destination)->getSearchCities();
  1840.             $destinationCity $destinationAirports->getIata();
  1841.             $destinationName $destinationAirports->getCity();
  1842.         }
  1843.         $fromCountry $this->getCountryByCityOrAirport($destinationCity);
  1844.         $cityCode $fromCountry->getIataCode();
  1845.         $logRoot $projectDir '/app/xslt/Insurance/country_continent.csv';
  1846.         $destiny GeneralUtilMethods::verify_destiny($logRoot$cityCode);
  1847.         $urlAssist '';
  1848.         $resumeView['urlAssistance'] = '';
  1849.         $ADT 0;
  1850.         $CHD 0;
  1851.         $room 0;
  1852.         $urlHotel '';
  1853.         $safeUrl 'https://' $agency->getDomain();
  1854.         if (isset($resumeView['birthdayDate'][0]['BirthDate'])) {
  1855.             foreach ($resumeView['birthdayDate'] as $array) {
  1856.                 $urlAssist .= $array['BirthDate'] . '+';
  1857.             }
  1858.             $urlAssistance substr($urlAssist0, -1);
  1859.             $resumeView['urlAssistance'] = $destiny '/' $departureTime[0] . '/' $departureArrivalEnd[0] . '/' $urlAssistance '/secure';
  1860.             foreach ($resumeView['travelers'] as $travelers) {
  1861.                 if ('ADT' == $travelers['typeCode']) {
  1862.                     ++$ADT;
  1863.                 } elseif ('CHD' == $travelers['typeCode']) {
  1864.                     ++$CHD;
  1865.                 } elseif ('INF' == $travelers['typeCode']) {
  1866.                     ++$CHD;
  1867.                 }
  1868.             }
  1869.             $ChdAge '';
  1870.             $urlHotel $safeUrl '/hoteles/crossed/' $destinationCity '/' $departureArrival[0] . '+' $departureTimeEnd[0] . '/' $ADT;
  1871.             if ($CHD 0) {
  1872.                 foreach ($calculoEdades as $edad) {
  1873.                     if ($edad 18) {
  1874.                         $ChdAge .= $edad '-';
  1875.                     }
  1876.                 }
  1877.                 $ChdAge substr($ChdAge0, -1);
  1878.                 $urlHotel $urlHotel "+$ChdAge";
  1879.             } else {
  1880.                 $ChdAge 'n';
  1881.                 $urlHotel $urlHotel "+$ChdAge";
  1882.             }
  1883.             if (== $ADT && == $CHD || == $ADT && == $CHD || == $ADT && == $CHD) {
  1884.                 $room 1;
  1885.             } elseif (== $ADT && == $CHD || == $ADT && == $CHD) {
  1886.                 $room 2;
  1887.             } elseif (== $ADT && == $CHD || == $ADT && == $CHD) {
  1888.                 $room 3;
  1889.             } elseif (== $ADT && == $CHD || == $ADT && == $CHD) {
  1890.                 $room 4;
  1891.             } elseif (== $ADT && == $CHD || == $ADT && == $CHD) {
  1892.                 $room 5;
  1893.             }
  1894.         }
  1895.         $validation $em->getRepository(\Aviatur\GeneralBundle\Entity\Parameter::class)->findOneByName('aviatur_crossed_hotel_flight');
  1896.         $validationInsurance $em->getRepository(\Aviatur\GeneralBundle\Entity\Parameter::class)->findOneByName('aviatur_crossed_insurance_flight');
  1897.         $resumeView['ajaxUrl'] = $urlHotel;
  1898.         $resumeView['StartDate'] = $departureTime[0];
  1899.         $resumeView['EndDate'] = $departureArrivalEnd[0];
  1900.         $resumeView['Rooms'] = $room;
  1901.         $resumeView['Children'] = $CHD;
  1902.         $resumeView['Adults'] = $ADT;
  1903.         $resumeView['Origin'] = $originCity;
  1904.         $resumeView['Destination'] = $destinationCity;
  1905.         $resumeView['safeUrl'] = $safeUrl;
  1906.         $resumeView['validation'] = $validation->getValue();
  1907.         $resumeView['validationInsurance'] = $validationInsurance->getValue();
  1908.         $resumeView['cityOrigin'] = $originName;
  1909.         $resumeView['cityDestiny'] = $destinationName;
  1910.         $resumeView['isNational'] = $session->get($transactionId '[flight][isNational]');
  1911.         $resumeView['isCombination'] = $combination;
  1912.         $resumeView['policies'] = $session->get($transactionId '[flight][policies]');
  1913.         $session->set($transactionId '[crossed]' '[url-hotel]'$urlHotel);
  1914.         $session->set($transactionId '[crossed]' '[infoDataFlight]'json_encode($resumeView));
  1915.         $datetime1 = new \DateTime($departureTime[0]);
  1916.         $datetime2 = new \DateTime($departureArrivalEnd[0]);
  1917.         $interval $datetime1->diff($datetime2);
  1918.         $totalDifDay $interval->days;
  1919.         if ($totalDifDay 31) {
  1920.             $resumeView['validation'] = 0;
  1921.         }
  1922.         /* Se debe realizar la iteración por order_product de todo lo guardado por cada vuelo (Viene desde lo ejecutado para correo) */
  1923.         if(null !== $resultadoDataAncillaries){
  1924.             $resumeView['ancillaries'] = $resultadoDataAncillaries;
  1925.         }
  1926.         return ['resumeView' => $resumeView'orderProduct' => $orderProduct];
  1927.     }
  1928.     private function verifyWebbingCandidate(Request $requestParameterBagInterface $parameterBag, \Swift_Mailer $mailer$orderProducts)
  1929.     {
  1930.         $transactionIdSessionName $parameterBag->get('transaction_id_session_name');
  1931.         $addProductData null;
  1932.         $bookingData null;
  1933.         $fullRequest $request;
  1934.         $session $fullRequest->getSession();
  1935.         $transactionId $session->get($transactionIdSessionName);
  1936.         $em $this->getDoctrine()->getManager();
  1937.         $webbingParameter $em->getRepository(\Aviatur\GeneralBundle\Entity\Parameter::class)->findOneByName('aviatur_webbing');
  1938.         $availabilityUrl parse_url($session->get($transactionId '[availability_url]'));
  1939.         $agency $orderProducts[0]->getOrder()->getAgency();
  1940.         if ($webbingParameter->getAgency() && $agency->getId() !== $webbingParameter->getAgency()) {
  1941.             return false;
  1942.         }
  1943.         if (!$webbingParameter || '1' !== $webbingParameter->getValue()) {
  1944.             return false;
  1945.         }
  1946.         if ('approved' !== $orderProducts[0]->getStatus()) {
  1947.             return false;
  1948.         }
  1949.         //Verificar que no se trate de multidestino...
  1950.         if (== preg_match('/\/vuelos\/[A-Z]{3}-[A-Z]{3}\/\d{4}-\d{2}-\d{2}(\+\d{4}-\d{2}-\d{2})?\/\d{1}-\d{1}-\d{1}/'$availabilityUrl['path'])) {
  1951.             return false;
  1952.         }
  1953.         $webbingParameterDescription json_decode($webbingParameter->getDescription());
  1954.         if (isset($webbingParameterDescription->restrictedToClass)) {
  1955.             $permittedClases json_decode(json_encode($webbingParameterDescription->restrictedToClass), true);
  1956.         }
  1957.         $originCities json_decode(json_encode($webbingParameterDescription->originCities), true);
  1958.         $validatingAirline $webbingParameterDescription->validating_airline;
  1959.         $index 0;
  1960.         foreach ($orderProducts as $orderProduct) {
  1961.             $productDataStrXml explode('FILTRO'$orderProduct->getAddProductData());
  1962.             $addProductData simplexml_load_string('<?xml version="1.0" encoding="UTF-8"?><FILTRO' $productDataStrXml[1] . 'FILTRO>'nullLIBXML_NOCDATA);
  1963.             $bookingData simplexml_load_string('<?xml version="1.0" encoding="UTF-8"?><booking_data>' . (string) $addProductData->data->product->booking_data '</booking_data>');
  1964.             if ((string) $bookingData->validating_airline->code !== $validatingAirline) {
  1965.                 return false;
  1966.             }
  1967.             $itinCount 0;
  1968.             foreach ($bookingData->itineraries->itinerary as $itinerary) {
  1969.                 if (== $index && == $itinCount) {
  1970.                     $departureCityCode = (string) $itinerary->departure_city->code;
  1971.                     if (!in_array($departureCityCode$originCities)) {
  1972.                         return false;
  1973.                     }
  1974.                 }
  1975.                 if (isset($permittedClases) && !in_array($itinerary->class_trip->name$permittedClases)) {
  1976.                     return false;
  1977.                 }
  1978.                 ++$itinCount;
  1979.             }
  1980.             ++$index;
  1981.         }
  1982.         $arrayPath explode('/'$availabilityUrl['path']);
  1983.         $arrivalCityCode explode('-'$arrayPath[2])[1];
  1984.         if (isset($webbingParameterDescription->destinationCities)) {
  1985.             if (!in_array($arrivalCityCode$webbingParameterDescription->destinationCities)) {
  1986.                 return false;
  1987.             }
  1988.         }
  1989.         if (isset($webbingParameterDescription->destinationCountries)) {
  1990.             $city $em->getRepository(\Aviatur\GeneralBundle\Entity\City::class)->findOneBy(['iatacode' => $arrivalCityCode]);
  1991.             if (null != $city) {
  1992.                 if (!in_array($city->getCountry()->getIatacode(), json_decode(json_encode($webbingParameterDescription->destinationCountries), true))) {
  1993.                     return false;
  1994.                 }
  1995.             } else {
  1996.                 return false;
  1997.             }
  1998.         }
  1999.         $fromBannerCampaign '';
  2000.         $subjectCampaign '';
  2001.         if ($session->has($transactionId '[webbing]')) {
  2002.             $fromBannerCampaign '<br><p><strong>Compra Generada por Clic en Banner de Campaña !!</strong>';
  2003.             $subjectCampaign ' - Generado por Campaña';
  2004.         }
  2005.         $customer $orderProducts[0]->getOrder()->getCustomer();
  2006.         if (!$session->has($transactionId 'webbingmailSent')) {
  2007.             $mailInfo '<p>El siguiente usuario realizó su reserva por ' ucwords($agency->getDomain()) . ' y cumple con las condiciones para recibir el beneficio Webbing:</p>' .
  2008.                 '<p><strong>Nombre: </strong>' $customer->getFirstname() . ' ' $customer->getLastname() . '</p>' .
  2009.                 '<p><strong>Documento: </strong>' $customer->getDocumentnumber() . '</p>' .
  2010.                 '<p><strong>Teléfono: </strong>Tel:' $customer->getPhone() . '- Cel:' $customer->getCellphone() . '</p>' .
  2011.                 '<p><strong>Correo electrónico: </strong>' $customer->getEmail() . '</p>' .
  2012.                 '<p><strong>Producto: </strong>PN' $orderProducts[0]->getId() . '</p>' .
  2013.                 '<p><strong>Cantidad de Pasajeros: </strong>' . (string) $addProductData->data->product->passengers_numbers '</p>' .
  2014.                 '<p><strong>Fecha inicio viaje: </strong>' . (string) $bookingData->itineraries->itinerary->departure_datetime '</p>' .
  2015.                 $fromBannerCampaign;
  2016.             $message = (new \Swift_Message())
  2017.                 ->setContentType('text/html')
  2018.                 ->setFrom($webbingParameterDescription->fromEmail)
  2019.                 ->setTo($webbingParameterDescription->destinationEmail)
  2020.                 ->setBcc('errores.prod.web@aviatur.com')
  2021.                 ->setSubject($webbingParameterDescription->subject $subjectCampaign)
  2022.                 ->setBody($mailInfo);
  2023.             $mailer->send($message);
  2024.             $session->set($transactionId 'webbingmailSent'true);
  2025.         }
  2026.         return true;
  2027.     }
  2028.     private function getListAncillaries($session$transactionId$orderProduct$passengersInfo$prepaymentInfo){
  2029.         $em $this->em;
  2030.         /* validación temporal en caso de Avianca Amadeus 153 */
  2031.         /* Para aplicar en validaciones asociadas a ancillaries (Código IATA sin NDC- en caso de tenerlo) */
  2032.         $ticketingVendor $prepaymentInfo->Message->OTA_AirBookRS->AirReservation->Ticketing->TicketingVendor;
  2033.         $airlineCodeTicketing = isset($ticketingVendor['CodeContext']) ? (string) $ticketingVendor['CodeContext'] : (string) $ticketingVendor['Code'];
  2034.         if(false !== strpos($airlineCodeTicketing'-')){
  2035.             $arrayAirlineCode explode('-'$airlineCodeTicketing);
  2036.             $airlineCodeTicketing $arrayAirlineCode[1];
  2037.         }
  2038.         $ticketingVendorAirline $em->getRepository(\Aviatur\FlightBundle\Entity\Airline::class)->findOneByIata($airlineCodeTicketing);
  2039.         $airlineIdVendor $ticketingVendorAirline->getId();
  2040.         $vectorAncillariesData $orderProduct->getOrder()->getAncillariesOrder();
  2041.         $emissionDataAncillaries null;
  2042.         if (isset($vectorAncillariesData)) {
  2043.             if (sizeof($vectorAncillariesData) > 0) {
  2044.                 $emissionDataAncillaries $vectorAncillariesData[0]->getData();
  2045.             }
  2046.         }
  2047.         if(null !== $emissionDataAncillaries && === $this->getValueAncillaries($orderProduct->getOrder()->getAgency()->getId(), $orderProduct->getProvider()->getId(), $airlineIdVendor)){
  2048.             $arrayFlightNumbers = [];
  2049.             $churnings $orderProduct->getOrder()->getChurning();
  2050.             /* Para aplicar por cada flight number */
  2051.             foreach ($churnings as $churning) {
  2052.                 if(!in_array($churning->getFlightnumber(), $arrayFlightNumbers)){
  2053.                     $arrayFlightNumbers[] = $churning->getFlightnumber();
  2054.                 }
  2055.             }
  2056.             $arrayEmissionData json_decode($emissionDataAncillariestrue);
  2057.             $arrayEmissionData["baggage"] = json_decode(json_decode(json_encode(urldecode($arrayEmissionData["baggage"]))), true);
  2058.             $arrayEmissionData["seats"] = json_decode(json_decode(json_encode(urldecode($arrayEmissionData["seats"]))), true);
  2059.             // Precio total de ancillaries desde addProductData
  2060.             $addProductDataStrXml explode('FILTRO'$orderProduct->getAddProductData());
  2061.             $addProductData = \simplexml_load_string('<FILTRO'.$addProductDataStrXml[1].'FILTRO>');
  2062.             $resultAncillaries $addProductData->xpath("//ancillaries/ancillarie");
  2063.             $arrayEmissionData["totalseats"] = [
  2064.                 "totalAmount" => 0,
  2065.                 "currency" => '',
  2066.                 "baseAmount" => 0
  2067.             ];
  2068.             $arrayEmissionData["totalbaggage"] = [
  2069.                 "totalAmount" => 0,
  2070.                 "currency" => '',
  2071.                 "baseAmount" => 0
  2072.             ];
  2073.             $ancillaryTypes = [
  2074.                 'seat' => 'totalseats',
  2075.                 'baggage' => 'totalbaggage'
  2076.             ];
  2077.             foreach($resultAncillaries as $ancillarie){
  2078.                 $currencyAncillarie = (string) $ancillarie->UnitPrice->Currency;
  2079.                 $totalAmountAncillarie $ancillarie->UnitPrice->TotalAmount;
  2080.                 $baseAmountAncillarie $ancillarie->UnitPrice->BaseAmount;
  2081.                 $type = (string) $ancillarie->type;
  2082.                 if (isset($ancillaryTypes[$type])) {
  2083.                     $typeKey $ancillaryTypes[$type];
  2084.                     $arrayEmissionData[$typeKey]["totalAmount"] += $totalAmountAncillarie;
  2085.                     $arrayEmissionData[$typeKey]["baseAmount"] += $baseAmountAncillarie;
  2086.                     $arrayEmissionData[$typeKey]["currency"] = $currencyAncillarie;
  2087.                 }
  2088.             }
  2089.             // Inicializar el array agrupado
  2090.             $bagggegrouped = [];
  2091.             if(is_iterable($arrayEmissionData["baggage"])){
  2092.                 foreach ($arrayEmissionData["baggage"] as $item) {
  2093.                     $route $item['route'];
  2094.                     $paxRefID $item['PaxRefID'];
  2095.                     $name $item['name'];
  2096.                     // Crear la estructura si no existe
  2097.                     if (!isset($bagggegrouped[$route])) {
  2098.                         $bagggegrouped[$route] = [];
  2099.                     }
  2100.                     if (!isset($bagggegrouped[$route][$paxRefID])) {
  2101.                         $bagggegrouped[$route][$paxRefID] = [];
  2102.                     }
  2103.                     // Agregar el OfferItemID al array correspondiente
  2104.                     $bagggegrouped[$route][$paxRefID][] = $name;
  2105.                 }
  2106.             }
  2107.             $seatsgrouped = [];
  2108.             if(is_iterable($arrayEmissionData["seats"])){
  2109.                 foreach ($arrayEmissionData["seats"] as $item) {
  2110.                     $route $item['route'];
  2111.                     $paxRefID $item['PaxRefID'];
  2112.                     $selectedSeat $item['SelectedSeat'];
  2113.                     // Crear la estructura si no existe
  2114.                     if (!isset($seatsgrouped[$route])) {
  2115.                         $seatsgrouped[$route] = [];
  2116.                     }
  2117.                     if (!isset($seatsgrouped[$route][$paxRefID])) {
  2118.                         $seatsgrouped[$route][$paxRefID] = [];
  2119.                     }
  2120.                     // Agregar el OfferItemID al array correspondiente
  2121.                     $seatsgrouped[$route][$paxRefID][] = $selectedSeat;
  2122.                 }
  2123.             }
  2124.             $arrayEmissionData["seatsgrouped"] = $seatsgrouped;
  2125.             $arrayEmissionData["baggagegrouped"] = $bagggegrouped;
  2126.             return $arrayEmissionData;
  2127.         } else {
  2128.             return null;
  2129.         }
  2130.     }
  2131.     /**
  2132.      * Get ancillaries value by parameters in config
  2133.      *
  2134.      * @param $agencyId
  2135.      * @param $providerId
  2136.      * @param $airlineId
  2137.      *
  2138.      * @return int
  2139.      */
  2140.     public function getValueAncillaries($agencyId$providerId$airlineId): int
  2141.     {
  2142.         $em $this->em;
  2143.         $configFlightAncillariesAgency $em->getRepository(\Aviatur\FlightBundle\Entity\ConfigFlightAncillariesAgency::class)
  2144.             ->findIsActiveAncillaries($agencyId$providerId$airlineId);
  2145.         $ancillaries 0;
  2146.         if ($configFlightAncillariesAgency != null) {
  2147.             $ancillaries $configFlightAncillariesAgency->getIsactive() ? 0;
  2148.         }
  2149.         return $ancillaries;
  2150.     }
  2151.     /**
  2152.      * Agrega enlaces de consulta de documentación de viaje internacional por segmento y pasajero.
  2153.      *
  2154.      * Esta función recorre los segmentos de vuelo (journeySummaries) y, para cada viajero,
  2155.      * genera los enlaces necesarios para consultar la documentación requerida según país de origen,
  2156.      * destino y nacionalidad. Considera paradas técnicas y escalas, agrupando los países involucrados
  2157.      * en el trayecto. Los enlaces generados se almacenan en la clave 'docLinks' de cada viajero.
  2158.      * Solo se generan enlaces si el viaje es internacional (país de origen y destino diferentes).
  2159.      *
  2160.      * @param array &$travelers Arreglo por referencia con los datos de los viajeros.
  2161.      * @param array $journeySummaries Arreglo con los segmentos de vuelo y sus detalles.
  2162.      * @param string $baseURL URL base para generar los enlaces de documentación.
  2163.      * @return void No retorna valor, modifica el arreglo de viajeros por referencia.
  2164.      * @author david.rincon@aviatur.com
  2165.      * @date 2025-08-12
  2166.      */
  2167.     public function includingDataForDocumentationPerSegment(&$travelers, &$journeySummaries$baseURL)
  2168.     {
  2169.         $em $this->em;
  2170.         $aviaturWstimaticParam $em->getRepository(\Aviatur\GeneralBundle\Entity\Parameter::class)->findOneByName('aviatur_wstimatic');
  2171.         if (null !== $aviaturWstimaticParam) {
  2172.             if ('' !== $aviaturWstimaticParam->getValue()) {
  2173.                 $counterTravelers sizeof($travelers);
  2174.                 $counterJourneySummaries sizeof($journeySummaries);
  2175.                 for($indexJourneySummaries 0$indexJourneySummaries $counterJourneySummaries$indexJourneySummaries++) {
  2176.                     $counterLastFlightDetail sizeof($journeySummaries[$indexJourneySummaries]['flightDetails']);
  2177.                     $originCode $journeySummaries[$indexJourneySummaries]['flightDetails'][0]['DepartureCountryCode'];
  2178.                     $destinationCode $journeySummaries[$indexJourneySummaries]['flightDetails'][$counterLastFlightDetail 1]['ArrivalCountryCode'];
  2179.                     /* No se debe generar documentación si es un viaje que tenga origen y destino en un mismo país */
  2180.                     if($originCode === $destinationCode){
  2181.                         continue;
  2182.                     }
  2183.                     /* Se debe generar un arreglo en el cual de forma ordenada, se registren las paradas y escalas en parejas de origen y destino por país */
  2184.                     /* Se debe validar que al menos se tenga un país de origen y destino diferente, al revisar cada tramo del vuelo */
  2185.                     $journeySummary $journeySummaries[$indexJourneySummaries];
  2186.                     $flightDetails $journeySummary['flightDetails'];
  2187.                     $counterFlightDetails sizeof($flightDetails);
  2188.                     $arrayStops = [];
  2189.                     for($indexFlightDetails 0$indexFlightDetails $counterFlightDetails$indexFlightDetails++) {
  2190.                         if(is_null($flightDetails[$indexFlightDetails]['technicalStop'])){
  2191.                             $arrayStops[] = [
  2192.                                 'DepartureCountryCode' => $flightDetails[$indexFlightDetails]['DepartureCountryCode'],
  2193.                                 'ArrivalCountryCode' => $flightDetails[$indexFlightDetails]['ArrivalCountryCode']
  2194.                             ];
  2195.                             $journeySummaries[$indexJourneySummaries]['flightDetails'][$indexFlightDetails]['stopOverCountryIata'] = $flightDetails[$indexFlightDetails]['ArrivalCountryCode'];
  2196.                         } else {
  2197.                             /* Se debe guardar como último arreglo en línea el que corresponde a la última parada técnica como origen */
  2198.                             $lastCountryCode "";
  2199.                             $isTheFirstStop true;
  2200.                             for($indexStop 0$indexStop sizeof($flightDetails[$indexFlightDetails]['technicalStop']); $indexStop++) {
  2201.                                 $countryIata "";
  2202.                                 $cityCode $flightDetails[$indexFlightDetails]['technicalStop'][$indexStop]['CityCode'];
  2203.                                 $tempTechnicalStopAirportIata $em->getRepository(\Aviatur\SearchBundle\Entity\SearchAirports::class)->findOneByIata($cityCode);
  2204.                                 if (!is_null($tempTechnicalStopAirportIata)) {
  2205.                                     $countryIata $tempTechnicalStopAirportIata->getCountrycode();
  2206.                                 }
  2207.                                 if($countryIata == ""){
  2208.                                     /* Al no hallar país, se debe seguir con otro registro de paradas */
  2209.                                     continue;
  2210.                                 }
  2211.                                 if($isTheFirstStop){
  2212.                                     $arrayStops[] = [
  2213.                                         'DepartureCountryCode' => $flightDetails[$indexFlightDetails]['DepartureCountryCode'],
  2214.                                         'ArrivalCountryCode' => $countryIata
  2215.                                     ];
  2216.                                 } else {
  2217.                                     $arrayStops[] = [
  2218.                                         'DepartureCountryCode' => $lastCountryCode,
  2219.                                         'ArrivalCountryCode' => $countryIata
  2220.                                     ];
  2221.                                 }
  2222.                                 $journeySummaries[$indexJourneySummaries]['flightDetails'][$indexFlightDetails]['technicalStop'][$indexStop]['countryIata'] = $countryIata;
  2223.                                 $lastCountryCode $countryIata;
  2224.                                 $isTheFirstStop false;
  2225.                             }
  2226.                             $arrayStops[] = [
  2227.                                 'DepartureCountryCode' => ($lastCountryCode !== "" $lastCountryCode $flightDetails[$indexFlightDetails]['DepartureCountryCode']),
  2228.                                 'ArrivalCountryCode' => $flightDetails[$indexFlightDetails]['ArrivalCountryCode']
  2229.                             ];
  2230.                             $journeySummaries[$indexJourneySummaries]['flightDetails'][$indexFlightDetails]['stopOverCountryIata'] = $flightDetails[$indexFlightDetails]['ArrivalCountryCode'];
  2231.                         }
  2232.                     }
  2233.                     /* Si solo hay un único tramo por viaje, no debería generar transits */
  2234.                     $linealListOfStops "";
  2235.                     $counterStops sizeof($arrayStops);
  2236.                     $isTheSameCountry true;
  2237.                     for($indexStops 0$indexStops $counterStops$indexStops++) {
  2238.                         if($linealListOfStops !== "" || $isTheSameCountry === false){
  2239.                             $linealListOfStops .= ";";
  2240.                             $isTheSameCountry true;
  2241.                         }
  2242.                         if($arrayStops[$indexStops]['ArrivalCountryCode'] !== $arrayStops[$indexStops]['DepartureCountryCode']){
  2243.                             $linealListOfStops .= $arrayStops[$indexStops]['ArrivalCountryCode'];
  2244.                             $isTheSameCountry false;
  2245.                         } else {
  2246.                             if(strlen($linealListOfStops) > 0){
  2247.                                 if(strpos($linealListOfStops";"strlen($linealListOfStops) - 1) !== false){
  2248.                                     $linealListOfStops substr($linealListOfStops0strlen($linealListOfStops) - 1);
  2249.                                 }
  2250.                             }
  2251.                             $isTheSameCountry true;
  2252.                         }
  2253.                     }
  2254.                     /* Se debe revisar que al menos se tengan 2 países para validar las paradas */
  2255.                     if(strpos($linealListOfStops";") === false){
  2256.                         $linealListOfStops "";
  2257.                     }
  2258.                     if($counterTravelers 0){
  2259.                         for($indexTravelers 1$indexTravelers <= $counterTravelers$indexTravelers++) {
  2260.                             $readyLink $baseURL."wstimatic/documentation/".$originCode."/".$destinationCode."/".$travelers[$indexTravelers]['Nationality'];
  2261.                             $readyLink .= "/".(str_replace(" ""."strtolower($travelers[$indexTravelers]['GivenName'])."."));
  2262.                             $readyLink .= (str_replace(" ""."strtolower($travelers[$indexTravelers]['Surname'])));
  2263.                             if($linealListOfStops !== ""){
  2264.                                 $readyLink .= "/".$linealListOfStops;
  2265.                             }
  2266.                             if(!isset($travelers[$indexTravelers]['docLinks'])){
  2267.                                 $travelers[$indexTravelers]['docLinks'] = [];
  2268.                             }
  2269.                             $travelers[$indexTravelers]['docLinks'][] = $readyLink;
  2270.                         }
  2271.                     }
  2272.                 }
  2273.             }
  2274.         }
  2275.     }
  2276.     /**
  2277.      * Obtiene la nacionalidad de un pasajero a partir de los datos del producto adicional.
  2278.      *
  2279.      * @param $addProductData Objeto que contiene los datos del producto adicional.
  2280.      * @param $passengerType Tipo de pasajero (ADT, CHD, INF).
  2281.      * @param $givenName Nombre del pasajero.
  2282.      * @param $surname Apellido del pasajero.
  2283.      *
  2284.      * @return string Código de nacionalidad del pasajero.
  2285.      * @author david.rincon@aviatur.com
  2286.      * Date 2025-07-31
  2287.      */
  2288.     public function getNationalityByAddProductData($addProductData$passengerType$givenName$surname)
  2289.     {
  2290.         $nationality 'CO';    /* Por defecto */
  2291.         if (isset($addProductData->data->product->passengers)) {
  2292.             $firstArrayPassengers = (array)$addProductData->data->product->passengers;
  2293.             $arrayPassengers = (array)$firstArrayPassengers['passenger'];
  2294.             if(isset($arrayPassengers["type"])){
  2295.                 /* Un solo viajero */
  2296.                 if (mb_strtolower((string)$arrayPassengers["type"]) === $passengerType && mb_strtolower((string)$arrayPassengers["first_name"]) === $givenName && mb_strtolower((string)$arrayPassengers["first_last_name"]) === $surname) {
  2297.                     $nationality = (string)$arrayPassengers["nationality"];
  2298.                 }
  2299.             } else {
  2300.                 /* Múltiples viajeros */
  2301.                 foreach ($arrayPassengers as $passenger) {
  2302.                     if (mb_strtolower((string)$passenger->type) === $passengerType && mb_strtolower((string)$passenger->first_name) === $givenName && mb_strtolower((string)$passenger->first_last_name) === $surname) {
  2303.                         $nationality = (string)$passenger->nationality;
  2304.                         break;
  2305.                     }
  2306.                 }
  2307.             }
  2308.         }
  2309.         return $nationality;
  2310.     }
  2311.     private function getCountryByCityOrAirport($citySearch)
  2312.     {
  2313.         $em $this->em;
  2314.         $city $em->getRepository(\Aviatur\GeneralBundle\Entity\City::class)->findOneByIatacode($citySearch);
  2315.         if(!$city)
  2316.             $airport $em->getRepository(\Aviatur\SearchBundle\Entity\SearchAirports::class)->findOneByIata($citySearch);
  2317.         if($city)
  2318.             return $city->getCountry();
  2319.         else if($airport)
  2320.             return $em->getRepository(\Aviatur\GeneralBundle\Entity\Country::class)->findOneByIatacode($airport->getCountryCode());
  2321.     }
  2322. }