true, "message" => "Parameter tidak lengkap" ]); exit; } $server = trim($_GET['server']); $kategori = trim($_GET['kategori']); $status = isset($_GET['status']) ? strtolower(trim($_GET['status'])) : 'semua'; if ($server === '' || $kategori === '') { echo json_encode([ "error" => true, "message" => "Parameter kosong" ]); exit; } // =============================== // BASE QUERY (WHITELIST STATUS) // =============================== $sql = " SELECT keterangan, SUM(jumlah) as jumlah FROM v_analisa_onu_per_server WHERE id_data_server = :server AND kategori COLLATE utf8mb4_general_ci = :kategori AND LOWER(status) IN ('aktif','tidak aktif') "; $params = [ ':server' => $server, ':kategori' => $kategori ]; // =============================== // FILTER STATUS (JIKA DIPILIH) // =============================== if ($status === 'aktif' || $status === 'tidak aktif') { $sql .= " AND LOWER(status) = :status"; $params[':status'] = $status; } $sql .= " GROUP BY keterangan ORDER BY jumlah DESC "; $stmt = $pdo->prepare($sql); $stmt->execute($params); $data = $stmt->fetchAll(PDO::FETCH_ASSOC); // =============================== // FORMAT DATA // =============================== $labels = []; $values = []; $total = 0; $empty = 0; foreach ($data as $row) { $keterangan = $row['keterangan'] ?? 'UNKNOWN'; $jumlah = (int) $row['jumlah']; $labels[] = $keterangan; $values[] = $jumlah; $total += $jumlah; if (strtoupper(trim($keterangan)) === 'BELUM DIISI') { $empty += $jumlah; } } echo json_encode([ "error" => false, "labels" => $labels, "values" => $values, "summary" => [ "total" => $total, "empty" => $empty, "filled" => $total - $empty ] ]); } catch (PDOException $e) { echo json_encode([ "error" => true, "message" => "Database error", "detail" => $e->getMessage() ]); }