# Master Approval

- Module key: `MasterApproval`
- Category: `General`
- Path: `app/Modules/MasterApproval`

## Ringkasan

Master Approval berada di kategori General. Modul ini memiliki 13 definisi route, 1 controller, 4 model, dan 1 view. Database module terdeteksi pada tabel: `master_approval_flows`, `master_approval_flow_steps`, `approval_requests`, `approval_request_steps`.

## Flowchart

```mermaid
flowchart TD
    A[User / Operator] --> B[Menu Master Approval]
    B --> C[Routes: 13]
    C --> D[Controllers: 1]
    D --> E[Views: 1]
    D --> F[(Tables: 4<br/>master_approval_flows<br/>master_approval_flow_steps<br/>approval_requests<br/>approval_request_steps)]
    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/MasterApproval/routes/web.php`
- `Route::prefix('master-approval')->name('master_approval.')->group(function () {`  
  File: `app/Modules/MasterApproval/routes/web.php`
- `Route::get('/', [MasterApprovalController::class, 'index'])->name('index');`  
  File: `app/Modules/MasterApproval/routes/web.php`
- `Route::get('users', [MasterApprovalController::class, 'users'])->name('users');`  
  File: `app/Modules/MasterApproval/routes/web.php`
- `Route::get('departments', [MasterApprovalController::class, 'departments'])->name('departments');`  
  File: `app/Modules/MasterApproval/routes/web.php`
- `Route::get('flows', [MasterApprovalController::class, 'flowData'])->name('flows.data');`  
  File: `app/Modules/MasterApproval/routes/web.php`
- `Route::post('flows', [MasterApprovalController::class, 'storeFlow'])->name('flows.store');`  
  File: `app/Modules/MasterApproval/routes/web.php`
- `Route::put('flows/{id}', [MasterApprovalController::class, 'updateFlow'])->name('flows.update');`  
  File: `app/Modules/MasterApproval/routes/web.php`
- `Route::delete('flows/{id}', [MasterApprovalController::class, 'destroyFlow'])->name('flows.destroy');`  
  File: `app/Modules/MasterApproval/routes/web.php`
- `Route::get('flows/{flow_id}/steps', [MasterApprovalController::class, 'stepData'])->name('steps.data');`  
  File: `app/Modules/MasterApproval/routes/web.php`
- `Route::post('flows/{flow_id}/steps', [MasterApprovalController::class, 'storeStep'])->name('steps.store');`  
  File: `app/Modules/MasterApproval/routes/web.php`
- `Route::put('steps/{id}', [MasterApprovalController::class, 'updateStep'])->name('steps.update');`  
  File: `app/Modules/MasterApproval/routes/web.php`
- `Route::delete('steps/{id}', [MasterApprovalController::class, 'destroyStep'])->name('steps.destroy');`  
  File: `app/Modules/MasterApproval/routes/web.php`

## Controllers

- `app/Modules/MasterApproval/Http/Controllers/MasterApprovalController.php`

## Models

- `app/Modules/MasterApproval/Models/ApprovalFlowModel.php`
- `app/Modules/MasterApproval/Models/ApprovalFlowStepModel.php`
- `app/Modules/MasterApproval/Models/ApprovalRequestModel.php`
- `app/Modules/MasterApproval/Models/ApprovalRequestStepModel.php`

## Views

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

## Database / Migration

### `master_approval_flows`
- Actions: `create`
- Columns: 5
  - `code:string`
  - `name:string`
  - `module_key:string`
  - `description:text`
  - `is_active:boolean`
- Migrations:
  - `app/Modules/MasterApproval/Database/migrations/2026_02_24_180000_create_master_approval_flows_table.php`
### `master_approval_flow_steps`
- Actions: `create`, `table`
- Columns: 13
  - `flow_id:unsignedBigInteger`
  - `step_order:unsignedInteger`
  - `step_name:string`
  - `approver_user_id:unsignedBigInteger`
  - `is_required:boolean`
  - `is_active:boolean`
  - `flow_id:unique`
  - `flow_id:foreign`
  - `approver_user_id:foreign`
  - `approver_type:string`
  - `approver_department:string`
  - `approver_department:dropColumn`
  - `approver_type:dropColumn`
- Migrations:
  - `app/Modules/MasterApproval/Database/migrations/2026_02_24_180100_create_master_approval_flow_steps_table.php`
  - `app/Modules/MasterApproval/Database/migrations/2026_03_03_120000_add_approver_type_to_approval_steps_tables.php`
### `approval_requests`
- Actions: `create`
- Columns: 15
  - `flow_id:unsignedBigInteger`
  - `request_no:string`
  - `module_key:string`
  - `reference_type:string`
  - `reference_id:unsignedBigInteger`
  - `status:string`
  - `current_step_order:unsignedInteger`
  - `submitted_by:unsignedBigInteger`
  - `submitted_at:dateTime`
  - `final_approved_at:dateTime`
  - `rejected_at:dateTime`
  - `rejection_reason:text`
  - `module_key:index`
  - `flow_id:foreign`
  - `submitted_by:foreign`
- Migrations:
  - `app/Modules/MasterApproval/Database/migrations/2026_02_24_180200_create_approval_requests_table.php`
### `approval_request_steps`
- Actions: `create`, `table`
- Columns: 14
  - `approval_request_id:unsignedBigInteger`
  - `step_order:unsignedInteger`
  - `step_name:string`
  - `approver_user_id:unsignedBigInteger`
  - `status:string`
  - `action_notes:text`
  - `acted_at:dateTime`
  - `approval_request_id:unique`
  - `approval_request_id:foreign`
  - `approver_user_id:foreign`
  - `approver_type:string`
  - `approver_department:string`
  - `approver_department:dropColumn`
  - `approver_type:dropColumn`
- Migrations:
  - `app/Modules/MasterApproval/Database/migrations/2026_02_24_180300_create_approval_request_steps_table.php`
  - `app/Modules/MasterApproval/Database/migrations/2026_03_03_120000_add_approver_type_to_approval_steps_tables.php`
