
CSMS Wilmar: Tiga Tahun Kepatuhan Keselamatan Kontraktor
- Ibrahim Fiqhan
- Backend
- 3 Agustus 2026
Daftar Isi
Sebelum seorang kontraktor diizinkan bekerja di area industri, harus ada yang memastikan bahwa mereka mampu melakukannya dengan aman. Apakah juru las mereka memegang sertifikat yang masih berlaku? Apakah crane-nya berizin? Apa yang terjadi saat terakhir kali mereka berada di lokasi?
CSMS — Contractor Safety Management System — adalah tempat pertanyaan-pertanyaan itu dijawab dan dicatat. Saya membangun dan memeliharanya sejak Agustus 2023.
Bagian itulah yang akan saya tunjuk lebih dahulu. Bukan sebuah peluncuran, melainkan tiga tahun dan sekitar tiga ratus commit dari sistem yang dipakai orang untuk menjalankan pekerjaannya.
Apa yang dicakupnya
Tiga puluh delapan modul, yang kedengarannya berlebihan sampai Anda melihat apa saja sebenarnya yang tercakup dalam kepatuhan LK3:
- Prakualifikasi — kuesioner, penilaian, kategorisasi, sertifikat
- Tenaga kerja — kompetensi per orang, sertifikat beserta masa berlakunya, pengawas
- Peralatan — register per kontraktor berisi kategori, spesifikasi, lokasi penggunaan, foto barangnya yang sebenarnya, status pakai atau standby, serta izin beserta masa berlakunya secara terpisah
- Insiden — kecelakaan, penyebab, bagian tubuh yang terdampak, tingkat keparahan
- Observasi dan pelanggaran — temuan LK3 yang diajukan terhadap kontraktor
- Jam kerja aman, safety talk, inspeksi kerapian area, dan izin kerja
- Pelaporan jaminan sosial (BPJS TK), karena kepatuhan bukan hanya urusan internal
Bahasa domainnya sepenuhnya Indonesia — prakualifikasi, pekerjaan, peralatan, tenaga-kerja, pelanggaran-lk3 — dan antarmuka adminnya tersedia dalam empat bahasa: Indonesia, Inggris, serta Mandarin sederhana dan tradisional, mengikuti siapa saja pemangku kepentingannya.
Dasbornya adalah inti dari semuanya
Seluruh modul di atas ada untuk memasok empat angka yang menjadi ukuran kinerja sebuah departemen HSE:
- LTIFR — lost time injury frequency rate
- AFR — accident frequency rate
- ASR, dilaporkan baik sebagai hari kerja hilang maupun jam kerja hilang
- Total safe man-hours, yang menjadi penyebut di balik ketiga angka lainnya
Masing-masing dibatasi per tahun dan dapat dipilih secara mandiri, karena kinerja keselamatan dilaporkan tahunan dan angka tahun lalu harus tetap bisa dikutip setelah data tahun ini mulai masuk.
Di sampingnya: jumlah kompetensi personel yang dirinci per sertifikasi — Ahli K3 Umum, Ahli K3 Listrik, Ahli K3 Kebakaran, Scaffolder, Ahli K3 Konstruksi, Operator Excavator — masing-masing terbagi menjadi aktif dan kedaluwarsa, ditambah status pekerjaan, status lisensi peralatan, serta rekap kompetensi yang sama per kontraktor.
Angka kedaluwarsa itulah yang benar-benar dilihat orang. Sertifikat yang habis masa berlakunya bulan lalu adalah beda antara kontraktor yang patuh dan sebuah perintah penghentian pekerjaan.
Mesin prakualifikasi
Inilah bagian paling besar, dan yang paling layak dijelaskan.
Seorang kontraktor mengisi kuesioner yang terversi. Pertanyaan dikelompokkan ke dalam bagian, setiap jawaban membawa skor terhadap nilai maksimum, dan jawaban dapat ditandai tidak berlaku — yang mengeluarkannya dari kedua sisi perhitungan, bukan memberinya nilai nol. Perbedaan itu penting: kontraktor tidak seharusnya dirugikan karena tidak memiliki peralatan yang memang tidak akan mereka gunakan.
Skor akhirnya berupa persentase dari nilai maksimum yang berlaku. Angka itu menempatkan kontraktor pada kategori High, Medium, atau kategori tidak lulus, dengan 60 sebagai batas kelulusan.
Kelulusan menghasilkan sertifikat bernomor dalam urutan CSMS/NNN/YYYY, dibuat dengan pemeriksaan keunikan karena dua penilaian yang selesai pada saat yang sama tidak boleh bertabrakan.
Penilaian bergerak melalui draft, terkirim, dalam peninjauan, lalu selesai, dengan peran assessor dan verificator yang terpisah — orang yang menilai sebuah pengajuan bukan orang yang mengesahkannya.
Dua hal yang ingin saya ubah, dan belum saya ubah
Catatan pemeliharaan yang jujur, karena proyek tiga tahun memang mengumpulkannya.
Batas kelulusan 60 tertulis langsung di lebih dari satu tempat. Pada aksi grid, pada pemeriksaan status kelulusan, dan pada pembuat sertifikat. Seharusnya ia satu konstanta, atau konfigurasi. Kenyataannya belum, dan setiap kali angka itu muncul dalam pembicaraan saya memeriksa ketiganya.
Sebuah method bernama generateCertificatePdf mengembalikan PNG. Ia merender template SVG melalui konverter raster; sejak awal tidak pernah ada PDF di sana. Mengganti namanya berarti menyentuh titik pemanggilan pada sistem yang dipakai orang setiap hari, jadi ia dibiarkan, dan dokumentasi proyeknya kini menyebutkan hal itu secara terbuka alih-alih membiarkan orang berikutnya menemukannya sendiri.
Saya menyebut keduanya karena itulah tekstur jujur dari perangkat lunak yang berumur panjang. Versi lain dari halaman ini akan berpura-pura basis kodenya tanpa cela.
Sertifikat tanpa mesin PDF
Sertifikat adalah artefak desain yang nyata — tata letak yang dibuat seseorang dalam bentuk vektor — sehingga alih-alih membangunnya ulang dengan HTML lalu berharap hasilnya mirip, sistem ini memakai SVG-nya secara langsung. Placeholder digantikan, lalu berkasnya dirender menjadi gambar raster.
Satu detail yang layak dibagikan. Konverternya menyelesaikan font pada saat render, sehingga di server tanpa font sistem Anda tidak mendapat error, melainkan sertifikat dengan teks tak terlihat. Solusinya adalah mengirimkan berkas font bersama aplikasi lalu menyerahkannya secara eksplisit ke konverter, agar hasilnya identik di host mana pun.
Ringkasan penilaian adalah artefak terpisah, dan yang itu memang benar-benar PDF.
Multi-tenancy melalui query scope
Perusahaan kontraktor masuk dan hanya melihat data miliknya. Administrator melihat semuanya.
Itu ditegakkan dengan global query scope: ketika pengguna yang masuk berasal dari sebuah kontraktor, setiap query pada model yang tercakup dibatasi pada perusahaan tersebut. Dua scope lain mempersempit data ke bulan dan tahun aktif, keduanya digerakkan oleh pemilih di navbar dan disimpan pada session.
Pemilih tahun yang terlihat di header pada setiap tangkapan layar adalah separuh yang tampak dari mekanisme ini. Ubah nilainya, dan dasbor, grid, serta laporannya bergerak bersamaan tanpa satu pun controller yang perlu mengedarkan tanggal.
Kodenya sedikit namun kerjanya besar, dan ada satu bahaya nyata di dalamnya: scope itu bekerja tanpa suara. Query yang mengembalikan baris di tinker tidak mengembalikan apa pun melalui web, dan alasannya tidak terlihat di titik pemanggilannya. Saya pernah dikejutkan olehnya, sehingga sekarang hal itulah yang pertama dijelaskan berkas panduan proyek.
Framework admin adalah aplikasinya
Ada satu keputusan arsitektur di sini yang sampai sekarang saya anggap tepat.
Keseluruhan sistem dibangun di atas dcat-admin, dan bukan sebagai area admin yang ditempelkan pada sebuah aplikasi. Path root mengarahkan ke dalamnya, berkas route web konvensional praktis kosong, dan setiap controller berada di bawah namespace admin. Grid, form, dan tampilan detail dideklarasikan melalui builder alih-alih ditulis tangan.
Untuk sistem yang berisi 38 modul CRUD berbatas peran beserta alur kerjanya, framework admin bukan jalan pintas — ia bentuk yang benar. Menulis empat puluh resource dengan tangan hanya akan menghasilkan empat puluh halaman yang berbeda secara halus.
Mempelajari framework itu sampai cukup untuk membangun sistem ini juga, secara langsung, menjadi alasan saya kemudian menulis Steward — gagasan yang sama, dibangun ulang dengan Go dan generics, karena saya menginginkan produktivitasnya tanpa ujung-ujung yang menggantung.
Kenyataan operasionalnya
Deployment berupa SSH deploy yang dipicu push, dengan staging dan produksi dipetakan ke dua branch, menjalankan pemasangan dependensi, migrasi, dan pemanasan cache di sisi remote. Kualitas kode dijaga oleh Pint di CI. Pengujiannya PHPUnit.
Dua batasan yang akan saya sampaikan bila Anda mewarisinya. Tidak ada langkah build aset dalam proses deploy — aset frontend yang sudah dikompilasi disimpan ke repository lalu dikirim apa adanya, sehingga perubahan frontend berarti membangunnya lebih dahulu secara lokal sebelum push. Dan rangkaian pengujiannya berjalan pada basis data apa pun yang dikonfigurasi alih-alih basis data in-memory, sehingga pengujian yang menyegarkan basis data akan dengan senang hati menghapus skema sungguhan bila diarahkan ke sana.
Keduanya bukan cara saya memulai proyek hari ini. Keduanya terdokumentasi, dan itu hal terbaik berikutnya.
Apa yang diajarkan tiga tahun
Nilai terbesar sistem ini tidak terletak pada fitur mana pun, melainkan pada kenyataan bahwa aturan penilaian, nomor sertifikat, dan tanggal kedaluwarsa dari tahun 2023 masih bermakna sama hari ini.
Itu hanya bertahan bila Anda menahan diri untuk tidak menulis ulang. Setiap tahun ada dorongan untuk memodernkan stack-nya, dan setiap tahun pekerjaan yang lebih berguna ternyata berupa satu modul baru, satu kasus tepi yang diperbaiki, atau satu laporan yang memang dibutuhkan seseorang.
Hubungi saya jika alur kepatuhan Anda masih berjalan di atas spreadsheet dan sudah tidak lagi memadai.

Siap membangun proyek bersama saya?
Saya siap membantu membangun, mengembangkan, dan meluncurkan proyek Anda berikutnya — kirim pesan sekarang dan ayo kita mulai!
Mulai Sekarang





