feat: API wali murid (Sanctum) + verifikasi admin

- Pasang laravel/sanctum, routes/api.php (prefix api/v1, 10 endpoint)
- Migrasi: parent_name di students, parent_students (pivot wali↔anak),
  parent_devices (token FCM), permission parents-verify
- Auth wali: registrasi NISN+HP (auto-verify jika HP cocok data siswa,
  pending jika tidak) + login token Sanctum
- Endpoint: me, logout, students, link anak, violations, sp-letters,
  notifications, register device
- Halaman admin Verifikasi Wali (approve/reject) + menu sidebar
- Sync kesiswaan: tarik data orang tua (student_parents) ke students
- 8 feature test baru (ParentApiTest) — total suite 39 test hijau
This commit is contained in:
Novy San87
2026-08-05 18:58:29 +07:00
parent b06419624b
commit 3efce0f919
24 changed files with 1437 additions and 4 deletions
+9
View File
@@ -45,6 +45,13 @@ class StudentSyncService
continue;
}
// Data wali/orang tua: pilih kontak utama (guardian > father > mother)
$parents = collect($item['parents'] ?? []);
$primaryParent = $parents->first(fn ($p) => ($p['relation'] ?? '') === 'guardian')
?? $parents->first(fn ($p) => ($p['relation'] ?? '') === 'father')
?? $parents->first(fn ($p) => ($p['relation'] ?? '') === 'mother')
?? $parents->first();
// Use NISN as primary key, fallback to student_number if NISN is null
$nisn = $item['nisn'] ?? null;
if (!$nisn) {
@@ -89,6 +96,8 @@ class StudentSyncService
'date_of_birth' => $item['date_of_birth'] ?: null,
'address' => $item['address'],
'phone_number' => $item['phone_number'],
'parent_name' => $primaryParent ? trim((string) $primaryParent['name']) : null,
'parent_phone' => $primaryParent ? ($primaryParent['phone_number'] ?: null) : null,
'email' => $item['email'],
'class_name' => $className,
'class_level' => $classData['level'] ?? $item['class_level'] ?? 'X',