# Database Migration Map

Generated at: 2026-04-28 17:07:09

## Ringkasan Tabel

| Table | Module | Columns | Migrations |
|---|---:|---:|---:|
| `accounting_accounts` | Accounting | 10 | 1 |
| `accounting_ap_payment_allocations` | Accounting | 5 | 1 |
| `accounting_ap_payments` | Accounting | 18 | 1 |
| `accounting_ar_payment_allocations` | Accounting | 5 | 1 |
| `accounting_ar_payments` | Accounting | 18 | 1 |
| `accounting_bank_reconciliation_items` | Accounting | 6 | 1 |
| `accounting_bank_reconciliations` | Accounting | 10 | 1 |
| `accounting_journal_lines` | Accounting | 14 | 1 |
| `accounting_journals` | Accounting | 14 | 1 |
| `announcements` | Core | 6 | 1 |
| `app_settings` | Core | 2 | 1 |
| `approval_request_steps` | MasterApproval | 14 | 2 |
| `approval_requests` | MasterApproval | 15 | 1 |
| `attendance_daily_review_histories` | AttendanceReview | 11 | 1 |
| `attendance_daily_reviews` | AttendanceReview | 22 | 1 |
| `attendance_export_jobs` | AttendanceReview | 14 | 1 |
| `attendance_logs` | AttendanceReview | 14 | 2 |
| `attendance_warning_letters` | AttendanceReview | 29 | 2 |
| `blocked_ips` | Core | 4 | 1 |
| `cache` | Core | 3 | 1 |
| `cache_locks` | Core | 3 | 1 |
| `dashboard_profiles` | Core | 6 | 1 |
| `default_modules_contoh` | DefaultModulesContoh | 4 | 1 |
| `departments` | Core | 3 | 1 |
| `failed_jobs` | Core | 6 | 1 |
| `job_batches` | Core | 10 | 1 |
| `jobs` | Core | 6 | 1 |
| `karyawan_area_histories` | MasterKaryawan | 8 | 1 |
| `leave_requests` | LeaveRequest | 21 | 2 |
| `master_approval_flow_steps` | MasterApproval | 13 | 2 |
| `master_approval_flows` | MasterApproval | 5 | 1 |
| `master_areas` | MasterArea | 8 | 3 |
| `master_barang_merge_logs` | MasterBarang | 7 | 1 |
| `master_barangs` | MasterBarang | 5 | 1 |
| `master_biayas` | MasterBiaya | 11 | 2 |
| `master_bom_items` | MasterProject | 8 | 1 |
| `master_bpjs` | MasterBpjs | 12 | 2 |
| `master_bpjs_ceiling_histories` | MasterBpjs | 11 | 2 |
| `master_bpjs_rate_histories` | MasterBpjs | 8 | 1 |
| `master_clients` | MasterClient | 7 | 1 |
| `master_export_grouping_options` | MasterProfilBulan | 6 | 1 |
| `master_gudangs` | MasterGudang | 6 | 1 |
| `master_jabatans` | MasterJabatan | 8 | 3 |
| `master_kalenders` | MasterKalender | 6 | 1 |
| `master_karyawan_bank_accounts` | MasterKaryawan | 9 | 1 |
| `master_karyawan_blacklists` | MasterBlacklistKaryawan | 15 | 1 |
| `master_karyawan_bpjs_profile_components` | MasterKaryawan | 5 | 1 |
| `master_karyawan_bpjs_profiles` | MasterKaryawan | 10 | 1 |
| `master_karyawan_finger_histories` | MasterKaryawan | 8 | 1 |
| `master_karyawan_signature_requests` | MasterKaryawan | 22 | 1 |
| `master_karyawans` | MasterKaryawan | 49 | 7 |
| `master_komponen_pendapatans` | MasterKomponenPendapatan | 6 | 1 |
| `master_komponen_potongans` | MasterKomponenPotongan | 8 | 2 |
| `master_material_request_items` | MasterProject | 16 | 3 |
| `master_material_requests` | MasterProject | 9 | 2 |
| `master_pajaks` | MasterPajak | 5 | 1 |
| `master_payments` | MasterPayment | 5 | 1 |
| `master_pembulatan_jams` | MasterPembulatanJam | 8 | 1 |
| `master_perkalian_jams` | MasterPerkalianJam | 9 | 1 |
| `master_profil_bulan_karyawans` | MasterProfilBulan | 29 | 7 |
| `master_profil_bulans` | MasterProfilBulan | 15 | 3 |
| `master_profil_gaji_details` | MasterProfilGaji | 14 | 1 |
| `master_profil_gajis` | MasterProfilGaji | 10 | 3 |
| `master_profil_jam_kerjas` | MasterProfilJamKerja | 15 | 3 |
| `master_project_progress_invoices` | MasterProject | 17 | 2 |
| `master_project_progress_schedules` | MasterProject | 19 | 2 |
| `master_project_quotation_items` | MasterProject | 7 | 1 |
| `master_project_quotations` | MasterProject | 9 | 1 |
| `master_project_stock_issue_items` | MasterProject | 15 | 1 |
| `master_project_stock_issues` | MasterProject | 11 | 1 |
| `master_project_stock_return_items` | MasterProject | 9 | 1 |
| `master_project_stock_returns` | MasterProject | 9 | 1 |
| `master_projects` | MasterProject | 20 | 5 |
| `master_purchase_order_deliveries` | MasterProject | 12 | 1 |
| `master_purchase_order_delivery_items` | MasterProject | 13 | 1 |
| `master_purchase_order_items` | MasterProject | 8 | 2 |
| `master_purchase_order_service_items` | MasterProject | 7 | 1 |
| `master_purchase_orders` | MasterProject | 24 | 4 |
| `master_rab_item_satuan_conversions` | MasterProject | 4 | 1 |
| `master_rab_items` | MasterProject | 24 | 6 |
| `master_rab_scopes` | MasterProject | 8 | 1 |
| `master_satuans` | MasterSatuan | 8 | 2 |
| `master_vendors` | MasterVendor | 7 | 1 |
| `master_warehouse_adjustment_items` | MasterProject | 14 | 1 |
| `master_warehouse_adjustments` | MasterProject | 8 | 1 |
| `master_warehouse_stock_movements` | MasterProject | 23 | 1 |
| `master_warehouse_transfer_items` | MasterProject | 13 | 1 |
| `master_warehouse_transfers` | MasterProject | 12 | 1 |
| `master_work_orders` | MasterProject | 6 | 1 |
| `menu_permissions` | Core | 3 | 1 |
| `menu_profiles` | Core | 3 | 1 |
| `menus` | Core | 10 | 2 |
| `module_libraries` | Core | 6 | 1 |
| `password_reset_tokens` | Core | 3 | 1 |
| `payroll_insentif_dinas_transactions` | InsentifDinas | 40 | 2 |
| `payroll_insentif_dinas_types` | InsentifDinas | 6 | 1 |
| `payroll_karyawan_component_overrides` | MasterProfilBulan | 15 | 1 |
| `payroll_payable_rules` | MasterProfilBulan | 8 | 1 |
| `payroll_payment_bpjs_details` | Penggajian | 21 | 2 |
| `payroll_payment_histories` | Penggajian | 37 | 2 |
| `payroll_reimbursement_requests` | Penggajian | 18 | 1 |
| `payroll_slip_profiles` | Penggajian | 16 | 2 |
| `permission_role` | Core | 3 | 1 |
| `permission_user` | Core | 3 | 1 |
| `permissions` | Core | 3 | 1 |
| `printer_devices` | Printer | 11 | 1 |
| `project_documents` | FieldExecution | 25 | 1 |
| `project_job_assignments` | ProjectJobCosting | 10 | 1 |
| `project_job_cost_rates` | ProjectJobCosting | 14 | 1 |
| `project_job_work_logs` | ProjectJobCosting | 15 | 1 |
| `project_jobs` | ProjectJobCosting | 8 | 1 |
| `project_site_report_attachments` | FieldExecution | 8 | 1 |
| `project_site_reports` | FieldExecution | 21 | 1 |
| `reimbursement_attachments` | ReimbursementRequest | 7 | 1 |
| `reimbursement_requests` | ReimbursementRequest | 16 | 1 |
| `request_action_histories` | Core | 10 | 1 |
| `role_user` | Core | 5 | 2 |
| `roles` | Core | 3 | 1 |
| `scheduled_tasks` | Core | 17 | 2 |
| `sessions` | Core | 6 | 1 |
| `subcontract_claims` | Subcontract | 21 | 1 |
| `subcontract_contracts` | Subcontract | 16 | 1 |
| `subcontract_payments` | Subcontract | 20 | 1 |
| `surat_perintah_lemburs` | SuratPerintahLembur | 39 | 4 |
| `tax_ebupots` | TaxCompliance | 19 | 1 |
| `tax_efakturs` | TaxCompliance | 17 | 1 |
| `tax_logs` | TaxCompliance | 13 | 1 |
| `thr_payment_histories` | Penggajian | 18 | 1 |
| `thr_request_details` | Penggajian | 19 | 1 |
| `thr_requests` | Penggajian | 18 | 1 |
| `users` | Core | 26 | 8 |
| `vendor_pricelists` | VendorPricelist | 13 | 1 |

## Detail Tabel

### `accounting_accounts`

- Module: Accounting
- Actions: `create`
- Migrations:
  - `app/Modules/Accounting/Database/migrations/2026_03_25_210000_create_accounting_tables.php`
- Columns:
  - `parent_id:unsignedBigInteger`
  - `code:string`
  - `name:string`
  - `type:string`
  - `normal_balance:string`
  - `is_cash_bank:boolean`
  - `is_active:boolean`
  - `created_by:unsignedBigInteger`
  - `updated_by:unsignedBigInteger`
  - `parent_id:foreign`
- Index/Foreign notes:
  - `foreign('parent_id')`

### `accounting_ap_payment_allocations`

- Module: Accounting
- Actions: `create`
- Migrations:
  - `app/Modules/Accounting/Database/migrations/2026_03_26_090000_create_accounting_ar_ap_tables.php`
- Columns:
  - `payment_id:foreignId`
  - `purchase_order_id:foreignId`
  - `amount_idr:decimal`
  - `payment_id:unique`
  - `purchase_order_id:index`
- Index/Foreign notes:
  - `foreignId('payment_id')`
  - `foreignId('purchase_order_id')`
  - `unique(['payment_id', 'purchase_order_id'], 'ap_alloc_uq_pay_po')`
  - `index(['purchase_order_id'], 'ap_alloc_po_idx')`

### `accounting_ap_payments`

- Module: Accounting
- Actions: `create`
- Migrations:
  - `app/Modules/Accounting/Database/migrations/2026_03_26_090000_create_accounting_ar_ap_tables.php`
- Columns:
  - `vendor_id:foreignId`
  - `pay_date:date`
  - `method:string`
  - `bank_account_id:foreignId`
  - `ap_account_id:foreignId`
  - `amount_idr:decimal`
  - `reference_number:string`
  - `notes:text`
  - `status:string`
  - `journal_id:unsignedBigInteger`
  - `created_by:unsignedBigInteger`
  - `updated_by:unsignedBigInteger`
  - `posted_at:timestamp`
  - `posted_by:unsignedBigInteger`
  - `void_at:timestamp`
  - `void_by:unsignedBigInteger`
  - `vendor_id:index`
  - `status:index`
- Index/Foreign notes:
  - `foreignId('vendor_id')`
  - `foreignId('bank_account_id')`
  - `foreignId('ap_account_id')`
  - `index(['vendor_id', 'pay_date'])`
  - `index(['status'])`

### `accounting_ar_payment_allocations`

- Module: Accounting
- Actions: `create`
- Migrations:
  - `app/Modules/Accounting/Database/migrations/2026_03_26_090000_create_accounting_ar_ap_tables.php`
- Columns:
  - `payment_id:foreignId`
  - `invoice_id:foreignId`
  - `amount_idr:decimal`
  - `payment_id:unique`
  - `invoice_id:index`
- Index/Foreign notes:
  - `foreignId('payment_id')`
  - `foreignId('invoice_id')`
  - `unique(['payment_id', 'invoice_id'], 'ar_alloc_uq_pay_inv')`
  - `index(['invoice_id'], 'ar_alloc_inv_idx')`

### `accounting_ar_payments`

- Module: Accounting
- Actions: `create`
- Migrations:
  - `app/Modules/Accounting/Database/migrations/2026_03_26_090000_create_accounting_ar_ap_tables.php`
- Columns:
  - `client_id:foreignId`
  - `pay_date:date`
  - `method:string`
  - `bank_account_id:foreignId`
  - `ar_account_id:foreignId`
  - `amount_idr:decimal`
  - `reference_number:string`
  - `notes:text`
  - `status:string`
  - `journal_id:unsignedBigInteger`
  - `created_by:unsignedBigInteger`
  - `updated_by:unsignedBigInteger`
  - `posted_at:timestamp`
  - `posted_by:unsignedBigInteger`
  - `void_at:timestamp`
  - `void_by:unsignedBigInteger`
  - `client_id:index`
  - `status:index`
- Index/Foreign notes:
  - `foreignId('client_id')`
  - `foreignId('bank_account_id')`
  - `foreignId('ar_account_id')`
  - `index(['client_id', 'pay_date'])`
  - `index(['status'])`

### `accounting_bank_reconciliation_items`

- Module: Accounting
- Actions: `create`
- Migrations:
  - `app/Modules/Accounting/Database/migrations/2026_03_26_090000_create_accounting_ar_ap_tables.php`
- Columns:
  - `reconciliation_id:foreignId`
  - `journal_line_id:foreignId`
  - `cleared_at:timestamp`
  - `note:string`
  - `reconciliation_id:unique`
  - `journal_line_id:index`
- Index/Foreign notes:
  - `foreignId('reconciliation_id')`
  - `foreignId('journal_line_id')`
  - `unique(['reconciliation_id', 'journal_line_id'], 'recon_item_uq_rec_line')`
  - `index(['journal_line_id'], 'recon_item_line_idx')`

### `accounting_bank_reconciliations`

- Module: Accounting
- Actions: `create`
- Migrations:
  - `app/Modules/Accounting/Database/migrations/2026_03_26_090000_create_accounting_ar_ap_tables.php`
- Columns:
  - `bank_account_id:foreignId`
  - `period_from:date`
  - `period_to:date`
  - `opening_balance:decimal`
  - `closing_balance:decimal`
  - `status:string`
  - `notes:text`
  - `created_by:unsignedBigInteger`
  - `updated_by:unsignedBigInteger`
  - `bank_account_id:index`
