Skip to content
Blog Programming

Bagaimana Saya Menjaga Aturan Gaji, Kenaikan Pangkat, dan Pensiun Tetap Sejalan dengan Peraturan yang Berubah

By Romi Fadli, S.Kom. 14 min read Software Design
On this page
Three salary tables on a timeline from 2015, 2019 and 2024; a date marker between 2019 and 2024 selects the 2019 table, marked with a green check

Pendahuluan

A. Sistem yang bertindak menurut hukum

Sistem kepegawaian untuk ASN bukan cuma menyimpan record. Ia memberi tahu pegawai kapan kenaikan gaji berkalanya jatuh tempo, kapan ia memenuhi syarat naik pangkat, pada tanggal berapa ia pensiun, berapa gaji pokoknya, dan anggota keluarga mana yang berhak atas tunjangan. Semua jawaban itu ditetapkan peraturan — peraturan pemerintah, peraturan presiden, undang-undang, dan aturan badan kepegawaian nasional — bukan oleh organisasi yang menjalankan sistemnya.

Saya sedang membangun sistem seperti itu untuk satu pemerintah kota, sebagai pengganti sistem lama buatan tim lain. Sistem lama juga punya jawaban, tapi banyak di antaranya ditulis ke dalam code-nya bertahun-tahun lalu dan diam-diam menjadi usang ketika peraturan baru menggantikan yang lama. Perhitungan yang benar saat ditulis menjadi keliru pada hari peraturan baru berlaku, dan tak ada apa pun di code-nya yang mengumumkan kejadian itu.

Tantangannya: menjaga aturan gaji, kenaikan pangkat, dan pensiun tetap sejalan dengan peraturan yang menetapkannya — benar untuk tanggal yang dihitung, dan tetap benar sesudah peraturan berikutnya terbit.

Kedua paruh kalimat itu sama pentingnya. "Benar untuk tanggalnya" berarti gaji yang diterima pegawai pada 2018 dihitung menurut peraturan yang berlaku pada 2018, bukan menurut tabel hari ini, sebab riwayat, SK, dan koreksi semuanya merujuk ke masa lalu. "Tetap benar sesudah peraturan berikutnya" berarti tabel gaji baru atau aturan tunjangan baru semestinya cukup saya tambahkan, bukan memaksa saya menulis ulang dan menguji ulang code yang memakainya.

B. Tempat aturannya sebenarnya tinggal

Sumber kebenaran aturan-aturan ini bukan dokumen spesifikasi, melainkan himpunan peraturan yang diterbitkan negara, sering kali mengubah peraturan sebelumnya. Gaji pokok PNS berasal dari peraturan yang pertama terbit pada 1977 dan sudah berkali-kali diubah, dan setiap perubahan mengganti tabel gaji di lampirannya. Pegawai pemerintah dengan perjanjian kerja digaji menurut peraturan presiden yang lain, dengan perubahannya sendiri. Tunjangan pasangan dan anak berasal dari pasangan peraturan yang lain lagi. Batas usia pensiun, syarat kenaikan pangkat, dan penilaian kinerja masing-masing punya peraturannya sendiri.

Jadi sebelum menulis satu aturan pun, saya harus membaca peraturannya sendiri — pasal yang menetapkan syarat dan lampiran yang memuat tabel — bukan menyimpulkan aturan dari apa yang kebetulan dikerjakan sistem lama. Membaca code lama menunjukkan apa yang pernah diimplementasikan; hanya peraturan yang menunjukkan apa yang diwajibkan, dan ketika keduanya berselisih, peraturanlah yang menang.

C. Pendekatan yang saya tolak

Pendekatan paling sederhana adalah menulis tiap aturan sebagai code lengkap dengan angka di dalamnya: tabel gaji sebagai array, "dua tahun" untuk kenaikan gaji berkala, "empat tahun" untuk kenaikan pangkat. Saya menolaknya karena setiap peraturan baru berarti menyunting code, dan nilai lama lenyap begitu diganti, membawa serta setiap perhitungan historis.

Pendekatan sebaliknya adalah mesin aturan umum yang setiap syaratnya berupa konfigurasi. Itu juga saya tolak. Aritmetika aturan-aturan ini — menghitung bulan masa kerja, membulatkan tanggal ke periode kenaikan pangkat berikutnya, membandingkan gaji dua pasangan — lebih jelas dan lebih aman sebagai code yang teruji ketimbang konfigurasi yang tak bisa dibaca di satu tempat. Pendekatan yang saya pilih ada di antara keduanya: yang berubah ketika peraturan berubah adalah data bertanggal berlaku, dan yang tetap adalah code yang mengutip peraturan yang diimplementasikannya.

