# Master Profil Bulan

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

## Ringkasan

Master Profil Bulan berada di kategori HRIS. Modul ini memiliki 29 definisi route, 1 controller, 4 model, dan 1 view. Database module terdeteksi pada tabel: `master_profil_bulans`, `master_profil_bulan_karyawans`, `payroll_karyawan_component_overrides`, `master_export_grouping_options`, `payroll_payable_rules`.

## Flowchart

```mermaid
flowchart TD
    A[User / Operator] --> B[Menu Master Profil Bulan]
    B --> C[Routes: 29]
    C --> D[Controllers: 1]
    D --> E[Views: 1]
    D --> F[(Tables: 5<br/>master_profil_bulans<br/>master_profil_bulan_karyawans<br/>payroll_karyawan_component_overrides<br/>master_export_grouping_options<br/>payroll_payable_rules)]
    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/MasterProfilBulan/routes/web.php`
- `Route::prefix('master-profil-bulan')->name('master_profil_bulan.')->group(function () {`  
  File: `app/Modules/MasterProfilBulan/routes/web.php`
- `Route::get('/', [MasterProfilBulanController::class, 'index'])->name('index');`  
  File: `app/Modules/MasterProfilBulan/routes/web.php`
- `Route::get('data', [MasterProfilBulanController::class, 'data'])->name('data');`  
  File: `app/Modules/MasterProfilBulan/routes/web.php`
- `Route::get('refs', [MasterProfilBulanController::class, 'refs'])->name('refs');`  
  File: `app/Modules/MasterProfilBulan/routes/web.php`
- `Route::get('export-grouping-options', [MasterProfilBulanController::class, 'exportGroupingOptionData'])->name('export_grouping_options.data');`  
  File: `app/Modules/MasterProfilBulan/routes/web.php`
- `Route::post('export-grouping-options', [MasterProfilBulanController::class, 'storeExportGroupingOption'])->name('export_grouping_options.store');`  
  File: `app/Modules/MasterProfilBulan/routes/web.php`
- `Route::put('export-grouping-options/{id}', [MasterProfilBulanController::class, 'updateExportGroupingOption'])->name('export_grouping_options.update');`  
  File: `app/Modules/MasterProfilBulan/routes/web.php`
- `Route::delete('export-grouping-options/{id}', [MasterProfilBulanController::class, 'destroyExportGroupingOption'])->name('export_grouping_options.destroy');`  
  File: `app/Modules/MasterProfilBulan/routes/web.php`
- `Route::post('/', [MasterProfilBulanController::class, 'store'])->name('store');`  
  File: `app/Modules/MasterProfilBulan/routes/web.php`
- `Route::post('{id}/copy', [MasterProfilBulanController::class, 'copy'])->name('copy');`  
  File: `app/Modules/MasterProfilBulan/routes/web.php`
- `Route::post('{id}/sync-from-prev', [MasterProfilBulanController::class, 'syncFromPrevious'])->name('sync_from_prev');`  
  File: `app/Modules/MasterProfilBulan/routes/web.php`
- `Route::put('{id}', [MasterProfilBulanController::class, 'update'])->name('update');`  
  File: `app/Modules/MasterProfilBulan/routes/web.php`
- `Route::delete('{id}', [MasterProfilBulanController::class, 'destroy'])->name('destroy');`  
  File: `app/Modules/MasterProfilBulan/routes/web.php`
- `Route::get('{id}/assignments', [MasterProfilBulanController::class, 'assignmentData'])->name('assignments.data');`  
  File: `app/Modules/MasterProfilBulan/routes/web.php`
- `Route::get('{id}/assignments/export', [MasterProfilBulanController::class, 'exportAssignments'])->name('assignments.export');`  
  File: `app/Modules/MasterProfilBulan/routes/web.php`
- `Route::post('{id}/assignments', [MasterProfilBulanController::class, 'storeAssignment'])->name('assignments.store');`  
  File: `app/Modules/MasterProfilBulan/routes/web.php`
- `Route::get('{id}/assignments/upload-template', [MasterProfilBulanController::class, 'downloadAssignmentImportTemplate'])->name('assignments.upload_template');`  
  File: `app/Modules/MasterProfilBulan/routes/web.php`