- Index/Foreign notes:
  - `foreignId('bank_account_id')`
  - `index(['bank_account_id', 'period_from', 'period_to'], 'recon_bank_period_idx')`

### `accounting_journal_lines`

- Module: Accounting
- Actions: `create`, `table`
- Migrations:
  - `app/Modules/Accounting/Database/migrations/2026_03_25_210000_create_accounting_tables.php`
- Columns:
  - `journal_id:unsignedBigInteger`
  - `account_id:unsignedBigInteger`
  - `description:string`
  - `debit:decimal`
  - `credit:decimal`
  - `project_id:unsignedBigInteger`
  - `reference_type:string`
  - `reference_id:unsignedBigInteger`
  - `reference_number:string`
  - `journal_id:foreign`
  - `account_id:foreign`
  - `account_id:index`
  - `project_id:index`
  - `reference_type:index`
- Index/Foreign notes:
  - `foreign('journal_id')`
  - `foreign('account_id')`
  - `index(['account_id', 'journal_id'])`
  - `index(['project_id'])`
  - `index(['reference_type', 'reference_id'])`

### `accounting_journals`

- Module: Accounting
- Actions: `create`
- Migrations:
  - `app/Modules/Accounting/Database/migrations/2026_03_25_210000_create_accounting_tables.php`
- Columns:
  - `journal_number:string`
  - `journal_date:date`
  - `source:string`
  - `status:string`
  - `currency:string`
  - `description:string`
  - `total_debit:decimal`
  - `total_credit:decimal`
  - `created_by:unsignedBigInteger`
  - `updated_by:unsignedBigInteger`
  - `posted_at:timestamp`
  - `posted_by:unsignedBigInteger`
  - `void_at:timestamp`
  - `void_by:unsignedBigInteger`

### `announcements`

- Module: Core
- Actions: `create`
- Migrations:
  - `database/migrations/2026_02_12_180000_create_announcements_table.php`
- Columns:
  - `title:string`
  - `message:text`
  - `department:string`
  - `start_at:dateTime`
  - `end_at:dateTime`
  - `is_active:boolean`

### `app_settings`

- Module: Core
- Actions: `create`
- Migrations:
  - `database/migrations/2026_02_12_170000_create_app_settings_table.php`
- Columns:
  - `key:string`
  - `value:text`

### `approval_request_steps`

- Module: MasterApproval
- Actions: `create`, `table`
- 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`
- Columns:
  - `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`
- Index/Foreign notes:
  - `unique(['approval_request_id', 'step_order'], 'approval_req_step_unique')`
  - `foreign('approval_request_id', 'approval_req_step_req_fk')`
  - `foreign('approver_user_id', 'approval_req_step_user_fk')`

### `approval_requests`

- Module: MasterApproval
- Actions: `create`
- Migrations:
  - `app/Modules/MasterApproval/Database/migrations/2026_02_24_180200_create_approval_requests_table.php`
- Columns:
  - `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`
- Index/Foreign notes:
  - `index(['module_key', 'reference_id'], 'approval_req_module_ref_idx')`
  - `foreign('flow_id', 'approval_req_flow_fk')`
  - `foreign('submitted_by', 'approval_req_submitter_fk')`

### `attendance_daily_review_histories`

- Module: AttendanceReview
- Actions: `create`
- Migrations:
  - `app/Modules/AttendanceReview/Database/migrations/2026_02_24_170300_create_attendance_daily_review_histories_table.php`
- Columns:
  - `attendance_daily_review_id:unsignedBigInteger`
  - `action:string`
  - `before_data:json`
  - `after_data:json`
  - `notes:text`
  - `changed_by:unsignedBigInteger`
  - `changed_at:dateTime`
  - `attendance_daily_review_id:index`
  - `action:index`
  - `attendance_daily_review_id:foreign`
  - `changed_by:foreign`
- Index/Foreign notes:
  - `index(['attendance_daily_review_id', 'changed_at'], 'att_review_hist_review_changed_idx')`
  - `index('action', 'att_review_hist_action_idx')`
  - `foreign('attendance_daily_review_id', 'att_review_hist_review_fk')`
  - `foreign('changed_by', 'att_review_hist_user_fk')`

### `attendance_daily_reviews`

- Module: AttendanceReview
- Actions: `create`
- Migrations:
  - `app/Modules/AttendanceReview/Database/migrations/2026_02_24_170100_create_attendance_daily_reviews_table.php`
- Columns:
  - `profil_bulan_id:unsignedBigInteger`
  - `karyawan_id:unsignedBigInteger`
  - `work_date:date`
  - `planned_profil_jam_kerja_id:unsignedBigInteger`
  - `planned_shift_start:dateTime`
  - `planned_shift_end:dateTime`
  - `is_cross_day:boolean`
  - `checkin_at:dateTime`
  - `checkout_at:dateTime`
  - `suggested_checkin_at:dateTime`
  - `suggested_checkout_at:dateTime`
  - `status:enum`
  - `confidence_score:decimal`
  - `reason:text`
  - `is_approved:boolean`
  - `approved_by:unsignedBigInteger`
  - `approved_at:dateTime`
  - `profil_bulan_id:unique`
  - `profil_bulan_id:foreign`
  - `karyawan_id:foreign`
  - `planned_profil_jam_kerja_id:foreign`
  - `approved_by:foreign`
- Index/Foreign notes:
  - `unique(['profil_bulan_id', 'karyawan_id', 'work_date'], 'att_daily_unique')`
  - `foreign('profil_bulan_id', 'att_daily_pb_fk')`
  - `foreign('karyawan_id', 'att_daily_kry_fk')`
  - `foreign('planned_profil_jam_kerja_id', 'att_daily_pjk_fk')`
  - `foreign('approved_by', 'att_daily_user_fk')`

### `attendance_export_jobs`

- Module: AttendanceReview
- Actions: `create`
- Migrations:
  - `app/Modules/AttendanceReview/Database/migrations/2026_02_26_230000_create_attendance_export_jobs_table.php`
- Columns:
  - `request_no:string`
  - `user_id:unsignedBigInteger`
  - `profil_bulan_id:unsignedBigInteger`
  - `filters:json`
  - `status:string`
  - `total_users:unsignedInteger`
  - `processed_users:unsignedInteger`
  - `zip_path:string`
  - `error_message:text`
  - `started_at:timestamp`
  - `finished_at:timestamp`
  - `status:index`
  - `profil_bulan_id:foreign`
  - `user_id:foreign`
- Index/Foreign notes:
  - `index(['status', 'created_at'], 'attendance_export_jobs_status_created_idx')`
  - `foreign('profil_bulan_id', 'attendance_export_jobs_profil_fk')`
  - `foreign('user_id', 'attendance_export_jobs_user_fk')`

### `attendance_logs`

- Module: AttendanceReview
- Actions: `create`, `table`
- Migrations:
  - `app/Modules/AttendanceReview/Database/migrations/2026_02_24_170000_create_attendance_logs_table.php`
  - `app/Modules/AttendanceReview/Database/migrations/2026_02_26_120100_add_finger_id_to_attendance_logs_table.php`
- Columns:
  - `karyawan_id:foreignId`
  - `employee_code:string`
  - `log_at:dateTime`
  - `log_type:enum`
  - `source:string`
  - `device_code:string`
  - `notes:text`
  - `is_active:boolean`
  - `karyawan_id:index`
  - `employee_code:index`
  - `finger_id:string`
  - `finger_id:index`
  - `att_logs_finger_logat_idx:dropIndex`
  - `finger_id:dropColumn`
- Index/Foreign notes:
  - `foreignId('karyawan_id')`
  - `index(['karyawan_id', 'log_at'], 'att_logs_karyawan_logat_idx')`
  - `index(['employee_code', 'log_at'], 'att_logs_empcode_logat_idx')`
  - `index(['finger_id', 'log_at'], 'att_logs_finger_logat_idx')`

### `attendance_warning_letters`

- Module: AttendanceReview
- Actions: `create`, `table`
- Migrations:
  - `app/Modules/AttendanceReview/Database/migrations/2026_03_10_090000_create_attendance_warning_letters_table.php`
  - `app/Modules/AttendanceReview/Database/migrations/2026_03_10_235500_add_validity_to_attendance_warning_letters_table.php`
- Columns:
  - `profil_bulan_id:unsignedBigInteger`
  - `karyawan_id:unsignedBigInteger`
  - `sp_level:unsignedTinyInteger`
  - `letter_no:string`
  - `period_start:date`
  - `period_end:date`
  - `alpha_count:unsignedInteger`
  - `telat_count:unsignedInteger`
  - `violation_score:unsignedInteger`
  - `payload:json`
  - `notes:text`
  - `status:string`
  - `issued_by:unsignedBigInteger`
  - `issued_at:timestamp`
  - `revoked_by:unsignedBigInteger`
  - `revoked_at:timestamp`
  - `revoke_reason:text`
  - `profil_bulan_id:unique`
  - `karyawan_id:index`
  - `status:index`
  - `letter_no:index`
  - `profil_bulan_id:foreign`
  - `karyawan_id:foreign`
  - `issued_by:foreign`
  - `revoked_by:foreign`
  - `valid_days:unsignedSmallInteger`
  - `valid_until:date`
  - `valid_until:dropColumn`
  - `valid_days:dropColumn`
- Index/Foreign notes:
  - `unique(['profil_bulan_id', 'karyawan_id'], 'att_warn_unique_period_employee')`
  - `index(['karyawan_id', 'sp_level'], 'att_warn_employee_level_idx')`
  - `index(['status', 'issued_at'], 'att_warn_status_issued_idx')`
  - `index('letter_no', 'att_warn_letter_no_idx')`
  - `foreign('profil_bulan_id', 'att_warn_profil_fk')`
  - `foreign('karyawan_id', 'att_warn_karyawan_fk')`
  - `foreign('issued_by', 'att_warn_issued_by_fk')`
  - `foreign('revoked_by', 'att_warn_revoked_by_fk')`

### `blocked_ips`

- Module: Core
- Actions: `create`
- Migrations:
  - `database/migrations/2026_02_11_230000_create_blocked_ips_table.php`
- Columns:
  - `ip_address:string`
  - `reason:string`
  - `is_active:boolean`
  - `created_by:foreignId`
- Index/Foreign notes:
  - `foreignId('created_by')`

### `cache`

- Module: Core
- Actions: `create`
- Migrations:
  - `database/migrations/0001_01_01_000001_create_cache_table.php`
- Columns:
  - `key:string`
  - `value:mediumText`
  - `expiration:integer`

### `cache_locks`

- Module: Core
- Actions: `create`
- Migrations:
  - `database/migrations/0001_01_01_000001_create_cache_table.php`
- Columns:
  - `key:string`
  - `owner:string`
  - `expiration:integer`

### `dashboard_profiles`

- Module: Core
- Actions: `create`
- Migrations:
  - `database/migrations/2026_02_12_231000_create_dashboard_profiles_table.php`
- Columns:
  - `name:string`
  - `scope:string`
  - `scope_value:string`
  - `config:json`
  - `is_active:boolean`
  - `scope:unique`
- Index/Foreign notes:
  - `unique(['scope', 'scope_value'])`

### `default_modules_contoh`

- Module: DefaultModulesContoh
- Actions: `create`
- Migrations:
  - `app/Modules/DefaultModulesContoh/Database/migrations/2026_02_19_000001_create_default_modules_contoh_table.php`
- Columns:
  - `name:string`
  - `code:string`
  - `description:text`
  - `is_active:boolean`

### `departments`

- Module: Core
- Actions: `create`
- Migrations:
  - `database/migrations/2026_02_12_120000_create_departments_table.php`
- Columns:
  - `name:string`
  - `slug:string`
  - `is_active:boolean`

### `failed_jobs`

- Module: Core
- Actions: `create`
- Migrations:
  - `database/migrations/0001_01_01_000002_create_jobs_table.php`
- Columns:
  - `uuid:string`
  - `connection:text`
  - `queue:text`
  - `payload:longText`
  - `exception:longText`
  - `failed_at:timestamp`

### `job_batches`

- Module: Core
- Actions: `create`
- Migrations:
  - `database/migrations/0001_01_01_000002_create_jobs_table.php`
- Columns:
  - `id:string`
  - `name:string`
  - `total_jobs:integer`
  - `pending_jobs:integer`
  - `failed_jobs:integer`
  - `failed_job_ids:longText`
  - `options:mediumText`
  - `cancelled_at:integer`
  - `created_at:integer`
  - `finished_at:integer`

### `jobs`

- Module: Core
- Actions: `create`
- Migrations:
  - `database/migrations/0001_01_01_000002_create_jobs_table.php`
- Columns:
  - `queue:string`
  - `payload:longText`
  - `attempts:unsignedTinyInteger`
  - `reserved_at:unsignedInteger`
  - `available_at:unsignedInteger`
  - `created_at:unsignedInteger`

### `karyawan_area_histories`

- Module: MasterKaryawan
- Actions: `create`
- Migrations:
  - `app/Modules/MasterKaryawan/Database/migrations/2026_04_20_091000_add_area_id_and_create_karyawan_area_histories_table.php`
- Columns:
  - `karyawan_id:foreignId`
  - `area_id:foreignId`
  - `area_label:string`
  - `effective_start_date:date`
  - `effective_end_date:date`
  - `notes:text`
  - `is_current:boolean`
  - `karyawan_id:index`
- Index/Foreign notes:
  - `foreignId('karyawan_id')`
  - `foreignId('area_id')`
  - `index(['karyawan_id', 'effective_start_date'], 'karyawan_area_histories_karyawan_start_idx')`
  - `index(['karyawan_id', 'is_current'], 'karyawan_area_histories_karyawan_current_idx')`

### `leave_requests`

- Module: LeaveRequest
- Actions: `create`, `table`
- Migrations:
  - `app/Modules/LeaveRequest/Database/migrations/2026_02_24_180500_create_leave_requests_table.php`
  - `app/Modules/LeaveRequest/Database/migrations/2026_02_24_181000_add_attachment_columns_to_leave_requests_table.php`
- Columns:
  - `request_no:string`
  - `karyawan_id:unsignedBigInteger`
  - `approval_flow_id:unsignedBigInteger`
  - `approval_request_id:unsignedBigInteger`
  - `leave_type:string`
  - `start_date:date`
  - `end_date:date`
  - `total_days:decimal`
  - `reason:text`
  - `status:string`
  - `created_by:unsignedBigInteger`
  - `is_active:boolean`
  - `karyawan_id:foreign`
  - `approval_flow_id:foreign`
  - `approval_request_id:foreign`
  - `created_by:foreign`
  - `start_date:index`
  - `attachment_path:string`
  - `attachment_name:string`
  - `attachment_name:dropColumn`
  - `attachment_path:dropColumn`
- Index/Foreign notes:
  - `foreign('karyawan_id', 'leave_karyawan_fk')`
  - `foreign('approval_flow_id', 'leave_flow_fk')`
  - `foreign('approval_request_id', 'leave_req_fk')`
  - `foreign('created_by', 'leave_creator_fk')`
  - `index(['start_date', 'end_date', 'status'], 'leave_date_status_idx')`

### `master_approval_flow_steps`

- Module: MasterApproval
- Actions: `create`, `table`
- 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`
- Columns:
  - `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`
