315 lines
16 KiB
PHP
315 lines
16 KiB
PHP
<?php
|
|
$pageTitle = "Configuración General";
|
|
require_once 'layout_header.php';
|
|
require_once 'db/config.php';
|
|
|
|
// Asegurarse de que el usuario sea administrador
|
|
if ($_SESSION['user_role'] !== 'Administrador' && $_SESSION['user_role'] !== 'admin') {
|
|
echo "<div class='alert alert-danger'>Acceso denegado.</div>";
|
|
require_once 'layout_footer.php';
|
|
exit();
|
|
}
|
|
|
|
$conn = db();
|
|
|
|
// --- Procesamiento de Formularios ---
|
|
|
|
// Guardar visibilidad de columnas del Kanban
|
|
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['save_visibility'])) {
|
|
$visible_columns = $_POST['visible_columns'] ?? [];
|
|
$json_visible_columns = json_encode($visible_columns);
|
|
|
|
$stmt = $conn->prepare("INSERT INTO configuracion (clave, valor) VALUES ('kanban_visible_columns', :valor) ON DUPLICATE KEY UPDATE valor = :valor");
|
|
$stmt->bindParam(':valor', $json_visible_columns);
|
|
if ($stmt->execute()) {
|
|
$_SESSION['success_message'] = 'Visibilidad de columnas actualizada.';
|
|
} else {
|
|
$_SESSION['error_message'] = 'Error al actualizar la visibilidad.';
|
|
}
|
|
header("Location: configuracion.php");
|
|
exit();
|
|
}
|
|
|
|
|
|
// --- Carga de Datos para la Vista ---
|
|
|
|
// Datos para la gestión de columnas
|
|
$stmt_manage_columns = $conn->query("SELECT * FROM kanban_columns ORDER BY orden ASC");
|
|
$management_columns = $stmt_manage_columns->fetchAll(PDO::FETCH_ASSOC);
|
|
|
|
// Datos para la visibilidad de columnas
|
|
$stmt_visible = $conn->prepare("SELECT valor FROM configuracion WHERE clave = 'kanban_visible_columns'");
|
|
$stmt_visible->execute();
|
|
$config_row = $stmt_visible->fetch(PDO::FETCH_ASSOC);
|
|
$visible_columns = $config_row ? json_decode($config_row['valor'], true) : [];
|
|
$stmt_all_db_columns = $conn->query("SELECT nombre FROM kanban_columns ORDER BY orden ASC");
|
|
$available_columns_for_visibility = $stmt_all_db_columns->fetchAll(PDO::FETCH_COLUMN);
|
|
|
|
// --- Datos para la GESTIÓN DE CONTENIDO DEL KANBAN ---
|
|
$products = $conn->query("SELECT id, nombre FROM products ORDER BY nombre ASC")->fetchAll(PDO::FETCH_ASSOC);
|
|
$kanban_columns_for_cards = $conn->query("SELECT id, nombre FROM kanban_columns ORDER BY orden, id")->fetchAll(PDO::FETCH_ASSOC);
|
|
$info_cards = $conn->query("
|
|
SELECT ip.*, p.nombre as producto_nombre, kc.nombre as column_nombre
|
|
FROM info_productos ip
|
|
LEFT JOIN products p ON ip.producto_id = p.id
|
|
LEFT JOIN kanban_columns kc ON ip.column_id = kc.id
|
|
ORDER BY ip.orden, ip.id DESC
|
|
")->fetchAll(PDO::FETCH_ASSOC);
|
|
|
|
|
|
// Mostrar mensajes de éxito o error
|
|
if (isset($_SESSION['success_message'])) {
|
|
echo "<div class='alert alert-success'>".$_SESSION['success_message']."</div>";
|
|
unset($_SESSION['success_message']);
|
|
}
|
|
if (isset($_SESSION['error_message'])) {
|
|
echo "<div class='alert alert-danger'>".$_SESSION['error_message']."</div>";
|
|
unset($_SESSION['error_message']);
|
|
}
|
|
?>
|
|
|
|
<div class="container mt-5">
|
|
|
|
<!-- SECCIÓN PARA GESTIONAR CONTENIDO DEL KANBAN (TARJETAS) -->
|
|
<div class="card mb-5">
|
|
<div class="card-header">
|
|
<h3>Gestionar Contenido del Kanban</h3>
|
|
</div>
|
|
<div class="card-body">
|
|
<p>Aquí puedes crear, editar y eliminar las tarjetas de información que aparecen en el tablero Kanban.</p>
|
|
|
|
<!-- Formulario para añadir/editar tarjeta -->
|
|
<div class="card mb-4">
|
|
<div class="card-header">
|
|
<h5 id="form-title">Añadir Nueva Tarjeta</h5>
|
|
</div>
|
|
<div class="card-body">
|
|
<form action="save_info_producto.php" method="post" enctype="multipart/form-data">
|
|
<input type="hidden" name="id" id="info-id">
|
|
<div class="form-group">
|
|
<label for="producto_id">Producto Asociado (Opcional)</label>
|
|
<select name="producto_id" id="producto_id" class="form-control">
|
|
<option value="">Selecciona un producto</option>
|
|
<?php foreach ($products as $product): ?>
|
|
<option value="<?php echo $product['id']; ?>"><?php echo htmlspecialchars($product['nombre']); ?></option>
|
|
<?php endforeach; ?>
|
|
</select>
|
|
</div>
|
|
<div class="form-group mt-3">
|
|
<label for="texto_informativo">Texto de la Tarjeta</label>
|
|
<textarea name="texto_informativo" id="texto_informativo" class="form-control" rows="3" required></textarea>
|
|
</div>
|
|
<div class="form-group mt-3">
|
|
<label for="imagen">Imagen de la Tarjeta</label>
|
|
<div id="image-preview" class="mt-2 mb-2"></div>
|
|
<input type="file" name="imagen" id="imagen" class="form-control-file">
|
|
<input type="hidden" name="current_imagen" id="current_imagen">
|
|
<small class="form-text text-muted">Sube una imagen para añadir o reemplazar la actual.</small>
|
|
</div>
|
|
<div class="form-group mt-3">
|
|
<label for="column_id">Columna del Kanban</label>
|
|
<select name="column_id" id="column_id" class="form-control" required>
|
|
<option value="">Selecciona una columna</option>
|
|
<?php foreach ($kanban_columns_for_cards as $column): ?>
|
|
<option value="<?php echo $column['id']; ?>"><?php echo htmlspecialchars($column['nombre']); ?></option>
|
|
<?php endforeach; ?>
|
|
</select>
|
|
</div>
|
|
<button type="submit" class="btn btn-primary mt-3">Guardar Tarjeta</button>
|
|
<button type="button" class="btn btn-secondary mt-3" onclick="resetForm()">Limpiar</button>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Lista de tarjetas existentes -->
|
|
<div class="card">
|
|
<div class="card-header">
|
|
<h5>Tarjetas Existentes</h5>
|
|
</div>
|
|
<div class="card-body">
|
|
<div class="table-responsive">
|
|
<table class="table table-bordered table-striped">
|
|
<thead>
|
|
<tr>
|
|
<th>Producto</th>
|
|
<th>Imagen</th>
|
|
<th>Texto</th>
|
|
<th>Columna</th>
|
|
<th style="width: 120px;">Acciones</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<?php if (empty($info_cards)): ?>
|
|
<tr><td colspan="5" class="text-center">No hay tarjetas creadas.</td></tr>
|
|
<?php else: ?>
|
|
<?php foreach ($info_cards as $card): ?>
|
|
<tr>
|
|
<td><?php echo htmlspecialchars($card['producto_nombre'] ?: 'N/A'); ?></td>
|
|
<td>
|
|
<?php if (!empty($card['imagen_url'])): ?>
|
|
<img src="<?php echo htmlspecialchars($card['imagen_url']); ?>?t=<?php echo time(); ?>" alt="Imagen" style="width: 100px; height: auto; border-radius: 5px;">
|
|
<?php endif; ?>
|
|
</td>
|
|
<td><?php echo nl2br(htmlspecialchars($card['texto_informativo'])); ?></td>
|
|
<td><?php echo htmlspecialchars($card['column_nombre'] ?: 'Sin asignar'); ?></td>
|
|
<td>
|
|
<button class="btn btn-sm btn-info mb-1 w-100" onclick='editCard(<?php echo json_encode($card); ?>)'>Editar</button>
|
|
<a href="delete_info_producto.php?id=<?php echo $card['id']; ?>" class="btn btn-sm btn-danger w-100" onclick="return confirm('¿Seguro?')">Eliminar</a>
|
|
</td>
|
|
</tr>
|
|
<?php endforeach; ?>
|
|
<?php endif; ?>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Sección para Configuración de Banners y Textos -->
|
|
<div class="card">
|
|
<div class="card-body">
|
|
<h5 class="card-title">Texto del Banner Principal</h5>
|
|
<p class="card-text">Edita el texto que aparece en el banner de la página principal.</p>
|
|
<form action="save_banner_text.php" method="post">
|
|
<div class="form-group">
|
|
<textarea class="form-control" id="banner_text" name="banner_text" rows="3"><?php echo htmlspecialchars($banner_text); ?></textarea>
|
|
</div>
|
|
<button type="submit" class="btn btn-primary mt-2">Guardar Texto</button>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Mensaje de WhatsApp para Ruta Contraentrega -->
|
|
<div class="card mt-4">
|
|
<div class="card-body">
|
|
<h5 class="card-title">Mensaje para Ruta Contraentrega</h5>
|
|
<p class="card-text">
|
|
Edita la plantilla para el mensaje de WhatsApp que se envía desde la sección de "Ruta Contraentrega".
|
|
<br>
|
|
Puedes usar las siguientes variables:
|
|
<ul>
|
|
<li><code>{cliente}</code>: Nombre del cliente.</li>
|
|
<li><code>{monto}</code>: Monto a pagar (incluye el símbolo "S/").</li>
|
|
<li><code>{direccion}</code>: Dirección de entrega.</li>
|
|
</ul>
|
|
</p>
|
|
<form action="save_whatsapp_template.php" method="post">
|
|
<input type="hidden" name="template_name" value="whatsapp_template_contraentrega">
|
|
<div class="form-group">
|
|
<textarea class="form-control" id="whatsapp_template_contraentrega" name="template_content" rows="4"><?php echo htmlspecialchars($whatsapp_template_contraentrega); ?></textarea>
|
|
</div>
|
|
<button type="submit" class="btn btn-primary mt-2">Guardar Plantilla</button>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Sección para Gestionar Columnas (Añadir, Editar, Eliminar) -->
|
|
<div class="card mb-5">
|
|
<div class="card-header">
|
|
<h3>Gestionar Columnas del Kanban</h3>
|
|
</div>
|
|
<div class="card-body">
|
|
<!-- Formulario para añadir nueva columna -->
|
|
<div class="card mb-4">
|
|
<div class="card-header">
|
|
<h6>Añadir Nueva Columna</h6>
|
|
</div>
|
|
<div class="card-body">
|
|
<form action="add_column.php" method="post">
|
|
<div class="form-group">
|
|
<label for="nombre">Nombre de la Columna</label>
|
|
<input type="text" name="nombre" id="nombre" class="form-control" required>
|
|
</div>
|
|
<button type="submit" class="btn btn-success mt-3">Añadir Columna</button>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Tabla de columnas existentes -->
|
|
<h6>Columnas Actuales</h6>
|
|
<div class="table-responsive">
|
|
<table class="table table-bordered table-striped">
|
|
<thead>
|
|
<tr>
|
|
<th>Orden</th>
|
|
<th>Nombre</th>
|
|
<th>Acciones</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<?php if (empty($management_columns)): ?>
|
|
<tr><td colspan="3" class="text-center">No hay columnas definidas.</td></tr>
|
|
<?php else: ?>
|
|
<?php foreach ($management_columns as $col): ?>
|
|
<tr>
|
|
<td><?php echo htmlspecialchars($col['orden']); ?></td>
|
|
<td><?php echo htmlspecialchars($col['nombre']); ?></td>
|
|
<td>
|
|
<a href="edit_column.php?id=<?php echo $col['id']; ?>" class="btn btn-sm btn-info">Editar</a>
|
|
<a href="delete_column.php?id=<?php echo $col['id']; ?>" class="btn btn-sm btn-danger" onclick="return confirm('¿Estás seguro de que quieres eliminar esta columna?');">Eliminar</a>
|
|
</td>
|
|
</tr>
|
|
<?php endforeach; ?>
|
|
<?php endif; ?>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Sección para Configurar Visibilidad de Columnas -->
|
|
<div class="card">
|
|
<div class="card-header">
|
|
<h3>Configurar Visibilidad de Columnas en Kanban</h3>
|
|
</div>
|
|
<div class="card-body">
|
|
<p>Selecciona las columnas que quieres que sean visibles en el tablero Kanban principal.</p>
|
|
<form action="configuracion.php" method="post">
|
|
<input type="hidden" name="save_visibility" value="1">
|
|
<div class="form-group">
|
|
<?php foreach ($available_columns_for_visibility as $column_name): ?>
|
|
<div class="form-check">
|
|
<input class="form-check-input" type="checkbox" name="visible_columns[]" value="<?php echo htmlspecialchars($column_name); ?>" id="check_<?php echo htmlspecialchars($column_name); ?>"
|
|
<?php echo (in_array($column_name, $visible_columns)) ? 'checked' : ''; ?>>
|
|
<label class="form-check-label" for="check_<?php echo htmlspecialchars($column_name); ?>">
|
|
<?php echo htmlspecialchars($column_name); ?>
|
|
</label>
|
|
</div>
|
|
<?php endforeach; ?>
|
|
</div>
|
|
<button type="submit" class="btn btn-primary mt-3">Guardar Visibilidad</button>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<script>
|
|
function editCard(card) {
|
|
document.getElementById('form-title').innerText = 'Editar Tarjeta';
|
|
document.getElementById('info-id').value = card.id;
|
|
document.getElementById('producto_id').value = card.producto_id;
|
|
document.getElementById('texto_informativo').value = card.texto_informativo;
|
|
document.getElementById('column_id').value = card.column_id;
|
|
document.getElementById('current_imagen').value = card.imagen_url;
|
|
|
|
const imagePreview = document.getElementById('image-preview');
|
|
imagePreview.innerHTML = '';
|
|
if (card.imagen_url) {
|
|
imagePreview.innerHTML = `<p class="mb-1">Imagen actual:</p><img src="${card.imagen_url}?t=${new Date().getTime()}" style="width: 100px; height: auto; border-radius: 5px;"/>`;
|
|
}
|
|
|
|
const formCard = document.querySelector('#form-title').closest('.card');
|
|
formCard.scrollIntoView({ behavior: 'smooth', block: 'start' });
|
|
}
|
|
|
|
function resetForm() {
|
|
document.getElementById('form-title').innerText = 'Añadir Nueva Tarjeta';
|
|
document.getElementById('info-id').value = '';
|
|
document.querySelector('form[action="save_info_producto.php"]').reset();
|
|
document.getElementById('image-preview').innerHTML = '';
|
|
}
|
|
</script>
|
|
|
|
<?php require_once 'layout_footer.php'; ?>
|