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, sku FROM products ORDER BY nombre"); $products = $products_stmt->fetchAll(PDO::FETCH_ASSOC); $stock_stmt = $pdo->query("SELECT product_id AS producto_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'], 'sku' => $product['sku'], 'total' => 0, 'sedes' => array_fill_keys(array_column($sedes, 'id'), 0) ]; } foreach ($stock_data as $stock_item) { if (isset($inventario[$stock_item['producto_id']])) { $inventario[$stock_item['producto_id']]['sedes'][$stock_item['sede_id']] = $stock_item['quantity']; $inventario[$stock_item['producto_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 = [ 'ALMACEN PR' => '#28a745', // Verde 'ALIDRV' => '#FFCE56', // Amarillo 'LIMA' => '#36A2EB' // Azul ]; $default_color_idx = 0; foreach ($sede_chart_labels_array as $label) { $color_asignado = null; foreach ($color_map as $sede => $color) { if (strcasecmp($label, $sede) == 0) { $color_asignado = $color; break; } } if ($color_asignado) { $colores_sedes[] = $color_asignado; } 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 $fecha_filtro = $_GET['fecha'] ?? ''; $where_clause = ""; $params = []; if (!empty($fecha_filtro)) { $where_clause = " WHERE DATE(sm.movement_date) = :fecha "; $params[':fecha'] = $fecha_filtro; $limit = 500; // Aumentar límite si se filtra por fecha } else { $limit = 50; } $query = " SELECT sm.movement_date, p.nombre as product_name, s.nombre as sede_name, sm.quantity, sm.type, sm.codigo_unico, sm.metodo_registro FROM stock_movements sm JOIN products p ON sm.product_id = p.id JOIN sedes s ON sm.sede_id = s.id $where_clause ORDER BY sm.created_at DESC LIMIT $limit "; $movements_stmt = $pdo->prepare($query); $movements_stmt->execute($params); $movements = $movements_stmt->fetchAll(PDO::FETCH_ASSOC); // 5. Resumen de salidas de hoy $hoy = date('Y-m-d'); $resumen_salidas_stmt = $pdo->prepare(" SELECT p.nombre, SUM(sm.quantity) as total_salida FROM stock_movements sm JOIN products p ON sm.product_id = p.id WHERE sm.type = 'salida' AND DATE(sm.movement_date) = :hoy GROUP BY p.nombre ORDER BY total_salida DESC "); $resumen_salidas_stmt->execute([':hoy' => $hoy]); $resumen_salidas = $resumen_salidas_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
$datos_producto): ?> $cantidad): ?>
Producto SKU Stock Total
No hay productos.
0): ?> 0
Resumen de Salidas de Hoy ()
Productos

No se han registrado salidas el día de hoy.

Historial de Movimientos
Limpiar
Fecha Producto Sede Cantidad Tipo Código Método
No hay movimientos registrados.
Entrada Salida