Prestige Barber Club — Build/Audit Report v4.44.7 Feature: Semua Member di Website Utama + Poin + Ranking AUDIT INVESTIGASI BASELINE v4.44.6 1. public.php hanya memanggil active_members_public() dengan public_site_member_ranking_limit (default 6, UI maksimum 12). 2. active_members_public() sendiri memaksa LIMIT maksimum 50 dan WHERE m.is_active=1. Akibatnya tidak mungkin seluruh record member tampil. 3. /member-teraktif memakai setting lain (public_active_members_limit default 12), sehingga homepage dan halaman ranking dapat menampilkan populasi berbeda. 4. Member inactive/expired tidak pernah masuk ranking publik karena filter is_active=1; status expiry juga tidak ditampilkan. 5. Ranking tersebar pada helper/limit yang berbeda, sehingga satu sumber authoritative belum ada. 6. Query ranking membaca paid transactions, tetapi belum memiliki indeks komposit eksplisit member_id + payment_status + transaction_date untuk kebutuhan direktori seluruh member. PERBAIKAN v4.44.7 - public_all_members_ranked(PDO) menjadi ledger ranking publik authoritative. - Seluruh row tabel members diambil tanpa LIMIT dan tanpa menghapus Nonaktif/Expired. - Ranking deterministik: transaksi paid DESC -> total nilai paid DESC -> points DESC -> kunjungan terakhir DESC -> member ID ASC. - Rank dihitung satu kali dari hasil authoritative dan dipakai sama oleh homepage serta /member-teraktif. - Homepage selalu menampilkan direktori/ranking seluruh member; setting Top-N lama tidak lagi membatasi hasil. - Menampilkan: ranking, foto, nama, level, status, transaksi paid, poin, tanggal bergabung. - Tidak menampilkan nomor WA, email, alamat, atau data kontak lain pada tabel publik. - Search client-side hanya memfilter DOM; seluruh member tetap dikirim/render pada homepage sesuai requirement. - Status publik: Nonaktif bila is_active != 1; Expired bila aktif tetapi card_expires_at < hari ini; selain itu Aktif. - ensure_v4447_schema() memastikan public_site_show_member_ranking=1 dan mencoba menambah index idx_trx_member_paid_date(member_id,payment_status,transaction_date) jika belum ada. - database.sql fresh-install diperbarui dengan indeks tersebut. AUDIT KEAMANAN / KONSISTENSI - Poin mengambil members.points, yaitu saldo poin authoritative aplikasi. - Statistik aktivitas hanya menghitung transaksi payment_status='paid'. - Member tanpa transaksi tetap tampil dengan 0 transaksi dan poin aktual. - Tie-breaker ranking deterministik untuk mencegah nomor ranking berubah acak pada nilai yang sama. - Public output memakai e() untuk nama/level/status dan tidak mengekspos phone/email. - Tidak ada perubahan pada mekanisme earning points, transaksi POS, membership activation/renewal, atau membership_sales. - Tidak ada DROP TABLE / TRUNCATE. VALIDASI BUILD - Seluruh file PHP dilint dengan php -l. - ZIP FULL dan PATCH diuji dengan unzip -t. - Diff PATCH dibuat dari baseline FULL v4.44.6. - Tidak dilakukan eksekusi terhadap MySQL produksi/domain produksi; indeks dan query perlu dikonfirmasi setelah deploy pada data nyata.