Skip to content

Civil Service HR Core API

By Romi Fadli, S.Kom. 11 min read v2.1.0 Security & Secrets
On this page
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

Civil Service HR Core API adalah inti sistem kepegawaian untuk aparatur sipil negara: aplikasi Laravel yang memegang setiap record pegawai dan setiap aturan yang berlaku atasnya. Ia menyimpan data personal, penempatan, keluarga, dan lebih dari dua puluh jenis riwayat karier, membawa usulan perubahan dari pegawai sendiri melewati pemeriksaan, menyiapkan keputusan kenaikan gaji berkala, kenaikan pangkat, dan pensiun, menerapkan aturan gaji dan pensiun yang diambil dari peraturan pemerintah, menyimpan bagan organisasi berversi, dan memutuskan siapa boleh melihat dan mengubah apa, sampai ke satu unit.

Ia dibangun untuk organisasi yang susunan dan aturannya ditetapkan peraturan dan berubah dari waktu ke waktu. Setiap aturan yang diterapkannya bisa ditelusuri ke peraturan yang diimplementasikannya, setiap angka turunan dihitung dari sumbernya dan tidak diketik, dan setiap akses adalah pemberian yang tercatat dan dibatasi waktunya.

Sekilas

Bahasa & frameworkPHP, dengan Laravel, di atas PostgreSQL dan Redis
ArsitekturStateless Laravel Core
Versi2.1.0
StatusDalam pengembangan
BentukHTTP API dengan background worker; antarmuka user adalah aplikasi web terpisah
Kode sumberPrivat
Apa module ini dan di mana posisinya sekarang.

Yang dikerjakannya

A. Menyimpan record pegawai yang lengkap

Setiap orang punya data personal, kontak, alamat, dan gelar; setiap pegawai punya penempatan dan unit. Di sekelilingnya ada lebih dari dua puluh jenis riwayat karier — pendidikan, pangkat, jabatan, kenaikan gaji berkala, kinerja, cuti, pelatihan, penghargaan, mutasi, disiplin, dan lainnya — masing-masing dengan aturannya sendiri dan dokumen pendukung yang diwajibkan jenis itu. Kedudukan hukum seseorang berubah otomatis saat peristiwa yang ditetapkan peraturan, seperti cuti di luar tanggungan negara atau tugas belajar, dimulai dan berakhir.

B. Memperlakukan keluarga sebagai graf

Pasangan, orang tua, dan anak adalah hubungan antarorang, bukan field pada data pegawai, jadi anggota keluarga dicatat sekali dan ditautkan ke semua orang yang terkait dengannya. Status perkawinan diturunkan dari hubungan itu, dan module ini menyarankan siapa yang berhak atas tunjangan keluarga, lengkap dengan alasannya, untuk diputuskan admin.

C. Membawa usulan pegawai melewati pemeriksaan

Pegawai mengusulkan perubahan atas record-nya sendiri — ijazah baru, pernikahan, tanggal yang dikoreksi — beserta lampirannya. Pemeriksa menyetujui, mengembalikan, atau menolak setiap usulan, dan saat disetujui perubahan beserta lampirannya pindah ke record itu sendiri.

D. Menyiapkan keputusan kenaikan gaji berkala, kenaikan pangkat, dan pensiun

Module ini mendaftar siapa yang jatuh tempo kenaikan gaji berkala, kenaikan pangkat, atau pensiun, memberi tahu orang yang bertanggung jawab, dan membawa setiap kasus sampai keputusannya. Untuk kenaikan gaji berkala ia juga menyusun draf SK dalam PDF yang setiap angkanya berasal dari record dan bagian pertimbangannya mengutip peraturan yang menjadi dasarnya.

E. Menerapkan aturan yang diambil dari peraturan

Tabel gaji disimpan per peraturan beserta tanggal mulai berlakunya, sehingga gaji benar untuk tanggal mana pun, lampau maupun sekarang. Batas usia pensiun diambil dari jabatan yang dipegang, tanggal kenaikan pangkat menerapkan syaratnya berurutan, dan nilai kinerja dinilai menurut cara di zamannya sendiri.