- `Route::get('{id}/assignments/deduction-template', [MasterProfilBulanController::class, 'downloadAssignmentDeductionImportTemplate'])->name('assignments.deduction_template');`  
  File: `app/Modules/MasterProfilBulan/routes/web.php`
- `Route::post('{id}/assignments/bulk-create', [MasterProfilBulanController::class, 'bulkStoreAssignments'])->name('assignments.bulk_store');`  
  File: `app/Modules/MasterProfilBulan/routes/web.php`
- `Route::post('{id}/assignments/upload-overrides', [MasterProfilBulanController::class, 'uploadAssignmentOverrides'])->name('assignments.upload_overrides');`  
  File: `app/Modules/MasterProfilBulan/routes/web.php`
- `Route::put('assignments/bulk-update', [MasterProfilBulanController::class, 'bulkUpdateAssignments'])->name('assignments.bulk_update');`  
  File: `app/Modules/MasterProfilBulan/routes/web.php`
- `Route::put('assignments/{id}', [MasterProfilBulanController::class, 'updateAssignment'])->name('assignments.update');`  
  File: `app/Modules/MasterProfilBulan/routes/web.php`
- `Route::delete('assignments/{id}', [MasterProfilBulanController::class, 'destroyAssignment'])->name('assignments.destroy');`  
  File: `app/Modules/MasterProfilBulan/routes/web.php`
- `Route::post('assignments/bulk-delete', [MasterProfilBulanController::class, 'bulkDestroyAssignments'])->name('assignments.bulk_destroy');`  
  File: `app/Modules/MasterProfilBulan/routes/web.php`
- `Route::get('assignments/{id}/overrides', [MasterProfilBulanController::class, 'overrideData'])->name('overrides.data');`  
  File: `app/Modules/MasterProfilBulan/routes/web.php`
- `Route::post('assignments/{id}/overrides', [MasterProfilBulanController::class, 'storeOverride'])->name('overrides.store');`  
  File: `app/Modules/MasterProfilBulan/routes/web.php`
- `Route::put('overrides/{id}', [MasterProfilBulanController::class, 'updateOverride'])->name('overrides.update');`  
  File: `app/Modules/MasterProfilBulan/routes/web.php`
- `Route::delete('overrides/{id}', [MasterProfilBulanController::class, 'destroyOverride'])->name('overrides.destroy');`  
  File: `app/Modules/MasterProfilBulan/routes/web.php`

## Controllers

- `app/Modules/MasterProfilBulan/Http/Controllers/MasterProfilBulanController.php`

## Models

- `app/Modules/MasterProfilBulan/Models/ExportGroupingOptionModel.php`
- `app/Modules/MasterProfilBulan/Models/KaryawanComponentOverrideModel.php`
- `app/Modules/MasterProfilBulan/Models/ProfilBulanKaryawanModel.php`
- `app/Modules/MasterProfilBulan/Models/ProfilBulanModel.php`

## Views

- `app/Modules/MasterProfilBulan/Resources/views/index.blade.php`

## Database / Migration

### `master_profil_bulans`
- Actions: `create`, `table`
- Columns: 15
  - `code:string`
  - `name:string`
  - `period_year:unsignedSmallInteger`
  - `period_month:unsignedTinyInteger`
  - `start_date:date`
  - `end_date:date`
  - `closing_date:date`
  - `status:enum`
  - `description:text`
  - `is_active:boolean`
  - `period_year:unique`
  - `leave_eligible_contract_no:unsignedTinyInteger`
  - `thr_prorate_enabled:boolean`
  - `payroll_settings:json`
  - `payroll_settings:dropColumn`
- Migrations:
  - `app/Modules/MasterProfilBulan/Database/migrations/2026_02_24_140000_create_master_profil_bulans_table.php`
  - `app/Modules/MasterProfilBulan/Database/migrations/2026_02_24_150000_add_contract_rules_to_master_profil_bulan_tables.php`
  - `app/Modules/MasterProfilBulan/Database/migrations/2026_03_26_170000_add_payroll_settings_to_master_profil_bulans_table.php`