D. Dua belas hambatan yang menghalangi

Gampang dirumuskan, canggung dibangun. Dua belas rintangan berdiri di antara peraturan di atas kertas dan sistem yang menerapkannya dengan benar.

Hambatan pertama: aturan di sistem lama sudah usang, dan sumber sebenarnya adalah peraturannya sendiri. Menyalin perilaku sistem lama adalah alternatif yang ditolak, sebab ia akan setia menirukan aturan yang sudah diganti.

Hambatan kedua: tabel gaji berganti tiap peraturan, dan masing-masing berlaku sejak tanggal tertentu. Menimpa tabel lama dengan yang baru adalah alternatif yang ditolak; itu membuat setiap perhitungan lampau keliru.

Hambatan ketiga: lampiran peraturan harus ditranskripsi, dan satu sel yang salah ketik tak terlihat. Tabel gaji punya ratusan sel, dan memercayai transkripsi yang hati-hati adalah alternatif yang ditolak.

Hambatan keempat: PNS dan PPPK diatur peraturan yang berbeda. Memperlakukan keduanya sebagai satu skema gaji dengan beberapa pengecualian adalah alternatif yang ditolak.

Hambatan kelima: perhitungan ini dijalankan untuk semua pegawai sekaligus. Daftar jatuh tempo mengajukan pertanyaan yang sama kepada puluhan ribu pegawai, dan mencari tabel sekali per pegawai adalah alternatif yang ditolak.

Hambatan keenam: kenaikan gaji berkala berikutnya bukan sekadar "dua tahun lagi". Selang waktu yang tetap adalah alternatif yang ditolak; jenjangnya bergantung pada tabel gajinya sendiri.

Hambatan ketujuh: kelayakan naik pangkat punya syarat tanggal yang berlapis. Satu aturan "empat tahun sesudah kenaikan terakhir" adalah alternatif yang ditolak, karena hukuman, golongan tertinggi, dan pensiun semuanya mengubah jawabannya.

Hambatan kedelapan: batas usia pensiun bergantung pada jabatan. Satu batas usia untuk semua orang adalah alternatif yang ditolak.

Hambatan kesembilan: kelayakan tunjangan bergantung pada fakta keluarga yang tak sepenuhnya bisa dipercaya sistem. Membiarkan sistem memberi atau mencabut tunjangan sendiri adalah alternatif yang ditolak.

Hambatan kesepuluh: cara menilai kinerja sudah beberapa kali berganti. Menafsirkan setiap nilai lama dengan metode hari ini adalah alternatif yang ditolak.

Hambatan kesebelas: kedudukan hukum pegawai berubah otomatis karena peristiwa yang ditetapkan peraturan. Meminta admin menyetel dan memulihkannya dengan tangan untuk setiap cuti atau penugasan adalah alternatif yang ditolak.

Hambatan kedua belas: SK resmi wajib mengutip dasar hukumnya dan memuat angka yang cocok dengan record. Mengetik angka-angka itu ke template dokumen adalah alternatif yang ditolak.

Urutannya berjalan dari sumber ke luar. Yang pertama soal asal aturannya. Yang kedua sampai kelima soal tabel gaji, tempat hampir semua yang lain bergantung. Di dalam kelompok itu pun urutannya berarti: tabel harus bertanggal dan benar lebih dulu sebelum bisa dicek silang dengan tabel pendahulunya, dipisah menurut jenis kepegawaian, atau dimuat sekali untuk seluruh pegawai. Yang keenam sampai kesebelas adalah aturan yang memakai tabel itu dan riwayat pegawai, dan yang terakhir soal dokumen tempat aturan-aturan itu akhirnya sampai ke orang.

Metode

A. Membaca peraturannya, lalu mengutipnya di samping aturan

Inilah jawaban atas hambatan pertama: saya membaca peraturannya secara langsung — pasal untuk syarat, lampiran untuk tabel — dan setiap aturan di sistem mengutip peraturan yang diimplementasikannya, entah di tabel referensi yang memuatnya, entah di komentar di atas code yang menerapkannya. Ketika satu aturan dipertanyakan, jawabannya nomor peraturan, bukan ingatan tentang perilaku sistem lama.

php
/**
 * Retirement age: from the position, then the national position catalogue,
 * otherwise 58 years (Government Regulation 11/2017).
 * Retirement takes effect on the first day of the following month.
 */