F. Menyimpan bagan organisasi berversi

Susunan setiap perangkat daerah milik peraturan yang menetapkannya dan berlaku pada tanggalnya sendiri. Seluruh pemerintah bisa dibaca sebagaimana adanya pada hari apa pun, jabatan membentuk hirarkinya sendiri di atas unit, dan jumlah orang di setiap jabatan dihitung dari data pengangkatan.

G. Memberi lingkup pada setiap akses

Akses diberikan sebagai peran pada satu lingkup — seluruh sistem, kantor kepegawaian pusat, satu perangkat daerah, atau satu unit beserta unit di bawahnya. Pemberian akses diajukan dan disetujui oleh orang yang berbeda, kedaluwarsa dengan sendirinya, dan mengikuti pemegangnya saat ia pindah.

H. Melapor, mengingatkan, dan mengundang

Laporan mencakup daftar pegawai, daftar urut kepangkatan, rekapitulasi menurut dimensi apa pun, bezetting per perangkat daerah, pemberhentian, pelatihan, dan penghargaan, semuanya disaring menurut lingkup pembacanya. Pengingat jatuh tempo dikirim lewat email, dan undangan untuk membuat akun dikirim dalam gelombang harian.

I. Memasukkan data dari sistem lama

Record dari sistem yang digantikannya diimpor bertahap, dari sumber yang hanya dibaca, bisa diulang, dengan laporan setiap masalah yang ditemukan dan tanpa data pribadi di laporan itu.

J. Menandatangani dokumen di platform tanda tangan

Dokumen yang perlu ditandatangani diproses di platform tanda tangan eksternal, dengan module ini sebagai client-nya. User menautkan akunnya sekali lewat persetujuan; setiap tahap penandatangan didaftarkan ke platform, penandatangan menandatangani di sana dengan sertifikatnya sendiri, dan hasilnya dikabarkan balik sehingga PDF bertanda tangan disalin ke storage module ini. Bila kabar terlewat, statusnya bisa ditarik ulang.

K. Melindungi akun dan identitas

Orang login dengan token milik module ini sendiri atau lewat single sign-on eksternal, dengan autentikasi dua faktor. Identitas seseorang diverifikasi pada dua tingkat: tingkat dokumen, diperiksa petugas dari pindaian dokumen untuk orang tanpa akun seperti anggota keluarga, dan tingkat aktual, yang hanya dicapai pemilik akun lewat KTP dan tantangan wajah langsung. Data pribadi dienkripsi di database, dan foto identitas yang diperlihatkan kepada pemeriksa diberi watermark berisi nama yang melihatnya.

Antarmuka

AreaYang disediakannya
Autentikasilogin, refresh token yang berotasi, dua faktor, sign-on eksternal, public key token-nya
Orang dan identitasdata personal, tingkat identitas, verifikasi identitas dan antrean pemeriksaannya
Pegawai dan keluargarecord pegawai, penempatan, hubungan keluarga, saran tunjangan
Riwayat kariersetiap jenis record riwayat beserta dokumennya
Usulanusulan perubahan dari pegawai dan pemeriksaannya
Layanankasus kenaikan gaji berkala, kenaikan pangkat, dan pensiun, keputusan, dan draf SK
Organisasiperaturan, perangkat daerah, susunan berversi, peta jabatan, log perubahannya
Aksespengajuan peran, persetujuan, pencabutan, katalog peran
Laporandaftar, rekapitulasi, bezetting, dashboard
Data referensikatalog semua tabel referensi, tempat antarmuka membangun form-nya
File dan tanda tanganunggah lewat tautan berumur pendek, tahap penandatangan dan statusnya
Kesiapansatu pemeriksaan untuk database, cache, storage, dan setiap service yang dibutuhkan inti
Area-area API, masing-masing di file route-nya sendiri.

Standar

