Prestige Barber Club v4.42.0 - Build Test Report

Scope: Deep audit QR kartu member / scanner fisik / lookup member.

Root causes identified:
1. QR kartu lama membawa URL portal cek member lengkap. Pada area QR kartu CR80 yang kecil, payload panjang + EC H meningkatkan kepadatan modul dan menurunkan toleransi scanner fisik.
2. QR pada PNG di-resize saat digambar ke canvas, berpotensi memberi interpolasi/blur pada tepi modul.
3. api_member.php sebelumnya melakukan exact lookup atas input yang diterima dan tidak menormalisasi QR URL/prefix scanner secara server-side.
4. Scanner fisik tertentu dapat mengirim AIM/Symbology Identifier seperti ]Q1 atau ]Q3. Prefix ini membuat kode berbeda dari members.member_code walaupun QR berhasil dibaca.

Fixes:
- QR kartu baru: payload pendek MEMBER:<member_code>.
- Error correction QR diubah H -> M agar modul lebih longgar untuk kartu fisik.
- Print QR diperbesar dan quiet-zone putih dipertahankan.
- PNG canvas menonaktifkan image smoothing saat menggambar QR.
- Normalisasi server-side menerima QR baru, QR URL lama, AIM prefix, control chars/BOM, quote, URL encoding, case/space variants.
- scan.php melakukan normalisasi client-side dan API tetap mengulang normalisasi sebagai authoritative guard.
- scanner_diagnostic.php menampilkan raw input, hasil normalisasi, dan lookup database langsung.
- member_check.php memakai normalisasi yang sama.
- Backward compatibility: kartu QR URL versi lama tetap dapat dipakai.

Static tests:
- PHP lint: 211 PHP files, 0 syntax errors.
- No destructive database table/column changes.
- Upgrade page uses page_header($pdo,...).

Operational note:
- Untuk hasil terbaik, kartu fisik/PNG lama sebaiknya dibuat/cetak ulang agar memakai QR pendek v4.42.0.
- Kartu lama tetap didukung melalui normalisasi URL lama.
