query("SELECT id, name_en FROM departments ORDER BY name_en ASC")->fetchAll(PDO::FETCH_ASSOC); if ($report_type === 'low_stock') { $title = __('low_stock_report'); $columns = ['item_name', 'sku', 'min_level', 'current_stock', 'status']; $data = $db->query(" SELECT i.name_en as item_name, i.sku, i.min_level, COALESCE((SELECT SUM(quantity) FROM inventory_batches b WHERE b.item_id = i.id), 0) as current_stock FROM inventory_items i HAVING current_stock <= min_level ORDER BY current_stock ASC ")->fetchAll(PDO::FETCH_ASSOC); } elseif ($report_type === 'expiry') { $title = __('expiry_report'); $columns = ['item_name', 'batch_number', 'expiry_date', 'quantity', 'days_remaining']; $data = $db->query(" SELECT i.name_en as item_name, b.batch_number, b.expiry_date, b.quantity, DATEDIFF(b.expiry_date, CURDATE()) as days_remaining FROM inventory_batches b JOIN inventory_items i ON b.item_id = i.id WHERE b.quantity > 0 AND b.expiry_date IS NOT NULL AND b.expiry_date <= DATE_ADD(CURDATE(), INTERVAL 90 DAY) ORDER BY b.expiry_date ASC ")->fetchAll(PDO::FETCH_ASSOC); } elseif ($report_type === 'valuation') { $title = __('stock_valuation_report'); $columns = ['item_name', 'total_quantity', 'avg_cost', 'total_value']; $data = $db->query(" SELECT i.name_en as item_name, SUM(b.quantity) as total_quantity, AVG(b.cost_price) as avg_cost, SUM(b.quantity * b.cost_price) as total_value FROM inventory_batches b JOIN inventory_items i ON b.item_id = i.id WHERE b.quantity > 0 GROUP BY i.id ORDER BY total_value DESC ")->fetchAll(PDO::FETCH_ASSOC); } elseif ($report_type === 'consumption') { $title = __('consumption_report'); $columns = ['department', 'item_name', 'total_quantity', 'total_cost']; // Filters $filter_department = $_GET['department_id'] ?? ''; $filter_start = $_GET['start_date'] ?? ''; $filter_end = $_GET['end_date'] ?? ''; $where = "WHERE t.transaction_type = 'out'"; $params = []; if ($filter_department) { $where .= " AND t.department_id = ?"; $params[] = $filter_department; } if ($filter_start) { $where .= " AND DATE(t.transaction_date) >= ?"; $params[] = $filter_start; } if ($filter_end) { $where .= " AND DATE(t.transaction_date) <= ?"; $params[] = $filter_end; } $sql = " SELECT d.name_en as department, i.name_en as item_name, SUM(t.quantity) as total_quantity, SUM(t.quantity * COALESCE(b.cost_price, 0)) as total_cost FROM inventory_transactions t JOIN departments d ON t.department_id = d.id JOIN inventory_items i ON t.item_id = i.id LEFT JOIN inventory_batches b ON t.batch_id = b.id $where GROUP BY d.id, i.id ORDER BY d.name_en ASC, total_cost DESC "; $stmt = $db->prepare($sql); $stmt->execute($params); $data = $stmt->fetchAll(PDO::FETCH_ASSOC); // Calculate totals $grand_total_qty = 0; $grand_total_cost = 0; foreach ($data as $row) { $grand_total_qty += $row['total_quantity']; $grand_total_cost += $row['total_cost']; } } ?>

Out of Stock'; else echo 'Low Stock'; } elseif ($col === 'days_remaining') { $days = $row['days_remaining']; if ($days < 0) echo 'Expired'; elseif ($days < 30) echo '' . $days . ' days'; else echo '' . $days . ' days'; } else { echo htmlspecialchars($row[$col]); } ?>
: