Home›ZX Parenting›App Ortu (Android)›App Ortu (Android)›Menu Tugas
AKTIFkotlincomposetugascrud

Menu Tugas

Layar tugas ortu — CRUD tugas anak + validasi foto bukti

JSON

💡 Ide & Konsep

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.

Ringkasan

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.

UI Komponen

3 composable:

**1. LayarTugas** — main screen

  • Header: judul "Tugas" + tombol "Buat" (toggle form)
  • Empty state: "Tambah anak dulu" / "Belum ada tugas"
  • Section "Perlu Validasi" (MENUNGGU/PENDING) — kuning Amber
  • Section "Riwayat" (SELESAI/DITOLAK) — muted
  • verticalScroll, Arrangement.spacedBy(12.dp)

**2. KartuTugas** — tugas card (private)

  • Icon Inventory2 di box biru rounded 12dp
  • Judul + nama anak + badge status (warna: SELESAI=hijau, DITOLAK=merah, MENUNGGU=amber)
  • Deskripsi (jika ada)
  • Token reward "+N token" (hijau)
  • Tombol validasi: ✓ (Hijau) + ✗ (Merah) — hanya status MENUNGGU/PENDING
  • Pakai KartuClay(kecil=true) wrapper

**3. FormTugas** — form buat tugas (private)

  • Dropdown anak (OutlinedButton + DropdownMenu)
  • Field judul (text)
  • Field deskripsi (text, opsional)
  • Field token reward (number, 1-100, default "1")
  • Tombol "Simpan" — loading spinner saat loading
  • Validasi: judul tidak kosong + anakList tidak empty
  • Reward coerceIn(1, 100)

Helper: FieldBiasa — label + OutlinedTextField, rounded 12dp

Data Flow

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 login

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 login

Backend

GET /api/tugas — list semua tugas anak ortu

  • prisma.tugas.findMany({ where: { anak: { ortuId: ortu.id } } })
  • include anak.nama
  • orderBy createdAt desc

POST /api/tugas — buat tugas

  • Validasi: anakId wajib, judul wajib, tokenReward 1-100
  • Cek anak milik ortu (findFirst { id, ortuId })
  • deadline ? new Date(deadline) : null
  • Return { 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)

  • Cek tugas milik anak ortu
  • SELESAI tidak bisa di-validasi lagi (400)

Pitfall

⚠ 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.