Files
whatsapp/install_laboratorio.php
T
2026-01-13 01:48:33 -05:00

268 lines
12 KiB
PHP

<?php
/**
* Script de Instalación Automática
* Laboratorio Ximena Caicedo - Sistema de Chatbot WhatsApp
* Fecha: 13 de enero de 2026
*/
require_once __DIR__ . '/config/config.php';
// Configuración de tiempo de ejecución
set_time_limit(300); // 5 minutos
ini_set('display_errors', 1);
error_reporting(E_ALL);
?>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Instalación - Laboratorio Ximena Caicedo</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>
body {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
min-height: 100vh;
padding: 40px 0;
}
.install-container {
max-width: 800px;
margin: 0 auto;
}
.install-card {
background: white;
border-radius: 15px;
box-shadow: 0 10px 40px rgba(0,0,0,0.2);
padding: 40px;
}
.step {
padding: 15px;
margin: 10px 0;
border-radius: 8px;
background: #f8f9fa;
}
.step.success {
background: #d4edda;
border-left: 4px solid #28a745;
}
.step.error {
background: #f8d7da;
border-left: 4px solid #dc3545;
}
.step.running {
background: #d1ecf1;
border-left: 4px solid #17a2b8;
}
.logo {
text-align: center;
margin-bottom: 30px;
}
.logo i {
font-size: 60px;
color: #667eea;
}
</style>
</head>
<body>
<div class="install-container">
<div class="install-card">
<div class="logo">
<i class="fas fa-flask"></i>
<h2>Laboratorio Ximena Caicedo</h2>
<p class="text-muted">Instalación del Sistema de Chatbot WhatsApp</p>
</div>
<div id="installation-steps">
<?php
$success = true;
$steps = [];
try {
// PASO 1: Verificar conexión a la base de datos
echo '<div class="step running">';
echo '<i class="fas fa-database"></i> Verificando conexión a la base de datos...';
flush();
$db = Database::getInstance();
echo ' <span class="text-success"><i class="fas fa-check-circle"></i> Conectado</span>';
echo '</div>';
$steps[] = ['name' => 'Conexión DB', 'status' => 'success'];
// PASO 2: Crear tabla de estados si no existe
echo '<div class="step running">';
echo '<i class="fas fa-table"></i> Creando tabla de estados de conversación...';
flush();
$sqlStates = file_get_contents(__DIR__ . '/migrations/add_conversation_states.sql');
$statementsStates = array_filter(array_map('trim', explode(';', $sqlStates)));
foreach ($statementsStates as $statement) {
if (!empty($statement) && substr($statement, 0, 6) !== 'SELECT') {
$db->getConnection()->exec($statement);
}
}
echo ' <span class="text-success"><i class="fas fa-check-circle"></i> Completado</span>';
echo '</div>';
$steps[] = ['name' => 'Tabla user_states', 'status' => 'success'];
// PASO 3: Importar menús y respuestas automáticas
echo '<div class="step running">';
echo '<i class="fas fa-list"></i> Importando menús y respuestas automáticas...';
flush();
$sqlSetup = file_get_contents(__DIR__ . '/setup_laboratorio_ximena.sql');
$statementsSetup = array_filter(array_map('trim', explode(';', $sqlSetup)));
$menuCount = 0;
$responseCount = 0;
foreach ($statementsSetup as $statement) {
if (!empty($statement) && substr($statement, 0, 2) !== '--') {
if (stripos($statement, 'INSERT INTO menus') !== false) {
$menuCount++;
} elseif (stripos($statement, 'INSERT INTO autoresponses') !== false) {
$responseCount++;
}
try {
$db->getConnection()->exec($statement);
} catch (Exception $e) {
// Ignorar errores de duplicados
if (strpos($e->getMessage(), 'Duplicate entry') === false) {
throw $e;
}
}
}
}
echo " <span class=\"text-success\"><i class=\"fas fa-check-circle\"></i> {$menuCount} menús, {$responseCount} respuestas</span>";
echo '</div>';
$steps[] = ['name' => 'Menús y respuestas', 'status' => 'success'];
// PASO 4: Verificar servicios
echo '<div class="step running">';
echo '<i class="fas fa-cogs"></i> Verificando servicios del sistema...';
flush();
$services = [
'BusinessHoursService',
'ConversationStateService',
'NLPService',
'MenuService',
'PatientDataValidator',
'BotServiceLab'
];
$servicesOk = true;
foreach ($services as $service) {
$file = __DIR__ . "/services/{$service}.php";
if (!file_exists($file)) {
echo " <span class=\"text-danger\"><i class=\"fas fa-times-circle\"></i> Falta {$service}.php</span>";
$servicesOk = false;
break;
}
}
if ($servicesOk) {
echo ' <span class="text-success"><i class="fas fa-check-circle"></i> ' . count($services) . ' servicios verificados</span>';
$steps[] = ['name' => 'Servicios', 'status' => 'success'];
} else {
$success = false;
}
echo '</div>';
// PASO 5: Obtener estadísticas
echo '<div class="step running">';
echo '<i class="fas fa-chart-bar"></i> Obteniendo estadísticas...';
flush();
$stmt = $db->query("
SELECT
(SELECT COUNT(*) FROM menus WHERE is_active = 1) as menus_activos,
(SELECT COUNT(*) FROM menu_options WHERE is_active = 1) as opciones_activas,
(SELECT COUNT(*) FROM autoresponses WHERE is_active = 1) as respuestas_activas,
(SELECT COUNT(*) FROM users) as total_usuarios
");
$stats = $stmt->fetch(PDO::FETCH_ASSOC);
echo ' <span class="text-success"><i class="fas fa-check-circle"></i> Completado</span>';
echo '</div>';
// Mostrar resumen
if ($success) {
echo '<div class="alert alert-success mt-4">';
echo '<h4><i class="fas fa-check-circle"></i> ¡Instalación Completada Exitosamente!</h4>';
echo '<hr>';
echo '<h5>📊 Estadísticas del Sistema:</h5>';
echo '<ul>';
echo "<li><strong>Menús activos:</strong> {$stats['menus_activos']}</li>";
echo "<li><strong>Opciones de menú:</strong> {$stats['opciones_activas']}</li>";
echo "<li><strong>Respuestas automáticas:</strong> {$stats['respuestas_activas']}</li>";
echo "<li><strong>Usuarios registrados:</strong> {$stats['total_usuarios']}</li>";
echo '</ul>';
echo '<hr>';
echo '<h5>🚀 Próximos Pasos:</h5>';
echo '<ol>';
echo '<li>Configura tus credenciales de WhatsApp Business API en el panel de administración</li>';
echo '<li>Prueba el menú principal enviando un mensaje de WhatsApp</li>';
echo '<li>Revisa las respuestas automáticas en la sección correspondiente</li>';
echo '<li>Personaliza los mensajes según las necesidades del laboratorio</li>';
echo '</ol>';
echo '<div class="text-center mt-4">';
echo '<a href="../index.php" class="btn btn-primary btn-lg">';
echo '<i class="fas fa-arrow-right"></i> Ir al Panel de Administración';
echo '</a>';
echo '</div>';
echo '</div>';
}
} catch (Exception $e) {
$success = false;
echo '<div class="step error">';
echo '<i class="fas fa-times-circle"></i> Error: ' . htmlspecialchars($e->getMessage());
echo '</div>';
echo '<div class="alert alert-danger mt-4">';
echo '<h4><i class="fas fa-exclamation-triangle"></i> Error en la Instalación</h4>';
echo '<p>Hubo un problema durante la instalación. Por favor:</p>';
echo '<ol>';
echo '<li>Verifica que la base de datos existe y tiene permisos correctos</li>';
echo '<li>Revisa la configuración en <code>config/config.php</code></li>';
echo '<li>Consulta el error arriba para más detalles</li>';
echo '<li>Intenta ejecutar la instalación nuevamente</li>';
echo '</ol>';
echo '<div class="text-center mt-3">';
echo '<button class="btn btn-warning" onclick="location.reload()">';
echo '<i class="fas fa-redo"></i> Reintentar Instalación';
echo '</button>';
echo '</div>';
echo '</div>';
}
?>
</div>
<?php if ($success): ?>
<div class="card mt-4 bg-light">
<div class="card-body">
<h5><i class="fas fa-book"></i> Documentación</h5>
<p>Para más información sobre cómo usar el sistema:</p>
<ul>
<li><a href="../REPORTE_SISTEMA_COMPLETO.md" target="_blank">Reporte del Sistema Completo</a></li>
<li><a href="../flujos_chatbot_whatsapp.md" target="_blank">Flujos del Chatbot</a></li>
<li><a href="../diagramas_flujo_chatbot.md" target="_blank">Diagramas de Flujo</a></li>
</ul>
</div>
</div>
<?php endif; ?>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>