# Database Dictionary & ERD — Penggajian SGI

## 1. Hasil pemeriksaan source VB6/Access

Arsip `Penggajian_SGI_v.1.0.6_compare.zip` berisi source VB6, `SGI.mdb`, Crystal Reports, template Excel, dan manual. Source menunjukkan tabel lama utama seperti `Pegawai`, `Gaji`, `Gaji_temp`, `Pinjaman`, `Pot_Pinjaman`, `Kendaraan`, `Pot_Kendaraan`, `Kasbon`, `THR`, `Koperasi`, `Bagian`, `Jabatan`, `Kantor`, `Mutasi_Peg`, `Resign`, `Login`, serta query `QPegawai`, `QGaji`, dan `QGaji_temp`.

### Keputusan migrasi penting

- `Golongan` **tidak dibuat** di sistem baru.
- `Login` diganti menjadi `users` + role.
- `Mutasi_Peg` yang dulu menyimpan Mutasi 1–5 dalam satu baris dinormalisasi menjadi `mutasi_pegawai`.
- `Gaji_temp`/query sementara diganti dengan `import_batches` dan proses import/preview.
- `Pot_Pinjaman` dan `Pot_Kendaraan` diganti dengan riwayat pembayaran yang menyimpan nilai normal, nilai aktual, nilai ditunda, dan sisa.
- `Koperasi` lama tidak dipakai sebagai model payroll baru secara literal; komponen iuran/potongan koperasi tetap tersedia pada payroll.
- `tbAbsen` lama diganti modul `presensi` modern berbasis kamera + GPS + server time.
- Password menggunakan hashing Laravel, bukan mekanisme hash lama.
- Payroll dan transaksi keuangan harus diproses dalam database transaction.

## 2. Role

| Role | Lingkup |
|---|---|
| SUPERADMIN | Semua data, semua cabang, semua pengaturan |
| ADMIN | Semua cabang; tidak dapat melihat/mengelola akun SUPERADMIN |
| USER | Hanya cabang sendiri; membuat pengajuan dan melihat laporan cabang |
| PEGAWAI | Akun pribadi; presensi mobile dan fitur pribadi |

`users.pegawai_id` menghubungkan akun PEGAWAI dengan data pegawai.

## 3. Master

### `cabang`
Menyimpan kantor/cabang dan lokasi presensi.

Kunci utama: `id`.

Field penting:
- `kode`
- `nama`
- `alamat`
- `latitude`, `longitude`
- `radius_presensi_meter`
- `aktif`

### `bagian`
Pengganti master Bagian lama.

### `jabatan`
Pengganti master Jabatan lama.
- Relasi ke `bagian`.
- `tunjangan_default` dan `transport_default` adalah nilai default; payroll tetap menyimpan snapshot nilai yang benar-benar dipakai.

### `pegawai`
Master karyawan.
- `nip` unik.
- Relasi ke cabang, bagian, jabatan.
- Tidak memiliki `golongan_id`.
- Menyimpan gaji pokok, tunjangan, transport, data identitas, status pegawai.

## 4. Security & Settings

### `users`
Akun login.

`role_code`:
- SUPERADMIN
- ADMIN
- USER
- PEGAWAI

ADMIN tetap boleh memiliki `cabang_id = PUSAT`, tetapi akses datanya bersifat seluruh cabang.

### `settings`
Semua aturan yang dapat berubah harus disimpan sebagai data, terutama:
- jam masuk
- jam pulang
- radius presensi
- aktif/nonaktif potongan terlambat
- aktif/nonaktif potongan pulang cepat
- aturan ALPA
- aturan SAKIT/IZIN
- aturan terlambat
- aturan kedatangan setelah jam tertentu menjadi IZIN RESMI
- hari kerja yang digunakan dalam perhitungan

Untuk aturan yang memiliki perubahan sejarah, gunakan `berlaku_mulai` dan `berlaku_sampai`.

### `jadwal_kerja`
Menyimpan periode efektif jam kerja. Dengan demikian perubahan jam kerja tidak mengubah perhitungan historis.

### `aturan_terlambat`
Contoh aturan yang dapat dimasukkan sebagai data:
- 1–15 menit → Rp10.000
- >15 menit → Rp15.000

Nilai ini **tidak di-hard-code**.

## 5. Mutasi & Resign

### `mutasi_pegawai`
Riwayat mutasi satu-per-satu:
- pegawai
- tanggal
- cabang lama → cabang baru
- bagian lama → bagian baru
- jabatan lama → jabatan baru
- keterangan
- pembuat

### `resign`
Riwayat pegawai keluar.

## 6. Pengajuan

Empat tabel pengajuan utama:
- `pengajuan_pegawai`
- `pengajuan_pinjaman`
- `pengajuan_kasbon`
- `pengajuan_kendaraan`

