<?php
namespace Aviatur\FlightBundle\Controller;
use Aviatur\DocumentationBundle\Models\DocumentationModel;
use Aviatur\FlightBundle\Services\FlightResumeServices;
use Aviatur\FlightBundle\Services\GenerateFlightResumeEmail;
use Aviatur\FlightBundle\Services\SkyscannerTracker;
use Aviatur\GeneralBundle\Services\AviaturEncoder;
use Aviatur\GeneralBundle\Services\AviaturErrorHandler;
use Aviatur\GeneralBundle\Services\AviaturWebService;
use Aviatur\GeneralBundle\Services\ExceptionLog;
use Aviatur\GeneralBundle\Util\DeviceData;
use Aviatur\GeneralBundle\Util\GeneralUtilMethods;
use Aviatur\InsuranceBundle\Services\InsuranceService;
use Aviatur\PaymentBundle\Models\WorldModel;
use Aviatur\TwigBundle\Services\TwigFolder;
use Doctrine\Persistence\ManagerRegistry;
use Knp\Snappy\Pdf;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
// use Knp\Snappy\GeneratorInterface;
class FlightResumeController extends AbstractController
{
/**
* @var ManagerRegistry
*/
protected ManagerRegistry $managerRegistry;
protected $paymentMethod;
protected SessionInterface $session;
protected SkyscannerTracker $skyscannerTracker;
private $em;
private FlightResumeServices $flightResumeServices;
public function __construct(ManagerRegistry $managerRegistry, SessionInterface $session, SkyscannerTracker $skyscannerTracker, FlightResumeServices $flightResumeServices) {
$this->managerRegistry = $managerRegistry;
$this->session = $session;
$this->skyscannerTracker = $skyscannerTracker;
$em = $this->managerRegistry->getManager();
$this->em = $em;
$agencyId = $session->has('agencyId') ? $session->get('agencyId') : 1;
$agency = $em->getRepository(\Aviatur\AgencyBundle\Entity\Agency::class)->find($agencyId);
$paymentMethods = $this->managerRegistry->getRepository(\Aviatur\GeneralBundle\Entity\PaymentMethod::class)->findByCode(['pse', 'pseRest']);
$activePayments = array_filter($paymentMethods, function($payment) use ($agency, $em) {
$paymentMethodAgency = $em->getRepository(\Aviatur\GeneralBundle\Entity\PaymentMethodAgency::class)
->findOneBy(['agency' => $agency->getId(), 'paymentMethod' => $payment->getId()]);
return $payment->getIsactive() && $paymentMethodAgency && $paymentMethodAgency->getIsactive();
});
switch (count($activePayments)) {
case 0:
$this->paymentMethod = null;
break;
case 1:
$this->paymentMethod = reset($activePayments);
break;
default:
$paymentMethod = $em->getRepository(\Aviatur\GeneralBundle\Entity\PaymentMethod::class)->findOneByCode('pseRest');
$this->paymentMethod = $paymentMethod;
break;
}
$this->flightResumeServices = $flightResumeServices;
}
public function paymentOutputAction(
Request $request,
RouterInterface $router,
SessionInterface $session,
ParameterBagInterface $parameterBag,
TwigFolder $twigFolder,
AuthorizationCheckerInterface $authorizationChecker,
AviaturEncoder $aviaturEncoder,
GenerateFlightResumeEmail $generateFlightResumeEmail,
AviaturWebService $webService,
InsuranceService $insuranceService,
Pdf $pdf,
AviaturErrorHandler $errorHandler,
ExceptionLog $exceptionLog,
\Swift_Mailer $mailer
) {
$projectDir = $parameterBag->get('kernel.project_dir');
$transactionIdSessionName = $parameterBag->get('transaction_id_session_name');
$correlationIdSessionName = $parameterBag->get('correlation_id_session_name');
$emailNotification = $parameterBag->get('email_notification');
$em = $this->em;
$transactionId = $session->get($transactionIdSessionName);
$orderProductCode = $session->get($transactionId . '[flight][order]');
if (isset($orderProductCode->products) && $orderProductCode->products != null) {
$productId = str_replace('PN', '', json_decode($orderProductCode)->products ?? null);
$orderProduct = $em->getRepository(\Aviatur\GeneralBundle\Entity\OrderProduct::class)->find($productId);
} else {
$bookingIds = [];
// Verificamos los posibles índices de prepayment (0, 1 y el base)
$prepaymentKeys = ['[flight][prepayment]', '[flight][prepayment0]', '[flight][prepayment1]'];
foreach ($prepaymentKeys as $key) {
$xmlString = $session->get($transactionId . $key);
if ($xmlString) {
$xml = simplexml_load_string($xmlString);
if ($xml && isset($xml->Message->OTA_AirBookRS->AirReservation->BookingReferenceID['ID'])) {
$id = (string) $xml->Message->OTA_AirBookRS->AirReservation->BookingReferenceID['ID'];
if (!in_array($id, $bookingIds)) {
$bookingIds[] = $id;
}
}
}
}
// Buscamos todos los productos asociados a esos PNRs
$orderProducts = $em
->getRepository(\Aviatur\GeneralBundle\Entity\OrderProduct::class)
->findBy(['booking' => $bookingIds]);
// Para mantener la compatibilidad con el código siguiente que usa $orderProduct (singular)
$orderProduct = !empty($orderProducts) ? $orderProducts[0] : null;
}
$addProductDataStrXml = explode('FILTRO', $orderProduct->getAddProductData());
$addProductData = \simplexml_load_string('<FILTRO'.$addProductDataStrXml[1].'FILTRO>');
$decodedResponseExperience = null;
$voucherFilePDF = null;
$fullRequest = $request;
$transactionId = $session->get($transactionIdSessionName);
if ($session->has($transactionId.'[flight][orderToValidateDuplicatePassengerOnFlight]')) {
$session->remove($transactionId.'[flight][orderToValidateDuplicatePassengerOnFlight]');
}
if ($session->has($transactionId . '[typeCoin]')) {
$session->set('typeCoin', $session->get($transactionId . '[typeCoin]'));
}
$orderProducts = [];
$resumeArray = [
'backDetail' => $this->generateUrl('aviatur_flight_retry_secure'),
'retryCount' => 0,
'transactionState' => [
'combined_states' => false
],
'infos' => [],
];
$worldPayConciliacion = $session->has($transactionId . '[flight][worldpay_conciliacion]') ? $session->get($transactionId . '[flight][worldpay_conciliacion]') : [];
if (!empty($worldPayConciliacion) && is_array($worldPayConciliacion)) {
$resumeArray['worldPayConciliacion'] = $worldPayConciliacion;
}
if ($session->has($transactionId . '[flight][detail_data_flight]')) {
$correlationId = $session->get($transactionId . '[flight][' . $correlationIdSessionName . ']');
$isFront = $session->has('operatorId');
$datosAgente = simplexml_load_string($session->get('front_user'));
$gdsPnrs = [];
$airlinePnrs = [];
if (false !== strpos($correlationId, '||')) {
$correlationIds = explode('||', $correlationId);
$cantFlight = count($correlationIds);
foreach ($correlationIds as $key => $correlationId) {
if (!$isFront && !$session->has($transactionId . '[paylater]') && !$session->has($transactionId . '[paylink]')) {
$cantFlight = count($resumeArray['infos']) > 0 ? count($resumeArray['infos'][0]['journeySummaries'][0]['flightDetails']) : 0;
$resumeTemp = $this->resumeOutput($request, $session, $parameterBag, $twigFolder, $authorizationChecker,
$aviaturEncoder, $insuranceService, $mailer, true, $cantFlight, $router, $key
);
$gdsPnrs[] = $resumeTemp['resumeView']['paymentResume']['id'] ?? '';
$airlinePnrs[] = $resumeTemp['resumeView']['paymentResume']['recordBooking'] ?? '';
// combined_states cambia a true si los estados de pago de las transacciones son distintos
if(isset($resumeArray['transactionState']['transaction_state']) && $resumeArray['transactionState']['transaction_state'] != $resumeTemp['resumeView']['paymentResume']['transaction_state']){
$resumeArray['transactionState']['combined_states'] = true;
}
// Guardando el último método de pago
$resumeArray['paymentMethod'] = $resumeTemp['resumeView']['paymentResume']['payment_gateway'];
switch ($resumeTemp['resumeView']['paymentResume']['transaction_state']) {
case 'OK':
case 'APPROVED':
case 1:
$resumeArray['transactionState']['transaction_state'] = 1;
break;
case 'NOT_AUTHORIZED':
case 2:
$resumeArray['transactionState']['transaction_state'] = 2;
break;
case 'PENDING':
case 3:
$resumeArray['transactionState']['transaction_state'] = 3;
break;
default:
$resumeArray['transactionState']['transaction_state'] = 4;
break;
}
switch ($resumeTemp['resumeView']['paymentResume']['transaction_state_cyber']) {
case 1:
if (!isset($resumeArray['transactionState']['transaction_state_cyber'])) {
$resumeArray['transactionState']['transaction_state_cyber'] = 1;
}
break;
case 2:
if (!isset($resumeArray['transactionState']['transaction_state_cyber']) || ((isset($resumeArray['transactionState']['transaction_state_cyber'])) && (1 == $resumeArray['transactionState']['transaction_state_cyber']))) {
$resumeArray['transactionState']['transaction_state_cyber'] = 2;
}
break;
default:
$resumeArray['transactionState']['transaction_state'] = 3;
break;
}
if (isset($resumeTemp['resumeView']['paymentResume']['paymentMethod']) && 'world' == $resumeTemp['resumeView']['paymentResume']['paymentMethod']) {
$resumeArray['transactionState']['paymentMethod'] = $resumeTemp['resumeView']['paymentResume']['paymentMethod'];
}
$resumeArray['retryCount'] = (int) $session->get($transactionId . '[flight][retry' . $key . ']');
$resumeArray['infos'][] = $resumeTemp['resumeView'];
$orderProducts[] = $resumeTemp['orderProduct'];
if (isset($resumeArray['infos'][$key]['paymentResume'])) {
if ('NOT_AUTHORIZED' == $resumeArray['infos'][$key]['paymentResume']['transaction_state']) {
$resumeArray['infos'][$key]['paymentResume']['transaction_state'] = '2';
} elseif ('FAILED' == $resumeArray['infos'][$key]['paymentResume']['transaction_state']) {
$resumeArray['infos'][$key]['paymentResume']['transaction_state'] = '4';
} elseif ('OK' == $resumeArray['infos'][$key]['paymentResume']['transaction_state'] || 'APPROVED' == $resumeArray['infos'][$key]['paymentResume']['transaction_state']) {
$resumeArray['infos'][$key]['paymentResume']['transaction_state'] = '1';
} elseif ('PENDING' == $resumeArray['infos'][$key]['paymentResume']['transaction_state']) {
$resumeArray['infos'][$key]['paymentResume']['transaction_state'] = '3';
}
}
} else {
$orderInfo = json_decode($session->get($transactionId . '[flight][order' . $key . ']'));
$productId = str_replace('PN', '', $orderInfo->products);
$orderProduct = $em->getRepository(\Aviatur\GeneralBundle\Entity\OrderProduct::class)->find($productId);
$orderProducts[] = $orderProduct;
$resumeArray['infos'][$key] = json_decode($generateFlightResumeEmail->GenerateEmail($orderProduct, true, $key), true);
// Fallback para llaves de sesión de prepago por tramo
$pKey = ($key === 0 && !$session->has($transactionId . '[flight][prepayment0]'))
? '[flight][prepayment]'
: '[flight][prepayment' . $key . ']';
$xmlSegment = $session->get($transactionId . $pKey);
$currentGds = '';
$currentAir = '';
if ($xmlSegment) {
$xmlObj = simplexml_load_string($xmlSegment);
if ($xmlObj && isset($xmlObj->Message->OTA_AirBookRS->AirReservation->BookingReferenceID['ID'])) {
$currentGds = (string) $xmlObj->Message->OTA_AirBookRS->AirReservation->BookingReferenceID['ID'];
$currentAir = (string) $xmlObj->Message->OTA_AirBookRS->AirReservation->BookingReferenceID->TPA_Extensions->AirlineBookingCode;
}
}
if (empty($currentAir)) { $currentAir = $orderProduct->getBooking(); }
if (empty($currentGds)) { $currentGds = $orderProduct->getBooking(); }
$resumeArray['infos'][$key]['paymentResume']['id'] = $currentGds;
$resumeArray['infos'][$key]['paymentResume']['recordBooking'] = $currentAir;
$gdsPnrs[] = $currentGds;
$airlinePnrs[] = $currentAir;
}
if ($session->has($transactionId . '[multi][cash_result]')) {
$resumeArray['infos'][$key]['paymentResume']['transaction_state'] = 3;
}
}
} else {
if (!$isFront && !$session->has($transactionId . '[paylater]') && !$session->has($transactionId . '[paylink]')) {
$resumeTemp = $this->resumeOutput($request, $session, $parameterBag, $twigFolder,
$authorizationChecker, $aviaturEncoder, $insuranceService, $mailer, false, 0, $router, 0
);
$resumeArray['transactionState']['transaction_state_cyber'] = $resumeTemp['resumeView']['paymentResume']['transaction_state_cyber'];
$resumeArray['transactionState']['transaction_state'] = $resumeTemp['resumeView']['paymentResume']['transaction_state'];
$resumeArray['paymentMethod'] = $resumeTemp['resumeView']['paymentResume']['payment_gateway'];
$resumeArray['retryCount'] = (int) $session->get($transactionId . '[flight][retry]');
$resumeArray['infos'][0] = $resumeTemp['resumeView'];
$orderProducts[0] = $resumeTemp['orderProduct'];
$gdsPnrs[] = $resumeTemp['resumeView']['paymentResume']['id'] ?? '';
$airlinePnrs[] = $resumeTemp['resumeView']['paymentResume']['recordBooking'] ?? '';
} else {
$resumeArray['transactionState']['transaction_front'] = 1;
$orderInfo = json_decode($session->get($transactionId . '[flight][order]'));
$productId = str_replace('PN', '', $orderInfo->products);
$orderProducts[0] = $em->getRepository(\Aviatur\GeneralBundle\Entity\OrderProduct::class)->find($productId);
$resumeArray['infos'][0] = json_decode($generateFlightResumeEmail->GenerateEmail($orderProducts[0], false), true);
// Extraemos códigos del XML en sesión para el segmento único
$xmlSegment = $session->get($transactionId . '[flight][prepayment]');
if ($xmlSegment) {
$xmlObj = simplexml_load_string($xmlSegment);
if ($xmlObj && isset($xmlObj->Message->OTA_AirBookRS->AirReservation->BookingReferenceID['ID'])) {
$resumeArray['infos'][0]['paymentResume']['id'] = (string) $xmlObj->Message->OTA_AirBookRS->AirReservation->BookingReferenceID['ID'];
$resumeArray['infos'][0]['paymentResume']['recordBooking'] = (string) $xmlObj->Message->OTA_AirBookRS->AirReservation->BookingReferenceID->TPA_Extensions->AirlineBookingCode;
}
}
if (empty($resumeArray['infos'][0]['paymentResume']['recordBooking'])) {
$resumeArray['infos'][0]['paymentResume']['recordBooking'] = $orderProducts[0]->getBooking();
}
$resumeArray['infos'][0]['paymentResume']['id'] = !empty($resumeArray['infos'][0]['paymentResume']['id']) ? $resumeArray['infos'][0]['paymentResume']['id'] : $orderProducts[0]->getBooking();
$gdsPnrs[] = $resumeArray['infos'][0]['paymentResume']['id'];
$airlinePnrs[] = $resumeArray['infos'][0]['paymentResume']['recordBooking'];
}
if ($session->has($transactionId . '[multi][cash_result]')) {
$resumeArray['infos'][0]['paymentResume']['transaction_state'] = 3;
}
}
if (!$isFront && !$session->has($transactionId . '[paylater]') && !$session->has($transactionId . '[paylink]')) {
if ('NOT_AUTHORIZED' == $resumeArray['transactionState']['transaction_state']) {
$resumeArray['transactionState']['transaction_state'] = '2';
} elseif ('FAILED' == $resumeArray['transactionState']['transaction_state']) {
$resumeArray['transactionState']['transaction_state'] = '4';
} elseif ('OK' == $resumeArray['transactionState']['transaction_state'] || 'APPROVED' == $resumeArray['transactionState']['transaction_state']) {
$resumeArray['transactionState']['transaction_state'] = '1';
} elseif ('PENDING' == $resumeArray['transactionState']['transaction_state']) {
$resumeArray['transactionState']['transaction_state'] = '3';
}
if ('NOT_AUTHORIZED' == $resumeArray['infos'][0]['paymentResume']['transaction_state']) {
$resumeArray['infos'][0]['paymentResume']['transaction_state'] = '2';
} elseif ('FAILED' == $resumeArray['infos'][0]['paymentResume']['transaction_state']) {
$resumeArray['infos'][0]['paymentResume']['transaction_state'] = '4';
} elseif ('OK' == $resumeArray['infos'][0]['paymentResume']['transaction_state'] || 'APPROVED' == $resumeArray['infos'][0]['paymentResume']['transaction_state']) {
$resumeArray['infos'][0]['paymentResume']['transaction_state'] = '1';
} elseif ('PENDING' == $resumeArray['infos'][0]['paymentResume']['transaction_state']) {
$resumeArray['infos'][0]['paymentResume']['transaction_state'] = '3';
}
}
//get passenger infos for Front
if ($isFront || $session->has($transactionId . '[paylater]') || $session->has($transactionId . '[paylink]')) {
$productXml = explode('FILTRO', $orderProducts[0]->getAddproductdata());
$productObj = \simplexml_load_string('<FILTRO' . $productXml[1] . 'FILTRO>');
$resumeArray['travelers'] = [];
$key = 0;
foreach ($productObj->data->product->passengers->passenger as $passenger) {
$resumeArray['travelers'][$key]['typeCode'] = (string) $passenger->type;
$resumeArray['travelers'][$key]['GivenName'] = (string) $passenger->first_name;
$resumeArray['travelers'][$key]['Surname'] = (string) $passenger->first_last_name;
++$key;
}
}
$agencyFolder = $twigFolder->twigFlux();
$route = $router->match(str_replace($fullRequest->getSchemeAndHttpHost(), '', $fullRequest->getUri()));
$isMulti = false !== strpos($route['_route'], 'multi') ? true : false;
if ($session->has($transactionId . '[flight][cash_result]')) {
$resumeArray['cash_result'] = json_decode($session->get($transactionId . '[flight][cash_result]'), true);
}
if (isset($resumeArray['infos'][0]['paymentResume']['id_context'])) {
$voucherFilePDF = $projectDir . '/app/serviceLogs/CashTransaction/ON' . $resumeArray['infos'][0]['paymentResume']['id_context'] . '_' . $transactionId . '.pdf';
if (file_exists($voucherFilePDF)) {
$resumeArray['NameArchive'] = 'ON' . $resumeArray['infos'][0]['paymentResume']['id_context'] . '_' . $transactionId . '.pdf';
}
}
$TotalInfos = count($resumeArray['infos']);
if ($session->has($transactionId . '[assist][payout_extra]')) {
$orderInsurance = json_decode($session->get($transactionId . '[assist][order]'));
$productInsurance = str_replace('PN', '', $orderInsurance->products);
$orderProductInsurance = $em->getRepository(\Aviatur\GeneralBundle\Entity\OrderProduct::class)->find($productInsurance);
$decodedResponseInsurance = json_decode($aviaturEncoder->AviaturDecode($orderProductInsurance->getPayresponse(), $orderProductInsurance->getPublicKey()));
if (isset($decodedResponseInsurance->x_response_code)) {
$resumeArray['transaction_state_insurance'] = $decodedResponseInsurance->x_response_code;
$resumeArray['transaction_state_cyber_insurance'] = $decodedResponseInsurance->x_response_code;
} elseif (isset($decodedResponseExperience->getTransactionInformationResult)) {
$resumeArray['transaction_state_insurance'] = $decodedResponseExperience->getTransactionInformationResult->responseCode;
$resumeArray['transaction_state_cyber_insurance'] = $decodedResponseExperience->getTransactionInformationResult->responseCode;
}
$returnInfo = $insuranceService->addInfoResume($resumeArray, $transactionId);
$resumeArray['InsuranceTransaction'] = $returnInfo['InsuranceTransaction'];
$resumeArray['OrderInsurance'] = $returnInfo['OrderInsurance'];
$resumeArray['InsuranceDescription'] = $returnInfo['InsuranceDescription'];
$resumeArray['descriptionInsurance'] = $returnInfo['descriptionInsurance'];
$resumeArray['InsuranceType'] = $returnInfo['InsuranceType'];
$resumeArray['infos'][$TotalInfos] = $returnInfo;
if ($session->has($transactionId . '[assist][Emision]')) {
$xml = simplexml_load_string($session->get($transactionId . '[assist][Emision]'), \SimpleXMLElement::class, LIBXML_NOCDATA);
if (isset($xml->RESPUESTA->ESTADO) && 'ERROR' == $xml->RESPUESTA->ESTADO) {
$resumeArray['ErrorInsurance'] = $xml->RESPUESTA->ESTADO;
}
}
}
if ($session->has($transactionId . '[experience][payout_extra]')) {
$TotalInfos = count($resumeArray['infos']);
$payoutExtrasValues = json_decode($session->get($transactionId . '[flight][payout_extra_values]'));
$count = 0;
foreach ($payoutExtrasValues as $key => $payoutExtraValues) {
if ('EXPERIENCE' == $payoutExtraValues->name) {
$infoDates = json_decode($session->get($transactionId . '[experience][infoDates][' . $key . ']'), true);
$orderExperience = json_decode($session->get($transactionId . '[experience][order' . $key . ']'));
$productExperience = str_replace('PN', '', $orderExperience->products);
$orderProductExperience = $em->getRepository(\Aviatur\GeneralBundle\Entity\OrderProduct::class)->find($productExperience);
$decodedResponseExperience = json_decode($aviaturEncoder->AviaturDecode($orderProductExperience->getPayresponse(), $orderProductExperience->getPublicKey()));
if (isset($decodedResponseExperience->x_response_code)) {
$resumeArray['Experiences'][$count]['transaction_state_experience'] = $decodedResponseExperience->x_response_code;
$resumeArray['Experiences'][$count]['transaction_state_cyber_experience'] = $decodedResponseExperience->x_response_code;
$resumeArray['Experiences'][$count]['x_response_reason_text'] = $decodedResponseExperience->x_response_reason_text;
} elseif (isset($decodedResponseExperience->getTransactionInformationResult)) {
$resumeArray['Experiences'][$count]['transaction_state_experience'] = $decodedResponseExperience->getTransactionInformationResult->responseCode;
$resumeArray['Experiences'][$count]['transaction_state_cyber_experience'] = $decodedResponseExperience->getTransactionInformationResult->responseCode;
$resumeArray['Experiences'][$count]['x_response_reason_text'] = $decodedResponseExperience->getTransactionInformationResult->responseReasonText;
} else {
$resumeArray['Experiences'][$count]['transaction_state_experience'] = 2;
$resumeArray['Experiences'][$count]['x_response_reason_text'] = '';
}
$resumeArray['Experiences'][$count]['ProductName'] = (string) $infoDates['datesTransaction']['ProductName'];
$resumeArray['Experiences'][$count]['description'] = (string) $infoDates['datesTransaction']['Description'];
$resumeArray['Experiences'][$count]['reference'] = (string) $orderExperience->products;
$resumeArray['Experiences'][$count]['id_booking'] = (string) $orderExperience->products;
$resumeArray['Experiences'][$count]['id_context'] = (string) $orderExperience->products;
$resumeArray['Experiences'][$count]['total_amount'] = (string) $infoDates['AmountTotal'];
$resumeArray['Experiences'][$count]['CurrencyCode'] = (string) $infoDates['datesTransaction']['CurrencyCode'];
$resumeArray['Experiences'][$count]['Incluye'] = (string) $infoDates['datesTransaction']['Incluye'];
$resumeArray['Experiences'][$count]['type'] = 'Experiencias';
++$count;
}
}
}
$resumeArray['routerType'] = $resumeArray['infos'][0]['routerType'];
if (($session->has($transactionId . '[flight][cash_result]') && !$isMulti) && !$session->has($transactionId . '[emission_baloto_email]')) {
$resumeArray['exportPDF'] = true;
$resumeArray = array_merge($resumeArray, $resumeArray['infos'][0]);
$ruta = '@AviaturTwig/' . $agencyFolder . '/General/Templates/email.html.twig';
if (!file_exists($voucherFilePDF)) {
$resumeArray['NameArchive'] = 'ON' . $resumeArray['infos'][0]['paymentResume']['id_context'] . '_' . $transactionId . '.pdf';
$pdf->generateFromHtml($this->renderView($twigFolder->twigExists('@AviaturTwig/' . $agencyFolder . '/General/Templates/email_cash.html.twig'), $resumeArray), $voucherFilePDF);
}
$clientEmail = $resumeArray['infos'][0]['paymentResume']['client_email'];
$setTo = ['soportepagoelectronico@aviatur.com.co', 'soptepagelectronic@aviatur.com', $clientEmail];
$resumeArray['exportPDF'] = false;
$vouchersFiles = [];
$documentationChild = false;
$doradoPass = false;
$EOHProtocol = false;
$destinationADZ = false;
$internationalDestination = false;
$infoCovidTest = false;
$passengerChild = 0;
$response = \simplexml_load_string($session->get($transactionId . '[flight][detail]'));
$childrens = $response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItinerary->OriginDestinationOptions['ChdQuantity'];
$infants = $response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItinerary->OriginDestinationOptions['InfQuantity'];
if ($childrens > 0 || $infants > 0) {
$passengerChild = $passengerChild + 1;
}
foreach ($resumeArray['infos'] as $info) {
$fJourney = $info['journeySummaries'];
foreach ($fJourney as $segmentJourney) {
$fDetail = $segmentJourney['flightDetails'];
foreach ($fDetail as $segmentFlight) {
if ('CO' != $segmentFlight['ArrivalCountryCode'] && $passengerChild > 0) {
$documentationChild = true;
}
if ('BOG' == $segmentFlight['DepartureAirport'] && null == $segmentFlight['waitingTime']) {
$doradoPass = true;
}
if ('EOH' == $segmentFlight['DepartureAirport'] && null == $segmentFlight['waitingTime']) {
$EOHProtocol = true;
}
if ('ADZ' == $segmentFlight['DepartureAirport']) {
$destinationADZ = true;
}
if ('CO' != $segmentFlight['ArrivalCountryCode']) {
$internationalDestination = true;
}
}
}
}
$resumeArray['documentationChild'] = $documentationChild;
/* Validación ADZ o destinos internacionales boton pruebas COVID-19 */
if (true == $destinationADZ || true == $internationalDestination) {
$infoCovidTest = true;
}
$resumeArray['infoCovidTest'] = $infoCovidTest;
$resumeArray['redirectParams'] = $resumeArray['redirectParams'] ?? null;
$resumeArray['skyscanner_pixel'] = $resumeArray['skyscanner_pixel'] ?? null;
$message = (new \Swift_Message())
->setContentType('text/html')
->setFrom($session->get('emailNoReply'))
->setTo($setTo)
->setBcc($emailNotification)
->setSubject($session->get('agencyShortName') . ' - Transacción Efectivo Creada ' . $resumeArray['infos'][0]['paymentResume']['id_context'])
->attach(\Swift_Attachment::fromPath($voucherFilePDF))
->setBody(
$this->renderView($twigFolder->twigExists($ruta), $resumeArray)
);
if (count($vouchersFiles) > 0) {
foreach ($vouchersFiles as $file) {
$message->attach(\Swift_Attachment::fromPath($file));
}
}
try {
$mailer->send($message);
$session->set($transactionId . '[emission_baloto_email]', 'emailed');
} catch (\Exception $ex) {
$exceptionLog->log(var_dump($message), $ex);
}
}
if($session->has($transactionId . '[paylater]') || $session->has($transactionId . '[paylink]')){
$resumeArray['typePay'] = $session->has($transactionId . '[paylink]') ? 'paylink' : 'paylater';
$resumeArray['paymentMethod'] = $session->has($transactionId . '[paylink]') ? 'paylink' : 'paylater';
$urlResume = $twigFolder->twigExists('@AviaturTwig/' . $agencyFolder . '/Flight/Default/resumeC.html.twig');
}else{
/* La ruta de las plantillas de ancillaries es aviatur/Flux, y se debe enviar una variable para no dejarla quemada en los Twig */
$resumeArray['ancTwigRoute'] = "aviatur/Flux";
$urlResume = $twigFolder->twigExists('@AviaturTwig/' . $agencyFolder . '/Flight/Default/resume.html.twig');
}
// expose supposedly unique transaction info
$resumeArray['agencyData'] = $resumeArray['infos'][0]['agencyData'];
if (isset($resumeArray['infos'][0]['travelers'])) {
$resumeArray['travelers'] = $resumeArray['infos'][0]['travelers'];
}
if (isset($resumeArray['infos'][0]['facturationResume'])) {
$resumeArray['transactionInfo'] = [
'facturationResume' => $resumeArray['infos'][0]['facturationResume'],
];
}
if (isset($resumeArray['transactionState']['transaction_state'])) {
if (3 == $resumeArray['transactionState']['transaction_state']) {
$resumeArray['transactionPayments'][] = $resumeArray['infos'][0]['paymentResume'];
} elseif (isset($resumeArray['transactionState']['paymentMethod']) && 'world' == $resumeArray['transactionState']['paymentMethod']) {
$resumeArray['transactionPayments'][] = $resumeArray['infos'][0]['paymentResume'];
} else {
foreach ($resumeArray['infos'] as $info) {
$resumeArray['transactionPayments'][] = $info['paymentResume'];
}
}
}
if (!$isFront) {
$resumeArray['infos'][0]['renderWebbingInfo'] = $this->verifyWebbingCandidate($request,$parameterBag,$mailer,$orderProducts);
}
if ($isMulti) {
return $this->json($resumeArray);
}
$confirmedTickets = [];
$emission_error = false;
foreach ($resumeArray['travelers'] as $tickets) {
if(!empty($tickets['Ticket'])){
array_push($confirmedTickets, $tickets['Ticket']);
}
}
if (empty($confirmedTickets)) {
$emission_error = true;
}
$totalPaymentStatus = $this->flightResumeServices->formatThankYouPageData($resumeArray['infos'],!$isFront ? $resumeArray['paymentMethod']: null);
$resumeArray['totalPaymentStatus'] = $totalPaymentStatus;
$sentTickets = false;
if ($session->has($transactionId . '[PriceType]')) {
$priceTypeF = (false === \strpos((string) $session->get($transactionId . '[PriceType]'), '|')) ? (string) $session->get($transactionId . '[PriceType]') : \explode('|', (string) $session->get($transactionId . '[PriceType]'));
$resumeArray['PriceType'] = $priceTypeF;
}
if(isset($resumeTemp['resumeView']['redirectParams'])){
$resumeArray['redirectParams'] = $resumeTemp['resumeView']['redirectParams'];
}
if (isset($resumeTemp['resumeView']['skyscanner_pixel'])) {
$resumeArray['skyscanner_pixel'] = $resumeTemp['resumeView']['skyscanner_pixel'];
}
$resumeArray += ['redirectParams' => $resumeArray['redirectParams'] ?? null,
'skyscanner_pixel' => $resumeArray['skyscanner_pixel'] ?? null,];
if($isFront){
date_default_timezone_set('UTC');
$timefront = (int) floor(microtime(true));
$cotizacion = $session->get($transactionId.'[cotizacion]');
$componente = $session->get($transactionId.'[componente]');
$aviaturPlusPay = $em->getRepository(\Aviatur\GeneralBundle\Entity\Parameter::class)->findOneByName('Aviatur_plus_pay')->getValue();
$resumeArray['Total'] = $session->get($transactionId.'[valueButton]');
$resumeArray['cotizacion'] = $cotizacion;
$resumeArray['agent'] = $datosAgente->USUARIO_ORACLE;
$resumeArray['componente'] = $componente;
$resumeArray['timefront'] = $timefront;
$resumeArray['aviaturPlusPay'] = json_decode($aviaturPlusPay , true);
$resumeArray['aviaturPlusAllow'] = $datosAgente->AVIATURPLUS ?? 0;
// Consolidar todos los PNRs de los trayectos en el campo global para visualización en facturación
$resumeArray['paymentResume']['id'] = implode(' / ', $gdsPnrs);
$resumeArray['paymentResume']['recordBooking'] = implode(' / ', $airlinePnrs);
$resumeArray['journeySummaries']['flightDetails'][0]['CodeAirline'] = $addProductData->data->product->aerolinea;
}
$resumeOrderProducts = $this->render($urlResume, $resumeArray);
foreach ($orderProducts as $orderProduct) {
$emailData = \json_decode($orderProduct->getEmail());
if (empty($emailData)) {
$emailData = new \stdClass();
}
$emailData->resumeInfo = [
'travelers' => $resumeArray['travelers'] ?? null,
'agencyData' => $resumeArray['agencyData'],
'transactionInfo' => $resumeArray['transactionInfo'] ?? null,
'transactionState' => $resumeArray['transactionState'] ?? null,
'transactionPayments' => $resumeArray['transactionPayments'] ?? null,
'infos' => $resumeArray['infos'],
'agencyId' => $session->get('agencyId'),
'deviceUser' => (new DeviceData())->getInfo()
];
$orderProduct->setEmail(\json_encode($emailData));
$orderProduct->setResume(base64_encode(gzcompress($resumeOrderProducts)));
$em->persist($orderProduct);
$em->flush();
// generate resume tickets email
if (!$isFront && !$session->has($transactionId . '[paylater]') && !$session->has($transactionId . '[paylink]') && isset($resumeArray['transactionState']['transaction_state']) && isset($resumeArray['transactionState']['transaction_state_cyber']) && 1 == $resumeArray['transactionState']['transaction_state'] && 2 != $resumeArray['transactionState']['transaction_state_cyber'] && !$session->has($transactionId . '[emission][ticket_mail]')) {
try {
// $generateFlightTicketEmail->GenerateTicketEmail($orderProduct);
$session->set($transactionId . '[emission][ticket_mail]', true);
} catch (\Exception $th) {
}
}
}
if(isset($resumeArray["transactionPayments"][0]["paymentMethod"]) && $resumeArray["transactionPayments"][0]["paymentMethod"] == "world") {
$tickets = []; // Array para almacenar todos los tickets
foreach ($resumeArray['infos'] as $info) {
// Verifica si 'travelers' existe y es un array
if (isset($info['travelers']) && is_array($info['travelers'])) {
// Extrae los tickets y los añade al array principal
$tickets = array_merge($tickets, array_column($info['travelers'], 'Ticket'));
}
}
// Une todos los tickets con "/"
$resumeArray['worldPayConciliacion']['totalPasajeros'] = implode('/', $tickets);
$WorldModel = new WorldModel();
$rqConciliacion = $WorldModel->sendConciliacionesWorldPay($resumeArray['worldPayConciliacion']);
$sendConciliacionWorldPay = $webService->callWebService('GENERALLAVE', 'dummy|http://www.aviatur.com.co/dummy/', $rqConciliacion);
}
if ($session->has($transactionId . '[experience][payout_extra]')) {
$payoutExtrasValues = json_decode($session->get($transactionId . '[flight][payout_extra_values]'));
foreach ($payoutExtrasValues as $key => $payoutExtraValues) {
if ('EXPERIENCE' == $payoutExtraValues->name) {
$orderProductCode = $session->get($transactionId . '[experience][order' . $key . ']');
$productId = str_replace('PN', '', json_decode($orderProductCode)->products);
$orderProductExperience = $em->getRepository(\Aviatur\GeneralBundle\Entity\OrderProduct::class)->find($productId);
$orderProductExperience->setEmail(\json_encode($emailData));
$orderProductExperience->setResume(base64_encode(gzcompress($resumeOrderProducts)));
}
}
}
if ($session->has($transactionId . '[assist][payout_extra]')) {
$insuranceService->InsuranceResume($transactionId, $resumeOrderProducts);
}
if ($session->has($transactionId . '[redemptionPoints][isRedimed]')) {
$session->remove($transactionId . '[redemptionPoints][isRedimed]');
}
return $resumeOrderProducts;
} else {
return $this->redirect($errorHandler->errorRedirect($twigFolder->pathWithLocale('aviatur_general_homepage'), '', 'Acceso no autorizado'));
}
}
public function resumeOutput(
Request $request,
SessionInterface $session,
ParameterBagInterface $parameterBag,
TwigFolder $twigFolder,
AuthorizationCheckerInterface $authorizationChecker,
AviaturEncoder $aviaturEncoder,
InsuranceService $insuranceService,
\Swift_Mailer $mailer,
$combination,
$cantFlight,
RouterInterface $router,
$segment = null
) {
//$baseURL = $request->server->get('HTTP_X_FORWARDED_PROTO')."://".$request->server->get('HTTP_X_FORWARDED_HOST')."/";
$baseURL = 'https://'. $request->getHost().'/';
$paymentCode = $this->paymentMethod->getCode() === 'pse' ? 'pse' : 'pseRest';
$projectDir = $parameterBag->get('kernel.project_dir');
$transactionIdSessionName = $parameterBag->get('transaction_id_session_name');
$route = $router->match(str_replace($request->getSchemeAndHttpHost(), '', $request->getUri()));
$isMulti = false !== strpos($route['_route'], 'multi');
$clientFranquice = [];
$messageAgent = null;
$detailXml = null;
$dateBirth = [];
$passanger_type = [];
$em = $this->em;
$agency = $em->getRepository(\Aviatur\AgencyBundle\Entity\Agency::class)->find($session->get('agencyId'));
$transactionId = $session->get($transactionIdSessionName);
$postDataJson = $session->get($transactionId . '[flight][detail_data_flight]');
$paymentData = json_decode($postDataJson);
$dataPayment = json_decode($postDataJson, true);
$customer = $em->getRepository(\Aviatur\CustomerBundle\Entity\Customer::class)->find($paymentData->BD->id);
if ($combination) {
$orderProductCode = $session->get($transactionId . '[flight][order' . $segment . ']');
$pKey = ($segment === 0 || $segment === '0' || $segment === null) && !$session->has($transactionId . '[flight][prepayment' . $segment . ']')
? '[flight][prepayment]'
: '[flight][prepayment' . $segment . ']';
$prepaymentInfo = \simplexml_load_string((string) $session->get($transactionId . $pKey));
$valueBaseAmount = (string) $prepaymentInfo->Message->OTA_AirBookRS->AirReservation->PriceInfo->ItinTotalFare->BaseFare['Amount'];
} else {
$orderProductCode = $session->get($transactionId . '[flight][order]');
$prepaymentInfo = \simplexml_load_string($session->get($transactionId . '[flight][prepayment]'));
$valueBaseAmount = (string) $prepaymentInfo->Message->OTA_AirBookRS->AirReservation->PriceInfo->ItinTotalFare->BaseFare['Amount'];
}
$productId = str_replace('PN', '', json_decode($orderProductCode)->products);
$orderProduct = $em->getRepository(\Aviatur\GeneralBundle\Entity\OrderProduct::class)->find($productId);
$currentGds = (string) ($prepaymentInfo->Message->OTA_AirBookRS->AirReservation->BookingReferenceID['ID'] ?? $orderProduct->getBooking());
$currentAir = (string) ($prepaymentInfo->Message->OTA_AirBookRS->AirReservation->BookingReferenceID->TPA_Extensions->AirlineBookingCode ?? $orderProduct->getBooking());
if (empty($currentAir)) { $currentAir = $orderProduct->getBooking(); }
if (empty($currentGds)) { $currentGds = $orderProduct->getBooking(); }
$productRequest = $aviaturEncoder->AviaturDecode($orderProduct->getPayRequest(), $orderProduct->getPublicKey());
$productResponse = $aviaturEncoder->AviaturDecode($orderProduct->getPayResponse(), $orderProduct->getPublicKey());
$opRequest = json_decode($productRequest);
$opResponse = json_decode($productResponse);
$updatePaymentDataStrXML = explode('FILTRO', $orderProduct->getUpdatePaymentData());
$updatePaymentData = \simplexml_load_string('<FILTRO'.$updatePaymentDataStrXML[1].'FILTRO>');
$addProductDataStrXml = explode('FILTRO', $orderProduct->getAddProductData());
$addProductData = \simplexml_load_string('<FILTRO'.$addProductDataStrXml[1].'FILTRO>');
if (isset($opResponse->x_franchise) && ('' != $opResponse->x_franchise)) {
$franquiceCode = str_replace(['CR_', 'RM_', 'CDNSA'], ['', '', 'CS'], $opResponse->x_franchise);
if (isset($opRequest->paymentMethod) && 'world' == $opRequest->paymentMethod) {
$clientFranquice = $em->getRepository(\Aviatur\GeneralBundle\Entity\Card::class)->findOneByWorldpaycode($franquiceCode);
} else {
$clientFranquice = $em->getRepository(\Aviatur\GeneralBundle\Entity\Card::class)->findOneByPaymentgatewaycode($franquiceCode);
}
} else {
$clientFranquice['description'] = '----';
if (isset($opRequest->paymentMethod) && 'world' == $opRequest->paymentMethod) {
$clientFranquice['description'] = 'World Pay';
}
}
// ARRAY FOR PASSENGERS INFOS //-----
$travelers = [];
$passengersInfo = [];
if ((true === $session->has($transactionId . '[emission]')) || (true === $session->has($transactionId . '[emission' . $segment . ']'))) {
if ($combination) {
$tiquetEmission = simplexml_load_string((string) $session->get($transactionId . '[emission' . $segment . ']'));
} else {
$tiquetEmission = simplexml_load_string((string) $session->get($transactionId . '[emission]'));
}
$count = 1;
foreach ($tiquetEmission->dataElementsMaster->dataElementsIndiv as $ticket) {
if ('FA' == $ticket->elementManagementData->segmentName) {
$ticketInfo = preg_split('/[\/,\s,-]+/', $ticket->otherDataFreetext->longFreetext);
foreach ($ticket->referenceForDataElement->reference as $reference) {
if ('PT' == $reference->qualifier) {
$referenceNumber = (string) $reference->number;
if ('' == $referenceNumber) {
$referenceNumber = $count;
}
}
}
$passengersInfo[$referenceNumber][$ticketInfo[0]]['Ticket'] = $ticketInfo[2];
++$count;
}
}
$passengerCount = 1;
foreach ($tiquetEmission->travellerInfo as $passengersData) {
$referenceNumber = (int) $passengersData->elementManagementPassenger->reference->number;
if (count($passengersData->passengerData) >= 2) {
foreach ($passengersData->passengerData as $passangerData) {
$passangerData->travellerInformation->passenger->type = trim((string) $passangerData->travellerInformation->passenger->type);
$passengerType = ('INF' != (string) $passangerData->travellerInformation->passenger->type) ? 'PAX' : (string) $passangerData->travellerInformation->passenger->type;
$passengersInfo[$referenceNumber][$passengerType]['Count'] = $passengerCount;
$passengersInfo[$referenceNumber][$passengerType]['typeCode'] = (string) $passangerData->travellerInformation->passenger->type;
$passengersInfo[$referenceNumber][$passengerType]['GivenName'] = ucwords(mb_strtolower((string) $passangerData->travellerInformation->passenger->firstName));
$passengersInfo[$referenceNumber][$passengerType]['Surname'] = ucwords(mb_strtolower((string) $passangerData->travellerInformation->traveller->surname));
/* Para incluir la nacionalidad como dato que se debe considerar en la documentación del viaje */
$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");
/* Se va a incluir un arreglo vacío para los links de documentación de viaje */
$passengersInfo[$referenceNumber][$passengerType]['docLinks'] = [];
++$passengerCount;
}
} else {
foreach ($passengersData->passengerData->travellerInformation->passenger as $passangerData) {
$passangerData->type = trim((string) $passangerData->type);
$passengerType = ('INF' != (string) $passangerData->type) ? 'PAX' : (string) $passangerData->type;
$passengersInfo[$referenceNumber][$passengerType]['Count'] = $passengerCount;
$passengersInfo[$referenceNumber][$passengerType]['typeCode'] = (string) $passangerData->type;
$passengersInfo[$referenceNumber][$passengerType]['GivenName'] = ucwords(mb_strtolower((string) $passangerData->firstName));
$passengersInfo[$referenceNumber][$passengerType]['Surname'] = ucwords(mb_strtolower(isset($passangerData->surname) ? (string) $passangerData->surname : (string) $passengersData->passengerData->travellerInformation->traveller->surname));
/* Para incluir la nacionalidad como dato que se debe considerar en la documentación del viaje */
$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");
/* Se va a incluir un arreglo vacío para los links de documentación de viaje */
$passengersInfo[$referenceNumber][$passengerType]['docLinks'] = [];
++$passengerCount;
}
}
}
foreach ($passengersInfo as $passengers) {
foreach ($passengers as $passenger) {
$travelers[@$passenger['Count']] = $passenger;
unset($travelers[@$passenger['Count']]['Count']);
}
}
}else{
$travelers = [];
if(isset($addProductData)){
foreach ($addProductData->data->product->passengers->passenger as $passenger) {
$numPassanger = (int) $passenger->passenger_number;
$travelers[$numPassanger]['Ticket'] = "";
$travelers[$numPassanger]['typeCode'] = (string) $passenger->type;
$travelers[$numPassanger]['GivenName'] = (string) $passenger->first_name;
$travelers[$numPassanger]['Surname'] = (string) $passenger->first_last_name;
/* Para incluir la nacionalidad como dato que se debe considerar en la documentación del viaje */
$travelers[$numPassanger]['Nationality'] = (string) $passenger->nationality;
/* Se va a incluir un arreglo vacío para los links de documentación de viaje */
$travelers[$numPassanger]['docLinks'] = [];
}
}
}
// Array
if (isset($opRequest->x_service_fee_base) && !isset($opResponse->createTransactionPaymentResponseInformation)) {
$reasonDescription = utf8_decode($opResponse->x_response_reason_text);
if(isset($opResponse->x_ta_response_reason_text)){
$taReasonDescription = utf8_decode($opResponse->x_ta_response_reason_text);
}
// En caso de iva = 0, agregamos como otros impuestos el airport tax
if ($opRequest->x_tax === 0) {
$airport_tax = $opRequest->x_airport_tax;
} else {
$airport_tax = $opResponse->x_amount + $opRequest->x_airport_tax - $opRequest->x_tax - (0 != $opRequest->x_amount_base ? $opRequest->x_amount_base : $opResponse->x_amount);
}
$paymentResume = [
'transaction_state' => $opResponse->x_response_code,
'ta_transaction_state' => $opResponse->x_ta_response_code ?? '',
'id' => $currentGds,
'recordBooking' => $currentAir,
'id_context' => $opRequest->x_invoice_num,
'total_amount' => $opResponse->x_amount + $opRequest->x_airport_tax + $opRequest->x_service_fee,
'currency' => $opResponse->x_bank_currency,
'amount' => 0 != $opRequest->x_amount_base ? $opRequest->x_amount_base : $opResponse->x_amount,
'base_amount' => $valueBaseAmount,
'iva' => $opRequest->x_tax,
'airport_tax' => $airport_tax,
'x_service_fee' => (int) $opRequest->x_service_fee,
'fee_base' => $opRequest->x_service_fee_base,
'fee_tax' => $opRequest->x_service_fee_tax,
'ip_address' => $opRequest->x_customer_ip,
'bank_name' => $opResponse->x_bank_name ?? '',
'client_franquice' => ['description' => (is_object($clientFranquice) ? $clientFranquice->getDescription() : $clientFranquice['description'])],
'cuotas' => $opRequest->x_differed,
'card_num' => isset($opRequest->x_card_num) ? '************' . substr($opRequest->x_card_num, strlen($opRequest->x_card_num) - 4) : '',
'reference' => $opResponse->x_transaction_id,
'auth' => $opResponse->x_approval_code,
'transaction_date' => $opResponse->x_transaction_date,
'description' => $opResponse->x_description,
'reason_code' => $opResponse->x_response_reason_code,
'reason_description' => utf8_encode($reasonDescription),
'client_names' => $opResponse->x_first_name . ' ' . $opResponse->x_last_name,
'client_email' => $opResponse->x_email,
'client_document_number' => isset($opResponse->x_cust_id) ? $opResponse->x_cust_id : $opRequest->x_cust_id,
'client_phone' => isset($opResponse ->x_phone) ? $opResponse ->x_phone : $opRequest->x_phone,
'ta_reason_code' => $opResponse->x_ta_response_reason_code,
'ta_auth' => $opResponse->x_ta_approval_code,
'ta_reference' => $opResponse->x_ta_transaction_id ?? ''
];
if(isset($opResponse->x_ta_response_reason_text)){
$paymentResume["ta_reason_description"] = $taReasonDescription;
}
if (isset($opRequest->paymentMethod) && 'world' == $opRequest->paymentMethod) {
if ($session->has($transactionId . '[Fligth_Markup_Kiwi]')) {
$paymentResume['total_amount'] += $session->get($transactionId . '[Fligth_Markup_Kiwi]');
}
$paymentResume['paymentMethod'] = $opRequest->paymentMethod;
}
if (isset($opRequest->paymentMethod) && 'davivienda' == $opRequest->paymentMethod) {
if (isset($opResponse->davivienda)) {
$paymentResume['davivienda'] = $opResponse->davivienda;
} elseif (isset($opResponse->onlyRedemption) && $opResponse->onlyRedemption) {
$paymentResume['davivienda'] = $opResponse;
$paymentResume['airport_tax'] = $opRequest->x_airport_tax;
if ($combination) {
$paymentResume['total_amount'] = ($opRequest->x_amount + $opRequest->x_airport_tax + $opRequest->x_service_fee);
$paymentResume['amount'] = 0 != $opRequest->x_amount_base ? $opRequest->x_amount_base : $opRequest->x_amount;
} else {
$paymentResume['total_amount'] = ($opRequest->x_amount + $opRequest->x_airport_tax + $opRequest->x_service_fee);
}
} else {
$paymentResume['davivienda'] = $opResponse;
$paymentResume['amount'] = 0 != $opRequest->x_amount_base ? $opRequest->x_amount_base : $opRequest->x_amount;
$paymentResume['total_amount'] = ($opRequest->x_amount + $opRequest->x_airport_tax + $opRequest->x_service_fee);
}
$points = 0;
$pointsAmount = 0;
if (isset($opRequest->redemptionValue) && isset($opRequest->x_davivienda_pricePoints) && $opRequest->x_davivienda_pricePoints > 0) {
$points = ceil($opRequest->redemptionValue / $opRequest->x_davivienda_pricePoints);
$pointsAmount = ($points * $opRequest->x_davivienda_pricePoints);
}
if (isset($paymentResume['davivienda'])) {
$paymentResume['davivienda']->points = $points;
$paymentResume['davivienda']->points_amount = $pointsAmount;
$paymentResume['davivienda']->onlyRedemption = $opRequest->onlyRedemption ?? false;
}
if (isset($opResponse->x_total_amount_card)) {
/* the transaction is rejected */
$paymentResume['total_amount'] = $opResponse->x_total_amount_card;
$paymentResume['amount'] = $opResponse->x_amount_card;
}
}
// Agregar informacion relacionada a redencion de puntos aval
if (isset($opRequest->redemptionValue) && isset($opRequest->redemptionPoints)) {
$paymentResume['isRedeemingAvalPoints'] = true;
if (isset($opRequest->onlyRedemption)) {
$paymentResume['isOnlyRedemption'] = true;
$paymentResume['messageRedemption'] = 'Esta transacción se realizó únicamente con puntos.';
$paymentResume['redemptionPoints'] = $opRequest->redemptionPoints;
$paymentResume['redemptionValue'] = $opRequest->redemptionValue;
} elseif (isset($opRequest->combinedEmission)) {
$paymentResume['isCombinedEmission'] = true;
$paymentResume['messageRedemption'] = 'Transacción realizada mediante combinación de puntos y tarjeta de crédito.';
$paymentResume['redemptionPoints'] = $opRequest->redemptionPoints;
$paymentResume['redemptionValue'] = $opRequest->redemptionValue;
}
}
} elseif (isset($opResponse->x_description) && !isset($opResponse->createTransactionPaymentResponseInformation)) {
$paymentResume = [
'transaction_state' => $opResponse->x_response_code,
'ta_transaction_state' => $opResponse->x_ta_response_code,
'id' => $currentGds,
'recordBooking' => $currentAir,
'id_context' => $opRequest->x_invoice_num,
'total_amount' => $opResponse->x_amount + ($opRequest->x_airport_tax ?? 0),
'currency' => $opResponse->x_bank_currency,
'amount' => $opRequest->x_amount_base,
'base_amount' => $valueBaseAmount,
'iva' => $opRequest->x_tax,
'airport_tax' => $opResponse->x_amount + ($opRequest->x_airport_tax ?? 0) - $opRequest->x_amount_base - $opRequest->x_tax,
'ip_address' => $opRequest->x_customer_ip,
'bank_name' => $opResponse->x_bank_name,
'client_franquice' => ['description' => $clientFranquice->getDescription()],
'cuotas' => $opRequest->x_differed,
'card_num' => '************' . substr($opRequest->x_card_num, strlen($opRequest->x_card_num) - 4),
'reference' => $opResponse->x_transaction_id,
'auth' => $opResponse->x_approval_code,
'transaction_date' => $opResponse->x_transaction_date,
'description' => $opResponse->x_description,
'reason_code' => $opResponse->x_response_reason_code,
'reason_description' => $opResponse->x_response_reason_text,
'client_names' => $opResponse->x_first_name . ' ' . $opResponse->x_last_name,
'client_email' => $opResponse->x_email,
'ta_reason_code' => $opResponse->x_ta_response_reason_code,
'ta_auth' => $opResponse->x_ta_approval_code,
'ta_reference' => $opResponse->x_ta_transaction_id,
];
} elseif (isset($opRequest->dataTransf) && !isset($opResponse->createTransactionPaymentResponseInformation)) {
if (isset($opRequest->notificationRequest->{'urn:OperationActivityNotifiedRequest'})) :
$state = $opRequest->notificationRequest->{'urn:OperationActivityNotifiedRequest'}->{'urn:ListOfOperationsActivityNotified'}->{'urn1:ConfirmOperation'}->{'urn1:OperationStatus'};
if (102 == $state) :
$state = 1;
$reason_description = 'Pago de la transacción fue notificada al Usuario';
elseif (101 == $state) :
$state = 2;
$reason_description = 'SafetyPay recibe la confirmación de pago del Banco';
endif;
$paymentResume = [
'transaction_state' => $state,
'id' => $currentGds,
'recordBooking' => $currentAir,
'client_franquice' => ['description' => 'SafetyPay'],
'id_context' => $opRequest->tokenRequest->{'urn:ExpressTokenRequest'}->{'urn:MerchantSalesID'},
'currency' => $opRequest->dataTransf->x_currency,
'total_amount' => $opRequest->tokenRequest->{'urn:ExpressTokenRequest'}->{'urn:Amount'},
'amount' => null,
'base_amount' => $valueBaseAmount,
'iva' => null,
'airport_tax' => null,
'ip_address' => $opRequest->dataTransf->dirIp,
'reference' => $opRequest->tokenRequest->{'urn:ExpressTokenRequest'}->{'urn:MerchantSalesID'},
'auth' => $opRequest->notificationRequest->{'urn:OperationActivityNotifiedRequest'}->{'urn:ListOfOperationsActivityNotified'}->{'urn1:ConfirmOperation'}->{'urn1:OperationID'},
'transaction_date' => $opResponse->payResponse->OperationResponse->ResponseDateTime,
'description' => $opRequest->dataTransf->x_description,
'reason_code' => $opRequest->notificationRequest->{'urn:OperationActivityNotifiedRequest'}->{'urn:ListOfOperationsActivityNotified'}->{'urn1:ConfirmOperation'}->{'urn1:OperationStatus'},
'reason_description' => $reason_description,
'client_names' => $opRequest->dataTransf->x_first_name . ' ' . $opRequest->dataTransf->x_last_name,
'client_email' => $opRequest->dataTransf->x_email,
];
else :
$paymentResume = [
'transaction_state' => 2,
'id' => $currentGds,
'recordBooking' => $currentAir,
'id_context' => $opRequest->tokenRequest->{'urn:ExpressTokenRequest'}->{'urn:MerchantSalesID'},
'currency' => $opRequest->dataTransf->x_currency,
'total_amount' => $opRequest->dataTransf->x_total_amount,
'client_franquice' => ['description' => 'SafetyPay'],
'amount' => null,
'base_amount' => $valueBaseAmount,
'iva' => null,
'ip_address' => $opRequest->dataTransf->dirIp,
'airport_tax' => null,
'reference' => $opRequest->dataTransf->x_reference,
'auth' => null,
'transaction_date' => $opRequest->tokenRequest->{'urn:ExpressTokenRequest'}->{'urn:RequestDateTime'},
'description' => $opRequest->dataTransf->x_description,
'reason_code' => 101,
'reason_description' => 'Transacción creada',
'client_names' => $opRequest->dataTransf->x_first_name . ' ' . $opRequest->dataTransf->x_last_name,
'client_email' => $opRequest->dataTransf->x_email,
];
endif;
} elseif (isset($opRequest->infoCash)) {
$paymentResume = [
'transaction_state' => 2,
'id' => $currentGds,
'recordBooking' => $currentAir,
'id_booking' => $opRequest->infoCash->x_booking,
'id_context' => $opRequest->infoCash->x_reference,
'currency' => $opRequest->infoCash->x_currency,
'total_amount' => $opRequest->infoCash->x_total_amount,
'client_franquice' => ['description' => 'Efectivo'],
'amount' => null,
'base_amount' => $valueBaseAmount,
'iva' => null,
'ip_address' => $opRequest->infoCash->dirIp,
'airport_tax' => null,
'reference' => $opRequest->infoCash->x_reference,
'auth' => null,
'transaction_date' => $opRequest->infoCash->x_fechavigencia,
'description' => $opRequest->infoCash->x_description,
'reason_code' => 101,
'reason_description' => 'Transacción creada',
'client_names' => $opRequest->infoCash->x_first_name . ' ' . $opRequest->infoCash->x_last_name,
'client_email' => $opRequest->infoCash->x_email,
'client_document_number' => $opRequest->infoCash->x_doc_num,
'client_phone' => $opRequest->infoCash->x_phone,
'fecha_vigencia' => $opRequest->infoCash->x_fechavigencia,
];
$cash_result = json_decode($session->get($transactionId . '[flight][cash_result]'));
$paymentResume['transaction_state'] = 3;
if ('' == $cash_result) {
$paymentResume['transaction_state'] = 2;
}
} else {
// Obtener codigo de banco por metodo de pago seleccionado
if ($paymentCode === 'pse') {
$bank_code = isset($opRequest->bankCode) ? (int) $opRequest->bankCode : 0;
} else {
$bank_code = isset($opRequest->instrument->redirection->additional->bankCode) ? (int) $opRequest->instrument->redirection->additional->bankCode : 0;
}
$bank_info = $em->getRepository(\Aviatur\PaymentBundle\Entity\PseBank::class)->findOneByCode($bank_code);
$bank_name = $bank_info->getName();
$devolutionBase = $paymentCode === 'pse' ? $opRequest->devolutionBase ?? $opRequest->x_devolution_base : 0;
$taxAmount = $paymentCode === 'pse' ? $opRequest->taxAmount ?? $opRequest->x_tax_amount : 0;
$totalAmount = $paymentCode === 'pse' ? $opRequest->totalAmount ?? $opRequest->x_total_amount : $opRequest->payment->amount->total;
if ((0 == $devolutionBase) && (0 == $taxAmount)) {
$addProductXml = explode('FILTRO', $orderProduct->getAddproductdata());
$addProductObj = \simplexml_load_string('<FILTRO' . $addProductXml[1] . 'FILTRO>');
$amount = (string) $addProductObj->data->product->fare_data->fare->base_amount;
$airportTax = $totalAmount - $amount;
} else {
$amount = $devolutionBase;
$airportTax = $totalAmount - ($devolutionBase + $taxAmount);
}
if($paymentCode != 'pse' && isset($opResponse->getTransactionInformationResult->status->status)) {
switch ($opResponse->getTransactionInformationResult->status->status) {
case 'OK':
case 'APPROVED':
case 'APPROVED_PARTIAL':
case 1:
$opResponse->getTransactionInformationResult->status->status = "1";
break;
case 'REJECTED':
case 'PARTIAL_EXPIRED':
case 'NOT_AUTHORIZED':
case 2:
$opResponse->getTransactionInformationResult->status->status = "2";
break;
case strpos($opResponse->getTransactionInformationResult->status->status, "PENDING"):
case 'MANUAL':
case 3:
$opResponse->getTransactionInformationResult->status->status = "3";
break;
default:
$opResponse->getTransactionInformationResult->status->status = "4";
break;
}
}
$responseCode = $paymentCode === 'pse' ? $opResponse->getTransactionInformationResult->responseCode ?? $opResponse->getTransactionInformationResult->transactionState
: $opResponse->getTransactionInformationResult->status->status;
$currency = $paymentCode === 'pse' ? $opRequest->currency ?? $opRequest->x_currency
: $opRequest->payment->amount->currency ?? $opRequest->x_currency;
$reference = $paymentCode === 'pse' ? $opRequest->reference ?? $opRequest->x_reference
: $opRequest->payment->reference ?? $opRequest->x_reference;
$transactionID = $paymentCode === 'pse' ? $opResponse->createTransactionResult->transactionID ?? $opResponse->id_transaccion
: $opResponse->getTransactionInformationResult->receipt ?? $opResponse->internalReference ?? $opResponse->id_transaccion;
$responseReasonCode = $paymentCode === 'pse' ? $opResponse->getTransactionInformationResult->responseReasonCode ?? null
: $opResponse->getTransactionInformationResult->status->reason ?? null;
$responseReasonText = $paymentCode === 'pse' ? $opResponse->getTransactionInformationResult->responseReasonText ?? null
: $opResponse->getTransactionInformationResult->status->message ?? null;
$description = $paymentCode === 'pse' ? $opRequest->description ?? $opRequest->x_description
: $opRequest->payment->description ?? $opRequest->x_description;
$emailAddress = $paymentCode === 'pse' ? $opRequest->payer->emailAddress ?? $opRequest->x_email
: $opRequest->payer->email ?? $opRequest->x_email;
$auth = $paymentCode === 'pse' ? $opResponse->getTransactionInformationResult->trazabilityCode : $opResponse->getTransactionInformationResult->authorization ?? $opResponse->getTransactionInformationResult->receipt;
$transactionDate = $paymentCode === 'pse' ? $opResponse->getTransactionInformationResult->bankProcessDate : $opResponse->getTransactionInformationResult->status->date;
$clientNames = $paymentCode === 'pse' ? $opRequest->payer->firstName . ' ' . $opRequest->payer->lastName : $opRequest->payer->name . ' ' . $opRequest->payer->surname;
/* Datos complementarios */
$payerDocumentNumber = ($opRequest->payer->document ?? $opRequest->x_cust_id);
$payerMobile = $opRequest->payer->mobile ?? $opRequest->x_phone ?? '';
$fee_base = $opRequest->feeBase ?? $opRequest->x_service_fee_base ?? 0;
$fee_tax = $opRequest->feeTax ?? $opRequest->x_service_fee_tax ?? 0;
$paymentResume = [
'transaction_state' => $responseCode,
'id' => $currentGds,
'recordBooking' => $currentAir,
'id_context' => $reference,
'currency' => $currency,
'total_amount' => $totalAmount,
'amount' => $amount,
'base_amount' => $valueBaseAmount,
'iva' => $taxAmount,
'airport_tax' => $airportTax,
'ip_address' => $opRequest->ipAddress,
'bank_name' => $bank_name,
'client_franquice' => ['description' => is_object($clientFranquice) ? $clientFranquice->getDescription() : 'PSE'],
'reference' => $transactionID,
'auth' => $auth,
'transaction_date' => $transactionDate,
'description' => $description,
'reason_code' => $responseReasonCode,
'reason_description' => $responseReasonText,
'client_names' => $clientNames,
'client_email' => $emailAddress,
'client_document_number' => $payerDocumentNumber,
'client_phone' => $payerMobile,
'card_num' => '--',
'cuotas' => '--',
'fee_base' => $fee_base,
'fee_tax' => $fee_tax,
];
}
$paymentResume['transaction_state_cyber'] = $opResponse->x_response_code_cyber ?? '1';
// Método de pago desde los datos de pago del detalle o el campo payment_gateway del XML de updatePaymentData
$payment_gateway_type = '';
if(isset($updatePaymentData)){
$payment_gateway_type = (string) ($updatePaymentData->data->products->product->payment_data->payment_gateway) ?? '';
}
$paymentResume['payment_gateway'] = $dataPayment['PD']['type'] ?? $payment_gateway_type ?? '';
// Array for facturation infos
if ($session->has($transactionId . '[flight][provider]')) {
$providersId = json_decode($session->get($transactionId . '[flight][provider]'), true);
$providersName = [];
if (is_array($providersId)) {
foreach ($providersId as $idprovider) {
$providerObject = $em->getRepository(\Aviatur\MpaBundle\Entity\Provider::class)->findOneByProvideridentifier($idprovider);
$providerName = str_replace(' ', '_', $providerObject->getName());
if (!in_array($providerName, $providersName)) {
$providersName[] = $providerName;
}
}
} else {
$providersName[] = (string) $providersId;
}
if (!empty($providersName)) {
$paymentResume['providers'] = $providersName;
}
}
if (false !== strpos($paymentData->BD->first_name, '***')) {
$facturationResume = [
'customer_names' => $customer->getFirstname() . ' ' . $customer->getLastname(),
'customer_address' => $customer->getAddress(),
'customer_doc_num' => $customer->getDocumentnumber(),
'customer_phone' => $customer->getPhone(),
'customer_email' => $customer->getEmail(),
];
} else {
$facturationResume = [
'customer_names' => $paymentData->BD->first_name . ' ' . $paymentData->BD->last_name,
'customer_address' => $paymentData->BD->address,
'customer_doc_num' => $paymentData->BD->doc_num,
'customer_phone' => $paymentData->BD->phone,
'customer_email' => $paymentData->BD->email,
];
}
// Send confirmation email if success
$emailData = json_decode($orderProduct->getEmail(), true);
if (empty($emailData)) {
$emailData = [];
}
//Se quita condicional por autorizacion de geo
// if ((string) $prepaymentInfo->Message->OTA_AirBookRS->AirReservation->Ticketing->TicketingVendor['Code'] === 'CM') {
// Código GDS y Aerolínea específicos del trayecto actual
$currentGds = (string) $prepaymentInfo->Message->OTA_AirBookRS->AirReservation->BookingReferenceID['ID'];
$currentAir = (string) $prepaymentInfo->Message->OTA_AirBookRS->AirReservation->BookingReferenceID->TPA_Extensions->AirlineBookingCode;
if (empty($currentAir) && isset($addProductData->data->product->bill_number)) {
$currentAir = (string) $addProductData->data->product->bill_number;
}
$paymentResume['id'] = $currentGds;
$paymentResume['recordBooking'] = $currentAir;
// } else {
// $paymentResume['recordBooking'] = '' != $session->get($transactionId . '[flight][recordBooking' . $segment . ']') ? ' - ' . $session->get($transactionId . '[flight][recordBooking' . $segment . ']') : '';
// }
$emailData['paymentResume'] = $paymentResume;
/* 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 */
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 */
$this->includingDataForDocumentationPerSegment($travelers, $emailData['journeySummaries'], $baseURL);
}
$emailData['travelers'] = $travelers;
// Número de vuelo desde los datos de pago del detalle o el campo flight_number del XML de addProductData
$flightNumbers = [];
foreach ($dataPayment['CDD'] as $key => $value) {
if (strpos($key, 'flight_number_') === 0) {
$flightNumbers[] = $value;
}
}
if(isset($addProductData) && count($flightNumbers) <= 0 ){
$bookingData = (string) $addProductData->data->product->booking_data;
$bookingDataXml = \simplexml_load_string("<booking_data>" . $bookingData . "</booking_data>");
foreach ($bookingDataXml->itineraries->itinerary as $itinerary) {
$airlineCode = (string) $itinerary->airline->code;
$flightNumber = (string) $itinerary->flight_number;
$flightNumbers[] = $airlineCode . '-' . $flightNumber;
}
}
$keyFlightNumbers = $cantFlight ?? 0;
foreach ($emailData['journeySummaries'] as $keyj => $journeySummary) {
$fDetail = $journeySummary['flightDetails'];
foreach ($fDetail as $keyf => $segmentFlight) {
$emailData['journeySummaries'][$keyj]['flightDetails'][$keyf]['flightNumber'] = $flightNumbers[$keyFlightNumbers];
$keyFlightNumbers++;
}
}
$orderProduct->setEmail(json_encode($emailData));
$em->persist($orderProduct);
$em->flush();
if ($session->has($transactionId . '[experience][payout_extra]')) {
$payoutExtrasValues = json_decode($session->get($transactionId . '[flight][payout_extra_values]'));
foreach ($payoutExtrasValues as $key => $payoutExtraValues) {
if ('EXPERIENCE' == $payoutExtraValues->name) {
$orderProductCode = $session->get($transactionId . '[experience][order' . $key . ']');
$productId = str_replace('PN', '', json_decode($orderProductCode)->products);
$orderProductExperience = $em->getRepository(\Aviatur\GeneralBundle\Entity\OrderProduct::class)->find($productId);
$orderProductExperience->setEmail(\json_encode($emailData));
}
}
}
$agencyFolder = $twigFolder->twigFlux();
//generate pDF documentation for attachment
$emailData['infoDocumentation'] = false;
$vouchersFiles = [];
$countriesDocumentation = [];
$journeySummary = $emailData['journeySummaries']['0'];
if (true === $session->has('countriesDocumentation')) {
$countriesDocumentation = $session->get('countriesDocumentation');
} else {
$countriesDocumentation = [];
if ('BOG' != $journeySummary['destinationCode']) {
$citySearch = $journeySummary['destinationCode'];
} else {
$citySearch = $journeySummary['originCode'];
}
$countryObject = $this->getCountryByCityOrAirport($citySearch);
$country = $countryObject->getIataCode();
if ('CO' != $country) {
foreach ($emailData['journeySummaries'] as $journeySummary) {
$fDetail = $journeySummary['flightDetails'];
foreach ($fDetail as $segment) {
if ('BOG' != $segment['DepartureAirport']) {
$city = $em->getRepository(\Aviatur\GeneralBundle\Entity\City::class)->findOneByIatacode($segment['DepartureAirport']);
$countryObject = $em->getRepository(\Aviatur\GeneralBundle\Entity\Country::class)->findOneByCode($city->getCountryStateCode());
$country = $countryObject->getIataCode();
if ('CO' !== $country && !in_array($country, $countriesDocumentation)) {
$countriesDocumentation[$country] = $countryObject->getDescription();
}
}
}
}
}
}
$searchDestination = $em->getRepository(\Aviatur\SearchBundle\Entity\SearchCities::class)->findByIata($journeySummary['destinationCode']);
if (!empty($searchDestination)) {
$search = ['á', 'é', 'í', 'ó', 'ú', 'ñ', ' '];
$replace = ['a', 'e', 'i', 'o', 'u', 'n', '-'];
$destinationName = str_replace($search, $replace, $searchDestination[0]->getCity());
$destinationName = strtolower($destinationName);
$iata = $journeySummary['destinationCode'];
switch ($iata) {
case 'FLR':
$fileContent = 'https://www.aviatur.com/vuelos/tiquetes-baratos-a-florencia-italia';
$destinationContent = $searchDestination[0]->getCity() . ' - ' . $searchDestination[0]->getCountry();
break;
case 'FLA':
$fileContent = 'https://www.aviatur.com/vuelos/tiquetes-baratos-a-' . $destinationName;
$destinationContent = $searchDestination[0]->getCity() . ' - ' . $searchDestination[0]->getCountry();
break;
case 'UIO':
$fileContent = 'https://www.aviatur.com/vuelos/tiquetes-baratos-a-' . $destinationName . '-ecuador';
$destinationContent = $searchDestination[0]->getCity() . ' - ' . $searchDestination[0]->getCountry();
break;
case 'HAV':
$fileContent = 'https://www.aviatur.com/vuelos/tiquetes-baratos-a-' . $destinationName . '-cuba';
$destinationContent = $searchDestination[0]->getCity();
break;
case 'ORL':
$fileContent = 'https://www.aviatur.com/vuelos/tiquetes-baratos-a-' . $destinationName . '-florida';
$destinationContent = $searchDestination[0]->getCity();
break;
case 'EYP':
$fileContent = 'https://www.aviatur.com/vuelos/tiquetes-baratos-a-yopal';
$destinationContent = 'Yopal';
break;
case 'ADZ':
$fileContent = 'https://www.aviatur.com/vuelos/tiquetes-baratos-a-san-andres';
$destinationContent = $searchDestination[0]->getCity();
break;
case 'TLV':
$fileContent = 'https://www.aviatur.com/vuelos/tiquetes-baratos-a-tel-aviv';
$destinationContent = $searchDestination[0]->getCity();
break;
case 'BRC':
$fileContent = 'https://www.aviatur.com/vuelos/tiquetes-baratos-a-bariloche';
$destinationContent = $searchDestination[0]->getCity();
break;
case 'SSA':
$fileContent = 'https://www.aviatur.com/vuelos/tiquetes-baratos-a-' . $destinationName . '-de-bahia';
$destinationContent = $searchDestination[0]->getCity() . ' - ' . $searchDestination[0]->getCountry();
break;
case 'VLC':
$fileContent = 'https://www.aviatur.com/vuelos/tiquetes-baratos-a-' . $destinationName;
$destinationContent = $searchDestination[0]->getCity() . ' - ' . $searchDestination[0]->getCountry();
break;
case 'VLN':
$fileContent = 'https://www.aviatur.com/vuelos/tiquetes-baratos-a-' . $destinationName . '-venezuela';
$destinationContent = $searchDestination[0]->getCity() . ' - ' . $searchDestination[0]->getCountry();
break;
case 'PTY':
$fileContent = 'https://www.aviatur.com/vuelos/tiquetes-baratos-a-panama';
$destinationContent = 'Panamá';
break;
default:
$fileContent = 'https://www.aviatur.com/vuelos/tiquetes-baratos-a-' . $destinationName;
$destinationContent = $searchDestination[0]->getCity();
break;
}
} else {
$searchDestination = $em->getRepository(\Aviatur\SearchBundle\Entity\SearchAirports::class)->findByIata($journeySummary['destinationCode']);
$search = ['á', 'é', 'í', 'ó', 'ú', 'ñ', ' '];
$replace = ['a', 'e', 'i', 'o', 'u', 'n', '-'];
$destinationName = str_replace($search, $replace, $searchDestination[0]->getCity());
$destinationName = strtolower($destinationName);
$fileContent = 'https://www.aviatur.com/vuelos/tiquetes-baratos-a-' . $destinationName;
$destinationContent = $searchDestination[0]->getCity();
}
$url = curl_init($fileContent);
curl_setopt($url, CURLOPT_TIMEOUT, 5);
curl_setopt($url, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($url, CURLOPT_RETURNTRANSFER, true);
curl_setopt($url, CURLOPT_SSL_VERIFYPEER, false);
curl_exec($url);
$httpcode = curl_getinfo($url, CURLINFO_HTTP_CODE);
curl_close($url);
if (200 == $httpcode || 301 == $httpcode) {
$contentDestination = ['urlContent' => $fileContent, 'nameCity' => $destinationContent];
} else {
$contentDestination = ['urlContent' => 'no_existe', 'nameCity' => $destinationContent];
}
$emailData += ['contentDestination' => $contentDestination];
$isFront = $session->has('operatorId');
if ((is_countable($countriesDocumentation) ? count($countriesDocumentation) : 0) > 0) {
//get documentation info
$documentationModel = new DocumentationModel();
foreach ($countriesDocumentation as $key => $value) {
}
$emailData['infoDocumentation'] = true;
}
$doradoPass = false;
$EOHProtocol = false;
$DestinationADZ = false;
$internationalDestination = false;
$infoCovidTest = false;
foreach ($emailData['journeySummaries'] as $journeySummary) {
$fDetail = $journeySummary['flightDetails'];
foreach ($fDetail as $segmentFlight) {
if ('BOG' == $segmentFlight['DepartureAirport'] && null == $segmentFlight['waitingTime']) {
$doradoPass = true;
}
if ('EOH' == $segmentFlight['DepartureAirport'] && null == $segmentFlight['waitingTime']) {
$EOHProtocol = true;
}
if ('ADZ' == $segmentFlight['ArrivalAirport']) {
$DestinationADZ = true;
}
if ('CO' != $segmentFlight['ArrivalCountryCode']) {
$internationalDestination = true;
}
}
}
if (false !== strpos($agency->getName(), 'Aviatur')) {
$voucherFile = $projectDir . '/app/reservationLogs/ProtocolosAeropuertosPDF/travel-for-conservation.pdf';
}
/* Validación ADZ o destinos internacionales boton pruebas COVID-19 */
if (true == $DestinationADZ || true == $internationalDestination) {
$infoCovidTest = true;
}
$emailData += ['infoCovidTest' => $infoCovidTest];
/* Documento autorización salida menores de edad */
$documentationChild = false;
foreach ($emailData['journeySummaries'] as $journeySummary) {
$fDetail = $journeySummary['flightDetails'];
$travelersDetail = $emailData['travelers'];
$passengerChild = 0;
if (null == $travelersDetail) {
$response = \simplexml_load_string($session->get($transactionId . '[flight][detail]'));
$childrens = $response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItinerary->OriginDestinationOptions['ChdQuantity'];
$infants = $response->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItinerary->OriginDestinationOptions['InfQuantity'];
if ($childrens > 0 || $infants > 0) {
$passengerChild = $passengerChild + 1;
}
} else {
foreach ($travelersDetail as $traveler) {
if ('ADT' != $traveler['typeCode']) {
$passengerChild = $passengerChild + 1;
}
}
}
foreach ($fDetail as $segmentFlight) {
if ('CO' != $segmentFlight['ArrivalCountryCode'] && $passengerChild > 0) {
$documentationChild = true;
}
}
}
if (true == $documentationChild) {
$voucherFile = $projectDir . '/app/reservationLogs/DocumentationPDF/FORMATO-PERMISO-SALIDA-DEL-PAIS-MENORES.pdf';
if (file_exists($voucherFile)) {
$vouchersFiles[] = $voucherFile;
}
}
$emailData += ['documentationChild' => $documentationChild];
$routeName = $request->get('_route');
$pixelInfo = [];
$emailData['renderWebbingInfo'] = $session->has($transactionId . '[RenderWebbingInfo]');
$isAgent = false;
$azure = $em->getRepository(\Aviatur\GeneralBundle\Entity\Parameter::class)->findOneByName('blob_azure_assets')->getValue();
$emailData['assets'] = $agency->getAssetsFolder();
$emailData['azure'] = $azure;
/* Se debe realizar la iteración por order_product de todo lo guardado por cada vuelo (por ahora aplica para Oneway) */
$resultadoDataAncillaries = $this->getListAncillaries($session, $transactionId, $orderProduct, $passengersInfo, $prepaymentInfo);
if(null !== $resultadoDataAncillaries){
/* Para aplicar al correo */
$emailData['ancillaries'] = $resultadoDataAncillaries;
}
/* La ruta de las plantillas de ancillaries es aviatur/Flux, y se debe enviar una variable para no dejarla quemada en los Twig */
$emailData["ancTwigRoute"] = "aviatur/Flux";
$session->remove('[base_segments_baggage]');
$stateOrder = $orderProduct->getstatus();
$emailData['stateOrder'] = $stateOrder;
$infoResumenPaymentStatus = $this->flightResumeServices->formatThankYouPageData(array($emailData), $paymentResume['payment_gateway']);
$emailData['infoResumenPaymentStatus'] = $infoResumenPaymentStatus;
$emailData['isCombination'] = $combination;
$emailData['isNational'] = $session->get($transactionId . '[flight][isNational]');
$emailData['policies'] = $session->get($transactionId . '[flight][policies]');
if ($session->has($transactionId . '[PriceType]')) {
$priceTypeF = (false === \strpos((string) $session->get($transactionId . '[PriceType]'), '|')) ? (string) $session->get($transactionId . '[PriceType]') : \explode('|', (string) $session->get($transactionId . '[PriceType]'));
$emailData['PriceType'] = $priceTypeF;
}
// Obtiene tipo de ruta oneway, round o multi
if($session->has($transactionId.'[flight][availability_type]')) {
$getRouterType = $session->get($transactionId.'[flight][availability_type]');
$uncompressedRouterType = gzuncompress($getRouterType);
$routerTypeDecode = json_decode($uncompressedRouterType, true);
$routerType = $routerTypeDecode["route_type"];
} else {
$getTypeFlight = $session->get($transactionId . "[flight][flight_type]");
$partsRoutes = explode("_", $getTypeFlight);
$routerType = end($partsRoutes);
}
$emailData['routerType'] = $routerType;
if ('aviatur_flight_payment_success_secure' == $routeName or 'aviatur_flight_reservation_success_secure' == $routeName) {
if ((true !== $session->has($transactionId . '[emission_email]')) && (true !== $session->has($transactionId . '[emission_email' . $segment . ']'))) {
try {
// Agente Octopus
// Cambiar logo Correo Gracias por tu compra.
$emails = [
$customer->getEmail(),
];
if ($authorizationChecker->isGranted('ROLE_AVIATUR_ADMIN_ADMIN_AGENT_OPERATOR')) {
$agent = $em->getRepository(\Aviatur\AgentBundle\Entity\Agent::class)->findOneByCustomer($this->getUser());
if (!empty($agent)) {
$isAgent = true;
$idAgentLogo = $agent->getId();
$folderImg = 'assets/octopus_assets/img/custom/logoAgent/' . $idAgentLogo . '.png';
$domain = 'https://' . $agency->getDomain();
$folderLogoAgent = $domain . '/' . $folderImg;
$emails = [
$customer->getEmail(),
'laura.amaya@octopus.com.co'
];
if (file_exists($folderImg)) {
$emailData['imgLogoAgent'] = $folderLogoAgent;
}
}
}
//entrega de tarjeta One-timeUnited
$originCyty = $journeySummary['originCode'];
$airlineGift = $journeySummary['flightDetails'][0]['CodeAirline'];
//Fin entrega de tarjeta One-timeUnited
$bccMails = [$agency->getMailBooking(), 'notificacionessitioweb@aviatur.com'];
$agencyName = '';
if ($session->has('whitemark')) {
if ('' != $session->get('whitemarkMail')) {
$bccMails[] = $session->get('whitemarkMail');
$bccMails[] = 'notificacionessitioweb@aviatur.com';
}
$agencyName = $session->get('whitemarkName');
} else {
$bccMails[] = $agency->getMailcontact();
$agencyName = $session->get("agencyDataInfo")['agency_name'];
}
if($stateOrder == 'approved'){
$subject = 'Gracias por su compra';
}elseif($stateOrder == 'pending'){
$subject = 'Pago pendiente';
}else{
$subject = 'Pago rechazado';
}
if($emailData["paymentResume"]["payment_gateway"] != 'cash' && !$session->has($transactionId . '[multi][detail_cash]')) {
$message = (new \Swift_Message())
->setContentType('text/html')
->setFrom($session->get('emailNoReply'))
->setTo($emails)
->setBcc($bccMails)
->setSubject($agencyName . ' - '. $subject)
->setBody(
//$this->renderView($twigFolder->twigExists('@AviaturTwig/'.$agencyFolder.'/General/Templates/email_old.html.twig'), $emailData)
$this->renderView($twigFolder->twigExists('@AviaturTwig/'.$agencyFolder.'/General/Templates/email.html.twig'), $emailData)
);
/*
* Agente Octopus
* Email de la reserva del agente hijo enviado al agente Padre Octopus.
*/
if ($isAgent) {
$agent = $em->getRepository(\Aviatur\AgentBundle\Entity\Agent::class)->findOneByCustomer($this->getUser());
if (!empty($agent)) {
$parent = $agent->getparentAgent();
if (0 != $parent) {
$myParent = $em->createQuery('SELECT a,b FROM AviaturAgentBundle:Agent a JOIN a.customer b WHERE a.id= :idAgent');
$myParent = $myParent->setParameter('idAgent', $parent);
$parentInfo = $myParent->getResult();
$emailParent = $parentInfo[0]->getCustomer()->getEmail();
$emailData['infoSubAgent'] = ['nameSubAgent' => strtoupper($agent->getCustomer()->__toString()), 'emailSubAgent' => strtoupper($agent->getCustomer()->getEmail())];
$messageAgent = (new \Swift_Message())
->setContentType('text/html')
->setFrom($session->get('emailNoReply'))
->setTo([$agent->getCustomer()->getEmail(), $emailParent])
->setBcc($bccMails)
->setSubject($agencyName . ' - Gracias por su compra - ' . $customer->getFirstname() . ' ' . $customer->getLastname() . ' Vendedor - ' . $agent->getCustomer()->getFirstName() . ' ' . $agent->getCustomer()->getLastName())
->setBody(
$this->renderView($twigFolder->twigExists('@AviaturTwig/' . $agencyFolder . '/General/Templates/email.html.twig'), $emailData)
);
} else {
$messageAgent = (new \Swift_Message())
->setContentType('text/html')
->setFrom($session->get('emailNoReply'))
->setTo($agent->getCustomer()->getEmail())
->setBcc($bccMails)
->setSubject($agencyName . ' - Gracias por su compra - ' . $customer->getFirstname() . ' ' . $customer->getLastname() . ' Vendedor - ' . $agent->getCustomer()->getFirstName() . ' ' . $agent->getCustomer()->getLastName())
->setBody(
$this->renderView($twigFolder->twigExists('@AviaturTwig/' . $agencyFolder . '/General/Templates/email.html.twig'), $emailData)
);
}
}
}
if (count($vouchersFiles) > 0) {
foreach ($vouchersFiles as $file) {
$message->attach(\Swift_Attachment::fromPath($file));
}
}
if ($session->has($transactionId . '[flight][unitedGift]') && $session->get($transactionId . '[flight][unitedGift]') && 'UA' == $airlineGift && 'BOG' == $originCyty) {
$emailData['unitedGiftCard'] = true;
$promotional_codes_gift = $em->getRepository(\Aviatur\GeneralBundle\Entity\PromotionalCodeGift::class)->findBy(['status' => 0]);
$passengerCountVoucher = 0;
foreach ($travelers as $traveler) {
if ('INF' != $traveler['typeCode']) {
$passengerCountVoucher = $passengerCountVoucher + 1;
}
}
for ($i = 0; $i < $passengerCountVoucher; ++$i) {
$codeToDeliver = $promotional_codes_gift[$i];
$codeToDeliver->setOrderproduct($orderProduct);
$codeToDeliver->setStatus(1);
$em->persist($codeToDeliver);
$em->flush();
$pdfCard = $projectDir . '/app/reservationLogs/OneTimePass/' . substr($codeToDeliver->getCode(), 4, 3) . '.pdf';
$message->attach(\Swift_Attachment::fromPath($pdfCard));
}
}
if(!$isMulti) {
$mailer->send($message);
}
}
/**
* Agente Octopus
* Envio Correo - Email de la reserva del agente hijo enviado al agente Padre Octopus.
*/
if ($isAgent) {
if (count($vouchersFiles) > 0) {
foreach ($vouchersFiles as $file) {
$messageAgent->attach(\Swift_Attachment::fromPath($file));
}
}
if(isset($messageAgent))
$mailer->send($messageAgent);
}
if ($combination) {
$session->set($transactionId . '[emission_email' . $segment . ']', 'emailed');
} else {
$session->set($transactionId . '[emission_email]', 'emailed');
}
} catch (\Exception $ex) {
$message = (new \Swift_Message())
->setContentType('text/html')
->setFrom($session->get('emailNoReply'))
->setTo($agency->getMailBooking())
->setSubject($session->get("agencyDataInfo")['agency_name'] . ' - Gracias por su compra(Error en Mail Usuario)')
->setBody(
$this->renderView($twigFolder->twigExists('@AviaturTwig/' . $agencyFolder . '/General/Templates/email.html.twig'), $emailData)
);
}
}
} elseif ('aviatur_flight_payment_rejected_secure' == $routeName) {
try {
$bccMails = [$agency->getMailBooking(), 'notificacionessitioweb@aviatur.com'];
$agencyName = '';
if ($session->has('whitemark')) {
if ('' != $session->get('whitemarkMail')) {
$bccMails[] = $session->get('whitemarkMail');
$bccMails[] = 'sebastian.huertas@aviatur.com';
}
$agencyName = $session->get('whitemarkName');
} else {
$bccMails[] = $agency->getMailcontact();
$agencyName = $session->get('agencyShortName');
}
if(isset($paymentResume['transaction_state_cyber']) && $paymentResume['transaction_state_cyber'] == 2 ){
$subject ='Pago en validación';
}elseif($paymentResume['transaction_state'] != '2' && (!isset($paymentResume['transaction_state_cyber']) || $paymentResume['transaction_state_cyber'] != 2) && $stateOrder == 'approved'){
$subject = 'Gracias por su compra';
}else{
$subject = 'Pago rechazado';
}
$message = (new \Swift_Message())
->setContentType('text/html')
->setFrom($session->get('emailNoReply'))
->setTo($customer->getEmail())
->setBcc($bccMails)
->setSubject($agencyName . ' - ' . $subject)
->setBody(
$this->renderView($twigFolder->twigExists('@AviaturTwig/'.$agencyFolder.'/General/Templates/email.html.twig'), $emailData)
);;
if(!$isMulti) {
$mailer->send($message);
}
} catch (\Exception $ex) {
$message = (new \Swift_Message())
->setContentType('text/html')
->setFrom($session->get('emailNoReply'))
->setTo($agency->getMailBooking())
->setSubject($session->get('agencyShortName') . ' - Gracias por su compra(Error en Mail Usuario)')
->setBody(
$this->renderView($twigFolder->twigExists('@AviaturTwig/' . $agencyFolder . '/General/Templates/email.html.twig'), $emailData)
);
}
}
//CRITEO TAGS
if (!$isFront) {
$url = parse_url($session->get($transactionId . '[availability_url]'), PHP_URL_PATH);
$seoUrl = $em->getRepository(\Aviatur\GeneralBundle\Entity\SeoUrl::class)->findByUrlorMaskedUrl($url);
$detailXml = simplexml_load_string($session->get($transactionId . '[flight][detail]'));
$passengerCount = 0;
try {
$PTC_FareBreakdown = $detailXml->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->AirItineraryPricingInfo->PTC_FareBreakdowns->PTC_FareBreakdown;
foreach ($PTC_FareBreakdown->PassengerTypeQuantity as $passengerType) {
$passengerCount += (int) $passengerType['Quantity'];
}
} catch (\Exception $e) {
$passengerCount = 1;
}
$pixel = json_decode($session->get($transactionId . '[capaDatosinfo]'), true);
$pixel['partner_datalayer']['event'] = 'purchase';
unset($pixel['partner_datalayer']['ecommerce']['checkout']);
$purchase = [
'purchase' => [
'products' => [
'actionField' => "{'id': '" . $paymentResume['id_context'] . "', 'affiliation': 'Portal Web', 'revenue': '" . $paymentResume['total_amount'] . "', 'tax':'" . $paymentResume['iva'] . "', 'coupon': ''}",
'name' => $journeySummary['originCode'] . ($journeySummary['destinationCode'] ?? ''),
'price' => $paymentResume['total_amount'],
'brand' => $journeySummary['flightDetails'][0]['CodeAirline'] ?? '',
'category' => $journeySummary['flightDetails'][0]['BookingClassAvails'] ?? 'Economy',
'variant' => $emailData['roundtrip'] ? ('RoundTrip') : ('OneWay'),
'quantity' => $passengerCount,
],
],
];
$pixel['partner_datalayer']['ecommerce'] = $purchase;
if (isset($opResponse->x_response_code) && 1 == $opResponse->x_response_code) {
if ($session->get($transactionId . '[flight][kayakclickid]') && 'aviatur_flight_payment_success_secure' == $routeName) {
$pixel['kayakclickid'] = $session->get($transactionId . '[flight][kayakclickid]');
if (isset($pixel['kayakclickid'])) {
$kayakclickid = [
'kayakclickid' => $pixel['kayakclickid'],
'price' => $paymentResume['total_amount'],
'currency' => $paymentResume['currency'],
'confirmation' => $paymentResume['id_context'],
'rand' => microtime(true),
];
$pixel['kayakclickid'] = $kayakclickid;
}
}
}
if (isset($opResponse->infoCash)) {
if ($session->get($transactionId . '[flight][kayakclickid]') && 'aviatur_flight_payment_success_secure' == $routeName) {
$pixel['kayakclickid'] = $session->get($transactionId . '[flight][kayakclickid]');
if (isset($pixel['kayakclickid'])) {
$kayakclickid = [
'kayakclickid' => $pixel['kayakclickid'],
'price' => $paymentResume['total_amount'],
'currency' => $paymentResume['currency'],
'confirmation' => $paymentResume['id_context'],
'rand' => microtime(true),
];
$pixel['kayakclickid'] = $kayakclickid;
}
}
}
if (isset($pixel['clickId'])) {
$clickid = [
'clickid' => $pixel['clickId'],
'price' => $paymentResume['total_amount'],
];
$pixel['clickId'] = $clickid;
}
$id_context = explode('-', $paymentResume['id_context']);
$pixel['skyscanner'] = [
'cost' => $paymentResume['amount'],
'order' => (isset($id_context[1])) ? str_replace('PN', '', $id_context[1]) : $paymentResume['id_context'],
];
if ($session->has('generals[metasearch]')) {
$metasearch = $em->getRepository(\Aviatur\GeneralBundle\Entity\Metasearch::class)
->find($session->get('generals[metasearch]'));
// SkyScanner pixel
if ($session->has('skyscanner_redirectid') && $routeName === 'aviatur_flight_payment_success_secure') {
$itinerarySegments = [];
if ($session->has('generals[metasearch]')) {
$metasearchId = $session->get('generals[metasearch]');
$metasearch = $em->getRepository(\Aviatur\GeneralBundle\Entity\Metasearch::class)
->find($metasearchId);
if ($session->has('skyscanner_redirectid') && $routeName === 'aviatur_flight_payment_success_secure') {
$itinerarySegments = [];
if (isset(
$journeySummary['originCode'],
$journeySummary['destinationCode'],
$journeySummary['departureTime'],
$journeySummary['arrivalTime']
)) {
$itinerarySegments[] = [
'departure_airport' => $journeySummary['originCode'],
'arrival_airport' => $journeySummary['destinationCode'],
'departure_datetime' => $journeySummary['departureTime'],
'arrival_datetime' => $journeySummary['arrivalTime'],
];
}
$cabinClass = !empty($journeySummary['flightDetails'][0]['BookingClassAvails'])
? strtolower($journeySummary['flightDetails'][0]['BookingClassAvails'])
: 'economy';
$airlineCode = !empty($journeySummary['flightDetails'][0]['CodeAirline'])
? strtoupper($journeySummary['flightDetails'][0]['CodeAirline'])
: '';
$paymentMethod = !empty($paymentResume['client_franquice']['description'])
? strtolower($paymentResume['client_franquice']['description'])
: ($paymentResume['payment_gateway'] ?? 'unknown');
$tripType = !empty($emailData['roundtrip']) ? 'return' : 'one-way';
$platform = $journeySummary['agencyName'] ?? 'Aviatur.com';
$skyscannerConversionParams = [
'redirect_id' => $session->get('skyscanner_redirectid'),
'conversion_id' => $paymentResume['id_context'],
'total_amount' => $paymentResume['total_amount'],
'flight_amount' => $paymentResume['amount'],
'currency' => $paymentResume['currency'],
'payment_method' => $paymentMethod,
'fare_basis' => $paymentResume['id'],
'airline_code' => $airlineCode,
'itinerary' => $itinerarySegments,
'cabin_class' => $cabinClass,
'trip_type' => $tripType,
'platform' => $platform,
];
$skyscannerPixel = $this->skyscannerTracker->generateConversionPixel($skyscannerConversionParams);
$resumeView['skyscanner_pixel'] = $skyscannerPixel;
}
if ($metasearch && str_contains($metasearch->getName(), 'viajala')) {
$redirectParams = [
'supplier' => 'aviatur',
'origin' => $journeySummary['originCode'] ?? '',
'destination' => $journeySummary['destinationCode'] ?? '',
'grossBooking' => $paymentResume['total_amount'],
'currency' => $session->get('typeCoin', 'COP'),
'bookingId' => $paymentResume['recordBooking'],
];
$resumeView['viajala'] = $redirectParams;
}
}
}
}
}
// END Send confirmation email if success
$resumeView = [
'agencyData' => $emailData['agencyData'],
'facturationResume' => $facturationResume,
'paymentResume' => $paymentResume,
'infoResumenPaymentStatus' => $emailData["infoResumenPaymentStatus"],
'routerType' => $routerType,
'travelers' => $travelers,
'journeySummaries' => $emailData['journeySummaries'],
'roundtrip' => $emailData['roundtrip'],
'transactionID' => $transactionId,
'redirectParams' => $resumeView['viajala'] ?? null,
'skyscanner_pixel' => $resumeView['skyscanner_pixel'] ?? null,
'airlineCondition' => ucfirst(mb_strtolower(htmlentities((string) $detailXml->Message->OTA_AirLowFareSearchRS->PricedItineraries->PricedItinerary->Notes))),
];
//Add flight Information for cross-selling ASSIST CARD and HOTEL
$calculoEdades = [];
$resumeView['birthdayDate'] = '';
for ($i = 1; $i <= count($resumeView['travelers']); ++$i) {
if (1 == $resumeView['travelers']) {
$dateBirth[] = $dataPayment['PI']['birthday_1_1'];
} else {
$dateBirth[] = $dataPayment['PI']['birthday_1_' . $i];
}
$calculoEdades[] = $insuranceService->calcular_edad($dateBirth[($i - 1)]);
if ($calculoEdades[($i - 1)] >= 0 && $calculoEdades[($i - 1)] < 2) {
$passanger_type[] = 1;
} elseif ($calculoEdades[($i - 1)] >= 2 && $calculoEdades[($i - 1)] < 12) {
$passanger_type[] = 2;
} else {
$passanger_type[] = 3;
}
$resumeView['birthdayDate'] = array();
$resumeView['birthdayDate'][] = [
'BirthDate' => $dateBirth[($i - 1)],
'Age' => $calculoEdades[($i - 1)],
'passanger_type' => $passanger_type[($i - 1)],
];
}
$session->set($transactionId . '[crossed][infoBirth]', json_encode($resumeView['birthdayDate']));
$origin = $resumeView['journeySummaries'][0]['originCode'];
$destination = $resumeView['journeySummaries'][0]['destinationCode'];
// obtain values to generate url's Insurance and hotel when sale is crossed
if (true == $resumeView['roundtrip']) {
$departureTime = explode('T', $resumeView['journeySummaries'][0]['departureTime']);
$departureArrival = explode('T', $resumeView['journeySummaries'][0]['arrivalTime']);
$departureTimeEnd = explode('T', $resumeView['journeySummaries'][((is_countable($resumeView['journeySummaries']) ? count($resumeView['journeySummaries']) : 0) - 1)]['departureTime']);
$departureArrivalEnd = explode('T', $resumeView['journeySummaries'][((is_countable($resumeView['journeySummaries']) ? count($resumeView['journeySummaries']) : 0) - 1)]['arrivalTime']);
} else {
$departureTime = explode('T', $resumeView['journeySummaries'][0]['departureTime']);
$departureArrival = explode('T', $resumeView['journeySummaries'][0]['arrivalTime']);
$departureTimeEnd = explode('T', $resumeView['journeySummaries'][0]['departureTime']);
$departureArrivalEnd = explode('T', $resumeView['journeySummaries'][0]['arrivalTime']);
}
// Obtain values of city origen and city destination for sale crossed
$Origin = $em->getRepository(\Aviatur\SearchBundle\Entity\SearchCities::class)->findOneByIata($origin);
$Destination = $em->getRepository(\Aviatur\SearchBundle\Entity\SearchCities::class)->findOneByIata($destination);
if ($Origin) {
$originCity = $Origin->getIata();
$originName = $Origin->getCity();
} else {
$originAirports = $em->getRepository(\Aviatur\SearchBundle\Entity\SearchAirports::class)->findOneByIata($origin)->getSearchCities();
$originCity = $originAirports->getIata();
$originName = $originAirports->getCity();
}
if ($Destination) {
$destinationCity = $Destination->getIata();
$destinationName = $Destination->getCity();
} else {
$destinationAirports = $em->getRepository(\Aviatur\SearchBundle\Entity\SearchAirports::class)->findOneByIata($destination)->getSearchCities();
$destinationCity = $destinationAirports->getIata();
$destinationName = $destinationAirports->getCity();
}
$fromCountry = $this->getCountryByCityOrAirport($destinationCity);
$cityCode = $fromCountry->getIataCode();
$logRoot = $projectDir . '/app/xslt/Insurance/country_continent.csv';
$destiny = GeneralUtilMethods::verify_destiny($logRoot, $cityCode);
$urlAssist = '';
$resumeView['urlAssistance'] = '';
$ADT = 0;
$CHD = 0;
$room = 0;
$urlHotel = '';
$safeUrl = 'https://' . $agency->getDomain();
if (isset($resumeView['birthdayDate'][0]['BirthDate'])) {
foreach ($resumeView['birthdayDate'] as $array) {
$urlAssist .= $array['BirthDate'] . '+';
}
$urlAssistance = substr($urlAssist, 0, -1);
$resumeView['urlAssistance'] = $destiny . '/' . $departureTime[0] . '/' . $departureArrivalEnd[0] . '/' . $urlAssistance . '/secure';
foreach ($resumeView['travelers'] as $travelers) {
if ('ADT' == $travelers['typeCode']) {
++$ADT;
} elseif ('CHD' == $travelers['typeCode']) {
++$CHD;
} elseif ('INF' == $travelers['typeCode']) {
++$CHD;
}
}
$ChdAge = '';
$urlHotel = $safeUrl . '/hoteles/crossed/' . $destinationCity . '/' . $departureArrival[0] . '+' . $departureTimeEnd[0] . '/' . $ADT;
if ($CHD > 0) {
foreach ($calculoEdades as $edad) {
if ($edad < 18) {
$ChdAge .= $edad . '-';
}
}
$ChdAge = substr($ChdAge, 0, -1);
$urlHotel = $urlHotel . "+$ChdAge";
} else {
$ChdAge = 'n';
$urlHotel = $urlHotel . "+$ChdAge";
}
if (1 == $ADT && 0 == $CHD || 1 == $ADT && 1 == $CHD || 2 == $ADT && 1 == $CHD) {
$room = 1;
} elseif (2 == $ADT && 2 == $CHD || 3 == $ADT && 2 == $CHD) {
$room = 2;
} elseif (3 == $ADT && 3 == $CHD || 4 == $ADT && 3 == $CHD) {
$room = 3;
} elseif (4 == $ADT && 4 == $CHD || 5 == $ADT && 4 == $CHD) {
$room = 4;
} elseif (5 == $ADT && 5 == $CHD || 6 == $ADT && 5 == $CHD) {
$room = 5;
}
}
$validation = $em->getRepository(\Aviatur\GeneralBundle\Entity\Parameter::class)->findOneByName('aviatur_crossed_hotel_flight');
$validationInsurance = $em->getRepository(\Aviatur\GeneralBundle\Entity\Parameter::class)->findOneByName('aviatur_crossed_insurance_flight');
$resumeView['ajaxUrl'] = $urlHotel;
$resumeView['StartDate'] = $departureTime[0];
$resumeView['EndDate'] = $departureArrivalEnd[0];
$resumeView['Rooms'] = $room;
$resumeView['Children'] = $CHD;
$resumeView['Adults'] = $ADT;
$resumeView['Origin'] = $originCity;
$resumeView['Destination'] = $destinationCity;
$resumeView['safeUrl'] = $safeUrl;
$resumeView['validation'] = $validation->getValue();
$resumeView['validationInsurance'] = $validationInsurance->getValue();
$resumeView['cityOrigin'] = $originName;
$resumeView['cityDestiny'] = $destinationName;
$resumeView['isNational'] = $session->get($transactionId . '[flight][isNational]');
$resumeView['isCombination'] = $combination;
$resumeView['policies'] = $session->get($transactionId . '[flight][policies]');
$session->set($transactionId . '[crossed]' . '[url-hotel]', $urlHotel);
$session->set($transactionId . '[crossed]' . '[infoDataFlight]', json_encode($resumeView));
$datetime1 = new \DateTime($departureTime[0]);
$datetime2 = new \DateTime($departureArrivalEnd[0]);
$interval = $datetime1->diff($datetime2);
$totalDifDay = $interval->days;
if ($totalDifDay > 31) {
$resumeView['validation'] = 0;
}
/* Se debe realizar la iteración por order_product de todo lo guardado por cada vuelo (Viene desde lo ejecutado para correo) */
if(null !== $resultadoDataAncillaries){
$resumeView['ancillaries'] = $resultadoDataAncillaries;
}
return ['resumeView' => $resumeView, 'orderProduct' => $orderProduct];
}
private function verifyWebbingCandidate(Request $request, ParameterBagInterface $parameterBag, \Swift_Mailer $mailer, $orderProducts)
{
$transactionIdSessionName = $parameterBag->get('transaction_id_session_name');
$addProductData = null;
$bookingData = null;
$fullRequest = $request;
$session = $fullRequest->getSession();
$transactionId = $session->get($transactionIdSessionName);
$em = $this->getDoctrine()->getManager();
$webbingParameter = $em->getRepository(\Aviatur\GeneralBundle\Entity\Parameter::class)->findOneByName('aviatur_webbing');
$availabilityUrl = parse_url($session->get($transactionId . '[availability_url]'));
$agency = $orderProducts[0]->getOrder()->getAgency();
if ($webbingParameter->getAgency() && $agency->getId() !== $webbingParameter->getAgency()) {
return false;
}
if (!$webbingParameter || '1' !== $webbingParameter->getValue()) {
return false;
}
if ('approved' !== $orderProducts[0]->getStatus()) {
return false;
}
//Verificar que no se trate de multidestino...
if (0 == 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'])) {
return false;
}
$webbingParameterDescription = json_decode($webbingParameter->getDescription());
if (isset($webbingParameterDescription->restrictedToClass)) {
$permittedClases = json_decode(json_encode($webbingParameterDescription->restrictedToClass), true);
}
$originCities = json_decode(json_encode($webbingParameterDescription->originCities), true);
$validatingAirline = $webbingParameterDescription->validating_airline;
$index = 0;
foreach ($orderProducts as $orderProduct) {
$productDataStrXml = explode('FILTRO', $orderProduct->getAddProductData());
$addProductData = simplexml_load_string('<?xml version="1.0" encoding="UTF-8"?><FILTRO' . $productDataStrXml[1] . 'FILTRO>', null, LIBXML_NOCDATA);
$bookingData = simplexml_load_string('<?xml version="1.0" encoding="UTF-8"?><booking_data>' . (string) $addProductData->data->product->booking_data . '</booking_data>');
if ((string) $bookingData->validating_airline->code !== $validatingAirline) {
return false;
}
$itinCount = 0;
foreach ($bookingData->itineraries->itinerary as $itinerary) {
if (0 == $index && 0 == $itinCount) {
$departureCityCode = (string) $itinerary->departure_city->code;
if (!in_array($departureCityCode, $originCities)) {
return false;
}
}
if (isset($permittedClases) && !in_array($itinerary->class_trip->name, $permittedClases)) {
return false;
}
++$itinCount;
}
++$index;
}
$arrayPath = explode('/', $availabilityUrl['path']);
$arrivalCityCode = explode('-', $arrayPath[2])[1];
if (isset($webbingParameterDescription->destinationCities)) {
if (!in_array($arrivalCityCode, $webbingParameterDescription->destinationCities)) {
return false;
}
}
if (isset($webbingParameterDescription->destinationCountries)) {
$city = $em->getRepository(\Aviatur\GeneralBundle\Entity\City::class)->findOneBy(['iatacode' => $arrivalCityCode]);
if (null != $city) {
if (!in_array($city->getCountry()->getIatacode(), json_decode(json_encode($webbingParameterDescription->destinationCountries), true))) {
return false;
}
} else {
return false;
}
}
$fromBannerCampaign = '';
$subjectCampaign = '';
if ($session->has($transactionId . '[webbing]')) {
$fromBannerCampaign = '<br><p><strong>Compra Generada por Clic en Banner de Campaña !!</strong>';
$subjectCampaign = ' - Generado por Campaña';
}
$customer = $orderProducts[0]->getOrder()->getCustomer();
if (!$session->has($transactionId . 'webbingmailSent')) {
$mailInfo = '<p>El siguiente usuario realizó su reserva por ' . ucwords($agency->getDomain()) . ' y cumple con las condiciones para recibir el beneficio Webbing:</p>' .
'<p><strong>Nombre: </strong>' . $customer->getFirstname() . ' ' . $customer->getLastname() . '</p>' .
'<p><strong>Documento: </strong>' . $customer->getDocumentnumber() . '</p>' .
'<p><strong>Teléfono: </strong>Tel:' . $customer->getPhone() . '- Cel:' . $customer->getCellphone() . '</p>' .
'<p><strong>Correo electrónico: </strong>' . $customer->getEmail() . '</p>' .
'<p><strong>Producto: </strong>PN' . $orderProducts[0]->getId() . '</p>' .
'<p><strong>Cantidad de Pasajeros: </strong>' . (string) $addProductData->data->product->passengers_numbers . '</p>' .
'<p><strong>Fecha inicio viaje: </strong>' . (string) $bookingData->itineraries->itinerary->departure_datetime . '</p>' .
$fromBannerCampaign;
$message = (new \Swift_Message())
->setContentType('text/html')
->setFrom($webbingParameterDescription->fromEmail)
->setTo($webbingParameterDescription->destinationEmail)
->setBcc('errores.prod.web@aviatur.com')
->setSubject($webbingParameterDescription->subject . $subjectCampaign)
->setBody($mailInfo);
$mailer->send($message);
$session->set($transactionId . 'webbingmailSent', true);
}
return true;
}
private function getListAncillaries($session, $transactionId, $orderProduct, $passengersInfo, $prepaymentInfo){
$em = $this->em;
/* validación temporal en caso de Avianca Amadeus 153 */
/* Para aplicar en validaciones asociadas a ancillaries (Código IATA sin NDC- en caso de tenerlo) */
$ticketingVendor = $prepaymentInfo->Message->OTA_AirBookRS->AirReservation->Ticketing->TicketingVendor;
$airlineCodeTicketing = isset($ticketingVendor['CodeContext']) ? (string) $ticketingVendor['CodeContext'] : (string) $ticketingVendor['Code'];
if(false !== strpos($airlineCodeTicketing, '-')){
$arrayAirlineCode = explode('-', $airlineCodeTicketing);
$airlineCodeTicketing = $arrayAirlineCode[1];
}
$ticketingVendorAirline = $em->getRepository(\Aviatur\FlightBundle\Entity\Airline::class)->findOneByIata($airlineCodeTicketing);
$airlineIdVendor = $ticketingVendorAirline->getId();
$vectorAncillariesData = $orderProduct->getOrder()->getAncillariesOrder();
$emissionDataAncillaries = null;
if (isset($vectorAncillariesData)) {
if (sizeof($vectorAncillariesData) > 0) {
$emissionDataAncillaries = $vectorAncillariesData[0]->getData();
}
}
if(null !== $emissionDataAncillaries && 1 === $this->getValueAncillaries($orderProduct->getOrder()->getAgency()->getId(), $orderProduct->getProvider()->getId(), $airlineIdVendor)){
$arrayFlightNumbers = [];
$churnings = $orderProduct->getOrder()->getChurning();
/* Para aplicar por cada flight number */
foreach ($churnings as $churning) {
if(!in_array($churning->getFlightnumber(), $arrayFlightNumbers)){
$arrayFlightNumbers[] = $churning->getFlightnumber();
}
}
$arrayEmissionData = json_decode($emissionDataAncillaries, true);
$arrayEmissionData["baggage"] = json_decode(json_decode(json_encode(urldecode($arrayEmissionData["baggage"]))), true);
$arrayEmissionData["seats"] = json_decode(json_decode(json_encode(urldecode($arrayEmissionData["seats"]))), true);
// Precio total de ancillaries desde addProductData
$addProductDataStrXml = explode('FILTRO', $orderProduct->getAddProductData());
$addProductData = \simplexml_load_string('<FILTRO'.$addProductDataStrXml[1].'FILTRO>');
$resultAncillaries = $addProductData->xpath("//ancillaries/ancillarie");
$arrayEmissionData["totalseats"] = [
"totalAmount" => 0,
"currency" => '',
"baseAmount" => 0
];
$arrayEmissionData["totalbaggage"] = [
"totalAmount" => 0,
"currency" => '',
"baseAmount" => 0
];
$ancillaryTypes = [
'seat' => 'totalseats',
'baggage' => 'totalbaggage'
];
foreach($resultAncillaries as $ancillarie){
$currencyAncillarie = (string) $ancillarie->UnitPrice->Currency;
$totalAmountAncillarie = $ancillarie->UnitPrice->TotalAmount;
$baseAmountAncillarie = $ancillarie->UnitPrice->BaseAmount;
$type = (string) $ancillarie->type;
if (isset($ancillaryTypes[$type])) {
$typeKey = $ancillaryTypes[$type];
$arrayEmissionData[$typeKey]["totalAmount"] += $totalAmountAncillarie;
$arrayEmissionData[$typeKey]["baseAmount"] += $baseAmountAncillarie;
$arrayEmissionData[$typeKey]["currency"] = $currencyAncillarie;
}
}
// Inicializar el array agrupado
$bagggegrouped = [];
if(is_iterable($arrayEmissionData["baggage"])){
foreach ($arrayEmissionData["baggage"] as $item) {
$route = $item['route'];
$paxRefID = $item['PaxRefID'];
$name = $item['name'];
// Crear la estructura si no existe
if (!isset($bagggegrouped[$route])) {
$bagggegrouped[$route] = [];
}
if (!isset($bagggegrouped[$route][$paxRefID])) {
$bagggegrouped[$route][$paxRefID] = [];
}
// Agregar el OfferItemID al array correspondiente
$bagggegrouped[$route][$paxRefID][] = $name;
}
}
$seatsgrouped = [];
if(is_iterable($arrayEmissionData["seats"])){
foreach ($arrayEmissionData["seats"] as $item) {
$route = $item['route'];
$paxRefID = $item['PaxRefID'];
$selectedSeat = $item['SelectedSeat'];
// Crear la estructura si no existe
if (!isset($seatsgrouped[$route])) {
$seatsgrouped[$route] = [];
}
if (!isset($seatsgrouped[$route][$paxRefID])) {
$seatsgrouped[$route][$paxRefID] = [];
}
// Agregar el OfferItemID al array correspondiente
$seatsgrouped[$route][$paxRefID][] = $selectedSeat;
}
}
$arrayEmissionData["seatsgrouped"] = $seatsgrouped;
$arrayEmissionData["baggagegrouped"] = $bagggegrouped;
return $arrayEmissionData;
} else {
return null;
}
}
/**
* Get ancillaries value by parameters in config
*
* @param $agencyId
* @param $providerId
* @param $airlineId
*
* @return int
*/
public function getValueAncillaries($agencyId, $providerId, $airlineId): int
{
$em = $this->em;
$configFlightAncillariesAgency = $em->getRepository(\Aviatur\FlightBundle\Entity\ConfigFlightAncillariesAgency::class)
->findIsActiveAncillaries($agencyId, $providerId, $airlineId);
$ancillaries = 0;
if ($configFlightAncillariesAgency != null) {
$ancillaries = $configFlightAncillariesAgency->getIsactive() ? 1 : 0;
}
return $ancillaries;
}
/**
* Agrega enlaces de consulta de documentación de viaje internacional por segmento y pasajero.
*
* Esta función recorre los segmentos de vuelo (journeySummaries) y, para cada viajero,
* genera los enlaces necesarios para consultar la documentación requerida según país de origen,
* destino y nacionalidad. Considera paradas técnicas y escalas, agrupando los países involucrados
* en el trayecto. Los enlaces generados se almacenan en la clave 'docLinks' de cada viajero.
* Solo se generan enlaces si el viaje es internacional (país de origen y destino diferentes).
*
* @param array &$travelers Arreglo por referencia con los datos de los viajeros.
* @param array $journeySummaries Arreglo con los segmentos de vuelo y sus detalles.
* @param string $baseURL URL base para generar los enlaces de documentación.
* @return void No retorna valor, modifica el arreglo de viajeros por referencia.
* @author david.rincon@aviatur.com
* @date 2025-08-12
*/
public function includingDataForDocumentationPerSegment(&$travelers, &$journeySummaries, $baseURL)
{
$em = $this->em;
$aviaturWstimaticParam = $em->getRepository(\Aviatur\GeneralBundle\Entity\Parameter::class)->findOneByName('aviatur_wstimatic');
if (null !== $aviaturWstimaticParam) {
if ('' !== $aviaturWstimaticParam->getValue()) {
$counterTravelers = sizeof($travelers);
$counterJourneySummaries = sizeof($journeySummaries);
for($indexJourneySummaries = 0; $indexJourneySummaries < $counterJourneySummaries; $indexJourneySummaries++) {
$counterLastFlightDetail = sizeof($journeySummaries[$indexJourneySummaries]['flightDetails']);
$originCode = $journeySummaries[$indexJourneySummaries]['flightDetails'][0]['DepartureCountryCode'];
$destinationCode = $journeySummaries[$indexJourneySummaries]['flightDetails'][$counterLastFlightDetail - 1]['ArrivalCountryCode'];
/* No se debe generar documentación si es un viaje que tenga origen y destino en un mismo país */
if($originCode === $destinationCode){
continue;
}
/* 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 */
/* Se debe validar que al menos se tenga un país de origen y destino diferente, al revisar cada tramo del vuelo */
$journeySummary = $journeySummaries[$indexJourneySummaries];
$flightDetails = $journeySummary['flightDetails'];
$counterFlightDetails = sizeof($flightDetails);
$arrayStops = [];
for($indexFlightDetails = 0; $indexFlightDetails < $counterFlightDetails; $indexFlightDetails++) {
if(is_null($flightDetails[$indexFlightDetails]['technicalStop'])){
$arrayStops[] = [
'DepartureCountryCode' => $flightDetails[$indexFlightDetails]['DepartureCountryCode'],
'ArrivalCountryCode' => $flightDetails[$indexFlightDetails]['ArrivalCountryCode']
];
$journeySummaries[$indexJourneySummaries]['flightDetails'][$indexFlightDetails]['stopOverCountryIata'] = $flightDetails[$indexFlightDetails]['ArrivalCountryCode'];
} else {
/* Se debe guardar como último arreglo en línea el que corresponde a la última parada técnica como origen */
$lastCountryCode = "";
$isTheFirstStop = true;
for($indexStop = 0; $indexStop < sizeof($flightDetails[$indexFlightDetails]['technicalStop']); $indexStop++) {
$countryIata = "";
$cityCode = $flightDetails[$indexFlightDetails]['technicalStop'][$indexStop]['CityCode'];
$tempTechnicalStopAirportIata = $em->getRepository(\Aviatur\SearchBundle\Entity\SearchAirports::class)->findOneByIata($cityCode);
if (!is_null($tempTechnicalStopAirportIata)) {
$countryIata = $tempTechnicalStopAirportIata->getCountrycode();
}
if($countryIata == ""){
/* Al no hallar país, se debe seguir con otro registro de paradas */
continue;
}
if($isTheFirstStop){
$arrayStops[] = [
'DepartureCountryCode' => $flightDetails[$indexFlightDetails]['DepartureCountryCode'],
'ArrivalCountryCode' => $countryIata
];
} else {
$arrayStops[] = [
'DepartureCountryCode' => $lastCountryCode,
'ArrivalCountryCode' => $countryIata
];
}
$journeySummaries[$indexJourneySummaries]['flightDetails'][$indexFlightDetails]['technicalStop'][$indexStop]['countryIata'] = $countryIata;
$lastCountryCode = $countryIata;
$isTheFirstStop = false;
}
$arrayStops[] = [
'DepartureCountryCode' => ($lastCountryCode !== "" ? $lastCountryCode : $flightDetails[$indexFlightDetails]['DepartureCountryCode']),
'ArrivalCountryCode' => $flightDetails[$indexFlightDetails]['ArrivalCountryCode']
];
$journeySummaries[$indexJourneySummaries]['flightDetails'][$indexFlightDetails]['stopOverCountryIata'] = $flightDetails[$indexFlightDetails]['ArrivalCountryCode'];
}
}
/* Si solo hay un único tramo por viaje, no debería generar transits */
$linealListOfStops = "";
$counterStops = sizeof($arrayStops);
$isTheSameCountry = true;
for($indexStops = 0; $indexStops < $counterStops; $indexStops++) {
if($linealListOfStops !== "" || $isTheSameCountry === false){
$linealListOfStops .= ";";
$isTheSameCountry = true;
}
if($arrayStops[$indexStops]['ArrivalCountryCode'] !== $arrayStops[$indexStops]['DepartureCountryCode']){
$linealListOfStops .= $arrayStops[$indexStops]['ArrivalCountryCode'];
$isTheSameCountry = false;
} else {
if(strlen($linealListOfStops) > 0){
if(strpos($linealListOfStops, ";", strlen($linealListOfStops) - 1) !== false){
$linealListOfStops = substr($linealListOfStops, 0, strlen($linealListOfStops) - 1);
}
}
$isTheSameCountry = true;
}
}
/* Se debe revisar que al menos se tengan 2 países para validar las paradas */
if(strpos($linealListOfStops, ";") === false){
$linealListOfStops = "";
}
if($counterTravelers > 0){
for($indexTravelers = 1; $indexTravelers <= $counterTravelers; $indexTravelers++) {
$readyLink = $baseURL."wstimatic/documentation/".$originCode."/".$destinationCode."/".$travelers[$indexTravelers]['Nationality'];
$readyLink .= "/".(str_replace(" ", ".", strtolower($travelers[$indexTravelers]['GivenName'])."."));
$readyLink .= (str_replace(" ", ".", strtolower($travelers[$indexTravelers]['Surname'])));
if($linealListOfStops !== ""){
$readyLink .= "/".$linealListOfStops;
}
if(!isset($travelers[$indexTravelers]['docLinks'])){
$travelers[$indexTravelers]['docLinks'] = [];
}
$travelers[$indexTravelers]['docLinks'][] = $readyLink;
}
}
}
}
}
}
/**
* Obtiene la nacionalidad de un pasajero a partir de los datos del producto adicional.
*
* @param $addProductData Objeto que contiene los datos del producto adicional.
* @param $passengerType Tipo de pasajero (ADT, CHD, INF).
* @param $givenName Nombre del pasajero.
* @param $surname Apellido del pasajero.
*
* @return string Código de nacionalidad del pasajero.
* @author david.rincon@aviatur.com
* Date 2025-07-31
*/
public function getNationalityByAddProductData($addProductData, $passengerType, $givenName, $surname)
{
$nationality = 'CO'; /* Por defecto */
if (isset($addProductData->data->product->passengers)) {
$firstArrayPassengers = (array)$addProductData->data->product->passengers;
$arrayPassengers = (array)$firstArrayPassengers['passenger'];
if(isset($arrayPassengers["type"])){
/* Un solo viajero */
if (mb_strtolower((string)$arrayPassengers["type"]) === $passengerType && mb_strtolower((string)$arrayPassengers["first_name"]) === $givenName && mb_strtolower((string)$arrayPassengers["first_last_name"]) === $surname) {
$nationality = (string)$arrayPassengers["nationality"];
}
} else {
/* Múltiples viajeros */
foreach ($arrayPassengers as $passenger) {
if (mb_strtolower((string)$passenger->type) === $passengerType && mb_strtolower((string)$passenger->first_name) === $givenName && mb_strtolower((string)$passenger->first_last_name) === $surname) {
$nationality = (string)$passenger->nationality;
break;
}
}
}
}
return $nationality;
}
private function getCountryByCityOrAirport($citySearch)
{
$em = $this->em;
$city = $em->getRepository(\Aviatur\GeneralBundle\Entity\City::class)->findOneByIatacode($citySearch);
if(!$city)
$airport = $em->getRepository(\Aviatur\SearchBundle\Entity\SearchAirports::class)->findOneByIata($citySearch);
if($city)
return $city->getCountry();
else if($airport)
return $em->getRepository(\Aviatur\GeneralBundle\Entity\Country::class)->findOneByIatacode($airport->getCountryCode());
}
}