query("SELECT COUNT(*) FROM products")->fetchColumn(); $total_sedes = $pdo->query("SELECT COUNT(*) FROM sedes")->fetchColumn(); $total_stock = $pdo->query("SELECT COUNT(*) FROM unidades_inventario WHERE estado = 'En Almacén'")->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 producto_id, sede_id, COUNT(*) as quantity FROM unidades_inventario WHERE estado = 'En Almacén' GROUP BY producto_id, sede_id"); $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 Principal' => '#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 (ú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 "
| Fecha | Producto | Sede | Cantidad | Tipo |
|---|---|---|---|---|
| No hay movimientos registrados. | ||||
| Entrada Salida | ||||