StandarYang dijaminnya di sini
JSON Web Token dengan RS256, dan JWKS yang dipublikasikansatu format token untuk setiap login, bisa diverifikasi service mana pun tanpa memanggil inti
OAuth 2.0 dan OpenID Connect, dengan PKCElogin lewat identity provider eksternal, ditukar dengan token milik inti
TOTP (RFC 6238)autentikasi dua faktor dengan aplikasi authenticator apa pun
Presigned URL, AWS Signature Version 4file berpindah antara browser dan storage tanpa melewati inti
W3C Trace Context dan OpenTelemetrysatu jejak dari request user sampai setiap background job dan panggilan service
UUIDv7ID publik yang terurut waktu dan tak membuka urutan internal
ISO 8583 dan ISO 4217setiap nominal disimpan sebagai integer dalam satuan terkecil mata uangnya
Surat edaran nasional tentang pengelolaan akses kepegawaianakses diajukan dan disetujui, verifikator bukan penyetuju, pemberian akses paling lama dua tahun
Peraturan kepegawaian tentang gaji, pangkat, pensiun, dan tunjangansetiap aturan yang diterapkan adalah yang berlaku pada tanggal yang dimaksud, dan mengutip dasar hukumnya
Standar yang diikuti inti, dan apa yang dijamin masing-masing.

Di dalamnya

Inti ini mengikuti Stateless Laravel Core: node tak menyimpan apa pun, pekerjaan lambat berjalan sebagai job antrean, file tak pernah menyentuh server, setiap login berakhir pada token milik inti, dan setiap request, job, dan panggilan keluar ditelusuri. Setiap service eksternal dijangkau lewat satu class tersendiri, dengan konfigurasi, timeout, dan keluarga error-nya sendiri, dan setiap domain bisnis — orang, keluarga, riwayat, usulan, layanan, organisasi, akses — punya service-nya sendiri yang dilewati baik route admin maupun usulan pegawai.

Keputusan rancangan

Usulan melewati aturan yang sama dengan suntingan admin. Perubahan yang diusulkan pegawai divalidasi oleh service domain yang sama dengan yang dipakai admin, jadi tak ada pintu samping yang lebih longgar ke dalam record. Usulan disimpan terenkripsi bersama snapshot record yang menjadi dasarnya, dan persetujuan ditolak bila record itu sudah berubah sejak diajukan — pemeriksa tak mungkin menyetujui usulan yang diam-diam menimpa koreksi orang lain yang datang belakangan. Pemeriksa tak boleh memutus usulan tentang dirinya sendiri atau keluarga intinya.

Aturan berasal dari peraturan, sebagai data bertanggal dan kode yang mengutip. Yang diubah peraturan — tabel gaji, cara penilaian — disimpan sebagai data dengan tanggal mulai berlakunya, sehingga peraturan baru ditambahkan, tidak ditulis menimpa yang lama, dan tanggal lampau tetap memakai aturannya sendiri. Yang tetap — menghitung masa kerja, membulatkan tanggal ke periode kenaikan pangkat berikutnya — adalah kode yang menyebut peraturan yang diimplementasikannya.

Hirarki tetap relasional, dan berversi. Bagan organisasi adalah data master bagi pegawai, jabatan, dan akses, jadi ia tinggal di database relasional yang sama, dengan foreign key yang melindungi setiap record yang menunjuk ke dalamnya. Setiap susunan adalah versi dengan tanggalnya sendiri, dan unit ditautkan ke pendahulunya, bukan dicocokkan lewat nama.

Lingkup adalah data, dan kode bertanya tentang izin. Pemberian akses adalah satu baris berisi user, peran, dan lingkup. Satu fungsi memutuskan apakah grant menjangkau sepotong data, daftar disaring dengan gabungan lingkup user, dan kode tak pernah memeriksa nama peran, jadi jenis pemeriksa baru cukup satu entri katalog.

Uang adalah integer. Setiap nominal disimpan, dihitung, dan dikirim sebagai bilangan bulat seperseratus rupiah, dinamai dengan sufiks yang menyatakan skalanya, sehingga tak ada lapisan yang bisa menghilangkan atau menambahkan pecahan rupiah.

Turunkan, jangan simpan. Jumlah orang di satu jabatan, unit kerja pegawai saat ini, lingkup tempat satu record berada, dan status perkawinan seseorang semuanya dihitung dari sumbernya. Angka turunan tak mungkin melenceng dari asalnya, dan bisa ditanyakan untuk tanggal berapa pun.

