# Master Project

- Module key: `MasterProject`
- Category: `Project/Logistik`
- Path: `app/Modules/MasterProject`

## Ringkasan

Master Project berada di kategori Project/Logistik. Modul ini memiliki 83 definisi route, 1 controller, 26 model, dan 17 view. Database module terdeteksi pada tabel: `master_projects`, `master_work_orders`, `master_rab_items`, `master_bom_items`, `master_rab_item_satuan_conversions`, `master_purchase_orders`, `master_purchase_order_items`, `master_project_quotations`, dan lainnya.

## Flowchart

```mermaid
flowchart TD
    A[User / Operator] --> B[Menu Master Project]
    B --> C[Routes: 83]
    C --> D[Controllers: 1]
    D --> E[Views: 17]
    D --> F[(Tables: 26<br/>master_projects<br/>master_work_orders<br/>master_rab_items<br/>master_bom_items<br/>master_rab_item_satuan_conversions)]
    D --> G[Validation / Business Rules]
    G --> F
    F --> H[Report / Export / Audit]
```


## Routes

- `Route::middleware(['auth', 'ip.block', 'menu.access'])->prefix('master-project')->name('master_project.')->group(function () {`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::get('/', [MasterProjectController::class, 'index'])->name('index');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::get('/invoice-progress', [MasterProjectController::class, 'invoiceProgressPage'])->name('invoice_progress.page');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::get('/rab-page', [MasterProjectController::class, 'rabPage'])->name('rab.page');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::get('/rab-project/{project_id}/detail', [MasterProjectController::class, 'rabProjectDetailPage'])->name('rab.project_detail');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::get('/material-requests', [MasterProjectController::class, 'materialRequestPage'])->name('material_requests.page');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::get('/purchase-orders', [MasterProjectController::class, 'poPage'])->name('po.page');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::get('/warehouse-receipts', [MasterProjectController::class, 'warehouseReceiptPage'])->name('warehouse_receipts.page');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::get('/warehouse-receipts/{id}/pdf', [MasterProjectController::class, 'warehouseReceiptPdf'])->name('warehouse_receipts.pdf');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::get('/warehouse-stock', [MasterProjectController::class, 'warehouseStockPage'])->name('warehouse_stock.page');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::get('/warehouse-stock/export-xlsx', [MasterProjectController::class, 'exportWarehouseStocksXlsx'])->name('warehouse_stock.export_xlsx');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::get('/warehouse-issues', [MasterProjectController::class, 'warehouseIssuePage'])->name('warehouse_issues.page');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::get('/warehouse-issues/{id}/pdf', [MasterProjectController::class, 'warehouseIssuePdf'])->name('warehouse_issues.pdf');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::get('/warehouse-transfers', [MasterProjectController::class, 'warehouseTransferPage'])->name('warehouse_transfers.page');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::get('/warehouse-adjustments', [MasterProjectController::class, 'warehouseAdjustmentPage'])->name('warehouse_adjustments.page');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::get('/penawaran/{project_id}', [MasterProjectController::class, 'quotationPage'])->name('quotation.page');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::get('/penawaran/{project_id}/data', [MasterProjectController::class, 'quotationData'])->name('quotation.data');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::post('/penawaran/{project_id}/save', [MasterProjectController::class, 'saveQuotation'])->name('quotation.save');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::post('/penawaran/{project_id}/approve', [MasterProjectController::class, 'approveQuotation'])->name('quotation.approve');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::get('projects/data', [MasterProjectController::class, 'projectsData'])->name('projects.data');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::get('projects/template', [MasterProjectController::class, 'templateProjects'])->name('projects.template');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::get('rab/upload-template', [MasterProjectController::class, 'templateRabUpload'])->name('rab.upload_template');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::get('projects/export', [MasterProjectController::class, 'exportProjects'])->name('projects.export');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::post('projects/import', [MasterProjectController::class, 'importProjects'])->name('projects.import');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::post('projects', [MasterProjectController::class, 'storeProject'])->name('projects.store');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::post('projects/{id}/additional', [MasterProjectController::class, 'createAdditionalProject'])->name('projects.additional');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::post('projects/{id}/generate-wo', [MasterProjectController::class, 'generateWorkOrderFromProject'])->name('projects.generate_wo');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::put('projects/{id}', [MasterProjectController::class, 'updateProject'])->name('projects.update');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::delete('projects/{id}', [MasterProjectController::class, 'destroyProject'])->name('projects.destroy');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::get('work-orders/data', [MasterProjectController::class, 'workOrdersData'])->name('work_orders.data');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::post('work-orders', [MasterProjectController::class, 'storeWorkOrder'])->name('work_orders.store');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::put('work-orders/{id}', [MasterProjectController::class, 'updateWorkOrder'])->name('work_orders.update');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::delete('work-orders/{id}', [MasterProjectController::class, 'destroyWorkOrder'])->name('work_orders.destroy');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::get('rab/data', [MasterProjectController::class, 'rabData'])->name('rab.data');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::post('rab/upload-review', [MasterProjectController::class, 'rabUploadReview'])->name('rab.upload_review');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::post('rab/upload-commit', [MasterProjectController::class, 'rabUploadCommit'])->name('rab.upload_commit');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::get('rab-scopes/data', [MasterProjectController::class, 'rabScopesData'])->name('rab_scopes.data');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::post('rab-scopes', [MasterProjectController::class, 'storeRabScope'])->name('rab_scopes.store');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::put('rab-scopes/{id}', [MasterProjectController::class, 'updateRabScope'])->name('rab_scopes.update');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::delete('rab-scopes/{id}', [MasterProjectController::class, 'destroyRabScope'])->name('rab_scopes.destroy');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::post('rab', [MasterProjectController::class, 'storeRab'])->name('rab.store');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::post('rab/{id}/convert-unit', [MasterProjectController::class, 'convertRabUnit'])->name('rab.convert_unit');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::put('rab/{id}', [MasterProjectController::class, 'updateRab'])->name('rab.update');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::delete('rab/{id}', [MasterProjectController::class, 'destroyRab'])->name('rab.destroy');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::get('purchase-orders/data', [MasterProjectController::class, 'purchaseOrdersData'])->name('po.data');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::post('purchase-orders', [MasterProjectController::class, 'storePurchaseOrder'])->name('po.store');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::put('purchase-orders/{id}', [MasterProjectController::class, 'updatePurchaseOrder'])->name('po.update');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::delete('purchase-orders/{id}', [MasterProjectController::class, 'destroyPurchaseOrder'])->name('po.destroy');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::get('purchase-order-deliveries/data', [MasterProjectController::class, 'purchaseOrderDeliveriesData'])->name('po_deliveries.data');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::post('purchase-order-deliveries', [MasterProjectController::class, 'storePurchaseOrderDelivery'])->name('po_deliveries.store');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::get('warehouse-stocks/data', [MasterProjectController::class, 'warehouseStocksData'])->name('warehouse_stocks.data');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::get('warehouse-stocks/card', [MasterProjectController::class, 'warehouseStockCardData'])->name('warehouse_stocks.card');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::get('warehouse-stocks/card/export-xlsx', [MasterProjectController::class, 'exportWarehouseStockCardXlsx'])->name('warehouse_stocks.card.export_xlsx');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::get('project-stock-issues/data', [MasterProjectController::class, 'projectStockIssuesData'])->name('project_stock_issues.data');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::post('project-stock-issues', [MasterProjectController::class, 'storeProjectStockIssue'])->name('project_stock_issues.store');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::get('project-stock-returns/data', [MasterProjectController::class, 'projectStockReturnsData'])->name('project_stock_returns.data');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::post('project-stock-returns', [MasterProjectController::class, 'storeProjectStockReturn'])->name('project_stock_returns.store');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::get('warehouse-transfers/data', [MasterProjectController::class, 'warehouseTransfersData'])->name('warehouse_transfers.data');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::post('warehouse-transfers', [MasterProjectController::class, 'storeWarehouseTransfer'])->name('warehouse_transfers.store');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::get('warehouse-transfers/{id}/pdf', [MasterProjectController::class, 'warehouseTransferPdf'])->name('warehouse_transfers.pdf');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::get('warehouse-transfers/{id}/trace', [MasterProjectController::class, 'warehouseTransferTraceData'])->name('warehouse_transfers.trace');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::get('warehouse-adjustments/data', [MasterProjectController::class, 'warehouseAdjustmentsData'])->name('warehouse_adjustments.data');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::post('warehouse-adjustments', [MasterProjectController::class, 'storeWarehouseAdjustment'])->name('warehouse_adjustments.store');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::get('material-requests/data', [MasterProjectController::class, 'materialRequestsData'])->name('material_requests.data');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::post('material-requests', [MasterProjectController::class, 'storeMaterialRequest'])->name('material_requests.store');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::post('material-requests/{id}/process-po', [MasterProjectController::class, 'processMaterialRequestToPo'])->name('material_requests.process_po');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::get('expenditures/data', [MasterProjectController::class, 'projectExpendituresData'])->name('expenditures.data');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::get('progress-schedules/data', [MasterProjectController::class, 'progressSchedulesData'])->name('progress_schedules.data');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::post('progress-schedules', [MasterProjectController::class, 'storeProgressSchedule'])->name('progress_schedules.store');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::put('progress-schedules/{id}', [MasterProjectController::class, 'updateProgressSchedule'])->name('progress_schedules.update');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::delete('progress-schedules/{id}', [MasterProjectController::class, 'destroyProgressSchedule'])->name('progress_schedules.destroy');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::get('progress-schedules/weight-suggestions', [MasterProjectController::class, 'progressScheduleWeightSuggestions'])->name('progress_schedules.weight_suggestions');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::post('progress-schedules/auto-weight', [MasterProjectController::class, 'autoWeightProgressSchedules'])->name('progress_schedules.auto_weight');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::get('progress-schedules/export-pdf', [MasterProjectController::class, 'exportProgressScheduleCurvePdf'])->name('progress_schedules.export_pdf');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::get('progress-schedules/export-xlsx', [MasterProjectController::class, 'exportProgressScheduleCurveXlsx'])->name('progress_schedules.export_xlsx');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::get('invoice-progress/data', [MasterProjectController::class, 'invoiceProgressData'])->name('invoice_progress.data');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::post('invoice-progress', [MasterProjectController::class, 'storeInvoiceProgress'])->name('invoice_progress.store');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::put('invoice-progress/{id}', [MasterProjectController::class, 'updateInvoiceProgress'])->name('invoice_progress.update');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::delete('invoice-progress/{id}', [MasterProjectController::class, 'destroyInvoiceProgress'])->name('invoice_progress.destroy');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::get('bom/data', [MasterProjectController::class, 'bomData'])->name('bom.data');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::post('bom', [MasterProjectController::class, 'storeBom'])->name('bom.store');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::put('bom/{id}', [MasterProjectController::class, 'updateBom'])->name('bom.update');`  
  File: `app/Modules/MasterProject/routes/web.php`
- `Route::delete('bom/{id}', [MasterProjectController::class, 'destroyBom'])->name('bom.destroy');`  
  File: `app/Modules/MasterProject/routes/web.php`

## Controllers

- `app/Modules/MasterProject/Http/Controllers/MasterProjectController.php`

## Models

- `app/Modules/MasterProject/Models/BomItemModel.php`
- `app/Modules/MasterProject/Models/MaterialRequestItemModel.php`
- `app/Modules/MasterProject/Models/MaterialRequestModel.php`
- `app/Modules/MasterProject/Models/ProjectModel.php`
- `app/Modules/MasterProject/Models/ProjectProgressInvoiceModel.php`
- `app/Modules/MasterProject/Models/ProjectProgressScheduleModel.php`
- `app/Modules/MasterProject/Models/ProjectQuotationItemModel.php`
- `app/Modules/MasterProject/Models/ProjectQuotationModel.php`
- `app/Modules/MasterProject/Models/ProjectStockIssueItemModel.php`
- `app/Modules/MasterProject/Models/ProjectStockIssueModel.php`
- `app/Modules/MasterProject/Models/ProjectStockReturnItemModel.php`
- `app/Modules/MasterProject/Models/ProjectStockReturnModel.php`
- `app/Modules/MasterProject/Models/PurchaseOrderDeliveryItemModel.php`
- `app/Modules/MasterProject/Models/PurchaseOrderDeliveryModel.php`
- `app/Modules/MasterProject/Models/PurchaseOrderItemModel.php`
- `app/Modules/MasterProject/Models/PurchaseOrderModel.php`
- `app/Modules/MasterProject/Models/PurchaseOrderServiceItemModel.php`
- `app/Modules/MasterProject/Models/RabItemModel.php`
- `app/Modules/MasterProject/Models/RabItemSatuanConversionModel.php`
- `app/Modules/MasterProject/Models/RabScopeModel.php`
- `app/Modules/MasterProject/Models/WarehouseAdjustmentItemModel.php`
- `app/Modules/MasterProject/Models/WarehouseAdjustmentModel.php`
- `app/Modules/MasterProject/Models/WarehouseStockMovementModel.php`
- `app/Modules/MasterProject/Models/WarehouseTransferItemModel.php`
- `app/Modules/MasterProject/Models/WarehouseTransferModel.php`
- `app/Modules/MasterProject/Models/WorkOrderModel.php`

## Views

- `app/Modules/MasterProject/Resources/views/index.blade.php`
- `app/Modules/MasterProject/Resources/views/invoice_progress.blade.php`
- `app/Modules/MasterProject/Resources/views/material_requests.blade.php`
- `app/Modules/MasterProject/Resources/views/partials/warehouse_nav.blade.php`
- `app/Modules/MasterProject/Resources/views/purchase_orders.blade.php`
- `app/Modules/MasterProject/Resources/views/quotation.blade.php`
- `app/Modules/MasterProject/Resources/views/rab.blade.php`
- `app/Modules/MasterProject/Resources/views/rab_project_detail.blade.php`
- `app/Modules/MasterProject/Resources/views/schedule_curve_pdf.blade.php`
- `app/Modules/MasterProject/Resources/views/warehouse_adjustments.blade.php`
- `app/Modules/MasterProject/Resources/views/warehouse_issue_pdf.blade.php`
- `app/Modules/MasterProject/Resources/views/warehouse_issues.blade.php`
- `app/Modules/MasterProject/Resources/views/warehouse_receipt_pdf.blade.php`
- `app/Modules/MasterProject/Resources/views/warehouse_receipts.blade.php`
- `app/Modules/MasterProject/Resources/views/warehouse_stock.blade.php`
- `app/Modules/MasterProject/Resources/views/warehouse_transfer_pdf.blade.php`
- `app/Modules/MasterProject/Resources/views/warehouse_transfers.blade.php`

## Database / Migration

### `master_projects`
- Actions: `create`, `table`
- Columns: 20
  - `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`
- 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`
### `master_work_orders`
- Actions: `create`
- Columns: 6
  - `project_id:foreignId`
  - `wo_number:string`
  - `title:string`
  - `status:string`
  - `description:text`
  - `is_active:boolean`