- Index/Foreign notes:
  - `unique(['flow_id', 'step_order'], 'approval_flow_step_unique')`
  - `foreign('flow_id', 'approval_step_flow_fk')`
  - `foreign('approver_user_id', 'approval_step_user_fk')`

### `master_approval_flows`

- Module: MasterApproval
- Actions: `create`
- Migrations:
  - `app/Modules/MasterApproval/Database/migrations/2026_02_24_180000_create_master_approval_flows_table.php`
- Columns:
  - `code:string`
  - `name:string`
  - `module_key:string`
  - `description:text`
  - `is_active:boolean`

### `master_areas`

- Module: MasterArea
- Actions: `create`, `table`
- Migrations:
  - `app/Modules/MasterArea/Database/migrations/2026_02_19_100100_create_master_areas_table.php`
  - `app/Modules/MasterArea/Database/migrations/2026_04_20_090000_add_parent_id_to_master_areas_table.php`
  - `app/Modules/MasterArea/Database/migrations/2026_04_20_092000_add_client_id_to_master_areas_table.php`
- Columns:
  - `code:string`
  - `name:string`
  - `description:text`
  - `is_active:boolean`
  - `parent_id:foreignId`
  - `parent_id:dropConstrainedForeignId`
  - `client_id:foreignId`
  - `client_id:dropConstrainedForeignId`
- Index/Foreign notes:
  - `foreignId('parent_id')`
  - `foreignId('client_id')`

### `master_barang_merge_logs`

- Module: MasterBarang
- Actions: `create`
- Migrations:
  - `app/Modules/MasterBarang/Database/migrations/2026_03_25_180000_create_master_barang_merge_logs_table.php`
- Columns:
  - `source_barang_id:foreignId`
  - `source_barang_id:foreign`
  - `target_barang_id:foreignId`
  - `target_barang_id:foreign`
  - `merged_by:unsignedBigInteger`
  - `summary_json:json`
  - `notes:text`
- Index/Foreign notes:
  - `foreignId('source_barang_id')`
  - `foreign('source_barang_id', 'm_brg_merge_src_fk')`
  - `foreignId('target_barang_id')`
  - `foreign('target_barang_id', 'm_brg_merge_tgt_fk')`

### `master_barangs`

- Module: MasterBarang
- Actions: `create`
- Migrations:
  - `app/Modules/MasterBarang/Database/migrations/2026_02_19_191000_create_master_barangs_table.php`
- Columns:
  - `code:string`
  - `name:string`
  - `default_satuan_id:foreignId`
  - `description:text`
  - `is_active:boolean`
- Index/Foreign notes:
  - `foreignId('default_satuan_id')`

### `master_biayas`

- Module: MasterBiaya
- Actions: `create`, `table`
- Migrations:
  - `app/Modules/MasterBiaya/Database/migrations/2026_02_19_210000_create_master_biayas_table.php`
  - `app/Modules/MasterBiaya/Database/migrations/2026_03_25_220000_add_account_id_to_master_biayas_table.php`
- Columns:
  - `name:string`
  - `kode_coa:string`
  - `description:text`
  - `is_active:boolean`
  - `name:index`
  - `kode_coa:index`
  - `account_id:unsignedBigInteger`
  - `account_id:index`
  - `account_id:foreign`
  - `mbiaya_account_id_fk:dropForeign`
  - `account_id:dropColumn`
- Index/Foreign notes:
  - `index('name')`
  - `index('kode_coa')`
  - `index('account_id')`
  - `foreign('account_id', 'mbiaya_account_id_fk')`

### `master_bom_items`

- Module: MasterProject
- Actions: `create`
- Migrations:
  - `app/Modules/MasterProject/Database/migrations/2026_02_19_100000_create_master_project_tables.php`
- Columns:
  - `rab_item_id:foreignId`
  - `material_code:string`
  - `material_name:string`
  - `qty:decimal`
  - `unit:string`
  - `notes:text`
  - `is_active:boolean`
  - `rab_item_id:unique`
- Index/Foreign notes:
  - `foreignId('rab_item_id')`
  - `unique(['rab_item_id', 'material_code'])`

### `master_bpjs`

- Module: MasterBpjs
- Actions: `create`, `table`
- Migrations:
  - `app/Modules/MasterBpjs/Database/migrations/2026_02_24_100200_create_master_bpjs_table.php`
  - `app/Modules/MasterBpjs/Database/migrations/2026_04_21_160000_add_rule_columns_to_master_bpjs_table.php`
- Columns:
  - `code:string`
  - `name:string`
  - `bpjs_type:enum`
  - `rate_company_percent:decimal`
  - `rate_employee_percent:decimal`
  - `description:text`
  - `is_active:boolean`
  - `component_code:string`
  - `basis_type:enum`
  - `uses_ceiling:boolean`
  - `default_enrollment_mode:enum`
  - `display_order:unsignedInteger`

### `master_bpjs_ceiling_histories`

- Module: MasterBpjs
- Actions: `create`, `table`
- Migrations:
  - `app/Modules/MasterBpjs/Database/migrations/2026_04_21_161000_create_master_bpjs_ceiling_histories_table.php`
  - `app/Modules/MasterBpjs/Database/migrations/2026_04_24_150000_add_min_max_to_master_bpjs_ceiling_histories_table.php`
- Columns:
  - `bpjs_id:foreignId`
  - `effective_start:date`
  - `effective_end:date`
  - `ceiling_nominal:decimal`
  - `notes:text`
  - `is_active:boolean`
  - `bpjs_id:index`
  - `ceiling_min_nominal:decimal`
  - `ceiling_max_nominal:decimal`
  - `ceiling_max_nominal:dropColumn`
  - `ceiling_min_nominal:dropColumn`
- Index/Foreign notes:
  - `foreignId('bpjs_id')`
  - `index(['bpjs_id', 'effective_start'], 'idx_bpjs_ceiling_start')`

### `master_bpjs_rate_histories`

- Module: MasterBpjs
- Actions: `create`
- Migrations:
  - `app/Modules/MasterBpjs/Database/migrations/2026_03_06_130000_create_master_bpjs_rate_histories_table.php`
- Columns:
  - `bpjs_id:foreignId`
  - `effective_start:date`
  - `effective_end:date`
  - `rate_company_percent:decimal`
  - `rate_employee_percent:decimal`
  - `notes:text`
  - `is_active:boolean`
  - `bpjs_id:index`
- Index/Foreign notes:
  - `foreignId('bpjs_id')`
  - `index(['bpjs_id', 'effective_start'], 'idx_bpjs_rate_start')`

### `master_clients`

- Module: MasterClient
- Actions: `create`
- Migrations:
  - `app/Modules/MasterClient/Database/migrations/2026_02_19_100300_create_master_clients_table.php`
- Columns:
  - `code:string`
  - `name:string`
  - `contact_person:string`
  - `phone:string`
  - `email:string`
  - `address:text`
  - `is_active:boolean`

### `master_export_grouping_options`

- Module: MasterProfilBulan
- Actions: `create`
- Migrations:
  - `app/Modules/MasterProfilBulan/Database/migrations/2026_04_15_083000_create_master_export_grouping_options_table.php`
- Columns:
  - `option_type:string`
  - `label:string`
  - `sort_order:unsignedInteger`
  - `is_active:boolean`
  - `option_type:unique`
  - `option_type:index`
- Index/Foreign notes:
  - `unique(['option_type', 'label'], 'mego_type_label_unique')`
  - `index(['option_type', 'is_active', 'sort_order'], 'mego_type_active_sort_idx')`

### `master_gudangs`

- Module: MasterGudang
- Actions: `create`
- Migrations:
  - `app/Modules/MasterGudang/Database/migrations/2026_02_24_100000_create_master_gudangs_table.php`
- Columns:
  - `code:string`
  - `name:string`
  - `warehouse_type:enum`
  - `address:string`
  - `description:text`
  - `is_active:boolean`

### `master_jabatans`

- Module: MasterJabatan
- Actions: `create`, `table`
- Migrations:
  - `app/Modules/MasterJabatan/Database/migrations/2026_02_19_100500_create_master_jabatans_table.php`
  - `app/Modules/MasterJabatan/Database/migrations/2026_02_19_110000_add_parent_id_to_master_jabatans_table.php`
  - `app/Modules/MasterJabatan/Database/migrations/2026_02_19_111000_add_sort_order_to_master_jabatans_table.php`
- Columns:
  - `code:string`
  - `name:string`
  - `description:text`
  - `is_active:boolean`
  - `parent_id:foreignId`
  - `parent_id:dropConstrainedForeignId`
  - `sort_order:unsignedInteger`
  - `sort_order:dropColumn`
- Index/Foreign notes:
  - `foreignId('parent_id')`

### `master_kalenders`

- Module: MasterKalender
- Actions: `create`
- Migrations:
  - `app/Modules/MasterKalender/Database/migrations/2026_02_19_100700_create_master_kalenders_table.php`
- Columns:
  - `name:string`
  - `event_type:enum`
  - `start_date:date`
  - `end_date:date`
  - `description:text`
  - `is_active:boolean`

### `master_karyawan_bank_accounts`

- Module: MasterKaryawan
- Actions: `create`
- Migrations:
  - `app/Modules/MasterKaryawan/Database/migrations/2026_03_03_100000_create_master_karyawan_bank_accounts_table.php`
- Columns:
  - `karyawan_id:foreignId`
  - `bank_name:string`
  - `account_no:string`
  - `account_name:string`
  - `branch_name:string`
  - `currency_code:string`
  - `is_default:boolean`
  - `is_active:boolean`
  - `karyawan_id:index`
- Index/Foreign notes:
  - `foreignId('karyawan_id')`
  - `index(['karyawan_id', 'is_active'], 'kba_karyawan_active_idx')`

### `master_karyawan_blacklists`

- Module: MasterBlacklistKaryawan
- Actions: `create`
- Migrations:
  - `app/Modules/MasterBlacklistKaryawan/Database/migrations/2026_03_27_000001_create_master_karyawan_blacklists_table.php`
- Columns:
  - `employee_code:string`
  - `finger_id:string`
  - `nik:string`
  - `full_name:string`
  - `ktp_no:string`
  - `npwp:string`
  - `phone:string`
  - `email:string`
  - `address:text`
  - `reason:text`
  - `source:string`
  - `blacklisted_at:date`
  - `expires_at:date`
  - `is_active:boolean`
  - `created_by:unsignedBigInteger`

### `master_karyawan_bpjs_profile_components`

- Module: MasterKaryawan
- Actions: `create`
- Migrations:
  - `app/Modules/MasterKaryawan/Database/migrations/2026_04_21_164000_create_master_karyawan_bpjs_profile_components_table.php`
- Columns:
  - `profile_id:foreignId`
  - `bpjs_id:foreignId`
  - `is_enrolled:boolean`
  - `notes:text`
  - `profile_id:unique`
- Index/Foreign notes:
  - `foreignId('profile_id')`
  - `foreignId('bpjs_id')`
  - `unique(['profile_id', 'bpjs_id'], 'uniq_karyawan_bpjs_profile_component')`

### `master_karyawan_bpjs_profiles`

- Module: MasterKaryawan
- Actions: `create`
- Migrations:
  - `app/Modules/MasterKaryawan/Database/migrations/2026_04_21_163000_create_master_karyawan_bpjs_profiles_table.php`
- Columns:
  - `karyawan_id:foreignId`
  - `profile_name:string`
  - `effective_start:date`
  - `effective_end:date`
  - `basis_general_nominal:decimal`
  - `basis_jp_nominal:decimal`
  - `basis_health_nominal:decimal`
  - `notes:text`
  - `is_active:boolean`
  - `karyawan_id:index`
- Index/Foreign notes:
  - `foreignId('karyawan_id')`
  - `index(['karyawan_id', 'effective_start'], 'idx_karyawan_bpjs_profile_start')`

### `master_karyawan_finger_histories`

- Module: MasterKaryawan
- Actions: `create`
- Migrations:
  - `app/Modules/MasterKaryawan/Database/migrations/2026_02_26_120200_create_master_karyawan_finger_histories_table.php`
- Columns:
  - `karyawan_id:foreignId`
  - `finger_id:string`
  - `effective_start:date`
  - `effective_end:date`
  - `change_reason:string`
  - `is_active:boolean`
  - `finger_id:index`
  - `karyawan_id:index`
- Index/Foreign notes:
  - `foreignId('karyawan_id')`
  - `index(['finger_id', 'effective_start', 'effective_end'], 'kry_finger_hist_lookup_idx')`
  - `index(['karyawan_id', 'effective_start'], 'kry_finger_hist_karyawan_idx')`

### `master_karyawan_signature_requests`

- Module: MasterKaryawan
- Actions: `create`
- Migrations:
  - `app/Modules/MasterKaryawan/Database/migrations/2026_04_20_230000_create_master_karyawan_signature_requests_table.php`
- Columns:
  - `karyawan_id:unsignedBigInteger`
  - `request_type:string`
  - `reference_type:string`
  - `reference_id:unsignedBigInteger`
  - `title:string`
  - `token:string`
  - `status:string`
  - `payload:json`
  - `expires_at:timestamp`
  - `opened_at:timestamp`
  - `signed_at:timestamp`
  - `signer_name:string`
  - `signer_email:string`
  - `signer_phone:string`
  - `signature_path:string`
  - `signature_mime_type:string`
  - `signature_file_size:unsignedInteger`
  - `acknowledged:boolean`
  - `signed_ip:string`
  - `signed_user_agent:string`
  - `created_by:unsignedBigInteger`
  - `is_active:boolean`

### `master_karyawans`