B. Tabel gaji sebagai data bertanggal berlaku

Untuk hambatan kedua, setiap peraturan gaji adalah satu baris berisi jenis kepegawaian yang diaturnya, nomornya, dan tanggal mulai berlakunya, dan setiap peraturan punya tabel gajinya sendiri menurut golongan dan masa kerja. Untuk mencari gaji pada tanggal tertentu, sistem mengambil peraturan terbaru yang berlaku pada tanggal itu, lalu baris dengan masa kerja terbesar yang tak melebihi masa kerja pegawai.

php
$regulation = $regulations[$employmentType]
    ->first(fn ($r) => $r->effective_from <= $date);    // terbaru yang berlaku pada tanggal itu

$salary = $scale[$regulation->id][$rankId]
    ->last(fn ($row) => $row->years_of_service <= $years);

Gaji pada 2018 karenanya dicari menurut tabel 2015 dan gaji pada 2024 menurut tabel 2024, tanpa kasus khusus, dan menambah peraturan berikutnya berarti menambah satu baris dan satu tabel.

Setiap nominal di tabel ini disimpan sebagai integer dalam satuan terkecil mata uang, konvensi uang yang saya jaga di semua sistem saya:

C. Memeriksa tiap tabel terhadap tabel yang digantikannya

Hambatan ketiga dijawab dengan membiarkan peraturan saling memeriksa. Setiap perubahan menaikkan semua gaji dengan persentase tetap — lima persen pada yang satu, delapan persen pada yang berikutnya — jadi setiap sel tabel baru wajib sama dengan sel padanannya di tabel lama ditambah persentase itu, dalam batas pembulatan yang dipakai peraturannya. Gaji juga wajib naik secara monoton menurut masa kerja dan golongan. Salah transkripsi mematahkan salah satu hubungan itu, dan pemeriksaannya gagal sebelum datanya sempat dipakai.

php
foreach ($newTable as $cell) {
    $expected = $oldTable->at($cell->rank, $cell->years) * (1 + $raise);
    assert(abs($cell->amount - $expected) <= $roundingTolerance);
}

D. Dua jenis kepegawaian, dua jalur peraturan

Untuk hambatan keempat, jenis kepegawaian menjadi kolom pada peraturan dan pada golongan. PNS dan PPPK masing-masing punya golongan dan rantai peraturannya sendiri, sehingga pencarian tak pernah mencampurnya dan peraturan baru untuk yang satu tak pernah memengaruhi yang lain.

E. Memuat tabel sekali saja

Untuk hambatan kelima, tabel peraturan, golongan, dan gaji itu kecil dan jarang berubah, jadi setiap proses memuatnya sekali lalu menjawab setiap pencarian dari memori. Tanpa itu, daftar jatuh tempo untuk semua pegawai akan menjalankan beberapa query per pegawai — puluhan ribu query untuk satu halaman. Setiap perubahan pada tabel referensi itu mengosongkan salinan yang termuat, sehingga memori tak pernah menyajikan tabel yang usang.

F. Kenaikan gaji berkala berikutnya diambil dari tabel

Hambatan keenam dijawab dengan bertanya kepada tabel gaji, bukan kepada konstanta. Kenaikan berkala berikutnya jatuh pada tanggal 1 bulan ketika masa kerja golongan pegawai mencapai jenjang berikutnya yang memang tercantum di tabel golongannya. Bila satu peraturan mengubah letak jenjang itu, tanggal jatuh temponya ikut berubah tanpa mengubah code, dan nominal kenaikannya dibaca dari tabel, bukan diketik.

G. Kenaikan pangkat dengan syarat yang berurutan

Untuk hambatan ketujuh, tanggal jatuh tempo kenaikan pangkat menerapkan syaratnya berurutan: TMT golongan saat ini ditambah empat tahun, atau lima bila sejak itu pernah dijatuhi hukuman disiplin; dibulatkan maju ke periode kenaikan pangkat berikutnya yang berlaku; tak ada jatuh tempo pada golongan tertinggi; dan tak ada pada atau sesudah tanggal pensiun pegawai. Setiap pegawai yang jatuh tempo diberi tahu lewat email.

php
$eligible = $rank->effective_from->copy()->addYears($penalised ? 5 : 4);
$due = $this->nextPromotionPeriod($eligible);          // dibulatkan ke periode yang berlaku
return $rank->isHighest() || $due >= $retirementDate ? null : $due;

H. Batas usia pensiun dari jabatan

