Modern Tech Stack
Pengembangan Web & Aplikasi
Yang dibangun
InixCert adalah aplikasi manajemen sertifikat yang dikembangkan untuk mendukung operasional penyedia pelatihan dan konsultasi TI di Indonesia. Sebelumnya, proses penerbitan sertifikat masih bergantung pada data yang tersebar, dokumen tabular, mail merge, penyimpanan lokal, dan sejumlah pekerjaan manual.
Dalam proyek ini, saya berperan sebagai Junior Web Developer dengan tanggung jawab mulai dari analisis kebutuhan, perancangan domain, pengembangan backend dan antarmuka, hingga automated testing untuk workflow penerbitan sertifikat.
Hasil implementasinya adalah workflow terpusat yang menghubungkan proses import peserta, validasi data, penerbitan sertifikat berbasis queue, pembuatan PDF, penyimpanan privat, hingga verifikasi sertifikat secara publik.
Dalam pengembangan InixCert, cakupan pekerjaan yang saya tangani meliputi:
Tahap awal pengembangan dimulai dengan memetakan workflow penerbitan sertifikat.
Dari proses tersebut, saya menemukan bahwa masalah utama tidak hanya terletak pada pembuatan file PDF, tetapi pada hubungan antara:
Saya kemudian memisahkan data master dengan data transaksi agar perubahan data participant di masa depan tidak mengubah histori sertifikat yang telah diterbitkan.
Saya memilih pendekatan modular monolith menggunakan Laravel untuk menjaga proses delivery tetap sederhana sekaligus mempertahankan struktur domain yang jelas.
Workflow import dipisahkan dari certificate generator.
Participant harus sudah tervalidasi dan terhubung dengan kegiatan sebelum batch penerbitan dapat dibuat.
Pendekatan ini membuat proses generation lebih deterministik dan mencegah generator menjadi jalur tersembunyi untuk menghasilkan data participant baru.
State untuk batch dan certificate juga didefinisikan secara eksplisit.
Nomor otomatis dialokasikan menggunakan database transaction dan locking, sedangkan nomor eksternal divalidasi sebelum certificate record dibuat.
Snapshot informasi penerima dan issuer kemudian disimpan pada certificate sehingga histori sertifikat tetap konsisten meskipun master data berubah.
Proses CSV import dilakukan secara streaming.
Header dinormalisasi dan setiap baris divalidasi sebelum data disimpan.
Email yang tersedia digunakan sebagai salah satu dasar pencocokan participant dalam branch yang sama, sedangkan nama yang identik tanpa identifier yang cukup tidak langsung digabungkan secara otomatis.
Ketika operator mengonfirmasi batch penerbitan, sistem membuat satu queued job untuk setiap certificate.
Setiap job akan:
Antarmuka membaca progress dari database sehingga proses tetap dapat dipantau meskipun halaman browser dimuat ulang.
Untuk public verification, kode verifikasi diarahkan ke permalink khusus.
Halaman tersebut hanya menampilkan informasi registry dan snapshot yang diperlukan, sementara lokasi file PDF dan data internal tetap privat.
Validasi implementasi dilakukan menggunakan unit test dan feature test.
Skenario pengujian mencakup:
Laravel Pint dan production asset build juga digunakan sebagai bagian dari pemeriksaan sebelum delivery.
Participant disimpan sebagai identitas canonical dalam konteks branch.
Informasi terkait paket dan kegiatan ditempatkan pada data keikutsertaan sehingga satu participant dapat mengikuti beberapa program tanpa harus membuat identitas baru setiap kali.
Proses import memberikan ringkasan mengenai:
Certificate generator mengambil participant dari kegiatan yang telah tersimpan dan menerapkan scope sesuai kebutuhan penerbitan.
Operator dapat memilih seluruh peserta atau kelompok tertentu sebelum melakukan konfirmasi.
Batch dan certificate record dibuat dalam transaction, kemudian setiap certificate diproses menggunakan queue job terpisah.
Dengan pendekatan ini, kegagalan pada satu certificate dapat ditangani tanpa menggagalkan keseluruhan batch.
Internal certificate number dialokasikan menggunakan mekanisme locking.
Untuk kegiatan yang menggunakan external numbering, nomor dari sumber resmi tetap dipertahankan dan diperiksa terhadap kemungkinan duplikasi.
Certificate juga menyimpan snapshot informasi penting seperti:
Snapshot tersebut menjaga histori sertifikat agar tidak berubah ketika master data diperbarui di kemudian hari.
Print view berbasis Blade dirender menjadi PDF A4 menggunakan Chromium.
Template attendance dan course completion menggunakan artwork resmi dengan penempatan data dinamis yang terkontrol.
File hasil disimpan pada private storage.
User yang memiliki hak akses dapat menggunakan beberapa metode pengambilan hasil:
Certificate dengan status selesai dapat diverifikasi menggunakan public identifier.
Identifier tersebut diarahkan menuju permalink verifikasi yang bersifat canonical.
Halaman verifikasi hanya menampilkan data minimum yang dibutuhkan untuk memastikan validitas certificate tanpa membuka private file path atau informasi participant yang tidak diperlukan.
Query, policy, middleware, dan relational constraint digunakan untuk membatasi akses data berdasarkan branch user.
Role tertentu dapat diberikan kemampuan lintas cabang secara eksplisit ketika dibutuhkan.
Aktivitas penting seperti import, certificate generation, penghapusan, serta perubahan konfigurasi dicatat untuk membantu proses penelusuran dan audit.
Selain credential operations, InixCert memiliki fondasi Workshop CMS yang mencakup:
Untuk kebutuhan komunikasi, sistem menyediakan reusable email template, controlled personalization tag, HTML sanitization, draft per kegiatan, subscriber list, dan fondasi pengiriman berbasis queue.
Penerbitan sertifikat sebelumnya dilakukan menggunakan beberapa alat dan file terpisah.
Data peserta, nomor sertifikat, template, dan output PDF tidak berada dalam satu lifecycle yang dapat ditelusuri dengan mudah.
Ketika jumlah kegiatan dan peserta bertambah, proses manual tersebut meningkatkan pekerjaan berulang serta risiko inkonsistensi data.
Saya menyimpulkan bahwa mempercepat proses rendering PDF saja tidak akan menyelesaikan sumber permasalahan.
Sistem perlu mengontrol data sebelum proses rendering, menjaga hubungan participant dengan kegiatan, mengelola penomoran, menyimpan status setiap certificate, serta menyediakan mekanisme verifikasi tanpa mengekspos file privat.
Saya membangun workflow penerbitan secara berurutan:
Pada layer aplikasi, saya juga menerapkan database transaction, unique constraint, idempotent job behavior, branch-scoped authorization, audit logging, dan prinsip minimum disclosure pada public verification.
InixCert menghasilkan workflow penerbitan sertifikat terpusat yang menghubungkan data participant hingga file PDF dan halaman verifikasi.
Operator tidak perlu menunggu proses rendering selesai di dalam browser request.
Status setiap item dapat ditelusuri secara individual dan kegagalan satu certificate tidak menghilangkan visibilitas terhadap certificate lainnya dalam batch yang sama.
Struktur data yang digunakan juga mendukung beberapa konteks penerbitan, termasuk internal event, training dengan external numbering, workshop, dan pengembangan operasional multi-branch secara bertahap.
Tahap awal pengembangan dimulai dengan memetakan workflow penerbitan sertifikat.
Dari proses tersebut, saya menemukan bahwa masalah utama tidak hanya terletak pada pembuatan file PDF, tetapi pada hubungan antara:
Saya kemudian memisahkan data master dengan data transaksi agar perubahan data participant di masa depan tidak mengubah histori sertifikat yang telah diterbitkan.
Saya memilih pendekatan modular monolith menggunakan Laravel untuk menjaga proses delivery tetap sederhana sekaligus mempertahankan struktur domain yang jelas.
Workflow import dipisahkan dari certificate generator.
Participant harus sudah tervalidasi dan terhubung dengan kegiatan sebelum batch penerbitan dapat dibuat.
Pendekatan ini membuat proses generation lebih deterministik dan mencegah generator menjadi jalur tersembunyi untuk menghasilkan data participant baru.
State untuk batch dan certificate juga didefinisikan secara eksplisit.
Nomor otomatis dialokasikan menggunakan database transaction dan locking, sedangkan nomor eksternal divalidasi sebelum certificate record dibuat.
Snapshot informasi penerima dan issuer kemudian disimpan pada certificate sehingga histori sertifikat tetap konsisten meskipun master data berubah.
Proses CSV import dilakukan secara streaming.
Header dinormalisasi dan setiap baris divalidasi sebelum data disimpan.
Email yang tersedia digunakan sebagai salah satu dasar pencocokan participant dalam branch yang sama, sedangkan nama yang identik tanpa identifier yang cukup tidak langsung digabungkan secara otomatis.
Ketika operator mengonfirmasi batch penerbitan, sistem membuat satu queued job untuk setiap certificate.
Setiap job akan:
Antarmuka membaca progress dari database sehingga proses tetap dapat dipantau meskipun halaman browser dimuat ulang.
Untuk public verification, kode verifikasi diarahkan ke permalink khusus.
Halaman tersebut hanya menampilkan informasi registry dan snapshot yang diperlukan, sementara lokasi file PDF dan data internal tetap privat.
Validasi implementasi dilakukan menggunakan unit test dan feature test.
Skenario pengujian mencakup:
Laravel Pint dan production asset build juga digunakan sebagai bagian dari pemeriksaan sebelum delivery.
Proyek InixCert berangkat dari proses penerbitan sertifikat yang melibatkan beberapa file dan langkah operasional terpisah.
Data peserta dikelola melalui dokumen tabular, pembuatan sertifikat mengandalkan mail merge, hasil dokumen disimpan secara lokal, dan operator perlu melakukan sejumlah proses secara berulang.
Kondisi tersebut menimbulkan beberapa tantangan, seperti:
InixCert dikembangkan untuk membentuk satu workflow yang dapat menyimpan data kegiatan dan peserta, melakukan validasi sebelum penerbitan, memproses sertifikat secara asinkron, serta mempertahankan histori setiap sertifikat yang telah dibuat.
Sistem juga dirancang untuk mendukung operasional beberapa cabang tanpa mencampurkan data antar unit serta memisahkan cabang penyelenggara kegiatan dari institusi yang secara resmi menerbitkan kredensial.
Dari sisi arsitektur, aplikasi menggunakan pendekatan modular monolith. Pendekatan ini dipilih agar domain aplikasi tetap terstruktur tanpa menambahkan kompleksitas distributed system yang belum diperlukan.
Fokus implementasinya bukan sekadar menghasilkan file PDF, tetapi menjaga integritas seluruh siklus kredensial mulai dari sumber data peserta hingga proses verifikasi.