- Module: MasterKaryawan
- Actions: `create`, `table`
- Migrations:
  - `app/Modules/MasterKaryawan/Database/migrations/2026_02_24_130000_create_master_karyawans_table.php`
  - `app/Modules/MasterKaryawan/Database/migrations/2026_02_26_120000_add_finger_id_to_master_karyawans_table.php`
  - `app/Modules/MasterKaryawan/Database/migrations/2026_03_03_100300_add_npwp_to_master_karyawans_table.php`
  - `app/Modules/MasterKaryawan/Database/migrations/2026_03_05_170000_add_hr_fields_to_master_karyawans_table.php`
  - `app/Modules/MasterKaryawan/Database/migrations/2026_04_17_180000_add_hr_profile_fields_to_master_karyawans_table.php`
  - `app/Modules/MasterKaryawan/Database/migrations/2026_04_20_091000_add_area_id_and_create_karyawan_area_histories_table.php`
  - `app/Modules/MasterKaryawan/Database/migrations/2026_04_20_150000_add_ktp_address_fields_to_master_karyawans_table.php`
- Columns:
  - `employee_code:string`
  - `full_name:string`
  - `gender:enum`
  - `birth_date:date`
  - `hire_date:date`
  - `employment_status:enum`
  - `jabatan_id:foreignId`
  - `phone:string`
  - `email:string`
  - `address:string`
  - `description:text`
  - `is_active:boolean`
  - `finger_id:string`
  - `finger_id:unique`
  - `master_karyawans_finger_id_unique:dropUnique`
  - `finger_id:dropColumn`
  - `npwp_no:string`
  - `npwp_no:dropColumn`
  - `tax_family_status:string`
  - `payment_method:string`
  - `area:string`
  - `contract_start_date:date`
  - `contract_end_date:date`
  - `base_salary:decimal`
  - `overtime_rate:decimal`
  - `allowance_fixed:decimal`
  - `allowance_position:decimal`
  - `allowance_skill:decimal`
  - `allowance_medical_housing:decimal`
  - `incentive_amount:decimal`
  - `planned_start_time:time`
  - `planned_end_time:time`
  - `id_card_no:string`
  - `employee_group:string`
  - `age_year:unsignedSmallInteger`
  - `break_label:string`
  - `education_level:string`
  - `graduation_year:unsignedSmallInteger`
  - `school_name:string`
  - `emergency_contact_name:string`
  - `emergency_contact_phone:string`
  - `emergency_contact_relation:string`
  - `certifications:text`
  - `area_id:foreignId`
  - `area_id:dropConstrainedForeignId`
  - `address_ktp:string`
  - `address_same_as_ktp:boolean`
  - `address_same_as_ktp:dropColumn`
  - `address_ktp:dropColumn`
- Index/Foreign notes:
  - `foreignId('jabatan_id')`
  - `unique('finger_id', 'master_karyawans_finger_id_unique')`
  - `foreignId('area_id')`

### `master_komponen_pendapatans`

- Module: MasterKomponenPendapatan
- Actions: `create`
- Migrations:
  - `app/Modules/MasterKomponenPendapatan/Database/migrations/2026_02_24_110000_create_master_komponen_pendapatans_table.php`
- Columns:
  - `code:string`
  - `name:string`
  - `component_type:enum`
  - `is_taxable:boolean`
  - `description:text`
  - `is_active:boolean`

### `master_komponen_potongans`

- Module: MasterKomponenPotongan
- Actions: `create`, `table`
- Migrations:
  - `app/Modules/MasterKomponenPotongan/Database/migrations/2026_02_24_120000_create_master_komponen_potongans_table.php`
  - `app/Modules/MasterKomponenPotongan/Database/migrations/2026_03_06_130100_add_bpjs_id_to_master_komponen_potongans_table.php`
- Columns:
  - `code:string`
  - `name:string`
  - `component_type:enum`
  - `is_mandatory:boolean`
  - `description:text`
  - `is_active:boolean`
  - `bpjs_id:foreignId`
  - `bpjs_id:dropConstrainedForeignId`
- Index/Foreign notes:
  - `foreignId('bpjs_id')`

### `master_material_request_items`

- Module: MasterProject
- Actions: `create`, `table`
- Migrations:
  - `app/Modules/MasterProject/Database/migrations/2026_02_19_203000_create_master_material_requests_tables.php`
  - `app/Modules/MasterProject/Database/migrations/2026_02_19_204000_add_currency_columns_to_master_material_request_items_table.php`
  - `app/Modules/MasterProject/Database/migrations/2026_02_19_205000_add_due_date_and_urgent_to_material_requests_tables.php`
- Columns:
  - `material_request_id:foreignId`
  - `rab_item_id:foreignId`
  - `qty_request:decimal`
  - `stock_available_qty:decimal`
  - `qty_to_purchase:decimal`
  - `unit_price_estimate:decimal`
  - `notes:text`
  - `material_request_id:unique`
  - `currency_code:string`
  - `exchange_rate_to_idr:decimal`
  - `unit_price_foreign:decimal`
  - `currency_code:dropColumn`
  - `is_urgent:boolean`
  - `due_date:date`
  - `remark:text`
  - `is_urgent:dropColumn`
- Index/Foreign notes:
  - `foreignId('material_request_id')`
  - `foreignId('rab_item_id')`
  - `unique(['material_request_id', 'rab_item_id'], 'mr_item_unique')`

### `master_material_requests`

- Module: MasterProject
- Actions: `create`, `table`
- Migrations:
  - `app/Modules/MasterProject/Database/migrations/2026_02_19_203000_create_master_material_requests_tables.php`
  - `app/Modules/MasterProject/Database/migrations/2026_02_19_205000_add_due_date_and_urgent_to_material_requests_tables.php`
- Columns:
  - `project_id:foreignId`
  - `request_number:string`
  - `request_date:date`
  - `status:string`
  - `notes:text`
  - `purchase_order_id:foreignId`
  - `is_active:boolean`
  - `due_date:date`
  - `due_date:dropColumn`
- Index/Foreign notes:
  - `foreignId('project_id')`
  - `foreignId('purchase_order_id')`

### `master_pajaks`

- Module: MasterPajak
- Actions: `create`
- Migrations:
  - `app/Modules/MasterPajak/Database/migrations/2026_02_24_100100_create_master_pajaks_table.php`
- Columns:
  - `code:string`
  - `name:string`
  - `rate_percent:decimal`
  - `description:text`
  - `is_active:boolean`

### `master_payments`

- Module: MasterPayment
- Actions: `create`
- Migrations:
  - `app/Modules/MasterPayment/Database/migrations/2026_02_19_100600_create_master_payments_table.php`
- Columns:
  - `code:string`
  - `name:string`
  - `terms_day:integer`
  - `description:text`
  - `is_active:boolean`

### `master_pembulatan_jams`

- Module: MasterPembulatanJam
- Actions: `create`
- Migrations:
  - `app/Modules/MasterPembulatanJam/Database/migrations/2026_02_24_170200_create_master_pembulatan_jams_table.php`
- Columns:
  - `code:string`
  - `name:string`
  - `target_type:enum`
  - `round_method:enum`
  - `interval_minutes:unsignedSmallInteger`
  - `tolerance_minutes:unsignedSmallInteger`
  - `description:text`
  - `is_active:boolean`

### `master_perkalian_jams`

- Module: MasterPerkalianJam
- Actions: `create`
- Migrations:
  - `app/Modules/MasterPerkalianJam/Database/migrations/2026_02_24_182000_create_master_perkalian_jams_table.php`
- Columns:
  - `code:string`
  - `name:string`
  - `day_type:string`
  - `hour_start:decimal`
  - `hour_end:decimal`
  - `multiplier:decimal`
  - `description:text`
  - `is_active:boolean`
  - `day_type:index`
- Index/Foreign notes:
  - `index(['day_type', 'is_active'], 'master_perkalian_day_active_idx')`

### `master_profil_bulan_karyawans`

- Module: MasterProfilBulan
- Actions: `create`, `table`
- 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`
- Columns:
  - `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`
- Index/Foreign notes:
  - `foreignId('profil_bulan_id')`
  - `foreignId('karyawan_id')`
  - `unique(['profil_bulan_id', 'karyawan_id'], 'profil_bulan_karyawan_unique')`
  - `foreignId('profil_jam_kerja_id')`
  - `foreignId('profil_gaji_id')`
  - `index('payable_rule_id')`

### `master_profil_bulans`

- Module: MasterProfilBulan
- Actions: `create`, `table`
- 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`
- Columns:
  - `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`
- Index/Foreign notes:
  - `unique(['period_year', 'period_month'], 'profil_bulan_period_unique')`

### `master_profil_gaji_details`

- Module: MasterProfilGaji
- Actions: `create`
- Migrations:
  - `app/Modules/MasterProfilGaji/Database/migrations/2026_02_24_163100_create_master_profil_gaji_details_table.php`
- Columns:
  - `profil_gaji_id:foreignId`
  - `component_group:enum`
  - `komponen_pendapatan_id:foreignId`
  - `komponen_potongan_id:foreignId`
  - `calc_type:enum`
  - `amount:decimal`
  - `percent_value:decimal`
  - `percent_base:enum`
  - `is_prorate:boolean`
  - `effective_start:date`
  - `effective_end:date`
  - `sort_order:unsignedSmallInteger`
  - `notes:text`
  - `is_active:boolean`
- Index/Foreign notes:
  - `foreignId('profil_gaji_id')`
  - `foreignId('komponen_pendapatan_id')`
  - `foreignId('komponen_potongan_id')`

### `master_profil_gajis`

- Module: MasterProfilGaji
- Actions: `create`, `table`
- Migrations:
  - `app/Modules/MasterProfilGaji/Database/migrations/2026_02_24_163000_create_master_profil_gajis_table.php`
  - `app/Modules/MasterProfilGaji/Database/migrations/2026_03_05_080000_add_all_in_policy_to_master_profil_gajis_table.php`
  - `app/Modules/MasterProfilGaji/Database/migrations/2026_03_12_150000_add_monthly_hour_base_to_master_profil_gajis_table.php`
- Columns:
  - `code:string`
  - `name:string`
  - `description:text`
  - `is_active:boolean`
  - `salary_scheme:enum`
  - `absence_deduction_mode:enum`
  - `absence_deduction_mode:dropColumn`
  - `salary_scheme:dropColumn`
  - `monthly_hour_base:unsignedSmallInteger`
  - `monthly_hour_base:dropColumn`

### `master_profil_jam_kerjas`

- Module: MasterProfilJamKerja
- Actions: `create`, `table`
- Migrations:
  - `app/Modules/MasterProfilJamKerja/Database/migrations/2026_02_24_160000_create_master_profil_jam_kerjas_table.php`
  - `app/Modules/MasterProfilJamKerja/Database/migrations/2026_02_24_161000_add_is_one_day_cap_to_master_profil_jam_kerjas_table.php`
  - `app/Modules/MasterProfilJamKerja/Database/migrations/2026_04_22_090000_add_required_checkin_before_start_minutes_to_master_profil_jam_kerjas_table.php`
- Columns:
  - `code:string`
  - `name:string`
  - `start_time:time`
  - `end_time:time`
  - `break_start_time:time`
  - `break_end_time:time`
  - `late_tolerance_minutes:unsignedSmallInteger`
  - `work_minutes_per_day:unsignedSmallInteger`
  - `work_days:json`
  - `description:text`
  - `is_active:boolean`
  - `is_one_day_cap:boolean`
  - `is_one_day_cap:dropColumn`
  - `required_checkin_before_start_minutes:unsignedSmallInteger`
  - `required_checkin_before_start_minutes:dropColumn`

### `master_project_progress_invoices`

- Module: MasterProject
- Actions: `create`, `table`
- Migrations:
  - `app/Modules/MasterProject/Database/migrations/2026_02_20_080000_create_master_project_progress_invoices_table.php`
  - `app/Modules/MasterProject/Database/migrations/2026_02_20_090000_add_supplier_and_tax_number_to_master_project_progress_invoices_table.php`
- Columns:
  - `project_id:foreignId`
  - `progress_schedule_id:foreignId`
  - `invoice_number:string`
  - `invoice_date:date`
  - `due_date:date`
  - `progress_percent:decimal`
  - `amount:decimal`
  - `currency_code:string`
  - `exchange_rate_to_idr:decimal`
  - `amount_idr:decimal`
  - `status:string`
  - `notes:text`
  - `is_active:boolean`
  - `project_id:index`
  - `supplier_invoice_number:string`
  - `tax_invoice_number:string`
  - `supplier_invoice_number:dropColumn`
- Index/Foreign notes:
  - `foreignId('project_id')`
  - `foreignId('progress_schedule_id')`
  - `index(['project_id', 'status'])`

### `master_project_progress_schedules`

- Module: MasterProject
- Actions: `create`, `table`
- Migrations:
  - `app/Modules/MasterProject/Database/migrations/2026_02_19_206000_create_master_project_progress_schedules_table.php`
  - `app/Modules/MasterProject/Database/migrations/2026_03_25_150000_add_scope_id_to_master_project_progress_schedules_table.php`
- Columns:
  - `project_id:foreignId`
  - `activity_code:string`
  - `activity_name:string`
  - `scope_name:string`
  - `start_date:date`
  - `end_date:date`
  - `weight_percent:decimal`
  - `target_progress_percent:decimal`
  - `actual_progress_percent:decimal`
  - `billable_progress_percent:decimal`
  - `status:string`
  - `sort_order:integer`
  - `notes:text`
  - `is_active:boolean`
  - `scope_id:foreignId`
  - `project_id:index`
  - `scope_id:dropForeign`
  - `project_id:dropIndex`
  - `scope_id:dropColumn`
- Index/Foreign notes:
  - `foreignId('project_id')`
  - `foreignId('scope_id')`
  - `index(['project_id', 'scope_id'])`

### `master_project_quotation_items`

- Module: MasterProject
- Actions: `create`
- Migrations:
  - `app/Modules/MasterProject/Database/migrations/2026_02_19_200000_create_master_project_quotations_tables.php`
- Columns:
  - `quotation_id:foreignId`
  - `description:string`
  - `qty:decimal`
  - `unit:string`
  - `unit_price:decimal`
  - `total_price:decimal`
  - `sort_order:integer`
- Index/Foreign notes:
  - `foreignId('quotation_id')`

### `master_project_quotations`

- Module: MasterProject
- Actions: `create`
- Migrations:
  - `app/Modules/MasterProject/Database/migrations/2026_02_19_200000_create_master_project_quotations_tables.php`
- Columns:
  - `project_id:foreignId`
  - `quotation_number:string`
  - `quotation_date:date`
  - `valid_until:date`
  - `subject:string`
  - `notes:text`
  - `status:string`
  - `grand_total:decimal`
  - `project_id:unique`
