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(); $arrInfoConnection = array(); $client->emit('get_connections', []); if ($packet = $client->wait('current_connections')) { $data = json_decode($packet->data, true); $arrInfoConnection = $data; } $client->close(); writeLog("Contenido raw del socket: " . json_encode($arrInfoConnection)); writeLog("Conexiones activas obtenidas: " . count($arrInfoConnection) . " usuarios"); return $arrInfoConnection; } 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(['value' => $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); writeLog("API Response: " . substr($response, 0, 100)); $decrypted = $result['response']['decrypted'] ?? null; writeLog("Desencriptando ID: $encryptedId -> $decrypted"); return $decrypted; } // Función para seleccionar usuario function selectUser($users) { writeLog("Seleccionando usuario de: " . implode(',', $users)); $arrInfoConnection = getActiveConnections(); $arrUsersConnected = array(); foreach ($arrInfoConnection as $userConnection) { $data = explode('.', $userConnection); $userConnected = decryptId($data[0]); if ($userConnected) { $arrUsersConnected[] = $userConnected; } } writeLog("Usuarios conectados: " . implode(',', $arrUsersConnected)); foreach ($users as $user) { if (in_array($user, $arrUsersConnected)) { writeLog("Usuario seleccionado: $user (conectado)"); return $user; } } 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, s.SOVA_IDET 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"])], ['BOTON' => 'Validar', 'FUNCION' => 'asignStateToApplication', 'PARAMETROS' => json_encode([$iduser, "1", $sovaData['idtask'], "Aprobada"])], ['BOTON' => 'Rechazar', 'FUNCION' => 'asignStateToApplication', 'PARAMETROS' => json_encode([$iduser, "1", $sovaData['idtask'], "Rechazada"])], ['idtask' => $row['SOVA_IDET']] ], $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, NOWF_IDEJ 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.", [['idtask' => $row['NOWF_IDEJ']]], $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";