WorkflowNotificationsManager.php 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. <?php
  2. require_once __DIR__ . '/../vendor/autoload.php';
  3. use ElephantIO\Client;
  4. use ElephantIO\Engine\SocketIO\Version4X;
  5. // Variables de conexión
  6. $host = 'localhost';
  7. $dbname = 'samqa';
  8. $username = 'root';
  9. $password = 'root';
  10. $api_url = 'http://192.168.2.25:8000/api/emitNotification';
  11. $socket_url = 'http://localhost:3200';
  12. $log_file = __DIR__ . '/../storage/logs/workflow_notifications.log';
  13. // Función de log
  14. function writeLog($message)
  15. {
  16. global $log_file;
  17. $timestamp = date('Y-m-d H:i:s');
  18. file_put_contents($log_file, "[$timestamp] $message" . PHP_EOL, FILE_APPEND | LOCK_EX);
  19. }
  20. // Conexión a BD MySQL
  21. try {
  22. $pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
  23. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  24. writeLog("Conexión a BD establecida correctamente");
  25. } catch (PDOException $e) {
  26. writeLog("ERROR: Conexión a BD falló - " . $e->getMessage());
  27. die("Error de conexión: " . $e->getMessage());
  28. }
  29. // Función para obtener conexiones activas del socket
  30. function getActiveConnections()
  31. {
  32. global $socket_url;
  33. try {
  34. $client = new Client(new Version4X($socket_url));
  35. $client->initialize();
  36. $arrInfoConnection = array();
  37. $client->emit('get_connections', []);
  38. if ($packet = $client->wait('current_connections')) {
  39. $data = json_decode($packet->data, true);
  40. $arrInfoConnection = $data;
  41. }
  42. $client->close();
  43. writeLog("Contenido raw del socket: " . json_encode($arrInfoConnection));
  44. writeLog("Conexiones activas obtenidas: " . count($arrInfoConnection) . " usuarios");
  45. return $arrInfoConnection;
  46. } catch (Exception $e) {
  47. writeLog("ERROR: No se pudo conectar al socket - " . $e->getMessage());
  48. return [];
  49. }
  50. }
  51. // Función para desencriptar ID
  52. function decryptId($encryptedId)
  53. {
  54. $ch = curl_init('http://192.168.2.25:8000/api/decrypt');
  55. curl_setopt($ch, CURLOPT_POST, true);
  56. curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(['value' => $encryptedId]));
  57. curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
  58. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  59. $response = curl_exec($ch);
  60. curl_close($ch);
  61. $result = json_decode($response, true);
  62. writeLog("API Response: " . substr($response, 0, 100));
  63. $decrypted = $result['response']['decrypted'] ?? null;
  64. writeLog("Desencriptando ID: $encryptedId -> $decrypted");
  65. return $decrypted;
  66. }
  67. // Función para seleccionar usuario
  68. function selectUser($users)
  69. {
  70. writeLog("Seleccionando usuario de: " . implode(',', $users));
  71. $arrInfoConnection = getActiveConnections();
  72. $arrUsersConnected = array();
  73. foreach ($arrInfoConnection as $userConnection) {
  74. $data = explode('.', $userConnection);
  75. $userConnected = decryptId($data[0]);
  76. if ($userConnected) {
  77. $arrUsersConnected[] = $userConnected;
  78. }
  79. }
  80. writeLog("Usuarios conectados: " . implode(',', $arrUsersConnected));
  81. foreach ($users as $user) {
  82. if (in_array($user, $arrUsersConnected)) {
  83. writeLog("Usuario seleccionado: $user (conectado)");
  84. return $user;
  85. }
  86. }
  87. writeLog("Ningún usuario conectado, usando por defecto: 0000000001");
  88. return '0000000001';
  89. }
  90. // Función para enviar notificación
  91. function emitNotinotification($module, $title, $content, $actions, $audience)
  92. {
  93. global $api_url;
  94. $data = [
  95. 'module' => $module,
  96. 'title' => $title,
  97. 'content' => $content,
  98. 'actions' => $actions,
  99. 'audience' => $audience
  100. ];
  101. $ch = curl_init($api_url);
  102. curl_setopt($ch, CURLOPT_POST, true);
  103. curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
  104. curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
  105. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  106. $response = curl_exec($ch);
  107. $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
  108. curl_close($ch);
  109. writeLog("API Response: HTTP $httpCode - " . substr($response, 0, 100));
  110. return $httpCode === 200;
  111. }
  112. // Consulta SOVA
  113. $stmt = $pdo->prepare("
  114. SELECT s.SOVA_IDSV, s.SOVA_INEX, t.TAWO_USAV, s.SOVA_IDET
  115. FROM S002V01TSOVA s
  116. JOIN S002V01TEJTW e ON s.SOVA_IDET = e.EJTW_IDET
  117. JOIN S002V01TTAWO t ON e.EJTW_IDTA = t.TAWO_IDTA
  118. WHERE s.SOVA_ESTA = 'Pendiente de envio'
  119. ");
  120. $stmt->execute();
  121. $sovaResults = $stmt->fetchAll(PDO::FETCH_ASSOC);
  122. foreach ($sovaResults as $row) {
  123. $sovaData = json_decode($row['SOVA_INEX'], true)[0];
  124. $users = json_decode($row['TAWO_USAV'], true);
  125. $iduser = selectUser($users);
  126. $success = emitNotinotification(
  127. 'S002V01M03GEPR',
  128. "La tarea: {$sovaData['nombre_t']} secuencia {$sovaData['secuencia']} requiere validación",
  129. "La tarea: {$sovaData['nombre_t']} secuencia {$sovaData['secuencia']} del workflow: {$sovaData['nombre_w']}, requiere validación timeout: {$sovaData['timeout']}.",
  130. [
  131. ['BOTON' => 'Ver todas las solicitudes', 'FUNCION' => 'getValidateApplications', 'PARAMETROS' => json_encode([$iduser, "1"])],
  132. ['BOTON' => 'Validar', 'FUNCION' => 'asignStateToApplication', 'PARAMETROS' => json_encode([$iduser, "1", $sovaData['idtask'], "Aprobada"])],
  133. ['BOTON' => 'Rechazar', 'FUNCION' => 'asignStateToApplication', 'PARAMETROS' => json_encode([$iduser, "1", $sovaData['idtask'], "Rechazada"])],
  134. ['idtask' => $row['SOVA_IDET']]
  135. ],
  136. $iduser
  137. );
  138. if ($success) {
  139. $updateStmt = $pdo->prepare("UPDATE S002V01TSOVA SET SOVA_ESTA = 'Pendiente', SOVA_IDUS = ? WHERE SOVA_IDSV = ?");
  140. $updateStmt->execute([$iduser, $row['SOVA_IDSV']]);
  141. writeLog("SOVA actualizada: ID {$row['SOVA_IDSV']} - Estado: Pendiente");
  142. } else {
  143. writeLog("ERROR: Falló envío SOVA ID {$row['SOVA_IDSV']}");
  144. }
  145. }
  146. // Consulta NOWF
  147. $stmt = $pdo->prepare("SELECT NOWF_IDNE, NOWF_INEX, NOWF_USNO, NOWF_IDEJ FROM S002V01TNOEJ WHERE NOWF_ESTA = 'pendiente de envio'");
  148. $stmt->execute();
  149. $nowfResults = $stmt->fetchAll(PDO::FETCH_ASSOC);
  150. foreach ($nowfResults as $row) {
  151. $nowfData = json_decode($row['NOWF_INEX'], true)[0];
  152. $usersNoti = json_decode($row['NOWF_USNO'], true);
  153. $success = emitNotinotification(
  154. 'S002V01M03GEPR',
  155. "La tarea: {$nowfData['nombre_t']} secuencia {$nowfData['secuencia']} ha sido ejecutada",
  156. "La tarea: {$nowfData['nombre_t']} secuencia {$nowfData['secuencia']} del workflow: {$nowfData['nombre_w']}, ha sido ejecutada.",
  157. [['idtask' => $row['NOWF_IDEJ']]],
  158. $usersNoti
  159. );
  160. if ($success) {
  161. $updateStmt = $pdo->prepare("UPDATE S002V01TNOEJ SET NOWF_ESTA = 'Enviada' WHERE NOWF_IDNE = ?");
  162. $updateStmt->execute([$row['NOWF_IDNE']]);
  163. writeLog("NOWF actualizada: ID {$row['NOWF_IDNE']} - Estado: Enviada");
  164. } else {
  165. writeLog("ERROR: Falló envío NOWF ID {$row['NOWF_IDNE']}");
  166. }
  167. }
  168. writeLog("Script ejecutado correctamente");
  169. echo "Script ejecutado correctamente\n";