### `master_profil_bulan_karyawans`
- Actions: `create`, `table`
- Columns: 29
  - `profil_bulan_id:foreignId`
  - `karyawan_id:foreignId`
  - `komponen_pendapatan_ids:json`
  - `komponen_potongan_ids:json`
  - `notes:text`
  - `is_active:boolean`
  - `profil_bulan_id:unique`
  - `contract_no:unsignedTinyInteger`
  - `contract_start_date:date`
  - `contract_end_date:date`
  - `contract_completed:boolean`
  - `annual_leave_eligible:boolean`
  - `thr_prorate_months:decimal`
  - `thr_prorate_factor:decimal`
  - `profil_jam_kerja_id:foreignId`
  - `profil_jam_kerja_id:dropConstrainedForeignId`
  - `profil_gaji_id:foreignId`
  - `profil_gaji_id:dropConstrainedForeignId`
  - `salary_cycle_type:string`
  - `salary_cycle_anchor_date:date`
  - `salary_cycle_anchor_date:dropColumn`
  - `salary_cycle_type:dropColumn`
  - `export_employee_group:string`
  - `export_area:string`
  - `export_project:string`
  - `payable_rule_id:unsignedBigInteger`
  - `payable_rule_id:index`
  - `payable_rule_id:dropIndex`
  - `payable_rule_id:dropColumn`
- Migrations:
  - `app/Modules/MasterProfilBulan/Database/migrations/2026_02_24_140100_create_master_profil_bulan_karyawans_table.php`
  - `app/Modules/MasterProfilBulan/Database/migrations/2026_02_24_150000_add_contract_rules_to_master_profil_bulan_tables.php`
  - `app/Modules/MasterProfilBulan/Database/migrations/2026_02_24_162000_add_profil_jam_kerja_id_to_master_profil_bulan_karyawans_table.php`
  - `app/Modules/MasterProfilBulan/Database/migrations/2026_02_24_163200_add_profil_gaji_id_to_master_profil_bulan_karyawans_table.php`
  - `app/Modules/MasterProfilBulan/Database/migrations/2026_02_26_140000_add_salary_cycle_to_master_profil_bulan_karyawans_table.php`
  - `app/Modules/MasterProfilBulan/Database/migrations/2026_03_27_120000_add_export_grouping_to_master_profil_bulan_karyawans_table.php`
  - `app/Modules/MasterProfilBulan/Database/migrations/2026_04_27_180000_create_payroll_payable_rules_table.php`
### `payroll_karyawan_component_overrides`
- Actions: `create`
- Columns: 15
  - `profil_bulan_karyawan_id:unsignedBigInteger`
  - `component_group:enum`
  - `komponen_pendapatan_id:unsignedBigInteger`
  - `komponen_potongan_id:unsignedBigInteger`
  - `calc_type:enum`
  - `amount:decimal`
  - `percent_value:decimal`
  - `percent_base:enum`
  - `effective_start:date`
  - `effective_end:date`
  - `notes:text`
  - `is_active:boolean`
  - `profil_bulan_karyawan_id:foreign`
  - `komponen_pendapatan_id:foreign`
  - `komponen_potongan_id:foreign`
- Migrations:
  - `app/Modules/MasterProfilBulan/Database/migrations/2026_02_24_164000_create_payroll_karyawan_component_overrides_table.php`
### `master_export_grouping_options`
- Actions: `create`
- Columns: 6
  - `option_type:string`
  - `label:string`
  - `sort_order:unsignedInteger`
  - `is_active:boolean`
  - `option_type:unique`
  - `option_type:index`
- Migrations:
  - `app/Modules/MasterProfilBulan/Database/migrations/2026_04_15_083000_create_master_export_grouping_options_table.php`
### `payroll_payable_rules`
- Actions: `create`
- Columns: 8
  - `code:string`
  - `name:string`
  - `min_effective_minutes:unsignedSmallInteger`
  - `credit_minutes:unsignedSmallInteger`
  - `credit_hk:decimal`
  - `days_of_week:json`
  - `notes:text`
  - `is_active:boolean`
- Migrations:
  - `app/Modules/MasterProfilBulan/Database/migrations/2026_04_27_180000_create_payroll_payable_rules_table.php`
