<?php
namespace Aviatur\CustomerBundle\Services;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
class ValidateSanctionsRenewal
{
private $em;
private \Swift_Mailer $mailer;
/**
* @var string
*/
private $emailNotification;
/**
* @var string
*/
private $env;
public function __construct(ManagerRegistry $managerRegistry, \Swift_Mailer $mailer, $emailNotification, $env)
{
$this->em = $managerRegistry->getManager();
$this->mailer = $mailer;
$this->emailNotification = $emailNotification;
$this->env = $env;
}
public function validateSanctions(&$clientArray, SessionInterface $session, $paymentMethod)
{
$em = $this->em;
$conditionedItems = 0; /* A los que les aplica o nombre o documento pero no los dos al tiempo */
$deniedPeople = 0; /* Prohibidos totalmente */
$lengthArray = sizeof($clientArray);
/*
Validamos si existen las sesiones para eliminarlas (antes eran Marked_name y Marked_document)
Marked_users tendrá un array con los usuarios condicionados que realizaron pagos con tarjeta
*/
if ($session->has('Marked_users')) {
$session->remove('Marked_users');
}
/*
Se procederá a validar por documento y por nombre completo
Se debe aplicar LIKE, ya que si aplicamos una coindicencia exacta (por causa de los espacios en blanco a los lados),
Es factible que no se puedan traer resultados.
Solo al final de la consulta, se hará la limpieza con trim para proceder a comparar de forma limpia.
*/
for($i = 0; $i < $lengthArray; $i++){
/* Validación para aplicar nombres Y/O documento (puede conducir al 1 o al 2 en control_result) */
$sanctionsResults01 = $em->getRepository(\Aviatur\CustomerBundle\Entity\CustomerSanctionsList::class)
->createQueryBuilder('csl')
->where("csl.name LIKE '%".$clientArray[$i]['first_name']."%'")
->andWhere("csl.name LIKE '%".$clientArray[$i]['last_name']."%'")
->orWhere("csl.document LIKE '%".$clientArray[$i]['doc_num']."%'")
->getQuery();
$sanctionsResults = $sanctionsResults01->getResult();
/* Results as objects */
$alertUser = false;
foreach ($sanctionsResults as $result) {
/* Comparisons */
$originalName = mb_strtolower($this->deleteAcutes(trim($result->getName())));
$originalDocument = mb_strtolower($this->deleteAcutes(trim($result->getDocument())));
/* Total Comparisons */
if($originalName == trim($clientArray[$i]['first_name'] . ' ' . $clientArray[$i]['last_name']) && $originalDocument == $clientArray[$i]['doc_num']){
$clientArray[$i]['control_result'] = 2;
$deniedPeople++;
$alertUser = false;
break;
}
if($originalName == trim($clientArray[$i]['last_name'] . ' ' . $clientArray[$i]['first_name']) && $originalDocument == $clientArray[$i]['doc_num']){
$clientArray[$i]['control_result'] = 2;
$deniedPeople++;
$alertUser = false;
break;
}
/* Partial Comparisons */
if($originalName == trim($clientArray[$i]['first_name'] . ' ' . $clientArray[$i]['last_name'])){
$clientArray[$i]['control_result'] = 1;
$alertUser = true;
}
if($originalName == trim($clientArray[$i]['last_name'] . ' ' . $clientArray[$i]['first_name'])){
$clientArray[$i]['control_result'] = 1;
$alertUser = true;
}
if($originalDocument == $clientArray[$i]['doc_num']){
$clientArray[$i]['control_result'] = 1;
$alertUser = true;
}
}
if($alertUser){
$conditionedItems++;
}
$sanctionsResults = null;
$sanctionsResults01 = null;
}
/* Generar correo en caso de condicionados o de denegados */
$emails = [
// $this->emailNotification,
'supervisorescallcenter@aviatur.com',
'soptepagelectronic@aviatur.com',
'controlpagoelectronico@aviatur.com',
'darwin.herrera@aviatur.com',
'd_pena@aviatur.com',
'yolima.luna@aviatur.com',
'f_villate@aviatur.com',
'emilce.calderon@aviatur.com',
'sebastian.huertas@aviatur.com',
];
if ('dev' === $this->env) {
$emails = ['notificacionessitioweb@aviatur.com'];
}
/* Gestión de los asuntos */
/* Bloqueados totales por ONU-OFAC */
if($deniedPeople > 0){
$emailContent = 'El(Los) siguiente(s) usuario(s) fue(ron) bloqueado(s) por estar en lista OFAC y/o ONU para realizar transacción por Aviatur.com:<br><br>';
foreach ($clientArray as $client) {
if($client['control_result'] != 0){
$emailContent .= '<br>Nombre: '.trim($client['first_name'] . ' ' . $client['last_name']) . '; ';
$emailContent .= 'Documento: '.$client['doc_num'] . '';
if($client['type'] == 'BD'){
$emailContent .= ' (Comprador)';
} else if($client['type'] == 'PD'){
$emailContent .= ' (Usuario de Tarjeta)';
} else {
$emailContent .= ' (Pasajero)';
}
$emailContent .= ($client['control_result'] == 2 ? ' (Bloqueado)' : ' (Por homonimia de cédula o de nombres)');
}
}
$message = (new \Swift_Message())
->setContentType('text/html')->setFrom('noreply@aviatur.com.co')
->setSubject('Bloqueo de lista ONU - OFAC')
->setTo($emails)->setBody($emailContent);
$this->mailer->send($message);
}
/* Alerta ONU-OFAC y que tratan de pagar diferente a tarjeta */
if($deniedPeople <= 0 && ($conditionedItems > 0 && $paymentMethod != 'p2p')){
$emailContent = 'El(Los) siguiente(s) usuario(s) está(n) tratando de realizar transacciones por Aviatur.com:<br><br>';
$identificationCards = array();
foreach ($clientArray as $client) {
if($client['control_result'] == 1){
$identificationCards[] = $client['doc_num'];
$emailContent .= '<br>Nombre: '.trim($client['first_name'] . ' ' . $client['last_name']) . '; ';
$emailContent .= 'Documento: '.$client['doc_num'] . '';
if($client['type'] == 'BD'){
$emailContent .= ' (Comprador)';
} else if($client['type'] == 'PD'){
$emailContent .= ' (Usuario de Tarjeta)';
} else {
$emailContent .= ' (Pasajero)';
}
}
}
$message = (new \Swift_Message())
->setContentType('text/html')->setFrom('noreply@aviatur.com.co')
->setSubject('Inhabilitación de pago - Alerta ONU - OFAC - '.implode(' - ', $identificationCards))
->setTo($emails)->setBody($emailContent);
$this->mailer->send($message);
}
/*
Alertas (Se activan sesiones propias de transacción para permitir el guardado, y siempre que se trate de pagar con tarjeta)
La idea es que se genere un correo de notificación pero con el número de transacción (Se hará en el callback)
*/
if($deniedPeople <= 0 && ($conditionedItems > 0 && $paymentMethod == 'p2p')){
$conditionedPeopleArray = array();
foreach ($clientArray as $client) {
if($client['control_result'] == 1){
$conditionedPeopleArray[] = $client;
}
}
$session->set('Marked_users', $conditionedPeopleArray);
}
/*
Dependiendo de las validaciones de los condicionados y/o de los prohibidos, debe retornar true o false en los siguientes casos:
* Si hay al menos un prohibido, se debe retornar FALSE e impedir la transacción.
* Si no hay prohibidos, pero al menos un condicionado, y el medio de pago es diferente a tarjeta, se debe retornar FALSE e impedir la transacción.
* Por lo demás, se debe retornar un TRUE.
*/
if($deniedPeople > 0){
return false;
} else if($conditionedItems > 0 && $paymentMethod != 'p2p') {
return false;
} else {
return true;
}
}
public function deleteAcutes($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
);
//Esta parte se encarga de eliminar cualquier caracter extraño
$cadena = str_replace(
['\\', '¨', 'º', '-', '~',
'#', '|', '!', '"', ':',
'·', '$', '%', '&', '/',
'(', ')', '?', "'", '¡',
'¿', '[', '^', '`', ']',
'+', '}', '{', '¨', '´',
'>', '< ', ';', ',', ],
'',
$cadena
);
return $cadena;
}
public function completeClientArray(&$clientArray){
$em = $this->em;
$tope = sizeof($clientArray);
/* Se convalida si alguien con cédula tiene nombres y apellidos, registrados la tabla de customers en Aviatur (en caso de que se traigan nombres con asteriscos) */
for ($i = 0; $i < $tope; $i++) {
if(strpos($clientArray[$i]['first_name'], '*') !== false || strpos($clientArray[$i]['last_name'], '*') !== false){
$customer = $em->getRepository(\Aviatur\CustomerBundle\Entity\Customer::class)->findOneBy(array('documentnumber' => $clientArray[$i]['doc_num']));
$clientArray[$i]['first_name'] = (!is_null($customer->getFirstname()) ? mb_strtolower($this->deleteAcutes(trim($customer->getFirstname()))) : $clientArray[$i]['first_name']);
$clientArray[$i]['last_name'] = (!is_null($customer->getLastname()) ? mb_strtolower($this->deleteAcutes(trim($customer->getLastname()))) : $clientArray[$i]['last_name']);
}
}
}
public function getClientsArray($postData, $urlDomain){
/* Se va a crear un arreglo con la información de todos los terceros de facturación, pasajeros y pago (si aplica) */
$clientArray = array();
/* Obtención información básica */
if(strpos($urlDomain, '/vuelos/') !== false || strpos($urlDomain, '/multi/') !== false || strpos($urlDomain, '/cruceros/') !== false || strpos($urlDomain, '/seguros-de-viaje/') !== false){
$billingInfo = $postData['BD'];
$passengersInfo = $postData['PI'];
$countPassengers = $passengersInfo['person_count_1'];
$paymentInfo = $postData['PD'];
$paymentMethod = $paymentInfo['type'];
for($i = 1; $i <= $countPassengers; $i++){
$clientArray[] = array(
"doc_num" => $passengersInfo['doc_num_1_'.$i],
"first_name" => mb_strtolower($this->deleteAcutes(trim($passengersInfo['first_name_1_'.$i]))),
"last_name" => mb_strtolower($this->deleteAcutes(trim($passengersInfo['last_name_1_'.$i]))),
"type" => 'PI',
"control_result" => 0
);
}
/* Comparamos si uno de los pasajeros es al que se le va a facturar */
$esClienteAFacturar = false;
$tope = sizeof($clientArray);
for($i = 0; $i < $tope; $i++){
if($clientArray[$i]['doc_num'] == $billingInfo['doc_num']){
$clientArray[$i]['type'] = 'BD';
$esClienteAFacturar = true;
break;
}
}
if(!$esClienteAFacturar){
$clientArray[] = array(
"doc_num" => $billingInfo['doc_num'],
"first_name" => mb_strtolower($this->deleteAcutes(trim($billingInfo['first_name']))),
"last_name" => mb_strtolower($this->deleteAcutes(trim($billingInfo['last_name']))),
"type" => 'BD',
"control_result" => 0
);
}
/* Comparamos si uno de los pasajeros (en caso de aplicar P2P) tiene tarjeta débito/crédito */
if($paymentMethod == "p2p"){
$esClienteConTarjeta = false;
$tope = sizeof($clientArray);
for($i = 0; $i < $tope; $i++){
if($clientArray[$i]['doc_num'] == $paymentInfo['doc_num']){
$clientArray[$i]['type'] = 'PD';
$esClienteConTarjeta = true;
break;
}
}
if(!$esClienteConTarjeta){
$clientArray[] = array(
"doc_num" => $paymentInfo['doc_num'],
"first_name" => mb_strtolower($this->deleteAcutes(trim($paymentInfo['first_name']))),
"last_name" => mb_strtolower($this->deleteAcutes(trim($paymentInfo['last_name']))),
"type" => 'PD',
"control_result" => 0
);
}
}
}
/* Se convalida si alguien con cédula tiene nombres y apellidos, registrados la tabla de customers en Aviatur (en caso de que se traigan nombres con asteriscos) */
$this->completeClientArray($clientArray);
return $clientArray;
}
public function sendMarkedEmail($orderProductCode, $session, $agency, $orderProduct, $transactionId, $product)
{
/* Generar correo para condicionados que paguen con tarjeta */
$emails = [
// $this->emailNotification,
'supervisorescallcenter@aviatur.com',
'soptepagelectronic@aviatur.com',
'controlpagoelectronico@aviatur.com',
'darwin.herrera@aviatur.com',
'd_pena@aviatur.com',
'yolima.luna@aviatur.com',
'f_villate@aviatur.com',
'emilce.calderon@aviatur.com',
'sebastian.huertas@aviatur.com',
];
if ('dev' === $this->env) {
$emails = ['notificacionessitioweb@aviatur.com'];
}
$reference = str_replace('{"order":"', '', $orderProductCode);
$reference = str_replace('","products":"', '-', $reference);
$reference = str_replace('"}', '', $reference);
$emailContent = 'El(Los) siguiente(s) usuario(s) está(n) tratando de realizar transacciones por Aviatur.com:<br><br>';
$identificationCards = array();
$clientArray = $session->get('Marked_users');
foreach ($clientArray as $client) {
if($client['control_result'] == 1){
$identificationCards[] = $client['doc_num'];
$emailContent .= '<br>Nombre: '.trim($client['first_name'] . ' ' . $client['last_name']) . '; ';
$emailContent .= 'Documento: '.$client['doc_num'] . '';
if($client['type'] == 'BD'){
$emailContent .= ' (Comprador)';
} else if($client['type'] == 'PD'){
$emailContent .= ' (Usuario de Tarjeta)';
} else {
$emailContent .= ' (Pasajero)';
}
}
}
$emailContent .= '<br><br>Agencia: '.$agency.'</br>Reserva: '.$orderProduct->getBooking().'</br>Producto: '.$product.'</br>TransactionID: '.$transactionId.'</br> Referencia: '.$reference;
$emailContent .= '<br><br>Por favor tomar las acciones necesarias con las transacciones de este(estos) cliente(s) reportado(s).';
$message = (new \Swift_Message())
->setContentType('text/html')->setFrom('noreply@aviatur.com.co')
->setSubject('Alerta ONU - OFAC - '.implode(' - ', $identificationCards))
->setTo($emails)->setBody($emailContent);
try {
$this->mailer->send($message);
} catch (\Exception $ex) {
}
}
}