- Index/Foreign notes:
  - `foreignId('project_id')`
  - `unique('project_id')`

### `master_project_stock_issue_items`

- Module: MasterProject
- Actions: `create`
- Migrations:
  - `app/Modules/MasterProject/Database/migrations/2026_03_25_160200_create_master_project_stock_issues_tables.php`
- Columns:
  - `stock_issue_id:foreignId`
  - `stock_issue_id:foreign`
  - `rab_item_id:foreignId`
  - `rab_item_id:foreign`
  - `barang_id:foreignId`
  - `barang_id:foreign`
  - `satuan_id:foreignId`
  - `satuan_id:foreign`
  - `base_satuan_id:foreignId`
  - `base_satuan_id:foreign`
  - `qty:decimal`
  - `qty_base:decimal`
  - `stock_before_base:decimal`
  - `stock_after_base:decimal`
  - `notes:text`
- Index/Foreign notes:
  - `foreignId('stock_issue_id')`
  - `foreign('stock_issue_id', 'mpsii_issue_fk')`
  - `foreignId('rab_item_id')`
  - `foreign('rab_item_id', 'mpsii_rab_item_fk')`
  - `foreignId('barang_id')`
  - `foreign('barang_id', 'mpsii_barang_fk')`
  - `foreignId('satuan_id')`
  - `foreign('satuan_id', 'mpsii_satuan_fk')`
  - `foreignId('base_satuan_id')`
  - `foreign('base_satuan_id', 'mpsii_base_sat_fk')`

### `master_project_stock_issues`

- Module: MasterProject
- Actions: `create`
- Migrations:
  - `app/Modules/MasterProject/Database/migrations/2026_03_25_160200_create_master_project_stock_issues_tables.php`
- Columns:
  - `project_id:foreignId`
  - `project_id:foreign`
  - `gudang_id:foreignId`
  - `gudang_id:foreign`
  - `issue_number:string`
  - `issue_date:date`
  - `recipient_name:string`
  - `notes:text`
  - `status:string`
  - `created_by:unsignedBigInteger`
  - `is_active:boolean`
- Index/Foreign notes:
  - `foreignId('project_id')`
  - `foreign('project_id', 'mpsi_project_fk')`
  - `foreignId('gudang_id')`
  - `foreign('gudang_id', 'mpsi_gudang_fk')`

### `master_project_stock_return_items`

- Module: MasterProject
- Actions: `create`
- Migrations:
  - `app/Modules/MasterProject/Database/migrations/2026_03_25_190000_create_master_project_stock_returns_tables.php`
- Columns:
  - `stock_return_id:foreignId`
  - `stock_issue_item_id:foreignId`
  - `rab_item_id:foreignId`
  - `barang_id:foreignId`
  - `satuan_id:foreignId`
  - `base_satuan_id:foreignId`
  - `qty:decimal`
  - `qty_base:decimal`
  - `notes:text`
- Index/Foreign notes:
  - `foreignId('stock_return_id')`
  - `foreignId('stock_issue_item_id')`
  - `foreignId('rab_item_id')`
  - `foreignId('barang_id')`
  - `foreignId('satuan_id')`
  - `foreignId('base_satuan_id')`

### `master_project_stock_returns`

- Module: MasterProject
- Actions: `create`
- Migrations:
  - `app/Modules/MasterProject/Database/migrations/2026_03_25_190000_create_master_project_stock_returns_tables.php`
- Columns:
  - `stock_issue_id:foreignId`
  - `project_id:foreignId`
  - `gudang_id:foreignId`
  - `return_number:string`
  - `return_date:date`
  - `notes:text`
  - `status:string`
  - `created_by:unsignedBigInteger`
  - `is_active:boolean`
- Index/Foreign notes:
  - `foreignId('stock_issue_id')`
  - `foreignId('project_id')`
  - `foreignId('gudang_id')`

### `master_projects`

- Module: MasterProject
- Actions: `create`, `table`
- Migrations:
  - `app/Modules/MasterProject/Database/migrations/2026_02_19_100000_create_master_project_tables.php`
  - `app/Modules/MasterProject/Database/migrations/2026_02_19_194000_add_project_detail_columns_to_master_projects_table.php`
  - `app/Modules/MasterProject/Database/migrations/2026_02_19_195000_add_project_status_to_master_projects_table.php`
  - `app/Modules/MasterProject/Database/migrations/2026_02_20_120000_add_parent_project_id_to_master_projects_table.php`
  - `app/Modules/MasterProject/Database/migrations/2026_02_20_130000_add_wo_amount_and_client_file_to_master_projects_table.php`
- Columns:
  - `code:string`
  - `name:string`
  - `description:text`
  - `is_active:boolean`
  - `no_wo:string`
  - `code_project:string`
  - `area_id:foreignId`
  - `id_customers:foreignId`
  - `start_work:date`
  - `end_work:date`
  - `area_id:dropConstrainedForeignId`
  - `id_customers:dropConstrainedForeignId`
  - `no_wo:dropColumn`
  - `project_status:string`
  - `project_status:dropColumn`
  - `parent_project_id:foreignId`
  - `parent_project_id:dropConstrainedForeignId`
  - `wo_amount:decimal`
  - `wo_client_file_path:string`
  - `wo_amount:dropColumn`
- Index/Foreign notes:
  - `foreignId('area_id')`
  - `foreignId('id_customers')`
  - `foreignId('parent_project_id')`

### `master_purchase_order_deliveries`

- Module: MasterProject
- Actions: `create`
- Migrations:
  - `app/Modules/MasterProject/Database/migrations/2026_03_25_160000_create_master_purchase_order_deliveries_tables.php`
- Columns:
  - `purchase_order_id:foreignId`
  - `purchase_order_id:foreign`
  - `gudang_id:foreignId`
  - `gudang_id:foreign`
  - `delivery_number:string`
  - `supplier_delivery_note_number:string`
  - `delivery_date:date`
  - `proof_file_path:string`
  - `notes:text`
  - `status:string`
  - `received_by:unsignedBigInteger`
  - `is_active:boolean`
- Index/Foreign notes:
  - `foreignId('purchase_order_id')`
  - `foreign('purchase_order_id', 'mpod_po_fk')`
  - `foreignId('gudang_id')`
  - `foreign('gudang_id', 'mpod_gudang_fk')`

### `master_purchase_order_delivery_items`

- Module: MasterProject
- Actions: `create`
- Migrations:
  - `app/Modules/MasterProject/Database/migrations/2026_03_25_160000_create_master_purchase_order_deliveries_tables.php`
- Columns:
  - `purchase_order_delivery_id:foreignId`
  - `purchase_order_delivery_id:foreign`
  - `purchase_order_item_id:foreignId`
  - `purchase_order_item_id:foreign`
  - `rab_item_id:foreignId`
  - `rab_item_id:foreign`
  - `satuan_id:foreignId`
  - `satuan_id:foreign`
  - `base_satuan_id:foreignId`
  - `base_satuan_id:foreign`
  - `qty:decimal`
  - `qty_base:decimal`
  - `notes:text`
- Index/Foreign notes:
  - `foreignId('purchase_order_delivery_id')`
  - `foreign('purchase_order_delivery_id', 'mpodi_delivery_fk')`
  - `foreignId('purchase_order_item_id')`
  - `foreign('purchase_order_item_id', 'mpodi_po_item_fk')`
  - `foreignId('rab_item_id')`
  - `foreign('rab_item_id', 'mpodi_rab_item_fk')`
  - `foreignId('satuan_id')`
  - `foreign('satuan_id', 'mpodi_satuan_fk')`
  - `foreignId('base_satuan_id')`
  - `foreign('base_satuan_id', 'mpodi_base_sat_fk')`

### `master_purchase_order_items`

- Module: MasterProject
- Actions: `create`, `table`
- Migrations:
  - `app/Modules/MasterProject/Database/migrations/2026_02_19_193000_create_master_purchase_orders_tables.php`
  - `app/Modules/MasterProject/Database/migrations/2026_02_20_100000_link_purchase_orders_to_material_requests.php`
- Columns:
  - `purchase_order_id:foreignId`
  - `rab_item_id:foreignId`
  - `qty:decimal`
  - `unit_price:decimal`
  - `total_price:decimal`
  - `notes:text`
  - `material_request_item_id:foreignId`
  - `material_request_item_id:dropConstrainedForeignId`
- Index/Foreign notes:
  - `foreignId('purchase_order_id')`
  - `foreignId('rab_item_id')`
  - `foreignId('material_request_item_id')`

### `master_purchase_order_service_items`

- Module: MasterProject
- Actions: `create`
- Migrations:
  - `app/Modules/MasterProject/Database/migrations/2026_03_25_180000_add_po_type_and_service_items.php`
- Columns:
  - `purchase_order_id:foreignId`
  - `description:string`
  - `qty:decimal`
  - `unit:string`
  - `unit_price:decimal`
  - `total_price:decimal`
  - `notes:text`
- Index/Foreign notes:
  - `foreignId('purchase_order_id')`

### `master_purchase_orders`

- Module: MasterProject
- Actions: `create`, `table`
- Migrations:
  - `app/Modules/MasterProject/Database/migrations/2026_02_19_193000_create_master_purchase_orders_tables.php`
  - `app/Modules/MasterProject/Database/migrations/2026_02_20_100000_link_purchase_orders_to_material_requests.php`
  - `app/Modules/MasterProject/Database/migrations/2026_03_25_180000_add_po_type_and_service_items.php`
  - `app/Modules/MasterProject/Database/migrations/2026_03_25_190000_add_po_payment_fields.php`
- Columns:
  - `project_id:foreignId`
  - `vendor_id:foreignId`
  - `po_number:string`
  - `po_date:date`
  - `status:string`
  - `total_amount:decimal`
  - `notes:text`
  - `is_active:boolean`
  - `material_request_id:foreignId`
  - `material_request_id:dropConstrainedForeignId`
  - `po_type:string`
  - `po_type:dropIndex`
  - `po_type:dropColumn`
  - `payment_status:string`
  - `paid_amount:decimal`
  - `paid_at:dateTime`
  - `payment_ref:string`
  - `payment_notes:text`
  - `payment_notes:dropColumn`
  - `payment_ref:dropColumn`
  - `paid_at:dropColumn`
  - `paid_amount:dropColumn`
  - `payment_status:dropIndex`
  - `payment_status:dropColumn`
- Index/Foreign notes:
  - `foreignId('project_id')`
  - `foreignId('vendor_id')`
  - `foreignId('material_request_id')`

### `master_rab_item_satuan_conversions`

- Module: MasterProject
- Actions: `create`
- Migrations:
  - `app/Modules/MasterProject/Database/migrations/2026_02_19_190000_add_item_unit_conversions_to_master_project_tables.php`
- Columns:
  - `rab_item_id:foreignId`
  - `satuan_id:foreignId`
  - `conversion_value:decimal`
  - `rab_item_id:unique`
- Index/Foreign notes:
  - `foreignId('rab_item_id')`
  - `foreignId('satuan_id')`
  - `unique(['rab_item_id', 'satuan_id'])`

### `master_rab_items`

- Module: MasterProject
- Actions: `create`, `table`
- Migrations:
  - `app/Modules/MasterProject/Database/migrations/2026_02_19_100000_create_master_project_tables.php`
  - `app/Modules/MasterProject/Database/migrations/2026_02_19_190000_add_item_unit_conversions_to_master_project_tables.php`
  - `app/Modules/MasterProject/Database/migrations/2026_02_19_192000_add_barang_and_satuan_to_master_rab_items_table.php`
  - `app/Modules/MasterProject/Database/migrations/2026_02_19_201100_add_scope_and_rincian_to_master_rab_items_table.php`
  - `app/Modules/MasterProject/Database/migrations/2026_02_19_202000_add_merk_to_master_rab_items_table.php`
  - `app/Modules/MasterProject/Database/migrations/2026_02_20_110000_add_revisi_to_master_rab_items_table.php`
- Columns:
  - `project_id:foreignId`
  - `work_order_id:foreignId`
  - `item_code:string`
  - `item_name:string`
  - `qty:decimal`
  - `unit:string`
  - `unit_price:decimal`
  - `total_price:decimal`
  - `is_active:boolean`
  - `base_satuan_id:foreignId`
  - `base_satuan_id:dropConstrainedForeignId`
  - `barang_id:foreignId`
  - `satuan_id:foreignId`
  - `barang_id:dropConstrainedForeignId`
  - `satuan_id:dropConstrainedForeignId`
  - `scope_id:foreignId`
  - `rincian:text`
  - `scope_id:dropConstrainedForeignId`
  - `rincian:dropColumn`
  - `merk:string`
  - `merk:dropColumn`
  - `revision_count:unsignedInteger`
  - `revised_at:timestamp`
  - `revision_count:dropColumn`
- Index/Foreign notes:
  - `foreignId('project_id')`
  - `foreignId('work_order_id')`
  - `foreignId('base_satuan_id')`
  - `foreignId('barang_id')`
  - `foreignId('satuan_id')`
  - `foreignId('scope_id')`

### `master_rab_scopes`

- Module: MasterProject
- Actions: `create`
- Migrations:
  - `app/Modules/MasterProject/Database/migrations/2026_02_19_201000_create_master_rab_scopes_table.php`
- Columns:
  - `project_id:foreignId`
  - `work_order_id:foreignId`
  - `scope_code:string`
  - `scope_name:string`
  - `sort_order:integer`
  - `description:text`
  - `is_active:boolean`
  - `project_id:unique`
- Index/Foreign notes:
  - `foreignId('project_id')`
  - `foreignId('work_order_id')`
  - `unique(['project_id', 'scope_code'])`

### `master_satuans`

- Module: MasterSatuan
- Actions: `create`, `table`
- Migrations:
  - `app/Modules/MasterSatuan/Database/migrations/2026_02_19_100400_create_master_satuans_table.php`
  - `app/Modules/MasterSatuan/Database/migrations/2026_02_19_180000_add_conversion_to_master_satuans_table.php`
- Columns:
  - `code:string`
  - `name:string`
  - `description:text`
  - `is_active:boolean`
  - `base_satuan_id:foreignId`
  - `conversion_value:decimal`
  - `base_satuan_id:dropConstrainedForeignId`
  - `conversion_value:dropColumn`
- Index/Foreign notes:
  - `foreignId('base_satuan_id')`

### `master_vendors`

- Module: MasterVendor
- Actions: `create`
- Migrations:
  - `app/Modules/MasterVendor/Database/migrations/2026_02_19_100200_create_master_vendors_table.php`
