Source Code Aplikasi Absensi Karyawan Berbasis Web

Setiap akhir bulan, bagian HR mengulang ritual yang sama: menyalin data mesin fingerprint ke Excel, mencocokkan dengan surat izin, menghitung keterlambatan satu per satu, lalu meng...

Source Code Aplikasi Absensi Karyawan Berbasis Web

Setiap akhir bulan, bagian HR mengulang ritual yang sama: menyalin data mesin fingerprint ke Excel, mencocokkan dengan surat izin, menghitung keterlambatan satu per satu, lalu mengirim rekap ke bagian gaji. Untuk karyawan lapangan atau cabang lain, datanya bahkan datang lewat foto kertas di grup chat. Prosesnya lambat, rawan salah, dan mudah dicurangi.

Aplikasi absensi berbasis web memindahkan pencatatan ke ponsel atau browser dan menyimpan semuanya di satu database. Artikel ini membahas modul yang umumnya dibutuhkan, alur data, desain tabel yang sehat, cara memvalidasi lokasi di Laravel, langkah instalasi, dan hal yang perlu diperiksa sebelum memakai source code absensi siap pakai.

Masalah yang Diselesaikan

  • Titip absen. Rekan kerja menekan absen untuk yang belum datang.
  • Karyawan tersebar. Tim lapangan, sales, dan cabang tidak bisa memakai satu mesin fingerprint di kantor pusat.
  • Rekap manual. Data kehadiran, izin, dan lembur ada di tempat berbeda.
  • Payroll terlambat. Gaji menunggu rekap absensi selesai.

Modul Inti dan Alur Data

Sistem absensi web yang matang biasanya memiliki modul berikut: absen dengan geolokasi dan foto selfie, manajemen shift dan jadwal kerja, pengajuan cuti dan izin online dengan alur persetujuan, laporan kehadiran harian dan bulanan termasuk rekap keterlambatan, serta integrasi dengan payroll.

  1. Admin HR menetapkan lokasi kantor (koordinat dan radius) dan jadwal shift.
  2. Karyawan membuka aplikasi, browser meminta izin lokasi, lalu karyawan mengambil foto selfie.
  3. Server mengecek jarak ke lokasi kantor dan mencocokkan waktu dengan shift.
  4. Catatan masuk dan pulang tersimpan beserta koordinat, foto, dan status (tepat waktu atau terlambat).
  5. Pengajuan izin atau cuti melewati atasan untuk disetujui.
  6. Di akhir periode, rekap kehadiran diteruskan ke perhitungan gaji.

Rancangan Tabel yang Direkomendasikan

TabelKolom pentingCatatan
employeesid, user_id, nik, name, office_id, shift_idSatu karyawan satu akun login
officesid, name, latitude, longitude, radius_mBisa banyak cabang
shiftsid, name, start_time, end_time, grace_minutesToleransi keterlambatan per shift
attendancesid, employee_id, date, check_in, check_out, lat, lng, photo_path, statusUnik per karyawan per tanggal
leave_requestsid, employee_id, type, start_date, end_date, reason, status, approved_byStatus: pending, approved, rejected

Simpan foto di disk privat (bukan folder public) dan tampilkan lewat route yang mengecek hak akses. Foto wajah dan lokasi termasuk data pribadi. Prinsip relasi antartabel seperti ini dijelaskan di merancang ERD sederhana untuk aplikasi.

Validasi Lokasi di Sisi Server

Kesalahan paling umum adalah memeriksa radius hanya di JavaScript. Siapa pun bisa mengubah nilai yang dikirim browser. Perhitungan jarak wajib diulang di server. Contoh dengan rumus Haversine di Laravel 11:

// app/Support/Geo.php
namespace App\Support;

class Geo
{
    public static function distanceMeters(float $lat1, float $lng1, float $lat2, float $lng2): float
    {
        $r = 6371000; // radius bumi dalam meter
        $dLat = deg2rad($lat2 - $lat1);
        $dLng = deg2rad($lng2 - $lng1);
        $a = sin($dLat / 2) ** 2
           + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * sin($dLng / 2) ** 2;

        return $r * 2 * atan2(sqrt($a), sqrt(1 - $a));
    }
}

// di controller check-in
$data = $request->validate([
    'lat'   => ['required', 'numeric', 'between:-90,90'],
    'lng'   => ['required', 'numeric', 'between:-180,180'],
    'photo' => ['required', 'image', 'max:2048'],
]);

$office = $employee->office;
$jarak = Geo::distanceMeters($data['lat'], $data['lng'], $office->latitude, $office->longitude);

if ($jarak > $office->radius_m) {
    return back()->withErrors(['lat' => "Anda berada sekitar " . round($jarak) . " m dari kantor."]);
}

Akurasi GPS ponsel di dalam gedung bisa meleset puluhan meter. Radius 50–150 meter biasanya lebih realistis daripada 10 meter yang membuat karyawan gagal absen padahal sudah di kantor. Angka ini sebaiknya diuji langsung di lokasi Anda.

Ingat juga bahwa browser hanya memberi akses lokasi di halaman HTTPS. Jika absen tidak bisa membaca lokasi di server uji, periksa sertifikat SSL terlebih dahulu.

Mencegah Kecurangan: Pilih Tingkat yang Sesuai

MetodeEfektif mencegahKelemahan
Geolokasi + radiusAbsen dari rumahAplikasi pemalsu GPS
Foto selfieTitip absenPerlu dicek manual atau acak
Batas jaringan Wi-Fi kantor (IP)Absen di luar kantorTidak cocok untuk tim lapangan
Satu perangkat per akunBerbagi akunRepot saat karyawan ganti ponsel

