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.
