TimeoutValidator.php 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. <?php
  2. require_once __DIR__ . '/../vendor/autoload.php';
  3. // Variables de conexión
  4. $host = 'localhost';
  5. $dbname = 'samqa';
  6. $username = 'root';
  7. $password = 'root';
  8. $log_file = __DIR__ . '/../storage/logs/timeout_validator.log';
  9. // Función de log
  10. function writeLog($message)
  11. {
  12. global $log_file;
  13. $timestamp = date('Y-m-d H:i:s');
  14. file_put_contents($log_file, "[$timestamp] $message" . PHP_EOL, FILE_APPEND | LOCK_EX);
  15. }
  16. // Conexión a BD
  17. try {
  18. $pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
  19. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  20. writeLog("Conexión a BD establecida correctamente");
  21. } catch (PDOException $e) {
  22. writeLog("ERROR: Conexión a BD falló - " . $e->getMessage());
  23. die("Error de conexión: " . $e->getMessage());
  24. }
  25. // Validar timeouts vencidos
  26. $stmt = $pdo->prepare("
  27. SELECT s.SOVA_IDSV, s.SOVA_INEX, s.SOVA_FEEN, s.SOVA_IDET
  28. FROM S002V01TSOVA s
  29. WHERE s.SOVA_ESTA = 'Pendiente'
  30. ");
  31. $stmt->execute();
  32. $pendingSOVAs = $stmt->fetchAll(PDO::FETCH_ASSOC);
  33. writeLog("Validando timeouts de " . count($pendingSOVAs) . " SOVAs pendientes");
  34. foreach ($pendingSOVAs as $row) {
  35. $sovaData = json_decode($row['SOVA_INEX'], true)[0];
  36. $timeout = $sovaData['timeout'];
  37. // Parsear timeout (ej: "30min", "2hr", "45seg", "6 min")
  38. preg_match('/(\d+)\s*(seg|min|hr)/', $timeout, $matches);
  39. if (count($matches) !== 3) continue;
  40. $valor = (int)$matches[1];
  41. $unidad = $matches[2];
  42. // Convertir a DateInterval
  43. $intervalSpec = match ($unidad) {
  44. 'seg' => "PT{$valor}S",
  45. 'min' => "PT{$valor}M",
  46. 'hr' => "PT{$valor}H"
  47. };
  48. $fechaEnvio = new DateTime($row['SOVA_FEEN']);
  49. $fechaLimite = clone $fechaEnvio;
  50. $fechaLimite->add(new DateInterval($intervalSpec));
  51. $ahora = new DateTime();
  52. //writeLog($fechaLimite);
  53. if ($ahora >= $fechaLimite) {
  54. $updateStmt = $pdo->prepare("UPDATE S002V01TSOVA SET SOVA_ESTA = 'Validada por timeout', SOVA_FERE = NOW() WHERE SOVA_IDSV = ?");
  55. $updateStmt->execute([$row['SOVA_IDSV']]);
  56. writeLog("SOVA autovalidada por timeout: ID {$row['SOVA_IDSV']} - Timeout: {$timeout}");
  57. }
  58. }
  59. writeLog("Validación de timeouts completada");
  60. echo "Validación de timeouts completada\n";