- Migrations:
  - `app/Modules/MasterProject/Database/migrations/2026_02_19_100000_create_master_project_tables.php`
### `master_rab_items`
- Actions: `create`, `table`
- Columns: 24
  - `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`
- 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`
### `master_bom_items`
- Actions: `create`
- Columns: 8
  - `rab_item_id:foreignId`
  - `material_code:string`
  - `material_name:string`
  - `qty:decimal`
  - `unit:string`
  - `notes:text`
  - `is_active:boolean`
  - `rab_item_id:unique`
- Migrations:
  - `app/Modules/MasterProject/Database/migrations/2026_02_19_100000_create_master_project_tables.php`
### `master_rab_item_satuan_conversions`
- Actions: `create`
- Columns: 4
  - `rab_item_id:foreignId`
  - `satuan_id:foreignId`
  - `conversion_value:decimal`
  - `rab_item_id:unique`
- Migrations:
  - `app/Modules/MasterProject/Database/migrations/2026_02_19_190000_add_item_unit_conversions_to_master_project_tables.php`
### `master_purchase_orders`
- Actions: `create`, `table`
- Columns: 24
  - `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`
- 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`
### `master_purchase_order_items`
- Actions: `create`, `table`
- Columns: 8
  - `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`
- 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`
### `master_project_quotations`
- Actions: `create`
- Columns: 9
  - `project_id:foreignId`
  - `quotation_number:string`
  - `quotation_date:date`
  - `valid_until:date`
  - `subject:string`
  - `notes:text`
  - `status:string`
  - `grand_total:decimal`
  - `project_id:unique`
- Migrations:
  - `app/Modules/MasterProject/Database/migrations/2026_02_19_200000_create_master_project_quotations_tables.php`
### `master_project_quotation_items`
- Actions: `create`
- Columns: 7
  - `quotation_id:foreignId`
  - `description:string`
  - `qty:decimal`
  - `unit:string`
  - `unit_price:decimal`
  - `total_price:decimal`
  - `sort_order:integer`
- Migrations:
  - `app/Modules/MasterProject/Database/migrations/2026_02_19_200000_create_master_project_quotations_tables.php`
### `master_rab_scopes`
- Actions: `create`
- Columns: 8
  - `project_id:foreignId`
  - `work_order_id:foreignId`
  - `scope_code:string`
  - `scope_name:string`
  - `sort_order:integer`
  - `description:text`
  - `is_active:boolean`
  - `project_id:unique`
- Migrations:
  - `app/Modules/MasterProject/Database/migrations/2026_02_19_201000_create_master_rab_scopes_table.php`
### `master_material_requests`
- Actions: `create`, `table`
- Columns: 9
  - `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`
- 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`
### `master_material_request_items`
- Actions: `create`, `table`
- Columns: 16
  - `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`