Hambatan kedelapan dijawab dengan menurunkan batas usia pensiun dari jabatan yang dipegang pegawai: pertama usia yang ditetapkan untuk posisi itu di peta jabatan kota, lalu usia di katalog jabatan nasional, dan selain itu bawaan 58 tahun. Pensiun berlaku pada tanggal 1 bulan sesudah pegawai mencapai usia itu. Hasilnya disimpan sebagai tanggal turunan dan dihitung ulang setiap kali tanggal lahir atau jabatan berubah, serta sekali sehari untuk jabatan yang bertanggal ke depan.

I. Sistem menyarankan, admin memutuskan

Untuk hambatan kesembilan, aturan tunjangan keluarga diimplementasikan sebagai penasihat, bukan pemutus. Satu pasangan yang masih hidup dari perkawinan yang masih berlangsung berhak; bila suami-istri sama-sama PNS, hanya yang gaji pokoknya lebih tinggi yang menerima. Paling banyak dua anak berhak, atau tiga bila anak ketiga lahir sebelum 1 Maret 1994, dan anak harus berusia di bawah 21, atau sampai 25 selama masih bersekolah. Untuk tiap anggota keluarga, penasihat itu menjawab ya, tidak, atau "perlu tinjauan", beserta alasannya.

php
return match (true) {
    $child->age() < 21                         => [true,  'under 21'],
    $child->age() <= 25 && $child->studying()  => [null,  'still in education: needs review'],
    default                                     => [false, 'over the age limit'],
};

Keputusannya tetap di tangan admin, sebab fakta yang menjadi pijakan aturannya — apakah anak masih sekolah, apakah pasangan bekerja di instansi lain — sering kali sudah basi. Saran beserta alasannya mempercepat kerja admin tanpa membiarkan data basi menentukan gaji seseorang.

J. Setiap nilai dinilai menurut eranya

Hambatan kesepuluh dijawab dengan tabel era penilaian: sistem penilaian lama sampai 2013, sistem sasaran kinerja 2014 sampai 2021, tahun transisi menurut peraturan 2019, dan matriks rating yang berlaku sejak 2022. Setiap era mencatat tahun yang dicakupnya dan cara menilainya, sehingga satu nilai ditafsirkan menurut metode yang menghasilkannya. Ketika rentang di dalam satu peraturan saling tumpang tindih, sistem tidak memilih predikat secara otomatis; penilaian itu tetap pada manusia.

K. Kedudukan hukum yang mengikuti peristiwa

Untuk hambatan kesebelas, peristiwa yang menurut peraturan mengubah kedudukan hukum pegawai — cuti di luar tanggungan negara, tugas belajar, pemberhentian, mutasi keluar — menetapkan kedudukan itu selama periode yang dicakupnya lalu memulihkannya sesudahnya. Jenis cuti mana yang berdampak demikian adalah penanda pada jenis cuti di tabel referensinya, bukan syarat di dalam code. Kedudukan yang ditetapkan admin dengan tangan tak pernah ditimpa perubahan otomatis ini.

L. SK yang angkanya diambil dari record

Hambatan kedua belas dijawab dengan membangkitkan draf SK dari record, bukan mengetiknya. SK kenaikan gaji berkala mengutip peraturan yang menjadi dasarnya dan mengambil setiap angka — golongan, masa kerja, gaji lama dan baru, tanggal berlaku — dari data yang dihasilkan aturan-aturan di atas. SK yang hanya boleh diterbitkan badan nasional, seperti kenaikan pangkat dan pensiun, diunggah sebagaimana diterima, bukan dibangkitkan.

Hasil dan Pembahasan

A. Yang berubah ketika peraturan berikutnya datang

Ketika peraturan gaji baru terbit, pekerjaannya kini adalah mentranskripsi lampirannya ke tabel baru, menambah satu baris dengan tanggal berlakunya, dan menjalankan pemeriksaan silang terhadap tabel yang digantikannya. Tak ada perhitungan yang perlu ditulis ulang: gaji masa lalu tetap memakai tabel pada zamannya, dan tanggal jatuh tempo serta kenaikan berkala ke depan mengikuti tabel baru secara otomatis.

B. Kenapa kutipannya sama pentingnya dengan code

Setiap aturan di sistem kini bisa ditelusuri ke satu peraturan. Itu ternyata sama bergunanya dengan perhitungannya sendiri: ketika satu hasil dipertanyakan, pembicaraannya tentang isi peraturan, bukan tentang kerja program, dan orang yang bertanggung jawab atas kepegawaian bisa memeriksa sumbernya sendiri.

