Gambaran Umum
Pengenalan Sistem Payroll Terpadu PT Putra Sinar Fisip.
Sistem Payroll Terpadu adalah aplikasi berbasis web untuk mengelola penggajian karyawan secara terstruktur, fleksibel, dan terintegrasi — dari pengaturan gaji, acuan gaji, hitung gaji, penyesuaian, hingga slip gaji.
Dibangun dengan Laravel 11, PHP 8.2+, Tailwind CSS, dan Alpine.js. Basis data menggunakan SQLite dengan Eloquent ORM.
Karyawan, pengaturan gaji, BPJS, wilayah, status
Absensi, NKI, Kasbon per periode
Acuan → Hitung → Slip Gaji
Slip PDF & Excel, laporan rekap
Instalasi & Setup
Persyaratan Sistem
- PHP ^8.2
- Composer
- Node.js ^20
- SQLite / MySQL / PostgreSQL
- Laragon / XAMPP / Valet
Langkah Instalasi
git clone https://github.com/HugoEdmoundo/payroll-app.ptpsf.gitcd payroll-app.ptpsfcomposer installcopy .env.example .envphp artisan key:generatephp artisan migratenpm install && npm run buildphp artisan serve
Pastikan
database/database.sqlitesudah ada sebelum migrasi.
Autentikasi
Login
Masukkan email dan password yang telah didaftarkan administrator.
Session & Akses
Sesi aktif hingga logout. Dua tingkat akses: Superadmin (full) dan User (terbatas). Detail di Pengguna & Role.
Alur Data & Cascade
Sistem menggunakan pendekatan Source of Truth pada modul Pengaturan Gaji.
Karyawan (Harian/OJT/Kontrak) | v Salary Templates + Pengaturan BpjsKoperasi | v NKI + Absensi + Kasbon + Acuan Gaji | v Hitung Gaji (kalkulasi final) | v Slip Gaji (PDF/Excel)
Data Cascade: Perubahan pada NKI, Absensi, atau Acuan Gaji otomatis merambat ke Hitung Gaji via Observer Pattern.
Struktur Database
11 tabel utama dengan SQLite:
| Tabel | PK | Deskripsi |
|---|---|---|
karyawan | id_karyawan | Data master karyawan |
salary_templates | id | Template gaji (standard & status) |
pengaturan_bpjs_koperasi | id | Konfigurasi BPJS & koperasi |
master_wilayah | id | Data wilayah |
master_status_pegawai | id | Data status pegawai |
acuan_gaji | id_acuan | Acuan gaji per periode |
hitung_gaji | id | Hasil hitung + penyesuaian |
slip_gaji | id | Slip gaji final |
absensi | id_absensi | Absensi per periode |
nki | id_nki | Nilai Kinerja Individu |
kasbon | id_kasbon | Pinjaman karyawan |
Unique constraint
(karyawan_id, periode)di setiap tabel transaksi.
Relasi Antar Tabel
| Dari | Ke | Tipe | FK |
|---|---|---|---|
acuan_gaji | karyawan | N:1 | id_karyawan |
hitung_gaji | acuan_gaji | N:1 | acuan_gaji_id |
hitung_gaji | karyawan | N:1 | karyawan_id |
slip_gaji | hitung_gaji | N:1 | hitung_gaji_id |
absensi | karyawan | N:1 | id_karyawan |
kasbon | karyawan | N:1 | id_karyawan |
nki | karyawan | N:1 | id_karyawan |
Pola Observer
Data cascade otomatis via Eloquent Observer:
| Observer | Model | Fungsi |
|---|---|---|
NKIObserver | NKI | Update tunjangan_prestasi di Acuan Gaji & Hitung Gaji |
AbsensiObserver | Absensi | Kalkulasi ulang potongan_absensi |
AcuanGajiObserver | Acuan Gaji | Generate otomatis Hitung Gaji |
HitungGajiObserver | Hitung Gaji | Update status cicilan Kasbon |
PengaturanGaji::observe(PengaturanGajiObserver::class); AcuanGaji::observe(AcuanGajiObserver::class); HitungGaji::observe(HitungGajiObserver::class); NKI::observe(NKIObserver::class); Absensi::observe(AbsensiObserver::class);
Karyawan
Pusat data master karyawan dengan informasi personal, employment, dan kompensasi.
| Field | Tipe | Deskripsi |
|---|---|---|
id_karyawan | PK | Primary key |
nama_karyawan | string | Nama lengkap |
email | string | Email (nullable) |
join_date | datetime | Tanggal mulai bekerja |
jabatan | string | Jabatan / posisi |
lokasi_kerja | string | Wilayah kerja |
jenis_karyawan | string | Konsultan, Organik, Teknisi, Borongan |
status_pegawai | string | Harian/OJT/Kontrak (otomatis) |
npwp | string | NPWP (nullable) |
bpjs_kesehatan_no | string | No BPJS Kesehatan |
bpjs_tk_no | string | No BPJS Ketenagakerjaan |
no_rekening | string | Nomor rekening |
bank | string | Nama bank |
status_karyawan | string | Aktif / Nonaktif |
Status Pegawai Otomatis
class Karyawan extends Model {
public function calculateStatusPegawai() {
$days = $this->join_date->diffInDays(now());
if ($days < 14) return 'Harian';
if ($days < 104) return 'OJT';
return 'Kontrak';
}
}
CRUD & Fitur
- Tambah, edit, lihat, hapus karyawan
- Import/export Excel (dengan template)
- Riwayat jabatan (Job Movement) tercatat otomatis
Penghapusan bersifat permanen (hard delete) — menghapus semua data terkait.
Pengaturan Gaji
Source of Truth untuk komponen gaji. Disimpan di salary_templates dengan dua tipe: Standard dan Status.
Standard Template
Untuk karyawan Kontrak, dikombinasikan dengan jenis_karyawan, jabatan, lokasi_kerja.
| Field | Deskripsi |
|---|---|
gaji_pokok | Gaji pokok bulanan |
tunjangan_operasional | Tunjangan operasional |
tunjangan_prestasi | Dasar tunjangan prestasi (x persentase NKI) |
Status Template
Untuk Harian dan OJT.
| Field | Deskripsi |
|---|---|
gaji_pokok | Gaji pokok (Rp90.000/hari untuk Harian) |
lokasi_kerja | Wilayah kerja |
$model->gaji_nett = $model->gaji_pokok + ($model->tunjangan_prestasi ?? 0); $model->total_gaji = $model->gaji_nett;
BPJS & Koperasi
Konfigurasi global untuk semua karyawan di tabel pengaturan_bpjs_koperasi.
| Field | Deskripsi |
|---|---|
bpjs_kesehatan_pendapatan | BPJS Kesehatan (perusahaan) |
bpjs_kecelakaan_kerja_pendapatan | BPJS Kecelakaan Kerja |
bpjs_kematian_pendapatan | BPJS Kematian |
bpjs_jht_pendapatan | BPJS JHT |
bpjs_jp_pendapatan | BPJS JP |
koperasi | Potongan koperasi |
Karyawan Harian & OJT tidak mendapat BPJS.
Master Wilayah & Status Pegawai
Master Wilayah
| Field | Deskripsi |
|---|---|
kode | Kode wilayah (unique) |
nama | Nama wilayah |
is_active | Status aktif |
Master Status Pegawai
| Field | Deskripsi |
|---|---|
nama | Nama status |
durasi_hari | Durasi dalam hari |
gunakan_nki | Gunakan NKI |
is_active | Status aktif |
Absensi
Mencatat kehadiran per periode untuk menghitung potongan absensi.
| Field | Deskripsi |
|---|---|
id_karyawan | FK ke karyawan |
periode | YYYY-MM |
hadir | Jumlah hari hadir |
absence | Hari tidak hadir (izin) |
tanpa_keterangan | Tanpa keterangan |
potongan_absensi | Nominal potongan (otomatis) |
potongan = (absence + tanpa_keterangan) / jumlah_hari_bulan
x (gaji_pokok + tunjangan_prestasi + tunjangan_operasional)
NKI (Nilai Kinerja Individu)
Penilaian kinerja yang mempengaruhi Tunjangan Prestasi. Hanya untuk Kontrak.
| Komponen | Bobot | Deskripsi |
|---|---|---|
kemampuan | 20% | Kemampuan teknis |
kontribusi_1 | 20% | Kontribusi pertama |
kontribusi_2 | 40% | Kontribusi kedua |
kedisiplinan | 20% | Tingkat kedisiplinan |
nilai_nki = (kemampuan x 0.20) + (kontribusi_1 x 0.20)
+ (kontribusi_2 x 0.40) + (kedisiplinan x 0.20)
if (nilai_nki >= 8.5) -> 100% | >= 8.0 -> 80% | < 8.0 -> 70%
Kasbon & Cicilan
Dua metode: Langsung (potong sekali) dan Cicilan (tiap bulan).
| Field | Deskripsi |
|---|---|
nominal | Jumlah pinjaman |
metode_pembayaran | Langsung / Cicilan |
status_pembayaran | Pending / Lunas |
jumlah_cicilan | Jumlah cicilan |
cicilan_terbayar | Cicilan terbayar |
sisa_cicilan | Sisa pinjaman |
Cicilan disimpan di
kasbon_cicilandengan field:cicilan_ke,periode,nominal_cicilan,status.
Acuan Gaji
Base reference per karyawan per periode. Semua komponen dikumpulkan di sini sebelum Hitung Gaji.
Pendapatan (12)
gaji_pokokbpjs_kesehatanbpjs_kecelakaan_kerjabpjs_kematianbpjs_jhtbpjs_jptunjangan_prestasitunjangan_konjungturbenefit_ibadahbenefit_komunikasibenefit_operasionalreward
Pengeluaran (7)
koperasikasbonumrohkurbanmutabaahpotongan_absensipotongan_kehadiran
$model->total_pendapatan = sum(semua pendapatan); $model->total_pengeluaran = sum(semua pengeluaran); $model->gaji_bersih = total_pendapatan - total_pengeluaran;
Unique constraint:
unique(id_karyawan, periode).
Hitung Gaji
Inti sistem payroll — kalkulasi final dengan data Acuan Gaji + penyesuaian.
Alur
- Acuan Gaji dibuat → sistem generate Hitung Gaji (AcuanGajiObserver)
- Kalkulasi ulang NKI & Absensi
- Adjustment bisa ditambahkan via modal
- Status: Draft → Preview → Approved
Adjustments (JSON)
{
"gaji_pokok": { "type": "+", "nominal": 500000, "description": "Bonus" },
"koperasi": { "type": "-", "nominal": 100000, "description": "Koreksi" }
}
total_pendapatan = sum(12 pendapatan + adjustments pendapatan) total_pengeluaran = sum(7 pengeluaran + adjustments pengeluaran) gaji_bersih = total_pendapatan - total_pengeluaran
Penyesuaian
Adjustment memungkinkan modifikasi komponen gaji tanpa mengubah data Acuan Gaji asli. Berguna untuk:
- Bonus — pembayaran satu kali
- Denda — potongan tambahan
- Koreksi — error data approved
- Insentif — tambahan khusus
Slip Gaji
Output akhir payroll. Setiap karyawan approved memiliki slip PDF & Excel.
| Field | Deskripsi |
|---|---|
nomor_slip | SG-YYYYMM-XXXX |
take_home_pay | Gaji bersih |
detail_pendapatan | JSON snapshot |
detail_pengeluaran | JSON snapshot |
Pengguna & Role
- ✓ Semua fitur payroll
- ✓ Manajemen pengguna
- ✓ Pengaturan sistem
- ✓ Input data payroll
- ✓ Export slip gaji
- ✗ Tidak manage pengguna
Hak Akses
Hierarki pengecekan permission:
public function hasPermission($key) {
if ($this->isSuperadmin()) return true;
if (!$this->is_active) return false;
// Priority 1: User-specific permission
// Priority 2: Role-based permission
return false;
}
Module permissions: karyawan.view, karyawan.create, payroll.hitung-gaji, admin.users, dll.
Pengaturan Sistem
Menu Admin → Settings untuk:
- Jabatan per Jenis Karyawan
- Dynamic Fields custom
- Konfigurasi umum aplikasi
Log Aktivitas
Semua aksi signifikan dicatat di activity_logs:
| Field | Deskripsi |
|---|---|
user_id | Pengguna |
action_type | create/update/delete/approve |
entity_type | Karyawan, HitungGaji, dll |
old_value | Data sebelum (JSON) |
new_value | Data setelah (JSON) |
Import & Export
| Modul | Import | Template | Export |
|---|---|---|---|
| Karyawan | ✓ | ✓ | ✓ |
| Acuan Gaji | ✓ | ✓ | ✓ |
| Absensi | ✓ | ✓ | ✓ |
| NKI | ✓ | ✓ | ✓ |
| Kasbon | — | — | ✓ |
| Slip Gaji | — | — | ✓ (Excel+PDF) |
FAQ
Data tidak muncul setelah generate Acuan Gaji
Pastikan: karyawan Aktif, Pengaturan Gaji sudah diisi, periode benar (YYYY-MM).
Duplicate entry error
Satu record per karyawan per periode. Gunakan periode berbeda atau edit yang sudah ada.
Gaji bersih 0 atau tidak sesuai
Pastikan komponen gaji terisi. Gunakan Adjustment untuk koreksi jika sudah approved.
Tidak bisa edit Hitung Gaji approved
Fitur keamanan. Gunakan Adjustment untuk koreksi.
Cara reset password?
Hubungi administrator sistem.
Tidak ditemukan hasil untuk pencarian ini.
Coba gunakan kata kunci lain.