尚未检测到更新。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.