Status:
`MENUNGGU`, `DISETUJUI`, `DITOLAK`, `DIBATALKAN`.

Pengajuan USER tidak langsung menjadi transaksi resmi. Setelah disetujui ADMIN, barulah transaksi dibuat.

## 7. Pinjaman, Kendaraan, Kasbon

### `pinjaman`
Menyimpan kontrak pinjaman:
- jumlah
- tenor
- angsuran normal
- sisa
- status

### `pembayaran_pinjaman`
Riwayat potongan per payroll.

Field penting:
- `jumlah_normal`
- `jumlah_dipotong`
- `jumlah_ditunda`
- `sisa_setelah`
- `status`
- `alasan_penyesuaian`

### `kendaraan` + `pembayaran_kendaraan`
Strukturnya sama dengan pinjaman.

### `kasbon`
Kasbon merupakan transaksi langsung yang dapat masuk ke payroll. Berbeda dengan pinjaman/kendaraan, tidak diperlukan skema cicilan terpisah jika kebijakan perusahaan memang memotongnya pada payroll terkait.

## 8. Punishment

### `punishments`
Punishment adalah transaksi tersendiri.

Contoh:
- Nilai: Rp2.000.000
- Potongan normal: Rp500.000/bulan
- 4 kali potongan

Status:
`DRAFT`, `DISETUJUI`, `BERJALAN`, `LUNAS`, `DIBATALKAN`.

### `pembayaran_punishment`
Menyimpan histori setiap potongan.

Jika gaji tidak mencukupi:
- NORMAL → potong normal
- DISESUAIKAN → potong sebagian
- DITUNDA → potong Rp0

Jumlah yang benar-benar mengurangi sisa punishment hanyalah `jumlah_dipotong`.

## 9. Presensi

### `presensi`
Satu baris per pegawai per tanggal.

Menyimpan:
- jam masuk/pulang server
- GPS masuk/pulang
- jarak ke cabang
- selfie masuk/pulang
- status
- menit terlambat
- menit pulang cepat

Selfie harus diambil langsung dari kamera perangkat; jangan menggunakan upload gallery untuk presensi normal.

### `presensi_potongan`
Menyimpan:
- jenis potongan
- dasar perhitungan
- hari kerja
- nilai normal
- override
- nilai override
- nilai final
- alasan
- admin yang memutuskan

Aturan dasar yang sudah disepakati:
- ALPA → Gaji Pokok / Hari Kerja × hari
- SAKIT/IZIN → Uang Transport / Hari Kerja × hari
- TERLAMBAT → tabel aturan terlambat
- PULANG CEPAT → aturan tersendiri yang configurable
- jika aturan potongan dimatikan → nilai final 0

### `pengajuan_keberatan_presensi`
Alur:
1. PEGAWAI mengajukan keberatan segera setelah terlambat.
2. Reviewer cabang = KEPALA CABANG; jika tidak ada, USER cabang.
3. Reviewer menolak → potongan normal tetap.
4. Reviewer menyetujui → masuk ke ADMIN.
5. ADMIN memutuskan final.
6. ADMIN menyetujui → potongan final dapat menjadi 0.
7. ADMIN menolak → potongan normal tetap.

## 10. Payroll

### `payroll`
Snapshot gaji satu pegawai untuk satu periode.

### Penerimaan
1. Gaji Pokok
2. Tunjangan
3. Transport
4. Insentif
5. Bonus
6. Masuk Lain

### Potongan
1. Iuran Koperasi
2. Potongan Koperasi
3. JPK
4. Pinjaman
5. Kasbon
6. Potongan Kendaraan
7. Potongan Absensi
8. Potongan Tiket
9. Potongan Punishment
10. Keluar Lain

Formula:
- Total Penerimaan = jumlah seluruh penerimaan.
- Total Potongan = jumlah seluruh potongan.
- Gaji Bersih = Total Penerimaan - Total Potongan.

`Potongan Tiket` hanya field angka pada payroll, seperti `Keluar Lain`; tidak dibuat modul cicilan tiket.

### `payroll_obligation_items`
Digunakan untuk pinjaman, kendaraan, punishment dan kewajiban otomatis lain yang dapat disesuaikan.

Jika gaji tidak cukup:
- tampilkan `jumlah_normal`
- ADMIN/SUPERADMIN menentukan `jumlah_dipotong`
- selisih menjadi `jumlah_ditunda`
- wajib ada alasan
- jangan membuat gaji bersih negatif hanya karena cicilan otomatis

## 11. THR

### `thr`
Menyimpan snapshot keputusan THR.

Field penting:
- masa kerja aktual
- masa kerja dihitung
- metode
- gaji pokok
- THR normal
- THR final
- override
- alasan
- approved_by
- tanggal referensi

