RBAC dan billing di CareFlow — menjaga konsistensi data rumah sakit
Alur kerja rumah sakit tidak mengenal kompromi: pendaftaran pasien, resep, dan kuitansi kasir menyentuh tiga departemen yang tidak boleh saling bertentangan. CareFlow harus terasa seperti satu sistem, bukan tiga spreadsheet yang ditempel.
Role yang memetakan struktur organisasi
Saya memakai Spatie Laravel Permission alih-alih flag is_admin manual. Role seperti admin, doctor, pharmacist, cashier, dan registrar mendapat permission yang sempit:
// seeder
$doctor->givePermissionTo(['view:patients', 'create:ehr']);
$cashier->givePermissionTo(['view:billing', 'create:payment']);
Keuntungannya adalah auditability. Setiap controller dijaga dengan $this->authorize('create:payment'), dan directive Blade menyembunyikan UI yang tidak bisa dijalankan user — tanpa 403 diam-diam.
Transaksi adalah kebenaran
Billing adalah jalur paling berisiko. Satu pembayaran harus:
- Mengurangi stok farmasi
- Membuat record billing
- Menandai bed rawat inap sebagai tersedia
Jika satu langkah gagal, semua harus rollback. DB::transaction Laravel membuatnya eksplisit:
DB::transaction(function () use ($patient, $items) {
$billing = Billing::create([...]);
foreach ($items as $item) {
StockMovement::create([...]);
Medicine::where('id', $item->id)->decrement('stock', $item->qty);
}
Bed::where('id', $patient->bed_id)->update(['status' => 'available']);
});
Tidak perlu saga terdistribusi — cukup transaksi SQL yang terisolasi dan relasi eager load agar dashboard tidak N+1: Patient::with(['visits', 'prescriptions.medicine'])->get().
Laporan tanpa membebani server
Manajemen butuh PDF yang difilter tanggal, departemen, dan status pembayaran. Merender 2.000 baris lewat DomPDF saat request adalah cara cepat menuju OOM.
Yang membantu:
- Agregasi dulu di SQL (
SUM(total) GROUP BY date) dan hanya hydrate template dengan ringkasan. - Cache template Blade yang dikompilasi untuk DomPDF pada bentuk laporan yang sama.
- Stream PDF (
Dompdf::stream()) daripada buffer penuh di memori PHP.
Hasilnya: rekap keuangan bulanan tergenerate <1 detik di VPS sederhana, dan setiap tabel sumber kebenaran tetap sinkron karena penulisan awalnya transaksional.
Konsistensi adalah fitur. CareFlow memperlakukannya demikian — dengan RBAC yang mencerminkan organisasi dan transaksi yang menolak keberhasilan parsial.