C. Di mana pendekatan ini cocok

Memisahkan data yang berubah karena peraturan dari aritmetika yang mengimplementasikannya cocok untuk ranah apa pun yang diatur aturan terbitan yang diubah dari waktu ke waktu: penggajian, perpajakan, bantuan sosial. Ia tidak menghapus keharusan membaca peraturannya; ia menjadikan membaca peraturan sebagai pekerjaan utama, dan menyimpan hasil bacaan itu di satu tempat yang bisa diperiksa.

Simpulan

Aturan yang berasal dari peraturan bukan milik code yang menerapkannya, dan aturan itu tidak diam. Menjaganya tetap benar bermuara pada satu pemisahan: apa yang diubah peraturan — tabel gaji, era penilaian, dampak satu jenis cuti — adalah data bertanggal berlaku, dan yang tetap adalah aritmetika, ditulis sebagai code yang menyebut peraturan yang diimplementasikannya.

Kebiasaan yang akan saya bawa ke sistem teratur mana pun: membaca peraturannya sendiri, bukan sistem yang ada sebelumnya. Code lama menunjukkan apa yang pernah diputuskan seseorang; peraturan menunjukkan apa yang diwajibkan sekarang, dan sistem yang mengutipnya bisa diperiksa oleh orang-orang yang dilayaninya.

Istilah

Kenaikan gaji berkala
Kenaikan gaji dalam golongan yang sama, yang jatuh tempo ketika masa kerja pegawai mencapai jenjang berikutnya di tabel gaji.
Tanggal berlaku
Tanggal mulai berlakunya satu peraturan; tanggal sebelumnya tetap diatur peraturan yang digantikannya.
Batas usia pensiun
Usia saat pegawai wajib pensiun, yang bagi ASN bergantung pada jabatan yang dipegangnya.

Technologies covered

  • PHP

About the author

Photo of Romi Fadli

Romi Fadli, S.Kom.

Solution Architect · Backend Engineer · Embedded Systems

In my day job I work as a solution architect. I design the system, lead the team that builds it — quality assurance, backend developers, a UI developer, DevOps and DevSecOps — and write the most critical modules myself, such as a certificate authority, a long-term PDF signer, and the core API of a personnel system.

I work across the whole stack that a running system actually needs. On the hardware side that means PCB design, microcontrollers, and embedded firmware — including RISC-V boards running FreeRTOS and Embassy, speaking MQTT over mutually authenticated TLS on a microcontroller with 64 KB of SRAM.

Most of my day-to-day work is software: Rust backends and API modules built on Clean Architecture, an OAuth2/OpenID Connect authorization server written from scratch, PAdES document signing, and certificate authorities — root CAs, timestamping authorities, and OCSP responders. I also build the frontends that sit on top of them.

Running all of that means infrastructure: Docker Compose stacks, networking, Mikrotik and RADIUS, observability with OpenTelemetry, and a steady habit of writing command-line tools and utilities for Linux when the existing ones do not fit.

Share

Enjoyed this?

Get an email when a new article is published.

Referenced by

Employees and administrators use the Web App, which talks to the Core API; the Core API uses storage, regions, face and preview services, sends documents to the Aurograf signing platform, sends logs and traces to the log stack, and imports from the old system

SIMPEG

Programming

Sistem informasi kepegawaian Pemerintah Kota Tangerang Selatan: pegawai mengurus record-nya sendiri dan mengikuti layanannya, admin bekerja tepat pada bagian organisasinya, dan setiap aturan berasal dari peraturan yang menetapkannya. Saya pimpin dan bangun sejak 2023.

10 min read Read more →
The core API at the centre, fed by storage, address, face and preview services, with documents sent across a boundary to an external signing platform

Inti Laravel sistem kepegawaian aparatur sipil negara: record pegawai dan riwayat karier, usulan swalayan yang diperiksa, keputusan kenaikan gaji berkala, kenaikan pangkat, dan pensiun, aturan dari peraturan, bagan organisasi berversi, dan akses berlingkup sampai satu unit.

11 min read Read more →

Related Articles

One integer amount, 278570000, passes unchanged from database to service to JSON; only the browser divides by 100 to show Rp2.785.700,00

Uang melintasi setiap lapisan sistem saya: database, service, JSON, browser, dan dokumen cetak. Saya menjaga satu konvensi di semua tempat — nominal adalah integer dalam satuan terkecil mata uang seperti yang dibawa ISO 8583, bersufiks, dibulatkan di satu tempat, dan dikonversi hanya di tepi.

19 min read Read more →