# SIMAP Wali — Aplikasi Flutter Orang Tua

## Menjalankan

```bash
cd mobile
flutter pub get
flutter run --dart-define=SIMAP_API=https://sekolah.sch.id/api
```

Rilis:

```bash
flutter build apk --release --dart-define=SIMAP_API=https://sekolah.sch.id/api
```

Font `Bricolage Grotesque` perlu diletakkan di `mobile/assets/fonts/`
(unduh dari Google Fonts). Bila belum tersedia, hapus blok `fonts:` di
`pubspec.yaml` — aplikasi tetap berjalan dengan font sistem.

## Struktur

```
mobile/lib/
├── main.dart              titik masuk, cek sesi tersimpan
├── tema.dart              palet & tema Material 3
├── models/anak.dart
├── services/api_service.dart   HTTP, penyimpanan token, semua endpoint
├── widgets/umum.dart      KartuAngka, Label, JudulBagian, pemformat tanggal/rupiah
└── screens/
    ├── login_screen.dart
    ├── beranda_screen.dart     kerangka + pemilih anak + ringkasan
    ├── absensi_screen.dart     penjelajah bulanan
    ├── nilai_screen.dart       per mapel, dapat dibentang untuk rincian
    ├── rapor_screen.dart       daftar + detail rapor
    ├── izin_screen.dart        riwayat + formulir pengajuan
    ├── literasi_screen.dart
    ├── tagihan_screen.dart
    ├── pesan_screen.dart       percakapan dengan wali kelas
    ├── notifikasi_screen.dart
    └── profil_screen.dart
```

## Keputusan rancangan

**Satu akun, banyak anak.** Pemilih anak ada di bilah atas, bukan layar
terpisah, supaya orang tua dengan dua atau tiga anak tidak perlu bolak-balik.
Pilihan terakhir disimpan di `SharedPreferences`.

**Yang paling dicari ditaruh paling atas.** Kartu hijau di beranda menjawab
satu pertanyaan yang paling sering muncul tiap pagi: anak saya sudah sampai
sekolah atau belum. Jam masuk, keterangan terlambat, dan status ditampilkan
tanpa perlu mengetuk apa pun.

**Nilai disertai asal-usulnya.** Setiap mapel bisa dibentang untuk melihat
butir penilaian pembentuk nilai akhir, sehingga orang tua tidak hanya melihat
angka jadi.

**Tidak ada pembayaran dalam aplikasi.** Layar tagihan hanya menampilkan
rincian dan riwayat; instruksi pembayaran diambil dari pengaturan sekolah.
Ini menghindari kewajiban kepatuhan sistem pembayaran yang di luar cakupan.

**Kegagalan jaringan ditangani apa adanya.** `ApiService` melempar `ApiError`
dengan pesan berbahasa Indonesia yang siap tampil; setiap layar punya tombol
"Coba lagi" alih-alih layar kosong tanpa penjelasan.

**Token kedaluwarsa langsung menendang ke login.** Respons `401` menghapus
sesi lokal, jadi tidak ada kondisi setengah masuk yang membingungkan.
