Generate Invoice¶
Invoice adalah tagihan resmi yang dibuat tiap siklus billing (biasanya bulanan). TB Radius support generate invoice secara otomatis (cron) atau manual per pelanggan.
Tipe Billing Cycle¶
| Tipe | Cara Kerja | Cocok untuk |
|---|---|---|
| Postpaid Bulanan | Pelanggan pakai dulu, bayar di akhir bulan/anniversary date | ISP rumahan reguler |
| Prepaid | Bayar di awal, dapat masa aktif. Habis = isolir sampai top-up | Hotspot voucher, paket terbatas |
| Annual / Tahunan | Bayar 12 bulan sekaligus (biasanya diskon) | Pelanggan loyal / B2B |
Postpaid bulanan yang paling umum — fokus dokumentasi di mode ini.
Cara Generate Invoice¶
Cara 1: Auto (Cron Bulanan)¶
TB Radius punya cron generate-invoice yang jalan otomatis tiap awal bulan (default tanggal 1, jam 01:00 WIB).
Apa yang dilakukan cron:
- Loop semua pelanggan dengan status Active atau Overdue
- Buat invoice baru dengan:
- Nominal = harga paket pelanggan
- Periode = bulan ini (mis. "Mei 2026")
- Due date = sesuai siklus billing pelanggan
- Sync invoice ke RADIUS (untuk fitur isolir otomatis)
- Trigger reminder pertama via WhatsApp (kalau enabled)
Konfigurasi cron:
| Setting | Default | Catatan |
|---|---|---|
| Tanggal generate | 1 (awal bulan) | Bisa ubah ke tanggal lain |
| Jam generate | 01:00 WIB | Off-peak hours |
| Include trial pelanggan | OFF | Trial tidak digenerate invoice |
| Include terminated | OFF | Pelanggan terminated skip |
| Pro-rate first month | ON | Pelanggan daftar tengah bulan → invoice pro-rated |
Edit di Settings → Billing → Cron Schedule.
Cara 2: Manual (Per Pelanggan)¶
Untuk kasus khusus (pelanggan baru daftar, koreksi, dll):
- Buka pelanggan target
- Tab Invoice / Tagihan
- Klik "+ Generate Invoice"
- Isi:
- Periode (bulan yang ditagih)
- Due date
- Nominal (auto = harga paket; bisa override)
- Catatan (opsional)
- Save
Cara 3: Bulk Generate (untuk semua/sebagian pelanggan)¶
Mis. mau generate manual semua pelanggan area tertentu:
- Menu Invoice → Bulk Generate
- Filter: paket, area, status
- Set periode & due date
- Preview list yang akan di-generate
- Konfirmasi → invoice dibuat massal
Komponen Invoice¶
| Field | Penjelasan |
|---|---|
| Nomor Invoice | Auto-generate (format: INV-YYYYMM-NNNNN) |
| Pelanggan | Tied ke user/customer |
| Periode | Bulan/tahun yang ditagih (mis. "Mei 2026") |
| Tanggal Generate | Kapan invoice dibuat |
| Jatuh Tempo | Deadline pembayaran |
| Paket | Paket internet yang ditagih |
| Nominal | Total tagihan |
| PPN (opsional) | Pajak (kalau Anda PKP) |
| Diskon (opsional) | Pengurangan (mis. loyalty discount) |
| Status | Unpaid / Paid / Partial / Refunded |
| Metode Bayar | Cash / Transfer / PG (terisi setelah bayar) |
| Catatan | Note internal atau ke pelanggan |
Pro-Rate (Tagihan Proporsional)¶
Pelanggan daftar di tengah bulan → invoice pertama tidak full sebulan, tapi pro-rated.
Contoh:
- Paket: Rp 300.000/bulan (30 hari)
- Pelanggan daftar tanggal 16
- Sisa hari dalam bulan: 15 hari
- Invoice pertama:
300.000 × 15/30 = Rp 150.000
Bulan berikutnya generate full Rp 300.000.
Setting pro-rate:
- Settings → Billing → Pro-rate First Month: ON/OFF
- Mode: daily (per hari) / weekly (per minggu) / round to nearest week
Anniversary Billing vs Calendar Month¶
| Mode | Cara Kerja | Pro | Con |
|---|---|---|---|
| Calendar Month | Semua pelanggan bayar di tanggal 1 tiap bulan | Simple, mudah audit cashflow | Beban cashflow bertumpuk di awal bulan |
| Anniversary | Tiap pelanggan punya tanggal bayar sendiri (tanggal mereka daftar) | Cashflow lebih merata sepanjang bulan | Lebih rumit tracking |
Default TB Radius: Calendar Month (semua tanggal 1). Bisa ganti ke Anniversary di Settings → Billing → Cycle Mode.
Best Practices¶
Test cron di sandbox dulu
Sebelum aktifkan cron auto-generate di production, test di pelanggan dummy dulu:
- Bikin pelanggan dummy
- Run cron manual via Settings → Cron Log → Run "generate-invoice"
- Cek hasil: invoice tergenerate dengan nominal & periode benar?
- Kalau OK, baru aktifkan di production
Audit trail untuk setiap generate
Setiap invoice yang di-generate harus punya:
- Created by: cron auto / admin manual (user-id)
- Created at: timestamp
- Source: bulk / single / cron
Audit trail penting kalau ada dispute "kenapa saya digital tagihan 2x bulan ini?"
Diskon & promo
Untuk apply diskon (mis. promo "diskon 10% bulan kedua"):
- Set di paket:
discount_first_month: 10%, atau - Edit invoice manual setelah generate → apply discount
- Atau bulk discount via Invoice → Bulk Discount
Catat alasan diskon di catatan invoice (audit).
Hati-hati double generate
Cron biasanya cek "apakah invoice untuk periode ini sudah ada?". Tapi kalau Anda manual generate sebelum cron jalan, lalu cron generate juga → bisa double invoice.
Solusi: set unique constraint di DB (1 invoice per periode per pelanggan), atau verify dulu sebelum manual generate.
Hindari generate di pelanggan Terminated
Pelanggan Terminated tidak boleh generate invoice baru. Cron filter ini otomatis, tapi kalau manual generate, double-check status pelanggan.
Troubleshooting¶
Cron tidak generate invoice di tanggal seharusnya
Cek:
- Cron job aktif? Buka Settings → Cron Log — apakah cron
generate-invoicejalan tepat waktu? - Server timezone benar? TB Radius pakai WIB (Asia/Jakarta) untuk cron schedule
- Settings → Auto Generate ON?
- Cek log error kalau ada — kemungkinan ada exception di tengah loop
Invoice generated tapi nominal Rp 0
Penyebab:
- Pelanggan punya paket "Trial" (gratis) — sengaja Rp 0
- Paket pelanggan tidak ter-assign — set paket dulu
- Diskon 100% applied (rare)
Sebagian pelanggan tidak ter-generate invoice
Cek pelanggan yang miss:
- Status: harus Active atau Overdue (bukan Suspended/Terminated)
- Paket: harus ter-assign
- Tanggal mulai berlangganan: harus ≤ tanggal generate
- Bukan duplicate (invoice periode itu sudah ada)
Manual generate tapi double dengan cron
Sistem normally cek duplicate, tapi race condition bisa terjadi. Mitigasi:
- Hapus 1 invoice (yang manual atau yang cron) — keep yang valid
- Atau merge: edit nominal di 1 invoice, hapus yang lain
Bulk generate timeout
Kalau > 500 pelanggan, generate batch bisa timeout. Solusi:
- Split bulk ke filter lebih kecil (per paket atau per area)
- Atau biarkan cron auto-generate jalan saja (lebih reliable)
FAQ¶
Q: Bisa generate invoice untuk periode yang sudah lewat (backdate)? A: Bisa via manual generate. Berguna untuk koreksi (mis. lupa generate Maret, sekarang sudah April). Tapi hati-hati audit trail — kasih catatan "backdated".
Q: Bisa generate invoice >1 bulan ke depan (advance billing)? A: Bisa. Mis. pelanggan request bayar 6 bulan sekaligus → generate 6 invoice atau 1 invoice big amount. Sebaiknya generate 6 invoice terpisah untuk reporting bulanan yang clean.
Q: Invoice number bisa custom format?
A: Bisa. Settings → Invoice → Numbering Format. Default: INV-YYYYMM-NNNNN. Bisa custom: INV-{tenant_code}-{YYYY}-{seq}, dll.
Q: Apa beda Invoice dan Receipt? A:
- Invoice = tagihan (sebelum bayar)
- Receipt / Kwitansi = bukti pembayaran (setelah bayar)
TB Radius generate keduanya otomatis. Invoice saat generate, receipt saat status PAID.
Q: Bisa kirim invoice ke email pelanggan otomatis? A: Bisa. Aktifkan di Settings → Notifikasi → Email Invoice on Generate. Kalau pelanggan punya email, mereka terima PDF invoice + link bayar di email.