From 40389434b133fc6351e192d6aa3361ef3cd8eb56 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Sat, 16 May 2026 00:58:36 +0000 Subject: [PATCH] Autosave: 20260516-005835 --- dashboard_principal.php | 254 ++++++++++++++++++++++++++++++++++++++++ layout_header.php | 6 + 2 files changed, 260 insertions(+) create mode 100644 dashboard_principal.php diff --git a/dashboard_principal.php b/dashboard_principal.php new file mode 100644 index 00000000..b2935e4b --- /dev/null +++ b/dashboard_principal.php @@ -0,0 +1,254 @@ +prepare("SELECT COUNT(*) as total_pedidos, SUM(monto_total) as total_dinero FROM pedidos WHERE DATE(created_at) = ? AND estado != 'RETORNADO'"); +$stmtHoy->execute([$hoy]); +$statsHoy = $stmtHoy->fetch(PDO::FETCH_ASSOC); + +// 2. Pedidos Pendientes (ROTULADO ?) +$stmtPendientes = $db->query("SELECT COUNT(*) FROM pedidos WHERE estado = 'ROTULADO ?'"); +$pendientes = $stmtPendientes->fetchColumn(); + +// 3. Recaudo Esperado (En tránsito, En destino, Ruta contraentrega) +$stmtRecaudo = $db->query("SELECT SUM(monto_debe) FROM pedidos WHERE estado IN ('EN TRANSITO ?', 'EN DESTINO ?', 'RUTA_CONTRAENTREGA') AND (estado_pago != 'Pagado' OR estado_pago IS NULL)"); +$recaudoEsperado = $stmtRecaudo->fetchColumn() ?: 0; + +// 4. Stock Crítico (menos de 5 unidades en total entre todas las sedes) +$stmtStock = $db->query("SELECT COUNT(*) FROM (SELECT product_id, SUM(quantity) as total_stock FROM stock_sedes GROUP BY product_id HAVING total_stock <= 5) as critico"); +$stockCritico = $stmtStock->fetchColumn() ?: 0; + +// 5. Datos para Gráfico de Ventas (Últimos 7 días) +$ventas7dias = []; +for ($i = 6; $i >= 0; $i--) { + $fecha = date('Y-m-d', strtotime("-$i days")); + $stmt = $db->prepare("SELECT COUNT(*) as cant, SUM(monto_total) as monto FROM pedidos WHERE DATE(created_at) = ? AND estado != 'RETORNADO'"); + $stmt->execute([$fecha]); + $res = $stmt->fetch(PDO::FETCH_ASSOC); + $ventas7dias[] = [ + 'fecha' => date('d/m', strtotime($fecha)), + 'cantidad' => $res['cant'] ?: 0, + 'monto' => $res['monto'] ?: 0 + ]; +} + +// 6. Estados de Pedidos +$stmtEstados = $db->query("SELECT estado, COUNT(*) as total FROM pedidos GROUP BY estado"); +$estadosData = $stmtEstados->fetchAll(PDO::FETCH_ASSOC); + +// 7. Top Productos +$stmtTopProd = $db->query("SELECT producto, COUNT(*) as ventas FROM pedidos GROUP BY producto ORDER BY ventas DESC LIMIT 5"); +$topProductos = $stmtTopProd->fetchAll(PDO::FETCH_ASSOC); + +// 8. Ventas por Asesor +$stmtAsesores = $db->query("SELECT u.nombre_asesor, COUNT(p.id) as total_pedidos, COALESCE(SUM(p.monto_total), 0) as total_monto + FROM users u + LEFT JOIN pedidos p ON u.id = p.asesor_id AND p.estado != 'RETORNADO' + WHERE u.role = 'Asesor' + GROUP BY u.id + ORDER BY total_monto DESC"); +$ventasAsesores = $stmtAsesores->fetchAll(PDO::FETCH_ASSOC); + +$pageTitle = "Dashboard Principal"; +include 'layout_header.php'; +?> + +
+ +
+
+
+
+
Ventas Hoy
+

S/

+

pedidos

+
+
+
+
+
+
+
Pedidos Pendientes
+

+

Por procesar

+
+
+
+
+
+
+
Recaudo Esperado
+

S/

+

En ruta / Contraentrega

+
+
+
+
+
+
+
Stock Crítico
+

+

Productos < 5 unidades

+
+
+
+
+ +
+ +
+
+
+
Tendencia de Ventas (Últimos 7 días)
+
+
+ +
+
+
+ +
+
+
+
Distribución de Estados
+
+
+ +
+
+
+
+ +
+ +
+
+
+
Top 5 Productos más Vendidos
+
+
+ +
+
+
+ +
+
+
+
Rendimiento por Asesor
+
+
+
+ + + + + + + + + + + + + + + + + +
AsesorPedidosTotal Ventas
S/
+
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/layout_header.php b/layout_header.php index a000c539..44dfe8c8 100644 --- a/layout_header.php +++ b/layout_header.php @@ -14,6 +14,12 @@ $userRole = $_SESSION['user_role'] ?? ''; // Define navigation items for each role $navItems = [ + 'dashboard_principal' => [ + 'url' => 'dashboard_principal.php', + 'icon' => 'fa-chart-line', + 'text' => 'Dashboard Principal', + 'roles' => ['Administrador', 'admin'] + ], 'dashboard' => [ 'url' => 'dashboard.php', 'icon' => 'fa-tachometer-alt',