query("SELECT COUNT(*) FROM products")->fetchColumn(); $total_sedes = $pdo->query("SELECT COUNT(*) FROM sedes")->fetchColumn(); $total_stock = $pdo->query("SELECT SUM(quantity) FROM stock_sedes")->fetchColumn(); // 2. Datos para la tabla de inventario $sedes_stmt = $pdo->query("SELECT id, nombre FROM sedes ORDER BY nombre"); $sedes = $sedes_stmt->fetchAll(PDO::FETCH_ASSOC); $products_stmt = $pdo->query("SELECT id, nombre FROM products ORDER BY nombre"); $products = $products_stmt->fetchAll(PDO::FETCH_ASSOC); $stock_stmt = $pdo->query("SELECT product_id, sede_id, quantity FROM stock_sedes"); $stock_data = $stock_stmt->fetchAll(PDO::FETCH_ASSOC); $inventario = []; foreach ($products as $product) { $inventario[$product['id']] = [ 'nombre' => $product['nombre'], 'total' => 0, 'sedes' => array_fill_keys(array_column($sedes, 'id'), 0) ]; } foreach ($stock_data as $stock_item) { if (isset($inventario[$stock_item['product_id']])) { $inventario[$stock_item['product_id']]['sedes'][$stock_item['sede_id']] = $stock_item['quantity']; $inventario[$stock_item['product_id']]['total'] += $stock_item['quantity']; } } // 3. Datos para gráficos $stock_por_sede_stmt = $pdo->query(" SELECT s.nombre, SUM(ss.quantity) as total_stock FROM sedes s JOIN stock_sedes ss ON s.id = ss.sede_id GROUP BY s.nombre HAVING total_stock > 0 ORDER BY s.nombre "); $stock_por_sede = $stock_por_sede_stmt->fetchAll(PDO::FETCH_ASSOC); $sede_chart_labels_array = array_column($stock_por_sede, 'nombre'); $sede_chart_data_array = array_column($stock_por_sede, 'total_stock'); $colores_sedes = []; $colores_default = ['#FF6384', '#FFCE56', '#4BC0C0', '#9966FF', '#FF9F40']; $color_map = [ 'ALIDRV' => '#28a745', // Verde 'Almacen Principal' => '#36A2EB' // Azul ]; $default_color_idx = 0; foreach ($sede_chart_labels_array as $label) { if (isset($color_map[$label])) { $colores_sedes[] = $color_map[$label]; } else { $colores_sedes[] = $colores_default[$default_color_idx % count($colores_default)]; $default_color_idx++; } } $sede_chart_labels = json_encode($sede_chart_labels_array); $sede_chart_data = json_encode($sede_chart_data_array); $sede_chart_colors = json_encode($colores_sedes); $stock_por_producto_stmt = $pdo->query(" SELECT p.nombre, SUM(ss.quantity) as total_stock FROM products p JOIN stock_sedes ss ON p.id = ss.product_id GROUP BY p.nombre HAVING total_stock > 0 ORDER BY total_stock DESC LIMIT 15 "); $stock_por_producto = $stock_por_producto_stmt->fetchAll(PDO::FETCH_ASSOC); $producto_chart_labels = json_encode(array_column($stock_por_producto, 'nombre')); $producto_chart_data = json_encode(array_column($stock_por_producto, 'total_stock')); // 4. Datos para el historial de movimientos (últimos 50) $movements_stmt = $pdo->query(" SELECT sm.movement_date, p.nombre as product_name, s.nombre as sede_name, sm.quantity, sm.type FROM stock_movements sm JOIN products p ON sm.product_id = p.id JOIN sedes s ON sm.sede_id = s.id ORDER BY sm.created_at DESC LIMIT 50 "); $movements = $movements_stmt->fetchAll(PDO::FETCH_ASSOC); } catch (PDOException $e) { echo "
Error al conectar o consultar la base de datos: " . $e->getMessage() . "
"; require_once 'layout_footer.php'; die(); } ?>

Dashboard de Inventario

Registrar Entrada Registrar Salida
Total de Productos

Sedes Activas

Unidades Totales en Stock

Distribución por Sede
Top 15 Productos con Más Stock
Inventario por Sede
Producto Stock Total
No hay productos.
Historial de Movimientos Recientes
Fecha Producto Sede Cantidad Tipo
No hay movimientos registrados.
Entrada Salida