# Sync Foto Wajah dari Google Drive untuk Smart Presensi

Foto wajah siswa dipakai untuk **verifikasi wajah** di aplikasi mobile (absen masuk/pulang). Foto disimpan di backend: `writable/faces/{student_id}.jpg`.

**Alur yang proper:** Verifikasi wajah memakai **vektor (embedding)** yang disimpan di tabel `student_faces`, bukan file gambar mentah. Jadi setelah foto formal ada (dari Drive atau sumber lain), kita **harus bikin vektor dulu** lewat face-service lalu simpan ke `student_faces`. Script sync di bawah mengerjakan keduanya: copy file **dan** generate embedding.

## Sumber foto

Folder contoh: [Foto Siswa Kls XII TP 25-26](https://drive.google.com/drive/folders/16E84NFGYPItaTANQwEyMQW5rkTCt6Asy) — berisi subfolder per kelas (XII-1, XII-2, … XII-12, Susulan).

## Cara 1: Download manual lalu jalankan script

1. **Download folder dari Google Drive**
   - Buka folder di Drive, pilih semua subfolder (XII-1 … XII-12), lalu **Download** (zip).
   - Ekstrak ke suatu folder, misalnya `C:\temp\foto-siswa-xii`.

2. **Konvensi nama file**
   - Setiap foto **wajib** bernama **NISN** siswa + ekstensi, contoh:
     - `1234567890.jpg` atau `1234567890.png`
   - Jika di Drive nama file bukan NISN (misalnya "Budi Santoso.jpg"), rename dulu per file sesuai NISN siswa.

3. **Jalankan script sync**
   - Dari **folder backend** (bukan dari scripts):
   ```bash
   cd c:\laragon\www\sman1\backend
   php scripts/sync_face_photos.php --source=C:\temp\foto-siswa-xii
   ```
   - Pastikan **face-service** (Python) sudah jalan, karena script akan memanggilnya untuk generate embedding.
   - Script akan:
     - Scan semua subfolder (XII-1, XII-2, dll.),
     - Untuk setiap file gambar (.jpg, .jpeg, .png), ambil nama file tanpa ekstensi = NISN,
     - Cari siswa di database berdasarkan NISN,
     - Copy file ke `writable/faces/{student_id}.jpg`,
     - **Kirim gambar ke face-service → dapat embedding → simpan ke tabel `student_faces` (source=formal)**.
   - Opsi `--no-embedding`: hanya copy file + update `face_hash`, tidak generate vektor (misalnya kalau face-service belum jalan).

## Cara 2: Upload per siswa lewat dashboard (rencana)

Ke depan bisa ditambah halaman di **Pengaturan Academic → Siswa**: per siswa ada tombol "Upload foto wajah", simpan ke `writable/faces/{student_id}.jpg`.

## API untuk mobile

- **GET** `/api/mobile/student/face-photo?student_id=123`  
  Mengembalikan gambar foto wajah siswa (atau 404 jika belum ada).  
  Dipakai aplikasi mobile untuk memuat foto referensi lalu membandingkan dengan wajah yang terdeteksi kamera (face-api.js).

## Ringkas

| Yang diatur | Keterangan |
|-------------|------------|
| Penyimpanan | `writable/faces/{student_id}.jpg` (atau .png) |
| **Vektor (embedding)** | Script sync memanggil face-service lalu menyimpan ke `student_faces` (source=formal). Verifikasi wajah memakai data ini. |
| Mapping | Nama file = NISN → cari siswa → simpan dengan student_id |
| Sumber | Download folder Drive → rename file = NISN → jalankan script sync (dan pastikan face-service jalan) |
| Opsi | `--no-embedding` = hanya copy file, tidak generate embedding |
