- project/task approval: filter isApprover berdasarkan desa + group project
- project/task approval: supadmin tetap hanya filter desa
- division/task approval: expose idGroup dari Division pada response cat=data
- division/task approval: filter isApprover berdasarkan desa + group division
- division/task approval PUT: ganti getApproverStatus dengan cek langsung
berdasarkan village, group, dan keanggotaan division admin
- GET /mobile/village-calendar: ambil acara divisi dan kegiatan se-village per tanggal
- GET /mobile/village-calendar/indicator: dot indikator per bulan, task di-expand per hari dalam range dateStart-dateEnd
- tambah model ProjectTaskApproval dan DivisionProjectTaskApproval di schema prisma
- tambah field isApprover pada model User
- tambah API approval project task: GET riwayat, POST ajukan, PUT setujui/tolak
- tambah API approval division task: GET riwayat, POST ajukan, PUT setujui/tolak
- notifikasi dikirim ke approver, admin divisi, dan submitter via FCM, web push, dan in-app
- tambah PATCH endpoint untuk toggle isApprover pada mobile user API
- perbaiki pengecekan role approver menggunakan UserRole.id
Create not-found.tsx and global-error.tsx to prevent Next.js from
falling back to legacy Pages Router _error pages during static
generation, which fail with useContext null in Docker.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add `export const dynamic = 'force-dynamic'` to root layout so all
pages are rendered at request time instead of build time. Fixes
useContext null error during Docker build prerendering.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>