# Sprint — Penyesuaian Shift & Perhitungan Tarif

**Sumber:** `docs/Shift dan Perhitungan.xlsx` (audit 2026-08-19)
**Aplikasi:** LPK TIP v2 · **Status:** Sprint ✅ (dokumen + implementasi)

---

## 1. Hasil Audit Dokumen Excel

### A. 4 Shift Tetap Trocon
| # | Shift | Masuk | Keluar | Jam Normal |
|---|---|---|---|---|
| 1 | **Shift Pagi** | 08:00 | 16:00 | 8 jam |
| 2 | **Shift Siang** | 13:00 | 21:00 | 8 jam |
| 3 | **Shift Sore** | 16:00 | 00:00 | 8 jam |
| 4 | **Shift Malam** | 20:00 | 03:00 | **7 jam** |

> "Di atas jam tersebut dihitung lembur."

### B. Aturan Lembur
1. **Lembur = jam kerja di atas jam normal shift** (`durasi aktual − jam normal shift`).
2. **Pembulatan menit**: menit lewat **> 31 → dibulatkan 1 jam**; **< 31 → 0** (kembali ke jam sebelumnya).
3. **Potongan isoma (istirahat 18:00–19:00)**: jika bekerja melewati jam tsb (masuk < 18 & keluar ≥ 20) → lembur **dikurangi 1 jam** (contoh: 08:00–20:00 → 12 − 8 = 4 → −1 = **3 jam**).
4. **Hari libur / tanggal merah**: **seluruh jam dihitung lembur** (bukan dikurangi normal) utk staff lembur efektif; **TK harian**: normal sama seperti hari biasa (dokumen: "sama saja").
5. **Operator Bor Efektif**: lembur dihitung sejak mulai clock-in (seluruh jam kerja dihitung) — *memerlukan flag/status khusus (enhancement lanjutan).*

### C. Tunjangan & Potongan (contoh dokumen)
| Komponen | Nilai contoh | Keterangan |
|---|---|---|
| Uang Makan Staff | 100.000/hari | diambil dari `meal_allowance` per karyawan |
| Tunjangan Malam | 20.000/hari | per hari hadir shift malam |
| Potongan Telat | 20.000/hari | per keterlambatan |
| Insentif Produksi | per karyawan | `incentive` |
| Lembur (TLK/TLBR) | tarif per jam | `overtime_rate` |

### D. Absensi
- Absen berbasis **foto via HP** (aplikasi) — sudah diterapkan.

---

## 2. Implementasi (sudah diterapkan)

### 2.1 Seeder 4 shift — `php artisan lpk:seed-shifts`
Buat (firstOrCreate) **Shift Pagi/Siang/Sore/Malam** sesuai tabel A (normal 8/8/8/7). Jalankan di server setelah deploy.

### 2.2 Perhitungan lembur (`PayrollGenerate`)
| Aturan | Implementasi |
|---|---|
| Lembur berbasis shift | `max(0, durasi − jam normal shift)` (existing) |
| **Pembulatan menit** | menit sisa **> 31 → +1 jam**, **< 31 → 0** |
| **Potongan isoma** | jika `actual_in < 18` dan `actual_out >= 20` → lembur **−1 jam** (min 0) |
| **Hari libur** | `is_holiday = true` → **seluruh durasi** dihitung lembur |
| **Tunjangan malam** | shift malam (start ≥ 18:00) + hadir → `tunj_malam` (karyawan ?: periode) per hari |

### 2.3 Test (4 baru)
- Pembulatan: lembur 1.5 jam (menit 30) → **1**; 1.66 (menit 40) → **2**
- Isoma: 08:00–20:00 → lembur **3**
- Hari libur: 08:00–16:00 → lembur **8** (seluruh)
- Tunjangan malam shift malam → **20.000/hari**

---

## 3. Catatan & Enhancement Lanjutan
- [x] **Operator Bor Efektif**: flag `is_bor_efektif` di karyawan → lembur dihitung sejak clock-in (seluruh jam). Flag juga dipulihkan dari legacy `employee.extraovertime` (16 karyawan) via `lpk:fix-overtime-data`.
- [x] **Lintas tengah malam** (shift malam 20:00–03:00): durasi negatif ditambah 24 jam (konsisten legacy `24 + durasi`) — sebelumnya dihitung 0 sehingga shift malam tidak pernah menghasilkan lembur.
- [x] **Potongan isoma hormati `break_1819`**: bila karyawan tidak istirahat 18:00–19:00 (`break_1819=1`), jam tsb tetap dihitung kerja (tidak dipotong 1 jam).
- [x] **Proyek POOL CIKARANG (id 6/24) + bor efektif → lembur ÷2** (konsisten legacy createtime; data historis 13.402 absen proyek 24).
- [x] **`total_day_job` = total JAM lembur** (bukan jumlah hari) — konsisten legacy `totaldayjob = SUM(workhour)`.
- [x] **`work_hour_addition` (+0.5 utk libur produksi) ikut `day_job`** — konsisten legacy `dayjob = hari hadir + SUM(workhouraddition)`.
- [x] **Potongan istirahat utk lintas malam panjang** (mis. 08:00–02:00): legacy memotong 2 jam (normal 7) → setara **potong 1 jam dgn normal shift 8** agar hasil SAMA persis dgn legacy (08:00–02:00 = 9 jam; bor efektif = 17; libur = seluruh jam tanpa potong). Keputusan user: OPSI (a) — ikut legacy.
- [x] **Perbaikan migrasi tarif lembur**: legacy `extraovertime` (flag) sempat dipetakan ke `overtime_rate` — kini `overtime_rate` dari legacy `tunjlembur`, `is_bor_efektif` dari `extraovertime`; data lama diperbaiki via `lpk:fix-overtime-data` (356 karyawan).
- [ ] **Tarif lembur progresif** (1,5× / 2× utk libur) jika dibutuhkan — konfirmasi skala upah
- [ ] **Uang makan** per proyek/status — saat ini `meal_allowance` per karyawan
- [ ] Menyimpan **detail lembur per hari** (audit) di tabel `payroll_results` / detail

## 4. Cara Aktifkan
```bash
php artisan lpk:seed-shifts        # buat 4 shift (server)
# lalu pasangkan shift ke karyawan: SDM & Relasi → Karyawan → Shift Kerja
php artisan test --filter=ShiftTarifTest
```
