尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
Web app sederhana untuk mencatat iuran bulanan (IPL) warga. Dibuat dengan Next.js + Supabase. Cocok untuk pemakaian oleh 1-2 pengurus (RT/RW/bendahara), gratis untuk skala kecil.檢視完整 README ↗
Web app sederhana untuk mencatat iuran bulanan (IPL) warga. Dibuat dengan Next.js + Supabase. Cocok untuk pemakaian oleh 1-2 pengurus (RT/RW/bendahara), gratis untuk skala kecil.
Fitur:
households_public/payments_public — data pribadi tidak pernah
terbuka lewat halaman ini)/bayar-ipl (link "Bayar IPL" di nav dan di kartu "IPL Bulan
Ini" pada Dashboard), tanpa perlu pilih rumah (otomatis rumahnya sendiri,
tidak bisa klaim untuk rumah lain)supabase/schema.sql di repo ini.
Ini akan membuat tabel households, payments, expenses, settings,
activity_log, profiles (role), bucket Storage bukti-transfer
(privat, untuk foto transfer), beserta Row Level Security-nya. File ini
aman dijalankan ulang kalau kamu update schema-nya nanti (idempotent).Project URL dan anon public key.Setiap user punya satu baris di tabel profiles dengan kolom role
(warga atau pengurus). Default untuk user baru adalah warga
(read-only) — kalau kamu buat akun baru lewat Authentication → Users, dia
otomatis dapat role warga dan hanya bisa lihat Dashboard + Laporan.
Untuk menjadikan seseorang pengurus (akses penuh: catat pembayaran, kelola warga, ubah pengaturan), jalankan di SQL Editor:
update profiles set role = 'pengurus'
where id = (select id from auth.users where email = '[email protected]');
Akun yang sudah ada sebelum fitur role ini ditambahkan otomatis jadi
pengurus (tidak ada yang kehilangan akses saat migrasi).
Pengurus juga bisa membuat login warga baru langsung dari halaman
Pengaturan di app (bukan lewat Supabase dashboard) — akun yang dibuat
lewat panel ini selalu jadi role warga dan wajib dipilihkan rumahnya
(household_id di profiles), supaya pas login dia langsung lihat status
iuran rumahnya sendiri di Dashboard ("Info Anda"). Untuk pengurus tetap
lewat SQL di atas. Fitur ini butuh service_role key (lihat langkah 2 di
bawah).
npm install
cp .env.local.example .env.local
# isi NEXT_PUBLIC_SUPABASE_URL dan NEXT_PUBLIC_SUPABASE_ANON_KEY
# dari Project Settings > API di Supabase
#
# isi juga SUPABASE_SERVICE_ROLE_KEY dari Project Settings > API > service_role
# (secret, JANGAN pakai prefix NEXT_PUBLIC_, dan jangan commit ke git — key
# ini bisa bypass semua RLS, hanya dipakai server-side untuk fitur "Tambah
# User Warga" di halaman Pengaturan, dan untuk form "Bayar IPL" tanpa login
# di halaman Login)
#
# opsional: isi FONNTE_TOKEN untuk fitur kirim WhatsApp — daftar akun gratis
# di fonnte.com, hubungkan nomor WhatsApp (scan QR), lalu ambil token dari
# dashboard-nya. Tanpa ini, tombol "Kirim" di Pengaturan akan gagal dengan
# pesan error yang jelas, fitur lain tetap jalan normal.
#
# opsional juga: isi WABLAS_TOKEN + WABLAS_BASE_URL untuk pakai Wablas
# sebagai alternatif — gateway mana yang benar-benar dipakai diatur lewat
# toggle "Layanan WhatsApp" di halaman Pengaturan (settings.whatsapp_provider
# di database), bukan dari env ini. Berguna kalau Fonnte sedang tidak
# mengirim dengan baik. WABLAS_BASE_URL adalah subdomain server akunmu
# (terlihat di dashboard Wablas, mis. https://sby.wablas.com). Kalau Wablas
# menolak dengan pesan "IP not authorized" (server ini tidak punya IP
# tetap), isi juga WABLAS_SECRET_KEY (nilai terpisah di halaman yang sama
# dengan token) — Wablas menerima permintaan dari IP manapun kalau secret
# key ini disertakan.
#
# opsional: isi WABLAS_WEBHOOK_SECRET (string acak bebas) untuk fitur
# "Percakapan WhatsApp" di halaman Humas. Dipakai oleh dua webhook Wablas
# yang beda, tiap satu diisi terpisah di dashboard Wablas:
# 1. Pesan masuk (balasan warga) — Device > Setting > Webhook Receive,
# isi https://<domain-kamu>/api/webhooks/wablas?token=<isi
# WABLAS_WEBHOOK_SECRET di sini>
# 2. Status kirim (terkirim/diterima/dibaca) — field "Tracking URL" di
# Device Setting (atau lewat API POST /api/device/change-tracking-url
# kalau tidak ada di dashboard), isi
# https://<domain-kamu>/api/webhooks/wablas-tracking?token=<token yang
# sama>
# Tanpa ini, pesan yang dikirim dari Kiwari tetap tercatat sebagai
# "Terkirim" generik — hanya status real-time dan balasan masuk yang
# kosong.
npm run dev
Buka http://localhost:3000, login pakai akun yang dibuat di langkah 1.4.
.env.local
(NEXT_PUBLIC_SUPABASE_URL, NEXT_PUBLIC_SUPABASE_ANON_KEY,
SUPABASE_SERVICE_ROLE_KEY, dan FONNTE_TOKEN kalau dipakai).Catatan: project Supabase gratis akan "tidur" otomatis setelah 7 hari tanpa aktivitas, tapi akan aktif lagi otomatis begitu ada request (jeda beberapa detik saja). Tidak masalah untuk pemakaian bulanan seperti ini.
households — daftar rumah/warga (no. rumah, nama, no. HP, status aktif).
Kolom alt_names: nama lain yang bisa jadi pengirim transfer untuk unit
itu (mis. istri/suami), dipisah koma — dipakai OCR bukti transfer di
halaman Login supaya tetap cocok walau yang transfer bukan kepala
keluarga yang terdaftarpayments — satu baris = satu warga bayar untuk satu bulan/tahun tertentu
(unique per warga+bulan+tahun, jadi tidak bisa double-input). Kolom
status: pending (klaim mandiri dari halaman Login, belum diverifikasi)
atau confirmed (dicatat pengurus, atau klaim yang sudah dikonfirmasi) —
hanya confirmed yang terhitung Lunas di Dashboard/Laporan/export CSV.
Kolom receipt_path: path file bukti transfer di Storage, kalau diuploadexpenses — pengeluaran kas (tanggal, keterangan, jumlah, dicatat oleh);
hanya pengurus yang bisa insert, tapi semua user login bisa baca (tidak
ada data pribadi warga di tabel ini)settings — nominal iuran bulanan defaultactivity_log — jejak siapa mencatat/mengubah apa (khusus pengurus)profiles — role tiap user (warga / pengurus) + household_id yang
menautkan login warga ke rumahnya, satu baris per akun loginhouseholds_public / payments_public — view read-only untuk halaman
Laporan versi warga: cuma expose unit_no + status bayar, tanpa nama,
no. HP, catatan, atau siapa yang mencatatKarena ini data uang, sebaiknya rutin (mis. tiap bulan) export CSV dari halaman Laporan sebagai cadangan di luar database. Supabase juga punya backup otomatis di paket berbayar, tapi export manual sudah cukup untuk skala ini.