- Columns:
  - `code:string`
  - `name:string`
  - `contact_person:string`
  - `phone:string`
  - `email:string`
  - `address:text`
  - `is_active:boolean`

### `master_warehouse_adjustment_items`

- Module: MasterProject
- Actions: `create`
- Migrations:
  - `app/Modules/MasterProject/Database/migrations/2026_03_25_180100_create_master_warehouse_adjustments_tables.php`
- Columns:
  - `warehouse_adjustment_id:foreignId`
  - `warehouse_adjustment_id:foreign`
  - `barang_id:foreignId`
  - `barang_id:foreign`
  - `satuan_id:foreignId`
  - `satuan_id:foreign`
  - `base_satuan_id:foreignId`
  - `base_satuan_id:foreign`
  - `qty:decimal`
  - `qty_base:decimal`
  - `stock_before_base:decimal`
  - `stock_after_base:decimal`
  - `movement_type:string`
  - `notes:text`
- Index/Foreign notes:
  - `foreignId('warehouse_adjustment_id')`
  - `foreign('warehouse_adjustment_id', 'mwai_adj_fk')`
  - `foreignId('barang_id')`
  - `foreign('barang_id', 'mwai_barang_fk')`
  - `foreignId('satuan_id')`
  - `foreign('satuan_id', 'mwai_satuan_fk')`
  - `foreignId('base_satuan_id')`
  - `foreign('base_satuan_id', 'mwai_base_sat_fk')`

### `master_warehouse_adjustments`

- Module: MasterProject
- Actions: `create`
- Migrations:
  - `app/Modules/MasterProject/Database/migrations/2026_03_25_180100_create_master_warehouse_adjustments_tables.php`
- Columns:
  - `gudang_id:foreignId`
  - `gudang_id:foreign`
  - `adjustment_number:string`
  - `adjustment_date:date`
  - `adjustment_type:string`
  - `notes:text`
  - `created_by:unsignedBigInteger`
  - `is_active:boolean`
- Index/Foreign notes:
  - `foreignId('gudang_id')`
  - `foreign('gudang_id', 'mwa_gudang_fk')`

### `master_warehouse_stock_movements`

- Module: MasterProject
- Actions: `create`
- Migrations:
  - `app/Modules/MasterProject/Database/migrations/2026_03_25_160100_create_master_warehouse_stock_movements_table.php`
- Columns:
  - `gudang_id:foreignId`
  - `gudang_id:foreign`
  - `barang_id:foreignId`
  - `barang_id:foreign`
  - `project_id:foreignId`
  - `project_id:foreign`
  - `rab_item_id:foreignId`
  - `rab_item_id:foreign`
  - `movement_type:string`
  - `reference_type:string`
  - `reference_id:unsignedBigInteger`
  - `reference_number:string`
  - `movement_date:date`
  - `satuan_id:foreignId`
  - `satuan_id:foreign`
  - `base_satuan_id:foreignId`
  - `base_satuan_id:foreign`
  - `qty:decimal`
  - `qty_base:decimal`
  - `notes:text`
  - `created_by:unsignedBigInteger`
  - `gudang_id:index`
  - `movement_type:index`
- Index/Foreign notes:
  - `foreignId('gudang_id')`
  - `foreign('gudang_id', 'mwsm_gudang_fk')`
  - `foreignId('barang_id')`
  - `foreign('barang_id', 'mwsm_barang_fk')`
  - `foreignId('project_id')`
  - `foreign('project_id', 'mwsm_project_fk')`
  - `foreignId('rab_item_id')`
  - `foreign('rab_item_id', 'mwsm_rab_item_fk')`
  - `foreignId('satuan_id')`
  - `foreign('satuan_id', 'mwsm_satuan_fk')`
  - `foreignId('base_satuan_id')`
  - `foreign('base_satuan_id', 'mwsm_base_sat_fk')`
  - `index(['gudang_id', 'barang_id'], 'warehouse_stock_gudang_barang_idx')`
  - `index(['movement_type', 'movement_date'], 'warehouse_stock_type_date_idx')`

### `master_warehouse_transfer_items`

- Module: MasterProject
- Actions: `create`
- Migrations:
  - `app/Modules/MasterProject/Database/migrations/2026_03_25_170000_create_master_warehouse_transfers_tables.php`
- Columns:
  - `warehouse_transfer_id:foreignId`
  - `warehouse_transfer_id:foreign`
  - `barang_id:foreignId`
  - `barang_id:foreign`
  - `satuan_id:foreignId`
  - `satuan_id:foreign`
  - `base_satuan_id:foreignId`
  - `base_satuan_id:foreign`
  - `qty:decimal`
  - `qty_base:decimal`
  - `stock_before_base:decimal`
  - `stock_after_base:decimal`
  - `notes:text`
- Index/Foreign notes:
  - `foreignId('warehouse_transfer_id')`
  - `foreign('warehouse_transfer_id', 'mwti_transfer_fk')`
  - `foreignId('barang_id')`
  - `foreign('barang_id', 'mwti_barang_fk')`
  - `foreignId('satuan_id')`
  - `foreign('satuan_id', 'mwti_satuan_fk')`
  - `foreignId('base_satuan_id')`
  - `foreign('base_satuan_id', 'mwti_base_sat_fk')`

### `master_warehouse_transfers`

- Module: MasterProject
- Actions: `create`
- Migrations:
  - `app/Modules/MasterProject/Database/migrations/2026_03_25_170000_create_master_warehouse_transfers_tables.php`
- Columns:
  - `from_gudang_id:foreignId`
  - `from_gudang_id:foreign`
  - `to_gudang_id:foreignId`
  - `to_gudang_id:foreign`
  - `transfer_number:string`
  - `transfer_date:date`
  - `driver_name:string`
  - `recipient_name:string`
  - `notes:text`
  - `status:string`
  - `created_by:unsignedBigInteger`
  - `is_active:boolean`
- Index/Foreign notes:
  - `foreignId('from_gudang_id')`
  - `foreign('from_gudang_id', 'mwt_from_gudang_fk')`
  - `foreignId('to_gudang_id')`
  - `foreign('to_gudang_id', 'mwt_to_gudang_fk')`

### `master_work_orders`

- Module: MasterProject
- Actions: `create`
- Migrations:
  - `app/Modules/MasterProject/Database/migrations/2026_02_19_100000_create_master_project_tables.php`
- Columns:
  - `project_id:foreignId`
  - `wo_number:string`
  - `title:string`
  - `status:string`
  - `description:text`
  - `is_active:boolean`
- Index/Foreign notes:
  - `foreignId('project_id')`

### `menu_permissions`

- Module: Core
- Actions: `create`
- Migrations:
  - `database/migrations/2026_02_10_091407_create_menu_permissions_table.php`
- Columns:
  - `menu_id:foreignId`
  - `permission_id:foreignId`
  - `menu_id:unique`
- Index/Foreign notes:
  - `foreignId('menu_id')`
  - `foreignId('permission_id')`
  - `unique(['menu_id', 'permission_id'])`

### `menu_profiles`

- Module: Core
- Actions: `create`
- Migrations:
  - `database/migrations/2026_02_12_210000_create_menu_profiles_table.php`
- Columns:
  - `name:string`
  - `slug:string`
  - `is_active:boolean`

### `menus`

- Module: Core
- Actions: `create`, `table`
- Migrations:
  - `database/migrations/2026_02_10_091340_create_menus_table.php`
  - `database/migrations/2026_03_18_000001_alter_menus_parent_id_cascade_delete.php`
- Columns:
  - `name:string`
  - `slug:string`
  - `url:string`
  - `icon:string`
  - `department:string`
  - `parent_id:foreignId`
  - `sort_order:unsignedInteger`
  - `is_active:boolean`
  - `parent_id:dropForeign`
  - `parent_id:foreign`
- Index/Foreign notes:
  - `foreignId('parent_id')`
  - `foreign('parent_id')`

### `module_libraries`

- Module: Core
- Actions: `create`
- Migrations:
  - `database/migrations/2026_02_12_220000_create_module_libraries_table.php`
- Columns:
  - `name:string`
  - `slug:string`
  - `department:string`
  - `view_path:string`
  - `description:text`
  - `is_active:boolean`

### `password_reset_tokens`

- Module: Core
- Actions: `create`
- Migrations:
  - `database/migrations/0001_01_01_000000_create_users_table.php`
- Columns:
  - `email:string`
  - `token:string`
  - `created_at:timestamp`

### `payroll_insentif_dinas_transactions`

- Module: InsentifDinas
- Actions: `create`, `table`
- Migrations:
  - `app/Modules/InsentifDinas/Database/migrations/2026_04_15_090100_create_payroll_insentif_dinas_transactions_table.php`
  - `app/Modules/InsentifDinas/Database/migrations/2026_04_15_123000_add_sk_reference_url_to_payroll_insentif_dinas_transactions_table.php`
- Columns:
  - `transaction_no:string`
  - `transaction_date:date`
  - `karyawan_id:unsignedBigInteger`
  - `project_id:unsignedBigInteger`
  - `insentif_dinas_type_id:unsignedBigInteger`
  - `approval_flow_id:unsignedBigInteger`
  - `approval_request_id:unsignedBigInteger`
  - `work_date_from:date`
  - `work_date_to:date`
  - `claim_deadline:date`
  - `pay_deadline:date`
  - `amount:decimal`
  - `approved_amount:decimal`
  - `payment_method:string`
  - `target_profil_bulan_id:unsignedBigInteger`
  - `description:text`
  - `notes:text`
  - `status:string`
  - `submitted_by:unsignedBigInteger`
  - `submitted_at:timestamp`
  - `approved_by:unsignedBigInteger`
  - `approved_at:timestamp`
  - `rejected_by:unsignedBigInteger`
  - `rejected_at:timestamp`
  - `reject_reason:text`
  - `paid_by:unsignedBigInteger`
  - `paid_at:timestamp`
  - `payroll_reference_id:unsignedBigInteger`
  - `separate_payment_reference:string`
  - `payment_notes:text`
  - `is_locked:boolean`
  - `is_active:boolean`
  - `created_by:unsignedBigInteger`
  - `updated_by:unsignedBigInteger`
  - `karyawan_id:index`
  - `status:index`
  - `payment_method:index`
  - `target_profil_bulan_id:index`
  - `sk_reference_url:string`
  - `sk_reference_url:dropColumn`
- Index/Foreign notes:
  - `index(['karyawan_id', 'transaction_date'], 'idx_ins_dinas_karyawan_date')`
  - `index(['status'], 'idx_ins_dinas_status')`
  - `index(['payment_method'], 'idx_ins_dinas_payment_method')`
  - `index(['target_profil_bulan_id'], 'idx_ins_dinas_target_profil')`

### `payroll_insentif_dinas_types`

- Module: InsentifDinas
- Actions: `create`
- Migrations:
  - `app/Modules/InsentifDinas/Database/migrations/2026_04_15_090000_create_payroll_insentif_dinas_types_table.php`
- Columns:
  - `code:string`
  - `name:string`
  - `default_payment_method:string`
  - `need_deadline:boolean`
  - `description:text`
  - `is_active:boolean`

### `payroll_karyawan_component_overrides`

- Module: MasterProfilBulan
- Actions: `create`
- Migrations:
  - `app/Modules/MasterProfilBulan/Database/migrations/2026_02_24_164000_create_payroll_karyawan_component_overrides_table.php`
- Columns:
  - `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`
- Index/Foreign notes:
  - `foreign('profil_bulan_karyawan_id', 'pkco_assignment_fk')`
  - `foreign('komponen_pendapatan_id', 'pkco_pendapatan_fk')`
  - `foreign('komponen_potongan_id', 'pkco_potongan_fk')`

### `payroll_payable_rules`

- Module: MasterProfilBulan
- Actions: `create`
- Migrations:
  - `app/Modules/MasterProfilBulan/Database/migrations/2026_04_27_180000_create_payroll_payable_rules_table.php`
- Columns:
  - `code:string`
  - `name:string`
  - `min_effective_minutes:unsignedSmallInteger`
  - `credit_minutes:unsignedSmallInteger`
  - `credit_hk:decimal`
  - `days_of_week:json`
  - `notes:text`
  - `is_active:boolean`

### `payroll_payment_bpjs_details`

- Module: Penggajian
- Actions: `create`, `table`
- Migrations:
  - `app/Modules/Penggajian/Database/migrations/2026_04_21_165000_create_payroll_payment_bpjs_details_table.php`
  - `app/Modules/Penggajian/Database/migrations/2026_04_24_150100_add_min_max_to_payroll_payment_bpjs_details_table.php`
- Columns:
  - `payment_history_id:foreignId`
  - `karyawan_id:foreignId`
  - `bpjs_id:foreignId`
  - `component_code:string`
  - `component_name:string`
  - `basis_type:enum`
  - `basis_source_nominal:decimal`
  - `ceiling_nominal:decimal`
  - `basis_nominal:decimal`
  - `rate_company_percent:decimal`
  - `rate_employee_percent:decimal`
  - `company_nominal:decimal`
  - `employee_nominal:decimal`
  - `is_enrolled:boolean`
  - `deduct_to_payroll:boolean`
  - `notes:text`
  - `payment_history_id:index`
  - `ceiling_min_nominal:decimal`
  - `ceiling_max_nominal:decimal`
  - `ceiling_max_nominal:dropColumn`
  - `ceiling_min_nominal:dropColumn`
- Index/Foreign notes:
  - `foreignId('payment_history_id')`
  - `foreignId('karyawan_id')`
  - `foreignId('bpjs_id')`
  - `index(['payment_history_id', 'component_code'], 'idx_payroll_bpjs_payment_component')`

### `payroll_payment_histories`

- Module: Penggajian
- Actions: `create`, `table`
- Migrations:
  - `app/Modules/Penggajian/Database/migrations/2026_02_26_150000_create_payroll_payment_histories_table.php`
  - `app/Modules/Penggajian/Database/migrations/2026_03_03_100200_add_payroll_components_to_payment_histories_table.php`
