Sistem persuratan dan penerbitan surat keputusan untuk sekretariat organisasi berjenjang
Buku agenda, nomor surat yang dibangkitkan mesin, dan pembuatan surat keputusan pengurus dalam format Word dan PDF, untuk sekretariat organisasi dengan struktur bertingkat.
Konteks
Sekretariat sebuah organisasi berjenjang, dari tingkat kota sampai kelurahan, menerbitkan surat dan surat keputusan pengurus dengan nomor yang disusun tangan. Formatnya panjang: nomor urut, kode arah, kode jenis, kode struktur, bulan dalam angka Romawi, dan tahun. Nomor bertabrakan pernah terjadi, dan ruas bulan sering terisi bulan Masehi padahal aturannya memakai bulan Hijriah.
Pekerjaan dimulai dari arsip. Surat lama dibaca satu per satu, dikelompokkan, lalu aturan penomoran yang selama ini hanya ada di kepala pengurus dituliskan menjadi panduan. Panduan itulah yang menjadi acuan sistemnya, dan ikut tersaji sebagai halaman bantuan di dalam aplikasi.
Persoalannya
Nomor surat tidak boleh diketik
Setiap cara mengetik nomor secara manual membuka peluang salah yang sama seperti sebelumnya. Nomor dibangkitkan sistem di dalam transaksi basis data, dijaga kunci transaksi dan indeks unik, sehingga dua operator yang menyimpan bersamaan tidak mungkin mendapat nomor sama. Ini diuji dengan belasan permintaan serentak. Tombol pratinjau menampilkan nomor yang akan terpakai tanpa mengunci apa pun; nomor baru terkunci hanya saat suratnya benar-benar diterbitkan.
Ruas bulan diturunkan dari kalender Hijriah
Kesalahan paling sering pada surat lama adalah bulan Romawi yang diambil dari kalender Masehi. Sistem mengonversi tanggal penetapan ke Hijriah lalu menurunkan ruas bulan dari sana, dan tidak menyediakan cara mengetiknya. Hari Hijriah boleh disunting karena hisab bisa berbeda sehari dari rukyat yang dipakai organisasi, tapi bulannya tetap mengikuti hasil konversi.
Surat lama tidak dipaksa mengikuti aturan baru
Arsip sebelum sistem berisi nomor yang tidak konsisten, termasuk satu nomor yang terpakai dua kali. Memaksanya lolos validasi berarti mengubah sejarah. Surat lama disimpan apa adanya dengan penanda khusus yang membebaskannya dari aturan keunikan, dan penomoran baru dimulai bersih.
Kewenangan penerbitan ditegakkan di kode
Anggaran rumah tangga organisasi mengatur tingkat mana yang berhak menerbitkan surat keputusan untuk tingkat di bawahnya, jabatan apa yang wajib ada di lampiran, dan kapan nomor persetujuan tingkat atas wajib disertakan. Aturan itu dipindahkan ke lapisan layanan, jadi formulir yang dilewati pun tidak bisa menerbitkan surat yang menyalahi aturan.
Data pribadi pengurus disimpan terenkripsi
Nomor telepon dan nomor induk kependudukan dienkripsi di tingkat aplikasi sebelum masuk basis data, mengikuti Undang-Undang Pelindungan Data Pribadi. Salinan basis data yang bocor tidak berguna tanpa kuncinya. Batasnya juga ditulis terang untuk pemilik sistem: enkripsi tidak melindungi dari server aplikasi yang diambil alih, dan kunci yang hilang berarti data tidak bisa dibuka lagi.
Keputusan yang diambil
Berikut alternatif yang ditolak dan alasannya.
PDF dibuat dengan pustaka ringan, bukan konversi LibreOffice
Aplikasi ini menumpang server 2 GB yang sudah melayani sistem lain. Konversi lewat LibreOffice memakan ratusan megabita per proses dan bisa mematikan aplikasi tetangganya. PDFKit dipilih karena ringan dan membawa huruf Times-Roman bawaan, persis yang disyaratkan pedoman organisasi. Word, PDF, dan pratinjau di layar dirakit dari satu struktur data yang sama supaya isinya tidak pernah berbeda.
Tidak memakai CMS siap pakai
Payload memberi panel admin gratis, dan untuk sistem data anggota di server yang sama pilihan itu tepat. Instance kedua akan memakan 400 sampai 600 MB memori. Kebutuhan antarmuka di sini sederhana, jadi Drizzle dan halaman admin sendiri jauh lebih hemat, dan migrasinya berupa berkas SQL yang bisa dibaca sebelum dijalankan di produksi.
Build tidak pernah dijalankan di server
Server itu sudah bergantung pada swap untuk membangun aplikasi yang lebih dulu ada. Build dikerjakan di lokal, artefaknya dikirim lewat tar melalui ssh, lalu dependensi dipasang di server. Pemisahan dari aplikasi tetangga dibuat tiga lapis: akun sistem, akun basis data, dan berkas konfigurasi nginx yang terpisah. Daftar tindakan yang terlarang di server disepakati tertulis sebelum saya diberi akses.
Hasil
- 122 uji otomatis untuk penomoran, validasi, kewenangan, dan keluaran dokumen, ditambah 62 uji HTTP terhadap aplikasi yang sedang berjalan.
- Berjalan di produksi sejak September 2026, berdampingan dengan sistem lain di satu server tanpa mengganggunya.