Metode:
- `PROPORSIONAL`
- `CUSTOM_BULAN`
- `FULL`

ADMIN adalah pengambil keputusan akhir jumlah bulan yang dihitung.

`FULL` berarti THR = Gaji Pokok.

Tanggal referensi THR disimpan sendiri sehingga tidak harus sama dengan tanggal hari raya.

## 12. Import

### `import_batches`

Alur:
`Upload → Validasi → Preview → Konfirmasi → Simpan`.

Jenis import dapat mencakup:
- Pegawai
- Gaji
- Kasbon
- THR
- dan modul lain bila diperlukan.

## 13. Audit

### `audit_logs`

Perubahan penting tidak menghapus sejarah.
Audit menyimpan:
- user
- aksi
- tabel
- record
- data lama
- data baru
- alasan
- IP
- user agent
- waktu

Ini penting terutama untuk:
- perubahan payroll
- override absensi
- perubahan cicilan
- persetujuan pengajuan
- keputusan THR
- punishment.

## 14. ERD

```mermaid
erDiagram
    CABANG ||--o{ PEGAWAI : memiliki
    BAGIAN ||--o{ JABATAN : memiliki
    BAGIAN ||--o{ PEGAWAI : mengelompokkan
    JABATAN ||--o{ PEGAWAI : menjabat
    PEGAWAI ||--o| USERS : memiliki_akun

    PEGAWAI ||--o{ MUTASI_PEGAWAI : mengalami
    PEGAWAI ||--o{ RESIGN : memiliki
    CABANG ||--o{ MUTASI_PEGAWAI : asal_tujuan

    PEGAWAI ||--o{ PENGAJUAN_PINJAMAN : mengajukan
    PEGAWAI ||--o{ PENGAJUAN_KASBON : mengajukan
    PEGAWAI ||--o{ PENGAJUAN_KENDARAAN : mengajukan

    PEGAWAI ||--o{ PINJAMAN : memiliki
    PINJAMAN ||--o{ PEMBAYARAN_PINJAMAN : dibayar
    PEGAWAI ||--o{ KASBON : memiliki

    PEGAWAI ||--o{ KENDARAAN : memiliki
    KENDARAAN ||--o{ PEMBAYARAN_KENDARAAN : dibayar

    PEGAWAI ||--o{ PUNISHMENTS : memiliki
    PUNISHMENTS ||--o{ PEMBAYARAN_PUNISHMENT : dibayar

    PEGAWAI ||--o{ PRESENSI : melakukan
    CABANG ||--o{ PRESENSI : lokasi
    PRESENSI ||--o{ PRESENSI_POTONGAN : menghasilkan
    PRESENSI ||--o{ PENGAJUAN_KEBERATAN_PRESENSI : dapat_diprotes

    PEGAWAI ||--o{ PAYROLL : menerima
    CABANG ||--o{ PAYROLL : membayar
    PAYROLL ||--o{ PAYROLL_OBLIGATION_ITEMS : memiliki

    PEGAWAI ||--o{ THR : menerima
    CABANG ||--o{ THR : membayar
```

## 15. Mapping Access/VB6 → MySQL baru

| Access/VB6 lama | Sistem baru |
|---|---|
| Kantor | cabang |
| Bagian | bagian |
| Jabatan | jabatan |
| Golongan | **dihapus** |
| Pegawai | pegawai |
| Login | users |
| Gaji | payroll |
| Gaji_temp | import_batches / proses payroll |
| Pinjaman | pinjaman |
| Pot_Pinjaman | pembayaran_pinjaman |
| Kendaraan | kendaraan |
| Pot_Kendaraan | pembayaran_kendaraan |
| Kasbon | kasbon |
| THR | thr |
| Mutasi_Peg | mutasi_pegawai |
| Resign | resign |
| tbAbsen | presensi |
| QPegawai | Eloquent relationship/query |
| QGaji | Eloquent relationship/query |
| QGaji_temp | query/proses batch |

## 16. Catatan penting sebelum migration Laravel

Jangan langsung membuat migration Laravel dari SQL ini tanpa review field yang benar-benar dibutuhkan aplikasi saat ini. SQL ini adalah **baseline arsitektur** yang menggabungkan struktur lama dengan aturan bisnis baru.

Urutan pembangunan yang aman:

1. Migration master + users.
2. Migration pegawai + mutasi/resign.
3. Migration pengajuan.
4. Migration pinjaman/kendaraan/kasbon.
5. Migration punishment + pembayaran.
6. Migration presensi + aturan + keberatan.
7. Migration payroll + obligation items.
8. Migration THR.
9. Migration import + audit.
10. Seeder role/settings awal.
11. Migrasi data Access.
12. Uji payroll satu pegawai.
13. Uji payroll massal.
14. Uji slip PDF individual + ZIP.
