<?php
namespace Aviatur\FlightBundle\Controller;
use Aviatur\CustomerBundle\Services\ValidateSanctions;
use Aviatur\CustomerBundle\Services\ValidateSanctionsRenewal;
use Aviatur\FlightBundle\Services\EmissionWebservice;
use Aviatur\GeneralBundle\Controller\OrderController;
use Aviatur\GeneralBundle\Services\AviaturEncoder;
use Aviatur\GeneralBundle\Services\AviaturErrorHandler;
use Aviatur\GeneralBundle\Services\AviaturExperienceService;
use Aviatur\GeneralBundle\Services\AviaturLogSave;
use Aviatur\GeneralBundle\Services\AviaturMailer;
use Aviatur\GeneralBundle\Services\PayoutExtraService;
use Aviatur\InsuranceBundle\Services\InsuranceService;
use Aviatur\PaymentBundle\Controller\P2PController;
use Aviatur\PaymentBundle\Controller\PSEController;
use Aviatur\PaymentBundle\Controller\PSERestController;
use Aviatur\PaymentBundle\Controller\SafetypayController;
use Aviatur\PaymentBundle\Services\CustomerMethodPaymentService;
use Aviatur\PaymentBundle\Services\TokenizerService;
use Aviatur\TwigBundle\Services\TwigFolder;
use Doctrine\Persistence\ManagerRegistry;
use Google\Service\Fitness\Session;
use Random\RandomException;
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\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Aviatur\GeneralBundle\Services\AviaturCardProviderAirlineHomologateServices;
class FlightCallbackController extends AbstractController
{
/**
* @var ManagerRegistry
*/
protected ManagerRegistry $managerRegistry;
/**
* @var AviaturCardProviderAirlineHomologateServices
*/
protected AviaturCardProviderAirlineHomologateServices $cardHomologateServices;
protected $paymentMethod;
private $specialDiscountParams;
private $countriesInCashWithLufthansa;
public function __construct(ManagerRegistry $managerRegistry, AviaturCardProviderAirlineHomologateServices $cardHomologateServices, SessionInterface $session) {
$this->managerRegistry = $managerRegistry;
$this->cardHomologateServices = $cardHomologateServices;
$em = $this->managerRegistry->getManager();
$this->specialDiscountParams = $em->getRepository(\Aviatur\GeneralBundle\Entity\Parameter::class)->findOneByName('aviatur_enable_special_discounts');
/* Para traer los países que aplican CASH con tarjeta para Lufthansa */
$stringLufthansaCountries = $em->getRepository(\Aviatur\GeneralBundle\Entity\Parameter::class)->findOneByName('countries_in_cash_with_lufthansa');
if ($stringLufthansaCountries) {
$this->countriesInCashWithLufthansa = json_decode($stringLufthansaCountries->getValue())->countries ?? [];
} else {
$this->countriesInCashWithLufthansa = [];
}
$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;
}
}
public function safetyUrlAction(Request $request, AviaturErrorHandler $errorHandler, TwigFolder $twigFolder, SafetypayController $safetypayController)
{
$post = $request->request;
$MerchantSalesID = $post->get('merchant_id');
if (empty($MerchantSalesID)):
return $this->redirect($errorHandler->errorRedirectNoEmail($twigFolder->pathWithLocale('aviatur_general_homepage'), '', 'No hay información')); else:
$safetyController = $safetypayController->safetyNotify($MerchantSalesID);
if ('ok' == $safetyController) {
return $this->redirect($errorHandler->errorRedirectNoEmail($twigFolder->pathWithLocale('aviatur_general_homepage'), 'Notificación SafetyPay', 'Transacción Exitosa, Notificación Recibida'));
} else {
return $this->redirect($errorHandler->errorRedirectNoEmail($twigFolder->pathWithLocale('aviatur_general_homepage'), '', 'Error de comunicación'));
}
endif;
}
public function safetyCallbackOkAction(SessionInterface $session, ParameterBagInterface $parameterBag)
{
$transactionIdSessionName = $parameterBag->get('transaction_id_session_name');
$correlationId = $session->get($session->get($transactionIdSessionName).'[flight]['.$transactionIdSessionName.']');
if (false !== strpos($correlationId, '||')) {
$correlationIds = explode('||', $correlationId);
foreach ($correlationIds as $key => $correlationId) {
$return = $this->safetyCallbackOk($correlationId, true, $key);
}
return $return;
} else {
return $this->safetyCallbackOk($correlationId, false);
}
}
public function safetyCallbackOk(SessionInterface $session, ParameterBagInterface $parameterBag, SafetypayController $safetypayController, AviaturErrorHandler $errorHandler, AviaturEncoder $aviaturEncoder, TwigFolder $twigFolder, EmissionWebservice $emissionWebservice, InsuranceService $insuranceService, OrderController $orderController, AviaturExperienceService $aviaturExperienceService, PayoutExtraService $payoutExtraService, \Swift_Mailer $mailer, $correlationId, $combination, $segment = null)
{
$transactionIdSessionName = $parameterBag->get('transaction_id_session_name');
$emailNotification = $parameterBag->get('email_notification');
$status = null;
$twig = null;
$em = $this->managerRegistry->getManager();
$safetypayController->safetyok();
if (true === $session->has($transactionIdSessionName)) {
$transactionId = $session->get($transactionIdSessionName);
if ($combination) {
if (true === $session->has($transactionId.'[flight][order'.$segment.']')) {
$orderProductCode = $session->get($transactionId.'[flight][order'.$segment.']');
} else {
return $this->redirect($errorHandler->errorRedirect($twigFolder->pathWithLocale('aviatur_general_homepage'), '', 'No se encontró orden asociada a este pago'));
}
} else {
if (true === $session->has($transactionId.'[flight][order]')) {
$orderProductCode = $session->get($transactionId.'[flight][order]');
} else {
return $this->redirect($errorHandler->errorRedirect($twigFolder->pathWithLocale('aviatur_general_homepage'), '', 'No se encontró orden asociada a este pago'));
}
}
$productId = str_replace('PN', '', json_decode($orderProductCode)->products);
$orderProduct = $em->getRepository(\Aviatur\GeneralBundle\Entity\OrderProduct::class)->find($productId);
$decodedRequest = json_decode($aviaturEncoder->AviaturDecode($orderProduct->getPayrequest(), $orderProduct->getPublicKey()));
$decodedResponse = json_decode($aviaturEncoder->AviaturDecode($orderProduct->getPayresponse(), $orderProduct->getPublicKey()));
$recordData = new \stdClass();
$recordData->record = (string) $orderProduct->getBooking();
$response = $emissionWebservice->callServiceEmission('traer_reserva', $recordData, $orderProduct->getId());
if (isset($response->originDestinationDetails) && isset($response->originDestinationDetails->itineraryInfo)) {
foreach ($response->originDestinationDetails->itineraryInfo as $itinerary) {
if (isset($itinerary->elementManagementItinerary->segmentName) && ('AIR' == (string) $itinerary->elementManagementItinerary->segmentName) && isset($itinerary->travelProduct->productDetails->identification) && ('ARNK' != (string) $itinerary->travelProduct->productDetails->identification)) {
if ('HK' != (string) $itinerary->relatedProduct->status) {
return $this->redirect($errorHandler->errorRedirect($twigFolder->pathWithLocale('aviatur_general_homepage'), '', 'El estado del tiquete no permite la emisión, por favor comunícate con nosotros a los teléfonos 57 1 5879640 o 57 1 3821616 o vía e-mail al correo soportepagoelectronico@aviatur.com.co 11'));
}
}
}
$payError = $decodedResponse->payResponse->OperationResponse->ErrorManager->ErrorNumber->{'@content'};
$notifyError = $decodedResponse->notificationResponse->OperationActivityNotifiedResponse->ErrorManager->ErrorNumber->{'@content'};
//Verificando que exista operación de pago
if (isset($decodedResponse->payResponse->OperationResponse)) {
$additionalQS = '';
//Verificando tipo de error en pago
if (0 == $payError) {
if ($combination) {
$retryCount = (int) $session->get($transactionId.'[flight][retry'.$segment.']');
} else {
$retryCount = (int) $session->get($transactionId.'[flight][retry]');
}
if ($combination) {
$retryCount = (int) $session->get($transactionId.'[flight][retry'.$segment.']');
} else {
$retryCount = (int) $session->get($transactionId.'[flight][retry]');
}
//Verificando tipo de error en notificación
if (0 == $notifyError) {
switch ($payError) {
case 0:
$twig = 'aviatur_flight_payment_success_secure';
$status = 'approved';
if ('rappi' == $orderProduct->getOrder()->getAgency()->getAssetsFolder()) {
$additionalQS = '?bookingid='.$orderProduct->getBooking().'&total='.$decodedRequest->x_amount;
}
break;
case 2:
$twig = 'aviatur_flight_payment_error_secure';
$status = 'failed';
break;
}
$orderProduct->setStatus($status);
$orderProduct->getOrder()->setStatus($status);
$orderProduct->setUpdatingdate(new \DateTime());
$orderProduct->getOrder()->setUpdatingdate(new \DateTime());
// $em->persist($orderProduct);
$em->flush();
$agency = $orderProduct->getOrder()->getAgency();
$payoutExtraService->payoutExtrasCallback($twig, $transactionId, 'flight', $agency, $orderProduct);
if ($session->has($transactionId.'[experience][payout_extra]')) {
$aviaturExperienceService->changeStatus($transactionId, $status);
}
if (0 == $payError) {
$updateOrder = $orderController->updatePaymentAction($orderProduct);
$emissionData = json_decode($orderProduct->getEmissiondata());
$emissionData->CorrelationId = $correlationId;
$response = $emissionWebservice->callServiceEmission('emitir_cash_officeid', $emissionData, $orderProduct);
$emissionXml = $orderController->emissionDataAction($response);
if ($session->has($transactionId.'[assist][payout_extra]') && (false === $session->has($transactionId.'[assist][Emision]'))) {
$orderInsurance = json_decode($session->get($transactionId.'[assist][order]'));
$EmisionTarjeta = $insuranceService->EmisionTarjeta($orderInsurance);
$session->set($transactionId.'[assist][Emision]', $EmisionTarjeta->asXml());
$insuranceService->changeStatus($status, $orderInsurance);
}
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) {
$orderInfoExperience = json_decode($session->get($transactionId.'[experience][order'.$key.']'));
$productIdExperience = str_replace('PN', '', $orderInfoExperience->products);
$orderProductExperience = $em->getRepository(\Aviatur\GeneralBundle\Entity\OrderProduct::class)->find($productIdExperience);
$EmisionTarjeta = $aviaturExperienceService->EmitirSolicitud($orderProductExperience, null, true);
}
}
}
if ('error' != $emissionXml) {
$updatePaymentXml = $orderProduct->getUpdatepaymentdata();
$updatePayment = explode('<booking_id2/>', $updatePaymentXml);
$orderProduct->setUpdatepaymentdata($updatePayment[0].'<booking_id2/>'.$emissionXml.$updatePayment[1]);
if ($combination) {
$session->set($transactionId.'[emission'.$segment.']', $response->asXML());
} else {
$session->set($transactionId.'[emission]', $response->asXML());
}
} else {
if (isset($emissionData->tarjeta)) {
unset($emissionData->tarjeta);
unset($emissionData->franquicia);
unset($emissionData->codigo_auth);
unset($emissionData->fecha_vencmiento);
}
$mailInfo = print_r($emissionData, true).'<br>'.print_r($response, true);
$message = (new \Swift_Message())
->setContentType('text/html')
->setFrom($session->get('emailNoReply'))
->setTo(['soportepagoelectronico@aviatur.com.co', 'soptepagelectronic@aviatur.com'])
->setBcc([$emailNotification, 'soportepagoelectronico@aviatur.com.co', 'soptepagelectronic@aviatur.com'])
->setSubject('Fallo de Emisión')
->setBody($mailInfo);
$mailer->send($message);
$session->set($transactionId.'[emission][error]', true);
$urlResume = $this->generateUrl($twig);
$urlResume .= $additionalQS;
return $this->redirect($urlResume);
}
}
} else {
echo 'En este momento su #<referencia de factura> presenta un proceso de pago cuya transacción se encuentra
PENDIENTE de recibir información por parte de su entidad financiera, por favor espere
unos minutos y vuelva a consultar mas tarde para verificar sí su pago fue confirmado de
forma exitosa. Si desea mayor información sobre el estado actual de su operación puede
comunicarse a nuestras líneas de atención al cliente al teléfono XXXXXX o enviar
inquietudes al email mispagos@micomercio.com y pregunte por el estado de la
transacción <#CUS> .';
$orderProduct->setEmissiondata('error');
$orderProduct->setUpdatingdate(new \DateTime());
$em->persist($orderProduct);
$em->flush();
if ($session->has($transactionId.'[assist][payout_extra]')) {
$orderInsurance = json_decode($session->get($transactionId.'[assist][order]'));
$insuranceService->changeStatus($status, $orderInsurance);
}
$twig = 'aviatur_flight_payment_error_secure';
}
if ($combination) {
$session->set($transactionId.'[flight][retry'.$segment.']', $retryCount - 1);
} else {
$session->set($transactionId.'[flight][retry]', $retryCount - 1);
}
$urlResume = $this->generateUrl($twig);
$urlResume .= $additionalQS;
return $this->redirect($urlResume);
} else {
$decodedResponse->payResponse->OperationResponse->ListOfOperations = $paymentResponse;
$orderProduct->setPayresponse($aviaturEncoder->AviaturEncode(json_encode($decodedResponse), $orderProduct->getPublicKey()));
$orderProduct->setUpdatingdate(new \DateTime());
$em->persist($orderProduct);
$em->flush();
return $this->redirect($errorHandler->errorRedirect($twigFolder->pathWithLocale('aviatur_general_homepage'), '', 'Ocurrió un error al consultar el estado de la transacción'));
}
} else {
return $this->redirect($errorHandler->errorRedirect($twigFolder->pathWithLocale('aviatur_general_homepage'), '', 'No se encontró información de la transacción'));
}
} else {
return $this->redirect($errorHandler->errorRedirect($twigFolder->pathWithLocale('aviatur_general_homepage'), '', 'El estado del tiquete no permite la emisión, por favor comunícate con nosotros a los teléfonos 57 1 5879640 o 57 1 3821616 o vía e-mail al correo soportepagoelectronico@aviatur.com.co22'));
}
} else {
return $this->redirect($errorHandler->errorRedirect($twigFolder->pathWithLocale('aviatur_general_homepage'), '', 'No se encontró identificador de la transacción'));
}
}
public function safetyCallbackErrorAction(SessionInterface $session, ParameterBagInterface $parameterBag)
{
$transactionIdSessionName = $parameterBag->get('transaction_id_session_name');
$correlationId = $session->get($session->get($transactionIdSessionName).'[flight]['.$transactionIdSessionName.']');
if (false !== strpos($correlationId, '||')) {
$correlationIds = explode('||', $correlationId);
foreach ($correlationIds as $key => $correlationId) {
$return = $this->safetyCallbackError($correlationId, true, $key);
}
return $return;
} else {
return $this->safetyCallbackError($correlationId, false);
}
}
public function safetyCallbackError(SessionInterface $session, ParameterBagInterface $parameterBag, AviaturErrorHandler $errorHandler, AviaturEncoder $aviaturEncoder, TwigFolder $twigFolder, $correlationId, $combination, $segment = null)
{
$transactionIdSessionName = $parameterBag->get('transaction_id_session_name');
$status = null;
$em = $this->managerRegistry->getManager();
$transactionId = $session->get($transactionIdSessionName);
if ($combination) {
if (true === $session->has($transactionId.'[flight][order'.$segment.']')) {
$orderProductCode = $session->get($transactionId.'[flight][order'.$segment.']');
$retryCount = (int) $session->get($transactionId.'[flight][retry'.$segment.']');
} else {
return $this->redirect($errorHandler->errorRedirect($twigFolder->pathWithLocale('aviatur_general_homepage'), '', 'No se encontró orden asociada a este pago'));
}
} else {
if (true === $session->has($transactionId.'[flight][order]')) {
$orderProductCode = $session->get($transactionId.'[flight][order]');
$retryCount = (int) $session->get($transactionId.'[flight][retry]');
} else {
return $this->redirect($errorHandler->errorRedirect($twigFolder->pathWithLocale('aviatur_general_homepage'), '', 'No se encontró orden asociada a este pago'));
}
}
$productId = str_replace('PN', '', json_decode($orderProductCode)->products);
$orderProduct = $em->getRepository(\Aviatur\GeneralBundle\Entity\OrderProduct::class)->find($productId);
$payResponse = json_decode($aviaturEncoder->AviaturDecode($orderProduct->getPayResponse(), $orderProduct->getPublicKey()));
$payRequest = json_decode($aviaturEncoder->AviaturDecode($orderProduct->getPayRequest(), $orderProduct->getPublicKey()));
$orderProduct->setPayresponse($aviaturEncoder->AviaturEncode(json_encode($payResponse), $orderProduct->getPublicKey()));
if ('baloto' == $payRequest->dataTransf->x_payment_data) {
$status = 'pending';
$payResponse->dataTransf->x_response_code = 100;
$payResponse->dataTransf->x_response_reason_text = (string) 'Transaction Pending';
} elseif ('safety' == $payRequest->dataTransf->x_payment_data) {
$status = 'rejected';
$payResponse->dataTransf->x_response_code = 100;
$payResponse->dataTransf->x_response_reason_text = (string) 'Transaction Expired';
}
$orderProduct->setStatus($status);
$orderProduct->setUpdatingdate(new \DateTime());
$orderProduct->getOrder()->setUpdatingdate(new \DateTime());
$order = $em->getRepository(\Aviatur\GeneralBundle\Entity\Order::class)->find($orderProduct->getOrder()->getId());
$order->setStatus($status);
// $em->persist($order);
// $em->persist($orderProduct);
if ($session->has($transactionId.'[assist][payout_extra]')) {
$orderProductCodeInsurance = $session->get($transactionId.'[assist][order]');
$productIdInsurance = str_replace('PN', '', json_decode($orderProductCodeInsurance)->products);
$orderProductInsurance = $em->getRepository(\Aviatur\GeneralBundle\Entity\OrderProduct::class)->find($productIdInsurance);
$orderProductInsurance->setStatus($status);
$orderProductInsurance->setUpdatingdate(new \DateTime());
$orderProductInsurance->getOrder()->setUpdatingdate(new \DateTime());
$orderInsurance = $em->getRepository(\Aviatur\GeneralBundle\Entity\Order::class)->find($orderProductInsurance->getOrder()->getId());
$orderInsurance->setStatus($status);
// $em->persist($orderInsurance);
}
$em->flush();
if ($combination) {
$session->set($transactionId.'[flight][retry'.$segment.']', $retryCount - 1);
} else {
$session->set($transactionId.'[flight][retry]', $retryCount - 1);
}
return $this->redirect($this->generateUrl('aviatur_flight_payment_rejected_secure'));
}
public function worldCallbackAction(SessionInterface $session, ParameterBagInterface $parameterBag, AviaturErrorHandler $errorHandler, AviaturEncoder $aviaturEncoder, TwigFolder $twigFolder, EmissionWebservice $emissionWebservice, InsuranceService $insuranceService, OrderController $orderController, AviaturExperienceService $aviaturExperienceService, PayoutExtraService $payoutExtraService, \Swift_Mailer $mailer)
{
$transactionIdSessionName = $parameterBag->get('transaction_id_session_name');
$correlationId = $session->get($session->get($transactionIdSessionName).'[flight]['.$transactionIdSessionName.']');
if (false !== strpos($correlationId, '||')) {
$correlationIds = explode('||', $correlationId);
foreach ($correlationIds as $key => $correlationId) {
$return = $this->worldCallback($session, $parameterBag, $errorHandler, $aviaturEncoder, $twigFolder, $emissionWebservice, $insuranceService, $orderController, $aviaturExperienceService, $payoutExtraService, $mailer, $correlationId, true, $key);
}
return $return;
} else {
return $this->worldCallback($session, $parameterBag, $errorHandler, $aviaturEncoder, $twigFolder, $emissionWebservice, $insuranceService, $orderController, $aviaturExperienceService, $payoutExtraService, $mailer, $correlationId, false);
}
}
public function worldCallback(SessionInterface $session, ParameterBagInterface $parameterBag, AviaturErrorHandler $errorHandler, AviaturEncoder $aviaturEncoder, TwigFolder $twigFolder, EmissionWebservice $emissionWebservice, InsuranceService $insuranceService, OrderController $orderController, AviaturExperienceService $aviaturExperienceService, PayoutExtraService $payoutExtraService, \Swift_Mailer $mailer, $correlationId, $combination, $segment = null)
{
$transactionIdSessionName = $parameterBag->get('transaction_id_session_name');
$emailNotification = $parameterBag->get('email_notification');
$em = $this->managerRegistry->getManager();
$agencyFolder = $twigFolder->twigFlux();
$transactionId = $session->get($transactionIdSessionName);
if ($combination) {
$prepaymentInfo = \simplexml_load_string((string) $session->get($transactionId.'[flight][prepayment'.$segment.']'));
$orderProductCode = $session->get($transactionId.'[flight][order'.$segment.']');
} else {
$prepaymentInfo = \simplexml_load_string($session->get($transactionId.'[flight][prepayment]'));
$orderProductCode = $session->get($transactionId.'[flight][order]');
}
$productId = str_replace('PN', '', json_decode($orderProductCode)->products);
$orderProduct = $em->getRepository(\Aviatur\GeneralBundle\Entity\OrderProduct::class)->find($productId);
$agency = $orderProduct->getOrder()->getAgency();
$decodedRequest = json_decode($aviaturEncoder->AviaturDecode($orderProduct->getPayrequest(), $orderProduct->getPublicKey()));
$decodedResponse = json_decode($aviaturEncoder->AviaturDecode($orderProduct->getPayresponse(), $orderProduct->getPublicKey()));
if (null != $decodedResponse) {
if ($combination) {
$retryCount = (int) $session->get($transactionId.'[flight][retry'.$segment.']');
} else {
$retryCount = (int) $session->get($transactionId.'[flight][retry]');
}
$twig = '';
$infoEmission = $decodedRequest->x_first_name.' '.$decodedRequest->x_last_name.'/'
.$decodedRequest->x_address.'/'
.$decodedRequest->x_cust_id.'/'
.$decodedRequest->x_phone.'/'
.$decodedRequest->x_email;
if (isset($decodedRequest->x_service_fee_base)) {
$valuesEmission = 'TA:'.number_format($decodedRequest->x_service_fee_base, 0, '.', '')
.'/ITA:'.number_format($decodedRequest->x_service_fee_tax, 0, '.', '')
.'/TAX:'.number_format($decodedRequest->x_tax, 0, '.', '')
.'/VB:'.number_format($decodedRequest->x_amount_base, 0, '.', '')
.'/AT:'.number_format($decodedRequest->x_airport_tax, 0, '.', '');
} else {
$valuesEmission = '/TAX:'.number_format($decodedRequest->x_tax, 0, '.', '')
.'/VB:'.number_format($decodedRequest->x_amount_base, 0, '.', '')
.'/AT:'.number_format($decodedRequest->x_airport_tax, 0, '.', '');
}
$comision = (string) 1;
$configFlightAgency = $em->getRepository(\Aviatur\FlightBundle\Entity\ConfigFlightAgency::class)->findOneBy(['agency' => $agency, 'provider' => $orderProduct->getProvider()]);
if ((null != $configFlightAgency) && (null != $configFlightAgency->getWsurl())) {
$officeId = $configFlightAgency->getOfficeid();
} else {
$officeId = $agency->getOfficeid();
}
if ('0XZA' == $officeId) {
$valuesEmission .= '/IATA:76522552';
}
if (isset($decodedResponse->x_response_code_cyber) && (2 == $decodedResponse->x_response_code_cyber)) {
$decodedResponse->x_response_code_case = 99;
} else {
if (isset($decodedResponse->resultado->reply->orderStatus->payment->lastEvent)) {
$decodedResponse->x_response_code_case = (string) $decodedResponse->resultado->reply->orderStatus->payment->lastEvent;
} elseif (isset($decodedResponse->resultado->reply->orderStatusEvent->payment->lastEvent)) {
$decodedResponse->x_response_code_case = 'REFUSED';
} elseif (isset($decodedResponse->resultado->reply->error)) {
$decodedResponse->x_response_code_case = 'REFUSED';
}
}
switch ($decodedResponse->x_response_code_case) {
case 99:
$twig = 'aviatur_flight_payment_rejected_secure';
break;
case 'ERROR':
$twig = 'aviatur_flight_payment_error_secure';
break;
case 'AUTHORISED':
$retryCount = (int) $session->get($transactionId.'[flight][retry]');
$twig = 'aviatur_flight_payment_success_secure';
$franchise = $em->getRepository(\Aviatur\GeneralBundle\Entity\Card::class)->findOneByWorldpaycode($decodedResponse->x_franchise);
// Sin dispersion de fondos
$emissionData = new \stdClass();
$emissionData->record = $orderProduct->getBooking();
$emissionData->comision = $comision;
$serviceName = 'emitir_cash_officeid';
//$serviceName = $orderProduct->getProvider()->getName() == 'sabre-ndc-qa' ? 'emitir_cash_officeid_ndc': 'emitir_cash_officeid';
$emissionData->email = (string) $decodedRequest->x_email;
$emissionData->datos_facturacion = (string) $infoEmission;
$emissionData->valores_adicionales = (string) $valuesEmission;
// YARED COMMENT esta validacion es una mierda pero es culpa de sabre entonces tendremos que quitarla algun dia
$emissionData->OfficeID = $officeId;
$orderProduct->getProvider()->getName() == 'sabre-ndc-qa' ? $emissionData->officeID = $officeId : $emissionData->OfficeID = $officeId;
/* //Aqui se realiza la emision
$response = $emissionWebservice->callServiceEmission($serviceName, $emissionData, $orderProduct->getId());
//Aqui va ancillaries con worldpay
$vectorAncillariesData = $orderProduct->getOrder()->getAncillariesOrder();
if(sizeof($vectorAncillariesData) > 0){
$ancillariesData = $vectorAncillariesData[0]->getData();
} else {
$ancillariesData = null;
}
if(isset($ancillariesData) && !is_null($ancillariesData)) {
$ancillariesProcessedData = $this->processAncillariesData($ancillariesData, $correlationId);
$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();
$emissionXml = $orderController->emissionDataAction($response, $ancillariesProcessedData, $orderProduct, $airlineIdVendor);
} else {
$emissionXml = $orderController->emissionDataAction($response);
} */
$response = $emissionWebservice->callServiceEmission($serviceName, $emissionData, $orderProduct->getId());
$emissionXml = $orderController->emissionDataAction($response);
//Fin ancillaries con worldpay
$orderProduct->setEmissiondata(json_encode($emissionData));
$orderProduct->setUpdatingdate(new \DateTime());
$em->persist($orderProduct);
$em->flush();
if ((true === $session->has($transactionId.'[assist][payout_extra]')) && (false === $session->has($transactionId.'[assist][Emision]'))) {
$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) && 1 == $decodedResponseInsurance->x_response_code) {
$EmisionTarjeta = $insuranceService->EmisionTarjeta($orderInsurance);
$session->set($transactionId.'[assist][Emision]', $EmisionTarjeta->asXml());
$insuranceService->changeStatus('approved', $orderInsurance);
}
}
if ($session->has($transactionId.'[experience][payout_extra]')) {
$payoutExtrasValues = json_decode($session->get($transactionId.'[flight][payout_extra_values]'));
foreach ($payoutExtrasValues as $payoutExtraValues) {
if ('EXPERIENCE' == $payoutExtraValues->name) {
$orderInfoExperience = json_decode($session->get($transactionId.'[experience][order'.$payoutExtraValues->id.']'));
$productIdExperience = str_replace('PN', '', $orderInfoExperience->products);
$orderProductExperience = $em->getRepository(\Aviatur\GeneralBundle\Entity\OrderProduct::class)->find($productIdExperience);
if (isset($orderProductExperience->x_response_code) && 1 == $orderProductExperience->x_response_code) {
$EmitirSolicitud = $aviaturExperienceService->EmitirSolicitud($orderProductExperience, null, true);
}
}
}
}
if ('error' != $emissionXml) {
if ($combination) {
$session->set($transactionId.'[emission'.$segment.']', $response->asXML());
} else {
$session->set($transactionId.'[emission]', $response->asXML());
}
$updatePaymentXml = $orderProduct->getUpdatepaymentdata();
if (false === strpos($updatePaymentXml, '<emission_data>')) {
$updatePayment = explode('<booking_id2/>', $updatePaymentXml);
$orderProduct->setUpdatepaymentdata($updatePayment[0].'<booking_id2/>'.$emissionXml.$updatePayment[1]);
$em->persist($orderProduct);
$em->flush();
}
} else {
if (isset($emissionData->tarjeta)) {
unset($emissionData->tarjeta);
unset($emissionData->franquicia);
unset($emissionData->codigo_auth);
unset($emissionData->fecha_vencmiento);
}
$mailInfo = print_r($emissionData, true).'<br>'.print_r($response, true);
$message = (new \Swift_Message())
->setContentType('text/html')
->setFrom($session->get('emailNoReply'))
->setTo(['soportepagoelectronico@aviatur.com.co', 'soptepagelectronic@aviatur.com'])
->setBcc($emailNotification)
->setSubject('Fallo de Emisión')
->setBody($mailInfo);
$mailer->send($message);
$session->set($transactionId.'[emission][error]', true);
return $this->redirect($this->generateUrl($twig));
}
break;
case 'REFUSED':
$twig = '' != $twig ? $twig : 'aviatur_flight_payment_rejected_secure';
break;
default:
$twig = '' != $twig ? $twig : 'aviatur_flight_payment_pending_secure';
$franchise = $em->getRepository(\Aviatur\GeneralBundle\Entity\Card::class)->
findOneByWorldpaycode(str_replace(['CR_', 'RM_', 'CDNSA'], ['', '', 'CS'], $decodedResponse->x_franchise));
// Sin dispersion de fondos
$emissionData = new \stdClass();
// $emissionData->record = '59RJO7';
$emissionData->record = $orderProduct->getBooking();
$emissionData->comision = $comision;
$emissionData->email = (string) $decodedRequest->x_email;
$emissionData->datos_facturacion = (string) $infoEmission;
$emissionData->valores_adicionales = (string) $valuesEmission;
$emissionData->OfficeID = $officeId;
$orderProduct->setEmissiondata(json_encode($emissionData));
$orderProduct->setUpdatingdate(new \DateTime());
$em->persist($orderProduct);
$em->flush();
$retryCount = 1;
break;
}
if ($combination) {
$session->set($transactionId.'[flight][retry'.$segment.']', $retryCount - 1);
} else {
$session->set($transactionId.'[flight][retry]', $retryCount - 1);
}
$payoutExtraService->payoutExtrasCallback($twig, $transactionId, 'flight', $agency, $orderProduct);
return $this->redirect($this->generateUrl($twig));
} else {
$orderProduct->setStatus('pending');
$em->persist($orderProduct);
$em->flush();
$session->set('redirectedRetry', true);
return $this->redirect($errorHandler->errorRedirect($this->generateUrl('aviatur_flight_retry_secure'), '', 'No hay respuesta por parte del servicio de pagoa'));
}
}
public function daviviendaCallbackAction(SessionInterface $session, ParameterBagInterface $parameterBag)
{
$transactionIdSessionName = $parameterBag->get('transaction_id_session_name');
$correlationId = $session->get($session->get($transactionIdSessionName).'[flight]['.$transactionIdSessionName.']');
if (false !== strpos($correlationId, '||')) {
$correlationIds = explode('||', $correlationId);
foreach ($correlationIds as $key => $correlationId) {
$return = $this->daviviendaCallback($correlationId, true, $key);
}
return $return;
} else {
return $this->daviviendaCallback($correlationId, false);
}
}
public function daviviendaCallback(SessionInterface $session, ParameterBagInterface $parameterBag, AviaturErrorHandler $errorHandler, AviaturEncoder $aviaturEncoder, EmissionWebservice $emissionWebservice, OrderController $orderController, PayoutExtraService $payoutExtraService, \Swift_Mailer $mailer, TokenizerService $tokenizerService, ValidateSanctions $validateSanctions, $correlationId, $combination, $segment = null)
{
$transactionIdSessionName = $parameterBag->get('transaction_id_session_name');
$emailNotification = $parameterBag->get('email_notification');
$webmasterEmail = $parameterBag->get('webmaster_email');
$subject = null;
$em = $this->managerRegistry->getManager();
$transactionId = $session->get($transactionIdSessionName);
if ($combination) {
$prepaymentInfo = \simplexml_load_string($session->get($transactionId.'[flight][prepayment'.$segment.']'));
$orderProductCode = $session->get($transactionId.'[flight][order'.$segment.']');
} else {
$prepaymentInfo = \simplexml_load_string($session->get($transactionId.'[flight][prepayment]'));
$orderProductCode = $session->get($transactionId.'[flight][order]');
}
$productId = str_replace('PN', '', json_decode($orderProductCode)->products);
$orderProduct = $em->getRepository(\Aviatur\GeneralBundle\Entity\OrderProduct::class)->find($productId);
$agency = $orderProduct->getOrder()->getAgency();
$decodedRequest = json_decode($aviaturEncoder->AviaturDecode($orderProduct->getPayrequest(), $orderProduct->getPublicKey()));
$decodedResponse = json_decode($aviaturEncoder->AviaturDecode($orderProduct->getPayresponse(), $orderProduct->getPublicKey()));
if (null != $decodedResponse) {
if ($combination) {
$airlineValidation = $em->getRepository(\Aviatur\FlightBundle\Entity\AirlineValidation::class)->find($session->get($transactionId.'[airline_validation'.$segment.']'));
$retryCount = (int) $session->get($transactionId.'[flight][retry'.$segment.']');
} else {
$airlineValidation = $em->getRepository(\Aviatur\FlightBundle\Entity\AirlineValidation::class)->find($session->get($transactionId.'[airline_validation]'));
$retryCount = (int) $session->get($transactionId.'[flight][retry]');
}
$twig = '';
$additionalQS = '';
$infoEmission = $decodedRequest->x_first_name.' '.$decodedRequest->x_last_name.'/'
.$decodedRequest->x_address.'/'
.$decodedRequest->x_cust_id.'/'
.$decodedRequest->x_phone.'/'
.$decodedRequest->x_email;
if (isset($decodedRequest->x_service_fee_base)) {
$valuesEmission = 'TA:'.number_format($decodedRequest->x_service_fee_base, 0, '.', '')
.'/ITA:'.number_format($decodedRequest->x_service_fee_tax, 0, '.', '')
.'/TAX:'.number_format($decodedRequest->x_tax, 0, '.', '')
.'/VB:'.number_format($decodedRequest->x_amount_base, 0, '.', '')
.'/AT:'.number_format($decodedRequest->x_airport_tax, 0, '.', '');
} else {
$valuesEmission = '/TAX:'.number_format($decodedRequest->x_tax, 0, '.', '')
.'/VB:'.number_format($decodedRequest->x_amount_base, 0, '.', '')
.'/AT:'.number_format($decodedRequest->x_airport_tax, 0, '.', '');
}
$comision = (string) 1;
$airlinesSpecialComision = [
'CZ',
'DT',
'EK',
];
$validatingAirline = $airlineValidation->getAirline()->getIata();
if (in_array($validatingAirline, $airlinesSpecialComision)) {
if (('CZ' == $validatingAirline) || ('DT' == $validatingAirline)) {
$comision = (string) 3;
}
if ('EK' == $validatingAirline) {
$comision = (string) 4;
}
}
$pricedItinerary = $prepaymentInfo->Message->OTA_AirBookRS->AirReservation;
$airlinePaymentType = (isset($decodedRequest->x_points_complete) && $decodedRequest->x_points_complete) ? 'CASH' : $airlineValidation->getPaymentType();
$emailData = json_decode($orderProduct->getEmail(), true);
$journeySummary = $emailData['journeySummaries']['0'];
$originCityCode = $journeySummary['originCode'];
$city = $em->getRepository(\Aviatur\SearchBundle\Entity\SearchCities::class)->findOneByIata($originCityCode);
if (null == $city) {
$city = $em->getRepository(\Aviatur\SearchBundle\Entity\SearchAirports::class)->findOneByIata($originCityCode);
}
if (null != $city) {
$originCountry = $city->getCountrycode();
if ('LH' == $validatingAirline && in_array($originCountry, $this->countriesInCashWithLufthansa)) {
$airlinePaymentType = 'CASH';
}
}
$configFlightAgency = $em->getRepository(\Aviatur\FlightBundle\Entity\ConfigFlightAgency::class)->findOneBy(['agency' => $agency, 'provider' => $orderProduct->getProvider()]);
if ((null != $configFlightAgency) && (null != $configFlightAgency->getWsurl())) {
$officeId = $configFlightAgency->getOfficeid();
} else {
$officeId = $agency->getOfficeid();
}
if ('0XZA' == $officeId) {
$valuesEmission .= '/IATA:76522552';
}
if (isset($decodedResponse->x_response_code_cyber) && (2 == $decodedResponse->x_response_code_cyber)) {
$decodedResponse->x_response_code_case = 99;
} else {
$decodedResponse->x_response_code_case = ($decodedResponse->x_response_code ?? $decodedResponse->davivienda->x_response_code ?? '----');
}
$updatePaymentXml = $orderProduct->getUpdatepaymentdata();
if (isset($decodedRequest->redemptionPoints) && isset($decodedRequest->daviviendaMinPoints) && $decodedRequest->redemptionPoints > 0) {
$pointRedemptionValue = $decodedRequest->daviviendaMinPoints;
} else {
$pointRedemptionValue = 0;
}
$orderReference = json_decode($orderProductCode, true);
//guardamos las referencias de los 2 tickets/////////////////
$reference = $orderReference['order'].'-'.$orderReference['products'];
if (!$session->has($transactionId.'[flight][references]')) {
$session->set($transactionId.'[flight][references]', $reference);
$references = $session->get($transactionId.'[flight][references]');
} else {
$references = $session->get($transactionId.'[flight][references]').' + '.$reference;
$session->set($transactionId.'[flight][references]', $references);
}
//guardamos los booking de los 2 tickets
if (!$session->has($transactionId.'[flight][bookings]')) {
$session->set($transactionId.'[flight][bookings]', $orderProduct->getBooking());
$bookings = $session->get($transactionId.'[flight][bookings]');
} else {
$bookings = $session->get($transactionId.'[flight][bookings]').' + '.$orderProduct->getBooking();
$session->get($transactionId.'[flight][bookings]', $bookings);
}
//////////////////////////////////////////////////////////////////////////////////////////////////
switch ($decodedResponse->x_response_code_case) {
case 99:
//rechazado cybersource
$twig = 'aviatur_flight_payment_rejected_secure';
$statusP2P = 'rejectCyber';
// no break
case 3:// pendiente p2p
$twig = '' != $twig ? $twig : 'aviatur_flight_payment_pending_secure';
$statusP2P = 'pendigP2P';
$orderProduct->setUpdatingdate(new \DateTime());
$em->persist($orderProduct);
$em->flush();
$retryCount = 1;
break;
case 0:// error p2p
$twig = 'aviatur_flight_payment_error_secure';
$statusP2P = 'errorP2P';
if ($session->has($transactionId.'[flight][key][redemptionPoints]')) {//si hay una combinación con puntos y uno de los ticketes sale rechazado se nos notificara por correo
if (isset($email)) {
$from = 'noreply@aviatur.com';
$subject = 'Combinación rechazada de aviatur.com.co';
$body = '<b>ERROR EN LA PASARELA</b></br>Referencia Interna:'.$references.'</br>El banco rechazó la siguiente transacción: '.$bookings.'</br>Código de Autorización Redención: '.$session->get($transactionId.'[flight][key][redemptionPoints]').'<br>Total de puntos de la redención: '.$session->get($transactionId.'[flight][pointRedemptionValue]').'</br>Valor en peso de la redención: COP '.$session->get($transactionId.'[flight][pointRedemptionValue]') * $pointRedemptionValue.'</br>Transaction ID: '.$transactionId;
$this->get('aviatur_ath_service')->sendEmail($from, $email, $subject, $body); //llamar al servicio para envio de correo
}
}
// no break
case 2:// rechazada p2p
$twig = '' != $twig ? $twig : 'aviatur_flight_payment_rejected_secure';
$statusP2P = 'rejectP2P';
if ($session->has($transactionId.'[flight][key][redemptionPoints]')) {//si hay una combinación con puntos y uno de los tiketes sale rechazado se nos notificara por correo
if (isset($email)) {
$from = 'noreply@aviatur.com';
$subject = 'Combinación rechazada de aviatur.com.co';
$body = '</br>Referencia Interna:'.$references.'</br>El banco rechazó la siguiente transacción: '.$bookings.'</br>Código de Autorización Redención: '.$session->get($transactionId.'[flight][key][redemptionPoints]').'<br>Total de puntos de la redención: '.$session->get($transactionId.'[flight][pointRedemptionValue]').'</br>Valor en peso de la redención: COP '.$session->get($transactionId.'[flight][pointRedemptionValue]') * $pointRedemptionValue.'</br>Transaction ID: '.$transactionId;
$this->get('aviatur_ath_service')->sendEmail($from, $email, $subject, $body); //llamar al servicio para envio de correo
}
}
break;
case 1:// aprobado p2p
$emissionData = new \stdClass();
$retryCount = (int) $session->get($transactionId.'[flight][retry]');
$twig = 'aviatur_flight_payment_success_secure';
if ('rappi' == $orderProduct->getOrder()->getAgency()->getAssetsFolder()) {
$infoTotalAmount = $decodedRequest->x_amount + $decodedRequest->x_airport_tax + $decodedRequest->x_service_fee;
$additionalQS = '?bookingid='.$bookings.'&total='.$infoTotalAmount;
}
$franchise = $em->getRepository(\Aviatur\GeneralBundle\Entity\Card::class)->
findOneByPaymentgatewaycode(str_replace(['CR_', 'RM_', 'CDNSA'], ['', '', 'CS'], $decodedResponse->x_franchise));
// Sin dispersion de fondos
$emissionData->record = $orderProduct->getBooking();
$emissionData->comision = $comision;
$serviceName = 'emitir_cash_officeid';
//$serviceName = $orderProduct->getProvider()->getName() == 'sabre-ndc-qa' ? 'emitir_cash_officeid_ndc': 'emitir_cash_officeid';
$special_emission = false;
if ($session->has($transactionId . '[flight][special_emission_replace_iata]')) {//Precompra Aerolinea
$special_emissions_params = $session->get($transactionId . '[flight][special_emission_replace_iata]');
$ticketingVendor = $prepaymentInfo->Message->OTA_AirBookRS->AirReservation->Ticketing->TicketingVendor;
$airline_iata = isset($ticketingVendor['CodeContext']) ? (string) $ticketingVendor['CodeContext'] : (string) $ticketingVendor['Code'];
if (isset($special_emissions_params['airlineReplaceCode']) && in_array($airline_iata, $special_emissions_params['airlineRequired'])) {
$special_emission = true;
}
}
// Dispersion de fondos
if (('DISP' == $airlinePaymentType) && !isset($pricedItinerary->PriceInfo->ItinTotalFare->DispersionOverride) && !isset($decodedResponse->onlyRedemption) && !isset($decodedRequest->emitir_cash) && !$special_emission) {
if (!isset($decodedRequest->combinedEmission)) {
if (!isset($decodedRequest->davivienda->combinedEmission)) {
$emissionData->tarjeta = (string) $tokenizerService->getToken($decodedRequest->x_card_num);
$emissionData->franquicia = (string) $franchise->getEmissioncode();
$emissionData->codigo_auth = (string) $decodedResponse->x_approval_code;
$emissionData->fecha_vencmiento = (string) substr($decodedRequest->x_exp_date, 0, 2).substr($decodedRequest->x_exp_date, 4, 2);
$serviceName = 'emitir_tc_officeid';
} else {
$serviceName = 'emitir_tc_Combinada_officeid';
if (null == $orderProduct->getEmissiondata() || '' == $orderProduct->getEmissiondata()) {
$orderController->dataEmisionCombinadaAction($prepaymentInfo->Message->OTA_AirBookRS->AirReservation, $orderProduct, $emissionData);
} else {
$emissionData = json_decode($orderProduct->getEmissiondata());
$emissionData->comision = $comision;
}
}
} else {
$serviceName = 'emitir_tc_Combinada_officeid';
if (null == $orderProduct->getEmissiondata() || '' == $orderProduct->getEmissiondata()) {
$orderController->dataEmisionCombinadaAction($prepaymentInfo->Message->OTA_AirBookRS->AirReservation, $orderProduct, $emissionData);
} else {
$emissionData = json_decode($orderProduct->getEmissiondata());
$emissionData->comision = $comision;
}
}
}
if ('emitir_tc_Combinada_officeid' != $serviceName) {
$emissionData->datos_facturacion = (string) $infoEmission;
$emissionData->valores_adicionales = (string) $valuesEmission;
}
$emissionData->email = (string) $decodedRequest->x_email;
// YARED COMMENT esta validacion es una mierda perop es culpa de sabre entonces tendremos que quitarla algun dia
$emissionData->OfficeID = $officeId;
$orderProduct->getProvider()->getName() == 'sabre-ndc-qa' ? $emissionData->officeID = $officeId : $emissionData->OfficeID = $officeId;
$response = $emissionWebservice->callServiceEmission($serviceName, $emissionData, $orderProduct->getId());
$emissionXml = $orderController->emissionDataAction($response);
$emissionData->tarjeta = (string) $decodedRequest->x_card_num;
$orderProduct->setEmissiondata(json_encode($emissionData));
$orderProduct->setUpdatingdate(new \DateTime());
$em->flush();
// if (($session->has($transactionId . '[assist][payout_extra]') === true) && ($session->has($transactionId . '[assist][Emision]') === false)) {
// $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($this->get('aviatur_md5')->AviaturDecode($orderProductInsurance->getPayresponse(), $orderProductInsurance->getPublicKey()));
// if (isset($decodedResponseInsurance->x_response_code) && $decodedResponseInsurance->x_response_code == 1) {
// $EmisionTarjeta = $this->get('insurance_service')->EmisionTarjeta($orderInsurance);
// $session->set($transactionId . '[assist][Emision]', $EmisionTarjeta->asXml());
// $this->get('insurance_service')->changeStatus('approved', $orderInsurance);
// }
// }
//
// if ($session->has($transactionId . '[experience][payout_extra]')) {
// $payoutExtrasValues = json_decode($session->get($transactionId . '[flight][payout_extra_values]'));
// foreach ($payoutExtrasValues as $key => $payoutExtraValues) {
// if ($payoutExtraValues->name == 'EXPERIENCE') {
// if (!$session->has($transactionId . '[experience][Emision' . $key . ']') && $session->has($transactionId . '[experience][Emision' . $key . ']') === false) {
// $orderInfoExperience = json_decode($session->get($transactionId . '[experience][order' . $key . ']'));
// $productIdExperience = str_replace('PN', '', $orderInfoExperience->products);
// $orderProductExperience = $em->getRepository(\Aviatur\GeneralBundle\Entity\OrderProduct::class)->find($productIdExperience);
// $decodedResponseExperience = json_decode($this->get('aviatur_md5')->AviaturDecode($orderProductExperience->getPayresponse(), $orderProductExperience->getPublicKey()));
// if (isset($decodedResponseExperience->x_response_code) && $decodedResponseExperience->x_response_code == 1) {
// $this->get('experience_service')->EmitirSolicitud($orderProductExperience, $key, true);
// }
// }
// }
// }
// }
$updatePayment = explode('<booking_id2/>', $updatePaymentXml);
if ('error' != $emissionXml) {
if ($combination) {
$session->set($transactionId.'[emission'.$segment.']', $response->asXML());
} else {
$session->set($transactionId.'[emission]', $response->asXML());
}
if (false === strpos($updatePaymentXml, '<emission_data>')) {
$orderProduct->setUpdatepaymentdata($updatePayment[0].'<booking_id2/>'.$emissionXml.$updatePayment[1]);
$em->persist($orderProduct);
$em->flush();
}
} else {
if (isset($emissionData->tarjeta)) {
unset($emissionData->tarjeta);
unset($emissionData->franquicia);
unset($emissionData->codigo_auth);
unset($emissionData->fecha_vencmiento);
}
$mailInfo = print_r($emissionData, true).'<br>'.print_r($response, true);
$mailBcc = [$emailNotification];
if ($session->has($transactionId.'[usingDaviviendaPoints]') && isset($decodedRequest->redemptionPoints)) {
$mailBcc = [$emailNotification, $webmasterEmail];
if (isset($emissionData->tarjeta1)) {
unset($emissionData->tarjeta1);
unset($emissionData->franquicia1);
unset($emissionData->codigo_auth1);
unset($emissionData->fecha_vencmiento1);
}
if (isset($decodedRequest->combinedEmission) || isset($decodedRequest->davivienda->combinedEmission)) {
$messageMixedPayment = ' y otra parte con tarjeta de crédito, se debe realiza emisión con pago combinado colocando el pago en Puntos como cash.<br><br>';
$messagePointPayment = 'unicamente, no se generó pago con tarjeta de crédito por lo que la emisión de la misma se realiza en cash.<br><br>';
$messagePayment = isset($decodedRequest->onlyRedemption) ? $messagePointPayment : $messageMixedPayment;
$mailInfo = print_r('Esta reserva fue pagada con puntos Davivienda ('.$decodedRequest->redemptionPoints.') ', true).$messagePayment.$mailInfo;
}
}
$message = (new \Swift_Message())
->setContentType('text/html')
->setFrom($session->get('emailNoReply'))
//->setTo(['sergio.amaya@aviatur.com'])
->setTo(['soportepagoelectronico@aviatur.com.co', 'soptepagelectronic@aviatur.com'])
->setBcc($mailBcc)
->setSubject('Fallo de Emision')
->setBody($mailInfo);
try {
$mailer->send($message);
} catch (\Exception $e) {
}
$session->set($transactionId.'[emission][error]', true);
return $this->redirect($this->generateUrl($twig));
}
break;
}
if ($session->has($transactionId.'[usingDaviviendaPoints]') && $combination) {
if (isset($statusP2P) && $segment > 0) {
$orderInfo = json_decode($session->get($transactionId.'[flight][order0]'));
$productId = str_replace('PN', '', $orderInfo->products);
$orderProductObject = $em->getRepository(\Aviatur\GeneralBundle\Entity\OrderProduct::class)->find($productId);
$bodyText = 'Se generó un rechazo de pago para la reserva '.$bookings.', que se encuentra en combinación con la reserva '.$orderProductObject->getBooking().' generada con puntos Davivienda por favor completar el proceso manual ya que se debe encontrar emitida';
switch ($statusP2P) {
case 'rejectCyber':
$subject = 'Puntos Davivienda - Rechazo Cybersource';
$bodyText = 'Se generó un pago para la reserva '.$bookings.', pero fue rechazada por Cybersource, por favor tener encuenta que en caso de ser Improcedente por parte del departamento '
.'de Control Pago electrónico se debe dar manejo a la reserva '.$orderProductObject->getBooking().' emitida en combinación con puntos Davivienda ya se debe encontrar emitida.';
break;
case 'pendigP2P':
$subject = 'Puntos Davivienda - Transacción pendiente';
break;
case 'errorP2P':
case 'rejectP2P':
$subject = 'Puntos Davivienda - Transacción rechazada / no realizada';
break;
}
$message = (new \Swift_Message())
->setContentType('text/html')
->setFrom('noreply@aviatur.com.co')
->setTo('soptepagelectronic@aviatur.com')
//->setTo(array('sergio.amaya@aviatur.com.co'))
->setSubject($subject)
->setBody($bodyText);
$mailer->send($message);
}
}
if ($combination) {
$session->set($transactionId.'[flight][retry'.$segment.']', $retryCount - 1);
} else {
$session->set($transactionId.'[flight][retry]', $retryCount - 1);
}
$payoutExtraService->payoutExtrasCallback($twig, $transactionId, 'flight', $agency);
$urlResume = $this->generateUrl($twig);
$urlResume .= $additionalQS;
//////// se envia el correo del modulo anti fraude en caso de ser necesario//////////
if ($session->has('Marked_name') && $session->has('Marked_document')) {
$product = 'Vuelo';
$validateSanctions->sendMarkedEmail($orderProductCode, $session, $agency, $orderProduct, $transactionId, $product);
}
////////////////////////////////////////////////////////////////////////////////////
return $this->redirect($urlResume);
} else {
$orderProduct->setStatus('pending');
// $em->persist($orderProduct);
$em->flush();
$session->set('redirectedRetry', true);
return $this->redirect($errorHandler->errorRedirect($this->generateUrl('aviatur_flight_retry_secure'), '', 'No hay respuesta por parte del servicio de pagob'));
}
}
public function p2pCallbackAction(
SessionInterface $session,
ParameterBagInterface $parameterBag,
AviaturErrorHandler $errorHandler,
AviaturEncoder $aviaturEncoder,
TwigFolder $twigFolder,
CustomerMethodPaymentService $methodPaymentService,
TokenizerService $tokenizerService,
TokenStorageInterface $tokenStorage,
AviaturMailer $aviaturMailer,
EmissionWebservice $emissionWebservice,
InsuranceService $insuranceService,
OrderController $orderController,
AviaturExperienceService $aviaturExperienceService,
PayoutExtraService $payoutExtraService,
\Swift_Mailer $mailer,
AviaturLogSave $logSave,
ValidateSanctionsRenewal $validateSanctions,
P2PController $p2PController
)
{
$transactionIdSessionName = $parameterBag->get('transaction_id_session_name');
$correlationId = $session->get($session->get($transactionIdSessionName).'[flight]['.$transactionIdSessionName.']');
if (false !== strpos($correlationId, '||')) {
$correlationIds = explode('||', $correlationId);
foreach ($correlationIds as $key => $correlationIndivId) {
$return = $this->p2pCallback(
$session,
$parameterBag,
$errorHandler,
$aviaturEncoder,
$twigFolder,
$methodPaymentService,
$tokenizerService,
$tokenStorage,
$aviaturMailer,
$emissionWebservice,
$insuranceService,
$orderController,
$aviaturExperienceService,
$payoutExtraService,
$mailer,
$logSave,
$validateSanctions,
$p2PController,
$correlationIndivId, true, $key);
}
return $return;
} else {
return $this->p2pCallback(
$session,
$parameterBag,
$errorHandler,
$aviaturEncoder,
$twigFolder,
$methodPaymentService,
$tokenizerService,
$tokenStorage,
$aviaturMailer,
$emissionWebservice,
$insuranceService,
$orderController,
$aviaturExperienceService,
$payoutExtraService,
$mailer,
$logSave,
$validateSanctions,
$p2PController,
$correlationId, true);
}
}
private function p2pCallback(SessionInterface $session, ParameterBagInterface $parameterBag, AviaturErrorHandler $errorHandler, AviaturEncoder $aviaturEncoder, TwigFolder $twigFolder, CustomerMethodPaymentService $methodPaymentService, TokenizerService $tokenizerService, TokenStorageInterface $tokenStorage, AviaturMailer $aviaturMailer, EmissionWebservice $emissionWebservice, InsuranceService $insuranceService, OrderController $orderController, AviaturExperienceService $aviaturExperienceService, PayoutExtraService $payoutExtraService, \Swift_Mailer $mailer, AviaturLogSave $logSave, ValidateSanctionsRenewal $validateSanctions, P2PController $p2PController, $correlationId, $combination, $segment = null)
{
$transactionIdSessionName = $parameterBag->get('transaction_id_session_name');
$emailNotification = $parameterBag->get('email_notification');
$emission_track = 'Inicia callback TC - '.(!is_null($segment) ? 'segmento '.$segment.' - ' : '').date('Y-m-d H:i:s').'micro: '.microtime().PHP_EOL;
$em = $this->managerRegistry->getManager();
$agencyFolder = $twigFolder->twigFlux();
$transactionId = $session->get($transactionIdSessionName);
if ($combination) {
$prepaymentInfo = \simplexml_load_string((string) $session->get($transactionId.'[flight][prepayment'.$segment.']'));
$orderProductCode = $session->get($transactionId.'[flight][order'.$segment.']');
} else {
$prepaymentInfo = \simplexml_load_string($session->get($transactionId.'[flight][prepayment]'));
$orderProductCode = $session->get($transactionId.'[flight][order]');
}
$productId = str_replace('PN', '', json_decode($orderProductCode)->products);
$orderProduct = $em->getRepository(\Aviatur\GeneralBundle\Entity\OrderProduct::class)->find($productId);
$agency = $orderProduct->getOrder()->getAgency();
$decodedRequest = json_decode($aviaturEncoder->AviaturDecode($orderProduct->getPayrequest(), $orderProduct->getPublicKey()));
$decodedResponse = json_decode($aviaturEncoder->AviaturDecode($orderProduct->getPayresponse(), $orderProduct->getPublicKey()));
//////// se envia el correo del modulo anti fraude en caso de ser necesario//////////
/*
if ($session->has('Marked_name') && $session->has('Marked_document')) {
$product = 'Vuelo';
$validateSanctions->sendMarkedEmail($orderProductCode, $session, $agency, $orderProduct, $transactionId, $product);
}
*/
/* Pero solo si hay condicionados (no bloqueados) y que paguen con Tarjeta */
if ($session->has('Marked_users')) {
$product = 'Vuelo';
$validateSanctions->sendMarkedEmail($orderProductCode, $session, $agency, $orderProduct, $transactionId, $product);
}
////////////////////////////////////////////////////////////////////////////////////
if (null != $decodedResponse) {
if ($combination) {
$airlineValidation = $em->getRepository(\Aviatur\FlightBundle\Entity\AirlineValidation::class)
->find($session->get($transactionId.'[airline_validation'.$segment.']'));
$retryCount = (int) $session->get($transactionId.'[flight][retry'.$segment.']');
} else {
$airlineValidation = $em->getRepository(\Aviatur\FlightBundle\Entity\AirlineValidation::class)
->find($session->get($transactionId.'[airline_validation]'));
$retryCount = (int) $session->get($transactionId.'[flight][retry]');
}
$twig = '';
$additionalQS = '';
$infoEmission = $decodedRequest->x_first_name.' '.$decodedRequest->x_last_name.'/'
.$decodedRequest->x_address.'/'
.$decodedRequest->x_cust_id.'/'
.$decodedRequest->x_phone.'/'
.$decodedRequest->x_email;
if (isset($decodedRequest->x_service_fee_base)) {
$valuesEmission = 'TA:'.number_format($decodedRequest->x_service_fee_base, 0, '.', '')
.'/ITA:'.number_format($decodedRequest->x_service_fee_tax, 0, '.', '')
.'/TAX:'.number_format($decodedRequest->x_tax, 0, '.', '')
.'/VB:'.number_format($decodedRequest->x_amount_base, 0, '.', '')
.'/AT:'.number_format(($decodedRequest->x_airport_tax ?? 0), 0, '.', '');
} else {
$valuesEmission = '/TAX:'.number_format($decodedRequest->x_tax, 0, '.', '')
.'/VB:'.number_format($decodedRequest->x_amount_base, 0, '.', '')
.'/AT:'.number_format(($decodedRequest->x_airport_tax ?? 0), 0, '.', '');
}
$comision = (string) 1;
$airlinesSpecialComision = [
'CZ',
'DT',
'EK',
];
$validatingAirline = $airlineValidation->getAirline()->getIata();
if (in_array($validatingAirline, $airlinesSpecialComision)) {
if (('CZ' == $validatingAirline) || ('DT' == $validatingAirline)) {
$comision = (string) 3;
}
if ('EK' == $validatingAirline) {
$comision = (string) 4;
}
}
// Si hopper no viene pues hacer esta shit a ver que pex
if (!$session->has($transactionId.'[HopperPrice]')) {
$pricedItinerary = $prepaymentInfo->Message->OTA_AirBookRS->AirReservation;
}
$airlinePaymentType = $airlineValidation->getPaymentType();
$emailData = json_decode($orderProduct->getEmail(), true);
$journeySummary = $emailData['journeySummaries']['0'];
$originCityCode = $journeySummary['originCode'];
$city = $em->getRepository(\Aviatur\SearchBundle\Entity\SearchCities::class)->findOneByIata($originCityCode);
if (null == $city) {
$city = $em->getRepository(\Aviatur\SearchBundle\Entity\SearchAirports::class)->findOneByIata($originCityCode);
}
if (null != $city) {
$originCountry = $city->getCountrycode();
if ('LH' == $validatingAirline && in_array($originCountry, $this->countriesInCashWithLufthansa)) {
$airlinePaymentType = 'CASH';
}
}
/* Hay que validar que se cumplan las condiciones de registro de campañas, para que cambie el $airlinePaymentType a CASH */
if($this->validateActivationOfAviaturCampaignForCash($prepaymentInfo, $em, $agency)){
$airlinePaymentType = 'CASH';
}
$configFlightAgency = $em->getRepository(\Aviatur\FlightBundle\Entity\ConfigFlightAgency::class)->findOneBy(['agency' => $agency, 'provider' => $orderProduct->getProvider()]);
if ((null != $configFlightAgency) && (null != $configFlightAgency->getWsurl())) {
$officeId = $configFlightAgency->getOfficeid();
} else {
$officeId = $agency->getOfficeid();
}
if ('0XZA' == $officeId) {
$valuesEmission .= '/IATA:76522552';
}
if (isset($decodedResponse->x_response_code_cyber) && (2 == $decodedResponse->x_response_code_cyber)) {
$decodedResponse->x_response_code_case = 99;
} else {
$decodedResponse->x_response_code_case = $decodedResponse->x_response_code;
}
$jsonSendEmail = $em->getRepository(\Aviatur\GeneralBundle\Entity\Parameter::class)->findOneByName('send_email');
if (isset(json_decode($jsonSendEmail->getDescription())->email)) {
$email = json_decode($jsonSendEmail->getDescription())->email->CallBack;
}
$reference = str_replace('{"order":"', '', $orderProductCode);
$reference = str_replace('","products":"', '-', $reference);
$reference = str_replace('"}', '', $reference);
$references = $reference;
$bookings = $orderProduct->getBooking();
$emission_track .= 'Verifica resultado trx - '.date('Y-m-d H:i:s').' - micro: '.microtime().PHP_EOL;
switch ($decodedResponse->x_response_code_case) {
case 99:
$emission_track .= 'Rechazado Cyber - '.date('Y-m-d H:i:s').' - micro: '.microtime().PHP_EOL;
//rechazado cybersource
$parameters = $em->getRepository(\Aviatur\GeneralBundle\Entity\Parameter::class)->findOneByName('aviatur_switch_rechazada_cyber');
if ($parameters) {
if (1 == $parameters->getValue()) {
if (1 == $decodedResponse->x_response_code) {
$postData = json_decode($session->get($transactionId.'[flight][detail_data_flight]'));
if (isset($postData->PD->cusPOptSelected)) {
if (isset($postData->PD->cusPOptSelectedStatus)) {
if ('NOTVERIFIED' == $postData->PD->cusPOptSelectedStatus) {
$postData->PD->cusPOptSelectedStatus = 'ACTIVE';
$customerLogin = $tokenStorage->getToken()->getUser();
$methodPaymentService->setMethodsByCustomer($customerLogin, json_decode(json_encode($postData), true));
}
}
}
if (isset($postData->PD->savePaymProc)) {
// $customer = $em->getRepository(\Aviatur\CustomerBundle\Entity\Customer::class)->find($postData->BD->id);
$customerLogin = $tokenStorage->getToken()->getUser();
$methodPaymentService->setMethodsByCustomer($customerLogin, json_decode(json_encode($postData), true));
}
}
}
}
$twig = 'aviatur_flight_payment_rejected_secure';
// no break
case 3:// pendiente p2p
$emission_track .= 'Pendiente - '.date('Y-m-d H:i:s').' - micro: '.microtime().PHP_EOL;
$twig = '' != $twig ? $twig : 'aviatur_flight_payment_pending_secure';
$franchise = $em->getRepository(\Aviatur\GeneralBundle\Entity\Card::class)->
findOneByPaymentgatewaycode(str_replace(['CR_', 'RM_', 'CDNSA'], ['', '', 'CS'], $decodedResponse->x_franchise));
// Sin dispersion de fondos
$emissionData = new \stdClass();
$emissionData->record = $orderProduct->getBooking();
$emissionData->comision = $comision;
// Dispersion de fondos
// Si hopper no viene has esta mal
if (!$session->has($transactionId.'[HopperPrice]')) {
if (('DISP' == $airlinePaymentType || 'NDC' == $airlinePaymentType) && !isset($pricedItinerary->PriceInfo->ItinTotalFare->DispersionOverride)) {
$emissionData->tarjeta = (string) $decodedRequest->x_card_num;
$emissionData->franquicia = (null != $franchise) ? (string) $franchise->getEmissioncode() : '';
$emissionData->codigo_auth = (string) $decodedResponse->x_approval_code;
$emissionData->fecha_vencmiento = (string) substr($decodedRequest->x_exp_date, 0, 2).substr($decodedRequest->x_exp_date, 4, 2);
}
}
$emissionData->email = (string) $decodedRequest->x_email;
$emissionData->datos_facturacion = (string) $infoEmission;
$emissionData->valores_adicionales = (string) $valuesEmission;
$emissionData->OfficeID = $officeId;
$orderProduct->setEmissiondata(json_encode($emissionData));
$orderProduct->setUpdatingdate(new \DateTime());
$em->persist($orderProduct);
$em->flush();
$retryCount = 1;
break;
case 0:// error p2p
$emission_track .= 'Error - '.date('Y-m-d H:i:s').' - micro: '.microtime().PHP_EOL;
$twig = 'aviatur_flight_payment_error_secure';
if (isset($email)) {
$from = $session->get('emailNoReply');
$error = $twig;
$subject = $orderProduct->getDescription().':Error en el proceso de pago de Aviatur';
$body = '</br>El proceso de pago a retornado un error </br>Referencia: '.$references.'</br>Reserva:'.$bookings;
$aviaturMailer->sendEmailGeneral($from, $email, $subject, $body);
}
// no break
case 2:// rechazada p2p
$emission_track .= 'Rechazado - '.date('Y-m-d H:i:s').' - micro: '.microtime().PHP_EOL;
$twig = '' != $twig ? $twig : 'aviatur_flight_payment_rejected_secure';
if (isset($email)) {
$from = $session->get('emailNoReply');
$error = $twig;
$subject = $orderProduct->getDescription().':Transacción rechazada';
$body = '</br>El pago fue rechazado </br>Referencia: '.$references.'</br>Reserva:'.$bookings;
$aviaturMailer->sendEmailGeneral($from, $email, $subject, $body);
}
break;
case 1:// aprobado p2p
$emission_track .= 'Aprobado - '.date('Y-m-d H:i:s').' - micro: '.microtime().PHP_EOL;
$emissionData = new \stdClass();
$postData = json_decode($session->get($transactionId.'[flight][detail_data_flight]'));
if (isset($postData->PD->cusPOptSelected)) {
if (isset($postData->PD->cusPOptSelectedStatus)) {
if ('NOTVERIFIED' == $postData->PD->cusPOptSelectedStatus) {
$postData->PD->cusPOptSelectedStatus = 'ACTIVE';
$customerLogin = $tokenStorage->getToken()->getUser();
$methodPaymentService->setMethodsByCustomer($customerLogin, json_decode(json_encode($postData), true));
}
}
}
if (isset($postData->PD->savePaymProc)) {
//$customer = $em->getRepository(\Aviatur\CustomerBundle\Entity\Customer::class)->find($postData->BD->id);
$customerLogin = $tokenStorage->getToken()->getUser();
$methodPaymentService->setMethodsByCustomer($customerLogin, json_decode(json_encode($postData), true));
}
$emission_track .= 'Inicio emision - '.date('Y-m-d H:i:s').' - micro: '.microtime().PHP_EOL;
$retryCount = (int) $session->get($transactionId.'[flight][retry]');
$twig = 'aviatur_flight_payment_success_secure';
if ('rappi' == $orderProduct->getOrder()->getAgency()->getAssetsFolder()) {
$infoTotalAmount = $decodedRequest->x_amount + $decodedRequest->x_airport_tax + $decodedRequest->x_service_fee;
$additionalQS = '?bookingid='.$orderProduct->getBooking().'&total='.$infoTotalAmount;
}
$franchise = $em->getRepository(\Aviatur\GeneralBundle\Entity\Card::class)->
findOneByPaymentgatewaycode(str_replace(['CR_', 'RM_', 'CDNSA'], ['', '', 'CS'], $decodedResponse->x_franchise));
// Sin dispersion de fondos
$emissionData->record = $orderProduct->getBooking();
$emissionData->comision = $comision;
$serviceName = 'emitir_cash_officeid';
//$serviceName = $orderProduct->getProvider()->getName() == 'sabre-ndc-qa' ? 'emitir_cash_officeid_ndc': 'emitir_cash_officeid';
$special_emission = false;
if ($session->has($transactionId . '[flight][special_emission_replace_iata]')) {//Precompra Aerolinea
$special_emissions_params = $session->get($transactionId . '[flight][special_emission_replace_iata]');
$ticketingVendor = $prepaymentInfo->Message->OTA_AirBookRS->AirReservation->Ticketing->TicketingVendor;
$airline_iata = isset($ticketingVendor['CodeContext']) ? (string) $ticketingVendor['CodeContext'] : (string) $ticketingVendor['Code'];
if (isset($special_emissions_params['airlineReplaceCode']) && in_array($airline_iata, $special_emissions_params['airlineRequired'])) {
$special_emission = true;
}
}
// Si el total de la reserva es solo con puntos debemos cambiar el $airlinePaymentType a CASH
if ((isset($decodedRequest->onlyRedemption) && $decodedRequest->onlyRedemption === true) && (isset($decodedResponse->onlyRedemption) && $decodedResponse->onlyRedemption === 'true')) {
$airlinePaymentType = 'CASH';
}
// Dispersion de fondos
if (('DISP' == $airlinePaymentType || 'NDC' == $airlinePaymentType) && !isset($pricedItinerary->PriceInfo->ItinTotalFare->DispersionOverride) && !$special_emission) {
$emissioncode=$this->cardHomologateServices->cardHomologateConfig($franchise, $airlineValidation, $orderProduct);
$emissionData->tarjeta = (string) $tokenizerService->getToken($decodedRequest->x_card_num);
$emissionData->franquicia = (string) $emissioncode;
$emissionData->codigo_auth = (string) ($decodedResponse->x_approval_code ?? "");
$emissionData->fecha_vencmiento = (string) substr($decodedRequest->x_exp_date, 0, 2).substr($decodedRequest->x_exp_date, 4, 2);
if (('NDC' == $airlinePaymentType)) {
$emissionData->cvv = (string) $decodedRequest->x_card_code;
}
$serviceName = 'emitir_tc_officeid';
//if ($session->has($transactionId . '[CeSudDiscount][apply]')) {
//$serviceName = 'emitir_tc_Combinada_officeid';
//$emissionData->tarjeta1 = (string) $decodedRequest->x_card_num;
//$emissionData->franquicia1 = (string) $franchise->getEmissioncode();
//$emissionData->codigo_auth1 = (string) $decodedResponse->x_approval_code;
//$emissionData->fecha_vencmiento1 = (string) substr($decodedRequest->x_exp_date, 0, 2) . substr($decodedRequest->x_exp_date, 4, 2);
//$emissionData->valor1 = (string) ((float) $decodedRequest->x_amount + (float) $decodedRequest->x_airport_tax);
//$emissionData->tarjeta2 = $requestCencosud['x_card_num_aviatur'];
//$emissionData->franquicia2 = 'VI';
//$emissionData->codigo_auth2 = $decodedResponse->x_approval_code_aviatur;
//$emissionData->fecha_vencmiento2 = (string) substr($decodedResponse->x_exp_date, 0, 2) . substr($decodedResponse->x_exp_date, 4, 2);
//$emissionData->valor2 = $requestCencosud['x_amount_aviatur'];
//}
}
$emissionData->email = (string) $decodedRequest->x_email;
$emissionData->datos_facturacion = (string) $infoEmission;
$emissionData->valores_adicionales = (string) $valuesEmission;
// YARED COMMENT esta validacion no es útil pero es culpa de sabre entonces tendremos que quitarla algun dia
$emissionData->OfficeID = $officeId;
$orderProduct->getProvider()->getName() == 'sabre-ndc-qa' ? $emissionData->officeID = $officeId : $emissionData->OfficeID = $officeId;
$emission_track .= 'Llama servicio: '.$serviceName.' - '.date('Y-m-d H:i:s').' - micro: '.microtime().PHP_EOL;
$response = $emissionWebservice->callServiceEmission($serviceName, $emissionData, $orderProduct->getId());
$emission_track .= 'Fin llamado servicio: '.$serviceName.' - '.date('Y-m-d H:i:s').' - micro: '.microtime().PHP_EOL;
$emission_track .= 'Procesa respuesta: - '.date('Y-m-d H:i:s').' - micro: '.microtime().PHP_EOL;
/* Se debe verificar si se tienen datos adicionales de ancillaries */
$vectorAncillariesData = $orderProduct->getOrder()->getAncillariesOrder();
if (isset($vectorAncillariesData)) {
if (sizeof($vectorAncillariesData) > 0) {
$ancillariesData = $vectorAncillariesData[0]->getData();
}
} else {
$ancillariesData = null;
}
if(isset($ancillariesData) && !is_null($ancillariesData)){
/* Se va detallando por cada order_product para transmitir al consumo de servicios adicionales */
if (('NDC' == $airlinePaymentType)) {
/* Obtener el addProductData y su etiqueta <passengers> */
$addProductData = $orderProduct->getAddproductdata();
$total_amount = $this->totalAmountSelectedAncillaries($addProductData);
if($total_amount > 0){
/* Número de la orden, y solo se transmite el total de los ancillaries seleccionados por todo el order_product */
$numero_orden = $orderProduct->getOrder()->getId();
// comentado debido a que el cobro de estos servicios adicionales los realizara en caso de ser NDC la pasarela de la aerolinea
// $info_response_add_serv = $this->p2pSendInformationAdditionalServices($p2PController, $orderController, $transactionId, $session, $parameterBag, $tokenizerService, $methodPaymentService, $mailer, $logSave, $numero_orden, $total_amount, $productId, 'ancillaries', 'Ancillaries');
}
}
$ancillariesProcessedData = $this->processAncillariesData($ancillariesData,$correlationId);
/* 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();
$emissionXml = $orderController->emissionDataAction($response, $ancillariesProcessedData, $orderProduct, $airlineIdVendor);
} else {
$emissionXml = $orderController->emissionDataAction($response);
}
$emission_track .= 'Respuesta procesada: - '.date('Y-m-d H:i:s').' - micro: '.microtime().PHP_EOL;
$emissionData->tarjeta = (string) $decodedRequest->x_card_num;
/* Porque no se puede guardar el CVV en los logs */
if (('NDC' == $airlinePaymentType) && !isset($pricedItinerary->PriceInfo->ItinTotalFare->DispersionOverride) && !$special_emission) {
unset($emissionData->cvv);
}
$orderProduct->setEmissiondata(json_encode($emissionData));
$orderProduct->setUpdatingdate(new \DateTime());
$em->flush();
if ((true === $session->has($transactionId.'[assist][payout_extra]')) && (false === $session->has($transactionId.'[assist][Emision]'))) {
$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) && 1 == $decodedResponseInsurance->x_response_code) {
$EmisionTarjeta = $insuranceService->EmisionTarjeta($orderProductInsurance);
$session->set($transactionId.'[assist][Emision]', $EmisionTarjeta->asXml());
$insuranceService->changeStatus('approved', $orderProductInsurance);
}
}
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) {
if (!$session->has($transactionId.'[experience][Emision'.$key.']') && false === $session->has($transactionId.'[experience][Emision'.$key.']')) {
$orderInfoExperience = json_decode($session->get($transactionId.'[experience][order'.$key.']'));
$productIdExperience = str_replace('PN', '', $orderInfoExperience->products);
$orderProductExperience = $em->getRepository(\Aviatur\GeneralBundle\Entity\OrderProduct::class)->find($productIdExperience);
$decodedResponseExperience = json_decode($aviaturEncoder->AviaturDecode($orderProductExperience->getPayresponse(), $orderProductExperience->getPublicKey()));
if (isset($decodedResponseExperience->x_response_code) && 1 == $decodedResponseExperience->x_response_code) {
$aviaturExperienceService->EmitirSolicitud($orderProductExperience, $key, true);
}
}
}
}
}
$emission_track .= 'Revisa si error: - '.date('Y-m-d H:i:s').' - micro: '.microtime().PHP_EOL;
if ('error' != $emissionXml) {
$emission_track .= 'No error en RS: - '.date('Y-m-d H:i:s').' - micro: '.microtime().PHP_EOL;
if ($combination) {
$session->set($transactionId.'[emission'.$segment.']', $response->asXML());
} else {
$session->set($transactionId.'[emission]', $response->asXML());
}
$updatePaymentXml = $orderProduct->getUpdatepaymentdata();
/* La idea es que tome el primer número de tiquete como número de approval_code */
if (('NDC' == $airlinePaymentType)) {
if(null !== $session->get($transactionId.'[x_response_code_cyber]')){
if($session->get($transactionId.'[x_response_code_cyber]') == 1){
$updatePaymentXml = str_replace('<approval_code>000000</approval_code>', '<approval_code>'.((string)$response->dataElementsMaster->paymentTrx->descText).'</approval_code>', $updatePaymentXml);
}
}
}
if (false === strpos($updatePaymentXml, '<emission_data>')) {
$updatePayment = explode('<booking_id2/>', $updatePaymentXml);
$orderProduct->setUpdatepaymentdata($updatePayment[0].'<booking_id2/>'.$emissionXml.$updatePayment[1]);
$em->persist($orderProduct);
$em->flush();
}
/* Se debe validar en NDC si se ha generado un total de servicios adicionales, para pasar a P2P de forma automática */
if (('NDC' == $airlinePaymentType) && null !== $session->get($transactionId.'[x_response_code_cyber]') && -1 == $session->get($transactionId.'[flight][segment_admin_fee]')) {
/* Obtener administrative_amount desde el XML de UpdatePaymentData recientemente guardado con el persist y flush */
$updatePaymentXmlNew = $orderProduct->getUpdatepaymentdata();
/* Debe haber sido aprobado previamente por Cybersource, para proceder a transmitir */
//if(strpos($updatePaymentXmlNew, '<administrative_amount>') !== false && $session->get($transactionId.'[x_response_code_cyber]') == 1){
$administrative_amount = (double)$session->get($transactionId.'[value_additional_services]');
if($administrative_amount > 0 && $session->get($transactionId.'[x_response_code_cyber]') == 1){
//$ubicacionInicial = strpos($updatePaymentXmlNew, '<administrative_amount>') + 23;
//$ubicacionFinal = strpos($updatePaymentXmlNew, '</administrative_amount>');
//$administrative_amount = (double)substr($updatePaymentXmlNew, $ubicacionInicial, $ubicacionFinal - $ubicacionInicial);
//if($administrative_amount > 0){
if(!$session->has($transactionId.'[has_approval_code_add_serv_by_ndc]')){
$session->set($transactionId.'[has_approval_code_add_serv_by_ndc]', 0);
}
if($session->get($transactionId.'[has_approval_code_add_serv_by_ndc]') === 0){
/* Número de la orden */
//$ini_num_fact = strpos($updatePaymentXmlNew, '<order_id>') + 10;
//$fin_num_fact = strpos($updatePaymentXmlNew, '</order_id>');
//$numero_orden = substr($updatePaymentXmlNew, $ini_num_fact, $fin_num_fact - $ini_num_fact);
$numero_orden = $orderProduct->getOrder()->getId();
/* Se crea para no afectar la transmisión de los servicios a P2P, y no repisar lo que hay actualmente para Cybersource con NDC */
$em = $this->managerRegistry->getManager();
$agency = $em->getRepository(\Aviatur\AgencyBundle\Entity\Agency::class)->find($session->get('agencyId'));
$assetsFolder = $agency->getAssetsFolder();
if ('octopus' == $assetsFolder) {
$Descriptionplacetopay = 'Octopus Ganacia TA';
} else {
$Descriptionplacetopay = 'Additional Services';
}
$info_response_add_serv = $this->p2pSendInformationAdditionalServices($p2PController, $orderController, $transactionId, $session, $parameterBag, $tokenizerService, $methodPaymentService, $mailer, $logSave, $numero_orden, $administrative_amount, $productId, 'additional_services', $Descriptionplacetopay);
/* Obtenemos el approval code para llevarlo al administrative_approval_code en el updatePaymentData */
$approval_code = $info_response_add_serv["x_approval_code"];
/* Revisar el updatePaymentData para incluir el administrative_approval_code */
$splitted_payment_data = explode('<administrative_approval_code>', $updatePaymentXmlNew);
$position_splitted_1 = strpos($splitted_payment_data[1], '</administrative_approval_code>') + 31;
$splitted_payment_data[1] = substr($splitted_payment_data[1], $position_splitted_1);
$updatePaymentXmlNew = $splitted_payment_data[0] . '<administrative_approval_code>' . $approval_code . '</administrative_approval_code>' . $splitted_payment_data[1];
/* Revisar el administrative state para ir confeccionando una estructura XML que ayude a reemplazar la existente */
$new_structure_administrative_state = '<admnistrative_state>
<id>'.$info_response_add_serv["x_response_code"].'</id>
<name>'.$info_response_add_serv["x_response_reason_text"].'</name>
<reason_code>'.$info_response_add_serv["x_response_reason_code"].'</reason_code>
<reason_text/>
</admnistrative_state>';
$splitted_payment_data_2 = explode('<admnistrative_state>', $updatePaymentXmlNew);
$position_splitted_2 = strpos($splitted_payment_data_2[1], '</admnistrative_state>') + 22;
$splitted_payment_data_2[1] = substr($splitted_payment_data_2[1], $position_splitted_2);
$updatePaymentXmlNew = $splitted_payment_data_2[0] . $new_structure_administrative_state . $splitted_payment_data_2[1];
/* Por fuerza se debe actualizar el payResponse para que actualice los estados de la emisión de servicios (por medio de la TA) */
$decodedResponse = json_decode($aviaturEncoder->aviaturDecode($orderProduct->getPayresponse(), $orderProduct->getPublicKey()), true);
$decodedResponse["x_ta_response_code"] = $info_response_add_serv["x_response_code"];
$decodedResponse["x_ta_response_reason_code"] = $info_response_add_serv["x_response_reason_code"];
$decodedResponse["x_ta_response_reason_text"] = $info_response_add_serv["x_response_reason_text"];
$orderProduct->setUpdatingdate(new \DateTime());
$encodedResponse = $aviaturEncoder->AviaturEncode(json_encode($decodedResponse), $orderProduct->getPublicKey());
$orderProduct->setPayresponse($encodedResponse);
/* Guardar el XML nuevo */
$orderProduct->setUpdatepaymentdata($updatePaymentXmlNew);
$em->persist($orderProduct);
$em->flush();
/* Se blinda la variable de sesión para evitar un 'repisado' apenas se obtenga el $approval_code (solo si el código de respuesta es 1) */
if($info_response_add_serv["x_response_code"] == "1"){
$session->set($transactionId.'[has_approval_code_add_serv_by_ndc]', 1);
}
}
//}
}
}
} else {
$decodedRequest->x_card_code = '***';
$orderProduct->setPayrequest($aviaturEncoder->AviaturEncode(json_encode($decodedRequest), $orderProduct->getPublicKey()));
$emission_track .= 'Si error en RS: - '.date('Y-m-d H:i:s').' - micro: '.microtime().PHP_EOL;
if (isset($emissionData->tarjeta)) {
unset($emissionData->tarjeta);
unset($emissionData->franquicia);
unset($emissionData->codigo_auth);
unset($emissionData->fecha_vencmiento);
if (('NDC' == $airlinePaymentType)) {
unset($emissionData->cvv);
}
}
$emission_track .= 'Prepara correo: - '.date('Y-m-d H:i:s').' - micro: '.microtime().PHP_EOL;
$mailInfo = print_r($emissionData, true).'<br>'.print_r($response, true);
// $message = (new \Swift_Message())
// ->setContentType('text/html')
// ->setFrom($session->get('emailNoReply'))
// ->setTo(['soportepagoelectronico@aviatur.com.co', 'soptepagelectronic@aviatur.com', 'notificacionessitioweb@aviatur.com'])
// ->setBcc([$emailNotification, 'soportepagoelectronico@aviatur.com.co', 'soptepagelectronic@aviatur.com'])
// ->setSubject('Fallo de Emisión')
// ->setBody($mailInfo);
// $mailer->send($message);
$emission_track .= 'Fin envio correo: - '.date('Y-m-d H:i:s').' - micro: '.microtime().PHP_EOL;
if (('NDC' == $airlinePaymentType)) {
$twig = 'aviatur_flight_payment_rejected_secure';
/* Actualización de los estados de order y order_product */
$order = $em->getRepository(\Aviatur\GeneralBundle\Entity\Order::class)->find($orderProduct->getOrder()->getId());
$order->setStatus('rejected');
$orderProduct->setStatus('rejected');
/* Actualización del PayResponse con valores asemejados a la simulación (rejected) */
$productResponse = $aviaturEncoder->AviaturDecode($orderProduct->getPayResponse(), $orderProduct->getPublicKey());
$opResponse = json_decode($productResponse);
$opResponse->x_response_code = 2;
$opResponse->x_response_reason_code = '01';
$opResponse->x_response_reason_text = 'Rechazada';
/* Actualización del PayResponse */
$orderProduct->setPayresponse($aviaturEncoder->AviaturEncode(json_encode($opResponse), $orderProduct->getPublicKey()));
/* Actualización del updatePaymentData (por que hay que dejarle la respuesta de 1 a 2)
Hay que buscar <state> y </state> para cambiarle su contenido para las propiedades de rechazo
*/
$stringUpdatePaymentData = $orderProduct->getUpdatepaymentdata();
$beginUpdatePaymentData = strpos($stringUpdatePaymentData, '<state>');
if(false !== $beginUpdatePaymentData){
$endUpdatePaymentData = strpos($stringUpdatePaymentData, '</state>') + 8;
$qtyReplacement = $endUpdatePaymentData - $beginUpdatePaymentData;
$stringToReplace = trim(substr($stringUpdatePaymentData, $beginUpdatePaymentData, $qtyReplacement));
$newReplacementString = '<state><id>2</id><name>Rechazada</name><reason_code>01</reason_code><reason_text/></state>';
$stringUpdatePaymentData = str_replace($stringToReplace, $newReplacementString, $stringUpdatePaymentData);
$orderProduct->setUpdatePaymentData($stringUpdatePaymentData);
}
$em->persist($orderProduct);
$em->flush();
}
$logSave->logSave($emission_track, 'TrackEmisionCallback', 'info');
$session->set($transactionId.'[emission][error]', true);
/* Aplica en CASH o DISP en forma normal, pues se validan plantillas que están con approved */
if (('NDC' != $airlinePaymentType)) {
$payoutExtraService->payoutExtrasCallback($twig, $transactionId, 'flight', $agency, $orderProduct);
return $this->redirect($this->generateUrl($twig));
}
}
break;
}
$emission_track .= 'Fin verificar respuesta trx: - '.date('Y-m-d H:i:s').' - micro: '.microtime().PHP_EOL;
if ($combination) {
$session->set($transactionId.'[flight][retry'.$segment.']', $retryCount - 1);
} else {
$session->set($transactionId.'[flight][retry]', $retryCount - 1);
}
$payoutExtraService->payoutExtrasCallback($twig, $transactionId, 'flight', $agency, $orderProduct);
$urlResume = $this->generateUrl($twig);
$urlResume .= $additionalQS;
$emission_track .= 'Fin Callback: - '.date('Y-m-d H:i:s').' - micro: '.microtime().PHP_EOL;
$decodedRequest->x_card_code = "***";
$orderProduct->setPayrequest($aviaturEncoder->AviaturEncode(json_encode($decodedRequest), $orderProduct->getPublicKey()));
$logSave->logSave($emission_track, 'TrackEmisionCallback', 'info');
return $this->redirect($urlResume);
} else {
$orderProduct->setStatus('pending');
// $em->persist($orderProduct);
$em->flush();
$session->set('redirectedRetry', true);
return $this->redirect($errorHandler->errorRedirect($this->generateUrl('aviatur_flight_retry_secure'), '', 'No hay respuesta por parte del servicio de pagoc'));
}
}
/**
* @throws RandomException
*/
public function pseCallbackAction(
SessionInterface $session,
ParameterBagInterface $parameterBag,
AviaturErrorHandler $errorHandler,
AviaturEncoder $aviaturEncoder,
TwigFolder $twigFolder,
PSEController $PSEController,
PSERestController $PSERestController,
EmissionWebservice $emissionWebservice,
InsuranceService $insuranceService,
OrderController $orderController,
AviaturExperienceService $aviaturExperienceService,
PayoutExtraService $payoutExtraService,
\Swift_Mailer $mailer,
AviaturLogSave $logSave,
$transaction): \Symfony\Component\HttpFoundation\RedirectResponse
{
$em = $this->managerRegistry->getManager();
if ($session->has('agencyId')) {
$agency = $em->getRepository(\Aviatur\AgencyBundle\Entity\Agency::class)->find($session->get('agencyId'));
} else {
$agency = $em->getRepository(\Aviatur\AgencyBundle\Entity\Agency::class)->find(1);
}
$paymentCode = $this->paymentMethod->getCode() === 'pse' ? 'pse' : 'pseRest';
$paymentMethod = $em->getRepository(\Aviatur\GeneralBundle\Entity\PaymentMethod::class)->findOneByCode($paymentCode);
$paymentMethodAgency = $em->getRepository(\Aviatur\GeneralBundle\Entity\PaymentMethodAgency::class)->findOneBy(['agency' => $agency, 'paymentMethod' => $paymentMethod, 'isactive' => true]);
$tranKey = $paymentMethodAgency->getTrankey();
$decodedUrl = json_decode($aviaturEncoder->AviaturDecode(base64_decode($transaction), $tranKey), true);
$correlationId = $decodedUrl['x_correlation_id'];
if (false !== strpos($correlationId, '||')) {
$correlationIds = explode('||', $correlationId);
$correlationIds = array_reverse($correlationIds);
foreach ($correlationIds as $key => $correlationId) {
$return = $this->pseCallback(
$session,
$parameterBag,
$errorHandler,
$aviaturEncoder,
$twigFolder,
$PSEController,
$PSERestController,
$emissionWebservice,
$insuranceService,
$orderController,
$aviaturExperienceService,
$payoutExtraService,
$mailer,
$logSave,
$decodedUrl['x_orders'],
true,
$paymentCode,
$correlationId,
$key
);
}
return $return;
} else {
return $this->pseCallback(
$session,
$parameterBag,
$errorHandler,
$aviaturEncoder,
$twigFolder,
$PSEController,
$PSERestController,
$emissionWebservice,
$insuranceService,
$orderController,
$aviaturExperienceService,
$payoutExtraService,
$mailer,
$logSave,
$decodedUrl['x_orders'],
false,
$paymentCode,
$correlationId
);
}
}
/**
* @throws RandomException
*/
public function pseCallback(SessionInterface $session, ParameterBagInterface $parameterBag, AviaturErrorHandler $errorHandler, AviaturEncoder $aviaturEncoder, TwigFolder $twigFolder, PSEController $PSEController, PSERestController $PSERestController, EmissionWebservice $emissionWebservice, InsuranceService $insuranceService, OrderController $orderController, AviaturExperienceService $aviaturExperienceService, PayoutExtraService $payoutExtraService, \Swift_Mailer $mailer, AviaturLogSave $logSave, $orders, $combination, $paymentCode, $correlationId,$segment = null): \Symfony\Component\HttpFoundation\RedirectResponse
{
$transactionIdSessionName = $parameterBag->get('transaction_id_session_name');
$emailNotification = $parameterBag->get('email_notification');
$status = null;
$twig = null;
$em = $this->managerRegistry->getManager();
$transactionId = ($session->has($transactionIdSessionName)) ? $session->get($transactionIdSessionName) : null;
$validateOrder = false;
if (isset($orders['flight'])) {
$validateOrder = true;
$flightOrders = explode('+', $orders['flight']);
if ($combination) {
$orderProductCode = $flightOrders[$segment];
$productId = $flightOrders[$segment];
} else {
$orderProductCode = $flightOrders[0];
$productId = $flightOrders[0];
}
$retryCount = 1;
} else {
return $this->redirect($errorHandler->errorRedirectNoEmail($twigFolder->pathWithLocale('aviatur_general_homepage'), '', 'No se encontró identificador de la transacción'));
}
/* Para aplicar en validaciones asociadas a ancillaries (Código IATA sin NDC- en caso de tenerlo) */
if ($combination) {
$prepaymentInfo = \simplexml_load_string((string) $session->get($transactionId.'[flight][prepayment'.$segment.']'));
} else {
$prepaymentInfo = \simplexml_load_string($session->get($transactionId.'[flight][prepayment]'));
}
$orderProduct = $em->getRepository(\Aviatur\GeneralBundle\Entity\OrderProduct::class)->find($productId);
if (empty($orderProduct)) {
return $this->redirect($errorHandler->errorRedirectNoEmail($twigFolder->pathWithLocale('aviatur_general_homepage'), '', 'No se encontró orden asociada a este pago'));
} else {
if ('approved' == $orderProduct->getStatus()) {
return $this->redirect($errorHandler->errorRedirectNoEmail($twigFolder->pathWithLocale('aviatur_general_homepage'), '', 'No se encontró información de la transacción'));
}
$agency = $orderProduct->getOrder()->getAgency();
$decodedRequest = json_decode($aviaturEncoder->AviaturDecode($orderProduct->getPayrequest(), $orderProduct->getPublicKey()));
$decodedResponse = json_decode($aviaturEncoder->AviaturDecode($orderProduct->getPayresponse(), $orderProduct->getPublicKey()));
$recordData = new \stdClass();
$recordData->record = (string) $orderProduct->getBooking();
$additionalQS = '';
$pseTransactionId = '';
if (isset($decodedResponse) || isset($decodedResponse->createTransactionResult) || isset($decodedResponse->createTransactionPaymentResponseInformation)) {
if ($paymentCode === 'pse') {
if (isset($decodedResponse->createTransactionResult)) {
$pseTransactionId = $decodedResponse->createTransactionResult->transactionID ?? $decodedResponse->createTransactionResult->trazabilityCode;
} elseif (isset($decodedResponse->createTransactionPaymentResponseInformation)) {
$pseTransactionId = $decodedResponse->createTransactionPaymentResponseInformation->transactionID ?? $decodedResponse->createTransactionPaymentResponseInformation->trazabilityCode;
}
if (isset($PSEController->pseCallbackAction($orderController,$pseTransactionId, $decodedResponse)->getTransactionInformationResult)) {
$paymentResponse = $PSEController->pseCallbackAction($orderController, $pseTransactionId, $decodedResponse);
} else {
$paymentResponse = json_decode($PSEController->pseCallbackAction($orderController, $pseTransactionId, $decodedResponse));
}
} else {
$pseTransactionId = $decodedResponse->internalReference;
$paymentResponse = $PSERestController->getTransactionInfo($pseTransactionId);
$logSave->logSave(json_encode($paymentResponse), '_pseRest', $decodedRequest->payment->reference .'_RS', $pseTransactionId);
}
if (!isset($paymentResponse->error)) {
if (!$session->has($transactionId.'[flight][detail_data_flight]')) {
$message = 'Una vez el pago sea confirmado recibirá su confirmación de reserva, de no ser así comuníquese con nuestra central de reservas.';
return $this->redirect($errorHandler->errorRedirect($twigFolder->pathWithLocale('aviatur_general_homepage'), 'Gracias por su compra', $message));
}
if (isset($paymentResponse)) {
if ($paymentCode === 'pse') {
if (isset($paymentResponse->getTransactionInformationResponseBody)) {
$decodedResponse->getTransactionInformationResult = $paymentResponse->getTransactionInformationResponseBody;
$paymentResponse->getTransactionInformationResult = $paymentResponse->getTransactionInformationResponseBody;
} else {
$decodedResponse->getTransactionInformationResult = $paymentResponse->getTransactionInformationResult;
}
} else {
$decodedResponse->getTransactionInformationResult = $paymentResponse;
/* Aplica directamente en pserest, para actualizar la información del update_payment_data */
$currentUpdatePaymentData = $orderProduct->getUpdatepaymentdata();
$xmlParcial = substr($currentUpdatePaymentData, strpos($currentUpdatePaymentData, '<FILTRO>') + 8, strpos($currentUpdatePaymentData, '</FILTRO>') - strpos($currentUpdatePaymentData, '<FILTRO>') - 8);
$xmlConvertido = \simplexml_load_string($xmlParcial);
/* Asignación de valores para update_payment_data (afectando name y reason_code, no se toca el ID) */
$xmlConvertido->products->product->payment_data->state->reason_code = $decodedResponse->getTransactionInformationResult->status->reason;
$decodeMessage = $this->changeAcutes($decodedResponse->getTransactionInformationResult->status->message);
$xmlConvertido->products->product->payment_data->state->name = $decodeMessage;
$xmlDefinitivo = $xmlConvertido->asXML();
$xmlDefinitivo = str_replace('<?xml version="1.0"?>', '', $xmlDefinitivo);
$newUpdatePaymentData = str_replace('<FILTRO>'.$xmlParcial.'</FILTRO>', '<FILTRO>'.$xmlDefinitivo.'</FILTRO>', $currentUpdatePaymentData);
$orderProduct->setUpdatepaymentdata($newUpdatePaymentData);
}
}
$orderProduct->setPayresponse($aviaturEncoder->AviaturEncode(json_encode($decodedResponse), $orderProduct->getPublicKey()));
$orderProduct->setUpdatingdate(new \DateTime());
$em->persist($orderProduct);
$em->flush();
// Obtener el valor de returCode para continuar con logica existente
if ((isset($paymentResponse->getTransactionInformationResult->returnCode) && 'SUCCESS' == (string) $paymentResponse->getTransactionInformationResult->returnCode)
|| (isset($paymentResponse->status->status))
) {
$returnCodeStatus = 'SUCCESS';
} else {
$returnCodeStatus = (string) $paymentResponse->getTransactionInformationResult->returnCode;
}
if ($returnCodeStatus === 'SUCCESS') {
$statusTransaction = $this->getStatusTransaction($paymentResponse, $orderProduct, $decodedRequest);
$twig = $statusTransaction['twig'];
$status = $statusTransaction['status'];
$additionalQS = $statusTransaction['additionalQS'];
$orderProduct->setStatus($status);
$orderProduct->getOrder()->setStatus($status);
$orderProduct->setUpdatingdate(new \DateTime());
$orderProduct->getOrder()->setUpdatingdate(new \DateTime());
$payoutExtraService->payoutExtrasCallback($twig, $transactionId, 'flight', $agency, $orderProduct);
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) {
$orderInfoExperience = json_decode($session->get($transactionId . '[experience][order' . $key . ']'));
$productIdExperience = str_replace('PN', '', $orderInfoExperience->products);
$orderProductExperience = $em->getRepository(\Aviatur\GeneralBundle\Entity\OrderProduct::class)->find($productIdExperience);
if ('approved' != $orderProductExperience->getStatus()) {
$aviaturExperienceService->changeStatus($orderProductExperience, $status);
}
}
}
} elseif (TRUE === $validateOrder && isset($orders['experience']) && (0 == $segment || NULL == $segment)) {
$ordersExperience = explode('+', $orders['experience']);
foreach ($ordersExperience as $key => $ordersExperiences) {
$orderProductExperience = $em->getRepository(\Aviatur\GeneralBundle\Entity\OrderProduct::class)->find($ordersExperiences);
if ('approved' != $orderProductExperience->getStatus()) {
$aviaturExperienceService->changeStatus($orderProductExperience, $status);
}
}
}
if ('approved' == $status) {
$emissionData = json_decode($orderProduct->getEmissiondata());
//revisar esta emision como comprobarla
$serviceName = 'emitir_cash_officeid';
//$serviceName = $orderProduct->getProvider()->getName() == 'sabre-ndc-qa' ? 'emitir_cash_officeid_ndc' : 'emitir_cash_officeid';
$response = $emissionWebservice->callServiceEmission($serviceName, $emissionData, $orderProduct->getId());
/* Se debe verificar si se tienen datos adicionales de ancillaries */
$vectorAncillariesData = $orderProduct->getOrder()->getAncillariesOrder();
$result = [];
if(sizeof($vectorAncillariesData) > 0){
$ancillariesData = $vectorAncillariesData[0]->getData();
} else {
$ancillariesData = null;
}
if(isset($ancillariesData)){
/* 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();
$ancillariesProcessedData = $this->processAncillariesData($ancillariesData,$correlationId);
$emissionXml = $orderController->emissionDataAction($response, $ancillariesProcessedData, $orderProduct, $airlineIdVendor);
} else {
$emissionXml = $orderController->emissionDataAction($response);
}
$validateInsurance = FALSE;
if ($session->has($transactionId . '[assist][payout_extra]') && (FALSE === $session->has($transactionId . '[assist][Emision]'))) {
$orderInsurance = json_decode($session->get($transactionId . '[assist][order]'));
$productIdInsurance = str_replace('PN', '', $orderInsurance->products);
$orderProductInsurance = $em->getRepository(\Aviatur\GeneralBundle\Entity\OrderProduct::class)->find($productIdInsurance);
$validateInsurance = TRUE;
if ('approved' == $orderProductInsurance->getStatus()) {
$validateInsurance = FALSE;
}
} elseif (TRUE === $validateOrder && isset($orders['insurance']) && (0 == $segment || NULL == $segment)) {
$productIdInsurance = $orders['insurance'];
$orderProductInsurance = $em->getRepository(\Aviatur\GeneralBundle\Entity\OrderProduct::class)->find($productIdInsurance);
$validateInsurance = TRUE;
if ('approved' == $orderProductInsurance->getStatus()) {
$validateInsurance = FALSE;
}
}
if ($validateInsurance && !empty($orderProductInsurance)) {
$orderProductInsurance->setPayresponse($aviaturEncoder->AviaturEncode(json_encode($decodedResponse), $orderProductInsurance->getPublicKey()));
$orderProductInsurance->setUpdatingdate(new \DateTime());
$em->persist($orderProductInsurance);
$em->flush();
$EmisionTarjeta = $insuranceService->EmisionTarjeta($orderProductInsurance);
$session->set($transactionId . '[assist][Emision]', $EmisionTarjeta->asXml());
$insuranceService->changeStatus($status, $orderProductInsurance);
}
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) {
$orderInfoExperience = json_decode($session->get($transactionId . '[experience][order' . $key . ']'));
$productIdExperience = str_replace('PN', '', $orderInfoExperience->products);
$orderProductExperience = $em->getRepository(\Aviatur\GeneralBundle\Entity\OrderProduct::class)->find($productIdExperience);
$orderProductExperience->setPayresponse($aviaturEncoder->AviaturEncode(json_encode($decodedResponse), $orderProductExperience->getPublicKey()));
$orderProductExperience->setUpdatingdate(new \DateTime());
$em->persist($orderProductExperience);
$em->flush();
if ('approved' != $orderProductExperience->getStatus()) {
$EmisionTarjeta = $aviaturExperienceService->EmitirSolicitud($orderProductExperience, NULL, TRUE);
} elseif ((0 == $segment || NULL == $segment) && 'approved' == $orderProductExperience->getStatus()) {
$EmisionTarjeta = $aviaturExperienceService->EmitirSolicitud($orderProductExperience, NULL, TRUE);
}
}
}
} elseif (TRUE === $validateOrder && isset($orders['experience']) && (0 == $segment || NULL == $segment)) {
$ordersExperience = explode('+', $orders['experience']);
foreach ($ordersExperience as $key => $ordersExperiences) {
$orderProductExperience = $em->getRepository(\Aviatur\GeneralBundle\Entity\OrderProduct::class)->find($ordersExperiences);
$orderProductExperience->setPayresponse($aviaturEncoder->AviaturEncode(json_encode($decodedResponse), $orderProductExperience->getPublicKey()));
$orderProductExperience->setUpdatingdate(new \DateTime());
$em->persist($orderProductExperience);
$em->flush();
if ('approved' != $orderProductExperience->getStatus()) {
$EmisionTarjeta = $aviaturExperienceService->EmitirSolicitud($orderProductExperience, NULL, TRUE);
} elseif ((0 == $segment || NULL == $segment) && 'approved' == $orderProductExperience->getStatus()) {
$EmisionTarjeta = $aviaturExperienceService->EmitirSolicitud($orderProductExperience, NULL, TRUE);
}
}
}
if ('error' != $emissionXml) {
$updatePaymentXml = $orderProduct->getUpdatepaymentdata();
$updatePayment = explode('<booking_id2/>', $updatePaymentXml);
$orderProduct->setUpdatepaymentdata($updatePayment[0] . '<booking_id2/>' . $emissionXml . $updatePayment[1]);
if (!empty($transactionId)) {
if ($combination) {
$session->set($transactionId . '[emission' . $segment . ']', $response->asXML());
} else {
$session->set($transactionId . '[emission]', $response->asXML());
}
}
} else {
if (isset($emissionData->tarjeta)) {
unset($emissionData->tarjeta);
unset($emissionData->franquicia);
unset($emissionData->codigo_auth);
unset($emissionData->fecha_vencmiento);
}
$mailInfo = print_r($emissionData, TRUE) . '<br>' . print_r($response, TRUE);
$message = (new \Swift_Message())
->setContentType('text/html')
->setFrom($session->get('emailNoReply'))
->setTo(['soportepagoelectronico@aviatur.com.co', 'soptepagelectronic@aviatur.com'])
->setBcc([$emailNotification, 'soportepagoelectronico@aviatur.com.co', 'soptepagelectronic@aviatur.com'])
->setSubject('Fallo de Emisión')
->setBody($mailInfo);
$mailer->send($message);
if (!empty($transactionId)) {
$session->set($transactionId . '[emission][error]', TRUE);
}
$urlResume = $this->generateUrl($twig);
$urlResume .= $additionalQS;
$em->persist($orderProduct);
$em->flush();
return $this->redirect($urlResume);
}
}
$em->persist($orderProduct);
$em->flush();
} elseif ('FAIL_INVALIDTRAZABILITYCODE' == $returnCodeStatus || 'FAIL_ACCESSDENIED' == $returnCodeStatus || 'FAIL_TIMEOUT' == $returnCodeStatus) {
echo 'En este momento su #<referencia de factura> presenta un proceso de pago cuya transacción se encuentra
PENDIENTE de recibir información por parte de su entidad financiera, por favor espere
unos minutos y vuelva a consultar mas tarde para verificar sí su pago fue confirmado de
forma exitosa. Si desea mayor información sobre el estado actual de su operación puede
comunicarse a nuestras líneas de atención al cliente al teléfono XXXXXX o enviar
inquietudes al email mispagos@micomercio.com y pregunte por el estado de la
transacción <#CUS> .'
;
$orderProduct->setEmissiondata('error');
$orderProduct->setUpdatingdate(new \DateTime());
$em->persist($orderProduct);
$em->flush();
$twig = 'aviatur_flight_payment_error_secure';
}
if (!empty($transactionId)) {
if ($combination) {
$session->set($transactionId.'[flight][retry'.$segment.']', $retryCount - 1);
} else {
$session->set($transactionId.'[flight][retry]', $retryCount - 1);
}
}
$urlResume = $this->generateUrl($twig);
$urlResume .= $additionalQS;
return $this->redirect($urlResume);
} else {
$decodedResponse->getTransactionInformationResult = $paymentResponse;
$orderProduct->setPayresponse($aviaturEncoder->AviaturEncode(json_encode($decodedResponse), $orderProduct->getPublicKey()));
$orderProduct->setUpdatingdate(new \DateTime());
$em->persist($orderProduct);
$em->flush();
return $this->redirect($errorHandler->errorRedirectNoEmail($twigFolder->pathWithLocale('aviatur_general_homepage'), '', 'Ocurrió un error al consultar el estado de la transacción'));
}
} else {
return $this->redirect($errorHandler->errorRedirectNoEmail($twigFolder->pathWithLocale('aviatur_general_homepage'), '', 'No se encontró información de la transacción'));
}
}
}
public function getStatusTransaction($paymentResponse, $orderProduct, $decodedRequest): array
{
$statusResponse = $paymentResponse->getTransactionInformationResult->transactionState ?? $paymentResponse->status->status;
$twig = $status = $additionalQS = '';
switch ((string) $statusResponse) {
case 'OK':
case 'APPROVED':
$twig = 'aviatur_flight_payment_success_secure';
$status = 'approved';
if ('rappi' == $orderProduct->getOrder()->getAgency()->getAssetsFolder()) {
$additionalQS = '?bookingid='.$orderProduct->getBooking().'&total='.$decodedRequest->totalAmount;
}
break;
case 'PENDING':
$twig = 'aviatur_flight_payment_pending_secure';
$status = 'pending';
break;
case 'NOT_AUTHORIZED':
case 'REJECTED':
$twig = 'aviatur_flight_payment_rejected_secure';
$status = 'rejected';
break;
case 'FAILED':
$twig = 'aviatur_flight_payment_error_secure';
$status = 'failed';
break;
}
return [
'twig' => $twig,
'status' => $status,
'additionalQS' => $additionalQS
];
}
public function doublePayment(AviaturEncoder $aviaturEncoder, OrderController $orderController, AviaturLogSave $logSave, P2PController $p2PController, $orderProduct, $info, $combination = false, $segment = false, $consumingPayment = false)
{
$requestCencosud = [];
$x_invoice_num = null;
$em = $this->managerRegistry->getManager();
$validateEmitted = false;
if (isset($info['request']->x_cencosud_p2p)) {
unset($info['request']->x_cencosud_p2p);
}
if (isset($info['request']->infoCash)) {
//CASH INFORMATION
$x_invoice_num = $info['request']->infoCash->x_reference;
$x_description = $info['request']->infoCash->x_description;
} elseif (isset($info['request']->payer)) {
//PSE INFORMATION
$x_invoice_num = $info['request']->reference;
$x_description = $info['request']->description;
} elseif (isset($info['request']->x_card_type)) {
//P2P INFORMATION
$x_invoice_num = $info['request']->x_invoice_num;
$x_description = $info['request']->x_description;
} elseif (isset($info['request']->dataTransf)) {
//SAFETY INFORMATION
$x_invoice_num = $info['request']->dataTransf->x_reference;
$x_description = $info['request']->dataTransf->x_description;
}
$flightType = ('NAC' == $info['flightType']) ? 81 : 82;
$airline_code = 71;
$airline_name = 'Aviatur';
$airline_iata_code = 'Aviatur';
switch ($info['agencyId']) {
case 76:
case 85:
$airline_code = 0 == $flightType ? 43 : 44;
$airline_name = 'Octopus Travel';
$airline_iata_code = 'Octopus Travel';
break;
case 119:
$airline_code = 0 == $flightType ? 81 : 82;
$airline_name = 'Cielos Abiertos';
$airline_iata_code = 'Cielos Abiertos';
break;
}
$requestCencosud['product_type'] = 'flight';
$requestCencosud['x_card_num'] = '4111111111111111'; //CAMBIAR POR TARJETA DE LA PROMOCION
$requestCencosud['x_invoice_num'] = $x_invoice_num.'-C';
$requestCencosud['x_amount'] = $info['x_amount'];
$requestCencosud['x_tax'] = 0;
$requestCencosud['x_amount_base'] = 0;
$requestCencosud['x_service_fee'] = 0;
$requestCencosud['x_service_fee_tax'] = 0;
$requestCencosud['x_service_fee_base'] = 0;
$requestCencosud['x_airport_tax'] = 0;
$requestCencosud['x_first_name'] = 'CENCOSUD COLOMBIA S.A';
$requestCencosud['x_last_name'] = 'CENCOSUD COLOMBIA S.A';
$requestCencosud['x_cust_id'] = '9001551077';
$requestCencosud['x_address'] = 'Av 19 No 4 62';
$requestCencosud['x_phone'] = '3817111';
$requestCencosud['x_email'] = 'jorge.ubaque@aviatur.com';
$requestCencosud['x_exp_date'] = $cencosudExpDate = '112020';
$requestCencosud['x_card_code'] = '000';
$requestCencosud['x_differed'] = '1';
$requestCencosud['x_client_id'] = $info['x_client_id'];
$requestCencosud['x_airline'] = $airline_code;
$requestCencosud['x_airline_name'] = $airline_name;
$requestCencosud['x_airline_iata_code'] = $airline_iata_code;
$requestCencosud['x_airport_tax'] = 0;
$requestCencosud['x_service_fee_code'] = 99;
$requestCencosud['x_currency_code'] = 'COP';
$requestCencosud['x_description'] = $x_description;
$requestCencosud['x_cencoPayment'] = true;
$info['request']->x_cencosud_p2p = $requestCencosud;
//save new information of request
$orderProduct->setPayrequest($aviaturEncoder->AviaturEncode(json_encode($info['request']), $orderProduct->getPublicKey()));
$orderProduct->setUpdatingdate(new \DateTime());
$em->flush();
if (true === $consumingPayment) {
if (isset($info['response']->x_cencosud_p2p)) {
unset($info['response']->x_cencosud_p2p);
}
$paymentResponseCencosud = $p2PController->placetopayAction($requestCencosud, $combination, $segment);
$logSave->logSave(print_r($paymentResponseCencosud, true), 'paymentP2P', 'paymentResponse');
//Add info from second transaction to response
$info['response']->x_invoice_num = $paymentResponseCencosud['x_invoice_num'];
$info['response']->x_amount = $paymentResponseCencosud['x_amount'];
$info['response']->x_response_reason_code = $paymentResponseCencosud['x_response_reason_code'];
$info['response']->x_response_reason_text = $paymentResponseCencosud['x_response_reason_text'];
$info['response']->x_approval_code = $paymentResponseCencosud['x_approval_code'];
$info['response']->x_response_code = $paymentResponseCencosud['x_response_code'];
$info['response']->x_franchise = $paymentResponseCencosud['x_franchise'];
$info['response']->x_bank_name = $paymentResponseCencosud['x_bank_name'];
$info['response']->x_exp_date = $cencosudExpDate;
$info['response']->x_transaction_date = date('Y-m-d H:i:s');
$info['response']->x_cencosud_p2p = $paymentResponseCencosud;
//save new information of response
$orderProduct->setPayrequest($aviaturEncoder->AviaturEncode(json_encode($info['request']), $orderProduct->getPublicKey()));
$orderProduct->setPayresponse($aviaturEncoder->AviaturEncode(json_encode($info['response']), $orderProduct->getPublicKey()));
$orderProduct->setUpdatingdate(new \DateTime());
$em->flush();
//Generate new update payment
$orderController->updatePaymentAction($orderProduct);
if (isset($paymentResponseCencosud->x_response_code_cyber) && (2 == $paymentResponseCencosud->x_response_code_cyber)) {
$paymentResponseCencosud->x_response_code_case = 99;
} elseif (isset($paymentResponseCencosud->x_response_code)) {
$paymentResponseCencosud->x_response_code_case = $paymentResponseCencosud->x_response_code;
} elseif (isset($paymentResponseCencosud['error'])) {
$validateEmitted = false;
}
if (isset($paymentResponseCencosud->x_response_code_case)) {
switch ($paymentResponseCencosud->x_response_code_case) {
case 99:
//rechazado cybersource
$validateEmitted = false;
break;
case 3:// pendiente p2p
$validateEmitted = false;
break;
case 0:// error p2p
$validateEmitted = false;
break;
case 2://rechazada p2p
$validateEmitted = false;
break;
case 1:// aprobado p2p
$validateEmitted = true;
break;
}
}
}
return $validateEmitted;
}
public function p2pSendInformationAdditionalServices(P2PController $p2PController, OrderController $orderController, $transactionId, SessionInterface $session, ParameterBagInterface $parameterBag, TokenizerService $tokenizerService, CustomerMethodPaymentService $methodPaymentService, $mailer, AviaturLogSave $logSave, $numero_orden, $administrative_amount, $productId, $name_product_add_serv, $description_add_serv)
{
$em = $this->managerRegistry->getManager();
$orderProductExperience = $em->getRepository(\Aviatur\GeneralBundle\Entity\OrderProduct::class)->find($productId);
$postData = json_decode($session->get($transactionId.'[flight][detail_data_flight]'));
$array = json_decode($session->get($transactionId.'[add_serv][p2p_array]'), true);
/* Validación temporal del array */
// $array['x_card_num'] = '4111111111111111';
// $array['x_exp_date'] = '122024';
// $array['x_card_code'] = '123';
/* Validación temporal del array */
$x_client_id = $postData->BD->id;
$array['product_type'] = $name_product_add_serv;
$array['productId'] = $productId;
$array['x_cant_passenger'] = $postData->PI->person_count_1;
$array['x_client_id'] = $x_client_id;
$arrayAdditionalServices = $array;
$arrayAdditionalServices['x_invoice_num'] = "ON".$numero_orden."-PN".$productId;
$arrayAdditionalServices['x_description'] = $description_add_serv." - "."ON".$numero_orden."-PN".$productId;
$arrayAdditionalServices['x_amount'] = (int) $administrative_amount;
$arrayAdditionalServices['x_tax'] = (int) 0;
$arrayAdditionalServices['x_amount_base'] = (int) 0;
$arrayAdditionalServices['x_airport_tax'] = (int) 0;
unset($arrayAdditionalServices['x_airline']);
unset($arrayAdditionalServices['x_airline_name']);
unset($arrayAdditionalServices['x_airline_iata_code']);
unset($arrayAdditionalServices['x_service_fee']);
unset($arrayAdditionalServices['x_service_fee_tax']);
unset($arrayAdditionalServices['x_service_fee_base']);
unset($arrayAdditionalServices['x_service_fee_code']);
unset($arrayAdditionalServices['x_airport_tax']);
$paymentResponseAddServ = $p2PController->placetopayAction($parameterBag, $tokenizerService, $methodPaymentService, $mailer, $logSave, $arrayAdditionalServices, false, null, $numero_orden, $transactionId);
if (null != $paymentResponseAddServ) {
//$updateOrder = $orderController->updatePaymentAction($orderProductExperience);
if (isset($paymentResponseAddServ['x_response_code']) && (2 == $paymentResponseAddServ['x_response_code'])) {
$x_response_code_case = 99;
} elseif (isset($paymentResponseAddServ['error'])) {
$x_response_code_case = 0;
} else {
$x_response_code_case = $paymentResponseAddServ['x_response_code'];
}
switch ($x_response_code_case) {
case 99:
$status = 'rejected';
break;
case 3:// pendiente p2p
$status = 'pending';
break;
case 0:// error p2p
$status = 'error';
// no break
case 2:// rechazada p2p
$status = 'rejected';
break;
case 1:
$status = 'approved';
break;
}
} else {
$status = 'pending';
}
//$orderProductExperience->setUpdatingdate(new \DateTime());
//$orderProductExperience->setStatus($status);
//$em->persist($orderProductExperience);
//$em->flush();
unset($x_client_id);
return $paymentResponseAddServ;
}
public function totalAmountSelectedAncillaries($addProductData){
$total_amount = 0;
$init_position = strpos($addProductData, '<passengers>');
$final_position = strpos($addProductData, '</passengers>');
$stringXmlPassengers = substr($addProductData, $init_position, ($final_position - $init_position)+13);
$xmlPassengers = simplexml_load_string($stringXmlPassengers);
$array_passengers = array();
/* Si hay un solo pasajero, igual se debe pasar a array */
if(isset($xmlPassengers->passenger[0])){
foreach($xmlPassengers->passenger as $key => $passenger){
$array_passengers[] = $passenger;
}
} else {
$array_passengers[] = $xmlPassengers->passenger;
}
/* Revisar cada registro de ancillaries si hay uno o varios (Si los hay) */
foreach($array_passengers as $key1 => $passenger){
if(isset($passenger->ancillaries)){
/* Validar si hay uno o varios ancillaries para afectar los valores finales en la suma */
if(isset($passenger->ancillaries->ancillarie[0])){
foreach ($passenger->ancillaries->ancillarie as $key2 => $ancillarie) {
$total_amount += (double)$ancillarie->UnitPrice->TotalAmount;
}
} else {
$total_amount += (double)$passenger->ancillaries->ancillarie->UnitPrice->TotalAmount;
}
}
}
return $total_amount;
}
/**
* validateActivationOfAviaturCampaignForCash()
* Validate If there is an active campaign for an Aviatur agency, for changing $airlinePaymentType to CASH.
* If the condition exists, the function gets true
* Author: Ing. David Rincon
* Email: david.rincon@aviatur.com
* Date: 2024/10/31
* @param $prepaymentInfo Response.
* @param $em Registry Manager.
* @param $agency Code of the agency.
* @return true or false
*/
public function validateActivationOfAviaturCampaignForCash($prepaymentInfo, $em, $agency){
/* Hay que validar que se cumplan las condiciones de registro de campañas, para que cambie el $airlinePaymentType a CASH */
$result = false;
if(!is_null($this->specialDiscountParams)){
if($this->specialDiscountParams->getValue() == '1'){
if ('' != $prepaymentInfo->Message->OTA_AirBookRS->AirReservation->BookingReferenceID['ID']) {
$pricedItinerary = $prepaymentInfo->Message->OTA_AirBookRS->AirReservation;
$xmlOrigin = (string) $pricedItinerary->OriginDestinationOptions->OriginDestinationOption->FlightSegment->DepartureAirport['LocationCode'];
foreach ($pricedItinerary->OriginDestinationOptions->OriginDestinationOption->FlightSegment as $flightSegment) {
$xmlDestination = (string) $flightSegment->ArrivalAirport['LocationCode'];
}
$xmlDate = (string) $pricedItinerary->OriginDestinationOptions->OriginDestinationOption[0]->FlightSegment['DepartureDateTime'];
$cities = $em->getRepository(\Aviatur\SearchBundle\Entity\SearchCities::class)->findByIata([$xmlOrigin, $xmlDestination]);
if (2 != sizeof($cities)) {
$citiesArray = [];
$tempCities = $cities;
$cities = [];
foreach ($tempCities as $city) {
if (!in_array($city->getIata(), $citiesArray)) {
$citiesArray[] = $city->getIata();
$cities[] = $city;
}
}
$airports = $em->getRepository(\Aviatur\SearchBundle\Entity\SearchAirports::class)->findByIata([$xmlOrigin, $xmlDestination]);
foreach ($airports as $airport) {
$tempCity = $airport->getSearchCities();
if ((null != $tempCity) && !in_array($tempCity->getIata(), $citiesArray)) {
$cities[] = $tempCity;
$citiesArray[] = $tempCity->getIata();
}
}
}
$specialDiscountCity = array();
$specialCountries = array();
foreach ($cities as $city) {
$specialDiscountCity[] = $city->getIata();
$specialCountries[] = $city->getCountrycode();
}
$specialDiscountAviaturFlight = $em->getRepository(\Aviatur\FlightBundle\Entity\SpecialDiscountAviatur::class)->findWithCities($specialDiscountCity[1], $xmlDate, $agency, $specialCountries);
if (!is_null($specialDiscountAviaturFlight)) {
$result = true;
}
}
}
}
return $result;
}
public function processAncillariesData($ancillariesData,$correlationId) {
$result = [];
$arrayEmissionDataAncillaries = json_decode($ancillariesData, true);
// Decodificar los datos de asientos y equipaje si existen
if (isset($arrayEmissionDataAncillaries["seats"])) {
$arrayEmissionDataAncillaries["seats"] = json_decode(json_decode(json_encode(urldecode($arrayEmissionDataAncillaries["seats"]))), true);
}
if (isset($arrayEmissionDataAncillaries["baggage"])) {
$arrayEmissionDataAncillaries["baggage"] = json_decode(json_decode(json_encode(urldecode($arrayEmissionDataAncillaries["baggage"]))), true);
}
// Procesar equipaje
if (isset($arrayEmissionDataAncillaries['baggage']) && is_array($arrayEmissionDataAncillaries['baggage'])) {
foreach ($arrayEmissionDataAncillaries['baggage'] as $item) {
$position = str_replace('P', '', $item['passangerId']);
if (!isset($result[$position])) {
$result[$position] = [];
}
if($correlationId == $item['correlationID']){
$item['OfferItemID'] = $item['ServiceIdSegment'] . "-" . $item['OfferItemID'];
$result[$position][] = $item;
}
}
}
// Procesar asientos
if (isset($arrayEmissionDataAncillaries['seats']) && is_array($arrayEmissionDataAncillaries['seats'])) {
foreach ($arrayEmissionDataAncillaries['seats'] as $item) {
$position = str_replace('P', '', $item['passangerId']);
if (!isset($result[$position])) {
$result[$position] = [];
}
if($correlationId == $item['correlationID']){
$item['OfferItemID'] = $item['OfferItemID'] . "-" . $item['SelectedSeat'];
$result[$position][] = $item;
}
}
}
return $result;
}
/**
* changeAcutes()
* Cambia los acentos para que no lleguen cadenas dañadas a un XML.
* Author: Ing. David Rincon
* Email: david.rincon@aviatur.com
* Date: 2025/05/08
* @param $cadena (Cadena original)
* @return $cadena (Cadena sin acentos)
*/
function changeAcutes($cadena){
//Reemplazamos la A y a
$cadena = str_replace(
array('Á', 'À', 'Â', 'Ä', 'á', 'à', 'ä', 'â', 'ª'),
array('A', 'A', 'A', 'A', 'a', 'a', 'a', 'a', 'a'),
$cadena );
//Reemplazamos la E y e
$cadena = str_replace(
array('É', 'È', 'Ê', 'Ë', 'é', 'è', 'ë', 'ê'),
array('E', 'E', 'E', 'E', 'e', 'e', 'e', 'e'),
$cadena );
//Reemplazamos la I y i
$cadena = str_replace(
array('Í', 'Ì', 'Ï', 'Î', 'í', 'ì', 'ï', 'î'),
array('I', 'I', 'I', 'I', 'i', 'i', 'i', 'i'),
$cadena );
//Reemplazamos la O y o
$cadena = str_replace(
array('Ó', 'Ò', 'Ö', 'Ô', 'ó', 'ò', 'ö', 'ô'),
array('O', 'O', 'O', 'O', 'o', 'o', 'o', 'o'),
$cadena );
//Reemplazamos la U y u
$cadena = str_replace(
array('Ú', 'Ù', 'Û', 'Ü', 'ú', 'ù', 'ü', 'û'),
array('U', 'U', 'U', 'U', 'u', 'u', 'u', 'u'),
$cadena );
//Reemplazamos la N, n, C y c
$cadena = str_replace(
array('Ñ', 'ñ', 'Ç', 'ç'),
array('N', 'n', 'C', 'c'),
$cadena );
return $cadena;
}
}