Layar tugas ortu — CRUD tugas anak + validasi foto bukti
1. Executive Summary & Core Concept
Tujuan Modul: Menyediakan sistem manajemen tugas harian yang dilengkapi kuis edukatif berbasis AI serta Otomatisasi Terjadwal (Scheduled AI Tasks). Orang tua dapat mengatur jadwal rutin di mana AI akan secara otomatis menghasilkan dan mengirimkan tugas atau kuis baru setiap hari berdasarkan profil anak dan skala kesulitan yang dipilih, tanpa perlu intervensi manual setiap hari.
2. Spesifikasi Teknis & Integrasi Sistem
Frontend Mobile: Flutter / Android Native (Antarmuka Orang Tua & Anak).
Backend & Cron Job Automation: Node.js / Supabase dengan Cron Jobs / Background Workers untuk memicu pembuatan tugas otomatis harian.
AI Engine: Integrasi LLM API (DeepSeek/Gemini) untuk pemrosesan pembuatan soal dinamis sesuai jadwal.
Database Schema (Automation Settings Table):
schedule_id (UUID)
child_id (Foreign Key ke profil anak)
topic_theme (Tema berkala, misal: Matematika Dasar / Kosakata)
difficulty_level (Skala 1-5)
execution_time (Waktu pengiriman harian, misal: Pukul 15:00)
reward_tokens (Jumlah token otomatis)
is_active (Boolean)
3. Fitur Utama & Actionable Checklist
A. Manajemen Tugas Manual oleh Orang Tua
[ ] Antarmuka pembuatan tugas harian standar (judul, deskripsi, target anak, jumlah token).
[ ] Daftar tugas aktif per anak (Active Tasks List).
[ ] Tombol verifikasi/persetujuan tugas selesai oleh orang tua (Approval System).
B. Fitur Pembuatan Kuis Otomatis Berbasis AI (AI Quiz Generator)
[ ] Form input tema/topik tugas soal oleh orang tua secara instan.
[ ] Filter otomatis berbasis profil anak (mengambil data umur, kelas, jenis kelamin, dan agama).
[ ] Pengatur tingkat kesulitan interaktif bergeser/skala 1 sampai 5 (Level 1 Pemula hingga Level 5 Expert).
[ ] Pratinjau (Preview) soal sebelum dikirimkan ke perangkat anak.
C. Fitur Tugas AI Terjadwal (Scheduled AI Tasks) [BARU]
[ ] Panel Pengaturan Jadwal (Scheduler Setup): Menu bagi orang tua untuk menentukan frekuensi (misal: Setiap Hari Senin-Jumat), jam pengiriman, dan tema berulang.
[ ] Background Cron Worker: Sistem otomatis di server yang memicu AI setiap hari pada jam tertentu untuk meracik soal baru berdasarkan profil anak dan tingkat kesulitannya (1-5).
[ ] Auto-Publish to Child Device: Tugas yang digenerate oleh sistem otomatis masuk ke daftar tugas anak tanpa perlu klik manual dari orang tua setiap hari.
D. Sisi Klien Anak (Child View)
[ ] Notifikasi dan daftar kuis/tugas baru (baik tugas manual, kuis instan, maupun tugas terjadwal dari AI).
[ ] Antarmuka pengerjaan soal atau penandaan selesai tugas.
[ ] Animasi perolehan Token/ZX Coin otomatis saat tugas divalidasi oleh orang tua.
4. Model Token & Reward Integration
Setiap tugas yang diselesaikan dan disetujui orang tua akan langsung menambahkan saldo Token/ZX Coin ke dompet anak.
Saldo token terhubung langsung dengan modul Market untuk ditukar dengan hadiah pilihan.
Tab ke-3 (index 2) di bottom navigation. Ortu assign tugas ke anak, anak kirim foto bukti, ortu validasi.
File: ui/layar/LayarTugas.kt (234 lines)
Wiring: MainActivity.kt tab==2 → LayarTugas(tugasList, anakList, loading, onBuat, onValidasi)
Status flow:
PENDING → DIKUMPULKAN → SELESAI (token masuk)
→ DITOLAK (foto dihapus, anak kirim ulang)PENDING → DIKUMPULKAN → SELESAI (token masuk)
→ DITOLAK (foto dihapus, anak kirim ulang)
**Validasi ortu:** tombol ✓ (selesai) atau ✗ (tolak) di kartu tugas status MENUNGGU/PENDING.
Validasi ortu: tombol ✓ (selesai) atau ✗ (tolak) di kartu tugas status MENUNGGU/PENDING.
3 composable:
**1. LayarTugas** — main screen
verticalScroll, Arrangement.spacedBy(12.dp)**2. KartuTugas** — tugas card (private)
Inventory2 di box biru rounded 12dpKartuClay(kecil=true) wrapper**3. FormTugas** — form buat tugas (private)
OutlinedButton + DropdownMenu)coerceIn(1, 100)Helper: FieldBiasa — label + OutlinedTextField, rounded 12dp
State: UiState.tugasList: List<Tugas>, UiState.anakList: List<Anak>
Tugas data class:
data class Tugas(
id, judul, deskripsi: String?,
tokenReward: Int,
status: String, // PENDING|DIKUMPULKAN|SELESAI|DITOLAK
fotoBuktiUrl: String?,
validasiOrtu: Boolean?,
deadline: String?,
createdAt: String,
anak: AnakRef, // {nama: String}
)data class Tugas(
id, judul, deskripsi: String?,
tokenReward: Int,
status: String, // PENDING|DIKUMPULKAN|SELESAI|DITOLAK
fotoBuktiUrl: String?,
validasiOrtu: Boolean?,
deadline: String?,
createdAt: String,
anak: AnakRef, // {nama: String}
)
**TugasCreateReq:** `anakId, judul, deskripsi?, tokenReward=1, deadline?`
**TugasValidasiReq:** `aksi: String` // "selesai" | "tolak"
**ZxVm functions:**
- `muatTugas(token)` — `GET /api/tugas`, update `state.tugasList`
- `buatTugas(anakId, judul, deskripsi, tokenReward, deadline, onSelesai)` — `POST /api/tugas`, reload tugas
- `validasiTugas(tugasId, aksi)` — `PATCH /api/tugas/{id}`, reload tugas + anak (token balance berubah)
**Called from `muatSemua()`:** tugas load saat loginTugasCreateReq: anakId, judul, deskripsi?, tokenReward=1, deadline?
TugasValidasiReq: aksi: String // "selesai" | "tolak"
ZxVm functions:
muatTugas(token) — GET /api/tugas, update state.tugasListbuatTugas(anakId, judul, deskripsi, tokenReward, deadline, onSelesai) — POST /api/tugas, reload tugasvalidasiTugas(tugasId, aksi) — PATCH /api/tugas/{id}, reload tugas + anak (token balance berubah)**Called from muatSemua():** tugas load saat login
GET /api/tugas — list semua tugas anak ortu
prisma.tugas.findMany({ where: { anak: { ortuId: ortu.id } } })POST /api/tugas — buat tugas
findFirst { id, ortuId })deadline ? new Date(deadline) : null{ ok, tugasId }PATCH /api/tugas/[id] — validasi
aksi="selesai": status→SELESAI, validasiOrtu=true - Token reward masuk: tokenBalance.upsert + tokenLedger.create (tipe=TUGAS)
- streakNaik(tx, anakId) — streak +1
- $transaction — atomic
aksi="tolak": status→DITOLAK, fotoBuktiUrl=null, validasiOrtu=false- Anak bisa kumpul ulang (kirim foto baru)
⚠ deadline field ada di model + API + TugasCreateReq, TAPI tidak dipakai di FormTugas UI. MainActivity wiring: vm.buatTugas(aId, j, d, r, null) {} — selalu kirim deadline=null.
⚠ Status di backend: PENDING → DIKUMPULKAN → SELESAI/DITOLAK. Tapi LayarTugas cek MENUNGGU || PENDING — DIKUMPULKAN tidak masuk "Perlu Validasi". Kemungkinan bug: tugas DIKUMPULKAN tidak tampil di section validasi.
⚠ validasiTugas reload muatAnak(token) setelah "selesai" — karena token balance anak berubah. Tapi tidak reload di "tolak".
⚠ Foto bukti: fotoBuktiUrl field ada, anak kirim via app anak (zx-agent). Upload mechanism belum fully implemented di backend.
⚠ Token reward coerceIn(1, 100) di app. Backend juga validasi 1-100. Double validation OK.
⚠ Tugas auto-expire: deadline lewat → status DIKUMULKAN? Tidak. Backend tidak auto-expire. Tugas PENDING tetap PENDING walau deadline lewat.