<?php
namespace Aviatur\GiftVoucherBundle\Controller;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Aviatur\GeneralBundle\Services\AviaturErrorHandler;
use Aviatur\TwigBundle\Services\TwigFolder;
use Aviatur\GeneralBundle\Services\AviaturWebService;
use Aviatur\GeneralBundle\Controller\OrderController;
use Aviatur\GeneralBundle\Entity\FormUserInfo;
use Aviatur\CustomerBundle\Services\ValidateSanctionsRenewal;
use Aviatur\CustomerBundle\Services\PhoneNumberService;
use Aviatur\GeneralBundle\Services\AviaturChangeCoin;
use Aviatur\GeneralBundle\Services\AviaturEncoder;
use Aviatur\GeneralBundle\Services\AviaturLogSave;
use Aviatur\GeneralBundle\Services\AviaturMailer;
use Aviatur\GeneralBundle\Services\AviaturRestService;
use Aviatur\GeneralBundle\Services\ExceptionLog;
use Aviatur\GiftVoucherBundle\Services\EmissionWebservice;
use Aviatur\PaymentBundle\Controller\P2PController;
use Aviatur\PaymentBundle\Controller\WorldPayController;
use Aviatur\PaymentBundle\Controller\CashController;
use Aviatur\PaymentBundle\Controller\PSEController;
use Aviatur\PaymentBundle\Controller\PSERestController;
use Aviatur\PaymentBundle\Services\CustomerMethodPaymentService;
use Aviatur\PaymentBundle\Services\TokenizerService;
use Knp\Snappy\Pdf;
class GiftVoucherController extends AbstractController
{
/**
* @var ManagerRegistry
*/
protected ManagerRegistry $managerRegistry;
private \Swift_Mailer $mailer;
/**
* @var SessionInterface
*/
protected $session;
protected $paymentMethod;
public function __construct(ManagerRegistry $managerRegistry, \Swift_Mailer $mailer, SessionInterface $session)
{
$em = $managerRegistry->getManager();
$this->mailer = $mailer;
$paymentMethods = $em->getRepository(\Aviatur\GeneralBundle\Entity\PaymentMethod::class)->findByCode(['pse', 'pseRest']);
$agencyId = $session->has('agencyId') ? $session->get('agencyId') : 1;
$agency = $em->getRepository(\Aviatur\AgencyBundle\Entity\Agency::class)->find($agencyId);
$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 searchAction()
{
return $this->redirect(
$this->generateUrl(
'aviatur_gift_voucher_home',
[]
)
);
}
// Vista Home
public function indexAction(Request $request, TwigFolder $twigFolder, AviaturErrorHandler $aviaturErrorHandler,ManagerRegistry $registry, SessionInterface $session)
{
$em = $registry->getManager();
// $agencyFolder = $twigFolder->twigFlux();
// $template = '@AviaturTwig/'.$agencyFolder.'/GiftVoucher/Default/Landing/detail.html.twig';
$template = '@AviaturTwig/default/Flux/GiftVoucher/Default/Landing/detail.html.twig';
// Valida la existencia y configuración de tarjeta regalo en la agencia
$validateAgencyRequest = $this->validateAgencyRequest($session->get('agencyId'), $request, $em, $aviaturErrorHandler, false);
if(!isset($validateAgencyRequest["agency"])){
return $this->redirect($validateAgencyRequest);
}
if ($twigFolder->twigExists($template)) {
return $this->render($template, []);
}
// optional: handle case where template doesn't exist
throw $this->createNotFoundException("Template not found: $template");
}
// Vista de personalización
public function personalizeAction(Request $request, TwigFolder $twigFolder, AviaturWebService $aviaturWebService, AviaturErrorHandler $aviaturErrorHandler, ManagerRegistry $registry, SessionInterface $session)
{
// Información de agencia
$em = $registry->getManager();
// Valida la existencia y configuración de tarjeta regalo en la agencia
$validateAgencyRequest = $this->validateAgencyRequest($session->get('agencyId'), $request, $em, $aviaturErrorHandler, false);
if(!isset($validateAgencyRequest["agency"])){
return $this->redirect($validateAgencyRequest);
}
$agency =$validateAgencyRequest["agency"];
// Array configuración bono de regalo
$giftVoucherConfigObject = $validateAgencyRequest["giftVoucherConfigObject"];
$giftVoucherConfigArray = json_decode($giftVoucherConfigObject[0]['params'], true);
try {
// Organizar de menor a mayor precio
usort($giftVoucherConfigArray['fares'], function($a, $b) {
return intval($a['value']) <=> intval($b['value']);
});
// Crear transactionId
$transactionIdResponse = $aviaturWebService->loginService('SERVICIO_MPT', 'dummy|http://www.aviatur.com.co/dummy/', []);
if ('error' == $transactionIdResponse || is_array($transactionIdResponse)) {
return $this->redirect($aviaturErrorHandler->errorRedirect($this->generateUrl('aviatur_gift_voucher_home'), '', 'Lo sentimos, estamos experimentando dificultades técnicas en este momento.'));
}
$transactionId = (string) $transactionIdResponse;
// Información a enviar
$detailData = [
'currency' => 'COP',
'giftValue' => $giftVoucherConfigArray['minValue'],
'arrayImage' => $giftVoucherConfigArray["images"],
'giftVoucherFares' => $giftVoucherConfigArray['fares'],
'giftVoucherParams' => [
'minValue' => $giftVoucherConfigArray['minValue'],
'maxValue' => $giftVoucherConfigArray['maxValue'],
],
'transactionId' => $transactionId,
'safeUrl' => 'https://' . $agency->getDomain(),
];
} catch (\Exception $e) {
return $this->redirect($aviaturErrorHandler->errorRedirect($this->generateUrl('aviatur_gift_voucher_home'), '', 'Lo sentimos, estamos experimentando dificultades técnicas en este momento. Error en la configuración.'));
}
$agencyFolder = $twigFolder->twigFlux();
return $this->render($twigFolder->twigExists('@AviaturTwig/'.$agencyFolder.'/GiftVoucher/Default/personalize.html.twig'), $detailData);
}
// Vista de checkOut
public function checkoutAction(Request $request, TwigFolder $twigFolder, AviaturWebService $aviaturWebService, AviaturErrorHandler $aviaturErrorHandler, ManagerRegistry $registry, SessionInterface $session, AviaturEncoder $aviaturEncoder)
{
$em = $registry->getManager();
$whitemarkAgency = $em->getRepository(\Aviatur\GeneralBundle\Entity\Whitemark::class)->findOneBy(['referer' => $session->get('whitemark')]);
// Valida la existencia y configuración de tarjeta regalo en la agencia
$validateAgencyRequest = $this->validateAgencyRequest($session->get('agencyId'), $request, $em, $aviaturErrorHandler, true);
if(!isset($validateAgencyRequest["agency"])){
return $this->redirect($validateAgencyRequest);
}
if (null !== $whitemarkAgency) {
$phonesContact = json_decode($whitemarkAgency->getPhonesContact(), true);
$whitemarkAgencyDataInfo = [
'id' => $whitemarkAgency->getId(),
'name' => $whitemarkAgency->getName(),
'phone' => $whitemarkAgency->getPhone(),
'email' => $whitemarkAgency->getEmail(),
'address' => $whitemarkAgency->getAddress(),
'whatsapp' => $phonesContact['whatsapp'] ?? null,
];
$session->set('whitemarkData', $whitemarkAgencyDataInfo);
}
//Información de agencia
$agency = $validateAgencyRequest["agency"];
if ($agency->getDomainsecure() == $agency->getDomain() && '443' != $agency->getCustomport()) {
$safeUrl = 'https://'.$agency->getDomain();
} else {
$safeUrl = 'https://'.$agency->getDomainsecure();
}
// Información del bono escogido
$request = !empty($request->request->all()) ? $request->request : $request->query;
$bonoInfo = $request->all();
// Obtener el transactionId
$transactionId = (string) ($bonoInfo["bonoTransactionId"] ?? $bonoInfo['transactionRetryId']);
// Validar si es reintento de pago
$isretry = !empty($bonoInfo['transactionRetryId']);
if($isretry){
// Si ya no quedan intentos de compra, redirigir al home de bono regalo
$retryCount = $session->get($transactionId . '[bono][retry]');
if($retryCount <= 0){
$titleError = "Acceso no autorizado";
$textError = "Ha sido redirigido al home para que pueda seguir explorando opciones.";
return $this->redirect($aviaturErrorHandler->errorRedirectNoEmail($this->generateUrl("aviatur_gift_voucher_home", []), $titleError, $textError));
}
// Información de bono regalo seleccionado
$bonoInfo = json_decode(base64_decode($session->get($transactionId . "[bono][bonoInfo]")), true);
// Información de formularios de usuario
$formUserInfo = $em->getRepository(\Aviatur\GeneralBundle\Entity\FormUserInfo::class)->find($session->get($transactionId . '[bono][userInfo]'));
$decodedResponseInfoUser = json_decode($aviaturEncoder->AviaturDecode($formUserInfo->getInfo(), $formUserInfo->getPublicKey()), true);
$passangerInfo = $decodedResponseInfoUser["PI"];
$billingData = $decodedResponseInfoUser["BD"];
}
// Validación del precio del bono
$giftVoucherConfigObject = $validateAgencyRequest["giftVoucherConfigObject"];
$validatePriceBono = $this->validatePriceBono($giftVoucherConfigObject, $bonoInfo, $aviaturErrorHandler);
if(!isset($validatePriceBono["giftFarePrice"])){
return $this->redirect($validatePriceBono);
}
// Guardar información de bono regalo, encodeada en session
$session->set($transactionId . '[bono][bonoInfo]', base64_encode(json_encode($validatePriceBono)));
// Datos formularios
$typeGender = $em->getRepository(\Aviatur\CustomerBundle\Entity\Gender::class)->findAll();
$documentType = $em->getRepository(\Aviatur\CustomerBundle\Entity\DocumentType::class)->findAll();
$documentPassengerType = $em->getRepository(\Aviatur\CustomerBundle\Entity\DocumentType::class)->findAllActiveConfigured();
$repositoryDocumentType = $em->getRepository(\Aviatur\CustomerBundle\Entity\DocumentType::class);
$queryDocumentType = $repositoryDocumentType
->createQueryBuilder('p')
->where('p.paymentcode != :paymentcode')
->setParameter('paymentcode', '')
->getQuery();
$documentPaymentType = $queryDocumentType->getResult();
$paymentMethodAgency = $em->getRepository(\Aviatur\GeneralBundle\Entity\PaymentMethodAgency::class)->findBy(['agency' => $agency, 'isactive' => 1]);
$paymentOptions = [];
foreach ($paymentMethodAgency as $payMethod) {
$paymentCode = $payMethod->getPaymentMethod()->getCode();
if (!in_array($paymentCode, $paymentOptions) && 'safety' != $paymentCode) {
$paymentOptions[] = $paymentCode;
}
}
$banks = [];
if (in_array('pse', $paymentOptions)) {
$banks = $em->getRepository(\Aviatur\PaymentBundle\Entity\PseBank::class)->findAll();
}
$cybersource = [];
if (in_array('cybersource', $paymentOptions)) {
$cybersource['merchant_id'] = $paymentMethodAgency[array_search('cybersource', $paymentOptions)]->getSitecode();
$cybersource['org_id'] = $paymentMethodAgency[array_search('cybersource', $paymentOptions)]->getTrankey();
}
foreach ($paymentOptions as $key => $paymentOption) {
if ('cybersource' == $paymentOption) {
unset($paymentOptions[$key]); // strip from other renderizable payment methods
}
}
$conditions = $em->getRepository(\Aviatur\GeneralBundle\Entity\HistoricalInfo::class)->findMessageByAgencyOrNull($agency, 'reservation_conditions');
$passangerTypes = [];
$passangerTypes[1]['ADT'] = 1;
$passangerTypes[1]['CHD'] = 0;
$passangerTypes[1]['INF'] = 0;
/* Aplicando para vuelo, pero teniendo cuidado con los otros productos */
/* Necesitamos crear un arreglo que tenga todos los rangos de IIN asociados a su franquicia y a sus límites de número de tarjeta */
$iinRecordsArray = $aviaturWebService->getIINRanges($em);
// prefijos
$phoneService = new PhoneNumberService($em);
$phonePrefixes = $phoneService->getActivePrefixes();
// Respuesta para el checkout
$detailData = [
'safeUrl' => $safeUrl,
'twig_readonly' => $isretry,
'bonoInfo' => $validatePriceBono,
'passengers' => $passangerInfo ?? null,
'billingData' => $billingData ?? null,
'contactData' => $contactData ?? null,
'gender' => $typeGender,
'payment_doc_type' => $documentPaymentType,
'doc_type' => $documentType,
'documentPassengerType' => $documentPassengerType,
'conditions' => $conditions,
'paymentOptions' => $paymentOptions,
'cybersource' => $cybersource,
'ccfranchises' => $iinRecordsArray["ccfranchises"],
'ccranges' => $iinRecordsArray["ccranges"],
'banks' => $banks,
'cards' => $em->getRepository(\Aviatur\GeneralBundle\Entity\Card::class)->findAll(),
'payment_type_form_name' => 'paymentForm',
'services' => $passangerTypes,
'phone_prefixes' => $phonePrefixes,
'default_country' => 'CO',
'pse' => 1,
'isBono' => true
];
// $whatsapp = $session->get('whitemarkDataInfo')['telefono'] ?? $session->get('agencyDataInfo')['agency_phones']['what']['whatsApp'] ?? null;
$agencyFolder = $twigFolder->twigFlux();
return $this->render($twigFolder->twigExists('@AviaturTwig/'.$agencyFolder.'/GiftVoucher/Default/checkout.html.twig'), $detailData);
}
// Inicio proceso de pago y facturación
public function prePaymentStep1Action(Request $request, TokenizerService $tokenizer, CustomerMethodPaymentService $customerMethodPaymentService, TokenStorageInterface $tokenStorage, AviaturEncoder $aviaturEncoder, AviaturErrorHandler $aviaturErrorHandler, ManagerRegistry $registry, SessionInterface $session, ParameterBagInterface $parameterBag)
{
$em = $registry->getManager();
// Valida la existencia y configuración de tarjeta regalo en la agencia
$validateAgencyRequest = $this->validateAgencyRequest($session->get('agencyId'), $request, $em, $aviaturErrorHandler, true);
if(!isset($validateAgencyRequest["agency"])){
return $this->json(['error' => true, 'message' => $validateAgencyRequest]);
}
// Traer el RQ enviado desde el front
$request = !empty($request->request->all()) ? $request->request : $request->query;
$checkoutInfo = $request->all();
// Obtener el transactionId y guardarlo
$transactionId = (string) $checkoutInfo["giftCardTransactionId"];
$transactionIdSessionName = $parameterBag->get('transaction_id_session_name');
$session->set($transactionIdSessionName, $transactionId);
// Guardar intentos de compra
$aviaturPaymentRetryTimes = $parameterBag->get('aviatur_payment_retry_times');
$retryCount = $session->get($transactionId . '[bono][retry]');
if($retryCount == null){
$session->set($transactionId . '[bono][retry]', $aviaturPaymentRetryTimes);
}
// Validar si ya hay userInfo en la sesión
$userInfoBono = $session->get($transactionId . '[bono][userInfo]');
$isFront = $session->has('operatorId');
if($userInfoBono != null){
// Información de formularios de usuario
$formUserInfo = $em->getRepository(\Aviatur\GeneralBundle\Entity\FormUserInfo::class)->find($userInfoBono);
$decodedResponseInfoUser = json_decode($aviaturEncoder->AviaturDecode($formUserInfo->getInfo(), $formUserInfo->getPublicKey()), true);
if (!$isFront) {
$decodedResponseInfoUser["PD"] = $checkoutInfo["PD"];
}
$checkoutInfo = $decodedResponseInfoUser;
}else{
$formUserInfo = new FormUserInfo();
}
// Token de la tarjeta, en caso que exista
$publicKey = $aviaturEncoder->aviaturRandomKey();
if (isset($checkoutInfo["PD"]["card_num"])) {
$postDataInfo = $checkoutInfo;
if (isset($postDataInfo["PD"]["cusPOptSelected"])) {
$customerLogin = $tokenStorage->getToken()->getUser();
$infoMethodPaymentByClient = $customerMethodPaymentService->getMethodsByCustomer($customerLogin, true);
$cardToken = $infoMethodPaymentByClient["info"][$postDataInfo["PD"]["cusPOptSelected"]]["token"];
$postDataInfo["PD"]["card_num"] = $cardToken;
} else {
$postDataInfo["PD"]["card_num"] = $tokenizer->getToken($checkoutInfo["PD"]["card_num"]);
}
$checkoutInfo["PD"]["card_values"] = ["card_num_token" => $postDataInfo["PD"]["card_num"], "card_num" => $checkoutInfo["PD"]["card_num"]];
}
// Encodear y guardar la info de los formularios en la tabla form_user_info
$postDataInfo = $postDataInfo ?? $checkoutInfo;
$encodedInfo = $aviaturEncoder->AviaturEncode(json_encode($postDataInfo), $publicKey);
$formUserInfo->setInfo($encodedInfo);
$formUserInfo->setPublicKey($publicKey);
$em->persist($formUserInfo);
$em->flush();
// Guardar en session el id de la tabla
$session->set($transactionId . "[bono][userInfo]", $formUserInfo->getId());
// Guardar en session el id proveedor de bono regalo
$provider = $em->getRepository(\Aviatur\MpaBundle\Entity\Provider::class)->findBy(['name' => 'Bono de regalo']);
$session->set($transactionId.'[bono][provider]', $provider[0]->getProvideridentifier());
// Información facturador
$billingData = $checkoutInfo["BD"];
$customer = null;
$ordersProduct = null;
if (!$isFront) {
$customer = $em->getRepository(\Aviatur\CustomerBundle\Entity\Customer::class)->find($billingData['id']);
$ordersProduct = $em->getRepository(\Aviatur\GeneralBundle\Entity\OrderProduct::class)->getOrderProductsPending($customer);
}
if (null == $ordersProduct) {
$session->set($transactionId . '[bono][detailDataBono]', json_encode($postDataInfo));
// Información pasajeros
$passangersData = $postDataInfo["PI"];
$passangerNames = [];
for ($i = 1; $i <= $passangersData['person_count_1']; ++$i) {
$passangerNames[] = mb_strtolower($passangersData['first_name_1_'.$i]);
$passangerNames[] = mb_strtolower($passangersData['last_name_1_'.$i]);
}
$nameWhitelist = $em->getRepository(\Aviatur\GeneralBundle\Entity\NameWhitelist::class)->findLikeWhitelist($passangerNames);
if (0 == sizeof($nameWhitelist)) {
$nameBlacklist = $em->getRepository(\Aviatur\GeneralBundle\Entity\NameBlacklist::class)->findLikeBlacklist($passangerNames);
if ((sizeof(preg_grep("/^[a-z- *\.]+$/", $passangerNames)) != (sizeof($passangerNames))) ||
(sizeof($nameBlacklist)) ||
(sizeof(preg_grep('/(([b-df-hj-np-tv-xz])(?!\2)){4}/', $passangerNames)))) {
return $this->json(['error' => 'error', 'message' => 'nombre inválido']);
}
}
$ajaxUrl = $this->generateUrl('aviatur_gift_voucher_prepayment_step_2_secure');
return $this->json(['ajax_url' => $ajaxUrl]);
} else {
$booking = [];
$cus = [];
foreach ($ordersProduct as $orderProduct) {
$productResponse = $aviaturEncoder->AviaturDecode($orderProduct->getPayResponse(), $orderProduct->getPublicKey());
$paymentResponse = json_decode($productResponse);
array_push($booking, "ON" . $orderProduct->getOrder()->getId() . "-PN" . $orderProduct->getId());
if (isset($paymentResponse->x_approval_code)) {
array_push($cus, $paymentResponse->x_approval_code);
} elseif (isset($paymentResponse->createTransactionResult->trazabilityCode)) {
array_push($cus, $paymentResponse->createTransactionResult->trazabilityCode);
}
}
$return = [
"error" => "pending_payments",
"message" => "pending_payments",
"booking" => $booking,
// "domain" => $domain ?? null,
// "agencyId" => $this->agency ?? null,
// "operatorId" => $operatorId ?? null,
"cus" => $cus,
];
return new JsonResponse($return);
}
}
// Creación de orden - addProductData
public function prePaymentStep2Action(Request $request, OrderController $orderController, AviaturErrorHandler $aviaturErrorHandler, ManagerRegistry $registry, SessionInterface $session, ParameterBagInterface $parameterBag, AviaturEncoder $aviaturEncoder)
{
$em = $registry->getManager();
// Valida la existencia y configuración de tarjeta regalo en la agencia
$validateAgencyRequest = $this->validateAgencyRequest($session->get('agencyId'), $request, $em, $aviaturErrorHandler, true);
if(!isset($validateAgencyRequest["agency"])){
return $this->json(['error' => true, 'message' => $validateAgencyRequest]);
}
//Información de agencia
$agency = $validateAgencyRequest["agency"];
// Traer el RQ enviado desde el front
$request = !empty($request->request->all()) ? $request->request : $request->query;
$checkoutInfo = $request->all();
// Obtener el transactionId
$transactionIdSessionName = $parameterBag->get('transaction_id_session_name');
$transactionId = (string) ($checkoutInfo["giftCardTransactionId"] ?? $session->get($transactionIdSessionName));
// Validar si ya hay userInfo en la sesión
$userInfoBono = $session->get($transactionId . '[bono][userInfo]');
$isFront = $session->has('operatorId');
if($userInfoBono != null){
// Información de formularios de usuario
$formUserInfo = $em->getRepository(\Aviatur\GeneralBundle\Entity\FormUserInfo::class)->find($userInfoBono);
$decodedResponseInfoUser = json_decode($aviaturEncoder->AviaturDecode($formUserInfo->getInfo(), $formUserInfo->getPublicKey()), true);
if (!$isFront) {
$decodedResponseInfoUser["PD"] = $checkoutInfo["PD"];
}
$checkoutInfo = $decodedResponseInfoUser;
}
// Información facturador
$billingData = $checkoutInfo['BD'];
$isFront = $session->has('operatorId');
if ($isFront) {
$customer = $billingData;
$customer['isFront'] = true;
$status = 'B2T';
} else {
$customer = $em->getRepository(\Aviatur\CustomerBundle\Entity\Customer::class)->find($billingData['id']);
$status = 'waiting';
}
$order = [];
if (true !== $session->has($transactionId.'[bono][order]')) {
// Crear Order y order product, con add_productData
$productType = $em->getRepository(\Aviatur\MpaBundle\Entity\ProductType::class)->findByCode('BONO');
$orderIdentifier = '{booking_id}';
$order = $orderController->createAction($agency, $customer, $productType, $orderIdentifier, $status);
$orderId = str_replace('ON', '', $order['order']);
$orderEntity = $em->getRepository(\Aviatur\GeneralBundle\Entity\Order::class)->find($orderId);
$formUserInfo = $em->getRepository(\Aviatur\GeneralBundle\Entity\FormUserInfo::class)->find($session->get($transactionId.'[bono][userInfo]'));
$formUserInfo->setOrder($orderEntity);
$em->persist($formUserInfo);
$em->flush();
}
// Preparando información para Resume
$this->prepareInfoResume($session, $registry, $parameterBag, $aviaturEncoder);
if ($isFront) {
// Ir a generar bono
$order['url'] = $this->generateUrl('aviatur_gift_voucher_generar_bono');
} else {
// Ir a pago
$order['url'] = $this->generateUrl('aviatur_gift_voucher_payment_secure');
}
return $this->json($order);
}
// Proceso de pago
public function paymentAction(Request $request, OrderController $orderController, \Swift_Mailer $mailer, RouterInterface $router, P2PController $p2pPaymentController, PSEController $psePaymentController, PSERestController $PSERestController, CashController $cashPaymentController, AviaturErrorHandler $aviaturErrorHandler, ManagerRegistry $registry, SessionInterface $session, ParameterBagInterface $parameterBag, TokenizerService $tokenizer, CustomerMethodPaymentService $customerMethodPaymentService, AviaturLogSave $logSave)
{
$em = $registry->getManager();
// Valida la existencia y configuración de tarjeta regalo en la agencia
$validateAgencyRequest = $this->validateAgencyRequest($session->get('agencyId'), $request, $em, $aviaturErrorHandler, false);
if(!isset($validateAgencyRequest["agency"])){
return $this->json(['error' => true, 'message' => $validateAgencyRequest]);
}
// Obtener el transactionId
$transactionIdSessionName = $parameterBag->get('transaction_id_session_name');
$transactionId = $session->get($transactionIdSessionName);
// IdOrder y IdOrderProduct
if (true !== $session->has($transactionId.'[bono][order]')) {
return $this->redirect($aviaturErrorHandler->errorRedirect($this->generateUrl('aviatur_gift_voucher_home'), '', 'No se encontró orden asociada a este pago.'));
}
$orderInfo = json_decode($session->get($transactionId . '[bono][order]'));
$productId = str_replace('PN', '', $orderInfo->products);
$orderProduct = $em->getRepository(\Aviatur\GeneralBundle\Entity\OrderProduct::class)->find($productId);
// Actualizar reintentos de pago
$retryCount = (int) $session->get($transactionId . '[bono][retry]');
$session->set($transactionId . '[bono][retry]', $retryCount - 1);
$arrayResume = json_decode($orderProduct->getResume(), true);
if (isset($arrayResume["retry_count"])) {
$arrayResume["retry_count"] = $retryCount - 1;
$orderProduct->setResume(json_encode($arrayResume));
$em->persist($orderProduct);
$em->flush();
}
// Obtener la información de la tarjeta regalo desde la sesión
$bonoInfo = json_decode(base64_decode($session->get($transactionId . "[bono][bonoInfo]")), true);
// Valores totalizados
$totalAmountCOP = $bonoInfo["giftFarePrice"];
$x_amount_tax = number_format(0, 2, '.', '');
$x_amount_base = number_format(round((float) $totalAmountCOP), 2, '.', '');
// Descripción del producto
$description = 'Bono de Regalo - $'.$totalAmountCOP;
// Id del proveedor
$providerId = $session->get($transactionId . '[bono][provider]');
// Obtener información de los formularios del checkOut
$postData = json_decode($session->get($transactionId . '[bono][detailDataBono]'));
// Datos de pago y de facturador
$paymentData = $postData->PD;
$customer = $em->getRepository(\Aviatur\CustomerBundle\Entity\Customer::class)->find($postData->BD->id);
$recipientData = $postData->PI;
// Datos de agencia
$agency = $validateAgencyRequest["agency"];
$agencyName = $agency->getName();
$agencyOfficeId = $agency->getOfficeId();
// Pago
if ('p2p' == $paymentData->type) {
if (false !== strpos($paymentData->address, '***')) {
$paymentData->address = $customer->getAddress();
}
if (false !== strpos($paymentData->phone, '***')) {
$paymentData->phone = $customer->getPhone();
}
if (false !== strpos($paymentData->email, '***')) {
$paymentData->email = $customer->getEmail();
}
$array = [
'x_currency_code' => $bonoInfo["currency"],
'x_amount' => $totalAmountCOP,
'x_tax' => $x_amount_tax,
'x_amount_base' => $x_amount_base,
'x_invoice_num' => $orderInfo->order . '-' . $orderInfo->products,
'x_first_name' => $paymentData->first_name,
'x_last_name' => $paymentData->last_name,
'x_description' => $description,
'x_city' => $customer->getCity()->getIatacode(),
'x_country_id' => $customer->getCountry()->getIatacode(),
'x_cust_id' => $paymentData->doc_type . ' ' . $paymentData->doc_num,
'x_address' => $paymentData->address,
'x_phone' => $paymentData->phone,
'x_email' => $paymentData->email,
'x_card_num' => $paymentData->card_num,
'x_exp_date' => $paymentData->exp_month . $paymentData->exp_year,
'x_card_code' => $paymentData->card_code,
'x_differed' => $paymentData->differed,
'x_client_id' => $postData->BD->id,
'product_type' => 'bono',
'productId' => str_replace('PN', '', $orderInfo->products),
'orderId' => str_replace('ON', '', $orderInfo->order),
'franchise' => $paymentData->franquise,
'worldpay_validate' => true
];
if (isset($paymentData->card_values)) {
$array['card_values'] = (array) $paymentData->card_values;
}
if (isset($paymentData->cusPOptSelected)) {
$array['isToken'] = (string) $paymentData->card_values->card_num_token;
}
if (isset($postData->PD->savePaymProc) || (isset($paymentData->cusPOptSelected) && isset($paymentData->cusPOptSelectedStatus) && 'NOTVERIFIED' == $paymentData->cusPOptSelectedStatus)) {
$array['x_provider_id'] = 1;
} elseif (isset($paymentData->cusPOptSelected) && (!isset($paymentData->cusPOptSelectedStatus) || 'NOTVERIFIED' != $paymentData->cusPOptSelectedStatus)) {
$array['x_provider_id'] = 2;
}
// Servicio de pago (payRequest y PayResponse)
$paymentResponse = $p2pPaymentController->placetopayAction($parameterBag, $tokenizer, $customerMethodPaymentService, $mailer, $logSave, $array);
unset($array['x_client_id']);
if (empty($paymentResponse)) {
// No hay respuesta por parte del servicio de pago, estado pendiente
$orderProduct->setStatus('pending');
$em->persist($orderProduct);
$em->flush();
$urlRetry = $this->generateUrl('aviatur_gift_voucher_retry_secure', ["transactionRetryId" => $transactionId]);
$titleError = "";
$textError = "No hay respuesta por parte del servicio de pago, por favor intenta nuevamente o comunícate con nosotros para finalizar tu transacción.";
return $this->redirect($aviaturErrorHandler->errorRedirectNoEmail($urlRetry, $titleError, $textError));
}
return $this->redirect($this->generateUrl('aviatur_gift_voucher_payment_p2p_secure', [], true));
} elseif ('pse' == $paymentData->type) {
$array = [
'x_invoice_num' => $orderInfo->order.'-'.$orderInfo->products,
'x_doc_num' => $postData->PD->pse_doc_num,
'x_doc_type' => $postData->PD->pse_doc_type,
//'x_doc_num' => $customer->getDocumentnumber(),
//'x_doc_type' => $customer->getDocumentType()->getPaymentcode(),
'x_first_name' => $customer->getFirstname(),
'x_last_name' => $customer->getLastname(),
'x_company' => $agencyName,
'x_email' => $customer->getEmail(),
'x_address' => $customer->getAddress(),
'x_city' => $customer->getCity()->getDescription(),
'x_province' => $customer->getCity()->getDescription(),
'x_country' => $customer->getCountry()->getDescription(),
'x_phone' => $customer->getPhone(),
'x_mobile' => $customer->getCellphone(),
'x_bank' => $postData->PD->pse_bank,
'x_type' => $postData->PD->pse_type,
'x_response_url' => $this->generateUrl('aviatur_gift_voucher_payment_pse_return_url_secure', [], true),
'x_reference' => $orderInfo->order.'-'.$orderInfo->products,
'x_description' => $description,
'x_currency' => $bonoInfo["currency"],
'x_total_amount' => $totalAmountCOP,
'x_tax' => $x_amount_tax,
'x_amount_base' => $x_amount_base,
'x_devolution_base' => $x_amount_base,
'x_tip_amount' => number_format(round(0), 2, '.', ''),
'product_type' => 'bono',
'x_providerId' => $providerId,
'x_transactionId' => $transactionId
];
// Servicio de pago pse - Realizar pago por opcion definida en payment_method
$paymentCode = $this->paymentMethod->getCode() === 'pse' ? 'pse' : 'pseRest';
if ($paymentCode === 'pse') {
$paymentResponse = $psePaymentController->sendPaymentAction($request, $session, $router, $parameterBag, $mailer, $orderController, $array, [$orderProduct]);
} else {
$paymentResponse = $PSERestController->sendRestPaymentAction($request, $session, $router, $parameterBag, $mailer, $orderController, $array, [$orderProduct], $logSave);
}
if (!isset($paymentResponse->error)) {
if ($paymentCode === 'pse') {
$returnStatusCode = $paymentResponse->createTransactionResult->returnCode;
$returnUrl = (string) $paymentResponse->createTransactionResult->bankURL ?? $paymentResponse->createTransactionResult->bankurl;
} else {
$returnStatusCode = $paymentResponse->status->status;
$returnUrl = $paymentResponse->redirection->processURL;
}
switch ($returnStatusCode) {
case 'SUCCESS':
case 'PENDING':
return $this->redirect($returnUrl);
case 'FAIL_EXCEEDEDLIMIT':
$textMsg = 'Su reserva fue realizada exitosamente, sin embargo, el monto excede los límites establecidos, 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 para completar tu transacción.';
return $this->redirect($aviaturErrorHandler->errorRedirect($this->generateUrl('aviatur_gift_voucher_home'), '', $textMsg));
case 'FAIL_BANKUNREACHEABLE':
case 'FAILED':
$textMsg = 'Tu entidad financiera no pudo ser contactada para iniciar la transacción, por favor inténtalo nuevamente.';
$urlRetry = $this->generateUrl('aviatur_gift_voucher_retry_secure', ["transactionRetryId" => $transactionId]);
return $this->redirect($aviaturErrorHandler->errorRedirect($urlRetry, '', $textMsg));
default:
$textMsg = 'No se pudo crear la transacción con tu banco, por favor inténtalo nuevamente.';
$urlRetry = $this->generateUrl('aviatur_gift_voucher_retry_secure', ["transactionRetryId" => $transactionId]);
return $this->redirect($aviaturErrorHandler->errorRedirect($urlRetry, '', $textMsg));
}
} else {
$urlRetry = $this->generateUrl('aviatur_gift_voucher_retry_secure', ["transactionRetryId" => $transactionId]);
return $this->redirect($aviaturErrorHandler->errorRedirect($urlRetry, 'Error al procesar el pago', 'Ocurrió un problema al intentar crear su transacción, '.$paymentResponse->error));
}
} elseif ('cash' == $paymentData->type) {
// Fecha de creacón de la orden
$fecha = $orderProduct->getCreationDate()->format('Y-m-d H:i:s');
$fechalimite = $orderProduct->getCreationDate()->format('Y-m-d 23:40:00');
$nuevafecha = strtotime('+5 hour', strtotime($fecha));
$fechavigencia = date('Y-m-d H:i:s', $nuevafecha);
if (strcmp($fechavigencia, $fechalimite) > 0) {
$fechavigencia = $fechalimite;
}
// Generar bookingId
$bookingId = $this->generateRamdonCode();
$array = [
'x_officeId' => $agencyOfficeId,
'x_doc_num' => $customer->getDocumentnumber(),
'x_doc_type' => $customer->getDocumentType()->getPaymentcode(),
'x_first_name' => $customer->getFirstname(),
'x_last_name' => $customer->getLastname(),
'x_company' => $agencyName,
'x_email' => $customer->getEmail(),
'x_address' => $customer->getAddress(),
'x_city' => $customer->getCity()->getDescription(),
'x_province' => $customer->getCity()->getDescription(),
'x_country' => $customer->getCountry()->getDescription(),
'x_phone' => $customer->getPhone(),
'x_mobile' => $customer->getCellphone(),
'x_payment_data' => $paymentData->type,
'x_booking' => $bookingId,
'x_type_description' => $orderProduct->getDescription(),
'x_reference' => $orderInfo->products,
'x_description' => $description,
'x_currency' => $bonoInfo["currency"],
'x_total_amount' => $totalAmountCOP,
'x_fechavigencia' => $fechavigencia,
'x_transactionId' => $transactionId
];
if ($session->has($transactionId.'[bono][detail_cash]')) {
$detail_cash = json_decode($session->get($transactionId.'[bono][detail_cash]'));
if ('error' == $detail_cash->status) {
$cashPay = $cashPaymentController->cashAction($logSave, $array);
} else {
$cashPay = json_decode($session->get($transactionId.'[bono][detail_cash]'));
}
} else {
$cashPay = $cashPaymentController->cashAction($logSave, $array);
$session->set($transactionId.'[bono][detail_cash]', json_encode($cashPay));
}
if ('ok' == $cashPay->status) {
$cashPay->bookingID = $bookingId;
$session->set($transactionId.'[bono][cash_result]', json_encode($cashPay));
} else {
$emissionData['x_first_name'] = $array['x_first_name'];
$emissionData['x_last_name'] = $array['x_last_name'];
$emissionData['x_doc_num'] = $array['x_doc_num'];
$emissionData['x_reference'] = $array['x_reference'];
$emissionData['x_description'] = $array['x_description'];
$emissionData['x_total_amount'] = $array['x_total_amount'];
$emissionData['x_email'] = $array['x_email'];
$emissionData['x_address'] = $array['x_address'];
$emissionData['x_phone'] = $array['x_phone'];
$emissionData['x_type_description'] = $array['x_type_description'];
$emissionData['x_error'] = $cashPay->status;
$mailInfo = print_r($emissionData, true).'<br>'.print_r($cashPay, true);
$toEmails = ['soportepagoelectronico@aviatur.com.co', 'soptepagelectronic@aviatur.com', 'errores.prod.web@aviatur.com'];
$emailNotification = $parameterBag->get('email_notification');
$message = (new \Swift_Message())
->setContentType('text/html')
->setFrom($session->get('emailNoReply'))
->setTo($toEmails)
->setBcc($emailNotification)
->setSubject('Error Creación Transacción Efectivo'.$emissionData['x_reference'])
->setBody($mailInfo);
$mailer->send($message);
$orderProduct->setEmissiondata('error');
$orderProduct->setUpdatingdate(new \DateTime());
$em->persist($orderProduct);
$em->flush();
$urlRetry = $this->generateUrl('aviatur_gift_voucher_retry_secure', ["transactionRetryId" => $transactionId]);
return $this->redirect($aviaturErrorHandler->errorRedirect($urlRetry, 'Error al procesar el pago', 'Ocurrió un problema al intentar crear su transacción.'));
}
$urlPayment = 'aviatur_gift_voucher_payment_cash_return_url_secure';
return $this->redirect($this->generateUrl($urlPayment));
} else {
$urlRetry = $this->generateUrl('aviatur_gift_voucher_retry_secure', ["transactionRetryId" => $transactionId]);
return $this->redirect($aviaturErrorHandler->errorRedirect($urlRetry, '', 'El tipo de pago es inválido.'));
}
}
// Creación XML updatePaymentData y Control de estados de pago para P2P
public function p2pCallbackAction(ManagerRegistry $registry, CustomerMethodPaymentService $customerMethodPaymentService, OrderController $orderController, TokenStorageInterface $tokenStorage, AviaturEncoder $aviaturEncoder, AviaturErrorHandler $aviaturErrorHandler, SessionInterface $session, ParameterBagInterface $parameterBag, EmissionWebservice $emmisionWebService, ValidateSanctionsRenewal $validateSanctions)
{
$em = $registry->getManager();
// Obtener el transactionId
$transactionIdSessionName = $parameterBag->get('transaction_id_session_name');
$transactionId = $session->get($transactionIdSessionName);
// IdOrder y IdOrderProduct
if (true !== $session->has($transactionId.'[bono][order]')) {
return $this->redirect($aviaturErrorHandler->errorRedirect($this->generateUrl('aviatur_gift_voucher_home'), '', 'No se encontró orden asociada a este pago.'));
}
$orderInfo = json_decode($session->get($transactionId . '[bono][order]'));
$productId = str_replace('PN', '', $orderInfo->products);
$orderProduct = $em->getRepository(\Aviatur\GeneralBundle\Entity\OrderProduct::class)->find($productId);
// Obtener información de los formularios del checkOut
$detailInfo = json_decode($session->get($transactionId . '[bono][detailDataBono]'));
// Obtener la información de la tarjeta regalo desde la sesión
$bonoInfo = json_decode(base64_decode($session->get($transactionId . "[bono][bonoInfo]")), true);
// Traer información de pago
$decodedRequest = json_decode($aviaturEncoder->AviaturDecode($orderProduct->getPayrequest(), $orderProduct->getPublicKey()));
$decodedResponse = json_decode($aviaturEncoder->AviaturDecode($orderProduct->getPayresponse(), $orderProduct->getPublicKey()));
if (null != $decodedResponse) {
// Actualizar pago
$orderController->updatePaymentAction($orderProduct);
// Generar bookingId
$bookingId = $this->generateRamdonCode();
$twig = '';
// Datos para bono y email
$agency = $em->getRepository(\Aviatur\AgencyBundle\Entity\Agency::class)->find($session->get('agencyId'));
$agencyFolder = $agency->getAssetsFolder();
$voucherData = [
'empresaId' => $agencyFolder == "octopus" ? '54' : '10',
'productId' => $productId,
'bonoId' => $bookingId,
'ammount' => $decodedRequest->x_amount,
'currency' => $bonoInfo["currency"],
'documentNumber' => $orderProduct->getOrder()->getCustomer()->getDocumentnumber(),
'status' => 'EMT',
'documentType' => $orderProduct->getOrder()->getCustomer()->getDocumentType()->getExternalcode(),
'name' => $orderProduct->getOrder()->getCustomer()->getFirstname().' '.$orderProduct->getOrder()->getCustomer()->getLastname(),
'email' => $orderProduct->getOrder()->getCustomer()->getEmail(),
'phone' => $orderProduct->getOrder()->getCustomer()->getPhone(),
'recipient_name' => $detailInfo->PI->first_name_1_1.' '.$detailInfo->PI->last_name_1_1,
'recipient_mail' => $detailInfo->PI->email_1_1,
'recipient_phone' => $detailInfo->CD->phone,
'recipient_document' => $detailInfo->PI->doc_num_1_1,
];
// Twigs y status de acuerdo al estado de pago
$bonoResult = "";
switch ($decodedResponse->x_response_code) {
case isset($decodedResponse->x_response_code_cyber) && (2 == $decodedResponse->x_response_code_cyber):
//rechazado cybersource
$parameters = $em->getRepository(\Aviatur\GeneralBundle\Entity\Parameter::class)->findOneByName('aviatur_switch_rechazada_cyber');
if ($parameters && 1 == $parameters->getValue() && 1 == $decodedResponse->x_response_code) {
if (isset($detailInfo->PD->cusPOptSelected) && isset($detailInfo->PD->cusPOptSelectedStatus) && 'NOTVERIFIED' == $detailInfo->PD->cusPOptSelectedStatus) {
$detailInfo->PD->cusPOptSelectedStatus = 'ACTIVE';
$customerLogin = $tokenStorage->getToken()->getUser();
$customerMethodPaymentService->setMethodsByCustomer($customerLogin, json_decode(json_encode($detailInfo), true));
}
if (isset($detailInfo->PD->savePaymProc)) {
$customerLogin = $tokenStorage->getToken()->getUser();
$customerMethodPaymentService->setMethodsByCustomer($customerLogin, json_decode(json_encode($detailInfo), true));
}
}
$twig = 'aviatur_gift_voucher_payment_rejected_secure';
$bookingId = 'PN' . $orderProduct->getId();
break;
case 3:// pendiente p2p
$twig = '' != $twig ? $twig : 'aviatur_gift_voucher_payment_pending_secure';
$bonoResult = '{booking_id2}';
$orderProduct->setEmissiondata($bookingId);
$orderProduct->setEmail(json_encode($voucherData));
$orderProduct->setUpdatingdate(new \DateTime());
break;
// no break
case 2:// rechazada p2p
$twig = '' != $twig ? $twig : 'aviatur_gift_voucher_payment_rejected_secure';
$bookingId = 'PN' . $orderProduct->getId();
break;
case 1:// aprobado p2p
if (isset($detailInfo->PD->cusPOptSelected) && isset($detailInfo->PD->cusPOptSelectedStatus) && 'NOTVERIFIED' == $detailInfo->PD->cusPOptSelectedStatus) {
$detailInfo->PD->cusPOptSelectedStatus = 'ACTIVE';
$customerLogin = $tokenStorage->getToken()->getUser();
$customerMethodPaymentService->setMethodsByCustomer($customerLogin, json_decode(json_encode($detailInfo), true));
}
if (isset($detailInfo->PD->savePaymProc)) {
$customerLogin = $tokenStorage->getToken()->getUser();
$customerMethodPaymentService->setMethodsByCustomer($customerLogin, json_decode(json_encode($detailInfo), true));
}
$emitirBono = $this->emitirBono($emmisionWebService, $session, $orderProduct, $voucherData, $productId, $transactionId, $bookingId);
$orderProduct = $emitirBono["orderProduct"];
$bonoResult = $emitirBono["bonoResult"];
$twig = 'aviatur_gift_voucher_payment_success_secure';
break;
default: //error p2p - case 0, 4, others
$twig = 'aviatur_gift_voucher_payment_error_secure';
$bookingId = '';
}
// Update Payment
$orderUpdatePayment = str_replace(
['{product_id}', '{booking_id}', '{booking_id2}'],
[$orderProduct->getId(), $bookingId, $bonoResult],
$orderProduct->getUpdatePaymentData()
);
$orderProduct->setUpdatePaymentData($orderUpdatePayment);
// Update AddProductData
$orderAddProduct = str_replace(
['{booking_id}', '{booking_id2}', '{reference_number}'],
[$bookingId, $bonoResult, $bookingId],
$orderProduct->getAddProductData()
);
$orderProduct->setAddProductData($orderAddProduct);
// Ejecución
$orderProduct->setBooking($bookingId);
$em->persist($orderProduct);
$em->flush($orderProduct);
/* Pero solo si hay condicionados (no bloqueados) y que paguen con Tarjeta */
if ($session->has('Marked_users')) {
$validateSanctions->sendMarkedEmail($orderInfo, $session, $agency, $orderProduct, $transactionId, 'bono');
}
return $this->redirect($this->generateUrl($twig));
} else {
// No hay respuesta por parte del servicio de pago, estado pendiente
$orderProduct->setStatus('pending');
$em->persist($orderProduct);
$em->flush();
$urlRetry = $this->generateUrl('aviatur_gift_voucher_retry_secure', ["transactionRetryId" => $transactionId]);
return $this->redirect($aviaturErrorHandler->errorRedirect($urlRetry, '', 'No hay respuesta por parte del servicio de pago.'));
}
}
// Creación XML updatePaymentData y Control de estados de pago para PSE
public function pseCallbackAction(ManagerRegistry $registry, PSEController $psePaymentController, PSERestController $PSERestController, OrderController $orderController, AviaturEncoder $aviaturEncoder, AviaturErrorHandler $aviaturErrorHandler, SessionInterface $session, ParameterBagInterface $parameterBag, EmissionWebservice $emmisionWebService, AviaturLogSave $logSave)
{
$em = $registry->getManager();
// Obtener el transactionId
$transactionIdSessionName = $parameterBag->get('transaction_id_session_name');
$transactionId = $session->get($transactionIdSessionName);
// IdOrder y IdOrderProduct
if (true !== $session->has($transactionId.'[bono][order]')) {
return $this->redirect($aviaturErrorHandler->errorRedirect($this->generateUrl('aviatur_gift_voucher_home'), '', 'No se encontró orden asociada a este pago.'));
}
$orderInfo = json_decode($session->get($transactionId . '[bono][order]'));
$productId = str_replace('PN', '', $orderInfo->products);
$orderProduct = $em->getRepository(\Aviatur\GeneralBundle\Entity\OrderProduct::class)->find($productId);
// Obtener información de los formularios del checkOut
$detailInfo = json_decode($session->get($transactionId . '[bono][detailDataBono]'));
// Traer información de pago
$decodedRequest = json_decode($aviaturEncoder->AviaturDecode($orderProduct->getPayrequest(), $orderProduct->getPublicKey()));
$decodedResponse = json_decode($aviaturEncoder->AviaturDecode($orderProduct->getPayresponse(), $orderProduct->getPublicKey()));
if (!isset($decodedResponse) && !isset($decodedResponse->createTransactionResult) && !isset($decodedResponse->createTransactionPaymentResponseInformation)) {
$urlRetry = $this->generateUrl('aviatur_gift_voucher_retry_secure', ["transactionRetryId" => $transactionId]);
return $this->redirect($aviaturErrorHandler->errorRedirect($urlRetry, '', 'No se encontró información de la transacción.'));
}
// Consultar respuesta de pago de acuerdo a la opcion definida en payment_method
$paymentCode = $this->paymentMethod->getCode() === 'pse' ? 'pse' : 'pseRest';
$pseTransactionId = '';
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;
}
$paymentResponse = json_decode($psePaymentController->pseCallbackAction($orderController, $pseTransactionId, $decodedResponse));
$orderController->updatePaymentAction($orderProduct);
} else {
$pseTransactionId = $decodedResponse->internalReference;
$paymentResponse = $PSERestController->getTransactionInfo($pseTransactionId);
$logSave->logSave(json_encode($paymentResponse), '_pseRest', $decodedRequest->payment->reference .'_RS', $pseTransactionId);
$orderController->updateRestPaymentAction($orderProduct);
}
// Generar bookingId
$bookingId = $this->generateRamdonCode();
// Valor total
$totalAmount = $decodedRequest->payment->amount->total ?? $decodedRequest->x_total_amount;
$currency = $decodedRequest->payment->amount->currency ?? $decodedRequest->x_currency;
// Datos para bono y email
$agency = $em->getRepository(\Aviatur\AgencyBundle\Entity\Agency::class)->find($session->get('agencyId'));
$agencyFolder = $agency->getAssetsFolder();
$voucherData = [
'empresaId' => $agencyFolder == "octopus" ? '54' : '10',
'productId' => $productId,
'bonoId' => $bookingId,
'ammount' => $totalAmount,
'currency' => $currency,
'documentNumber' => $orderProduct->getOrder()->getCustomer()->getDocumentnumber(),
'status' => 'EMT',
'documentType' => $orderProduct->getOrder()->getCustomer()->getDocumentType()->getExternalcode(),
'name' => $orderProduct->getOrder()->getCustomer()->getFirstname().' '.$orderProduct->getOrder()->getCustomer()->getLastname(),
'email' => $orderProduct->getOrder()->getCustomer()->getEmail(),
'phone' => $orderProduct->getOrder()->getCustomer()->getPhone(),
'recipient_name' => $detailInfo->PI->first_name_1_1.' '.$detailInfo->PI->last_name_1_1,
'recipient_mail' => $detailInfo->PI->email_1_1,
'recipient_phone' => $detailInfo->CD->phone,
'recipient_document' => $detailInfo->PI->doc_num_1_1,
];
if (!isset($paymentResponse->error)) {
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);
}
// Actualizar payResponse con el estado de pago
$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
$returnCodeStatus = 'SUCCESS';
if ((!isset($paymentResponse->getTransactionInformationResult->returnCode) || 'SUCCESS' != (string) $paymentResponse->getTransactionInformationResult->returnCode) && !isset($paymentResponse->status->status))
{
$returnCodeStatus = (string) $paymentResponse->getTransactionInformationResult->returnCode;
}
// Twigs y status de acuerdo al estado de pago
$twig = '';
$bonoResult = "";
if ('SUCCESS' == (string) $returnCodeStatus) {
$statusResponse = $paymentResponse->getTransactionInformationResult->transactionState ?? $paymentResponse->status->status;
switch ((string) $statusResponse) {
case 'OK':
case 'APPROVED':
$twig = 'aviatur_gift_voucher_payment_success_secure';
$status = 'approved';
$emitirBono = $this->emitirBono($emmisionWebService, $session, $orderProduct, $voucherData, $productId, $transactionId, $bookingId);
$orderProduct = $emitirBono["orderProduct"];
$bonoResult = $emitirBono["bonoResult"];
break;
case 'PENDING':
$twig = 'aviatur_gift_voucher_payment_pending_secure';
$status = 'pending';
$orderProduct->setEmissiondata($bookingId);
$orderProduct->setEmail(json_encode($voucherData));
$orderProduct->setUpdatingdate(new \DateTime());
$bonoResult = '{booking_id2}';
break;
case 'NOT_AUTHORIZED':
case 'REJECTED':
$bookingId = 'PN' . $orderProduct->getId();
$twig = 'aviatur_gift_voucher_payment_rejected_secure';
$status = 'rejected';
break;
case 'FAILED':
$bookingId = '';
$twig = 'aviatur_gift_voucher_payment_error_secure';
$status = 'failed';
break;
}
// Update Payment
$orderUpdatePayment = str_replace(
['{product_id}', '{booking_id}', '{booking_id2}'],
[$orderProduct->getId(), $bookingId, $bonoResult],
$orderProduct->getUpdatePaymentData()
);
$orderProduct->setUpdatePaymentData($orderUpdatePayment);
// Update AddProductData
$orderAddProduct = str_replace(
['{booking_id}', '{booking_id2}', '{reference_number}'],
[$bookingId, $bonoResult, $bookingId],
$orderProduct->getAddProductData()
);
$orderProduct->setAddProductData($orderAddProduct);
$orderProduct->setUpdatePaymentData($orderUpdatePayment);// Update Payment
$orderProduct->setStatus($status);
$orderProduct->getOrder()->setStatus($status);
$orderProduct->setUpdatingdate(new \DateTime());
$orderProduct->getOrder()->setUpdatingdate(new \DateTime());
$orderProduct->setBooking($bookingId);
$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_gift_voucher_payment_error_secure';
}
return $this->redirect($this->generateUrl($twig));
} else {
$decodedResponse->getTransactionInformationResult = $paymentResponse;
$orderProduct->setPayresponse($aviaturEncoder->AviaturEncode(json_encode($decodedResponse), $orderProduct->getPublicKey()));
$orderProduct->setUpdatingdate(new \DateTime());
$em->persist($orderProduct);
$em->flush();
$urlRetry = $this->generateUrl('aviatur_gift_voucher_retry_secure', ["transactionRetryId" => $transactionId]);
return $this->redirect($aviaturErrorHandler->errorRedirect($urlRetry, '', 'Ocurrió un error al consultar el estado de la transacción.'));
}
}
// Creación para CASH
public function cashCallbackAction(ManagerRegistry $registry, OrderController $orderController, AviaturErrorHandler $aviaturErrorHandler, SessionInterface $session, ParameterBagInterface $parameterBag)
{
$em = $registry->getManager();
// Obtener el transactionId
$transactionIdSessionName = $parameterBag->get('transaction_id_session_name');
$transactionId = $session->get($transactionIdSessionName);
// IdOrder y IdOrderProduct
if (true !== $session->has($transactionId.'[bono][order]')) {
return $this->redirect($aviaturErrorHandler->errorRedirect($this->generateUrl('aviatur_gift_voucher_home'), '', 'No se encontró orden asociada a este pago.'));
}
$orderInfo = json_decode($session->get($transactionId . '[bono][order]'));
$productId = str_replace('PN', '', $orderInfo->products);
$orderProduct = $em->getRepository(\Aviatur\GeneralBundle\Entity\OrderProduct::class)->find($productId);
// Obtener información de los formularios del checkOut
$detailInfo = json_decode($session->get($transactionId . '[bono][detailDataBono]'));
// Obtener la información de la tarjeta regalo desde la sesión
$bonoInfo = json_decode(base64_decode($session->get($transactionId . "[bono][bonoInfo]")), true);
$totalAmountCOP = $bonoInfo["giftFarePrice"];
$currencyBono = $bonoInfo["currency"];
if ($session->has($transactionId . '[bono][cash_result]')) {
// Obtener BookingId
$cashPay = json_decode($session->get($transactionId.'[bono][cash_result]'), true);
$bookingId = $cashPay["bookingID"];
unset($cashPay["bookingID"]);
$session->set($transactionId.'[bono][cash_result]', json_encode($cashPay));
// Datos para bono y email
$agency = $em->getRepository(\Aviatur\AgencyBundle\Entity\Agency::class)->find($session->get('agencyId'));
$agencyFolder = $agency->getAssetsFolder();
$voucherData = [
'empresaId' => $agencyFolder == "octopus" ? '54' : '10',
'productId' => $productId,
'bonoId' => $bookingId,
'ammount' => $totalAmountCOP,
'currency' => $currencyBono,
'documentNumber' => $orderProduct->getOrder()->getCustomer()->getDocumentnumber(),
'status' => 'EMT',
'documentType' => $orderProduct->getOrder()->getCustomer()->getDocumentType()->getExternalcode(),
'name' => $orderProduct->getOrder()->getCustomer()->getFirstname().' '.$orderProduct->getOrder()->getCustomer()->getLastname(),
'email' => $orderProduct->getOrder()->getCustomer()->getEmail(),
'phone' => $orderProduct->getOrder()->getCustomer()->getPhone(),
'recipient_name' => $detailInfo->PI->first_name_1_1.' '.$detailInfo->PI->last_name_1_1,
'recipient_mail' => $detailInfo->PI->email_1_1,
'recipient_phone' => $detailInfo->CD->phone,
'recipient_document' => $detailInfo->PI->doc_num_1_1,
];
// Actualizar pago en cash
$orderController->updatePaymentAction($orderProduct);
// Update Payment
$orderUpdatePayment = str_replace(
['{product_id}', '{booking_id}'],
[$orderProduct->getId(), $bookingId],
$orderProduct->getUpdatePaymentData()
);
$orderProduct->setUpdatePaymentData($orderUpdatePayment);
// Update AddProductData
$orderAddProduct = str_replace(
['{product_id}', '{booking_id}'],
[$orderProduct->getId(), $bookingId],
$orderProduct->getAddProductData()
);
$orderProduct->setAddProductData($orderAddProduct);
// Ejecución
$orderProduct->setBooking($bookingId);
$orderProduct->setEmissiondata($bookingId);
$orderProduct->setEmail(json_encode($voucherData));
$em->persist($orderProduct);
$em->flush($orderProduct);
return $this->redirect($this->generateUrl('aviatur_gift_voucher_confirmation_success_secure'));
} else {
// No hay respuesta por parte del servicio de pago, estado pendiente
$orderProduct->setStatus('pending');
$em->persist($orderProduct);
$em->flush();
$urlRetry = $this->generateUrl('aviatur_gift_voucher_retry_secure', ["transactionRetryId" => $transactionId]);
return $this->redirect($aviaturErrorHandler->errorRedirect($urlRetry, '', 'No hay respuesta por parte del servicio de pago.'));
}
}
// Generar bono en Front
public function generarBonofrontAction(Request $request, ManagerRegistry $registry, AviaturErrorHandler $aviaturErrorHandler, SessionInterface $session, ParameterBagInterface $parameterBag, EmissionWebservice $emmisionWebService)
{
$em = $registry->getManager();
// Valida la existencia y configuración de tarjeta regalo en la agencia
$validateAgencyRequest = $this->validateAgencyRequest($session->get('agencyId'), $request, $em, $aviaturErrorHandler, false);
if(!isset($validateAgencyRequest["agency"])){
return $this->json(['error' => true, 'message' => $validateAgencyRequest]);
}
// Obtener el transactionId
$transactionIdSessionName = $parameterBag->get('transaction_id_session_name');
$transactionId = $session->get($transactionIdSessionName);
// IdOrder y IdOrderProduct
if (true !== $session->has($transactionId.'[bono][order]')) {
return $this->redirect($aviaturErrorHandler->errorRedirect($this->generateUrl('aviatur_gift_voucher_home'), '', 'No se encontró orden asociada a este pago.'));
}
$orderInfo = json_decode($session->get($transactionId . '[bono][order]'));
$productId = str_replace('PN', '', $orderInfo->products);
$orderProduct = $em->getRepository(\Aviatur\GeneralBundle\Entity\OrderProduct::class)->find($productId);
// Obtener la información de la tarjeta regalo desde la sesión
$bonoInfo = json_decode(base64_decode($session->get($transactionId . "[bono][bonoInfo]")), true);
$totalAmountCOP = $bonoInfo["giftFarePrice"];
// Obtener información de los formularios del checkOut
$detailInfo = json_decode($session->get($transactionId . '[bono][detailDataBono]'));
// Generar bookingId
$bookingId = $this->generateRamdonCode();
// Información de usuario
$datosAgente = simplexml_load_string($session->get('front_user'));
// Emitir bono
$agency = $em->getRepository(\Aviatur\AgencyBundle\Entity\Agency::class)->find($session->get('agencyId'));
$agencyFolder = $agency->getAssetsFolder();
$voucherData = [
'empresaId' => $agencyFolder == "octopus" ? '54' : '10',
'productId' => $productId,
'bonoId' => $bookingId,
'ammount' => $totalAmountCOP,
'currency' => $bonoInfo["currency"],
'documentNumber' => $detailInfo->BD->doc_num,
'status' => 'EMT',
'documentType' => $detailInfo->BD->doc_type,
'name' => $detailInfo->BD->first_name.' '.$detailInfo->BD->last_name,
'email' => $datosAgente->CORREO_ELECTRONICO,
'phone' => $detailInfo->BD->phone,
'recipient_name' => $detailInfo->PI->first_name_1_1.' '.$detailInfo->PI->last_name_1_1,
'recipient_mail' => $detailInfo->PI->email_1_1,
'recipient_phone' => $detailInfo->CD->phone,
'recipient_document' => $detailInfo->PI->doc_num_1_1,
];
$twig = 'aviatur_gift_voucher_payment_success_secure';
$emitirBono = $this->emitirBono($emmisionWebService, $session, $orderProduct, $voucherData, $productId, $transactionId, $bookingId);
$orderProduct = $emitirBono["orderProduct"];
$bonoResult = $emitirBono["bonoResult"];
// Update AddProductData
$orderAddProduct = str_replace(
['{booking_id}', '{booking_id2}', '{reference_number}'],
[$bookingId, $bonoResult, $bookingId],
$orderProduct->getAddProductData()
);
$orderProduct->setAddProductData($orderAddProduct);
// Actualizar bookingId
$orderProduct->setBooking($bookingId);
$orderProduct->setEmail(json_encode($voucherData));
$orderProduct->setUpdatingdate(new \DateTime());
$em->persist($orderProduct);
$em->flush();
return $this->redirect($this->generateUrl($twig));
}
// Modificación en datos resume en BD y envío de correo
public function paymentOutputAction(ManagerRegistry $registry, \Swift_Mailer $mailer, TwigFolder $twigFolder, SessionInterface $session, ParameterBagInterface $parameterBag, AviaturEncoder $aviaturEncoder, Pdf $pdf, ExceptionLog $exceptionLog)
{
$em = $registry->getManager();
// Datos guardados en el resumen
$this->prepareInfoResume($session, $registry, $parameterBag, $aviaturEncoder);
// Obtener el transactionId
$transactionIdSessionName = $parameterBag->get('transaction_id_session_name');
$transactionId = $session->get($transactionIdSessionName);
// IdOrder y IdOrderProduct
$orderInfo = json_decode($session->get($transactionId . '[bono][order]'));
$productId = str_replace('PN', '', $orderInfo->products);
$orderProduct = $em->getRepository(\Aviatur\GeneralBundle\Entity\OrderProduct::class)->find($productId);
// Datos de resumen
$resumeData = json_decode($orderProduct->getResume(), true);
$resumeData['agencyData']['agency_phones'] = $session->get('agencyDataInfo')['agency_phones'];
$paymentResume = $resumeData['paymentResume'];
$facturationResume = $resumeData['facturationResume'];
$travelers = $resumeData['travelers'];
// Agencia
$agency = $em->getRepository(\Aviatur\AgencyBundle\Entity\Agency::class)->find($session->get('agencyId'));
// Correos destinatarios
$giftVoucherConfigObject = $em->getRepository(\Aviatur\GiftVoucherBundle\Entity\ConfigGiftVoucherAgency::class)->findBy(['agency' => $orderProduct->getOrder()->getAgency()]);
$toAdminMails = explode(';', $giftVoucherConfigObject[0]->getMails());
$sendVoucherBcc = $toAdminMails;
$sendVoucherBcc[] = 'notificacionessitioweb@aviatur.com';
// Alertas y correos, segun status de cyber
$paymentResume['transaction_state_cyber'] = $opResponse->x_response_code_cyber ?? '1';
if (2 == $paymentResume['transaction_state_cyber']) {
//In case Rejected Cybersource send mail to administratos Aviatur
$sendTo = $toAdminMails;
$sendVoucherBcc = ['notificacionessitioweb@aviatur.com', 'soptepagelectronic@aviatur.com', 'soportepagoelectronico@aviatur.com.co']; // verificar correos....???
}
// Enviar correo usuario en caso de pago exitoso
if (1 == $paymentResume['transaction_state']) {
// TODOSG validar las rutas quemadas
$emailCustomMessage = $this->renderView($twigFolder->twigExists('@AviaturTwig/default/Flux/GiftVoucher/Default/emailUserGiftCard.html.twig'), ["resumeData" => $resumeData, 'agencyName' => $session->get('agencyShortName')]);
$sendVoucherTo = $sendTo ?? mb_strtolower($travelers[0]['Email']);
$message = (new \Swift_Message())
->setContentType('text/html')
->setFrom($session->get('emailNoReply'))
->setTo($sendVoucherTo)
->setBCC('notificacionessitioweb@aviatur.com')
->setSubject($session->get('agencyShortName').' - Gracias por su compra - Bono de Regalo')
->setBody($emailCustomMessage);
$mailer->send($message);
// Actualizar tabla order-product en campo email
$orderProduct->setEmail($emailCustomMessage);
$em->persist($orderProduct);
$em->flush();
// Eliminar lo de session
$session->remove($transactionId.'[bono][emission][error]');
$session->remove($transactionId . '[bono][retry]');
$session->remove($transactionId . "[bono][bonoInfo]");
$session->remove($transactionId . '[bono][userInfo]');
$session->remove($transactionId.'[bono][provider]');
$session->remove($transactionId . '[bono][detailDataBono]');
} else if (3 == $paymentResume['transaction_state']){
// Datos de la agencia
$agencyData = [
'agency_name' => $agency->getName(),
'agency_nit' => $agency->getNit(),
'agency_phone' => $agency->getPhone(),
'agency_email' => $agency->getMailContact(),
'agency_phones' => $agency->getPhonescontact()
];
// Creación del pdf cuando es CASH
if ($resumeData["paymentResume"]["paymentData_type"] == "cash" && !$session->has($transactionId . '[emission_baloto_email]')) {
$agencyFolder = $twigFolder->twigFlux();
$projectDir = $parameterBag->get('kernel.project_dir');
$emailNotification = $parameterBag->get('email_notification');
$voucherFile = $projectDir . '/app/serviceLogs/CashTransaction/' . $paymentResume['id_context'] . '_' . $transactionId . '.pdf';
$paymentResume['exportPDF'] = true;
$paymentResume['infos'][0]['agencyData'] = $agencyData;
$paymentResume['infos'][0]['paymentResume']['id'] = $paymentResume['id_context'];
$paymentResume['infos'][0]['paymentResume']['total_amount'] = $paymentResume['total_amount'];
$paymentResume['infos'][0]['paymentResume']['fecha_vigencia'] = $paymentResume['fecha_vigencia'];
$paymentResume['infos'][0]['paymentResume']['description'] = $paymentResume['description'];
// $ruta = '@AviaturTwig/' . $agencyFolder . '/General/Templates/email_cash.html.twig';
$ruta = '@AviaturTwig/default/Flux/GiftVoucher/Default/emailCashGiftCard.html.twig';
if (!file_exists($voucherFile)) {
$pdf->generateFromHtml($this->renderView($twigFolder->twigExists($ruta), $paymentResume), $voucherFile);
}
$clientEmail = $paymentResume['client_email'];
$setTo = ['soportepagoelectronico@aviatur.com.co', 'soptepagelectronic@aviatur.com', $clientEmail];
$paymentResume['exportPDF'] = false;
$message = (new \Swift_Message())
->setContentType('text/html')
->setFrom($session->get('emailNoReply'))
->setTo($setTo)
->setBcc($emailNotification)
->setSubject($session->get('agencyShortName').' - '.'Transacción Efectivo Creada '.$paymentResume['id_context'])
->attach(\Swift_Attachment::fromPath($voucherFile))
->setBody(
$this->renderView($twigFolder->twigExists($ruta), $paymentResume)
);
try {
$mailer->send($message);
$session->set($transactionId.'[emission_baloto_email]', 'emailed');
} catch (\Exception $ex) {
$exceptionLog->log(var_dump($message), $ex);
}
}
}
// Correo de gracias por su compra
if (2 != $paymentResume['transaction_state_cyber'] && $resumeData["paymentResume"]["paymentData_type"] != "cash" ){
$emailCustomerBody['admin'] = false;
$emailCustomMessage = $this->renderView($twigFolder->twigExists('@AviaturTwig/default/Flux/GiftVoucher/Default/emailThankYouPage.html.twig'), ['emailBodyContent' => $emailCustomerBody, "resumeData" => $resumeData, 'agencyName'=> $session->get('agencyShortName')]);
$emailFacturation = $facturationResume["customer_email"];
if (false !== strpos($emailFacturation, '***')) {
$detailInfo = json_decode($session->get($transactionId . '[bono][detailDataBono]'));
$customer = $em->getRepository(\Aviatur\CustomerBundle\Entity\Customer::class)->find($detailInfo->BD->id);
$emailFacturation = $customer->getEmail();
}
$sendThankYouPage = $sendTo ?? $emailFacturation;
$message = (new \Swift_Message())
->setContentType('text/html')
->setFrom($session->get('emailNoReply'))
->setTo($sendThankYouPage)
->setBCC($sendVoucherBcc)
->setSubject($session->get('agencyShortName').' - Bono de Regalo')
->setBody($emailCustomMessage);
$mailer->send($message);
}
// Correo a administrador
$emailAdminBody['admin'] = true;
$emailAdminBody['messageText'] = 'Se ha realizado una compra de un bono de regalo virtual con los siguientes datos,<br> favor hacer las verificaciones correspondientes en sus respectivos departamentos.';
if (2 == $paymentResume['transaction_state_cyber'] && 1 == $paymentResume['transaction_state']) {
$emailAdminBody['cyberReject'] = '<strong>ATENCIÓN!!!</strong> <br> <p>El Pago fué exitoso pero la transacción fué Rechazada por Cybersource. Por favor confirmar con el Departamento de Control Pago Electrónico la validez de la misma y en caso positivo realizar envío del Bono de Regalo al cliente.</p>';
$rejectAlertText = ' - **RECHAZO CYBERSOURCE**';
}
// TODOSG validar las rutas quemadas
$emailAdminMessage = $this->renderView($twigFolder->twigExists('@AviaturTwig/default/Flux/GiftVoucher/Default/emailThankYouPage.html.twig'), ['emailBodyContent' => $emailAdminBody, "resumeData" => $resumeData]);
$messageAdmin = (new \Swift_Message())
->setContentType('text/html')
->setFrom($session->get('emailNoReply'))
->setTo($toAdminMails)
->setBCC(['notificacionessitioweb@aviatur.com', 'soptepagelectronic@aviatur.com', 'soportepagoelectronico@aviatur.com.co'])
->setSubject($session->get('agencyShortName').' - Se ha generado un Bono de Regalo con pago en estado ' . $orderProduct->getStatus())
->setBody($emailAdminMessage);
$mailer->send($messageAdmin);
$urlResume = $this->generateUrl('aviatur_gift_voucher_thank_you_page_secure');
return $this->redirect($urlResume);
}
// Vista de gracias por tu compra
public function thankYouPageAction(SessionInterface $session, ManagerRegistry $registry, TwigFolder $twigFolder, ParameterBagInterface $parameterBag, AviaturErrorHandler $aviaturErrorHandler)
{
$em = $registry->getManager();
// Obtener el transactionId
$transactionIdSessionName = $parameterBag->get('transaction_id_session_name');
$transactionId = $session->get($transactionIdSessionName);
// Obtener order_product
if (true !== $session->has($transactionId.'[bono][order]')) {
return $this->redirect($aviaturErrorHandler->errorRedirect($this->generateUrl('aviatur_gift_voucher_home'), '', 'No se encontró orden asociada a este pago.'));
}
$orderProductCode = $session->get($transactionId . '[bono][order]');
$productId = str_replace('PN', '', json_decode($orderProductCode)->products);
$orderProduct = $em->getRepository(\Aviatur\GeneralBundle\Entity\OrderProduct::class)->find($productId);
// Datos de resumen
$resumeData = json_decode($orderProduct->getResume(), true);
// Renderizar vista de thakyou page
$agencyFolder = $twigFolder->twigFlux();
//$urlResume = $twigFolder->twigExists('@AviaturTwig/'.$agencyFolder.'/GiftVoucher/Default/resume.html.twig');
// TODOSG validar las rutas quemadas
$urlResume = $twigFolder->twigExists('@AviaturTwig/default/Flux/GiftVoucher/Default/resume.html.twig', ['agencyName' => $session->get('agencyShortName')]);
$resumeMessage = $this->render(
$urlResume,
array_merge(
$resumeData,
['agencyName' => $session->get('agencyShortName')]
)
);
return $resumeMessage;
}
// Valida la existencia y configuración de tarjeta regalo en la agencia
// Retorna una respuesta de error con redirección si la validación falla
private function validateAgencyRequest($idAgency, $request, $em, $aviaturErrorHandler, $validateRQ)
{
// Si $request NO es null, validamos la petición
if ($validateRQ && empty($request->query->all()) && empty($request->request->all())) {
$titleError = "Sección no disponible";
$textError = "Ha sido dirigido a la página de personalización para continuar explorando opciones sin inconvenientes.";
return $aviaturErrorHandler->errorRedirect($this->generateUrl("aviatur_gift_voucher_personalize", []), $titleError, $textError);
}
// Información de agencia
$agency = $em->getRepository(\Aviatur\AgencyBundle\Entity\Agency::class)->find($idAgency);
if (!isset($agency)) {
$host = ($request !== null) ? $request->getHost() : 'desconocido';
$titleError = "No se encontró la agencia con el dominio: " . $host;
$textError = "Lo sentimos, ha sido redirigido al home para que pueda seguir explorando opciones.";
return $aviaturErrorHandler->errorRedirect($this->generateUrl('aviatur_general_homepage'), $titleError, $textError);
}
// Configuración de precios y códigos de bono de regalo en BD
$giftVoucherConfigObject = $em->getRepository(\Aviatur\GiftVoucherBundle\Entity\ConfigGiftVoucherAgency::class)
->findParamsByAgency($agency);
if (empty($giftVoucherConfigObject) || (is_countable($giftVoucherConfigObject) && count($giftVoucherConfigObject) == 0)) {
return $aviaturErrorHandler->errorRedirect($this->generateUrl('aviatur_general_homepage'), 'Acceso no autorizado', 'No se encontró configuración para esta Agencia.');
}
// Validar que se creo bien el objeto
$giftVoucherConfigArray = json_decode($giftVoucherConfigObject[0]['params'], true);
if (empty($giftVoucherConfigArray)) {
return $aviaturErrorHandler->errorRedirect($this->generateUrl('aviatur_general_homepage'), '', 'Lo sentimos, se ha redirigido a la página de inicio para continuar explorando opciones, debido a inconvenientes técnicos en la configuración.');
}
// Si todo está OK, no hay error
return [
"agency" => $agency,
"giftVoucherConfigObject" => $giftVoucherConfigObject
];
}
// Validación del precio del bono
// Retorna una respuesta de error con redirección si la validación falla
private function validatePriceBono($giftVoucherConfigObject, $bonoInfo, $aviaturErrorHandler)
{
$giftVoucherConfigArray = json_decode($giftVoucherConfigObject[0]['params'], true);
if (ctype_digit($bonoInfo["giftFareCode"])) {
// Si es un número entero en string, parsear y asignar directamente
$bonoInfo["giftFarePrice"] = (int) $bonoInfo["giftFareCode"];
$bonoInfo["giftFareCode"] = "";
} else {
// Si no es numérico, buscar en $giftVoucherConfigArray['fares'] el que coincida en 'code'
$matchedFare = array_values(array_filter($giftVoucherConfigArray['fares'], function($fare) use ($bonoInfo) {
return isset($fare['code']) && $fare['code'] === $bonoInfo["giftFareCode"];
}));
if(empty($matchedFare) || empty($matchedFare[0]['value'])){
$titleError = "El valor de la tarjeta es inválido.";
$textError = "Ha sido redirigido a la personalización de la tarjeta para que pueda seguir explorando opciones.";
return $aviaturErrorHandler->errorRedirect($this->generateUrl("aviatur_gift_voucher_personalize"), $titleError, $textError);
}
$bonoInfo["giftFarePrice"] = $matchedFare[0]['value'];
}
// Si el precio no está dentro del rango
if($giftVoucherConfigArray['minValue'] > $bonoInfo["giftFarePrice"] || $bonoInfo["giftFarePrice"] > $giftVoucherConfigArray['maxValue']){
$titleError = "El valor de la tarjeta no está dentro de los rangos.";
$textError = "Ha sido redirigido a la personalización de la tarjeta para que pueda seguir explorando opciones.";
return $aviaturErrorHandler->errorRedirect($this->generateUrl("aviatur_gift_voucher_personalize"), $titleError, $textError);
}
$bonoInfo["currency"] = "COP";
return $bonoInfo;
}
// Generar código para bookingId
private function generateRamdonCode($length = 10)
{
$characters = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$charactersLength = strlen($characters);
$randomString = '';
for ($i = 0; $i < $length; ++$i) {
$randomString .= $characters[random_int(0, $charactersLength - 1)];
}
$randomCRC = crc32(date('Y-m-d H:i:s'));
$randomCode = substr($randomString, 0, 5).substr($randomCRC, 1, 5);
return $randomCode;
}
// Servicio de emissión de la tarjeta regalo
private function emitirBono(EmissionWebservice $emissionWebservice, SessionInterface $session, $orderProduct, $voucherData, $productId, $transactionId, $bookingId)
{
$sendVoucherStatus = $emissionWebservice->callServiceEmission('purchaseBonus', $voucherData, $productId);
if (isset($sendVoucherStatus['error'])) {
$session->set($transactionId.'[bono][emission][error]', true);
$resultBono = 'EmissionError';
// Correo de solicitud de generación de bono internamente
$ordersIdsString = $orderProduct->getOrder() . '-PN' . $productId;
$emailContent = '
<b>Error de emisión: emitir el bono internamente.</b><br/>
Info:<br/>
The booking id is: ' . $bookingId . '<br/>
The reference id is: ' . $ordersIdsString . '<br/>
The data is: ' . json_encode($voucherData)
;
$message = (new \Swift_Message())
->setContentType('text/html')
->setFrom($session->get('emailNoReply'))
->setSubject($session->get('agencyShortName').' - Bono with approved payment: Bono NOT issued')
->setTo(['soptepagelectronic@aviatur.com', 'soportepagoelectronico@aviatur.com.co'])
->setBcc(['notificacionessitioweb@aviatur.com'])
->setBody($emailContent)
;
$this->mailer->send($message);
} else {
$resultBono = $sendVoucherStatus->purchaseBonusResult;
}
$orderProduct->setEmissiondata($bookingId.'-'.$resultBono);
return [
"orderProduct" => $orderProduct,
"bonoResult" => $resultBono
];
}
// Funcion para guardar info en resume, BD
public function prepareInfoResume(SessionInterface $session, ManagerRegistry $registry, ParameterBagInterface $parameterBag, AviaturEncoder $aviaturEncoder)
{
$em = $registry->getManager();
// Obtener el transactionId
$transactionIdSessionName = $parameterBag->get('transaction_id_session_name');
$transactionId = $session->get($transactionIdSessionName);
// IdOrder y IdOrderProduct
$orderInfo = json_decode($session->get($transactionId . '[bono][order]'));
$productId = str_replace('PN', '', $orderInfo->products);
$orderProduct = $em->getRepository(\Aviatur\GeneralBundle\Entity\OrderProduct::class)->find($productId);
// Request y response de respuesta de pago
$opRequest = json_decode($aviaturEncoder->AviaturDecode($orderProduct->getPayrequest(), $orderProduct->getPublicKey()));
$opResponse = json_decode($aviaturEncoder->AviaturDecode($orderProduct->getPayResponse(), $orderProduct->getPublicKey()));
// Obtener información de los formularios del checkOut
$detailInfo = json_decode($session->get($transactionId . '[bono][detailDataBono]'));
// Información de medio de pago
$isFront = $session->has('operatorId');
if (!$isFront) {
$paymentData = $detailInfo->PD;
}
// Mapeo de información
if ((null != $opRequest) && (null != $opResponse)) {
$resumeData = json_decode($orderProduct->getResume(), true);
if (isset($opResponse->x_franchise) && ('' != $opResponse->x_franchise)) {
$franquiceCode = str_replace(['CR_', 'RM_', 'CDNSA'], ['', '', 'CS'], $opResponse->x_franchise);
$clientFranquice = $em->getRepository(\Aviatur\GeneralBundle\Entity\Card::class)->findOneByPaymentgatewaycode($franquiceCode);
if(empty($clientFranquice)){
$franquiceCode = str_replace(['CR_', 'RM_', 'CDNSA'], ['', '', 'CS'], $opRequest->franchise);
$clientFranquice = $em->getRepository(\Aviatur\GeneralBundle\Entity\Card::class)->findOneByPaymentgatewaycode($franquiceCode);
}
} else {
$clientFranquice['description'] = 'error';
}
// paymentResume de acuerdo a la respuesta del pago
if (isset($opResponse->x_description)) {
$paymentResume = [
'transaction_state' => $opResponse->x_response_code,
'ta_transaction_state' => $opResponse->x_ta_response_code,
'id' => $orderProduct->getBooking(),
'id_context' => $opRequest->x_invoice_num,
'total_amount' => $opResponse->x_amount,
'currency' => $opResponse->x_bank_currency,
'amount' => 0 != $opRequest->x_amount_base ? $opRequest->x_amount_base : $opResponse->x_amount,
'iva' => $opRequest->x_tax,
'ip_address' => $opRequest->x_customer_ip,
'bank_name' => $opResponse->x_bank_name,
'client_franquice' => ['description' => (is_object($clientFranquice) ? $clientFranquice->getDescription() : $clientFranquice['description'])],
'cuotas' => $opRequest->x_differed,
'card_num' => '************'.substr($opRequest->x_card_num, strlen($opRequest->x_card_num) - 4),
'reference' => $opResponse->x_transaction_id,
'auth' => $opResponse->x_approval_code,
'transaction_date' => $opResponse->x_transaction_date,
'description' => $opResponse->x_description,
'reason_code' => $opResponse->x_response_reason_code,
'reason_description' => $opResponse->x_response_reason_text,
'client_names' => $opResponse->x_first_name.' '.$opResponse->x_last_name,
'client_email' => $opResponse->x_email,
];
} elseif (isset($opRequest->infoCash)) {
$paymentResume = [
'transaction_state' => 3,
'id' => $orderProduct->getBooking(),
'id_context' => $opRequest->infoCash->x_reference,
'currency' => $opRequest->infoCash->x_currency,
'total_amount' => $opRequest->infoCash->x_total_amount,
'client_franquice' => ['description' => 'Efectivo'],
'amount' => $opRequest->infoCash->x_total_amount,
'iva' => null,
'ip_address' => $opRequest->infoCash->dirIp,
'airport_tax' => null,
'reference' => $opRequest->infoCash->x_reference,
'auth' => null,
'transaction_date' => $opRequest->infoCash->x_fechavigencia,
'description' => $opRequest->infoCash->x_description,
'reason_code' => 101,
'reason_description' => 'Transacción creada',
'client_names' => $opRequest->infoCash->x_first_name.' '.$opRequest->infoCash->x_last_name,
'client_email' => $opRequest->infoCash->x_email,
'fecha_vigencia' => $opRequest->infoCash->x_fechavigencia,
];
// En caso de error en la emision de cash
$cash_result = json_decode($session->get($transactionId.'[bono][cash_result]'));
if ('' == $cash_result) {
$paymentResume['transaction_state'] = 2;
}
} else {
// Obtener codigo de banco por metodo de pago seleccionado
$paymentCode = $this->paymentMethod->getCode() === 'pse' ? 'pse' : 'pseRest';
if ($paymentCode === 'pse') {
$bank_code = isset($opRequest->bankCode) ? (int) $opRequest->bankCode : 0;
} else {
$bank_code = isset($opRequest->instrument->redirection->additional->bankCode) ? (int) $opRequest->instrument->redirection->additional->bankCode : 0;
}
$bank_info = $em->getRepository(\Aviatur\PaymentBundle\Entity\PseBank::class)->findOneByCode($bank_code);
$bank_name = $bank_info->getName();
$devolutionBase = $paymentCode === 'pse' ? $opRequest->devolutionBase ?? $opRequest->x_devolution_base : 0;
$taxAmount = $paymentCode === 'pse' ? $opRequest->taxAmount ?? $opRequest->x_tax_amount : 0;
$totalAmount = $paymentCode === 'pse' ? $opRequest->totalAmount ?? $opRequest->x_total_amount : $opRequest->payment->amount->total;
if ((0 == $devolutionBase) && (0 == $taxAmount)) {
$addProductXml = explode('FILTRO', $orderProduct->getAddproductdata());
$addProductObj = \simplexml_load_string('<FILTRO' . $addProductXml[1] . 'FILTRO>');
$amount = (string) $addProductObj->data->product->fare_data->fare->base_amount;
$airportTax = $totalAmount - $amount;
} else {
$amount = $devolutionBase;
$airportTax = $totalAmount - ($devolutionBase + $taxAmount);
}
if($paymentCode != 'pse' && isset($opResponse->getTransactionInformationResult->status->status)) {
switch ($opResponse->getTransactionInformationResult->status->status) {
case 'OK':
case 'APPROVED':
case 'APPROVED_PARTIAL':
case 1:
$opResponse->getTransactionInformationResult->status->status = "1";
break;
case 'REJECTED':
case 'PARTIAL_EXPIRED':
case 'NOT_AUTHORIZED':
case 2:
$opResponse->getTransactionInformationResult->status->status = "2";
break;
case strpos($opResponse->getTransactionInformationResult->status->status, "PENDING"):
case 'MANUAL':
case 3:
$opResponse->getTransactionInformationResult->status->status = "3";
break;
default:
$opResponse->getTransactionInformationResult->status->status = "0";
break;
}
}
$responseCode = $paymentCode === 'pse' ? $opResponse->getTransactionInformationResult->responseCode ?? $opResponse->getTransactionInformationResult->transactionState
: $opResponse->getTransactionInformationResult->status->status;
$currency = $paymentCode === 'pse' ? $opRequest->currency ?? $opRequest->x_currency
: $opRequest->payment->amount->currency ?? $opRequest->x_currency;
$reference = $paymentCode === 'pse' ? $opRequest->reference ?? $opRequest->x_reference
: $opRequest->payment->reference ?? $opRequest->x_reference;
$transactionID = $paymentCode === 'pse' ? $opResponse->createTransactionResult->transactionID ?? $opResponse->id_transaccion
: $opResponse->getTransactionInformationResult->receipt ?? $opResponse->internalReference ?? $opResponse->id_transaccion;
$responseReasonCode = $paymentCode === 'pse' ? $opResponse->getTransactionInformationResult->responseReasonCode ?? null
: $opResponse->getTransactionInformationResult->status->reason ?? null;
$responseReasonText = $paymentCode === 'pse' ? $opResponse->getTransactionInformationResult->responseReasonText ?? null
: $opResponse->getTransactionInformationResult->status->message ?? null;
$description = $paymentCode === 'pse' ? $opRequest->description ?? $opRequest->x_description
: $opRequest->payment->description ?? $opRequest->x_description;
$emailAddress = $paymentCode === 'pse' ? $opRequest->payer->emailAddress ?? $opRequest->x_email
: $opRequest->payer->email ?? $opRequest->x_email;
$auth = $paymentCode === 'pse' ? $opResponse->getTransactionInformationResult->trazabilityCode : $opResponse->getTransactionInformationResult->authorization ?? $opResponse->getTransactionInformationResult->receipt;
$transactionDate = $paymentCode === 'pse' ? $opResponse->getTransactionInformationResult->bankProcessDate : $opResponse->getTransactionInformationResult->status->date;
$clientNames = $paymentCode === 'pse' ? $opRequest->payer->firstName . ' ' . $opRequest->payer->lastName : $opRequest->payer->name . ' ' . $opRequest->payer->surname;
/* Datos complementarios */
$payerDocumentNumber = ($opRequest->payer->document ?? $opRequest->x_cust_id);
$payerMobile = $opRequest->payer->mobile ?? $opRequest->x_phone ?? '';
$fee_base = $opRequest->feeBase ?? $opRequest->x_service_fee_base ?? 0;
$fee_tax = $opRequest->feeTax ?? $opRequest->x_service_fee_tax ?? 0;
$paymentResume = [
'transaction_state' => $responseCode,
'id' => $orderProduct->getBooking(),
'id_context' => $reference,
'currency' => $currency,
'total_amount' => $totalAmount,
'amount' => $amount,
'base_amount' => number_format(round((float) $totalAmount), 2, '.', ''),
'iva' => $taxAmount,
'airport_tax' => $airportTax,
'ip_address' => $opRequest->ipAddress,
'bank_name' => $bank_name,
'client_franquice' => ['description' => is_object($clientFranquice) ? $clientFranquice->getDescription() : 'PSE'],
'reference' => $transactionID,
'auth' => $auth,
'transaction_date' => $transactionDate,
'description' => $description,
'reason_code' => $responseReasonCode,
'reason_description' => $responseReasonText,
'client_names' => $clientNames,
'client_email' => $emailAddress,
'client_document_number' => $payerDocumentNumber,
'client_phone' => $payerMobile,
'card_num' => '--',
'cuotas' => '--',
'fee_base' => $fee_base,
'fee_tax' => $fee_tax,
];
}
// Mapear estado de cyber y tipo de pago
$paymentResume['transaction_state_cyber'] = $opResponse->x_response_code_cyber ?? '1';
$paymentResume['paymentData_type'] = $paymentData->type ?? null;
$resumeData["paymentResume"] = $paymentResume;
// Formatear datos de facturador en caso de auto-complete
$facturationResume = $resumeData["facturationResume"];
if (1 == $paymentResume['transaction_state'] && false !== strpos($facturationResume["customer_names"], '***')) {
$customer = $em->getRepository(\Aviatur\CustomerBundle\Entity\Customer::class)->find($detailInfo->BD->id);
$facturationResume = [
'customer_names' => $customer->getFirstname().' '.$customer->getLastname(),
'customer_address' => $customer->getAddress(),
'customer_doc_num' => $customer->getDocumentnumber(),
'customer_phone' => $customer->getPhone(),
'customer_email' => $customer->getEmail(),
];
$resumeData["facturationResume"] = $facturationResume;
}
} else {
// Información agencia
$agency = $em->getRepository(\Aviatur\AgencyBundle\Entity\Agency::class)->find($session->get("agencyId"));
$agencyData = [
"agency_name" => $agency->getName(),
"agency_nit" => $agency->getNit(),
"agency_phone" => $agency->getPhone(),
"agency_email" => $agency->getMailContact(),
];
// Cantidad de intentos
$retryCount = (int) $session->get($transactionId . "[bono][retry]");
// Obtener la información de la tarjeta regalo desde la sesión
$bonoInfo = json_decode(base64_decode($session->get($transactionId . "[bono][bonoInfo]")), true);
// Información pasajeros
$passenger = $detailInfo->PI;
if (false !== strpos($passenger->first_name_1_1, '***')) {
$customer = $em->getRepository(\Aviatur\CustomerBundle\Entity\Customer::class)->find($detailInfo->BD->id);
$passenger->first_name_1_1 = $customer->getFirstname();
$passenger->last_name_1_1 = $customer->getLastname();
$passenger->phone_1_1 = $customer->getPhone();
$passenger->email_1_1 = $customer->getEmail();
$passenger->address_1_1 = $customer->getAddress();
$passenger->doc_num_1_1 = $customer->getDocumentnumber();
}
$passangersData = json_decode(json_encode($passenger), true);
$travelers = [];
for ($i = 1; $i <= $passangersData["person_count_1"]; ++$i) {
$travelers[] = [
'typeCode' => $passangersData['passanger_type_1_'.$i],
'GivenName' => $passangersData['first_name_1_'.$i],
'Surname' => $passangersData['last_name_1_'.$i],
'Email' => $passangersData['email_1_'.$i],
'Phone' => $detailInfo->CD->phone,
'Doc_type' => $passangersData['doc_type_1_'.$i],
'Doc_number' => $passangersData['doc_num_1_'.$i],
];
}
// Información del facturador
$factInfo = $detailInfo->BD;
$facturationResume = [
"customer_names" => $factInfo->first_name . " " . $factInfo->last_name,
"customer_address" => $factInfo->address ?? null,
"customer_doc_num" => $factInfo->doc_num,
"customer_phone" => $factInfo->phone,
"customer_email" => $factInfo->email ?? null
];
// Valor totalizado
$totalAmountCOP = $bonoInfo["giftFarePrice"];
$x_amount_tax = number_format(0, 2, '.', '');
$x_amount_base = (number_format(round((float) $totalAmountCOP), 2, '.', ''));
// Descripción del producto
$description = 'Bono de Regalo - $'.$totalAmountCOP;
// Información de pago
$paymentResume = [
'id' => $orderProduct->getBooking(),
'id_context' => $orderInfo->order . '-' . $orderInfo->products,
'total_amount' => $totalAmountCOP,
'amount' => $x_amount_base,
'iva' => $x_amount_tax,
'currency' => $bonoInfo["currency"],
'ip_address' => $this->get_client_ip(),
'reference' => '',
'auth' => '',
'transaction_date' => $orderProduct->getCreationDate()->format('Y-m-d H:i:s'),
'description' => $description,
'reason_code' => '',
'reason_description' => '',
'paymentData_type' => $paymentData->type ?? null
];
// Información a guardar en Resume en BD
$resumeData = [
'agencyData' => $agencyData,
'retryCount' => $retryCount,
'facturationResume' => $facturationResume,
'bonoInfo' => $bonoInfo,
'paymentResume' => $paymentResume,
'transactionID' => $transactionId,
'travelers' => $travelers
];
}
// En caso de cash
if ($session->has($transactionId . '[bono][cash_result]')) {
$resumeData['paymentResume']['cash_result'] = json_decode($session->get($transactionId . '[bono][cash_result]'));
// Fecha de creación de la orden
$fecha = $orderProduct->getCreationDate()->format('Y-m-d H:i:s');
$fechalimite = $orderProduct->getCreationDate()->format('Y-m-d 23:40:00');
$nuevafecha = strtotime('+5 hour', strtotime($fecha));
$fechavigencia = date('Y-m-d H:i:s', $nuevafecha);
if (strcmp($fechavigencia, $fechalimite) > 0) {
$fechavigencia = $fechalimite;
}
$resumeData['paymentResume']['fecha_vigencia'] = $fechavigencia;
// NameArchive pdf en CASH
$resumeData['paymentResume']['NameArchive'] = $paymentResume['id_context'] . '_' . $transactionId . '.pdf';
}
// En caso de ser front
if ($isFront) {
$resumeData['paymentResume']['transaction_state'] = 1;
}
// reintento de pago
$resumeData['backDetail'] = $this->generateUrl('aviatur_gift_voucher_retry_secure');
// En caso de error en la emision del Bono
if ($session->has($transactionId.'[bono][emission][error]')) {
$resumeData['emission_error'] = true;
}
$orderProduct->setResume(json_encode($resumeData));
$em->persist($orderProduct);
$em->flush();
}
// Obtener ip del cliente
private function get_client_ip()
{
$ipaddress = '';
if (getenv('HTTP_CLIENT_IP')) {
$ipaddress = getenv('HTTP_CLIENT_IP');
} elseif (getenv('HTTP_X_FORWARDED_FOR')) {
$ipaddress = getenv('HTTP_X_FORWARDED_FOR');
} elseif (getenv('HTTP_X_FORWARDED')) {
$ipaddress = getenv('HTTP_X_FORWARDED');
} elseif (getenv('HTTP_FORWARDED_FOR')) {
$ipaddress = getenv('HTTP_FORWARDED_FOR');
} elseif (getenv('HTTP_FORWARDED')) {
$ipaddress = getenv('HTTP_FORWARDED');
} elseif (getenv('REMOTE_ADDR')) {
$ipaddress = getenv('REMOTE_ADDR');
} else {
$ipaddress = 'UNKNOWN';
}
return (strpos($ipaddress, ',') !== false) ? trim(explode(',', $ipaddress)[0]) : (substr_count($ipaddress, ':') > 1 ? $ipaddress : explode(':', $ipaddress)[0]);
}
/**
* 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;
}
}