Sistem manajemen PKL/Magang lengkap yang dibangun untuk PT Global Intermedia Nusantara, menangani seluruh siklus hidup peserta mulai dari registrasi dengan verifikasi OTP hingga penilaian akhir dan pembuatan sertifikat digital.

Proyek ini dibuat untuk menyelesaikan masalah operasional kritis di PT Global Intermedia Nusantara (GI). Perusahaan ini mengelola puluhan peserta PKL (*Praktik Kerja Lapangan*) dan Magang dari berbagai universitas dan SMK setiap periodenya. Sebelumnya, data peserta, absensi harian, pengumpulan laporan, dan penilaian dilakukan secara manual menggunakan spreadsheet, formulir cetak, dan dokumen yang tersebar. Tidak ada sistem terpusat untuk melacak progres peserta, sehingga menyulitkan admin dalam memantau tren absensi, mengevaluasi kinerja, atau membuat sertifikat di akhir periode. Laporan dikirim melalui WhatsApp atau email, sehingga sulit diatur dan direview secara sistematis. Tujuannya adalah membangun platform digital end-to-end yang menyederhanakan seluruh alur kerja manajemen peserta sekaligus menghadirkan absensi terverifikasi GPS, review laporan terstruktur, dan pembuatan sertifikat otomatis.
GItrack adalah aplikasi Laravel 12 dengan frontend Blade + Tailwind CSS + Alpine.js dan basis data PostgreSQL. Sistem menggunakan pembuat ID khusus yang menghasilkan identitas dalam format `gi-{type}-{YYMM}-{XXX}`, dengan kemampuan meregenerasi ID secara dinamis ketika tipe kegiatan peserta (PKL/Magang) berubah. Verifikasi email berbasis OTP menangani registrasi dan reset password dengan kode ter-hash dan pengiriman antrean. Modul absensi mencatat koordinat GPS (latitude/longitude) saat check-in dan check-out, mendukung mode kerja WFO/WFA, serta menerapkan aturan bisnis seperti check-in sebelum check-out. Mesin penilaian memungkinkan admin menentukan kriteria penilaian per peserta dengan skor 0–100, menghitung nilai akhir secara otomatis dengan pemetaan huruf (A hingga E). Sertifikat dibuat menggunakan DomPDF dengan font kustom dan border dekoratif, dengan penomoran sertifikat yang bertambah otomatis per tahun. Tugas terjadwal berjalan setiap hari pukul 01:00 untuk mengarsipkan peserta yang sudah habis masa berlakunya dan membersihkan arsip yang lebih dari satu bulan. Sistem ini juga dilengkapi log audit aktivitas, feedback dua arah dengan rating bintang, dan manajemen institusi mitra dengan unggah logo.
Verifikasi OTP email yang aman untuk registrasi dan reset password. Kode OTP di-hash dengan bcrypt sebelum disimpan, dikirim melalui antrean email, dengan masa berlaku 5 menit. Dilengkapi pengecekan ketersediaan username/email via AJAX dan pembatasan kecepatan (30 req/menit) pada endpoint autentikasi.
Peserta melakukan check-in dan check-out dengan koordinat GPS real-time yang tercatat di setiap aktivitas. Mendukung mode WFO (Work From Office) dan WFA (Work From Anywhere). Menerapkan aturan bisnis — check-in harus mendahului check-out, dan check-out otomatis memaksa status Hadir. Pencegahan duplikasi memastikan satu entri per jenis per hari.
Peserta mengirimkan laporan kegiatan harian dengan judul, deskripsi, dan lampiran PDF (maks 5MB untuk harian, 10MB untuk akhir). Laporan mengikuti alur kerja Dikirim → Disetujui / Revisi. Admin mereview, menyetujui, atau meminta revisi dengan catatan terperinci. Laporan akhir dibatasi satu per peserta.
Admin menentukan kriteria penilaian per peserta (misal: Kedisiplinan, Keterampilan, Kerjasama, Inisiatif, Komunikasi) dengan skor individu 0–100. Sistem menghitung otomatis nilai akhir sebagai rata-rata dan memetakannya ke nilai huruf (A: 90+, B: 80+, C: 70+, D: 60+, E: <60). Kriteria yang sudah memiliki nilai dilindungi dari penghapusan.
Menghasilkan sertifikat PDF dengan desain border dekoratif menggunakan DomPDF dengan font kustom Certificate.ttf. Nomor sertifikat mengikuti format `No. {sequence}/{PKLorMAG}/PT.GIN/{romanMonth}/{year}` dan bertambah otomatis per tahun. Informasi perusahaan, penandatangan, dan lokasi sepenuhnya dapat dikonfigurasi.
Dashboard interaktif dengan visualisasi Chart.js yang menampilkan tren absensi pada tingkat jam, hari, minggu, dan bulan. Menampilkan kartu statistik (Total PKL, Total Magang, Aktif, Selesai), rincian absensi (Hadir/Izin/Sakit), distribusi universitas vs SMK, dan feedback terbaru — semuanya dengan filter berbasis AJAX dan paginasi.
Peserta mengirim feedback dengan rating bintang 1–5 opsional. Admin dapat membalas langsung di dalam sistem. Feedback yang ditandai tampilkan akan ditampilkan sebagai testimoni publik di carousel halaman utama. Dilengkapi pelacakan status terbaca/belum terbaca untuk kedua sisi.
Tugas terjadwal berjalan setiap hari pukul 01:00 untuk mengarsipkan peserta yang sudah melewati tanggal selesai. Arsip yang lebih dari 1 bulan akan dihapus permanen beserta seluruh data terkait (absen, laporan, feedback, penilaian, akun pengguna, dan file tersimpan). Admin dapat memulihkan atau menghapus arsip secara manual.
Format ID kustom `gi-{type}-{YYMM}-{XXX}` yang menghasilkan otomatis identitas berurutan berdasarkan tipe peserta (PKL/Magang), tanggal registrasi, dan nomor urut. Sistem secara dinamis meregenerasi ID ketika `jenis_kegiatan` peserta berubah, memperbarui tabel `user` dan `peserta` secara mulus.
Mencatat setiap tindakan signifikan dengan ID pengguna, jenis aksi, tabel target, ID record target, dan alamat IP. Memberikan ketertelusuran penuh untuk tindakan administratif di seluruh sistem.
Sistem OTP berbasis email sepenuhnya bergantung pada ketersediaan server SMTP. Jika koneksi SMTP gagal atau dibatasi kecepatan oleh penyedia (misal: error 535 Gmail), pengguna terblokir sepenuhnya dari registrasi atau reset password.
Mengimplementasikan antrean berbasis database untuk memisahkan pengiriman email OTP dari siklus permintaan, memungkinkan percobaan ulang saat gagal. Menambahkan penanganan error komprehensif untuk kegagalan autentikasi SMTP (535), timeouts koneksi, dan tidak tersedianya server mail, dengan menampilkan pesan error yang ramah pengguna.
Ketika admin mengubah `jenis_kegiatan` peserta (misal: PKL → Magang), sistem harus meregenerasi ID peserta karena ID tersebut mengkodekan tipe kegiatan. Ini memerlukan pembaruan tabel `user` dan `peserta` serta re-autentikasi sesi pengguna di tengah permintaan, yang merupakan mutasi state yang kompleks.
Ditangani melalui Eloquent boot events pada model Peserta. Event `saved` mendeteksi perubahan pada `jenis_kegiatan`, memanggil `IdGenerator::generate()` untuk ID baru, memperbarui kedua tabel dalam urutan yang aman untuk data, dan login ulang pengguna jika mereka yang dimodifikasi, memastikan konsistensi sesi tanpa masalah integritas data.
Admin dapat secara tidak sengaja menghapus kriteria penilaian yang sudah memiliki nilai, menyebabkan record nilai menjadi yatim piatu dan data penilaian menjadi korup. Soft delete standar tidak cukup karena nilai yang terkait masih mereferensi kriteria yang dihapus.
Mengimplementasikan aturan validasi sebelum hapus (didokumentasikan sebagai BUG-7 di komentar kode) yang memeriksa keberadaan record `penilaian_details` yang terhubung dengan kriteria. Jika nilai sudah ada, penghapusan diblokir dan admin diberi pesan jelas bahwa nilai harus dihapus terlebih dahulu. Ini diterapkan di level controller sebelum panggilan Eloquent destroy.
Dashboard analitik absensi sangat bergantung pada fungsi SQL spesifik PostgreSQL seperti `EXTRACT(HOUR FROM ...)`, `TO_CHAR(...)`, dan `EXTRACT(ISODOW FROM ...)` untuk mengelompokkan data absensi per jam, hari, minggu, dan bulan. Fungsi-fungsi ini tidak portabel ke MySQL atau SQLite, sehingga menyulitkan migrasi basis data.
Aplikasi dirancang khusus untuk PostgreSQL (`DB_CONNECTION=pgsql`) dan semua query SQL mentah ditulis dengan sintaks PostgreSQL. Konfigurasi `config/database.php` mencakup default fallback untuk SQLite dan MySQL, tetapi lingkungan produksi dikunci ke PostgreSQL 18.3. File `.env.example` secara eksplisit mendokumentasikan ketergantungan ini.
Banyak view Blade memuat Tailwind CSS, Font Awesome, Boxicons, dan Chart.js dari tautan CDN daripada melalui Vite. Ini menciptakan ketergantungan keras pada konektivitas internet agar frontend dapat dirender dengan benar, dan meningkatkan waktu muat halaman dibandingkan build yang dipurge dan dibundel.
Proyek menggunakan Vite dengan laravel-vite-plugin untuk bundling aset lokal (~37 entry points), tetapi pendekatan CDN dipertahankan untuk prototyping dan iterasi cepat selama pengembangan. Untuk deployment produksi, rencananya adalah memigrasi semua aset CDN ke pipeline build Vite dan mengaktifkan purge Tailwind CSS untuk mengurangi ukuran final bundle CSS.







