Files
whatsapp/system_validator.php
2026-01-21 08:28:54 -05:00

321 lines
15 KiB
PHP

<?php
/**
* Validador del sistema WhatsApp Bot Manager
* Verifica que todos los componentes estén funcionando correctamente
* Fecha: 2 de enero de 2026
*/
require_once 'config/config.php';
header('Content-Type: text/html; charset=utf-8');
?>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Validación del Sistema - WhatsApp Bot</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
<style>
.test-item {
padding: 15px;
margin: 10px 0;
border-radius: 8px;
border: 1px solid #dee2e6;
}
.test-success { background-color: #d4edda; border-color: #c3e6cb; }
.test-warning { background-color: #fff3cd; border-color: #ffeaa7; }
.test-error { background-color: #f8d7da; border-color: #f5c6cb; }
.test-info { background-color: #d1ecf1; border-color: #bee5eb; }
</style>
</head>
<body>
<div class="container mt-5">
<div class="row">
<div class="col-md-12">
<h1 class="text-center mb-4">
<i class="fas fa-check-circle text-primary"></i>
Validación del Sistema WhatsApp Bot
</h1>
<div class="card mb-4">
<div class="card-header">
<h5><i class="fas fa-info-circle"></i> Información del Sistema</h5>
</div>
<div class="card-body">
<p><strong>Versión:</strong> <?= APP_VERSION ?></p>
<p><strong>Desarrollador:</strong> <?= DEVELOPER_NAME ?></p>
<p><strong>URL Base:</strong> <?= AUTO_DETECTED_URL ?></p>
<p><strong>Zona Horaria:</strong> <?= TIMEZONE ?></p>
<p><strong>Fecha/Hora:</strong> <?= date('Y-m-d H:i:s') ?></p>
</div>
</div>
<?php
$tests = [];
// Test 1: PHP Version
$phpVersion = phpversion();
$phpOk = version_compare($phpVersion, '8.0.0', '>=');
$tests[] = [
'name' => 'Versión de PHP',
'status' => $phpOk ? 'success' : 'error',
'message' => "PHP $phpVersion " . ($phpOk ? '✓' : '✗ (Se requiere PHP 8.0+)'),
'details' => $phpOk ? 'Versión compatible' : 'Actualiza a PHP 8.0 o superior'
];
// Test 2: Extensiones PHP
$requiredExtensions = ['pdo', 'pdo_mysql', 'curl', 'json', 'mbstring', 'openssl'];
$missingExtensions = [];
foreach ($requiredExtensions as $ext) {
if (!extension_loaded($ext)) {
$missingExtensions[] = $ext;
}
}
$extOk = empty($missingExtensions);
$tests[] = [
'name' => 'Extensiones PHP',
'status' => $extOk ? 'success' : 'error',
'message' => $extOk ? 'Todas las extensiones están disponibles ✓' : 'Faltan extensiones: ' . implode(', ', $missingExtensions),
'details' => $extOk ? 'PDO, cURL, JSON, mbstring, OpenSSL' : 'Instala las extensiones faltantes'
];
// Test 3: Conexión a Base de Datos
$dbOk = false;
$dbMessage = '';
$dbDetails = '';
try {
$db = Database::getInstance();
$result = $db->fetch("SELECT 1 as test");
$dbOk = ($result['test'] == 1);
$dbMessage = 'Conexión exitosa ✓';
$dbDetails = 'Host: ' . DB_HOST . ', DB: ' . DB_NAME;
} catch (Exception $e) {
$dbMessage = 'Error de conexión: ' . $e->getMessage();
$dbDetails = 'Verifica la configuración en config.php';
}
$tests[] = [
'name' => 'Base de Datos',
'status' => $dbOk ? 'success' : 'error',
'message' => $dbMessage,
'details' => $dbDetails
];
// Test 4: Estructura de tablas (solo si DB está OK)
$tablesOk = false;
$tablesMessage = '';
$tablesDetails = '';
if ($dbOk) {
try {
$requiredTables = ['users', 'conversations', 'menus', 'menu_options', 'autoresponses', 'system_config'];
$db = Database::getInstance();
$existingTables = [];
$missingTables = [];
foreach ($requiredTables as $table) {
$result = $db->fetch("SHOW TABLES LIKE '$table'");
if ($result) {
$existingTables[] = $table;
} else {
$missingTables[] = $table;
}
}
$tablesOk = empty($missingTables);
$tablesMessage = $tablesOk ? 'Todas las tablas existen ✓' : 'Faltan tablas: ' . implode(', ', $missingTables);
$tablesDetails = 'Tablas encontradas: ' . count($existingTables) . '/' . count($requiredTables);
} catch (Exception $e) {
$tablesMessage = 'Error verificando tablas: ' . $e->getMessage();
$tablesDetails = 'Ejecuta el instalador para crear las tablas';
}
} else {
$tablesMessage = 'No se puede verificar (DB no disponible)';
$tablesDetails = 'Primero arregla la conexión a la base de datos';
}
$tests[] = [
'name' => 'Estructura de Base de Datos',
'status' => $tablesOk ? 'success' : ($dbOk ? 'error' : 'warning'),
'message' => $tablesMessage,
'details' => $tablesDetails
];
// Test 5: Archivos críticos
$criticalFiles = [
'classes/Database.php',
'services/BotService.php',
'services/WhatsAppService.php',
'api/webhook.php',
'api/send_message.php'
];
$missingFiles = [];
foreach ($criticalFiles as $file) {
if (!file_exists($file)) {
$missingFiles[] = $file;
}
}
$filesOk = empty($missingFiles);
$tests[] = [
'name' => 'Archivos Críticos',
'status' => $filesOk ? 'success' : 'error',
'message' => $filesOk ? 'Todos los archivos críticos están presentes ✓' : 'Faltan archivos: ' . implode(', ', $missingFiles),
'details' => 'Classes, Services, APIs'
];
// Test 6: Permisos de archivos
$logsDir = 'logs';
$logsWritable = is_dir($logsDir) && is_writable($logsDir);
$tests[] = [
'name' => 'Permisos de Escritura',
'status' => $logsWritable ? 'success' : 'warning',
'message' => $logsWritable ? 'Directorio de logs escribible ✓' : 'Directorio de logs no escribible',
'details' => $logsWritable ? 'Los logs se pueden escribir correctamente' : 'chmod 755 en el directorio logs'
];
// Test 7: Configuración WhatsApp
$whatsappErrors = validateWhatsAppConfig();
$whatsappOk = empty($whatsappErrors);
$tests[] = [
'name' => 'Configuración WhatsApp',
'status' => $whatsappOk ? 'success' : 'warning',
'message' => $whatsappOk ? 'WhatsApp configurado correctamente ✓' : 'Configuración pendiente',
'details' => $whatsappOk ? 'Token, Phone ID y Webhook configurados' : implode(', ', $whatsappErrors)
];
// Test 8: Estado de instalación
$installationCompleted = isInstallationCompleted();
$tests[] = [
'name' => 'Estado de Instalación',
'status' => $installationCompleted ? 'success' : 'info',
'message' => $installationCompleted ? 'Instalación completada ✓' : 'Instalación pendiente',
'details' => $installationCompleted ? 'Sistema listo para usar' : 'Ejecuta install.php para completar'
];
// Test 9: Conectividad cURL
$curlOk = false;
$curlMessage = '';
if (function_exists('curl_version')) {
$curlInfo = curl_version();
$curlOk = true;
$curlMessage = 'cURL disponible v' . $curlInfo['version'] . ' ✓';
} else {
$curlMessage = 'cURL no disponible';
}
$tests[] = [
'name' => 'Conectividad cURL',
'status' => $curlOk ? 'success' : 'error',
'message' => $curlMessage,
'details' => $curlOk ? 'Puede comunicarse con APIs externas' : 'Se requiere cURL para WhatsApp API'
];
// Test 10: Memoria y límites PHP
$memoryLimit = ini_get('memory_limit');
$maxExecution = ini_get('max_execution_time');
$postMaxSize = ini_get('post_max_size');
$uploadMaxSize = ini_get('upload_max_filesize');
$tests[] = [
'name' => 'Límites PHP',
'status' => 'info',
'message' => 'Configuración actual del servidor',
'details' => "Memoria: $memoryLimit, Ejecución: {$maxExecution}s, POST: $postMaxSize, Upload: $uploadMaxSize"
];
// Mostrar resultados
foreach ($tests as $test) {
$statusClass = 'test-' . $test['status'];
$iconClass = [
'success' => 'fa-check-circle text-success',
'error' => 'fa-times-circle text-danger',
'warning' => 'fa-exclamation-triangle text-warning',
'info' => 'fa-info-circle text-info'
][$test['status']];
echo "<div class='test-item $statusClass'>";
echo "<h6><i class='fas $iconClass'></i> {$test['name']}</h6>";
echo "<p class='mb-1'><strong>{$test['message']}</strong></p>";
echo "<small class='text-muted'>{$test['details']}</small>";
echo "</div>";
}
// Resumen
$totalTests = count($tests);
$successCount = count(array_filter($tests, fn($t) => $t['status'] === 'success'));
$errorCount = count(array_filter($tests, fn($t) => $t['status'] === 'error'));
$warningCount = count(array_filter($tests, fn($t) => $t['status'] === 'warning'));
$infoCount = count(array_filter($tests, fn($t) => $t['status'] === 'info'));
?>
<div class="card mt-4">
<div class="card-header">
<h5><i class="fas fa-chart-pie"></i> Resumen de Validación</h5>
</div>
<div class="card-body">
<div class="row text-center">
<div class="col-md-3">
<h3 class="text-success"><?= $successCount ?></h3>
<small>Exitosos</small>
</div>
<div class="col-md-3">
<h3 class="text-danger"><?= $errorCount ?></h3>
<small>Errores</small>
</div>
<div class="col-md-3">
<h3 class="text-warning"><?= $warningCount ?></h3>
<small>Advertencias</small>
</div>
<div class="col-md-3">
<h3 class="text-info"><?= $infoCount ?></h3>
<small>Información</small>
</div>
</div>
<hr>
<div class="text-center">
<?php if ($errorCount === 0): ?>
<h4 class="text-success">
<i class="fas fa-thumbs-up"></i>
Sistema Validado Correctamente
</h4>
<p class="text-muted">Tu instalación de WhatsApp Bot está lista para funcionar</p>
<a href="index.php" class="btn btn-success btn-lg">
<i class="fas fa-rocket"></i>
Acceder al Sistema
</a>
<?php else: ?>
<h4 class="text-warning">
<i class="fas fa-tools"></i>
Se Requiere Configuración
</h4>
<p class="text-muted">Hay <?= $errorCount ?> error(es) que deben solucionarse antes de continuar</p>
<a href="instalacion.html" class="btn btn-primary btn-lg">
<i class="fas fa-cog"></i>
Ir al Instalador
</a>
<?php endif; ?>
</div>
</div>
</div>
<div class="text-center mt-4">
<small class="text-muted">
WhatsApp Bot Manager v<?= APP_VERSION ?> -
<a href="<?= DEVELOPER_URL ?>" target="_blank"><?= DEVELOPER_NAME ?></a>
</small>
</div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
<script>
// Auto-refresh cada 30 segundos si hay errores
<?php if ($errorCount > 0): ?>
setTimeout(() => {
window.location.reload();
}, 30000);
<?php endif; ?>
</script>
</body>
</html>