Files
Sistema-Web-Rotiseria/admin/dashboard.php
T
2026-06-30 14:59:19 -03:00

332 lines
12 KiB
PHP

<?php
include("../db.php");
// Consultamos el estado manual actual
$query_estado = mysqli_query($conexion, "SELECT valor FROM ajustes WHERE clave = 'estado_manual'");
$res_estado = mysqli_fetch_assoc($query_estado);
$estado_actual = ($res_estado) ? $res_estado['valor'] : 'abierto';
date_default_timezone_set('America/Argentina/Buenos_Aires');
$hoy = date('Y-m-d');
if (!isset($_SESSION['rol']) || $_SESSION['rol'] !== 'admin') {
header("Location: ../login.php?error=acceso_denegado");
exit();
}
$query_ventas = "SELECT SUM(total) as total_dia FROM pedidos WHERE DATE(fecha) = '$hoy' AND estado != 'Cancelado'";
$res_ventas = mysqli_query($conexion, $query_ventas);
$data_ventas = mysqli_fetch_assoc($res_ventas);
$total_dia = $data_ventas['total_dia'] ?? 0;
$query_activos = "SELECT COUNT(*) as cant FROM pedidos WHERE estado IN ('Pendiente', 'En Cocina')";
$res_activos = mysqli_query($conexion, $query_activos);
$data_activos = mysqli_fetch_assoc($res_activos);
$cant_pedidos = $data_activos['cant'] ?? 0;
$nombres_grafico = [];
$cantidades_grafico = [];
$query_stats = "SELECT nombre_producto, cantidad_vendida FROM estadisticas_productos ORDER BY cantidad_vendida DESC LIMIT 5";
$res_stats = mysqli_query($conexion, $query_stats);
while($row = mysqli_fetch_assoc($res_stats)) {
$nombres_grafico[] = $row['nombre_producto'];
$cantidades_grafico[] = $row['cantidad_vendida'];
}
$query_pedidos = "SELECT p.id_pedido, p.id_usuario, u.nombre as nombre_usuario, p.total, p.estado, p.fecha
FROM pedidos p
LEFT JOIN usuarios u ON p.id_usuario = u.id_usuario
ORDER BY p.fecha DESC LIMIT 10";
$res_pedidos = mysqli_query($conexion, $query_pedidos);
if ($res_pedidos) {
$pedidos_reales = mysqli_fetch_all($res_pedidos, MYSQLI_ASSOC);
} else {
die("Error en la consulta: " . mysqli_error($conexion));
}
?>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Panel Admin - La Pecosa</title>
<link rel="stylesheet" href="../css/all.min.css">
<script src="chart.js"></script>
<link rel="stylesheet" href="admin_style.css">
<style>
/* ── TOPBAR DE ACCIONES ── */
.topbar-actions {
position: fixed;
top: 0;
left: 260px;
right: 0;
height: 64px;
background: #fff;
border-bottom: 1px solid #e5e7eb;
display: flex;
align-items: center;
justify-content: flex-end;
padding: 0 40px;
gap: 10px;
z-index: 100;
}
.topbar-fecha {
display: flex;
align-items: center;
gap: 7px;
font-size: 0.85rem;
font-weight: 600;
color: #4b5563;
background: #f9fafb;
border: 1px solid #e5e7eb;
border-radius: 7px;
padding: 8px 14px;
}
.topbar-fecha i { color: #e02828; }
.btn-estado-abierto,
.btn-estado-cerrado {
display: flex;
align-items: center;
gap: 7px;
padding: 8px 16px;
border: none;
border-radius: 7px;
font-size: 0.85rem;
font-weight: 700;
cursor: pointer;
transition: opacity 0.15s, transform 0.15s;
}
.btn-estado-abierto:hover,
.btn-estado-cerrado:hover { opacity: 0.88; transform: translateY(-1px); }
.btn-estado-abierto { background: #16a34a; color: #fff; }
.btn-estado-cerrado { background: #e02828; color: #fff; }
/* Bajamos el main-content para que no quede debajo de la topbar */
.main-content { padding-top: 84px; }
/* ── CARDS MEJORADAS ── */
.dashboard-cards {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
gap: 18px;
margin-bottom: 28px;
}
.dash-card {
background: #fff;
border-radius: 12px;
padding: 22px 24px;
border: 1px solid #f0f0f0;
box-shadow: 0 1px 4px rgba(0,0,0,0.04);
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
}
.dash-card-label {
font-size: 0.75rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.6px;
color: #9ca3af;
margin-bottom: 6px;
}
.dash-card-value {
font-size: 2rem;
font-weight: 800;
line-height: 1;
}
.dash-card-value.green { color: #16a34a; }
.dash-card-value.red { color: #e02828; }
.dash-card-icon {
width: 52px;
height: 52px;
border-radius: 12px;
display: flex;
align-items: center;
justify-content: center;
font-size: 1.3rem;
flex-shrink: 0;
}
.dash-card-icon.green-bg { background: #dcfce7; color: #16a34a; }
.dash-card-icon.red-bg { background: #fee2e2; color: #e02828; }
/* ── CONTENEDORES ── */
.section-card {
background: #fff;
border-radius: 12px;
border: 1px solid #f0f0f0;
box-shadow: 0 1px 4px rgba(0,0,0,0.04);
padding: 24px;
margin-bottom: 24px;
}
.section-card-title {
font-size: 1rem;
font-weight: 700;
color: #111827;
margin-bottom: 18px;
display: flex;
align-items: center;
gap: 8px;
}
.section-card-title i { color: #e02828; font-size: 0.95rem; }
/* ── TABLA ── */
.admin-table td { font-size: 0.9rem; }
.admin-table tr:last-child td { border-bottom: none; }
</style>
</head>
<body>
<!-- TOPBAR FIJA -->
<div class="topbar-actions">
<div class="topbar-fecha">
<i class="fa-solid fa-calendar-days"></i>
<?php
$dias = ["Domingo","Lunes","Martes","Miércoles","Jueves","Viernes","Sábado"];
echo $dias[date('w')] . " " . date('d/m/Y') . " · " . date('H:i') . " hs";
?>
</div>
<form action="cambiar_estado.php" method="POST" style="display:inline;">
<?php if ($estado_actual === 'cerrado'): ?>
<input type="hidden" name="nuevo_estado" value="abierto">
<button type="submit" class="btn-estado-abierto">
<i class="fa-solid fa-lock-open"></i> Abrir local
</button>
<?php else: ?>
<input type="hidden" name="nuevo_estado" value="cerrado">
<button type="submit" class="btn-estado-cerrado">
<i class="fa-solid fa-lock"></i> Cerrar página
</button>
<?php endif; ?>
</form>
</div>
<?php include("sidebar.php"); ?>
<div class="main-content">
<div class="page-header">
<h1><i class="fa-solid fa-chart-pie"></i> Panel de estadísticas generales</h1>
</div>
<!-- CARDS -->
<div class="dashboard-cards">
<div class="dash-card">
<div>
<div class="dash-card-label">Ventas de hoy</div>
<div class="dash-card-value green">$<?php echo number_format($total_dia, 0, ',', '.'); ?></div>
</div>
<div class="dash-card-icon green-bg">
<i class="fa-solid fa-cash-register"></i>
</div>
</div>
<div class="dash-card">
<div>
<div class="dash-card-label">Pedidos en espera / cocina</div>
<div class="dash-card-value red"><?php echo $cant_pedidos; ?></div>
</div>
<div class="dash-card-icon red-bg">
<i class="fa-solid fa-clock"></i>
</div>
</div>
</div>
<!-- GRÁFICO -->
<div class="section-card">
<div class="section-card-title">
<i class="fa-solid fa-ranking-star"></i> Top 5 productos más vendidos
</div>
<div style="height: 260px; position: relative;">
<canvas id="chartProductos"></canvas>
</div>
</div>
<!-- TABLA -->
<div class="section-card">
<div class="section-card-title">
<i class="fa-solid fa-clock-rotate-left"></i> Últimos 10 pedidos recibidos
</div>
<table class="admin-table">
<thead>
<tr>
<th>Nº pedido</th>
<th>Cliente</th>
<th>Productos</th>
<th>Total</th>
<th>Estado</th>
<th>Fecha / Hora</th>
</tr>
</thead>
<tbody>
<?php foreach($pedidos_reales as $p):
$estado_normalizado = strtolower(trim($p['estado']));
$clase_badge = 'badge-pendiente';
switch ($estado_normalizado) {
case 'pendiente': $clase_badge = 'badge-pendiente'; break;
case 'en cocina': $clase_badge = 'badge-cocina'; break;
case 'listo para retirar':
case 'listo': $clase_badge = 'badge-listo'; break;
case 'en camino': $clase_badge = 'badge-camino'; break;
case 'entregado': $clase_badge = 'badge-entregado'; break;
case 'cancelado': $clase_badge = 'badge-cancelado'; break;
}
?>
<tr>
<td><strong>#<?php echo $p['id_pedido']; ?></strong></td>
<td><?php echo htmlspecialchars($p['nombre_usuario'] ?? 'Invitado (S/R)'); ?></td>
<td>
<a href="ver_detalle.php?id=<?php echo $p['id_pedido']; ?>&desde=dashboard" style="color: #e02828; text-decoration: none; font-weight: 600;">
<i class="fa-solid fa-eye"></i> Ver detalle
</a>
</td>
<td><strong>$<?php echo number_format($p['total'], 0, ',', '.'); ?></strong></td>
<td><span class="badge <?php echo $clase_badge; ?>"><?php echo htmlspecialchars($p['estado']); ?></span></td>
<td style="color: #666;"><?php echo date('d/m H:i', strtotime($p['fecha'])); ?> hs</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
</div>
<script>
const ctx = document.getElementById('chartProductos').getContext('2d');
new Chart(ctx, {
type: 'bar',
data: {
labels: <?php echo json_encode($nombres_grafico); ?>,
datasets: [{
label: 'Unidades vendidas',
data: <?php echo json_encode($cantidades_grafico); ?>,
backgroundColor: '#e02828',
borderWidth: 0,
borderRadius: 8
}]
},
options: {
responsive: true,
maintainAspectRatio: false,
scales: {
y: { beginAtZero: true, grid: { color: '#f3f4f6' }, ticks: { color: '#9ca3af', font: { size: 12 } } },
x: { grid: { display: false }, ticks: { color: '#4b5563', font: { size: 12 } } }
},
plugins: { legend: { display: false } }
}
});
</script>
</body>
</html>