321 lines
15 KiB
PHP
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>
|