Kombinasi geolokasi dan selfie sudah cukup untuk sebagian besar usaha kecil dan menengah. Pengenalan wajah otomatis menambah ketelitian, tetapi juga menambah biaya dan kerumitan.

Menghitung Keterlambatan dan Rekap Bulanan

Status terlambat sebaiknya dihitung saat check-in dan disimpan, bukan dihitung ulang setiap kali laporan dibuka. Contoh logika sederhana:

$batas = Carbon::parse($shift->start_time)->addMinutes($shift->grace_minutes);
$status = now()->format('H:i:s') > $batas->format('H:i:s') ? 'late' : 'on_time';

Untuk shift malam yang melewati tengah malam, simpan tanggal shift secara eksplisit di kolom date, jangan mengandalkan tanggal jam masuk. Ini sumber bug paling umum di sistem absensi.

Menghubungkan Absensi ke Payroll

Nilai terbesar sistem absensi muncul ketika datanya langsung dipakai untuk menghitung gaji. Agar integrasi ini tidak menimbulkan masalah, perhatikan beberapa hal:

  1. Kunci periode. Setelah rekap bulan disetujui HR, tandai periode sebagai terkunci agar data absensi lama tidak berubah diam-diam setelah gaji dibayar.
  2. Sediakan ringkasan per karyawan: jumlah hadir, terlambat, izin, cuti, dan alfa. Modul payroll cukup membaca ringkasan ini, bukan ribuan baris absensi.
  3. Catat koreksi. Jika admin mengubah data absensi (misalnya karyawan lupa absen pulang), simpan siapa yang mengubah dan alasannya.

Contoh: misalkan aturan perusahaan memotong uang makan untuk setiap hari terlambat. Dengan ringkasan per karyawan, perhitungan potongan cukup satu perkalian, dan setiap angka bisa ditelusuri ke tanggal absensinya.

Instalasi Lokal

  1. Siapkan PHP 8.2+, Composer, dan MySQL. Lihat setup environment PHP, Composer, dan MySQL.
  2. Ekstrak source code dan jalankan composer install.
  3. Salin .env.example ke .env, isi koneksi database, lalu php artisan key:generate.
  4. Jalankan migration dan seeder sesuai dokumentasi.
  5. Jalankan php artisan storage:link jika foto disimpan di disk publik.
  6. Untuk uji di ponsel, gunakan tunnel HTTPS karena geolokasi butuh koneksi aman.

Kustomisasi yang Aman

  • Tambahkan kolom baru (misalnya divisi) melalui migration baru, bukan mengubah yang lama.
  • Pisahkan aturan bisnis seperti toleransi terlambat ke tabel pengaturan agar HR bisa mengubahnya tanpa developer.
  • Jadwalkan penghapusan atau pengarsipan foto lama dengan Laravel Scheduler agar storage tidak penuh.
  • Gunakan Git dan uji di server staging sebelum produksi. Teknik lengkapnya ada di cara kustomisasi source code tanpa merusak.

Checklist Sebelum Memilih Source Code Absensi

  • Radius lokasi divalidasi di server, bukan hanya di browser.
  • Foto selfie disimpan aman dan hanya bisa dilihat yang berwenang.
  • Mendukung banyak kantor atau cabang dengan radius berbeda.
  • Shift bisa diatur, termasuk shift yang melewati tengah malam.
  • Cuti dan izin punya alur persetujuan serta riwayat.
  • Laporan bisa difilter per karyawan, divisi, dan periode.
  • Data kehadiran bisa diekspor atau diteruskan ke payroll.
  • Ada dokumentasi instalasi dan versi PHP/Laravel jelas.

Keterbatasan dan Hal yang Perlu Disiapkan

Absensi berbasis web bergantung pada ponsel karyawan dan koneksi internet. Siapkan aturan cadangan untuk karyawan yang ponselnya rusak atau sinyalnya buruk, misalnya absen melalui admin dengan catatan. Aplikasi pemalsu lokasi tetap ada; geolokasi menurunkan kecurangan, bukan menghilangkannya. Terakhir, informasikan secara terbuka kepada karyawan data apa yang dikumpulkan (lokasi saat absen dan foto) dan untuk apa, agar sistem diterima dengan baik.

Beberapa contoh aplikasi SDM dan absensi berbasis Laravel juga tersedia di katalog GudangCode bila Anda ingin membandingkan strukturnya dengan checklist di atas.

Ingin langsung mempraktikkannya?

Buat akun gratis untuk mengunduh contoh aplikasi Laravel, menyimpan tutorial favorit, dan mencoba kursus. Gratis, bisa daftar dengan akun Google.

Daftar Gratis Lihat katalog aplikasi
Yudhi
Ditulis oleh
Yudhi
Founder & Lead Developer, GudangCode

Yudhi adalah founder GudangCode dan developer Laravel dengan pengalaman membangun puluhan sistem informasi bisnis siap pakai — mulai dari POS, HRIS, hingga aplikasi manajemen. Ia menulis panduan dan artikel di GudangCode untuk membantu developer Indonesia menjalankan, memahami, dan men-deploy source code Laravel dengan benar.

Laravel PHP MySQL Sistem Informasi Bisnis
Lihat semua artikel Yudhi
Source Code Absensi HR Web
Bacaan Paling Dicari
📚 Free Learning Hub

Learn Coding for Free at DhieCoderWeb

Explore Laravel, PHP, JavaScript tutorials, source code, web development guides, and practical programming tips.

DhieCoderWeb
100+
Tutorials
Free
Learning
SEO
Tips
Visit Dhiecoderweb.com →