Kos Kita
Kos Kita adalah sistem manajemen kos yang dirancang untuk mendigitalisasi operasional kos manual. Sistem ini memiliki peran pengguna untuk pemilik kos, super admin, dan penghuni. Platform ini terintegrasi dengan Gemini API untuk memberikan dashboard berbasis AI bagi pemilik kos guna analisis data, serta mengotomatisasi pengiriman notifikasi tagihan ke penghuni. Sistem ini juga mencakup integrasi Midtrans untuk pembayaran yang aman dan cron job harian untuk pengecekan otomatis jatuh tempo pembayaran tagihan. Selain itu, sistem menyertakan proses pemesanan dengan DP di awal untuk mengamankan kamar.
2025
Situs Web
Laravel, PHP, MySQL, Postman
Masalah
Banyak kos kecil masih dikelola manual. Data kamar, penghuni, dan sewa bulanan dicatat sendiri, dan pembayaran dikonfirmasi satu per satu. Kos Kita menggabungkan semuanya dalam satu sistem. Pengunjung bisa melihat kamar, penghuni mendaftar dan membayar secara online, tagihan bulanan dibuat otomatis, dan setiap pemilik punya dashboard untuk kosnya sendiri. Superadmin memverifikasi pemilik baru sebelum kos mereka tampil.
Peran saya
Ini proyek tim lima orang (PBL). Saya pemilik repositori dan penanggung jawab backend, dengan sekitar 120 dari ~235 commit:
- Setup proyek, skema database, dan sebagian besar migration (15 dari 26)
- Arsitektur role: tiga panel Filament, middleware yang menjaganya, dan pembatasan data per pemilik
- Registrasi dengan OTP WhatsApp, logika booking dan DP, serta integrasi Midtrans (Snap + webhook)
- Cron job harian untuk tagihan dan denda keterlambatan
- Widget insight AI Gemini di dashboard pemilik
- Activity log (jejak audit) di 9 model, dan panel superadmin
Anggota tim lain mengerjakan katalog publik, halaman penghuni (riwayat tagihan, nota PDF), dan panel Filament penghuni.
Arsitektur
- Laravel 13 + Filament 5, MySQL. Blade untuk situs publik dan alur penghuni, Filament untuk tiga panel admin.
- Role disimpan di
users.role(admin,penghuni,superadmin).User::canAccessPanel()menentukan panel mana yang boleh dibuka. Middleware memblokir pemilik yang belum diverifikasi dan penghuni yang pembayarannya belum disetujui. - Efek samping ada di satu tempat. Saat status pembayaran berubah menjadi
verified, event modelPembayaranmenandai tagihan lunas, menempatkan penghuni di kamar, dan menandai kamar terisi. Alurnya sama, baik pembayaran lewat Midtrans maupun disetujui manual.
Database
Satu pemilik bisa punya beberapa kos, dan satu kos punya banyak kamar. Harga kamar bergantung pada jumlah penghuni (harga_kapasitas, JSON). tagihan adalah tagihan bulanan. pembayaran adalah percobaan pembayaran untuk tagihan itu, atau untuk biaya booking dan pendaftaran pemilik.
Endpoint utama
| Method | Path | Fungsi |
|---|---|---|
POST |
/register/send-otp |
Kirim OTP WhatsApp (maks. 1 per 5 menit) |
POST |
/register |
Buat akun penghuni + pembayaran pending, kembalikan Snap token |
POST |
/kamar/booking/{id} |
Booking kamar dengan DP |
GET |
/waiting-approval/pay-midtrans |
Buka ulang/perbarui Snap yang kedaluwarsa |
POST |
/midtrans/webhook |
Notifikasi pembayaran Midtrans |
GET |
/midtrans/finish |
Redirect setelah checkout Snap |
GET |
/tagihan-bulanan |
Daftar tagihan bulanan penghuni |
POST |
/tagihan/{id}/upload |
Bayar tagihan (Midtrans atau bukti transfer) |
GET |
/nota/{id} |
Unduh nota PDF |
Tantangan teknis
Memercayai webhook Midtrans. Webhook tidak memakai isi request mentah-mentah. Midtrans\Notification mengambil ID transaksi lalu menanyakan status aslinya ke API Midtrans dengan server key, jadi POST palsu tidak bisa menandai pembayaran lunas. Status capture/settlement menjadi verified (kartu kredit dengan status challenge ditahan), sedangkan cancel/deny/expire menjadi rejected.
Notifikasi ganda. Midtrans bisa mengirim notifikasi yang sama lebih dari sekali, dan redirect browser bisa datang lebih dulu daripada webhook. Efek samping verifikasi hanya berjalan saat status berubah menjadi verified (getOriginal('status') !== 'verified'). Karena itu, notifikasi berulang tidak menempatkan penghuni dua kali atau memproses tagihan ulang.
DP dan tagihan pertama. Booking dikenai 50% harga kamar ditambah biaya booking Rp 50.000. Saat cron membuat tagihan bulanan pertama untuk penghuni itu, yang ditagih hanya sisa 50%.
Cron tagihan harian. app:process-billing-daily berjalan pukul 00:00 WIB. Penghuni ditagih pada tanggal yang sama dengan tanggal masuknya. Kalau tanggal masuknya 29–31, tagihan di bulan yang lebih pendek dibuat di hari terakhir bulan itu. Cron aman dijalankan ulang: penghuni yang sudah punya tagihan bulan ini dilewati, dan denda hanya ditambahkan ke tagihan lewat jatuh tempo yang belum didenda. Salah satu bug yang saya perbaiki adalah timezone scheduler yang belum WIB.
Insight AI yang hemat kuota. Widget pemilik merangkum data milik pemilik itu (okupansi per kos, tagihan bulan ini, tagihan tertunggak, laporan kerusakan yang belum selesai). Ringkasan itu dikirim ke Gemini 2.5 Flash dengan responseMimeType: application/json dan temperature 0.1, lalu hasilnya di-cache per pemilik selama 6 jam. Respons yang gagal atau rusak dicatat di log, dan widget menampilkan pesan untuk mencoba lagi, jadi dashboard tetap berfungsi.
Yang ingin saya perbaiki
- Menambahkan unique index
tagihan(user_id, bulan, tahun)agar aturan satu tagihan per bulan dijamin database, bukan hanya oleh kode. - Memindahkan panggilan Midtrans dan Gemini ke queue supaya respons pihak ketiga yang lambat tidak menahan halaman.
- Menambahkan feature test untuk transisi status pembayaran.
- Menghapus nama dan nomor HP penghuni dari data yang dikirim ke Gemini; angka agregat sudah cukup untuk insight.
Simulasikan siklus hidup webhook Midtrans & proteksi idempotensi terhadap duplicate webhook atau replay attack pada sistem Kos Kita / SewMe.
POST /midtrans/webhook
Payload & SHA-512 Hash
Verifikasi Server Key
Midtrans API Double-Check
Cek Status Transisi
getOriginal('status')
DB::transaction
Assign Room & Invoice PDF
// System ready. Click one of the action buttons above to simulate.
Analisis dampak pembuatan Compound Index pada tabel tagihan (50.000 records) untuk cron job tengah malam.
ref (Index Seek)
idx_user_bulan_tahun
1 row
0.002% of table
1.2 ms
99.2% faster
O(log N)
B+ Tree Traversal
Proyek Lainnya

Backend, basis data, dan REST API terdokumentasi untuk website profil dan CMS laboratorium.
- PHP Native
- MySQL
- JWT
- +3

Backend platform kesehatan mental: analisis emosi diari berbasis AI, konsultasi psikolog, dan pemetaan stres per wilayah.
- Node.js
- Express
- Sequelize
- +3

Marketplace penjahit yang dibangun saat magang di Unimasoft: pesanan, pelacakan progres, chat, dan pembayaran nontunai.
- Laravel 11
- Livewire
- MySQL
- +2