# Surat Perintah Lembur

- Module key: `SuratPerintahLembur`
- Category: `HRIS`
- Path: `app/Modules/SuratPerintahLembur`

## Ringkasan

Surat Perintah Lembur berada di kategori HRIS. Modul ini memiliki 30 definisi route, 1 controller, 1 model, dan 3 view. Database module terdeteksi pada tabel: `surat_perintah_lemburs`.

## Flowchart

```mermaid
flowchart TD
    A[User / Operator] --> B[Menu Surat Perintah Lembur]
    B --> C[Routes: 30]
    C --> D[Controllers: 1]
    D --> E[Views: 3]
    D --> F[(Tables: 1<br/>surat_perintah_lemburs)]
    D --> G[Validation / Business Rules]
    G --> F
    F --> H[Report / Export / Audit]
```


## Routes

- `Route::middleware(['auth', 'ip.block', 'menu.access'])->group(function () {`  
  File: `app/Modules/SuratPerintahLembur/routes/web.php`
- `Route::prefix('surat-perintah-lembur')->name('surat_perintah_lembur.')->group(function () {`  
  File: `app/Modules/SuratPerintahLembur/routes/web.php`
- `Route::get('/', [SuratPerintahLemburController::class, 'index'])->name('index');`  
  File: `app/Modules/SuratPerintahLembur/routes/web.php`
- `Route::get('review-candidate', [SuratPerintahLemburController::class, 'reviewCandidateIndex'])->name('review_candidate_index');`  
  File: `app/Modules/SuratPerintahLembur/routes/web.php`
- `Route::get('separate-payout', [SuratPerintahLemburController::class, 'separatePayoutIndex'])->name('separate_payout_index');`  
  File: `app/Modules/SuratPerintahLembur/routes/web.php`
- `Route::get('refs', [SuratPerintahLemburController::class, 'refs'])->name('refs');`  
  File: `app/Modules/SuratPerintahLembur/routes/web.php`
- `Route::get('data', [SuratPerintahLemburController::class, 'data'])->name('data');`  
  File: `app/Modules/SuratPerintahLembur/routes/web.php`
- `Route::get('review-candidate-data', [SuratPerintahLemburController::class, 'reviewCandidateData'])->name('review_candidate_data');`  
  File: `app/Modules/SuratPerintahLembur/routes/web.php`
- `Route::get('separate-payout-data', [SuratPerintahLemburController::class, 'separatePayoutData'])->name('separate_payout_data');`  
  File: `app/Modules/SuratPerintahLembur/routes/web.php`
- `Route::get('separate-payout-export', [SuratPerintahLemburController::class, 'exportSeparatePayoutXlsx'])->name('separate_payout_export');`  
  File: `app/Modules/SuratPerintahLembur/routes/web.php`
- `Route::get('import-template', [SuratPerintahLemburController::class, 'downloadImportTemplate'])->name('import_template');`  
  File: `app/Modules/SuratPerintahLembur/routes/web.php`
- `Route::post('import-preview', [SuratPerintahLemburController::class, 'importPreview'])->name('import_preview');`  
  File: `app/Modules/SuratPerintahLembur/routes/web.php`
- `Route::post('import-commit', [SuratPerintahLemburController::class, 'importCommit'])->name('import_commit');`  
  File: `app/Modules/SuratPerintahLembur/routes/web.php`
- `Route::post('review-candidate-generate', [SuratPerintahLemburController::class, 'reviewCandidateGenerate'])->name('review_candidate_generate');`  
  File: `app/Modules/SuratPerintahLembur/routes/web.php`
- `Route::get('import-error-report/{token}', [SuratPerintahLemburController::class, 'downloadImportErrorReport'])->name('import_error_report');`  
  File: `app/Modules/SuratPerintahLembur/routes/web.php`
- `Route::post('/', [SuratPerintahLemburController::class, 'store'])->name('store');`  
  File: `app/Modules/SuratPerintahLembur/routes/web.php`
- `Route::post('bulk-update', [SuratPerintahLemburController::class, 'bulkUpdate'])->name('bulk_update');`  
  File: `app/Modules/SuratPerintahLembur/routes/web.php`
- `Route::post('bulk-delete', [SuratPerintahLemburController::class, 'bulkDestroy'])->name('bulk_delete');`  
  File: `app/Modules/SuratPerintahLembur/routes/web.php`
- `Route::post('bulk-submit', [SuratPerintahLemburController::class, 'bulkSubmit'])->name('bulk_submit');`  
  File: `app/Modules/SuratPerintahLembur/routes/web.php`
- `Route::post('bulk-approve', [SuratPerintahLemburController::class, 'bulkApprove'])->name('bulk_approve');`  
  File: `app/Modules/SuratPerintahLembur/routes/web.php`
