SplitBill adalah aplikasi mobile untuk mengubah pengeluaran patungan yang biasanya tercecer di chat menjadi ledger bersama yang terstruktur. Pengguna dapat membuat grup, mengundang anggota dengan kode, mencatat siapa yang membayar, lalu menentukan porsi setiap peserta dalam satu alur yang konsisten.
1. Tujuan Produk & Alur Utama
Produk ini dirancang untuk situasi sehari-hari seperti perjalanan, makan bersama, dan kebutuhan rumah tangga. Fokus MVP-nya adalah membuat sumber setiap pengeluaran tetap jelas: siapa yang membayar, siapa yang ikut menanggung, serta catatan apa yang berubah.
flowchart LR
A[Register / Login] --> B[Create or join a group]
B --> C[Add an expense]
C --> D[Choose payer and participants]
D --> E[Select split method]
E --> F[Save a consistent expense record]
2. Mobile Architecture & Supabase Boundary
Frontend dibangun dengan Expo dan React Native menggunakan TypeScript. TanStack Query mengelola state server dan invalidasi query, sementara Supabase menjadi boundary untuk authentication, PostgreSQL, database functions, authorization, private storage, dan konfigurasi realtime pada backend.
graph TD
RN[Expo React Native + TypeScript] -->|Supabase JS| AU[Supabase Auth]
RN -->|Queries & RPC| DB[(PostgreSQL)]
DB -->|Policies| RL[Row Level Security]
DB -->|Published tables| RE[Realtime foundation]
DB -->|Private bucket policies| ST[Receipt storage foundation]
Arsitektur ini menjaga UI tetap tipis: operasi yang membutuhkan konsistensi, seperti membuat grup dan menyimpan expense beserta split-nya, dipusatkan pada database function yang dapat divalidasi dalam satu boundary transaksi.
3. Group Management & Invite Workflow
- Pemilik membuat grup dengan nama, deskripsi, dan default currency.
- Pemilik otomatis menjadi anggota dengan role
owner. - Kode invite dapat dibuat untuk dibagikan selama tujuh hari.
- Pengguna lain dapat mem-preview kode, memeriksa masa berlaku, lalu bergabung sebagai
member. - Akses data dibatasi berdasarkan keanggotaan grup, bukan hanya berdasarkan keberadaan ID di client.
Invite lookup dan join flow dipisahkan ke helper function private di Supabase. Data API hanya mengekspos wrapper yang memerlukan role authenticated, sehingga alur undangan tidak perlu membuka tabel invite secara publik.
4. Expense Splitting & Transaction Safety
SplitBill mendukung tiga cara pembagian biaya:
- Equal - membagi nominal secara merata dan menangani sisa pembulatan pada peserta terakhir.
- Exact amount - setiap peserta memasukkan nominal bagiannya.
- Percentage - setiap peserta memasukkan persentase yang totalnya harus 100%.
Database function create_expense dan update_expense memvalidasi metode split, memastikan peserta tidak duplikat, menolak nominal negatif, dan memastikan total split sama dengan nominal expense. Dengan begitu, catatan utama dan rincian peserta tidak tersimpan dalam keadaan setengah berhasil.
5. Surfaces yang Dibangun
Pengalaman aplikasi dipisah menjadi surface yang mengikuti alur pengguna:
- Authentication, password recovery, dan persistent session.
- Home ledger dan daftar grup.
- Create, edit, dan detail grup.
- Join group melalui invite code.
- Detail anggota dan kontrol owner untuk menghapus anggota atau grup.
- Create, edit, delete, dan detail expense.
- Activity surface untuk menyiapkan riwayat perubahan grup.
- Profile dan pengaturan identitas pengguna.
Komponen UI bersama menjaga bahasa visual tetap konsisten di antara form, status mark, paper surface, dan daftar data sehingga konteks keuangan mudah dipindai di layar mobile.
6. Security & Android Delivery
Semua tabel utama menggunakan Row Level Security untuk membatasi pembacaan dan perubahan berdasarkan role serta keanggotaan grup. Session Supabase disimpan melalui AsyncStorage agar login tetap bertahan di perangkat, dan callback authentication menggunakan deep link splitbill://auth/callback untuk alur mobile.
Project kemudian dikemas sebagai Android preview build melalui Expo Application Services. Repository publik dan release APK menjadi jejak yang dapat diperiksa untuk source code maupun artefak aplikasinya.