- 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`
### `master_project_progress_schedules`
- Actions: `create`, `table`
- Columns: 19
  - `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`
- 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`
### `master_project_progress_invoices`
- Actions: `create`, `table`
- Columns: 17
  - `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`
- 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`
### `master_purchase_order_deliveries`
- Actions: `create`
- Columns: 12
  - `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`
- Migrations:
  - `app/Modules/MasterProject/Database/migrations/2026_03_25_160000_create_master_purchase_order_deliveries_tables.php`
### `master_purchase_order_delivery_items`
- Actions: `create`
- Columns: 13
  - `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`
- Migrations:
  - `app/Modules/MasterProject/Database/migrations/2026_03_25_160000_create_master_purchase_order_deliveries_tables.php`
### `master_warehouse_stock_movements`
- Actions: `create`
- Columns: 23
  - `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`
- Migrations:
  - `app/Modules/MasterProject/Database/migrations/2026_03_25_160100_create_master_warehouse_stock_movements_table.php`
### `master_project_stock_issues`
- Actions: `create`
- Columns: 11
  - `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`
- Migrations:
  - `app/Modules/MasterProject/Database/migrations/2026_03_25_160200_create_master_project_stock_issues_tables.php`
### `master_project_stock_issue_items`
- Actions: `create`
- Columns: 15
  - `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`
- Migrations:
  - `app/Modules/MasterProject/Database/migrations/2026_03_25_160200_create_master_project_stock_issues_tables.php`
### `master_warehouse_transfers`
- Actions: `create`
- Columns: 12
  - `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`
- Migrations:
  - `app/Modules/MasterProject/Database/migrations/2026_03_25_170000_create_master_warehouse_transfers_tables.php`
### `master_warehouse_transfer_items`
- Actions: `create`
- Columns: 13
  - `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`
- Migrations:
  - `app/Modules/MasterProject/Database/migrations/2026_03_25_170000_create_master_warehouse_transfers_tables.php`
### `master_purchase_order_service_items`
- Actions: `create`
- Columns: 7
  - `purchase_order_id:foreignId`
  - `description:string`
  - `qty:decimal`
  - `unit:string`
  - `unit_price:decimal`
  - `total_price:decimal`
  - `notes:text`
- Migrations:
  - `app/Modules/MasterProject/Database/migrations/2026_03_25_180000_add_po_type_and_service_items.php`
### `master_warehouse_adjustments`
- Actions: `create`
- Columns: 8
  - `gudang_id:foreignId`
  - `gudang_id:foreign`
  - `adjustment_number:string`
  - `adjustment_date:date`
  - `adjustment_type:string`
  - `notes:text`
  - `created_by:unsignedBigInteger`
  - `is_active:boolean`
- Migrations:
  - `app/Modules/MasterProject/Database/migrations/2026_03_25_180100_create_master_warehouse_adjustments_tables.php`
### `master_warehouse_adjustment_items`
- Actions: `create`
- Columns: 14
  - `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`
- Migrations:
  - `app/Modules/MasterProject/Database/migrations/2026_03_25_180100_create_master_warehouse_adjustments_tables.php`
### `master_project_stock_returns`
- Actions: `create`
- Columns: 9
  - `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`
- Migrations:
  - `app/Modules/MasterProject/Database/migrations/2026_03_25_190000_create_master_project_stock_returns_tables.php`
### `master_project_stock_return_items`
- Actions: `create`
- Columns: 9
  - `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`
- Migrations:
  - `app/Modules/MasterProject/Database/migrations/2026_03_25_190000_create_master_project_stock_returns_tables.php`
