| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 |
- <?php
- require_once __DIR__ . '/../vendor/autoload.php';
- use ElephantIO\Client;
- use ElephantIO\Engine\SocketIO\Version4X;
- // Variables de conexión
- $host = 'localhost';
- $dbname = 'samqa';
- $username = 'root';
- $password = 'root';
- $api_url = 'http://192.168.2.25:8000/api/emitNotification';
- $socket_url = 'http://localhost:3200';
- $log_file = __DIR__ . '/../storage/logs/workflow_notifications.log';
- // Función de log
- function writeLog($message)
- {
- global $log_file;
- $timestamp = date('Y-m-d H:i:s');
- file_put_contents($log_file, "[$timestamp] $message" . PHP_EOL, FILE_APPEND | LOCK_EX);
- }
- // Conexión a BD MySQL
- try {
- $pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
- $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
- writeLog("Conexión a BD establecida correctamente");
- } catch (PDOException $e) {
- writeLog("ERROR: Conexión a BD falló - " . $e->getMessage());
- die("Error de conexión: " . $e->getMessage());
- }
- // Función para obtener conexiones activas del socket
- function getActiveConnections()
- {
- global $socket_url;
- try {
- $client = new Client(new Version4X($socket_url));
- $client->initialize();
- // Emitir evento para obtener conexiones
- $client->emit('get_connections', []);
- // Escuchar respuesta
- $connections = [];
- $client->wait('current_connections', function ($data) use (&$connections) {
- $connections = json_decode($data, true);
- });
- $client->close();
- writeLog("Contenido raw del socket: " . json_encode($connections));
- writeLog("Conexiones activas obtenidas: " . count($connections) . " usuarios");
- return $connections;
- } catch (Exception $e) {
- writeLog("ERROR: No se pudo conectar al socket - " . $e->getMessage());
- return [];
- }
- }
- // Función para desencriptar ID
- function decryptId($encryptedId)
- {
- $ch = curl_init('http://192.168.2.25:8000/api/decrypt');
- curl_setopt($ch, CURLOPT_POST, true);
- curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(['encrypted' => $encryptedId]));
- curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
- $response = curl_exec($ch);
- curl_close($ch);
- $result = json_decode($response, true);
- $decrypted = $result['decrypted'] ?? null;
- writeLog("Desencriptando ID: $encryptedId -> $decrypted");
- return $decrypted;
- }
- // Función para seleccionar usuario
- function selectUser($users)
- {
- writeLog("Seleccionando usuario de: " . implode(',', $users));
- $connections = getActiveConnections();
- foreach ($connections as $conn) {
- $connParts = explode('.', $conn);
- $encryptedUserId = $connParts[0];
- $decryptedUserId = decryptId($encryptedUserId);
- if ($decryptedUserId && in_array($decryptedUserId, $users)) {
- writeLog("Usuario seleccionado: $decryptedUserId (conectado)");
- return $decryptedUserId;
- }
- }
- writeLog("Ningún usuario conectado, usando por defecto: 0000000001");
- return '0000000001';
- }
- // Función para enviar notificación
- function emitNotinotification($module, $title, $content, $actions, $audience)
- {
- global $api_url;
- $data = [
- 'module' => $module,
- 'title' => $title,
- 'content' => $content,
- 'actions' => $actions,
- 'audience' => $audience
- ];
- $ch = curl_init($api_url);
- curl_setopt($ch, CURLOPT_POST, true);
- curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
- curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
- $response = curl_exec($ch);
- $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
- curl_close($ch);
- writeLog("API Response: HTTP $httpCode - " . substr($response, 0, 100));
- return $httpCode === 200;
- }
- // Consulta SOVA
- $stmt = $pdo->prepare("
- SELECT s.SOVA_IDSV, s.SOVA_INEX, t.TAWO_USAV
- FROM S002V01TSOVA s
- JOIN S002V01TEJTW e ON s.SOVA_IDET = e.EJTW_IDET
- JOIN S002V01TTAWO t ON e.EJTW_IDTA = t.TAWO_IDTA
- WHERE s.SOVA_ESTA = 'Pendiente de envio'
- ");
- $stmt->execute();
- $sovaResults = $stmt->fetchAll(PDO::FETCH_ASSOC);
- foreach ($sovaResults as $row) {
- $sovaData = json_decode($row['SOVA_INEX'], true)[0];
- $users = json_decode($row['TAWO_USAV'], true);
- $iduser = selectUser($users);
- $success = emitNotinotification(
- 'S002V01M03GEPR',
- "La tarea: {$sovaData['nombre_t']} secuencia {$sovaData['secuencia']} requiere validación",
- "La tarea: {$sovaData['nombre_t']} secuencia {$sovaData['secuencia']} del workflow: {$sovaData['nombre_w']}, requiere validación timeout: {$sovaData['timeout']}.",
- [
- ['BOTON' => 'Ver todas las solicitudes', 'FUNCION' => 'getValidateApplications', 'PARAMETROS' => json_encode([$iduser, "1"]), true],
- ['BOTON' => 'Validar', 'FUNCION' => 'asignStateToApplication', 'PARAMETROS' => json_encode([$iduser, "1", $sovaData['idtask'], "Aprobada"]), true],
- ['BOTON' => 'Rechazar', 'FUNCION' => 'asignStateToApplication', 'PARAMETROS' => json_encode([$iduser, "1", $sovaData['idtask'], "Rechazada"]), true]
- ],
- $iduser
- );
- if ($success) {
- $updateStmt = $pdo->prepare("UPDATE S002V01TSOVA SET SOVA_ESTA = 'Pendiente', SOVA_IDUS = ? WHERE SOVA_IDSV = ?");
- $updateStmt->execute([$iduser, $row['SOVA_IDSV']]);
- writeLog("SOVA actualizada: ID {$row['SOVA_IDSV']} - Estado: Pendiente");
- } else {
- writeLog("ERROR: Falló envío SOVA ID {$row['SOVA_IDSV']}");
- }
- }
- // Consulta NOWF
- $stmt = $pdo->prepare("SELECT NOWF_IDNE, NOWF_INEX, NOWF_USNO FROM S002V01TNOEJ WHERE NOWF_ESTA = 'pendiente de envio'");
- $stmt->execute();
- $nowfResults = $stmt->fetchAll(PDO::FETCH_ASSOC);
- foreach ($nowfResults as $row) {
- $nowfData = json_decode($row['NOWF_INEX'], true)[0];
- $usersNoti = json_decode($row['NOWF_USNO'], true);
- $success = emitNotinotification(
- 'S002V01M03GEPR',
- "La tarea: {$nowfData['nombre_t']} secuencia {$nowfData['secuencia']} ha sido ejecutada",
- "La tarea: {$nowfData['nombre_t']} secuencia {$nowfData['secuencia']} del workflow: {$nowfData['nombre_w']}, ha sido ejecutada.",
- [],
- $usersNoti
- );
- if ($success) {
- $updateStmt = $pdo->prepare("UPDATE S002V01TNOEJ SET NOWF_ESTA = 'Enviada' WHERE NOWF_IDNE = ?");
- $updateStmt->execute([$row['NOWF_IDNE']]);
- writeLog("NOWF actualizada: ID {$row['NOWF_IDNE']} - Estado: Enviada");
- } else {
- writeLog("ERROR: Falló envío NOWF ID {$row['NOWF_IDNE']}");
- }
- }
- writeLog("Script ejecutado correctamente");
- echo "Script ejecutado correctamente\n";
|