Project Detail

InixCert: Aplikasi Manajemen Sertifikat Digital Berbasis Laravel

2026 • IT Training, Consulting, Professional Certification, Digital Credentialing. • 08 Agt 2026
Pengembangan Web & Aplikasi Custom Web & Mobile Apps

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.

Ringkasan Scope

Dalam pengembangan InixCert, cakupan pekerjaan yang saya tangani meliputi:

  • menyusun arsitektur modular monolith untuk domain credential operations;
  • memodelkan branch operasional secara terpisah dari credential issuer;
  • membangun autentikasi, role, permission, policy, serta pembatasan data antar cabang;
  • mengembangkan master event, training, workshop, batch pelaksanaan, dan template sertifikat;
  • membuat sistem import CSV dengan validasi per baris, normalisasi email, deduplikasi, dan ringkasan hasil;
  • memisahkan identitas participant dari konteks keikutsertaan pada setiap kegiatan;
  • mengimplementasikan generation batch dengan pilihan cakupan peserta dan preview sebelum konfirmasi;
  • membuat satu queue job untuk setiap sertifikat;
  • mengembangkan progress tracker berbasis database dan penanganan kegagalan pada level item;
  • menyusun template PDF untuk attendance dan course completion;
  • mengembangkan registry, preview, download PDF, dan download ZIP untuk hasil batch;
  • membangun public certificate verification dengan data minimum;
  • mengimplementasikan snapshot sertifikat untuk menjaga histori;
  • menambahkan mekanisme penghapusan yang aman, rekonsiliasi counter, dan audit log;
  • menyediakan reusable email template, personalisasi terkontrol, sanitasi HTML, dan fondasi mailing berbasis queue;
  • menulis automated test untuk happy path, validation, idempotency, storage, queue, dan tenant isolation.

Challenge

Analisis

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:

  • kegiatan;
  • participant;
  • penerbit;
  • nomor sertifikat;
  • batch;
  • file hasil;
  • dan lifecycle penerbitan.

Saya kemudian memisahkan data master dengan data transaksi agar perubahan data participant di masa depan tidak mengubah histori sertifikat yang telah diterbitkan.

Strategi

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.

Implementasi

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:

  1. memuat ulang certificate record;
  2. memeriksa apakah item sudah selesai;
  3. merender Blade view menjadi PDF menggunakan Chromium;
  4. menyimpan file ke private storage;
  5. memperbarui status certificate;
  6. memperbarui progress batch secara atomik.

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

Validasi implementasi dilakukan menggunakan unit test dan feature test.

Skenario pengujian mencakup:

  • import data;
  • deduplikasi participant;
  • pemilihan peserta;
  • certificate numbering;
  • queue dispatch;
  • idempotency;
  • batch status;
  • PDF renderer;
  • private storage;
  • download;
  • public verification;
  • authorization;
  • dan penolakan akses antar branch.

Laravel Pint dan production asset build juga digunakan sebagai bagian dari pemeriksaan sebelum delivery.

Fitur / Implementasi Utama

Participant Registry dan CSV Import

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:

  • baris valid;
  • baris invalid;
  • participant baru;
  • participant existing;
  • dan data duplikat.

Certificate Generation Engine

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.

Numbering dan Immutable Snapshot

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:

  • nama penerima;
  • penerbit;
  • judul kegiatan;
  • periode;
  • dan nomor sertifikat.

Snapshot tersebut menjaga histori sertifikat agar tidak berubah ketika master data diperbarui di kemudian hari.

PDF, Private Storage, dan Download

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:

  • preview;
  • individual PDF download;
  • dan ZIP download untuk satu batch.

Public Certificate Verification

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.

Multi-Branch Authorization dan Audit

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.

Workshop CMS dan Email Foundation

Selain credential operations, InixCert memiliki fondasi Workshop CMS yang mencakup:

  • category;
  • collection;
  • metadata SEO;
  • workshop schedule;
  • batch;
  • dan public visibility rules.

Untuk kebutuhan komunikasi, sistem menyediakan reusable email template, controlled personalization tag, HTML sanitization, draft per kegiatan, subscriber list, dan fondasi pengiriman berbasis queue.

Studi Kasus

Masalah

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.

Analisis

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.

Tindakan

Saya membangun workflow penerbitan secara berurutan:

  1. membuat master kegiatan;
  2. mengimpor participant;
  3. memvalidasi data participant;
  4. menentukan template dan cakupan penerima;
  5. membuat certificate snapshot;
  6. melakukan konfirmasi batch;
  7. memproses PDF menggunakan queue;
  8. menyimpan hasil ke private storage;
  9. menampilkan progress dari database;
  10. menyediakan public certificate verification.

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.

Hasil

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.

Approach

Analisis

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:

  • kegiatan;
  • participant;
  • penerbit;
  • nomor sertifikat;
  • batch;
  • file hasil;
  • dan lifecycle penerbitan.

Saya kemudian memisahkan data master dengan data transaksi agar perubahan data participant di masa depan tidak mengubah histori sertifikat yang telah diterbitkan.

Strategi

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.

Implementasi

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:

  1. memuat ulang certificate record;
  2. memeriksa apakah item sudah selesai;
  3. merender Blade view menjadi PDF menggunakan Chromium;
  4. menyimpan file ke private storage;
  5. memperbarui status certificate;
  6. memperbarui progress batch secara atomik.

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

Validasi implementasi dilakukan menggunakan unit test dan feature test.

Skenario pengujian mencakup:

  • import data;
  • deduplikasi participant;
  • pemilihan peserta;
  • certificate numbering;
  • queue dispatch;
  • idempotency;
  • batch status;
  • PDF renderer;
  • private storage;
  • download;
  • public verification;
  • authorization;
  • dan penolakan akses antar branch.

Laravel Pint dan production asset build juga digunakan sebagai bagian dari pemeriksaan sebelum delivery.

Outcome

Business Impact

  • Mengubah rangkaian proses yang sebelumnya tersebar menjadi workflow operasional yang lebih terpusat.
  • Mengurangi kebutuhan input participant secara berulang karena data dapat digunakan kembali dalam konteks branch yang sama.
  • Membentuk registry sertifikat yang dapat dicari dan ditelusuri.
  • Menyiapkan fondasi standardisasi penerbitan sertifikat untuk operasional multi-branch.

Technical Impact

  • Memindahkan proses PDF yang berat dari synchronous web request ke background queue.
  • Menjaga konsistensi numbering dan batch counter menggunakan transaction, locking, dan unique constraint.
  • Mempertahankan histori certificate melalui recipient dan issuer snapshot.
  • Membuat storage dan PDF renderer dapat digantikan dengan fake implementation selama automated testing.
  • Membatasi data yang terekspos melalui public verification dan katalog workshop.

User Experience Impact

  • Operator mendapatkan validasi import dan ringkasan error sebelum certificate generation.
  • Batch preview membantu operator memeriksa participant, nomor, dan template sebelum processing dimulai.
  • Progress dapat dipantau dari database dan tetap tersedia setelah halaman dimuat ulang.
  • Hasil certificate dapat diakses melalui preview, individual download, atau ZIP sesuai kebutuhan operasional.

Detail Project

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:

  • data peserta sulit dilacak antar kegiatan;
  • format dan data sertifikat berpotensi tidak konsisten;
  • proses pembuatan dokumen dalam jumlah besar membebani operator;
  • histori penerbitan sulit ditelusuri secara terpusat;
  • pengelolaan beberapa cabang membutuhkan batas akses data yang jelas.

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.

https://www.inixindo.id/p/cert/verify

VISIT