/** * Obtener solicitudes pendientes que cumplen plazos para la ronda actual */ function obtenerSolicitudesParaRonda(PDO $pdo, string $fecha_apertura_debate): array { // Solo incluir solicitudes recibidas ANTES de la fecha de apertura // para que tengan los días completos de debate $sql = "SELECT * FROM miembros WHERE activo = 1 AND (cargo = 'solicitante' OR cargo = 'solicitante-temporal') AND (estado_solicitud IS NULL OR estado_solicitud = 'activa') AND fecha_solicitud < ? ORDER BY fecha_solicitud ASC"; $stmt = $pdo->prepare($sql); $stmt->execute([$fecha_apertura_debate]); return $stmt->fetchAll(); } /** * Guardar estado de la ronda actual (con file locking) */ function guardarEstadoRonda(string $archivo, array $datos): bool { $fp = fopen($archivo, 'c'); if ($fp === false) { return false; } if (flock($fp, LOCK_EX)) { $result = fwrite($fp, json_encode($datos, JSON_PRETTY_PRINT)); ftruncate($fp, ftell($fp)); flock($fp, LOCK_UN); fclose($fp); return $result !== false; } fclose($fp); return false; } /** * Cargar estado de la ronda actual (con file locking) */ function cargarEstadoRonda(string $archivo): ?array { if (!file_exists($archivo)) { return null; } $fp = fopen($archivo, 'r'); if ($fp === false) { return null; } if (flock($fp, LOCK_SH)) { $content = stream_get_contents($fp); flock($fp, LOCK_UN); fclose($fp); return json_decode($content, true); } fclose($fp); return null; } /** * Leer archivo de estado simple (periodo_debate, periodo_votacion) con locking */ function leerArchivoEstado(string $archivo): ?string { if (!file_exists($archivo)) { return null; } $fp = fopen($archivo, 'r'); if ($fp === false) { return null; } if (flock($fp, LOCK_SH)) { $content = trim(stream_get_contents($fp)); flock($fp, LOCK_UN); fclose($fp); return $content !== '' ? $content : null; } fclose($fp); return null; } /** * Escribir archivo de estado simple con locking */ function escribirArchivoEstado(string $archivo, string $contenido): bool { $fp = fopen($archivo, 'c'); if ($fp === false) { return false; } if (flock($fp, LOCK_EX)) { $result = fwrite($fp, $contenido); ftruncate($fp, ftell($fp)); flock($fp, LOCK_UN); fclose($fp); return $result !== false; } fclose($fp); return false; } /** * Borrar archivo de estado con locking */ function borrarArchivoEstado(string $archivo): bool { if (!file_exists($archivo)) { return true; } // Abrir con lock exclusivo antes de borrar $fp = fopen($archivo, 'c'); if ($fp === false) { // Si no se puede abrir, intentar borrar directamente return @unlink($archivo); } if (flock($fp, LOCK_EX)) { flock($fp, LOCK_UN); fclose($fp); return @unlink($archivo); } fclose($fp); return false; }