Files
2026-06-30 15:01:01 -03:00

219 lines
9.9 KiB
PHP

<?php
// 1. CONEXIÓN A LA BASE DE DATOS
$host = "localhost";
$user = "root";
$pass = "";
$db = "lapecosa";
$conn = new mysqli($host, $user, $pass, $db);
if ($conn->connect_error) {
die("Error de conexión: " . $conn->connect_error);
}
// 2. LÓGICA PARA GUARDAR CAMBIOS (PROCESAMIENTO)
$mensaje_alerta = "";
// Agregar nueva pregunta CORREGIDO (Incluye keywords y categoría dinámica)
if (isset($_POST['agregar_pregunta'])) {
$preg = $conn->real_escape_string($_POST['nueva_pregunta']);
$resp = $conn->real_escape_string($_POST['nueva_respuesta']);
$keys = $conn->real_escape_string($_POST['nuevas_keywords']);
// Procesamiento inteligente de la categoría
$cat_seleccionada = $_POST['categoria_existente'];
if ($cat_seleccionada === 'nueva') {
$cat = $conn->real_escape_string(trim(strtolower($_POST['nueva_categoria'])));
} else {
$cat = $conn->real_escape_string($cat_seleccionada);
}
if (!empty($preg) && !empty($resp) && !empty($keys) && !empty($cat)) {
// Ejecución del INSERT incluyendo la nueva columna
$conn->query("INSERT INTO bot_preguntas (pregunta, respuesta, keywords, categoria) VALUES ('$preg', '$resp', '$keys', '$cat')");
$mensaje_alerta = "Pregunta, palabras clave y categoría agregadas con éxito.";
} else {
$mensaje_alerta = "Error: Todos los campos del asistente virtual, incluida la categoría, son obligatorios.";
}
}
// Eliminar pregunta
if (isset($_GET['eliminar'])) {
$id_del = intval($_GET['eliminar']);
$conn->query("DELETE FROM bot_preguntas WHERE id = $id_del");
header("Location: asistente.php"); // Recargar para limpiar la URL
exit();
}
// Consultas dinámicas para la vista y el selector
$preguntas = $conn->query("SELECT * FROM bot_preguntas ORDER BY id DESC");
$categorias_existentes = $conn->query("SELECT DISTINCT categoria FROM bot_preguntas WHERE categoria IS NOT NULL AND categoria != '' ORDER BY categoria ASC");
?>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Panel Asistente Virtual | La Pecosa</title>
<link rel="stylesheet" href="../css/all.min.css">
<style>
:root { --rojo: #D32F2F; --oscuro: #121212; --gris: #1e1e1e; --texto: #f5f5f5; }
body { font-family: 'Segoe UI', sans-serif; background-color: var(--oscuro); color: var(--texto); margin: 0; padding: 20px; }
.container { max-width: 1200px; margin: auto; }
header { border-bottom: 2px solid var(--rojo); padding-bottom: 10px; margin-bottom: 30px; display: flex; align-items: center; }
header h1 { color: var(--rojo); margin: 0; text-transform: uppercase; font-size: 24px; }
header i { margin-right: 15px; font-size: 30px; color: var(--rojo); }
.grid { display: grid; grid-template-columns: 1fr 1.8fr; gap: 20px; }
.card { background: var(--gris); padding: 20px; border-radius: 12px; border: 1px solid #333; }
h2 { font-size: 18px; border-left: 4px solid var(--rojo); padding-left: 10px; margin-bottom: 20px; }
.form-group { margin-bottom: 15px; }
label { display: block; margin-bottom: 5px; font-size: 14px; color: #bbb; }
input, textarea, select { width: 100%; padding: 10px; background: #2a2a2a; border: 1px solid #444; color: white; border-radius: 6px; box-sizing: border-box; }
select option { background: #1e1e1e; color: white; }
.btn { background: var(--rojo); color: white; border: none; padding: 10px 20px; border-radius: 6px; cursor: pointer; font-weight: bold; width: 100%; }
.btn:hover { background: #b71c1c; }
table { width: 100%; border-collapse: collapse; margin-top: 10px; }
th { text-align: left; background: #252525; padding: 12px; border-bottom: 2px solid var(--rojo); }
td { padding: 12px; border-bottom: 1px solid #333; font-size: 14px; }
.btn-del { color: #ff5252; text-decoration: none; font-size: 18px; }
.alerta { background: #2e7d32; color: white; padding: 15px; border-radius: 6px; margin-bottom: 20px; text-align: center; }
.btn-volver {
background: #252525;
color: var(--rojo);
padding: 10px 15px;
border-radius: 8px;
text-decoration: none;
margin-right: 20px;
border: 1px solid #444;
transition: 0.3s;
display: flex;
align-items: center;
justify-content: center;
}
.btn-volver:hover { background: var(--rojo); color: white; border-color: var(--rojo); }
.badge-key { background: #444; color: #ffeb3b; padding: 2px 6px; border-radius: 4px; font-size: 12px; margin-right: 4px; display: inline-block; }
.badge-cat { background: rgba(211, 47, 47, 0.2); color: #ff8a80; padding: 2px 6px; border-radius: 4px; font-size: 11px; font-weight: bold; text-transform: uppercase; }
</style>
</head>
<body>
<div class="container">
<header>
<a href="dashboard.php" class="btn-volver" title="Volver al Panel Principal">
<i class="fas fa-arrow-left"></i>
</a>
<i class="fas fa-robot"></i>
<h1>Asistente Virtual La Pecosa - Administración</h1>
</header>
<?php if($mensaje_alerta): ?>
<div class="alerta"><?php echo $mensaje_alerta; ?></div>
<?php endif; ?>
<div class="grid">
<div class="card">
<h2>Nueva pregunta frecuente</h2>
<form action="asistente.php" method="POST">
<div class="form-group">
<label>Título de la pregunta (Referencia interna):</label>
<input type="text" name="nueva_pregunta" placeholder="Ej: Precio de las Milanesas" required>
</div>
<div class="form-group">
<label>Categoría del bot:</label>
<select name="categoria_existente" id="categoria_select" onchange="alternarNuevaCategoria(this.value)" required>
<option value="">-- Seleccioná una categoría --</option>
<?php while($c = $categorias_existentes->fetch_assoc()): ?>
<option value="<?php echo htmlspecialchars($c['categoria']); ?>">
<?php echo htmlspecialchars(ucfirst($c['categoria'])); ?>
</option>
<?php endwhile; ?>
<option value="nueva" style="color: #ff8a80;">+ Crear una nueva categoría...</option>
</select>
</div>
<div id="campo_nueva_categoria" class="form-group" style="display: none;">
<label>Nombre de la nueva categoría:</label>
<input type="text" name="nueva_categoria" id="nueva_categoria_input" placeholder="Ej: promos, horarios, envios">
</div>
<div class="form-group">
<label>Palabras clave activadoras (Separadas por comas):</label>
<input type="text" name="nuevas_keywords" placeholder="Ej: milanesa, milanesas, precio, cuanto cuesta" required>
<small style="color: #aaa; font-size: 11px;">Si el usuario escribe alguna de estas palabras, el bot responderá.</small>
</div>
<div class="form-group">
<label>El asistente virtual responde:</label>
<textarea name="nueva_respuesta" placeholder="Ej: La porción de milanesa con fritas cuesta..." required></textarea>
</div>
<button type="submit" name="agregar_pregunta" class="btn" style="background: #e02828;">Añadir al asistente virtual</button>
</form>
</div>
<div class="card">
<h2>Base de conocimiento</h2>
<table>
<thead>
<tr>
<th>Pregunta / Keywords</th>
<th>Categoría</th>
<th>Respuesta configurada</th>
<th>Acción</th>
</tr>
</thead>
<tbody>
<?php while($p = $preguntas->fetch_assoc()): ?>
<tr>
<td>
<strong><?php echo htmlspecialchars($p['pregunta']); ?></strong><br>
<span style="font-size: 12px; color: #bbb;">Palabras clave:</span><br>
<?php
$kw = explode(',', $p['keywords']);
foreach($kw as $k) {
if(trim($k) != "") echo '<span class="badge-key">'.htmlspecialchars(trim($k)).'</span>';
}
?>
</td>
<td>
<span class="badge-cat"><?php echo htmlspecialchars($p['categoria']); ?></span>
</td>
<td><?php echo htmlspecialchars($p['respuesta']); ?></td>
<td align="center">
<a href="asistente.php?eliminar=<?php echo $p['id']; ?>" class="btn-del" onclick="return confirm('¿Eliminar esta respuesta?')">
<i class="fas fa-trash-can"></i>
</a>
</td>
</tr>
<?php endwhile; ?>
</tbody>
</table>
</div>
</div>
</div>
<script>
function alternarNuevaCategoria(valor) {
const contenedorNueva = document.getElementById('campo_nueva_categoria');
const inputNueva = document.getElementById('nueva_categoria_input');
if (valor === 'nueva') {
contenedorNueva.style.display = 'block';
inputNueva.required = true;
inputNueva.focus();
} else {
contenedorNueva.style.display = 'none';
inputNueva.required = false;
inputNueva.value = '';
}
}
</script>
</body>
</html>