siip-whatsapp-notifications.../src/Facade/AbstractMessageNotifierFacade.php

1640 lines
84 KiB
PHP
Executable File

<?php
declare(strict_types=1);
namespace SmsNotifier\Facade;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;
use SmsNotifier\Data\NotificationData;
use SmsNotifier\Facade\ClientCallBellAPI;
use SmsNotifier\Factory\MessageTextFactory;
use SmsNotifier\Service\Logger;
use SmsNotifier\Service\SmsNumberProvider;
use Twilio\Exceptions\HttpException;
use Ubnt\UcrmPluginSdk\Service\UcrmApi;
use \DateTime;
/*
* send message to client's number
*/
abstract class AbstractMessageNotifierFacade
{
/**
* @var Logger
*/
protected $logger;
/**
* @var MessageTextFactory
*/
protected $messageTextFactory;
/**
* @var SmsNumberProvider
*/
protected $clientPhoneNumber;
/**
* @var PluginNotifierFacade
*/
private $pluginNotifierFacade;
/**
* @var UcrmApi
*/
protected $ucrmApi;
const SUBJECT_OF_INSTALLER_CHANGE = ["se ha cancelado una tarea que tenías asignada con el folio ", "se te ha desasignado❌ la tarea con el folio "];
const ADDITIONAL_CHANGE_DATA = ["Ya no es necesario realizar la visita técnica.", "En tu lugar asistirá el técnico 👷🏻‍♂️➡️ "];
public function __construct(
Logger $logger,
MessageTextFactory $messageTextFactory,
SmsNumberProvider $clientPhoneNumber,
) {
$this->logger = $logger;
$this->messageTextFactory = $messageTextFactory;
$this->clientPhoneNumber = $clientPhoneNumber;
}
/*
* Verify contact type numbers to do notification, update or both
*/
public function verifyPaymentActionToDo(NotificationData $notificationData): void
{
//$this->logger->debug(print_r(json_encode($notificationData),true).PHP_EOL);
// Obtener los números de teléfono de los contactos
$arrayPhones = $this->clientPhoneNumber->getUcrmClientNumbers($notificationData, null);
// Imprimir el array de teléfonos
$this->logger->info(json_encode($arrayPhones));
// Procesar el array de teléfonos y ejecutar la función correspondiente
foreach ($arrayPhones as $type => $phones) {
// Registrar el tipo de contacto antes de la normalización para verificar qué valor se recibe
$this->logger->info("Procesando tipo de contacto original: '$type'");
// Normalizar el tipo para manejar posibles diferencias en las mayúsculas o espacios en blanco
$type = trim(strtolower($type));
// Registrar el tipo de contacto después de la normalización
$this->logger->info("Tipo de contacto normalizado: '$type'");
// Asegurarse de que $phones es un array y recorrerlo
if (is_array($phones)) {
foreach ($phones as $phone) {
switch ($type) {
case 'whatsapp':
// Ejecutar función de notificación y actualización
$this->notifyAndUpdate($notificationData, $phone);
break;
case 'whatsnotifica':
// Ejecutar función de notificación
$this->notify($notificationData, $phone);
break;
case 'whatsactualiza':
// Ejecutar función de actualización
$this->onlyUpdate($notificationData, $phone, false);
break;
default:
// Registrar cuando el tipo no es reconocido
$this->logger->info("Tipo de contacto no reconocido: '$type'" . PHP_EOL);
break;
}
}
} else {
$this->logger->info("Formato no esperado para los números de teléfono en el tipo: $type" . PHP_EOL);
}
}
}
/*
* Verify contact type numbers to do client's data update at CallBell
*/
public function verifyClientActionToDo(NotificationData $notificationData): void
{
//$this->logger->debug("Verificar contactos" . PHP_EOL);
$this->logger->debug(print_r(json_encode($notificationData), true) . PHP_EOL);
$arrayPhones = $this->clientPhoneNumber->getUcrmClientNumbers($notificationData, null);
// Procesar el array de teléfonos y ejecutar la función correspondiente
foreach ($arrayPhones as $type => $phones) {
// Registrar el tipo de contacto antes de la normalización para verificar qué valor se recibe
$this->logger->info("Procesando tipo de contacto original: '$type'");
// Normalizar el tipo para manejar posibles diferencias en las mayúsculas o espacios en blanco
$type = trim(strtolower($type));
// Registrar el tipo de contacto después de la normalización
$this->logger->info("Tipo de contacto normalizado: '$type'");
// Asegurarse de que $phones es un array y recorrerlo
if (is_array($phones)) {
foreach ($phones as $phone) {
switch ($type) {
case 'whatsapp':
// Ejecutar función de notificación y actualización
$this->onlyUpdate($notificationData, $phone);
break;
case 'whatsactualiza':
// Ejecutar función de actualización
$this->onlyUpdate($notificationData, $phone);
break;
default:
// Registrar cuando el tipo no es reconocido
$this->logger->info("Tipo de contacto no reconocido: '$type'" . PHP_EOL);
break;
}
}
} else {
$this->logger->info("Formato no esperado para los números de teléfono en el tipo: $type" . PHP_EOL);
}
}
}
/*
* Verify contact type numbers to do client's data service status at CallBell
*/
public function verifyServiceActionToDo(NotificationData $notificationData): void
{
//$this->logger->debug(print_r(json_encode($notificationData),true).PHP_EOL);
$arrayPhones = $this->clientPhoneNumber->getUcrmClientNumbers($notificationData, null);
// Procesar el array de teléfonos y ejecutar la función correspondiente
foreach ($arrayPhones as $type => $phones) {
// Registrar el tipo de contacto antes de la normalización para verificar qué valor se recibe
$this->logger->info("Procesando tipo de contacto original: '$type'");
// Normalizar el tipo para manejar posibles diferencias en las mayúsculas o espacios en blanco
$type = trim(strtolower($type));
// Registrar el tipo de contacto después de la normalización
$this->logger->info("Tipo de contacto normalizado: '$type'");
// Asegurarse de que $phones es un array y recorrerlo
if (is_array($phones)) {
foreach ($phones as $phone) {
switch ($type) {
case 'whatsapp':
// Ejecutar función de notificación y actualización
$this->onlyUpdateService($notificationData, $phone);
break;
case 'whatsactualiza':
// Ejecutar función de actualización
$this->onlyUpdateService($notificationData, $phone);
break;
default:
// Registrar cuando el tipo no es reconocido
$this->logger->info("Tipo de contacto no reconocido: '$type'" . PHP_EOL);
break;
}
}
} else {
$this->logger->info("Formato no esperado para los números de teléfono en el tipo: $type" . PHP_EOL);
}
}
}
/*
* Verify contact type numbers to do client's
*/
public function verifyJobActionToDo($jsonNotificationData, $reprogramming = null, $changeInstaller = null): void
{
$this->logger->debug('******** INCIO DE LA FUNCIÓN verifyJobActionToDo ******' . PHP_EOL);
$configManager = \Ubnt\UcrmPluginSdk\Service\PluginConfigManager::create();
$config = $configManager->loadConfig();
$IPServer = $config['ipserver'];
$UCRMAPIToken = $config['apitoken'];
$CallBellAPIToken = $config['tokencallbell'];
$IPServer = $config['ipserver'];
$installersData = $config['installersDataWhatsApp'];
$this->logger->debug('Valor de $jsonNotificationData en verifyJobActionToDo: ' . json_encode($jsonNotificationData) . PHP_EOL);
$this->logger->debug('Valor de $jsonNotificationData en verifyJobActionToDo: ' . json_encode($jsonNotificationData) . PHP_EOL);
$clientId = $jsonNotificationData['extraData']['entity']['clientId'];
$installerId = $jsonNotificationData['extraData']['entity']['assignedUserId'];
$jobId = $jsonNotificationData['entityId'];
$jobDescription = $jsonNotificationData['extraData']['entity']['description'] ?? null;
$reprogrammingValue = var_export($reprogramming, true);
$changeInstallerValue = var_export($changeInstaller, true);
$this->logger->debug('Valor de $reprogramming en verifyJobActionToDo: ' . $reprogrammingValue . PHP_EOL);
$this->logger->debug('Valor de $changeInstaller en verifyJobActionToDo: ' . $changeInstallerValue . PHP_EOL);
// Obtener la fecha del nodo "entity"
$dateString = $jsonNotificationData['extraData']['entity']['date'] ?? null;
if ($dateString) {
// Crear un objeto DateTime a partir de la fecha
$date = new DateTime($dateString);
// concaternar emoji de reloj de la hora que más se asemeje a la hora del evento, por ejemplo si la hora es 8:00 am o pm se concatena el emoji de reloj de las 8:00 am o pm como: 🕗
$hour = $date->format('h');
$clockEmoji = "🕐"; // Emoji por defecto
// Determinar el emoji del reloj según la hora
switch ($hour) {
case '01':
$clockEmoji = "🕐";
break;
case '02':
$clockEmoji = "🕑";
break;
case '03':
$clockEmoji = "🕒";
break;
case '04':
$clockEmoji = "🕓";
break;
case '05':
$clockEmoji = "🕔";
break;
case '06':
$clockEmoji = "🕕";
break;
case '07':
$clockEmoji = "🕖";
break;
case '08':
$clockEmoji = "🕗";
break;
case '09':
$clockEmoji = "🕘";
break;
case '10':
$clockEmoji = "🕙";
break;
case '11':
$clockEmoji = "🕚";
break;
case '12':
$clockEmoji = "🕛";
break;
}
// Formatear la fecha al formato deseado: día/mes/año a las hora:minuto am/pm aproximadamente
$formattedDate = "*" . $date->format('d/m/Y') . "* a las $clockEmoji *" . $date->format('h:i A') . "* aproximadamente";
// $this->logger->debug('Valor de $formattedDate en verifyJobActionToDo: ' . $formattedDate . PHP_EOL);
} else {
$this->logger->error('La fecha no está disponible en el JSON' . PHP_EOL);
}
$this->logger->debug('Valor de $installersData en verifyJobActionToDo: ' . $installersData . PHP_EOL);
$this->ucrmApi = UcrmApi::create();
$usersInstallers = $this->ucrmApi->get('users/admins/' . $installerId, []);
$this->logger->debug('Valor de $usersInstallers en verifyJobActionToDo: ' . json_encode($usersInstallers) . PHP_EOL);
// Inicializar la variable para el nombre completo
$installerFullName = '';
$jsonInstallersData = json_decode($installersData, true);
if (json_last_error() !== JSON_ERROR_NONE) {
$this->logger->error('Error al decodificar el JSON de instaladores: ' . json_last_error_msg());
return;
}
// Verificar si el nodo "instaladores" existe
if (!isset($jsonInstallersData['instaladores'])) {
$this->logger->error('El nodo "instaladores" no existe en el JSON');
return;
}
// Buscar el número de WhatsApp en el JSON
$installerWhatsApp = '';
foreach ($jsonInstallersData['instaladores'] as $installer) {
if ($installer['id'] === $installerId) {
$installerWhatsApp = $installer['whatsapp'];
break;
}
}
//$this->logger->debug('tipo de dato de installerWhatsApp: ' . gettype($installerWhatsApp) . PHP_EOL);
// Validar si se encontró el WhatsApp
if (empty($installerWhatsApp)) {
$this->logger->warning('No se encontró un número de WhatsApp para el instalador con ID 1019');
} else {
$this->logger->debug('Número de WhatsApp del Instalador: ' . $installerWhatsApp . PHP_EOL);
}
$this->ucrmApi = UcrmApi::create();
$usersInstallers = $this->ucrmApi->get('users/admins/' . $installerId, []);
//$this->logger->debug('Valor de $usersInstallers ' . json_encode($usersInstallers) . PHP_EOL);
$firstName = $usersInstallers['firstName'] ?? '';
$lastName = $usersInstallers['lastName'] ?? '';
$installerFullName = trim("$firstName $lastName");
$this->logger->debug('Valor de $installerFullName: ' . $installerFullName . PHP_EOL);
$baseUri = 'https://' . $IPServer . '/crm/api/v1.0/';
$clientGuzzleHttp = new Client([
'base_uri' => $baseUri,
'headers' => [
'X-Auth-App-Key' => $UCRMAPIToken,
'Accept' => 'application/json',
],
'verify' => false,
]);
$responseClients = $clientGuzzleHttp->request('GET', "clients/" . $clientId);
$arrayClientCRM = json_decode($responseClients->getBody()->getContents(), true);
// $this->logger->debug('Valor de $arrayClientCRM en verifyJobActionToDo: ' . json_encode($arrayClientCRM) . PHP_EOL);
$clientFullName = sprintf("%s %s", $arrayClientCRM['firstName'], $arrayClientCRM['lastName']);
// Extraer la dirección completa
$fullAddress = $arrayClientCRM['fullAddress'] ?? null;
// Validar si la dirección completa está disponible
if ($fullAddress) {
// Convertir la dirección a HTML seguro
$safeAddress = htmlspecialchars($fullAddress, ENT_QUOTES, 'UTF-8');
// $this->logger->debug('Dirección completa: ' . $safeAddress . PHP_EOL);
} else {
$this->logger->error('La dirección completa no está disponible en el JSON' . PHP_EOL);
}
// Extraer las coordenadas del nodo "entity"
$gpsLat = $arrayClientCRM['addressGpsLat'] ?? null;
$gpsLon = $arrayClientCRM['addressGpsLon'] ?? null;
// Validar si las coordenadas están disponibles
if ($gpsLat && $gpsLon) {
// Construir la URL de Google Maps
$googleMapsUrl = sprintf('https://www.google.com/maps?q=%s,%s', $gpsLat, $gpsLon);
// $this->logger->debug('URL de Google Maps: ' . $googleMapsUrl . PHP_EOL);
} else {
$this->logger->error('Las coordenadas no están disponibles en el JSON' . PHP_EOL);
}
$arrayPhones = $this->clientPhoneNumber->getUcrmClientNumbers(null, $arrayClientCRM);
// $this->logger->debug('Valor de $arrayPhones en verifyJobActionToDo: ' . json_encode($arrayPhones) . PHP_EOL);
$arrayAllPhones = $this->clientPhoneNumber->getAllUcrmClientNumbers($arrayClientCRM);
// Convertir el array de teléfonos en una cadena separada por comas
$clientAllPhonesString = implode(',', $arrayAllPhones);
$this->logger->debug('Valor de $clientAllPhonesString en verifyJobActionToDo: ' . $clientAllPhonesString . PHP_EOL);
// Dividir los números en un array
$arrayNumeros = explode(',', $clientAllPhonesString);
$this->logger->debug('Valor de $arrayNumeros en verifyJobActionToDo: ' . json_encode($arrayNumeros) . PHP_EOL);
// Procesar cada número
$resultados = [];
foreach ($arrayNumeros as $numero) {
// Limpiar espacios alrededor de cada número
$numero = trim($numero);
// Validar el número
$numeroValidado = $this->validarNumeroTelefono($numero);
// Remover el prefijo 521 si está presente y tiene 12 dígitos
if (substr($numeroValidado, 0, 3) === "521" && strlen($numeroValidado) === 12) {
$resultados[] = substr($numeroValidado, 3); // Remover "521"
} else {
$resultados[] = $numeroValidado; // Mantener el número sin cambios
}
}
$this->logger->debug('Valor de $resultados en verifyJobActionToDo: ' . json_encode($resultados) . PHP_EOL);
// Convertir el array de resultados en una cadena separada por comas
$resultadoFinalNumerosCliente = implode(', ', $resultados);
// $this->logger->debug('Valor de $resultadoFinalNumerosCliente en verifyJobActionToDo: ' . $resultadoFinalNumerosCliente . PHP_EOL);
$client_callbell_api = new ClientCallBellAPI($UCRMAPIToken, $IPServer, $CallBellAPIToken);
// Construir el array asociativo con los datos de la notificación para el cliente
$jsonClientJobNotificationData = [
"clientFullName" => $clientFullName,
"jobId" => $jobId,
"date" => $formattedDate,
"installerName" => $installerFullName,
];
$clientWhatsApp = '';
//Parte de la notificación al cliente
// Procesar el array de teléfonos y ejecutar la función correspondiente
foreach ($arrayPhones as $type => $phones) {
// Normalizar el tipo para manejar posibles diferencias en las mayúsculas o espacios en blanco
$type = trim(strtolower($type));
switch ($type) {
case 'whatsapp':
case 'whatsnotifica':
$this->logger->debug("Se encontró un tipo de contacto $type" . PHP_EOL);
// Verificar si el valor es un array de teléfonos
if (is_array($phones)) {
$attempts = 0;
$maxAttempts = 3;
$result = false;
foreach ($phones as $phone) {
//Aquí se enviará la notificación al cliente
// Reintentar hasta 3 veces si la función retorna false
while ($attempts < $maxAttempts && $result === false) {
$attempts++;
$result = $client_callbell_api->sendJobNotificationWhatsAppToClient(
$this->validarNumeroTelefono($phone), // Validar número de teléfono
$jsonClientJobNotificationData, // Datos de notificación
$reprogramming, // Reprogramación
$changeInstaller // Cambio de instalador
);
if ($result === false) {
sleep(1); // Esperar 1 segundo antes de reintentar
$this->logger->warning("Intento $attempts fallido en el envío de notificación a $phone. Reintentando..." . PHP_EOL);
}
}
// Verificar el resultado final
if ($result === true) {
$this->logger->info("Notificación enviada correctamente al cliente con teléfono $phone después de $attempts intento(s)." . PHP_EOL);
$title = $jsonNotificationData['extraData']['entity']['title'];
$this->logger->debug('Valor de $title en verifyJobActionToDo: ' . $title . PHP_EOL);
//la variable $title contiene el título del trabajo con un prefijo "[NOTIFICACION-PENDIENTE]" aquí hay que quitarlo
// $this->ucrmApi = UcrmApi::create();
// $responsePatch = $this->ucrmApi->patch('scheduling/jobs/' . $jsonNotificationData['entityId'], [
// 'title' => $title,
// ]);
if (strpos($title, '[NOTIFICACION-PENDIENTE]') !== false) { //si el título contiene el prefijo [NOTIFICACION-PENDIENTE] entonces se quita
$title = str_replace('[NOTIFICACION-PENDIENTE]', '', $title); // Quitar el prefijo
$responseClients = $clientGuzzleHttp->request('PATCH', "scheduling/jobs/" . $jsonNotificationData['entityId'], [
'json' => [
'title' => $title,
],
]);
$this->logger->debug('Valor de $title después de quitar el prefijo en verifyJobActionToDo: ' . $title . PHP_EOL);
break;
} else {
$this->logger->debug('El título no contiene el prefijo [NOTIFICACION-PENDIENTE] en verifyJobActionToDo: ' . $title . PHP_EOL);
}
} else {
$this->logger->error("No se pudo enviar la notificación al cliente con teléfono $phone después de $maxAttempts intentos." . PHP_EOL);
}
}
} else {
$this->logger->warning("No se encontraron números de teléfono para el tipo de contacto $type." . PHP_EOL);
}
break;
default:
$this->logger->info("Tipo de contacto no reconocido: $type" . PHP_EOL);
break;
}
}
// --- ¡AÑADE ESTAS LÍNEAS PARA CONVERTIR A BOOLEANO REAL! ---
$reprogramming = filter_var($reprogramming, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE);
$changeInstaller = filter_var($changeInstaller, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE);
// -----------------------------------------------------------
// Puedes volver a loggear los valores para confirmar la conversión (opcional)
$this->logger->debug("DEBUG: Valores después de conversión para mensaje instalador - Reprogramming: " . var_export($reprogramming, true) . ", ChangeInstaller: " . var_export($changeInstaller, true) . PHP_EOL);
if ($changeInstaller) { //Si se cambió el instalador
$this->logger->debug('Se cambió el instalador, por lo tanto se procede a enviarle mensaje al que se le desasignó' . PHP_EOL);
// Construir el array asociativo con los datos de la notificación
//Enviar notificación al instalador anterior
$previousinstallerInstallerId = $installerId = $jsonNotificationData['extraData']['entityBeforeEdit']['assignedUserId'];
$usersInstallers = $this->ucrmApi->get('users/admins/' . $previousinstallerInstallerId, []);
$firstNamePreviousInstaller = $usersInstallers['firstName'] ?? ''; //Obtener el nombre del instalador anterior
$lastNamePreviousInstaller = $usersInstallers['lastName'] ?? ''; //Obtener el apellido del instalador anterior
$previousInstallerFullName = trim("$firstNamePreviousInstaller $lastNamePreviousInstaller");
$attempts = 0;
$maxAttempts = 3;
$result = false;
$jsonPreviousInstallerJobNotificationData = [
"installerName" => "👷🏻‍♂️" . $previousInstallerFullName,
"subjectOfChange" => self::SUBJECT_OF_INSTALLER_CHANGE[1],
"jobId" => $jobId,
"clientFullName" => sprintf("[%s] %s", $arrayClientCRM['id'], $clientFullName),
"additionalChangeData" => self::ADDITIONAL_CHANGE_DATA[1] . ' *' . $installerFullName . '*',
];
// Buscar el número de WhatsApp en el JSON del instalador anterior
$previousInstallerWhatsApp = '';
foreach ($jsonInstallersData['instaladores'] as $installer) {
if ($installer['id'] === $previousinstallerInstallerId) {
$previousInstallerWhatsApp = $installer['whatsapp'];
$this->logger->debug('Se encontró el Whatsapp del instalador anterior en el JSON y es: ' . $previousInstallerWhatsApp . PHP_EOL);
break;
}
}
//Enviar mensaje al instalador anterior
// Reintentar hasta 3 veces si la función retorna false
while ($attempts < $maxAttempts && $result === false) {
$attempts++;
$result = $client_callbell_api->sendJobNotificationWhatsAppToInstaller(
$this->validarNumeroTelefono((string) $previousInstallerWhatsApp),
$jsonPreviousInstallerJobNotificationData,
$reprogramming,
$changeInstaller,
''
);
if ($result === false) {
sleep(1);
$this->logger->warning("Intento $attempts fallido para enviar notificación a $phone. Reintentando..." . PHP_EOL);
}
}
sleep(4);
// Construir el array asociativo con los datos de la notificación para el instalador nuevo
$jsonInstallerJobNotificationData = [
"installerName" => $installerFullName,
"clientFullName" => sprintf("[%s] %s", $arrayClientCRM['id'], $clientFullName),
"jobId" => $jobId,
"clientAddress" => $safeAddress,
"clientWhatsApp" => $resultadoFinalNumerosCliente,
"date" => $formattedDate,
"jobDescription" => $jobDescription,
"gmapsLocation" => $googleMapsUrl,
];
//Enviar notificación al instalador nuevo
$attempts = 0;
$maxAttempts = 3;
$result = false;
// Reintentar hasta 3 veces si la función retorna false
while ($attempts < $maxAttempts && $result === false) {
$attempts++;
$result = $client_callbell_api->sendJobNotificationWhatsAppToInstaller(
$this->validarNumeroTelefono((string) $installerWhatsApp),
$jsonInstallerJobNotificationData,
false,
false,
$this->getVaultCredentials($arrayClientCRM['id'])
);
if ($result === false) {
sleep(1);
$this->logger->warning("Intento $attempts fallido para enviar notificación a $phone. Reintentando..." . PHP_EOL);
}
}
} else { //si el instalador no cambió
$this->logger->debug('No se cambió el instalador' . PHP_EOL);
// Construir el array asociativo con los datos de la notificación
$jsonInstallerJobNotificationData = [
"installerName" => $installerFullName,
"clientFullName" => sprintf("[%s] %s", $arrayClientCRM['id'], $clientFullName),
"jobId" => $jobId,
"clientAddress" => $safeAddress,
"clientWhatsApp" => $resultadoFinalNumerosCliente,
"date" => $formattedDate,
"jobDescription" => $jobDescription,
"gmapsLocation" => $googleMapsUrl,
];
$attempts = 0;
$maxAttempts = 3;
$result = false;
// // Reintentar hasta 3 veces si la función retorna false
while ($attempts < $maxAttempts && $result === false) {
$attempts++;
$result = $client_callbell_api->sendJobNotificationWhatsAppToInstaller(
$this->validarNumeroTelefono((string) $installerWhatsApp),
$jsonInstallerJobNotificationData,
$reprogramming,
$changeInstaller,
$this->getVaultCredentials($arrayClientCRM['id'])
);
if ($result === false) {
sleep(1);
$this->logger->warning("Intento $attempts fallido para enviar notificación a $phone. Reintentando..." . PHP_EOL);
}
}
}
}
/*
* Verify contact type numbers to do client's data update at CallBell by invoice add or edit
*/
public function verifyInvoiceActionToDo(NotificationData $notificationData): void
{
$accountBalance = $notificationData->clientData['accountBalance'];
$this->logger->debug(print_r(json_encode($notificationData), true) . PHP_EOL);
$arrayPhones = $this->clientPhoneNumber->getUcrmClientNumbers($notificationData, null);
// Procesar el array de teléfonos y ejecutar la función correspondiente
foreach ($arrayPhones as $type => $phones) {
// Registrar el tipo de contacto antes de la normalización para verificar qué valor se recibe
$this->logger->info("Procesando tipo de contacto original: '$type'");
// Normalizar el tipo para manejar posibles diferencias en las mayúsculas o espacios en blanco
$type = trim(strtolower($type));
// Registrar el tipo de contacto después de la normalización
$this->logger->info("Tipo de contacto normalizado: '$type'");
// Asegurarse de que $phones es un array y recorrerlo
if (is_array($phones)) {
foreach ($phones as $phone) {
switch ($type) {
case 'whatsapp':
// Ejec vb bbnbbnbvnutar función de notificación y actualización
$this->onlyUpdate($notificationData, $phone, false);
break;
case 'whatsactualiza':
// Ejecutar función de actualización
$this->onlyUpdate($notificationData, $phone, false);
break;
default:
// Registrar cuando el tipo no es reconocido
$this->logger->info("Tipo de contacto no reconocido: '$type'" . PHP_EOL);
break;
}
}
} else {
$this->logger->info("Formato no esperado para los números de teléfono en el tipo: $type" . PHP_EOL);
}
}
}
/*
* Notify to client with the payment receipt via WhatsApp
*/
public function notify(NotificationData $notificationData, $phoneToNotify = null): void
{
// $notification_client_data = $notificationData->clientData; //array con los datos del cliente
// $notification_client_data_export = json_encode($notification_client_data);
// $this->logger->info("Valor de notification client data export: " . $notification_client_data_export . PHP_EOL);
$configManager = \Ubnt\UcrmPluginSdk\Service\PluginConfigManager::create();
$config = $configManager->loadConfig();
// the "exportFormat" key must be defined in plugin's manifest file, see the link above
$IPServer = $config['ipserver'];
$UCRMAPIToken = $config['apitoken'];
$CallBellAPIToken = $config['tokencallbell'];
$notificationTypeText = $config['notificationTypeText'];
$client_callbell_api = new ClientCallBellAPI($UCRMAPIToken, $IPServer, $CallBellAPIToken);
//$clientPhoneNumber = $this->clientPhoneNumber->getUcrmClientNumber($notificationData);
$clientPhoneNumber = $this->validarNumeroTelefono($phoneToNotify); //Obtiene el número de celular del cliente que sea del tipo de contacto "WhatsApp"
//$this->logger->debug("Numero de cel obtenido " . $clientPhoneNumber . PHP_EOL);
if (empty($clientPhoneNumber)) {
$this->logger->warning('No se encontró un teléfono celular válido para el cliente: ' . $notificationData->clientId);
return;
} else {
if ($notificationTypeText) {
try {
$attempts = 0;
$maxAttempts = 3;
$result = false;
while ($attempts < $maxAttempts && !$result) {
$attempts++;
$result = $client_callbell_api->sendTextPaymentNotificationWhatsApp($clientPhoneNumber, $notificationData);
if (!$result) {
$this->logger->warning("Intento $attempts fallido para enviar notificación de texto al cliente con número $clientPhoneNumber." . PHP_EOL);
}
}
if ($result) {
$this->logger->info("Notificación de texto enviada correctamente al cliente con número $clientPhoneNumber después de $attempts intento(s)." . PHP_EOL);
} else {
$this->logger->error("No se pudo enviar la notificación de texto al cliente con número $clientPhoneNumber después de $maxAttempts intentos." . PHP_EOL);
}
} catch (HttpException $httpException) {
$this->logger->error($httpException->getCode() . ' ' . $httpException->getMessage());
}
} else {
try {
$attempts = 0;
$maxAttempts = 3;
$result = false;
while ($attempts < $maxAttempts && !$result) {
$attempts++;
$result = $client_callbell_api->sendPaymentNotificationWhatsApp($clientPhoneNumber, $notificationData);
if (!$result) {
$this->logger->warning("Intento $attempts fallido para enviar notificación al cliente con número $clientPhoneNumber." . PHP_EOL);
}
}
if ($result) {
$this->logger->info("Notificación enviada correctamente al cliente con número $clientPhoneNumber después de $attempts intento(s)." . PHP_EOL);
} else {
$this->logger->error("No se pudo enviar la notificación al cliente con número $clientPhoneNumber después de $maxAttempts intentos." . PHP_EOL);
}
} catch (HttpException $httpException) {
$this->logger->error($httpException->getCode() . ' ' . $httpException->getMessage());
}
}
}
// $messageBody = $this->messageTextFactory->createBody($notificationData);
// if (! $messageBody) {
// $this->logger->info('No text configured for event: ' . $notificationData->eventName);
// return;
// }
}
/*
* Notify to client with the payment receipt via WhatsApp and Update the client's data at CallBell
*/
public function notifyAndUpdate(NotificationData $notificationData, $phoneToNotifyAndUpdate = null): void
{
$this->logger->debug("***Se notifica y actualiza al cliente sobre su pago***" . PHP_EOL);
// $notification_client_data = $notificationData->clientData; //array con los datos del cliente
// $notification_client_data_export = json_encode($notification_client_data);
// $this->logger->info("Valor de notification client data export: " . $notification_client_data_export . PHP_EOL);
//$this->logger->debug("Creando instancia callbell ".PHP_EOL);
$configManager = \Ubnt\UcrmPluginSdk\Service\PluginConfigManager::create();
$config = $configManager->loadConfig();
// the "exportFormat" key must be defined in plugin's manifest file, see the link above
$IPServer = $config['ipserver'];
$UCRMAPIToken = $config['apitoken'];
$CallBellAPIToken = $config['tokencallbell'];
$notificationTypeText = $config['notificationTypeText'];
$client_callbell_api = new ClientCallBellAPI($UCRMAPIToken, $IPServer, $CallBellAPIToken);
//$this->logger->debug(" instancia callbell creada".PHP_EOL);
//$clientPhoneNumber = $this->validarNumeroTelefono($this->clientPhoneNumber->getUcrmClientNumber($notificationData));
//$clientPhoneNumber = $this->clientPhoneNumber->getUcrmClientNumber($notificationData);
//$clientPhoneNumber = $this->validarNumeroTelefono($this->clientPhoneNumber->getUcrmClientNumber($notificationData)); //Obtiene el número de celular del cliente que sea del tipo de contacto "WhatsApp"
$clientPhoneNumber = $this->validarNumeroTelefono($phoneToNotifyAndUpdate);
if (empty($clientPhoneNumber)) {
$this->logger->warning('No se encontró un teléfono celular válido para el cliente: ' . $notificationData->clientId);
return;
} else {
//$this->logger->debug(sprintf('llego al llamado de sendPaymentNotificationWhatsApp con client_id: %s y número de celular: %s', $notificationData->clientId, $clientPhoneNumber));
if ($notificationTypeText) {
$this->logger->debug("Activado el check de mensajes de texto: " . $notificationTypeText . PHP_EOL);
}
if ($notificationTypeText) {
try {
if ($client_callbell_api->sendTextPaymentNotificationWhatsApp($clientPhoneNumber, $notificationData)) {
$response_getContactCallBell = json_decode($client_callbell_api->getContactWhatsapp($clientPhoneNumber), true);
$client_callbell_api->patchWhatsapp($response_getContactCallBell, $notificationData);
} else {
$this->logger->warning("No se pudo enviar el comprobante para este cliente" . PHP_EOL);
}
} catch (\Exception $Exception) {
$this->logger->error($Exception->getCode() . ' ' . $Exception->getMessage());
}
} else {
try {
if ($client_callbell_api->sendPaymentNotificationWhatsApp($clientPhoneNumber, $notificationData)) {
$response_getContactCallBell = json_decode($client_callbell_api->getContactWhatsapp($clientPhoneNumber), true);
$client_callbell_api->patchWhatsapp($response_getContactCallBell, $notificationData);
} else {
$this->logger->warning("No se pudo enviar el comprobante para este cliente" . PHP_EOL);
}
} catch (\Exception $Exception) {
$this->logger->error($Exception->getCode() . ' ' . $Exception->getMessage());
}
}
}
// $messageBody = $this->messageTextFactory->createBody($notificationData);
// if (! $messageBody) {
// $this->logger->info('No text configured for event: ' . $notificationData->eventName);
// return;
// }
}
/*
* Notify to client about Invoice Overdue
*/
public function notifyOverDue(NotificationData $notificationData): void
{
$this->logger->debug("***Se notifica al cliente que la factura de su servicio está vencida***" . PHP_EOL);
// $notification_client_data = $notificationData->clientData; //array con los datos del cliente
// $notification_client_data_export = json_encode($notification_client_data);
// $this->logger->info("Valor de notification client data export: " . $notification_client_data_export . PHP_EOL);
//$this->logger->debug("Creando instancia callbell ".PHP_EOL);
$configManager = \Ubnt\UcrmPluginSdk\Service\PluginConfigManager::create();
$config = $configManager->loadConfig();
// the "exportFormat" key must be defined in plugin's manifest file, see the link above
$IPServer = $config['ipserver'];
$UCRMAPIToken = $config['apitoken'];
$CallBellAPIToken = $config['tokencallbell'];
$client_callbell_api = new ClientCallBellAPI($UCRMAPIToken, $IPServer, $CallBellAPIToken);
//$this->logger->debug(" instancia callbell creada".PHP_EOL);
//$clientPhoneNumber = $this->validarNumeroTelefono($this->clientPhoneNumber->getUcrmClientNumber($notificationData));
$clientPhoneNumber = $this->clientPhoneNumber->getUcrmClientNumber($notificationData);
$this->logger->debug("Numero de cel obtenido " . $clientPhoneNumber . PHP_EOL);
if (empty($clientPhoneNumber)) {
$this->logger->warning('No se encontró un teléfono celular válido para el cliente: ' . $notificationData->clientId);
return;
} else {
try {
//$this->logger->debug(sprintf('llego al llamado de sendPaymentNotificationWhatsApp con client_id: %s y número de celular: %s', $notificationData->clientId, $clientPhoneNumber));
//$this->sendMessage($notificationData, $clientSmsNumber, $messageBody);
//$this->sendWhatsApp($notificationData, $clientSmsNumber);
$client_callbell_api->sendOverdueNotificationWhatsApp($clientPhoneNumber, $notificationData);
} catch (HttpException $httpException) {
//$this->logger->debug('Ocurrio un error en el try catch');
$this->logger->error($httpException->getCode() . ' ' . $httpException->getMessage());
}
}
// $messageBody = $this->messageTextFactory->createBody($notificationData);
// if (! $messageBody) {
// $this->logger->info('No text configured for event: ' . $notificationData->eventName);
// return;
// }
}
/*
* Update the client's data at CallBell
*/
public function onlyUpdate(NotificationData $notificationData, $phoneToUpdate = null, $updateEmail = false): void
{
//$this->logger->info("Se enviará una actualización a Callbell " . PHP_EOL);
$notification_client_data = $notificationData->clientData; //array con los datos del cliente
// $notification_client_data_export = json_encode($notification_client_data);
// $this->logger->info("Valor de notification client data export: " . $notification_client_data_export . PHP_EOL);
$configManager = \Ubnt\UcrmPluginSdk\Service\PluginConfigManager::create();
$config = $configManager->loadConfig();
// the "exportFormat" key must be defined in plugin's manifest file, see the link above
$IPServer = $config['ipserver'];
$UCRMAPIToken = $config['apitoken'];
$CallBellAPIToken = $config['tokencallbell'];
$StripeToken = $config['tokenstripe'];
$attributes = $notificationData->clientData['attributes']; //Obtener los atributos del cliente
// Variable para almacenar los valores de los atributos que comienzan con "clabe"
// Iterar sobre los atributoss
foreach ($attributes as $attribute) {
// Verificar si la "key" comienza con "stripe"
if (strpos($attribute['key'], 'stripe') === 0) {
// Agregar el valor al array $clabeValues
$customerStripeID = $attribute['value'];
} else if (strpos($attribute['key'], 'clabe') === 0) { // Verificar si la "key" comienza con "clabe"
// Agregar el valor al array $clabeValues
$clabeInterbancaria = $attribute['value'];
}
}
if ($updateEmail) {
$contacts = $notificationData->clientData['contacts'] ?? []; //Obtener los contactos que tiene el cliente para buscar el email
foreach ($contacts as $contact) {
$types = $contact['types'] ?? []; //Obtener los tipos de contactos del cliente
foreach ($types as $type) {
if ($type['name'] == 'WhatsApp') { //Si el tipo de contacto es Whatsapp
$client_email = $contact['email']; //Asignar el correo del cliente a la variable
break;
}
}
}
$this->logger->info("Se procesaron los contactos para revisar el o los email" . PHP_EOL);
$stripe = new \Stripe\StripeClient($StripeToken); //Instancia de la clase manejadora de clientes para la API de Stripe
if ($client_email !== null && $customerStripeID !== null) {
$this->logger->info("Se actualizara el correo del cliente en Stripe: " . $client_email . PHP_EOL);
$stripe->customers->update($customerStripeID, ['email' => $client_email]); //Actualiza el correo electrónico del cliente en la plataforma de Stripe en su correspondiente "customer Stripe ID"
}
}
$clientPhoneNumber = $this->validarNumeroTelefono($phoneToUpdate); //Obtiene el número de celular del cliente que sea del tipo de contacto "WhatsApp"
if (empty($clientPhoneNumber)) {
$this->logger->warning('No se encontró un teléfono celular válido para el cliente: ' . $notificationData->clientId);
return;
} else {
try {
//$this->logger->debug(sprintf('llego al llamado de sendwhatsapp con client_id: %s y número de celular: %s', $notificationData->clientId, $clientPhoneNumber));
//$this->sendMessage($notificationData, $clientSmsNumber, $messageBody);
//$this->sendWhatsApp($notificationData, $clientSmsNumber);
//$client_callbell_api->sendMessageWhatsApp($clientPhoneNumber, $notificationData);
$client_callbell_api = new ClientCallBellAPI($UCRMAPIToken, $IPServer, $CallBellAPIToken);
$response_getContactCallBell = json_decode($client_callbell_api->getContactWhatsapp($clientPhoneNumber), true);
//$this->logger->debug('Se hizo la petición al callbell para obtener el uuid' . PHP_EOL);
$client_callbell_api->patchWhatsapp($response_getContactCallBell, $notificationData, $clabeInterbancaria);
} catch (HttpException $httpException) {
//$this->logger->debug('Ocurrio un error en el try catch');
$this->logger->error($httpException->getCode() . ' ' . $httpException->getMessage());
}
}
// $notificationData_export = var_export($notificationData, true);
// $this->logger->debug('valor de notificationdata: ' . $notificationData_export);
// $messageBody = $this->messageTextFactory->createBody($notificationData);
// if (! $messageBody) {
// $this->logger->info('No text configured for event: ' . $notificationData->eventName);
// return;
// }
}
/*
* Update de status of service at CallBell
*/
public function onlyUpdateService(NotificationData $notificationData, $phoneToUpdate): void
{
//$this->logger->info("Se enviará una actualización del estado del servicio a Callbell, estado del servicio: ".$notificationData->serviceData['status'] . PHP_EOL);
$this->logger->info(json_encode($notificationData) . PHP_EOL);
//$clientID = $notificationData->extraData['entity']['clientId'];
//$this->logger->info("client id " .$clientID. PHP_EOL);
$configManager = \Ubnt\UcrmPluginSdk\Service\PluginConfigManager::create();
$config = $configManager->loadConfig();
// the "exportFormat" key must be defined in plugin's manifest file, see the link above
$IPServer = $config['ipserver'];
$UCRMAPIToken = $config['apitoken'];
$CallBellAPIToken = $config['tokencallbell'];
$clientPhoneNumber = $this->validarNumeroTelefono($phoneToUpdate); //Obtiene el número de celular del cliente que sea del tipo de contacto "WhatsApp"
//$this->logger->info("Número de telefono obtenido para actualizar:" .$clientPhoneNumber. PHP_EOL);
if (empty($clientPhoneNumber)) {
$this->logger->warning('No se encontró un teléfono celular válido para el cliente: ' . $notificationData->clientId);
return;
} else {
try {
//$this->logger->debug(sprintf('llego al llamado de sendwhatsapp con client_id: %s y número de celular: %s', $notificationData->clientId, $clientPhoneNumber));
//$this->sendMessage($notificationData, $clientSmsNumber, $messageBody);
//$this->sendWhatsApp($notificationData, $clientSmsNumber);
$client_callbell_api = new ClientCallBellAPI($UCRMAPIToken, $IPServer, $CallBellAPIToken);
$response_getContactCallBell = json_decode($client_callbell_api->getContactWhatsapp($clientPhoneNumber), true);
$client_callbell_api->patchServiceStatusWhatsApp($response_getContactCallBell, $notificationData);
} catch (HttpException $httpException) {
//$this->logger->debug('Ocurrio un error en el try catch');
$this->logger->error($httpException->getCode() . ' ' . $httpException->getMessage());
}
}
}
/**
* implement in subclass with the specific messaging provider
* @see TwilioNotifierFacade::sendMessage()
*/
abstract protected function sendMessage(
NotificationData $notificationData,
string $clientSmsNumber,
string $messageBody
): void;
// /**
// * implement in subclass with the specific messaging provider
// * @see TwilioNotifierFacade::sendWhatsApp()
// */
// abstract protected function sendWhatsApp(
// NotificationData $notificationData,
// string $clientSmsNumber
// ): void;
function validarNumeroTelefono($telefono)
{
// Eliminar espacios y guiones
$telefono = preg_replace('/\s+|-/', '', $telefono);
// Eliminar caracteres no numéricos, excepto el '+' si está al principio
$telefono = preg_replace('/(?!^\+)[^0-9]/', '', $telefono);
// Verificar si el número comienza con "+1" o "1" y tiene 11 dígitos en total
if (
(substr($telefono, 0, 2) === "+1" && strlen($telefono) === 12) ||
(substr($telefono, 0, 1) === "1" && strlen($telefono) === 11)
) {
return $telefono;
}
// Si el número tiene exactamente 10 dígitos, agregar el prefijo "521"
if (strlen($telefono) === 10) {
return "521" . $telefono;
}
// Si el número tiene más de 10 dígitos, verificar que comience con "521"
if (strlen($telefono) > 10) {
if (substr($telefono, 0, 2) === "521" && strlen($telefono) === 12) {
return $telefono;
} else {
// Si no comienza con "52", tomar los últimos 10 dígitos y agregar el prefijo "52"
return "521" . substr($telefono, -10);
}
}
// Si no cumple con ninguna de las condiciones anteriores, retornar cadena vacía
return '';
}
function patchClientCustomAttribute($clientId, $attributeId, $value): bool
{
$logger = \Ubnt\UcrmPluginSdk\Service\PluginLogManager::create();
$configManager = \Ubnt\UcrmPluginSdk\Service\PluginConfigManager::create();
$config = $configManager->loadConfig();
$ucrmBaseUri = $config['ipserver'];
$authToken = $config['apitoken'];
$ucrmBaseUri = 'https://' . $ucrmBaseUri . '/crm/api/v1.0/';
$clientguzz = new Client(); //instancia de cliente GuzzleHttp para consumir API UISP CRM
$json_data_patch = '{
"attributes": [
{
"value": "' . $value . '",
"customAttributeId":' . $attributeId . '
}
]
}'; //JSON para hacer patch de los custom fields del cliente en el UISCP CRM
try {
//aquí se contruye la petición para hacer patch hacia el cliente en sus custom fields con la API del UISP UCRM
$responseCRM = $clientguzz->patch(
$ucrmBaseUri . 'clients/' . $clientId,
[
'headers' => [
'X-Auth-Token' => $authToken,
'Content-Type' => 'application/json',
],
'body' => $json_data_patch,
'verify' => false, // Deshabilitar la verificación del certificado SSL
],
);
//evaluar el código de respuesta HTTP y si es 200 se retorna true
if ($responseCRM->getStatusCode() === 200) {
$this->logger->info("Se actualizó el custom attribute del cliente " . $clientId . PHP_EOL);
return true; // Return true if patch is successful
} else {
$this->logger->info("Error al hacer el patch al CRM: " . $responseCRM->getStatusCode() . PHP_EOL);
return false; // Return false if patch fails
}
} catch (\GuzzleHttp\Exception\GuzzleException $error) {
$this->logger->info("Error al hacer el patch al CRM: " . $error->getMessage() . PHP_EOL);
return false; // Return false if patch fails
}
}
function getVaultCredentials($dataToSearch): string
{
$logger = \Ubnt\UcrmPluginSdk\Service\PluginLogManager::create();
$configManager = \Ubnt\UcrmPluginSdk\Service\PluginConfigManager::create();
$config = $configManager->loadConfig();
$ucrmBaseUri = $config['ipserver'];
$authToken = $config['apitoken'];
if ($ucrmBaseUri === '172.16.5.134') { //opción solo para el servidor de pruebas
return 'gYAIEK:Be}SK*01z5+/V';
}
$unmsBaseUri = 'https://' . $ucrmBaseUri . '/nms/api/v2.1/';
$ucrmBaseUri = 'https://' . $ucrmBaseUri . '/crm/api/v1.0/';
//$authToken = '7adc9198-50b1-41d0-9bfa-d4946902ed89';
// Crear una instancia del cliente Guzzle
$clientUnms = new Client([
'base_uri' => $unmsBaseUri,
'verify' => false, // Deshabilitar la verificación del certificado SSL
]);
$clientUcrm = new Client([
'base_uri' => $ucrmBaseUri,
'verify' => false, // Deshabilitar la verificación del certificado SSL
]);
//validar si dataToSearch es una dirección IP o una dirección MAC
if (filter_var($dataToSearch, FILTER_VALIDATE_IP)) {
// La variable es una dirección IP válida
// $logger->appendLog('Consulta por dirección IP: ' . $dataToSearch);
print ('Consulta por dirección IP: ' . $dataToSearch . PHP_EOL);
$IpAddressClientId = filter_var($dataToSearch, FILTER_VALIDATE_IP);
try {
$responseSitesByIP = $clientUnms->request('GET', 'sites/search?query=' . $dataToSearch . '&count=1&page=1', [
'headers' => [
'X-Auth-Token' => $authToken,
],
]);
if ($responseSitesByIP->getStatusCode() === 200) {
$datasSitesByIP = json_decode((string) $responseSitesByIP->getBody(), true);
$jsonDevicesBySite = json_encode($datasSitesByIP, JSON_PRETTY_PRINT);
//print_r($jsonDevicesBySite . PHP_EOL); //Devices por ID del sitio
if (isset($datasSitesByIP[0])) {
$siteId = $datasSitesByIP[0]['id'];
// print_r('ID DEL SITIO: ' . $siteId . PHP_EOL); // ID del sitio
} else {
// $logger->appendLog('No se encontró ningún sitio para la IP proporcionada: ' . $dataToSearch);
print_r('No se encontró ningún sitio para la IP proporcionada: ' . $dataToSearch . PHP_EOL);
return 'Error: No se encontró ningún sitio para la IP proporcionada: ' . $dataToSearch; // Return early if no site is found
}
} else {
//echo "Error en la solicitud. Código de estado HTTP: " . $responseSitesByIP->getStatusCode() . PHP_EOL;
// $logger->appendLog('Error en la solicitud. Código de estado HTTP: ' . $responseSitesByIP->getStatusCode());
print_r('Error en la solicitud. Código de estado HTTP: ' . $responseSitesByIP->getStatusCode() . PHP_EOL);
return 'Error: Falla en la solicitud. Código de estado HTTP: ' . $responseSitesByIP->getStatusCode(); // Return early if the request fails
}
$devicesBySiteId = $clientUnms->request('GET', 'devices?siteId=' . $siteId, [
'headers' => [
'X-Auth-Token' => $authToken,
],
]);
if ($devicesBySiteId->getStatusCode() === 200) {
$dataDevicesBySite = json_decode((string) $devicesBySiteId->getBody(), true);
$jsonDevicesBySite = json_encode($dataDevicesBySite, JSON_PRETTY_PRINT);
//print_r($jsonDevicesBySite . PHP_EOL); //Devices por ID del sitio
$deviceID = null;
foreach ($dataDevicesBySite as $device) {
if (isset($device['ipAddress'])) {
$ipAddress = explode('/', $device['ipAddress'])[0]; // Obtener solo la IP sin la máscara
if ($ipAddress === $IpAddressClientId) {
$deviceID = $device['identification']['id'];
break; // Salir del ciclo si se encuentra la IP
}
} else {
// $logger->appendLog('No se encontró la IP del dispositivo en la respuesta de la API.');
print_r('No se encontró la IP del dispositivo en la respuesta de la API.' . PHP_EOL);
return 'Error: No se encontró la IP del dispositivo en la respuesta de la API.'; // Return early if the IP is not found
}
}
if ($deviceID == null) {
//echo "No se encontró el dispositivo con la IP proporcionada." . PHP_EOL;
// $logger->appendLog('No se encontró el dispositivo con la IP proporcionada: ' . $IpAddressClientId);
print_r('No se encontró el dispositivo con la IP proporcionada: ' . $IpAddressClientId . PHP_EOL);
return 'Error: No se encontró el dispositivo con la IP proporcionada: ' . $IpAddressClientId; // Return early if no device is found
}
} else {
// echo "Error en la solicitud. Código de estado HTTP: " . $devicesBySiteId->getStatusCode() . PHP_EOL;
// $logger->appendLog('Error en la solicitud. Código de estado HTTP: ' . $devicesBySiteId->getStatusCode());
print_r('Error en la solicitud. Código de estado HTTP: ' . $devicesBySiteId->getStatusCode() . PHP_EOL);
return 'Error: Falla en la solicitud. Código de estado HTTP: ' . $devicesBySiteId->getStatusCode(); // Return early if the request fails
}
$responsePasswordVault = $clientUnms->request('GET', 'vault/' . $deviceID . '/credentials', [
'headers' => [
'X-Auth-Token' => $authToken,
],
]);
if ($responsePasswordVault->getStatusCode() === 200) {
$dataPasswordVault = json_decode((string) $responsePasswordVault->getBody(), true);
// $jsonPasswordVault = json_encode($dataPasswordVault, JSON_PRETTY_PRINT);
//print_r($jsonPasswordVault . PHP_EOL); //Credenciales del dispositivo
if (isset($dataPasswordVault['credentials']['password'])) {
$dataPasswordVault = $dataPasswordVault['credentials']['password'];
} else {
// echo "No se encontró la contraseña en la respuesta de la API." . PHP_EOL;
// $logger->appendLog('No se encontró una contraseña en la bóveda para la antena de este cliente, es altamente probable que conserve una contraseña conocida.');
print_r('No se encontró una contraseña en la bóveda para la antena de este cliente, es altamente probable que conserve una contraseña conocida.' . PHP_EOL);
return "Error: No se encontró una contraseña en la bóveda para la antena de este cliente, es altamente probable que conserve una contraseña conocida."; // Return early if the password is not found
}
return $dataPasswordVault;
} else {
// echo "Error en la solicitud. Código de estado HTTP: " . $responsePasswordVault->getStatusCode() . PHP_EOL;
// $logger->appendLog('Error en la solicitud. Código de estado HTTP: ' . $responsePasswordVault->getStatusCode());
print_r('Error en la solicitud. Código de estado HTTP: ' . $responsePasswordVault->getStatusCode() . PHP_EOL);
return 'Error: Falla en la solicitud. Código de estado HTTP: ' . $responsePasswordVault->getStatusCode(); // Return early if the request fails
}
} catch (RequestException $requestException) {
// Manejar errores de la solicitud, si hay error 404 entonces responder que no se encontró niguna IP asociada a alguna antena o dispositivo de red
if ($requestException->hasResponse()) {
$response = $requestException->getResponse();
$statusCode = $response->getStatusCode();
$reason = $response->getReasonPhrase();
// echo "Error: {$statusCode} - {$reason}" . PHP_EOL;
// echo $response->getBody();
if ($statusCode == 404) {
// echo "No se encontró el cliente con la dirección IP proporcionada." . PHP_EOL;
// $logger->appendLog('No se encontró el cliente con la dirección IP proporcionada: ' . $IpAddressClientId);
print_r('No se encontró el cliente con la dirección IP proporcionada: ' . $IpAddressClientId . PHP_EOL);
return 'Error: No se encontró el cliente con la dirección IP proporcionada: ' . $IpAddressClientId; // Return early if the client is not found
}
return 'Error: ' . $reason; // Return early if the request fails
} else {
// echo "Error: " . $requestException->getMessage() . PHP_EOL;
// $logger->appendLog('Error: ' . $requestException->getMessage());
print_r('Error: ' . $requestException->getMessage() . PHP_EOL);
return 'Error: ' . $requestException->getMessage(); // Return early if the request fails
}
}
} else if (preg_match('/^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$/', $dataToSearch)) {
// La variable es una dirección MAC válida
// $logger->appendLog('Consulta por dirección MAC: ' . $dataToSearch);
print ('Consulta por dirección MAC: ' . $dataToSearch . PHP_EOL);
try {
// //para mandarla al endpoint de dispositivos por MAC se necesita convertir la cadena de la direccion mac en un formato como el siguiente ejemplo: para la dirección mac 60:22:32:c8:b2:c3 quedaría como 60%3A22%3A32%3Ac8%3Ab2%3Ac3
// $dataToSearch = str_replace(':', '%3A', $dataToSearch);
// $logger->appendLog('Consulta por dirección MAC: ' . $dataToSearch );
$responseDeviceByMAC = $clientUnms->request('GET', 'devices/mac/' . $dataToSearch, [
'headers' => [
'X-Auth-Token' => $authToken,
],
]);
if ($responseDeviceByMAC->getStatusCode() === 200) {
$dataDeviceByMAC = json_decode((string) $responseDeviceByMAC->getBody(), true);
$jsonDeviceByMac = json_encode($dataDeviceByMAC, JSON_PRETTY_PRINT);
// print_r($jsonDeviceByMac . PHP_EOL); //Devices por ID del sitio
//$logger->appendLog($jsonDeviceByMac.PHP_EOL);
//Ejemplo de $responseDeviceByMac en json: {"id":"84c8a581-154c-41db-81d5-a1b1c9ede411","type":"airMax","series":"AC"}
//obtener el id del dispositivo y si no existe el id del dispositivo entonces devolver un mensaje de error
if (isset($dataDeviceByMAC['id'])) {
$deviceId = $dataDeviceByMAC['id'];
// print_r('ID DEL DISPOSITIVO: ' . $deviceId . PHP_EOL); // ID del dispositivo
} else {
// echo "No se encontró el dispositivo con la dirección MAC proporcionada." . PHP_EOL;
// $logger->appendLog('No se encontró el dispositivo con la dirección MAC proporcionada: ' . $dataToSearch);
print_r('No se encontró el dispositivo con la dirección MAC proporcionada: ' . $dataToSearch . PHP_EOL);
return 'Error: No se encontró el dispositivo con la dirección MAC proporcionada: ' . $dataToSearch; // Return early if no device is found
}
}
$responsePasswordVault = $clientUnms->request('GET', 'vault/' . $deviceId . '/credentials', [
'headers' => [
'X-Auth-Token' => $authToken,
],
]);
if ($responsePasswordVault->getStatusCode() === 200) {
$dataPasswordVault = json_decode((string) $responsePasswordVault->getBody(), true);
// $jsonPasswordVault = json_encode($dataPasswordVault, JSON_PRETTY_PRINT);
//print_r($jsonPasswordVault . PHP_EOL); //Credenciales del dispositivo
if (isset($dataPasswordVault['credentials']['password'])) {
$dataPasswordVault = $dataPasswordVault['credentials']['password'];
} else {
// echo "No se encontró la contraseña en la respuesta de la API." . PHP_EOL;
// $logger->appendLog('No se encontró una contraseña en la bóveda para la antena de este cliente, es altamente probable que conserve una contraseña conocida.');
print_r('No se encontró una contraseña en la bóveda para la antena de este cliente, es altamente probable que conserve una contraseña conocida.' . PHP_EOL);
return "Error: No se encontró una contraseña en la bóveda para la antena de este cliente, es altamente probable que conserve una contraseña conocida."; // Return early if the password is not found
}
return $dataPasswordVault;
} else {
// echo "Error en la solicitud. Código de estado HTTP: " . $responsePasswordVault->getStatusCode() . PHP_EOL;
// $logger->appendLog('Error en la solicitud. Código de estado HTTP: ' . $responsePasswordVault->getStatusCode());
print_r('Error en la solicitud. Código de estado HTTP: ' . $responsePasswordVault->getStatusCode() . PHP_EOL);
return 'Error: Falla en la solicitud. Código de estado HTTP: ' . $responsePasswordVault->getStatusCode(); // Return early if the request fails
}
} catch (RequestException $requestException) {
// Manejar errores de la solicitud, si hay error 404 entonces responder que no se encontró niguna MAC asociada a alguna antena o dispositivo de red
if ($requestException->hasResponse()) {
$response = $requestException->getResponse();
$statusCode = $response->getStatusCode();
$reason = $response->getReasonPhrase();
// echo "Error: {$statusCode} - {$reason}" . PHP_EOL;
// echo $response->getBody();
if ($statusCode == 404) {
// echo "No se encontró el cliente con la dirección MAC proporcionada." . PHP_EOL;
// $logger->appendLog('No se encontró ninguna antena de cliente o dispositivo en la red con la dirección MAC proporcionada: ' . $dataToSearch);
print_r('No se encontró ninguna antena de cliente o dispositivo en la red con la dirección MAC proporcionada: ' . $dataToSearch . PHP_EOL);
return 'Error: No se encontró ninguna antena de cliente o dispositivo en la red con la dirección MAC proporcionada: ' . $dataToSearch; // Return early if the client is not found
}
return 'Error: ' . $reason; // Return early if the request fails
} else {
// echo "Error: " . $requestException->getMessage() . PHP_EOL;
// $logger->appendLog('Error: ' . $requestException->getMessage());
print_r('Error: ' . $requestException->getMessage() . PHP_EOL);
return 'Error: ' . $requestException->getMessage(); // Return early if the request fails
}
}
} else {
// La variable no es una dirección IP válida, se asume que es un ID
$IpAddressClientId = filter_var($dataToSearch, FILTER_SANITIZE_NUMBER_INT);
//print ('Consulta por ID: ' . $dataToSearch . PHP_EOL);
try {
//Obtener id del sitio por medio del servicio
$responseServices = $clientUcrm->get('clients/services?clientId=' . $IpAddressClientId, [
'headers' => [
'X-Auth-Token' => $authToken,
'Content-Type: application/json',
],
]);
} catch (RequestException $requestException) {
// Manejar errores de la solicitud
if ($requestException->hasResponse()) {
$response = $requestException->getResponse();
$statusCode = $response->getStatusCode();
$reason = $response->getReasonPhrase();
//si el statusCode es 404 significa que no se encontró el cliente
if ($statusCode == 404) {
echo "No se encontró el cliente con el ID proporcionado." . PHP_EOL;
$logger->appendLog('No se encontró el cliente con el ID proporcionado: ' . $IpAddressClientId);
// print_r('No se encontró el cliente con el ID proporcionado: ' . $IpAddressClientId . PHP_EOL);
return 'Error: No se encontró el cliente con el ID proporcionado: ' . $IpAddressClientId; // Return early if the client is not found
}
return 'Error: ' . $reason; // Return early if the request fails
} else {
// echo "Error: " . $requestException->getMessage() . PHP_EOL;
$logger->appendLog('Error: ' . $requestException->getMessage());
// print_r('Error: ' . $requestException->getMessage() . PHP_EOL);
return 'Error: ' . $requestException->getMessage(); // Return early if the request fails
}
}
if ($responseServices->getStatusCode() === 200) {
$dataServices = json_decode($responseServices->getBody()->getContents(), true);
// $jsonServices = json_encode($dataServices, JSON_PRETTY_PRINT);
// print_r($jsonServices . PHP_EOL);
if (isset($dataServices[0])) {
$unmsSiteID = $dataServices[0]['unmsClientSiteId']; // Example: 9c6798f3-0254-4e5b-bc3b-9da82fe16e46
} else {
// echo "No se encontraron servicios para el cliente proporcionado." . PHP_EOL;
$logger->appendLog('No se encontraron servicios para el cliente proporcionado: ' . $IpAddressClientId);
// print_r('No se encontraron servicios para el cliente proporcionado: ' . $IpAddressClientId . PHP_EOL);
return "Error: No se encontraron servicios para el cliente proporcionado: " . $IpAddressClientId; // Return early if no services are found
}
} else {
// echo "Error en la solicitud. Código de estado HTTP: " . $responseServices->getStatusCode() . PHP_EOL;
$logger->appendLog('Error en la solicitud. Código de estado HTTP: ' . $responseServices->getStatusCode());
// print_r('Error en la solicitud. Código de estado HTTP: ' . $responseServices->getStatusCode() . PHP_EOL);
return "Error: En la solicitud. Código de estado HTTP: " . $responseServices->getStatusCode();
}
try {
$responseDevicesBySite = $clientUnms->request('GET', 'devices?siteId=' . $unmsSiteID, [
'headers' => [
'X-Auth-Token' => $authToken,
],
]);
} catch (RequestException $requestException) {
// Manejar errores de la solicitud
if ($requestException->hasResponse()) {
$response = $requestException->getResponse();
$statusCode = $response->getStatusCode();
$reason = $response->getReasonPhrase();
//si el statusCode es 404 significa que no se encontró el cliente
if ($statusCode == 404) {
// echo "No se encontró el cliente con el ID proporcionado." . PHP_EOL;
$logger->appendLog('No se encontró el cliente con el ID proporcionado: ' . $IpAddressClientId);
// print_r('No se encontró el devicie con el ID proporcionado: ' . $IpAddressClientId . PHP_EOL);
return 'Error: No se encontró el devicie con el ID proporcionado: ' . $IpAddressClientId; // Return early if the client is not found
}
return 'Error: ' . $reason; // Return early if the request fails
} else {
// echo "Error: " . $requestException->getMessage() . PHP_EOL;
$logger->appendLog('Error: ' . $requestException->getMessage());
// print_r('Error: ' . $requestException->getMessage() . PHP_EOL);
return 'Error: ' . $requestException->getMessage(); // Return early if the request fails
}
}
if ($responseDevicesBySite->getStatusCode() === 200) {
$dataDevicesBySite = json_decode($responseDevicesBySite->getBody()->getContents(), true);
$jsonDevicesBySite = json_encode($dataDevicesBySite, JSON_PRETTY_PRINT);
//print_r($jsonDevicesBySite . PHP_EOL); //Devices por ID del sitio
//id del device al que está conectado el cliente
if (isset($dataDevicesBySite[0])) {
//verificar con iiset si existe la clave 'identification' y 'apDevice' en el primer elemento del array
if (isset($dataDevicesBySite[0]['identification']) && isset($dataDevicesBySite[0]['attributes']['apDevice'])) {
$idClientDevice = $dataDevicesBySite[0]['identification']['id'];
$deviceID = $dataDevicesBySite[0]['attributes']['apDevice']['id'];
} else {
// echo "No se encontró la clave 'identification' o 'apDevice' en la respuesta." . PHP_EOL;
$logger->appendLog('No se encontró la clave \'identification\' o \'apDevice\' en la respuesta.');
// print_r('Este cliente es un repetidor.' . PHP_EOL);
return "Este cliente es un repetidor."; // Return early if the key is not found
}
} else {
// echo "No se encontraron dispositivos para el sitio proporcionado." . PHP_EOL;
$logger->appendLog('No se encontraron dispositivos para el sitio proporcionado: ' . $unmsSiteID);
// print_r('No se encontraron dispositivos para el sitio proporcionado: ' . $unmsSiteID . PHP_EOL);
return "Error: No se encontraron dispositivos para el sitio proporcionado."; // Return early if no devices are found
}
} else {
// echo "Error en la solicitud. Código de estado HTTP: " . $responseDevicesBySite->getStatusCode() . PHP_EOL;
$logger->appendLog('Error en la solicitud. Código de estado HTTP: ' . $responseDevicesBySite->getStatusCode());
// print_r('Error en la solicitud. Código de estado HTTP: ' . $responseDevicesBySite->getStatusCode() . PHP_EOL);
return "Error: Falla en la solicitud. Código de estado HTTP: " . $responseDevicesBySite->getStatusCode();
}
try {
$responseDevicesBySite = $clientUnms->request('GET', 'devices/' . $deviceID, [
'headers' => [
'X-Auth-Token' => $authToken,
],
]);
} catch (RequestException $requestException) {
// Manejar errores de la solicitud
if ($requestException->hasResponse()) {
$response = $requestException->getResponse();
$statusCode = $response->getStatusCode();
$reason = $response->getReasonPhrase();
//si el statusCode es 404 significa que no se encontró el cliente
if ($statusCode == 404) {
// echo "No se encontró el cliente con el ID proporcionado." . PHP_EOL;
$logger->appendLog('No se encontró el cliente con el ID proporcionado: ' . $IpAddressClientId);
// print_r('No se encontró el device con el ID proporcionado: ' . $IpAddressClientId . PHP_EOL);
return 'Error: No se encontró el device con el ID proporcionado: ' . $IpAddressClientId; // Return early if the client is not found
}
return 'Error: ' . $reason; // Return early if the request fails
} else {
// echo "Error: " . $requestException->getMessage() . PHP_EOL;
$logger->appendLog('Error: ' . $requestException->getMessage());
// print_r('Error: ' . $requestException->getMessage() . PHP_EOL);
return 'Error: ' . $requestException->getMessage(); // Return early if the request fails
}
}
if ($responseDevicesBySite->getStatusCode() === 200) {
$dataDevices = json_decode($responseDevicesBySite->getBody()->getContents(), true);
$jsonDevices = json_encode($dataDevices, JSON_PRETTY_PRINT);
//print_r($jsonDevices . PHP_EOL);
try {
//print_r('ID del device al que está conectado el cliente: ' . $idDevice . PHP_EOL);
$responsePasswordVault = $clientUnms->request('GET', 'vault/' . $idClientDevice . '/credentials', [
'headers' => [
'X-Auth-Token' => $authToken,
],
]);
} catch (RequestException $requestException) {
// Manejar errores de la solicitud
if ($requestException->hasResponse()) {
$response = $requestException->getResponse();
$statusCode = $response->getStatusCode();
$reason = $response->getReasonPhrase();
//si el statusCode es 404 significa que no se encontró el cliente
if ($statusCode == 404) {
// echo "No se encontró el cliente con el ID proporcionado." . PHP_EOL;
$logger->appendLog('No se encontró el cliente con el ID proporcionado: ' . $IpAddressClientId);
// print_r('No se encontró el device con el ID proporcionado: ' . $IpAddressClientId . PHP_EOL);
return 'Error: No se encontró el device con el ID proporcionado: ' . $IpAddressClientId; // Return early if the client is not found
}
return 'Error: ' . $reason; // Return early if the request fails
} else {
// echo "Error: " . $requestException->getMessage() . PHP_EOL;
$logger->appendLog('Error: ' . $requestException->getMessage());
// print_r('Error: ' . $requestException->getMessage() . PHP_EOL);
return 'Error: ' . $requestException->getMessage(); // Return early if the request fails
}
}
if ($responsePasswordVault->getStatusCode() === 200) {
$dataPasswordVault = json_decode($responsePasswordVault->getBody()->getContents(), true);
$jsonPasswordVault = json_encode($dataPasswordVault, JSON_PRETTY_PRINT);
if (isset($dataPasswordVault['credentials']['password'])) {
$passwordVault = $dataPasswordVault['credentials']['password'];
return $passwordVault;
} else {
// echo "No se encontró la contraseña en la respuesta de la API." . PHP_EOL;
$logger->appendLog('No se encontró una contraseña en la bóveda para la antena de este cliente, es altamente probable que conserve una contraseña conocida.');
// print_r('No se encontró una contraseña en la bóveda para la antena de este cliente, es altamente probable que conserve una contraseña conocida.' . PHP_EOL);
return "Error: No se encontró una contraseña en la bóveda para la antena de este cliente, es altamente probable que conserve una contraseña conocida."; // Return early if the password is not found
}
} else {
// echo "Error en la solicitud. Código de estado HTTP: " . $responsePasswordVault->getStatusCode() . PHP_EOL;
$logger->appendLog('Error en la solicitud. Código de estado HTTP: ' . $responsePasswordVault->getStatusCode());
// print_r('Error en la solicitud. Código de estado HTTP: ' . $responsePasswordVault->getStatusCode() . PHP_EOL);
return 'Error: Falla en la solicitud. Código de estado HTTP: ' . $responsePasswordVault->getStatusCode(); // Return early if the request fails
}
} else {
// echo "Error en la solicitud. Código de estado HTTP: " . $responseDevicesBySite->getStatusCode() . PHP_EOL;
$logger->appendLog('Error en la solicitud. Código de estado HTTP: ' . $responseDevicesBySite->getStatusCode());
// print_r('Error en la solicitud. Código de estado HTTP: ' . $responseDevicesBySite->getStatusCode() . PHP_EOL);
return 'Error: Falla en la solicitud. Código de estado HTTP: ' . $responseDevicesBySite->getStatusCode(); // Return early if the request fails
}
}
}
}