- Columns:
  - `profil_bulan_karyawan_id:unsignedBigInteger`
  - `profil_bulan_id:unsignedBigInteger`
  - `karyawan_id:unsignedBigInteger`
  - `pay_date:date`
  - `period_start:date`
  - `period_end:date`
  - `nominal:decimal`
  - `status:string`
  - `marked_by:unsignedBigInteger`
  - `marked_at:dateTime`
  - `notes:text`
  - `profil_bulan_karyawan_id:foreign`
  - `profil_bulan_id:foreign`
  - `karyawan_id:foreign`
  - `marked_by:foreign`
  - `profil_bulan_id:index`
  - `profil_bulan_karyawan_id:index`
  - `gross_nominal:decimal`
  - `pph21_nominal:decimal`
  - `bpjs_nominal:decimal`
  - `reimburse_nominal:decimal`
  - `net_nominal:decimal`
  - `pph21_rate:decimal`
  - `bpjs_rate_total:decimal`
  - `bank_account_id:unsignedBigInteger`
  - `bank_account_id:foreign`
  - `tax_proof_no:string`
  - `tax_proof_no:dropColumn`
  - `pay_hist_bank_account_fk:dropForeign`
  - `bank_account_id:dropColumn`
  - `bpjs_rate_total:dropColumn`
  - `pph21_rate:dropColumn`
  - `net_nominal:dropColumn`
  - `reimburse_nominal:dropColumn`
  - `bpjs_nominal:dropColumn`
  - `pph21_nominal:dropColumn`
  - `gross_nominal:dropColumn`
- Index/Foreign notes:
  - `foreign('profil_bulan_karyawan_id', 'pay_hist_assign_fk')`
  - `foreign('profil_bulan_id', 'pay_hist_pb_fk')`
  - `foreign('karyawan_id', 'pay_hist_kry_fk')`
  - `foreign('marked_by', 'pay_hist_user_fk')`
  - `index(['profil_bulan_id', 'pay_date'], 'pay_hist_pb_paydate_idx')`
  - `index(['profil_bulan_karyawan_id', 'period_start', 'period_end'], 'pay_hist_assign_period_idx')`
  - `foreign('bank_account_id', 'pay_hist_bank_account_fk')`

### `payroll_reimbursement_requests`

- Module: Penggajian
- Actions: `create`
- Migrations:
  - `app/Modules/Penggajian/Database/migrations/2026_03_03_100100_create_payroll_reimbursement_requests_table.php`
- Columns:
  - `request_no:string`
  - `karyawan_id:foreignId`
  - `request_date:date`
  - `claim_date:date`
  - `category:string`
  - `description:text`
  - `amount:decimal`
  - `attachment_path:string`
  - `status:string`
  - `approved_by:unsignedBigInteger`
  - `approved_at:dateTime`
  - `rejected_reason:text`
  - `created_by:unsignedBigInteger`
  - `is_active:boolean`
  - `approved_by:foreign`
  - `created_by:foreign`
  - `karyawan_id:index`
  - `status:index`
- Index/Foreign notes:
  - `foreignId('karyawan_id')`
  - `foreign('approved_by', 'reimburse_approved_by_fk')`
  - `foreign('created_by', 'reimburse_created_by_fk')`
  - `index(['karyawan_id', 'claim_date'], 'reimburse_kry_claim_idx')`
  - `index(['status'], 'reimburse_status_idx')`

### `payroll_slip_profiles`

- Module: Penggajian
- Actions: `create`, `table`
- Migrations:
  - `app/Modules/Penggajian/Database/migrations/2026_03_03_130000_create_payroll_slip_profiles_table.php`
  - `app/Modules/Penggajian/Database/migrations/2026_03_03_140000_add_layout_json_to_payroll_slip_profiles_table.php`
- Columns:
  - `code:string`
  - `name:string`
  - `company_name:string`
  - `company_address:string`
  - `header_note:text`
  - `footer_note:text`
  - `show_logo:boolean`
  - `show_signature:boolean`
  - `show_npwp:boolean`
  - `show_bank_account:boolean`
  - `paper_size:string`
  - `orientation:string`
  - `is_default:boolean`
  - `is_active:boolean`
  - `layout_json:longText`
  - `layout_json:dropColumn`

### `permission_role`

- Module: Core
- Actions: `create`
- Migrations:
  - `database/migrations/2026_02_10_091358_create_permission_role_table.php`
- Columns:
  - `permission_id:foreignId`
  - `role_id:foreignId`
  - `permission_id:unique`
- Index/Foreign notes:
  - `foreignId('permission_id')`
  - `foreignId('role_id')`
  - `unique(['permission_id', 'role_id'])`

### `permission_user`

- Module: Core
- Actions: `create`
- Migrations:
  - `database/migrations/2026_02_10_091415_create_permission_user_table.php`
- Columns:
  - `permission_id:foreignId`
  - `user_id:foreignId`
  - `permission_id:unique`
- Index/Foreign notes:
  - `foreignId('permission_id')`
  - `foreignId('user_id')`
  - `unique(['permission_id', 'user_id'])`

### `permissions`

- Module: Core
- Actions: `create`
- Migrations:
  - `database/migrations/2026_02_10_091328_create_permissions_table.php`
- Columns:
  - `name:string`
  - `slug:string`
  - `description:string`

### `printer_devices`

- Module: Printer
- Actions: `create`
- Migrations:
  - `app/Modules/Printer/Database/migrations/2026_03_05_120000_create_printer_devices_table.php`
- Columns:
  - `code:string`
  - `name:string`
  - `driver_type:enum`
  - `paper_type:enum`
  - `paper_width_mm:decimal`
  - `is_continuous:boolean`
  - `copies:unsignedSmallInteger`
  - `endpoint:string`
  - `notes:text`
  - `is_default:boolean`
  - `is_active:boolean`

### `project_documents`

- Module: FieldExecution
- Actions: `create`
- Migrations:
  - `app/Modules/FieldExecution/Database/migrations/2026_03_26_120000_create_field_execution_tables.php`
- Columns:
  - `project_id:foreignId`
  - `doc_key:string`
  - `version:unsignedInteger`
  - `folder:string`
  - `doc_type:string`
  - `title:string`
  - `tags:json`
  - `notes:text`
  - `status:string`
  - `created_by:unsignedBigInteger`
  - `updated_by:unsignedBigInteger`
  - `submitted_at:timestamp`
  - `submitted_by:unsignedBigInteger`
  - `approved_at:timestamp`
  - `approved_by:unsignedBigInteger`
  - `rejected_at:timestamp`
  - `rejected_by:unsignedBigInteger`
  - `reject_reason:string`
  - `original_name:string`
  - `file_path:string`
  - `mime:string`
  - `size_bytes:unsignedBigInteger`
  - `doc_key:unique`
  - `project_id:index`
  - `doc_key:index`
- Index/Foreign notes:
  - `foreignId('project_id')`
  - `unique(['doc_key', 'version'])`
  - `index(['project_id', 'status'])`
  - `index(['doc_key'])`

### `project_job_assignments`

- Module: ProjectJobCosting
- Actions: `create`
- Migrations:
  - `app/Modules/ProjectJobCosting/Database/migrations/2026_03_18_010010_create_project_job_assignments_table.php`
- Columns:
  - `karyawan_id:unsignedBigInteger`
  - `job_id:unsignedBigInteger`
  - `work_date:date`
  - `is_active:boolean`
  - `created_by:unsignedBigInteger`
  - `karyawan_id:foreign`
  - `job_id:foreign`
  - `created_by:foreign`
  - `karyawan_id:unique`
  - `work_date:index`
- Index/Foreign notes:
  - `foreign('karyawan_id')`
  - `foreign('job_id')`
  - `foreign('created_by')`
  - `unique(['karyawan_id', 'work_date'], 'pj_assign_unique')`
  - `index(['work_date', 'job_id'], 'pj_assign_date_job_idx')`

### `project_job_cost_rates`

- Module: ProjectJobCosting
- Actions: `create`
- Migrations:
  - `app/Modules/ProjectJobCosting/Database/migrations/2026_03_25_090000_create_project_job_cost_rates_table.php`
- Columns:
  - `karyawan_id:unsignedBigInteger`
  - `basis_type:string`
  - `hourly_rate:decimal`
  - `monthly_cost:decimal`
  - `basis_hours:decimal`
  - `effective_start:date`
  - `effective_end:date`
  - `notes:text`
  - `is_active:boolean`
  - `created_by:unsignedBigInteger`
  - `karyawan_id:foreign`
  - `created_by:foreign`
  - `karyawan_id:index`
  - `effective_start:index`
- Index/Foreign notes:
  - `foreign('karyawan_id')`
  - `foreign('created_by')`
  - `index(['karyawan_id', 'is_active'], 'pjcr_karyawan_active_idx')`
  - `index(['effective_start', 'effective_end'], 'pjcr_effective_idx')`

### `project_job_work_logs`

- Module: ProjectJobCosting
- Actions: `create`
- Migrations:
  - `app/Modules/ProjectJobCosting/Database/migrations/2026_03_18_010020_create_project_job_work_logs_table.php`
- Columns:
  - `karyawan_id:unsignedBigInteger`
  - `job_id:unsignedBigInteger`
  - `work_date:date`
  - `start_time:time`
  - `end_time:time`
  - `minutes_total:unsignedInteger`
  - `source:string`
  - `notes:text`
  - `created_by:unsignedBigInteger`
  - `is_active:boolean`
  - `karyawan_id:foreign`
  - `job_id:foreign`
  - `created_by:foreign`
  - `karyawan_id:index`
  - `job_id:index`
- Index/Foreign notes:
  - `foreign('karyawan_id')`
  - `foreign('job_id')`
  - `foreign('created_by')`
  - `index(['karyawan_id', 'work_date'], 'pj_log_kid_date_idx')`
  - `index(['job_id', 'work_date'], 'pj_log_job_date_idx')`

### `project_jobs`

- Module: ProjectJobCosting
- Actions: `create`
- Migrations:
  - `app/Modules/ProjectJobCosting/Database/migrations/2026_03_18_010000_create_project_jobs_table.php`
- Columns:
  - `code:string`
  - `name:string`
  - `effective_start:date`
  - `effective_end:date`
  - `is_active:boolean`
  - `created_by:unsignedBigInteger`
  - `created_by:foreign`
  - `is_active:index`
- Index/Foreign notes:
  - `foreign('created_by')`
  - `index(['is_active', 'code'], 'pj_active_code_idx')`

### `project_site_report_attachments`

- Module: FieldExecution
- Actions: `create`
- Migrations:
  - `app/Modules/FieldExecution/Database/migrations/2026_03_26_120000_create_field_execution_tables.php`
- Columns:
  - `site_report_id:foreignId`
  - `type:string`
  - `original_name:string`
  - `file_path:string`
  - `mime:string`
  - `size_bytes:unsignedBigInteger`
  - `uploaded_by:unsignedBigInteger`
  - `site_report_id:index`
- Index/Foreign notes:
  - `foreignId('site_report_id')`
  - `index(['site_report_id'])`

### `project_site_reports`

- Module: FieldExecution
- Actions: `create`
- Migrations:
  - `app/Modules/FieldExecution/Database/migrations/2026_03_26_120000_create_field_execution_tables.php`
- Columns:
  - `project_id:foreignId`
  - `report_date:date`
  - `weather:string`
  - `manpower_count:unsignedInteger`
  - `equipment:text`
  - `progress_actual_percent:decimal`
  - `progress_note:text`
  - `issues:text`
  - `constraints:text`
  - `status:string`
  - `created_by:unsignedBigInteger`
  - `updated_by:unsignedBigInteger`
  - `submitted_at:timestamp`
  - `submitted_by:unsignedBigInteger`
  - `approved_at:timestamp`
  - `approved_by:unsignedBigInteger`
  - `rejected_at:timestamp`
  - `rejected_by:unsignedBigInteger`
  - `reject_reason:string`
  - `project_id:unique`
  - `report_date:index`
- Index/Foreign notes:
  - `foreignId('project_id')`
  - `unique(['project_id', 'report_date'])`
  - `index(['report_date', 'status'])`

### `reimbursement_attachments`

- Module: ReimbursementRequest
- Actions: `create`
- Migrations:
  - `app/Modules/ReimbursementRequest/Database/migrations/2026_03_27_132210_create_reimbursement_attachments_table.php`
- Columns:
  - `reimbursement_request_id:unsignedBigInteger`
  - `file_path:string`
  - `file_name:string`
  - `mime:string`
  - `size_bytes:unsignedBigInteger`
  - `uploaded_by:unsignedBigInteger`
  - `reimbursement_request_id:index`
- Index/Foreign notes:
  - `index(['reimbursement_request_id'])`

### `reimbursement_requests`

- Module: ReimbursementRequest
- Actions: `create`
- Migrations:
  - `app/Modules/ReimbursementRequest/Database/migrations/2026_03_27_132200_create_reimbursement_requests_table.php`
- Columns:
  - `request_no:string`
  - `karyawan_id:unsignedBigInteger`
  - `approval_flow_id:unsignedBigInteger`
  - `approval_request_id:unsignedBigInteger`
  - `request_date:date`
  - `amount:decimal`
  - `category:string`
  - `notes:text`
  - `status:string`
  - `created_by:unsignedBigInteger`
  - `approved_by:unsignedBigInteger`
  - `approved_at:timestamp`
  - `rejected_reason:text`
  - `is_active:boolean`
  - `karyawan_id:index`
  - `status:index`
- Index/Foreign notes:
  - `index(['karyawan_id', 'request_date'])`
  - `index(['status'])`

### `request_action_histories`

- Module: Core
- Actions: `create`
- Migrations:
  - `database/migrations/2026_03_10_230000_create_request_action_histories_table.php`
- Columns:
  - `module_key:string`
  - `reference_type:string`
  - `reference_id:unsignedBigInteger`
  - `action:string`
  - `actor_user_id:unsignedBigInteger`
  - `notes:text`
  - `meta_json:json`
  - `module_key:index`
  - `action:index`
  - `actor_user_id:index`
- Index/Foreign notes:
  - `index(['module_key', 'reference_type', 'reference_id'], 'rah_ref_idx')`
  - `index(['action', 'created_at'], 'rah_action_created_idx')`
  - `index(['actor_user_id', 'created_at'], 'rah_actor_created_idx')`

### `role_user`

- Module: Core
- Actions: `create`, `table`
- Migrations:
  - `database/migrations/2026_02_10_091351_create_role_user_table.php`
  - `database/migrations/2026_02_11_220000_add_is_active_to_role_user_table.php`
- Columns:
  - `role_id:foreignId`
  - `user_id:foreignId`
  - `role_id:unique`
  - `is_active:boolean`
  - `is_active:dropColumn`
- Index/Foreign notes:
  - `foreignId('role_id')`
  - `foreignId('user_id')`
  - `unique(['role_id', 'user_id'])`

### `roles`

- Module: Core
- Actions: `create`
- Migrations:
  - `database/migrations/2026_02_10_091322_create_roles_table.php`
- Columns:
  - `name:string`
  - `slug:string`
  - `description:string`