- `Route::post('bulk-unapprove', [SuratPerintahLemburController::class, 'bulkUnapprove'])->name('bulk_unapprove');`  
  File: `app/Modules/SuratPerintahLembur/routes/web.php`
- `Route::post('bulk-reject', [SuratPerintahLemburController::class, 'bulkReject'])->name('bulk_reject');`  
  File: `app/Modules/SuratPerintahLembur/routes/web.php`
- `Route::put('{id}', [SuratPerintahLemburController::class, 'update'])->name('update');`  
  File: `app/Modules/SuratPerintahLembur/routes/web.php`
- `Route::delete('{id}', [SuratPerintahLemburController::class, 'destroy'])->name('destroy');`  
  File: `app/Modules/SuratPerintahLembur/routes/web.php`
- `Route::post('{id}/submit', [SuratPerintahLemburController::class, 'submit'])->name('submit');`  
  File: `app/Modules/SuratPerintahLembur/routes/web.php`
- `Route::post('{id}/approve', [SuratPerintahLemburController::class, 'approve'])->name('approve');`  
  File: `app/Modules/SuratPerintahLembur/routes/web.php`
- `Route::post('{id}/unapprove', [SuratPerintahLemburController::class, 'unapprove'])->name('unapprove');`  
  File: `app/Modules/SuratPerintahLembur/routes/web.php`
- `Route::post('{id}/reject', [SuratPerintahLemburController::class, 'reject'])->name('reject');`  
  File: `app/Modules/SuratPerintahLembur/routes/web.php`
- `Route::post('{id}/mark-paid-separate', [SuratPerintahLemburController::class, 'markPaidSeparate'])->name('mark_paid_separate');`  
  File: `app/Modules/SuratPerintahLembur/routes/web.php`
- `Route::post('{id}/undo-paid-separate', [SuratPerintahLemburController::class, 'undoPaidSeparate'])->name('undo_paid_separate');`  
  File: `app/Modules/SuratPerintahLembur/routes/web.php`

## Controllers

- `app/Modules/SuratPerintahLembur/Http/Controllers/SuratPerintahLemburController.php`

## Models

- `app/Modules/SuratPerintahLembur/Models/SuratPerintahLemburModel.php`

## Views

- `app/Modules/SuratPerintahLembur/Resources/views/index.blade.php`
- `app/Modules/SuratPerintahLembur/Resources/views/review_candidate.blade.php`
- `app/Modules/SuratPerintahLembur/Resources/views/separate_payout.blade.php`

## Database / Migration

### `surat_perintah_lemburs`
- Actions: `create`, `table`
- Columns: 39
  - `document_no:string`
  - `karyawan_id:unsignedBigInteger`
  - `approval_flow_id:unsignedBigInteger`
  - `approval_request_id:unsignedBigInteger`
  - `request_date:date`
  - `work_date:date`
  - `start_time:time`
  - `end_time:time`
  - `reason:text`
  - `status:string`
  - `created_by:unsignedBigInteger`
  - `is_active:boolean`
  - `karyawan_id:foreign`
  - `approval_flow_id:foreign`
  - `approval_request_id:foreign`
  - `created_by:foreign`
  - `work_date:index`
  - `overtime_type:string`
  - `rule_payload:json`
  - `rule_payload:dropColumn`
  - `overtime_type:dropColumn`
  - `job_id:unsignedBigInteger`
  - `job_id:foreign`
  - `job_id:index`
  - `spl_job_fk:dropForeign`
  - `spl_job_date_idx:dropIndex`
  - `job_id:dropColumn`
  - `separate_payment_status:string`
  - `separate_paid_at:dateTime`
  - `separate_paid_by:unsignedBigInteger`
  - `separate_payment_notes:text`
  - `separate_paid_by:foreign`
  - `separate_payment_status:index`
  - `spl_separate_paid_by_fk:dropForeign`
  - `spl_separate_payment_idx:dropIndex`
  - `separate_payment_notes:dropColumn`
  - `separate_paid_by:dropColumn`
  - `separate_paid_at:dropColumn`
  - `separate_payment_status:dropColumn`
- Migrations:
  - `app/Modules/SuratPerintahLembur/Database/migrations/2026_02_24_180400_create_surat_perintah_lemburs_table.php`
  - `app/Modules/SuratPerintahLembur/Database/migrations/2026_03_12_210000_add_overtime_type_to_surat_perintah_lemburs_table.php`
  - `app/Modules/SuratPerintahLembur/Database/migrations/2026_03_18_020000_add_job_id_to_surat_perintah_lemburs_table.php`
  - `app/Modules/SuratPerintahLembur/Database/migrations/2026_04_17_120000_add_separate_payment_columns_to_surat_perintah_lemburs_table.php`
