<?php
namespace Aviatur\GiftVoucherBundle\Controller;
use Aviatur\GeneralBundle\Entity\FormUserInfo;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Aviatur\GeneralBundle\Services\AviaturEncoder;
use Aviatur\GeneralBundle\Services\AviaturErrorHandler;
use Aviatur\TwigBundle\Services\TwigFolder;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Routing\RouterInterface;
use Aviatur\GeneralBundle\Services\AviaturWebService;
use Aviatur\PaymentBundle\Services\CustomerMethodPaymentService;
use Aviatur\PaymentBundle\Services\TokenizerService;
use Aviatur\GeneralBundle\Controller\OrderController;
use Aviatur\PaymentBundle\Controller\P2PController;
use Aviatur\PaymentBundle\Controller\WorldPayController;
use Aviatur\PaymentBundle\Controller\PSEController;
use Aviatur\PaymentBundle\Controller\CashController;
use Aviatur\PaymentBundle\Controller\SafetypayController;
use Aviatur\GiftVoucherBundle\Services\EmissionWebservice;
use Aviatur\GeneralBundle\Services\AviaturLogSave;
class DefaultController extends AbstractController
{
public function searchAction()
{
return $this->redirect(
$this->generateUrl(
'aviatur_gift_voucher_detail_secure',
[]
)
);
}
public function detailAction(TwigFolder $twigFolder, AviaturWebService $aviaturWebService, AviaturErrorHandler $aviaturErrorHandler, ManagerRegistry $registry, SessionInterface $session, ParameterBagInterface $parameterBag, $value = null)
{
$transactionIdSessionName = $parameterBag->get('transaction_id_session_name');
$em = $registry->getManager();
$agency = $em->getRepository(\Aviatur\AgencyBundle\Entity\Agency::class)->find($session->get('agencyId'));
$isFront = $session->has('operatorId');
$giftVoucherConfigObject = $em->getRepository(\Aviatur\GiftVoucherBundle\Entity\ConfigGiftVoucherAgency::class)->findParamsByAgency($agency);
if (null == $giftVoucherConfigObject || (is_countable($giftVoucherConfigObject) ? count($giftVoucherConfigObject) : 0) == 0) {
return $this->redirect($aviaturErrorHandler->errorRedirect($this->generateUrl('aviatur_general_homepage'), '', 'No se encontró configuración para esta Agencia.'));
}
$giftVoucherConfig = json_decode($giftVoucherConfigObject[0]['params'], true);
if ($agency->getDomainsecure() == $agency->getDomain() && '443' != $agency->getCustomport()) {
$safeUrl = 'https://'.$agency->getDomain();
} else {
$safeUrl = 'https://'.$agency->getDomainsecure();
}
$giftVoucherFares = $giftVoucherConfig['fares'];
$giftVoucherParams = [
'minValue' => $giftVoucherConfig['minValue'],
'maxValue' => $giftVoucherConfig['maxValue'],
];
$documentType = $em->getRepository(\Aviatur\CustomerBundle\Entity\DocumentType::class)->findAll();
$paymentMethodAgency = $em->getRepository(\Aviatur\GeneralBundle\Entity\PaymentMethodAgency::class)->findBy(['agency' => $agency, 'isactive' => 1]);
$paymentOptions = [];
$repositoryDocumentType = $em->getRepository(\Aviatur\CustomerBundle\Entity\DocumentType::class);
$queryDocumentType = $repositoryDocumentType
->createQueryBuilder('p')
->where('p.paymentcode != :paymentcode')
->setParameter('paymentcode', '')
->getQuery();
$documentPaymentType = $queryDocumentType->getResult();
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');
// if ($session->has($transactionId . '[bono][retry]') === true) {
// echo ' entra retry !!';
// $detailInfo = json_decode($session->get($transactionId . '[bono][detail_data_bono]'), true);
// $twig_readonly = true;
// $passangerInfo = $detailInfo['PI'];
// $billingData = $detailInfo['BD'];
// $contactData = $detailInfo['CD'];
// } else {
// echo ' Datos nuevos !!';
$passangerTypes = [];
$passangerTypes[1]['ADT'] = 1;
$passangerTypes[1]['CHD'] = 0;
$passangerTypes[1]['INF'] = 0;
$transactionIdResponse = $aviaturWebService->loginService('SERVICIO_MPT', 'dummy|http://www.aviatur.com.co/dummy/', []);
if ('error' == $transactionIdResponse || is_array($transactionIdResponse)) {
$aviaturErrorHandler->errorRedirect('', 'Error MPA', 'No se creo Login!');
return new Response('Estamos experimentando dificultades técnicas en este momento.');
}
$transactionId = (string) $transactionIdResponse;
$session->set($transactionIdSessionName, $transactionId);
$twig_readonly = false;
// }
//
// die;
$detailData = [
'safeUrl' => $safeUrl,
'currency' => 'COP',
'giftValue' => 50000,
'twig_readonly' => $twig_readonly,
'passengers' => $passangerInfo ?? null,
'billingData' => $billingData ?? null,
'contactData' => $contactData ?? null,
'payment_doc_type' => $documentPaymentType,
'doc_type' => $documentType,
'conditions' => $conditions,
'paymentOptions' => $paymentOptions,
'cybersource' => $cybersource,
'banks' => $banks,
'cards' => $em->getRepository(\Aviatur\GeneralBundle\Entity\Card::class)->findAll(),
'payment_type_form_name' => 'paymentForm',
'services' => $passangerTypes,
'resumed_data' => true,
'giftVoucherFares' => $giftVoucherFares,
'giftVoucherParams' => $giftVoucherParams,
'pse' => 1,
];
$agencyFolder = $twigFolder->twigFlux();
return $this->render($twigFolder->twigExists('@AviaturTwig/'.$agencyFolder.'/GiftVoucher/Default/detail.html.twig'), $detailData);
}
public function prePaymentStep1Action(Request $request, TokenizerService $tokenizer, CustomerMethodPaymentService $customerMethodPaymentService, TokenStorageInterface $tokenStorage, AviaturEncoder $aviaturEncoder, TwigFolder $twigFolder, AviaturWebService $aviaturWebService, AviaturErrorHandler $aviaturErrorHandler, ManagerRegistry $registry, SessionInterface $session, ParameterBagInterface $parameterBag)
{
$transactionIdSessionName = $parameterBag->get('transaction_id_session_name');
if ($request->isXmlHttpRequest()) {
$request = $request->request;
$billingData = $request->get('BD');
$em = $registry->getManager();
$postData = $request->all();
$transactionIdResponse = $aviaturWebService->loginService('SERVICIO_MPT', 'dummy|http://www.aviatur.com.co/dummy/', []);
if ('error' == $transactionIdResponse || is_array($transactionIdResponse)) {
$aviaturErrorHandler->errorRedirect('', 'Error MPA', 'No se creo Login!');
return new Response('Estamos experimentando dificultades técnicas en este momento.');
}
$transactionId = (string) $transactionIdResponse;
$session->set($transactionIdSessionName, $transactionId);
$provider = $em->getRepository(\Aviatur\MpaBundle\Entity\Provider::class)->findBy(['name' => 'Bono de regalo']);
$session->set($transactionId.'[bono][provider]', $provider[0]->getProvideridentifier());
$publicKey = $aviaturEncoder->aviaturRandomKey();
if (isset($postData['PD']['card_num'])) {
$postDataInfo = $postData;
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;
$postData['PD']['card_num'] = $cardToken;
} else {
$postDataInfo['PD']['card_num'] = $tokenizer->getToken($postData['PD']['card_num']);
}
$postData['PD']['card_values'] = ['card_num_token' => $postDataInfo['PD']['card_num'], 'card_num' => $postData['PD']['card_num']];
}
$encodedInfo = $aviaturEncoder->AviaturEncode(json_encode($postDataInfo ?? $postData), $publicKey);
$formUserInfo = new FormUserInfo();
$formUserInfo->setInfo($encodedInfo);
$formUserInfo->setPublicKey($publicKey);
$em->persist($formUserInfo);
$em->flush();
$session->set($transactionId.'[bono][user_info]', $formUserInfo->getId());
if ((true !== $session->has($transactionId.'[bono][retry]')) || (true !== $session->has($transactionId.'[bono][prepayment_check]'))) {
$session->set($transactionId.'[bono][detail_data_bono]', json_encode($postData));
$passangersData = $request->get('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']);
}
}
$isFront = $session->has('operatorId');
if ($isFront) {
$customer = null;
$ordersProduct = null;
} else {
$customer = $em->getRepository(\Aviatur\CustomerBundle\Entity\Customer::class)->find($billingData['id']);
$ordersProduct = $em->getRepository(\Aviatur\GeneralBundle\Entity\OrderProduct::class)->getOrderProductsPending($customer);
}
if (null == $ordersProduct) {
$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 $this->json([
'error' => 'pending payments',
'message' => 'pending_payments',
'booking' => $booking,
'cus' => $cus,
]);
}
} else {
$paymentData = $request->get('PD');
$paymentData = json_decode(json_encode($paymentData));
$json = json_decode($session->get($transactionId.'[bono][order]'));
if (!is_null($json)) {
$json->ajax_url = $this->generateUrl('aviatur_gift_voucher_prepayment_step_2_secure');
// reemplazar datos de pago por los nuevos.
$oldPostData = json_decode($session->get($transactionId.'[bono][detail_data_bono]'));
if (isset($paymentData->cusPOptSelected) || isset($paymentData->card_num)) {
if (isset($paymentData->cusPOptSelected)) {
$customerLogin = $tokenStorage->getToken()->getUser();
$infoMethodPaymentByClient = $customerMethodPaymentService->getMethodsByCustomer($customerLogin, true);
$card_num_token = $infoMethodPaymentByClient['info'][$paymentData->cusPOptSelected]['token'];
} else {
$card_num_token = $tokenizer->getToken($paymentData->card_num);
}
$card_values = ['card_num_token' => $card_num_token, 'card_num' => $paymentData->card_num];
}
unset($oldPostData->PD);
$oldPostData->PD = $paymentData;
if (isset($card_num_token)) {
$oldPostData->PD->card_values = $card_values;
}
$session->set($transactionId.'[bono][detail_data_bono]', json_encode($oldPostData));
$response = new Response(json_encode($json));
$response->headers->set('Content-Type', 'application/json');
return $response;
} else {
return $this->json(['error' => 'fatal', 'message' => $aviaturErrorHandler->errorRedirect($session->get($transactionId.'[availability_url]'), '', 'No encontramos datos de tu orden, por favor inténtalo nuevamente')]);
}
}
} else {
return $this->redirect($aviaturErrorHandler->errorRedirect($twigFolder->pathWithLocale('aviatur_general_homepage'), '', 'Acceso no autorizado'));
}
}
public function prePaymentStep2Action(Request $request, OrderController $orderController, TwigFolder $twigFolder, AviaturErrorHandler $aviaturErrorHandler, ManagerRegistry $registry, SessionInterface $session, ParameterBagInterface $parameterBag)
{
$transactionIdSessionName = $parameterBag->get('transaction_id_session_name');
$aviaturPaymentRetryTimes = $parameterBag->get('aviatur_payment_retry_times');
$order = [];
if ($request->isXmlHttpRequest()) {
$request = $request->request;
$em = $registry->getManager();
$agency = $em->getRepository(\Aviatur\AgencyBundle\Entity\Agency::class)->find($session->get('agencyId'));
$billingData = $request->get('BD');
$transactionId = $session->get($transactionIdSessionName);
$session->set($transactionId.'[bono][prepayment_check]', true);
if (true !== $session->has($transactionId.'[bono][order]')) {
$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';
}
if (isset($agency)) {
$productType = $em->getRepository(\Aviatur\MpaBundle\Entity\ProductType::class)->findByCode('BONO');
// $orderIdentifier = $this->generateRamdonCode();
$orderIdentifier = '{order_product_num}';
$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][user_info]'));
$formUserInfo->setOrder($orderEntity);
$em->persist($formUserInfo);
$em->flush();
if ($isFront) {
// $this->outputFront();
$order['url'] = $this->generateUrl('aviatur_gift_voucher_generar_bono');
} else {
$session->set($transactionId.'[bono][retry]', $aviaturPaymentRetryTimes);
$order['url'] = $this->generateUrl('aviatur_gift_voucher_payment_secure');
}
return $this->json($order);
} else {
return $this->redirect($aviaturErrorHandler->errorRedirect($twigFolder->pathWithLocale('aviatur_general_homepage'), '', 'No se encontró la agencia con el dominio: '.$request->getHost()));
// redireccionar al home y enviar mensaje modal
}
} else {
$order['url'] = $this->generateUrl('aviatur_gift_voucher_payment_secure');
return $this->json($order);
}
} else {
return $this->redirect($aviaturErrorHandler->errorRedirect($twigFolder->pathWithLocale('aviatur_general_homepage'), '', 'Acceso no autorizado'));
}
}
public function paymentAction(Request $request, \Swift_Mailer $mailer, CashController $cashPaymentController, RouterInterface $router, SafetypayController $safetyPayController, WorldPayController $worldPaymentController, P2PController $p2pPaymentController, PSEController $psePaymentController, TwigFolder $twigFolder, AviaturErrorHandler $aviaturErrorHandler, ManagerRegistry $registry, SessionInterface $session, ParameterBagInterface $parameterBag, TokenizerService $tokenizer, CustomerMethodPaymentService $customerMethodPaymentService, AviaturLogSave $logSave)
{
$transactionIdSessionName = $parameterBag->get('transaction_id_session_name');
$emailNotification = $parameterBag->get('email_notification');
$orderProduct = [];
$paymentResponse = null;
$return = null;
$emissionData = [];
$response = null;
$array = [];
$em = $registry->getManager();
$transactionId = $session->get($transactionIdSessionName);
$fullRequest = $request;
$domain = $fullRequest->getHost();
$parametersJson = $session->get($domain.'[parameters]');
$parameters = json_decode($parametersJson);
$agency = $em->getRepository(\Aviatur\AgencyBundle\Entity\Agency::class)->find($session->get('agencyId'));
$postData = json_decode($session->get($transactionId.'[bono][detail_data_bono]'));
$orderInfo = json_decode($session->get($transactionId.'[bono][order]'));
$productId = str_replace('PN', '', $orderInfo->products);
$orderProduct[] = $em->getRepository(\Aviatur\GeneralBundle\Entity\OrderProduct::class)->find($productId);
$orderProduct[0]->setProductIdAviatur('ServiceOffLine');
$orderProduct[0]->setPaymentidaviatur('ServiceOffLine');
$em->persist($orderProduct[0]);
$em->flush();
$paymentData = $postData->PD;
$recipientData = $postData->PI;
$giftArray = explode(',', base64_decode($postData->GV->giftSelected));
$giftVoucherValue = 0;
$codeGift = base64_decode($giftArray[1]);
$giftVoucherConfigObject = $em->getRepository(\Aviatur\GiftVoucherBundle\Entity\ConfigGiftVoucherAgency::class)->findParamsByAgency($agency);
if (null == $giftVoucherConfigObject || (is_countable($giftVoucherConfigObject) ? count($giftVoucherConfigObject) : 0) == 0) {
return $this->redirect($aviaturErrorHandler->errorRedirect($this->generateUrl('aviatur_general_homepage'), '', 'No se encontró configuración para esta Agencia.'));
}
$giftVoucherConfig = json_decode($giftVoucherConfigObject[0]['params'], true);
foreach ($giftVoucherConfig['fares'] as $giftVoucherFares) {
if ($giftVoucherFares['code'] == $codeGift) {
$giftVoucherValue = $giftVoucherFares['value'];
}
}
if (0 == $giftVoucherValue) {
$valueGift = round(((int) (substr($giftArray[0], -3)) * 9) / 3);
if ($valueGift == $codeGift) {
$giftVoucherValue = (int) substr($giftArray[0], 0, -3) - (int) $valueGift;
} else {
return $this->redirect($aviaturErrorHandler->errorRedirect($this->generateUrl('aviatur_general_homepage'), '', '1 No se encontro informacion del producto solicitado '));
}
}
$customer = $em->getRepository(\Aviatur\CustomerBundle\Entity\Customer::class)->find($postData->BD->id);
$x_amount_total = $giftVoucherValue;
$x_amount_base = round((float) $x_amount_total / (1 + (float) $parameters->aviatur_payment_iva));
$x_amount_tax = round((float) $x_amount_total * (1 - (1 / (1 + (float) $parameters->aviatur_payment_iva))));
$description = 'Bono de Regalo - $'.$x_amount_total;
if ('p2p' == $paymentData->type || 'world' == $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' => (string) 'COP',
'x_amount' => number_format(round((float) ($x_amount_total)), 0, '.', ''),
'x_tax' => number_format(round((float) ($x_amount_tax)), 2, '.', ''),
'x_amount_base' => number_format(round((float) ($x_amount_base)), 2, '.', ''),
'x_invoice_num' => $orderInfo->order.'-'.$orderInfo->products,
'x_first_name' => $paymentData->first_name,
'x_last_name' => $paymentData->last_name,
'x_description' => $description,
'x_cust_id' => $customer->getDocumentType()->getPaymentcode().' '.$customer->getDocumentnumber(),
'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',
];
if (isset($paymentData->card_values)) {
$array['card_values'] = (array) $paymentData->card_values;
}
if ('p2p' == $paymentData->type) {
if (isset($paymentData->cusPOptSelected)) {
$array['isToken'] = (string) $paymentData->card_values->card_num_token;
}
if (isset($postData->PD->savePaymProc)) {
$array['x_provider_id'] = 1;
} elseif (isset($paymentData->cusPOptSelected)) {
if (isset($paymentData->cusPOptSelectedStatus)) {
if ('NOTVERIFIED' == $paymentData->cusPOptSelectedStatus) {
$array['x_provider_id'] = 1;
} else {
$array['x_provider_id'] = 2;
}
} else {
$array['x_provider_id'] = 2;
}
}
}
if ('p2p' == $paymentData->type) {
$paymentResponse = $p2pPaymentController->placetopayAction($parameterBag, $tokenizer, $customerMethodPaymentService, $mailer, $logSave, $array);
$return = $this->redirect($this->generateUrl('aviatur_gift_voucher_payment_p2p_return_url_secure', [], true));
} elseif ('world' == $paymentData->type) {
$array['city'] = $customer->getCity()->getIatacode();
$array['countryCode'] = $customer->getCity()->getCountry()->getIatacode();
$paymentResponse = $worldPaymentController->worldAction($array);
$return = $this->redirect($this->generateUrl('aviatur_gift_voucher_payment_world_return_url_secure', [], true));
}
unset($array['x_client_id']);
if (null != $paymentResponse) {
return $return;
} else {
$orderProduct[0]->setStatus('pending');
$em->persist($orderProduct[0]);
$em->flush();
return $this->redirect($aviaturErrorHandler->errorRedirect($this->generateUrl('aviatur_gift_voucher_retry_secure'), '', 'No hay respuesta por parte del servicio de pago, por favor intenta nuevamente o comunícate con nosotros para finalizar tu transacción'));
}
} elseif ('pse' == $paymentData->type) {
$array = ['x_doc_num' => $customer->getDocumentnumber(),
'x_doc_type' => $customer->getDocumentType()->getPaymentcode(),
'x_first_name' => $customer->getFirstname(),
'x_last_name' => $customer->getLastname(),
'x_company' => 'Aviatur',
'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' => 'COP',
'x_total_amount' => $x_amount_total,
'x_tax_amount' => number_format(round($x_amount_tax), 2, '.', ''),
'x_devolution_base' => number_format(round($x_amount_base), 2, '.', ''),
'x_tip_amount' => number_format(round(0), 2, '.', ''),
'product_type' => 'bono',
];
$paymentResponse = $psePaymentController->sendPaymentAction($array, $orderProduct);
if (!isset($paymentResponse->error)) {
switch ($paymentResponse->createTransactionResult->returnCode) {
case 'SUCCESS':
return $this->redirect($paymentResponse->createTransactionResult->bankURL);
case 'FAIL_EXCEEDEDLIMIT':
return $this->redirect($aviaturErrorHandler->errorRedirect($twigFolder->pathWithLocale('aviatur_general_homepage'), '', 'Tu reserva fue realizada exitosamente, sin embargo, el monto excede los límites establecidos, comuníate 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.'));
case 'FAIL_BANKUNREACHEABLE':
return $this->redirect($aviaturErrorHandler->errorRedirect($this->generateUrl('aviatur_gift_voucher_retry_secure'), '', 'Tu entidad financiera no pudo ser contactada para iniciar la transacción, por favor inténtalo nuevamente'));
default:
return $this->redirect($aviaturErrorHandler->errorRedirect($this->generateUrl('aviatur_gift_voucher_retry_secure'), '', 'No se pudo crear la transacción con tu banco, por favor inténtalo nuevamente'));
}
} else {
return $this->redirect($aviaturErrorHandler->errorRedirect($this->generateUrl('aviatur_gift_voucher_retry_secure'), 'Error al procesar el pago', 'Ocurrió un problema al intentar crear tu transacción, '.$paymentResponse->error));
}
} elseif ('safety' == $paymentData->type) {
$orderProductCode = json_decode($session->get($transactionId.'[bono][order]'));
$transactionUrl = $this->generateUrl('aviatur_payment_safetypay', [], true);
$productId = str_replace('PN', '', $orderProductCode->products);
$Product = $em->getRepository(\Aviatur\GeneralBundle\Entity\OrderProduct::class)->find($productId);
$array = ['x_doc_num' => $customer->getDocumentnumber(),
'x_doc_type' => $customer->getDocumentType()->getPaymentcode(),
'x_first_name' => $customer->getFirstname(),
'x_last_name' => $customer->getLastname(),
'x_company' => 'Aviatur',
'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_reference' => $orderInfo->products,
'x_booking' => $Product->getBooking(),
'x_description' => $description,
'x_currency' => 'COP',
'x_total_amount' => $x_amount_total,
'x_tax_amount' => number_format(round($x_amount_tax), 2, '.', ''),
'x_devolution_base' => number_format(round($x_amount_base), 2, '.', ''),
'x_tip_amount' => number_format(round(0), 2, '.', ''),
'x_payment_data' => $paymentData->type,
'x_type_description' => $orderProduct[0]->getDescription(),
];
$parametMerchant = [
'MerchantSalesID' => $array['x_reference'],
'Amount' => $array['x_total_amount'],
'transactionUrl' => $transactionUrl,
'dataTrans' => $array,
];
$safeTyPay = $safetyPayController->safetyAction($router, $parameterBag, $mailer, $parametMerchant, $array);
if ('ok' == $safeTyPay['status']) {
if ('baloto' == $paymentData->type) {
$cash = '&CountryId=COL&ChannelId=CASH';
$session->set($transactionId.'[bono][retry]', 0);
return $this->redirect($safeTyPay['response'].$cash);
} else {
return $this->redirect($safeTyPay['response']);
}
} else {
$emissionData->x_booking = $array['x_booking'];
$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_resultSafetyPay = $safeTyPay;
$mailInfo = print_r($emissionData, true).'<br>'.print_r($response, true);
$message = (new \Swift_Message())
->setContentType('text/html')
->setFrom($session->get('emailNoReply'))
->setTo('errores.prod.web@aviatur.com')
->setSubject('Error Creación Token SafetyPay'.$emissionData->x_reference)
->setBody($mailInfo);
$mailer->send($message);
return $this->redirect($this->generateUrl('aviatur_gift_voucher_payment_rejected_secure'));
}
} elseif ('cash' == $paymentData->type) {
$agency = $em->getRepository(\Aviatur\AgencyBundle\Entity\Agency::class)->find($session->get('agencyId'));
$agencyName = $agency->getOfficeId();
$array['x_officeId'] = $agencyName;
$array['x_doc_num'] = $customer->getDocumentnumber();
$array['x_doc_type'] = $customer->getDocumentType()->getPaymentcode();
$array['x_first_name'] = $customer->getFirstname();
$array['x_last_name'] = $customer->getLastname();
$array['x_company'] = 'Aviatur';
$array['x_email'] = $customer->getEmail();
$array['x_address'] = $customer->getAddress();
$array['x_city'] = $customer->getCity()->getDescription();
$array['x_province'] = $customer->getCity()->getDescription();
$array['x_country'] = $customer->getCountry()->getDescription();
$array['x_phone'] = $customer->getPhone();
$array['x_mobile'] = $customer->getCellphone();
$array['x_payment_data'] = $paymentData->type;
$array['x_type_description'] = $orderProduct[0]->getDescription();
$array['x_reference'] = $orderInfo->products;
$array['x_total_amount'] = $x_amount_total;
$array['x_currency'] = 'COP';
$array['x_description'] = $description;
$array['x_booking'] = $orderProduct[0]->getBooking();
$fecha = $orderProduct[0]->getCreationDate()->format('Y-m-d H:i:s');
$fechalimite = $orderProduct[0]->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;
}
$array['x_fechavigencia'] = $fechavigencia;
$array['x_transactionId'] = $transactionId;
$retryCount = (int) $session->get($transactionId.'[bono][retry]');
$route = $router->match(str_replace($request->getSchemeAndHttpHost(), '', $request->getUri()));
$isMulti = false !== strpos($route['_route'], 'multi') ? true : false;
if ($isMulti) {
return $this->json($array);
} elseif ($session->has($transactionId.'[bono][detail_cash]')) {
$detail_cash = json_decode($session->get($transactionId.'[bono][detail_cash]'));
if ('error' == $detail_cash->status) {
$cashPay = $cashPaymentController->cashAction($array);
} else {
$cashPay = json_decode($session->get($transactionId.'[bono][detail_cash]'));
}
} else {
$cashPay = $cashPaymentController->cashAction($array);
$session->set($transactionId.'[bono][detail_cash]', json_encode($cashPay));
}
$bookingId = $this->generateRamdonCode();
$voucherData = [
'empresaId' => '10',
'productId' => $productId,
'bonoId' => $bookingId,
'ammount' => $x_amount_total,
'currency' => 'COP',
'documentNumber' => $orderProduct[0]->getOrder()->getCustomer()->getDocumentnumber(),
'status' => 'EMT',
'documentType' => $orderProduct[0]->getOrder()->getCustomer()->getDocumentType()->getExternalcode(),
'name' => $orderProduct[0]->getOrder()->getCustomer()->getFirstname().' '.$orderProduct[0]->getOrder()->getCustomer()->getLastname(),
'email' => $orderProduct[0]->getOrder()->getCustomer()->getEmail(),
'phone' => $orderProduct[0]->getOrder()->getCustomer()->getPhone(),
'recipient_name' => $recipientData->first_name_1_1.' '.$recipientData->last_name_1_1,
'recipient_mail' => $recipientData->email_1_1,
'recipient_phone' => $postData->CD->phone,
'recipient_document' => $recipientData->doc_num_1_1,
];
$outputInfo = $this->prepareOutputInfo();
$orderProduct[0]->setResume(json_encode($outputInfo));
$orderProduct[0]->setEmissiondata($bookingId);
$orderProduct[0]->setEmail(json_encode($voucherData));
$em->persist($orderProduct[0]);
$em->flush();
if ('ok' == $cashPay->status) {
$session->set($transactionId.'[bono][cash_result]', json_encode($cashPay));
return $this->redirect($this->generateUrl('aviatur_gift_voucher_confirmation_success_secure'));
} 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'];
$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);
$session->set($transactionId.'[bono][retry]', $retryCount - 1);
return $this->redirect($this->generateUrl('aviatur_gift_voucher_payment_rejected_secure'));
}
} else {
return $this->redirect($aviaturErrorHandler->errorRedirect($this->generateUrl('aviatur_gift_voucher_retry_secure'), '', 'El tipo de pago es invalido'));
}
}
public function p2pCallbackAction(ManagerRegistry $registry, CustomerMethodPaymentService $customerMethodPaymentService, OrderController $orderController, TokenStorageInterface $tokenStorage, AviaturEncoder $aviaturEncoder, AviaturErrorHandler $aviaturErrorHandler, SessionInterface $session, ParameterBagInterface $parameterBag, EmissionWebservice $emmisionWebService)
{
$transactionIdSessionName = $parameterBag->get('transaction_id_session_name');
$em = $registry->getManager();
$transactionId = $session->get($transactionIdSessionName);
$detailInfo = json_decode($session->get($transactionId.'[bono][detail_data_bono]'));
$orderProductCode = $session->get($transactionId.'[bono][order]');
$productId = str_replace('PN', '', json_decode($orderProductCode)->products);
$orderProduct = $em->getRepository(\Aviatur\GeneralBundle\Entity\OrderProduct::class)->find($productId);
$bookingId = $this->generateRamdonCode();
$decodedRequest = json_decode($aviaturEncoder->AviaturDecode($orderProduct->getPayrequest(), $orderProduct->getPublicKey()));
$decodedResponse = json_decode($aviaturEncoder->AviaturDecode($orderProduct->getPayresponse(), $orderProduct->getPublicKey()));
if (null != $decodedResponse) {
$orderController->updatePaymentAction($orderProduct);
$twig = '';
$retryCount = (int) $session->get($transactionId.'[bono][retry]');
$voucherData = [
'empresaId' => '10',
'productId' => $productId,
'bonoId' => $bookingId,
'ammount' => $decodedRequest->x_amount,
'currency' => 'COP',
'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,
];
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) {
if (1 == $parameters->getValue()) {
if (1 == $decodedResponse->x_response_code) {
$postData = json_decode($session->get($transactionId.'[bono][detail_data_bono]'));
if (isset($postData->PD->cusPOptSelected)) {
if (isset($postData->PD->cusPOptSelectedStatus)) {
if ('NOTVERIFIED' == $postData->PD->cusPOptSelectedStatus) {
$postData->PD->cusPOptSelectedStatus = 'ACTIVE';
$customerLogin = $tokenStorage->getToken()->getUser();
$customerMethodPaymentService->setMethodsByCustomer($customerLogin, json_decode(json_encode($postData), true));
}
}
}
if (isset($postData->PD->savePaymProc)) {
$customerLogin = $tokenStorage->getToken()->getUser();
$customerMethodPaymentService->setMethodsByCustomer($customerLogin, json_decode(json_encode($postData), true));
}
}
}
}
$orderProduct = $this->emitirBono($emmisionWebService, $session, $orderProduct, $voucherData, $productId, $transactionId, $bookingId);
$twig = 'aviatur_gift_voucher_payment_rejected_secure';
break;
case 3:// pendiente p2p
$twig = '' != $twig ? $twig : 'aviatur_gift_voucher_payment_pending_secure';
$orderProduct->setEmissiondata($bookingId);
$orderProduct->setEmail(json_encode($voucherData));
$orderProduct->setUpdatingdate(new \DateTime());
$outputInfo = $this->prepareOutputInfo();
$orderProduct->setResume(json_encode($outputInfo));
$retryCount = 1;
break;
case 0:// error p2p
$twig = 'aviatur_gift_voucher_payment_error_secure';
// no break
case 2:// rechazada p2p
$twig = '' != $twig ? $twig : 'aviatur_gift_voucher_payment_rejected_secure';
break;
case 1:// aprobado p2p
$postData = json_decode($session->get($transactionId.'[bono][detail_data_bono]'));
if (isset($postData->PD->cusPOptSelected)) {
if (isset($postData->PD->cusPOptSelectedStatus)) {
if ('NOTVERIFIED' == $postData->PD->cusPOptSelectedStatus) {
$postData->PD->cusPOptSelectedStatus = 'ACTIVE';
$customerLogin = $tokenStorage->getToken()->getUser();
$customerMethodPaymentService->setMethodsByCustomer($customerLogin, json_decode(json_encode($postData), true));
}
}
}
if (isset($postData->PD->savePaymProc)) {
$customerLogin = $tokenStorage->getToken()->getUser();
$customerMethodPaymentService->setMethodsByCustomer($customerLogin, json_decode(json_encode($postData), true));
}
$twig = 'aviatur_gift_voucher_payment_success_secure';
$orderProduct = $this->emitirBono($emmisionWebService, $session, $orderProduct, $voucherData, $productId, $transactionId, $bookingId);
break;
}
$em->persist($orderProduct);
$em->flush();
$session->set($transactionId.'[bono][retry]', $retryCount - 1);
return $this->redirect($this->generateUrl($twig));
} else {
$orderProduct->setStatus('pending');
$em->persist($orderProduct);
$em->flush();
return $this->redirect($aviaturErrorHandler->errorRedirect($this->generateUrl('aviatur_gift_voucher_retry_secure'), '', 'No hay respuesta por parte del servicio de pago'));
}
}
public function generarBonofrontAction(ManagerRegistry $registry, AviaturErrorHandler $aviaturErrorHandler, SessionInterface $session, ParameterBagInterface $parameterBag, EmissionWebservice $emmisionWebService)
{
$transactionIdSessionName = $parameterBag->get('transaction_id_session_name');
$em = $registry->getManager();
$transactionId = $session->get($transactionIdSessionName);
$detailInfo = json_decode($session->get($transactionId.'[bono][detail_data_bono]'));
$orderProductCode = $session->get($transactionId.'[bono][order]');
$productId = str_replace('PN', '', json_decode($orderProductCode)->products);
$orderProduct = $em->getRepository(\Aviatur\GeneralBundle\Entity\OrderProduct::class)->find($productId);
$bookingId = $this->generateRamdonCode();
$agency = $em->getRepository(\Aviatur\AgencyBundle\Entity\Agency::class)->find($session->get('agencyId'));
$isFront = $session->has('operatorId');
$additionalUserFront = simplexml_load_string($session->get('front_user_additionals'));
$giftArray = explode(',', base64_decode($detailInfo->GV->giftSelected));
$giftVoucherValue = 0;
$codeGift = base64_decode($giftArray[1]);
$giftVoucherConfigObject = $em->getRepository(\Aviatur\GiftVoucherBundle\Entity\ConfigGiftVoucherAgency::class)->findParamsByAgency($agency);
if (null == $giftVoucherConfigObject || (is_countable($giftVoucherConfigObject) ? count($giftVoucherConfigObject) : 0) == 0) {
return $this->redirect($aviaturErrorHandler->errorRedirect($this->generateUrl('aviatur_general_homepage'), '', 'No se encontró configuración para esta Agencia.'));
}
$giftVoucherConfig = json_decode($giftVoucherConfigObject[0]['params'], true);
foreach ($giftVoucherConfig['fares'] as $giftVoucherFares) {
if ($giftVoucherFares['code'] == $codeGift) {
$giftVoucherValue = $giftVoucherFares['value'];
}
}
if (0 == $giftVoucherValue) {
$valueGift = round(((int) (substr($giftArray[0], -3)) * 9) / 3);
if ($valueGift == $codeGift) {
$giftVoucherValue = (int) substr($giftArray[0], 0, -3) - (int) $valueGift;
} else {
return $this->redirect($aviaturErrorHandler->errorRedirect($this->generateUrl('aviatur_general_homepage'), '', '1 No se encontro informacion del producto solicitado '));
}
}
$voucherData = [
'empresaId' => '10',
'productId' => $productId,
'bonoId' => $bookingId,
'ammount' => (float) $giftVoucherValue,
'currency' => 'COP',
'documentNumber' => $detailInfo->BD->doc_num,
'status' => 'EMT',
'documentType' => $detailInfo->BD->doc_type,
'name' => $detailInfo->BD->first_name.' '.$detailInfo->BD->last_name,
'email' => $additionalUserFront->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';
$orderProduct = $this->emitirBono($emmisionWebService, $session, $orderProduct, $voucherData, $productId, $transactionId, $bookingId);
$em->persist($orderProduct);
$em->flush();
return $this->redirect($this->generateUrl($twig));
}
public function pseCallbackAction(ManagerRegistry $registry, PSEController $psePaymentController, OrderController $orderController, AviaturEncoder $aviaturEncoder, TwigFolder $twigFolder, AviaturErrorHandler $aviaturErrorHandler, SessionInterface $session, ParameterBagInterface $parameterBag, EmissionWebservice $emmisionWebService)
{
$transactionIdSessionName = $parameterBag->get('transaction_id_session_name');
$status = null;
$twig = null;
$em = $registry->getManager();
if (true === $session->has($transactionIdSessionName)) {
$transactionId = $session->get($transactionIdSessionName);
if (true === $session->has($transactionId.'[bono][order]')) {
$orderProductCode = $session->get($transactionId.'[bono][order]');
$productId = str_replace('PN', '', json_decode($orderProductCode)->products);
$orderProduct = $em->getRepository(\Aviatur\GeneralBundle\Entity\OrderProduct::class)->find($productId);
$agency = $orderProduct->getOrder()->getAgency();
$decodedRequest = json_decode($aviaturEncoder->AviaturDecode($orderProduct->getPayrequest(), $orderProduct->getPublicKey()));
$decodedResponse = json_decode($aviaturEncoder->AviaturDecode($orderProduct->getPayresponse(), $orderProduct->getPublicKey()));
$detailInfo = json_decode($session->get($transactionId.'[bono][detail_data_bono]'));
$bookingId = $this->generateRamdonCode();
$voucherData = [
'empresaId' => '10',
'productId' => $productId,
'bonoId' => $bookingId,
'ammount' => $decodedRequest->totalAmount,
'currency' => 'COP',
'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,
];
$orderController->updatePaymentAction($orderProduct);
if (isset($decodedResponse->createTransactionResult)) {
$pseTransactionId = $decodedResponse->createTransactionResult->transactionID;
$paymentResponse = $psePaymentController->pseCallbackAction($pseTransactionId);
if (!isset($paymentResponse->error)) {
$decodedResponse->getTransactionInformationResult = $paymentResponse->getTransactionInformationResult;
$orderProduct->setPayresponse($aviaturEncoder->AviaturEncode(json_encode($decodedResponse), $orderProduct->getPublicKey()));
$orderProduct->setUpdatingdate(new \DateTime());
$em->persist($orderProduct);
$em->flush();
$retryCount = (int) $session->get($transactionId.'[bono][retry]');
if ('SUCCESS' == (string) $paymentResponse->getTransactionInformationResult->returnCode) {
switch ((string) $paymentResponse->getTransactionInformationResult->transactionState) {
case 'OK':
$twig = 'aviatur_gift_voucher_payment_success_secure';
$status = 'approved';
break;
case 'PENDING':
$twig = 'aviatur_gift_voucher_payment_pending_secure';
$status = 'pending';
$orderProduct->setEmissiondata($bookingId);
$orderProduct->setEmail(json_encode($voucherData));
$outputInfo = $this->prepareOutputInfo();
$orderProduct->setResume(json_encode($outputInfo));
break;
case 'NOT_AUTHORIZED':
$twig = 'aviatur_gift_voucher_payment_error_secure';
$status = 'rejected';
break;
case 'FAILED':
$twig = 'aviatur_gift_voucher_payment_error_secure';
$status = 'failed';
break;
}
$orderProduct->setStatus($status);
$orderProduct->getOrder()->setStatus($status);
$orderProduct->setUpdatingdate(new \DateTime());
$orderProduct->getOrder()->setUpdatingdate(new \DateTime());
$em->persist($orderProduct);
$em->flush();
if ('approved' == $status) {
$orderProduct = $this->emitirBono($emmisionWebService, $session, $orderProduct, $voucherData, $productId, $transactionId, $bookingId);
}
} elseif ('FAIL_INVALIDTRAZABILITYCODE' == (string) $paymentResponse->getTransactionInformationResult->returnCode || 'FAIL_ACCESSDENIED' == $paymentResponse->getTransactionInformationResult->returnCode || 'FAIL_TIMEOUT' == $paymentResponse->getTransactionInformationResult->returnCode) {
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';
}
$session->set($transactionId.'[bono][retry]', $retryCount - 1);
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();
return $this->redirect($aviaturErrorHandler->errorRedirect($twigFolder->pathWithLocale('aviatur_general_homepage'), '', 'Ocurrió un error al consultar el estado de la transacción'));
}
} else {
return $this->redirect($aviaturErrorHandler->errorRedirect($twigFolder->pathWithLocale('aviatur_general_homepage'), '', 'No se encontró información de la transacción'));
}
} else {
return $this->redirect($aviaturErrorHandler->errorRedirect($twigFolder->pathWithLocale('aviatur_general_homepage'), '', 'No se encontró orden asociada a este pago'));
}
} else {
return $this->redirect($aviaturErrorHandler->errorRedirect($twigFolder->pathWithLocale('aviatur_general_homepage'), '', 'No se encontro identificador de la transacción'));
}
}
public function paymentOutputAction(ManagerRegistry $registry, \Swift_Mailer $mailer, TwigFolder $twigFolder, SessionInterface $session, ParameterBagInterface $parameterBag)
{
$transactionIdSessionName = $parameterBag->get('transaction_id_session_name');
$em = $registry->getManager();
$transactionId = $session->get($transactionIdSessionName);
$orderProductCode = $session->get($transactionId.'[bono][order]');
$productId = str_replace('PN', '', json_decode($orderProductCode)->products);
$orderProduct = $em->getRepository(\Aviatur\GeneralBundle\Entity\OrderProduct::class)->find($productId);
$agencyFolder = $twigFolder->twigFlux();
$isFront = $session->has('operatorId');
$outputInfo = $this->prepareOutputInfo();
$emailCustomerBody = $outputInfo['emailCustomerBody'];
$resumeData = $outputInfo['resumeData'];
$paymentResume = $resumeData['transactionPayments'][0];
$giftVoucherConfigObject = $em->getRepository(\Aviatur\GiftVoucherBundle\Entity\ConfigGiftVoucherAgency::class)->findBy(['agency' => $orderProduct->getOrder()->getAgency()]);
$urlResume = $twigFolder->twigExists('@AviaturTwig/'.$agencyFolder.'/GiftVoucher/Default/resume.html.twig');
if ($isFront) {
$paymentResume['transaction_state'] = 1;
}
$resumeMessage = $this->render($urlResume, $resumeData);
if (1 == $paymentResume['transaction_state']) {
$emailCustomMessage = $this->renderView($twigFolder->twigExists('@AviaturTwig/'.$agencyFolder.'/GiftVoucher/Default/email_giftVoucher.html.twig'), ['emailBodyContent' => $emailCustomerBody]);
$orderProduct->setEmail($emailCustomMessage);
$toAdminMails = explode(';', $giftVoucherConfigObject[0]->getMails());
$rejectAlertText = '';
if (2 == $paymentResume['transaction_state_cyber']) {//In case Rejected Cybersource send mail to administratos Aviatur
$sendVoucherTo = $toAdminMails;
$emailCustomerBody['cyberReject'] = '<STRONG>ATENCIÓN!!!<STRONG> 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.';
$rejectAlertText = ' - **RECHAZO CYBERSOURCE**';
} else {
$sendVoucherTo = $emailCustomerBody['customerContact']['email'];
}
$message = (new \Swift_Message())
->setContentType('text/html')
->setFrom($session->get('emailNoReply'))
->setTo($sendVoucherTo)
->setBCC('notificacionessitioweb@aviatur.com')
->setSubject($session->get('agencyShortName').' - Bono de Regalo')
->setBody($emailCustomMessage);
$mailer->send($message);
$emailCustomerBody['admin'] = true;
$emailCustomerBody['pn_id'] = 'PN'.$productId;
$emailCustomerBody['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.';
$emailAdminMessage = $this->renderView($twigFolder->twigExists('@AviaturTwig/'.$agencyFolder.'/GiftVoucher/Default/email_giftVoucher.html.twig'), ['emailBodyContent' => $emailCustomerBody]);
$messageAdmin = (new \Swift_Message())
->setContentType('text/html')
->setFrom($session->get('emailNoReply'))
->setTo($toAdminMails)
->setBCC(['notificacionessitioweb@aviatur.com', 'i_orduela@aviatur.com'])
->setSubject($session->get('agencyShortName').' - Se ha generado un Bono de Regalo'.$rejectAlertText)
->setBody($emailAdminMessage);
$mailer->send($messageAdmin);
$orderProduct->setResume($resumeMessage);
$em->persist($orderProduct);
$em->flush();
}
return $resumeMessage;
}
private function prepareOutputInfo(ManagerRegistry $registry, TwigFolder $twigFolder, AviaturEncoder $aviaturEncoder, AviaturErrorHandler $aviaturErrorHandler, SessionInterface $session, ParameterBagInterface $parameterBag)
{
$transactionIdSessionName = $parameterBag->get('transaction_id_session_name');
$clientFranquice = [];
$paymentResume = [];
$infos = [];
$em = $registry->getManager();
$agency = $em->getRepository(\Aviatur\AgencyBundle\Entity\Agency::class)->find($session->get('agencyId'));
$transactionId = $session->get($transactionIdSessionName);
$detailInfo = json_decode($session->get($transactionId.'[bono][detail_data_bono]'));
$orderProductCode = $session->get($transactionId.'[bono][order]');
$productId = str_replace('PN', '', json_decode($orderProductCode)->products);
$orderProduct = $em->getRepository(\Aviatur\GeneralBundle\Entity\OrderProduct::class)->find($productId);
$isFront = $session->has('operatorId');
$opRequestInitial = json_decode($aviaturEncoder->AviaturDecode($orderProduct->getPayrequest(), $orderProduct->getPublicKey()));
$opRequest = $opRequestInitial->multi_transaction_hotel ?? $opRequestInitial;
$opResponse = json_decode($aviaturEncoder->AviaturDecode($orderProduct->getPayResponse(), $orderProduct->getPublicKey()));
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);
} else {
$clientFranquice['description'] = 'error';
}
$customer = $em->getRepository(\Aviatur\CustomerBundle\Entity\Customer::class)->find($detailInfo->BD->id);
if ((null != $opRequest) && (null != $opResponse)) {
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->dataTransf)) {
if (isset($opRequest->notificationRequest->{'urn:OperationActivityNotifiedRequest'})):
$state = $opRequest->notificationRequest->{'urn:OperationActivityNotifiedRequest'}->{'urn:ListOfOperationsActivityNotified'}->{'urn1:ConfirmOperation'}->{'urn1:OperationStatus'};
if (102 == $state):
$state = 1;
$reason_description = 'SafetyPay recibe la confirmación del pago de un Banco Asociado'; elseif (101 == $state):
$state = 2;
$reason_description = 'Transacción creada';
endif;
$paymentResume = [
'transaction_state' => $state,
'id' => $orderProduct->getBooking(),
'currency' => $opRequest->dataTransf->x_currency,
'total_amount' => $opRequest->tokenRequest->{'urn:ExpressTokenRequest'}->{'urn:Amount'},
'amount' => null,
'iva' => null,
'ip_address' => $opRequest->dataTransf->dirIp,
'airport_tax' => null,
'reference' => $opRequest->tokenRequest->{'urn:ExpressTokenRequest'}->{'urn:MerchantSalesID'},
'auth' => $opRequest->notificationRequest->{'urn:OperationActivityNotifiedRequest'}->{'urn:ListOfOperationsActivityNotified'}->{'urn1:ConfirmOperation'}->{'urn1:OperationID'},
'transaction_date' => $opResponse->payResponse->OperationResponse->ResponseDateTime,
'description' => $opRequest->dataTransf->x_description,
'reason_code' => $opRequest->notificationRequest->{'urn:OperationActivityNotifiedRequest'}->{'urn:ListOfOperationsActivityNotified'}->{'urn1:ConfirmOperation'}->{'urn1:OperationStatus'},
'reason_description' => $reason_description,
'client_names' => $opRequest->dataTransf->x_first_name.' '.$opRequest->dataTransf->x_last_name,
'client_email' => $opRequest->dataTransf->x_email,
'x_payment_data' => $opRequest->dataTransf->x_payment_data,
'client_franquice' => ['description' => 'SafetyPay'],
]; else:
$paymentResume = [
'transaction_state' => 2,
'id' => $orderProduct->getBooking(),
'currency' => $opRequest->dataTransf->x_currency,
'total_amount' => $opRequest->dataTransf->x_total_amount,
'amount' => null,
'iva' => null,
'ip_address' => $opRequest->dataTransf->dirIp,
'airport_tax' => null,
'reference' => $opRequest->dataTransf->x_reference,
'auth' => null,
'transaction_date' => $opRequest->tokenRequest->{'urn:ExpressTokenRequest'}->{'urn:RequestDateTime'},
'description' => $opRequest->dataTransf->x_description,
'reason_code' => 101,
'reason_description' => 'Transacción creada',
'x_payment_data' => $opRequest->dataTransf->x_payment_data,
'client_names' => $opRequest->dataTransf->x_first_name.' '.$opRequest->dataTransf->x_last_name,
'client_email' => $opRequest->dataTransf->x_email,
];
endif;
if ('baloto' == $opRequest->dataTransf->x_payment_data) {
$paymentResume['transaction_state'] = 3;
}
} elseif (isset($opRequest->infoCash)) {
$paymentResume = [
'transaction_state' => 2,
'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' => null,
'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,
];
$cash_result = json_decode($session->get($transactionId.'[bono][cash_result]'));
$paymentResume['transaction_state'] = 3;
if ('' == $cash_result) {
$paymentResume['transaction_state'] = 2;
}
} else {
$bank_info = $em->getRepository(\Aviatur\PaymentBundle\Entity\PseBank::class)->findOneByCode($opRequest->bankCode);
$bank_name = $bank_info->getName();
$clientFranquice['description'] = 'PSE';
$paymentResume = [
'transaction_state' => $opResponse->getTransactionInformationResult->responseCode,
'id' => $orderProduct->getBooking(),
'id_context' => $opRequest->reference,
'currency' => $opRequest->currency,
'total_amount' => $opRequest->totalAmount,
'amount' => $opRequest->devolutionBase,
'iva' => $opRequest->taxAmount,
'ip_address' => $opRequest->ipAddress,
'bank_name' => $bank_name,
'client_franquice' => $clientFranquice,
'reference' => $opResponse->createTransactionResult->transactionID,
'auth' => $opResponse->getTransactionInformationResult->trazabilityCode,
'transaction_date' => $opResponse->getTransactionInformationResult->bankProcessDate,
'description' => $opRequest->description,
'reason_code' => $opResponse->getTransactionInformationResult->responseReasonCode,
'reason_description' => $opResponse->getTransactionInformationResult->responseReasonText,
'client_names' => $opRequest->payer->firstName.' '.$opRequest->payer->lastName,
'client_email' => $opRequest->payer->emailAddress,
];
}
} else {
$customer = null;
$paymentResume['id'] = $orderProduct->getBooking();
}
$paymentResume['transaction_state_cyber'] = $opResponse->x_response_code_cyber ?? '1';
$passengerData = $detailInfo->PI;
if (false !== strpos($detailInfo->BD->first_name, '***')) {
$facturationResume = [
'customer_names' => $customer->getFirstname().' '.$customer->getLastname(),
'customer_address' => $customer->getAddress(),
'customer_doc_num' => $customer->getDocumentnumber(),
'customer_phone' => $customer->getPhone(),
'customer_email' => $customer->getEmail(),
];
} else {
$facturationResume = [
'customer_names' => $detailInfo->BD->first_name.' '.$detailInfo->BD->last_name,
'customer_address' => $detailInfo->BD->address ?? null,
'customer_doc_num' => $detailInfo->BD->doc_num,
'customer_phone' => $detailInfo->BD->phone,
'customer_email' => $detailInfo->BD->email ?? null,
];
}
if (false !== strpos($passengerData->first_name_1_1, '***')) {
$passengerData->first_name_1_1 = $customer->getFirstname();
$passengerData->last_name_1_1 = $customer->getLastname();
}
$clientFranquice = '';
$retryCount = (int) $session->get($transactionId.'[bono][retry]');
$travelers = [];
for ($i = 1; $i <= $passengerData->person_count_1; ++$i) {
$first_name = 'first_name_1_'.$i;
$last_name = 'last_name_1_'.$i;
$type = 'passanger_type_1_'.$i;
$mail = 'email_1_'.$i;
$document_type = 'doc_type_1_'.$i;
$document_number = 'doc_num_1_'.$i;
$travelers[] = [
'typeCode' => $passengerData->$type,
'GivenName' => $passengerData->$first_name,
'Surname' => $passengerData->$last_name,
'Email' => $passengerData->$mail,
'Phone' => $detailInfo->CD->phone,
'Doc_type' => $passengerData->$document_type,
'Doc_number' => $passengerData->$document_number,
];
}
$infos[0] = [
'travelers' => $travelers,
'BookingCode' => $orderProduct->getBooking(),
];
$agencyData = [
'agency_name' => $agency->getName(),
'agency_nit' => $agency->getNit(),
'agency_phone' => $agency->getPhone(),
'agency_email' => $agency->getMailContact(),
];
$resumeData = [
'retryCount' => $retryCount,
'transactionPayments' => ['0' => $paymentResume],
'transactionInfo' => ['facturationResume' => $facturationResume],
'agencyData' => $agencyData,
'backDetail' => $this->generateUrl('aviatur_gift_voucher_retry_secure'),
'infos' => $infos,
];
if ($session->has($transactionId.'[bono][emission][error]')) {
$resumeData['emission_error'] = true;
}
// $emailData = array(
// 'paymentResume' => $paymentResume,
// 'travelers' => $travelers,
// 'agencyData' => $agencyData
// );
$customerContact = [
'fullName' => $travelers[0]['GivenName'].' '.$travelers[0]['Surname'],
'email' => mb_strtolower($travelers[0]['Email']),
'phone' => $travelers[0]['Phone'],
'document' => $travelers[0]['Doc_type'].' '.$travelers[0]['Doc_number'],
];
$sponsor_info = [
'name' => $facturationResume['customer_names'],
'document' => $facturationResume['customer_doc_num'],
];
if ($isFront) {
$giftArray = explode(',', base64_decode($detailInfo->GV->giftSelected));
$giftVoucherValue = 0;
$codeGift = base64_decode($giftArray[1]);
$giftVoucherConfigObject = $em->getRepository(\Aviatur\GiftVoucherBundle\Entity\ConfigGiftVoucherAgency::class)->findParamsByAgency($agency);
if (null == $giftVoucherConfigObject || (is_countable($giftVoucherConfigObject) ? count($giftVoucherConfigObject) : 0) == 0) {
return $this->redirect($aviaturErrorHandler->errorRedirect($this->generateUrl('aviatur_general_homepage'), '', 'No se encontró configuración para esta Agencia.'));
}
$giftVoucherConfig = json_decode($giftVoucherConfigObject[0]['params'], true);
foreach ($giftVoucherConfig['fares'] as $giftVoucherFares) {
if ($giftVoucherFares['code'] == $codeGift) {
$giftVoucherValue = $giftVoucherFares['value'];
}
}
if (0 == $giftVoucherValue) {
$valueGift = round(((int) (substr($giftArray[0], -3)) * 9) / 3);
if ($valueGift == $codeGift) {
$giftVoucherValue = (int) substr($giftArray[0], 0, -3) - (int) $valueGift;
} else {
return $this->redirect($aviaturErrorHandler->errorRedirect($this->generateUrl('aviatur_general_homepage'), '', '1 No se encontro informacion del producto solicitado '));
}
}
$paymentResume['total_amount'] = $giftVoucherValue;
}
$emailCustomerBody = [
'title' => 'BONO DE REGALO',
'voucherCode' => $orderProduct->getBooking(),
'voucherAmount' => $paymentResume['total_amount'],
'sponsor' => $sponsor_info,
'customerContact' => $customerContact,
'messageText' => 'Acércate a cualquier oficina de Aviatur en el país y redime el valor total o parcial cargado en el Bono de Regalo en tiquetes, hoteles, planes turísticos y demás servicios ofrecidos por Aviatur.
',
'mainImage' => $twigFolder->absoluteAssetsUrl($agency->getAssetsFolder()).'img/header/aviatur_logo.png',
];
return [
'emailCustomerBody' => $emailCustomerBody,
'resumeData' => $resumeData,
];
}
public 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);
$orderProduct->setEmissiondata($bookingId.'-EmissionError');
} else {
$orderProduct->setEmissiondata($bookingId.'-'.$sendVoucherStatus->purchaseBonusResult);
}
$orderProduct->setBooking($bookingId);
return $orderProduct;
}
public 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;
}
}