Sentra Rental — Deposit & Fine Module¶
Deposit adalah jaminan finansial utama untuk mengurangi risiko gagal bayar dan kerusakan aset. Modul ini mengelola seluruh siklus hidup deposit dari penahanan hingga pelepasan atau penyitaan.
13.1 Deposit Lifecycle¶
graph TD
A[Booking Dibuat] --> B[Customer Bayar Biaya Rental + Deposit]
B --> C[Pre-Auth Hold di Payment Gateway — Xendit/Midtrans]
C --> D[Masa Rental Berjalan]
D --> E[Unit Kembali ke Cabang]
E --> F{Inspeksi Return Clear?}
F -- Ya --> G[Release Pre-Auth — Refund 100% dalam 10 Menit]
F -- Tidak --> H[Hitung Biaya Denda / Kerusakan]
H --> I{Denda <= Amount Held?}
I -- Ya --> J[Capture Partial — Sisa Deposit Direfund ke Customer]
I -- Tidak --> K[Capture 100% Deposit + Tagih Kekurangan ke Customer]
13.2 Mekanisme Pre-Authorization¶
Hold (saat booking dibayar)¶
POST Xendit /credit_cards/charges
{
"amount": 500000,
"capture": false, ← pre-auth, tidak langsung debet
"description": "Deposit SR/20260521/00042"
}
→ Response: { "id": "charge_xyz", "status": "AUTHORIZED" }
ID charge disimpan di tabel deposits.payment_gateway_ref.
Capture (saat kerusakan/keterlambatan dikonfirmasi)¶
POST Xendit /credit_cards/charges/charge_xyz/capture
{
"capture_amount": 350000 ← hanya capture sebesar denda
}
Release (saat rental selesai tanpa insiden)¶
Release otomatis juga terjadi jika dalam 24 jam setelah status COMPLETED admin belum melakukan capture manual.
13.3 Perhitungan Denda Keterlambatan¶
Formula denda berdasarkan total jam keterlambatan ($h$) dihitung dari menit aktual ($t$):
$$\text{Denda Keterlambatan} = \begin{cases} 0, & \text{jika } t < 60 \text{ menit (grace period)} \ h \times 0.1 \times \text{Daily Rate}, & \text{jika } 1 \le h \le 5 \ \text{Daily Rate} \times 1.5, & \text{jika } h > 5 \end{cases}$$
Contoh: Avanza (Daily Rate Rp 350.000), terlambat 6 jam:
$$\text{Denda} = \text{Rp } 350.000 \times 1.5 = \text{Rp } 525.000$$
13.4 Damage Tariff Matrix (Katalog Denda Kerusakan)¶
| Komponen | Tingkat Kerusakan | Tarif Ganti Rugi |
|---|---|---|
| Cat / Body mobil per panel | Baret halus | Rp 350.000 |
| Bumper mobil | Penyok minor | Rp 750.000 |
| Kaca depan | Retak/pecah | Rp 1.500.000 |
| Lensa kamera | Berjamur | Rp 500.000 |
| Filter UV kamera | Retak | Rp 150.000 |
| Drone propeller | Patah 1 baling-baling | Rp 200.000 |
| Konsol PS5 | Goresan casing | Rp 300.000 |
| Barang hilang | Apapun | Harga pasar current × 1.2 |
Katalog disimpan di tabel damage_tariffs dan dapat diupdate admin tanpa deploy ulang.
13.5 Dispute Resolution Flow¶
Pelanggan yang tidak setuju dengan penilaian kerusakan dapat mengajukan banding:
1. Customer → Ajukan dispute via app
2. Admin → Tarik arsip foto check-out dari S3 (SHA-256 verified)
3. System → Bandingkan hash foto check-out vs check-in
4. Admin + Customer → Review foto side-by-side di console
Jika kerusakan terbukti baru:
→ Deposit capture dipertahankan, pelanggan tanda tangan persetujuan digital
Jika kerusakan terbukti sudah ada sebelumnya (false positive):
→ Admin batalkan denda, release deposit penuh, catat insiden ke log audit
Seluruh bukti foto di S3 bersifat immutable — hash SHA-256 dicocokkan saat dispute untuk membuktikan integritas data.
13.6 Escrow & Rekonsiliasi¶
- Uang deposit tidak masuk ke rekening operasional cabang. Dana dihold di virtual account escrow payment gateway hingga ada instruksi release/capture eksplisit dari sistem.
- Laporan rekonsiliasi deposit digenerate otomatis setiap hari pukul 23:59 WIB — membandingkan status di database (
depositstable) vs status di dashboard payment gateway API. - Selisih yang ditemukan memicu alert notifikasi ke owner dan tim keuangan.