### `scheduled_tasks`

- Module: Core
- Actions: `create`, `table`
- Migrations:
  - `database/migrations/2026_02_12_140000_create_scheduled_tasks_table.php`
  - `database/migrations/2026_02_12_141000_add_http_columns_to_scheduled_tasks_table.php`
- Columns:
  - `name:string`
  - `command:string`
  - `cron_expression:string`
  - `timezone:string`
  - `is_active:boolean`
  - `last_run_at:timestamp`
  - `last_status:string`
  - `last_output:longText`
  - `run_count:unsignedInteger`
  - `task_type:string`
  - `url:string`
  - `http_method:string`
  - `request_headers:json`
  - `request_body:longText`
  - `timeout_seconds:unsignedSmallInteger`
  - `verify_ssl:boolean`
  - `task_type:dropColumn`

### `sessions`

- Module: Core
- Actions: `create`
- Migrations:
  - `database/migrations/0001_01_01_000000_create_users_table.php`
- Columns:
  - `id:string`
  - `user_id:foreignId`
  - `ip_address:string`
  - `user_agent:text`
  - `payload:longText`
  - `last_activity:integer`
- Index/Foreign notes:
  - `foreignId('user_id')`

### `subcontract_claims`

- Module: Subcontract
- Actions: `create`
- Migrations:
  - `app/Modules/Subcontract/Database/migrations/2026_03_26_131000_create_subcontract_tables.php`
- Columns:
  - `contract_id:foreignId`
  - `claim_no:string`
  - `claim_date:date`
  - `description:text`
  - `progress_percent:decimal`
  - `gross_amount:decimal`
  - `retention_amount:decimal`
  - `net_amount:decimal`
  - `status:string`
  - `journal_id:unsignedBigInteger`
  - `created_by:unsignedBigInteger`
  - `updated_by:unsignedBigInteger`
  - `submitted_at:timestamp`
  - `submitted_by:unsignedBigInteger`
  - `approved_at:timestamp`
  - `approved_by:unsignedBigInteger`
  - `rejected_at:timestamp`
  - `rejected_by:unsignedBigInteger`
  - `reject_reason:string`
  - `contract_id:index`
  - `status:index`
- Index/Foreign notes:
  - `foreignId('contract_id')`
  - `index(['contract_id', 'claim_date'], 'subcl_contract_date_idx')`
  - `index(['status'], 'subcl_status_idx')`

### `subcontract_contracts`

- Module: Subcontract
- Actions: `create`
- Migrations:
  - `app/Modules/Subcontract/Database/migrations/2026_03_26_131000_create_subcontract_tables.php`
- Columns:
  - `project_id:foreignId`
  - `vendor_id:foreignId`
  - `contract_no:string`
  - `contract_date:date`
  - `title:string`
  - `contract_amount:decimal`
  - `retention_percent:decimal`
  - `ap_account_id:foreignId`
  - `expense_account_id:foreignId`
  - `status:string`
  - `notes:text`
  - `is_active:boolean`
  - `created_by:unsignedBigInteger`
  - `updated_by:unsignedBigInteger`
  - `project_id:index`
  - `status:index`
- Index/Foreign notes:
  - `foreignId('project_id')`
  - `foreignId('vendor_id')`
  - `foreignId('ap_account_id')`
  - `foreignId('expense_account_id')`
  - `index(['project_id', 'vendor_id'], 'subc_proj_vendor_idx')`
  - `index(['status'], 'subc_status_idx')`

### `subcontract_payments`

- Module: Subcontract
- Actions: `create`
- Migrations:
  - `app/Modules/Subcontract/Database/migrations/2026_03_26_131000_create_subcontract_tables.php`
- Columns:
  - `contract_id:foreignId`
  - `claim_id:foreignId`
  - `payment_no:string`
  - `pay_date:date`
  - `amount_idr:decimal`
  - `method:string`
  - `reference_number:string`
  - `notes:text`
  - `bank_account_id:foreignId`
  - `ap_account_id:foreignId`
  - `status:string`
  - `journal_id:unsignedBigInteger`
  - `created_by:unsignedBigInteger`
  - `updated_by:unsignedBigInteger`
  - `posted_at:timestamp`
  - `posted_by:unsignedBigInteger`
  - `void_at:timestamp`
  - `void_by:unsignedBigInteger`
  - `contract_id:index`
  - `status:index`
- Index/Foreign notes:
  - `foreignId('contract_id')`
  - `foreignId('claim_id')`
  - `foreignId('bank_account_id')`
  - `foreignId('ap_account_id')`
  - `index(['contract_id', 'pay_date'], 'subp_contract_date_idx')`
  - `index(['status'], 'subp_status_idx')`

### `surat_perintah_lemburs`

- Module: SuratPerintahLembur
- Actions: `create`, `table`
- 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`
- Columns:
  - `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`
- Index/Foreign notes:
  - `foreign('karyawan_id', 'spl_karyawan_fk')`
  - `foreign('approval_flow_id', 'spl_flow_fk')`
  - `foreign('approval_request_id', 'spl_req_fk')`
  - `foreign('created_by', 'spl_creator_fk')`
  - `index(['work_date', 'status'], 'spl_work_status_idx')`
  - `foreign('job_id', 'spl_job_fk')`
  - `index(['job_id', 'work_date'], 'spl_job_date_idx')`
  - `foreign('separate_paid_by', 'spl_separate_paid_by_fk')`
  - `index(['separate_payment_status', 'work_date'], 'spl_separate_payment_idx')`

### `tax_ebupots`

- Module: TaxCompliance
- Actions: `create`
- Migrations:
  - `app/Modules/TaxCompliance/Database/migrations/2026_03_26_140000_create_tax_compliance_tables.php`
- Columns:
  - `source_type:string`
  - `source_id:unsignedBigInteger`
  - `vendor_id:unsignedBigInteger`
  - `project_id:unsignedBigInteger`
  - `bukti_potong_no:string`
  - `tax_type:string`
  - `doc_date:date`
  - `period:string`
  - `dpp_amount:decimal`
  - `tax_rate:decimal`
  - `tax_amount:decimal`
  - `status:string`
  - `notes:text`
  - `created_by:unsignedBigInteger`
  - `updated_by:unsignedBigInteger`
  - `tax_type:index`
  - `status:index`
  - `bukti_potong_no:index`
  - `source_type:index`
- Index/Foreign notes:
  - `index(['tax_type', 'period'], 'ebupot_type_period_idx')`
  - `index(['status', 'doc_date'], 'ebupot_status_date_idx')`
  - `index(['bukti_potong_no'], 'ebupot_no_idx')`
  - `index(['source_type', 'source_id'], 'ebupot_src_idx')`

### `tax_efakturs`

- Module: TaxCompliance
- Actions: `create`
- Migrations:
  - `app/Modules/TaxCompliance/Database/migrations/2026_03_26_140000_create_tax_compliance_tables.php`
- Columns:
  - `source_type:string`
  - `source_id:unsignedBigInteger`
  - `project_id:unsignedBigInteger`
  - `client_id:unsignedBigInteger`
  - `tax_invoice_number:string`
  - `invoice_number:string`
  - `invoice_date:date`
  - `dpp_amount:decimal`
  - `ppn_amount:decimal`
  - `ppnbm_amount:decimal`
  - `status:string`
  - `notes:text`
  - `created_by:unsignedBigInteger`
  - `updated_by:unsignedBigInteger`
  - `status:index`
  - `tax_invoice_number:index`
  - `source_type:index`
- Index/Foreign notes:
  - `index(['status', 'invoice_date'], 'efaktur_status_date_idx')`
  - `index(['tax_invoice_number'], 'efaktur_taxno_idx')`
  - `index(['source_type', 'source_id'], 'efaktur_src_idx')`

### `tax_logs`

- Module: TaxCompliance
- Actions: `create`
- Migrations:
  - `app/Modules/TaxCompliance/Database/migrations/2026_03_26_140000_create_tax_compliance_tables.php`
- Columns:
  - `log_type:string`
  - `action:string`
  - `status:string`
  - `reference_type:string`
  - `reference_id:unsignedBigInteger`
  - `period:string`
  - `logged_at:timestamp`
  - `message:text`
  - `payload:json`
  - `created_by:unsignedBigInteger`
  - `log_type:index`
  - `reference_type:index`
  - `logged_at:index`
- Index/Foreign notes:
  - `index(['log_type', 'period'], 'taxlog_type_period_idx')`
  - `index(['reference_type', 'reference_id'], 'taxlog_ref_idx')`
  - `index(['logged_at'], 'taxlog_at_idx')`

### `thr_payment_histories`

- Module: Penggajian
- Actions: `create`
- Migrations:
  - `app/Modules/Penggajian/Database/migrations/2026_03_03_150200_create_thr_payment_histories_table.php`
- Columns:
  - `thr_request_id:unsignedBigInteger`
  - `thr_request_detail_id:unsignedBigInteger`
  - `karyawan_id:unsignedBigInteger`
  - `pay_date:date`
  - `amount:decimal`
  - `payment_method:string`
  - `reference_no:string`
  - `bank_account_id:unsignedBigInteger`
  - `tax_no:string`
  - `status:string`
  - `paid_by:unsignedBigInteger`
  - `notes:text`
  - `thr_request_id:foreign`
  - `thr_request_detail_id:foreign`
  - `karyawan_id:foreign`
  - `paid_by:foreign`
  - `pay_date:index`
  - `karyawan_id:index`
- Index/Foreign notes:
  - `foreign('thr_request_id')`
  - `foreign('thr_request_detail_id')`
  - `foreign('karyawan_id')`
  - `foreign('paid_by')`
  - `index(['pay_date'], 'thr_pay_hist_pay_date_idx')`
  - `index(['karyawan_id', 'pay_date'], 'thr_pay_hist_karyawan_date_idx')`

### `thr_request_details`

- Module: Penggajian
- Actions: `create`
- Migrations:
  - `app/Modules/Penggajian/Database/migrations/2026_03_03_150100_create_thr_request_details_table.php`
- Columns:
  - `thr_request_id:unsignedBigInteger`
  - `profil_bulan_karyawan_id:unsignedBigInteger`
  - `karyawan_id:unsignedBigInteger`
  - `employment_status:string`
  - `base_salary_monthly:decimal`
  - `prorate_months:decimal`
  - `prorate_factor:decimal`
  - `thr_nominal:decimal`
  - `approved_nominal:decimal`
  - `paid_nominal:decimal`
  - `outstanding_nominal:decimal`
  - `status:string`
  - `last_paid_at:dateTime`
  - `notes:text`
  - `thr_request_id:foreign`
  - `profil_bulan_karyawan_id:foreign`
  - `karyawan_id:foreign`
  - `thr_request_id:unique`
  - `status:index`
- Index/Foreign notes:
  - `foreign('thr_request_id')`
  - `foreign('profil_bulan_karyawan_id')`
  - `foreign('karyawan_id')`
  - `unique(['thr_request_id', 'karyawan_id'], 'thr_req_detail_unique')`
  - `index(['status'], 'thr_request_details_status_idx')`

### `thr_requests`

- Module: Penggajian
- Actions: `create`
- Migrations:
  - `app/Modules/Penggajian/Database/migrations/2026_03_03_150000_create_thr_requests_table.php`
- Columns:
  - `request_no:string`
  - `year:unsignedSmallInteger`
  - `profil_bulan_id:unsignedBigInteger`
  - `status:string`
  - `total_nominal:decimal`
  - `approved_nominal:decimal`
  - `paid_nominal:decimal`
  - `outstanding_nominal:decimal`
  - `submitted_by:unsignedBigInteger`
  - `submitted_at:dateTime`
  - `approved_by:unsignedBigInteger`
  - `approved_at:dateTime`
  - `notes:text`
  - `is_active:boolean`
  - `profil_bulan_id:foreign`
  - `submitted_by:foreign`
  - `approved_by:foreign`
  - `year:index`
- Index/Foreign notes:
  - `foreign('profil_bulan_id')`
  - `foreign('submitted_by')`
  - `foreign('approved_by')`
  - `index(['year', 'status'], 'thr_requests_year_status_idx')`

### `users`

- Module: Core
- Actions: `create`, `table`
- Migrations:
  - `database/migrations/0001_01_01_000000_create_users_table.php`
  - `database/migrations/2026_02_10_091423_add_department_to_users_table.php`
  - `database/migrations/2026_02_11_120000_add_identity_fields_to_users_table.php`
  - `database/migrations/2026_02_12_173000_add_theme_preferences_to_users_table.php`
  - `database/migrations/2026_02_12_200000_add_signature_to_users_table.php`
  - `database/migrations/2026_02_12_203000_add_photo_to_users_table.php`
  - `database/migrations/2026_02_12_230000_add_dashboard_widget_order_to_users_table.php`
  - `database/migrations/2026_02_13_090000_add_otp_preferences_to_users_table.php`
- Columns:
  - `name:string`
  - `email:string`
  - `email_verified_at:timestamp`
  - `password:string`
  - `department:string`
  - `department:dropColumn`
  - `username:string`
  - `nomor_hp:string`
  - `pin:string`
  - `username:dropColumn`
  - `theme_profile:string`
  - `theme_color:string`
  - `layout_profile:string`
  - `layout_profile:dropColumn`
  - `theme_color:dropColumn`
  - `theme_profile:dropColumn`
  - `signature_path:string`
  - `signature_path:dropColumn`
  - `photo_path:string`
  - `photo_path:dropColumn`
  - `dashboard_widget_order:text`
  - `dashboard_widget_order:dropColumn`
  - `otp_enabled:boolean`
  - `otp_channel:string`
  - `otp_channel:dropColumn`
  - `otp_enabled:dropColumn`

### `vendor_pricelists`

- Module: VendorPricelist
- Actions: `create`
- Migrations:
  - `app/Modules/VendorPricelist/Database/migrations/2026_03_26_130000_create_vendor_pricelist_table.php`
- Columns:
  - `vendor_id:foreignId`
  - `item_id:foreignId`
  - `currency:string`
  - `price:decimal`
  - `min_qty:decimal`
  - `effective_from:date`
  - `effective_to:date`
  - `notes:text`
  - `is_active:boolean`
  - `created_by:unsignedBigInteger`
  - `updated_by:unsignedBigInteger`
  - `vendor_id:index`
  - `is_active:index`
- Index/Foreign notes:
  - `foreignId('vendor_id')`
  - `foreignId('item_id')`
  - `index(['vendor_id', 'item_id'], 'vpl_vendor_item_idx')`
  - `index(['is_active'], 'vpl_active_idx')`