Sistem menyarankan; manusia memutuskan. Bila aturannya bergantung pada fakta yang tak sepenuhnya bisa dipercaya sistem — siapa yang masih berhak atas tunjangan keluarga, nilai ambigu masuk zaman yang mana — module ini menjawab ya, tidak, atau perlu ditinjau, beserta alasannya, dan admin yang mengambil keputusan.

Identitas punya dua tingkat. Anggota keluarga yang tak akan pernah punya akun tetap bisa dicatat dengan identitas yang diperiksa pada tingkat dokumen, sedangkan tingkat aktual disediakan bagi pemilik akun yang lolos pemeriksaan KTP dan wajah. Tak satu tingkat pun berpura-pura menjadi tingkat lainnya.

Data lama masuk bertahap. Database sistem lama dibaca tanpa pernah ditulisi, setiap tahap aman dijalankan ulang, dan setiap masalah yang ditemukan dilaporkan tanpa data pribadi, sehingga perpindahan ke module ini adalah rangkaian langkah yang diperiksa, bukan satu kali peralihan yang berisiko.

Terkait

Service storage tempat setiap dokumen dan lampiran berpindah.

Service alamat yang menyediakan wilayah untuk alamat setiap orang.

Tantangan wajah yang membuktikan pemilik akun benar-benar hadir saat verifikasi identitas.

Renderer yang memberi setiap dokumen unggahan pratinjau halaman pertamanya.

Platform tanda tangan tempat dokumen ditandatangani, dengan module ini sebagai salah satu client eksternalnya.

Tempat jejak satu request melewati semua service ini berakhir.

Bagaimana record sistem lama dimasukkan, tahap demi tahap.

Bagaimana aturan gaji, kenaikan pangkat, dan pensiun tetap sejalan dengan peraturan.

Kenapa setiap nominal adalah integer dalam satuan terkecil mata uangnya.

Bagaimana bagan organisasi berversi disimpan dan dibaca.

Bagaimana setiap admin mendapat akses tepat ke bagian organisasinya sendiri.

Istilah

Riwayat karier
Record bertanggal tentang perjalanan kerja pegawai — pangkat, jabatan, kenaikan gaji berkala, pendidikan, cuti, dan sejenisnya — masing-masing dengan dokumen pendukungnya.
Usulan
Perubahan yang diminta pegawai atas record-nya sendiri, baru diterapkan sesudah pemeriksa menyetujuinya.
Lingkup
Bagian organisasi tempat pemberian akses berlaku: semuanya, satu perangkat daerah, atau satu unit beserta unit di bawahnya.
SK
Surat keputusan, dokumen resmi yang mencatat keputusan tentang seorang pegawai, misalnya kenaikan gaji berkala.
Perangkat daerah
Dinas atau badan pemerintah yang susunannya ditetapkan peraturannya sendiri.

Technologies covered

  • PHP
  • Laravel
  • PostgreSQL
  • Redis
  • FrankenPHP
  • OpenTelemetry
  • ISO 8583
  • JWT
  • OAuth 2.0
  • OpenID Connect

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 →
One definition in the middle feeds both a phone layout with stacked cards and a bottom bar, and a desktop layout with a top menu and a table

Aplikasi browser Vue dari sistem kepegawaian aparatur sipil negara: portal swalayan tempat pegawai mengurus record dan mengusulkan perubahan, serta administrasi bagan organisasi berversi, data referensi, dan akun — dibangun dari beberapa definisi bersama, bukan satu halaman per record.

9 min read Read more →

Related Articles

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 →
One definition in the middle feeds both a phone layout with stacked cards and a bottom bar, and a desktop layout with a top menu and a table

Aplikasi browser Vue dari sistem kepegawaian aparatur sipil negara: portal swalayan tempat pegawai mengurus record dan mengusulkan perubahan, serta administrasi bagan organisasi berversi, data referensi, dan akun — dibangun dari beberapa definisi bersama, bukan satu halaman per record.

9 min read Read more →