# Field Execution

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

## Ringkasan

Field Execution berada di kategori General. Modul ini memiliki 17 definisi route, 1 controller, 3 model, dan 2 view. Database module terdeteksi pada tabel: `project_site_reports`, `project_site_report_attachments`, `project_documents`.

## Flowchart

```mermaid
flowchart TD
    A[User / Operator] --> B[Menu Field Execution]
    B --> C[Routes: 17]
    C --> D[Controllers: 1]
    D --> E[Views: 2]
    D --> F[(Tables: 3<br/>project_site_reports<br/>project_site_report_attachments<br/>project_documents)]
    D --> G[Validation / Business Rules]
    G --> F
    F --> H[Report / Export / Audit]
```


## Routes

- `Route::middleware(['auth', 'ip.block', 'menu.access'])`  
  File: `app/Modules/FieldExecution/routes/web.php`
- `Route::get('/site-reports', [FieldExecutionController::class, 'siteReportsPage'])->name('site_reports.page');`  
  File: `app/Modules/FieldExecution/routes/web.php`
- `Route::get('/site-reports/data', [FieldExecutionController::class, 'siteReportsData'])->name('site_reports.data');`  
  File: `app/Modules/FieldExecution/routes/web.php`
- `Route::post('/site-reports', [FieldExecutionController::class, 'storeSiteReport'])->name('site_reports.store');`  
  File: `app/Modules/FieldExecution/routes/web.php`
- `Route::post('/site-reports/{id}/submit', [FieldExecutionController::class, 'submitSiteReport'])->name('site_reports.submit');`  
  File: `app/Modules/FieldExecution/routes/web.php`
- `Route::post('/site-reports/{id}/approve', [FieldExecutionController::class, 'approveSiteReport'])->name('site_reports.approve');`  
  File: `app/Modules/FieldExecution/routes/web.php`
- `Route::post('/site-reports/{id}/reject', [FieldExecutionController::class, 'rejectSiteReport'])->name('site_reports.reject');`  
  File: `app/Modules/FieldExecution/routes/web.php`
- `Route::get('/site-reports/{id}/attachments/{attId}/download', [FieldExecutionController::class, 'downloadSiteReportAttachment'])->name('site_reports.attachments.download');`  
  File: `app/Modules/FieldExecution/routes/web.php`
- `Route::get('/documents', [FieldExecutionController::class, 'documentsPage'])->name('documents.page');`  
  File: `app/Modules/FieldExecution/routes/web.php`
- `Route::get('/documents/data', [FieldExecutionController::class, 'documentsData'])->name('documents.data');`  
  File: `app/Modules/FieldExecution/routes/web.php`
- `Route::post('/documents', [FieldExecutionController::class, 'storeDocument'])->name('documents.store');`  
  File: `app/Modules/FieldExecution/routes/web.php`
- `Route::post('/documents/{docKey}/new-version', [FieldExecutionController::class, 'storeDocumentNewVersion'])->name('documents.new_version');`  
  File: `app/Modules/FieldExecution/routes/web.php`
- `Route::post('/documents/{id}/submit', [FieldExecutionController::class, 'submitDocument'])->name('documents.submit');`  
  File: `app/Modules/FieldExecution/routes/web.php`
- `Route::post('/documents/{id}/approve', [FieldExecutionController::class, 'approveDocument'])->name('documents.approve');`  
  File: `app/Modules/FieldExecution/routes/web.php`
- `Route::post('/documents/{id}/reject', [FieldExecutionController::class, 'rejectDocument'])->name('documents.reject');`  
  File: `app/Modules/FieldExecution/routes/web.php`
- `Route::get('/documents/{id}/download', [FieldExecutionController::class, 'downloadDocument'])->name('documents.download');`  
  File: `app/Modules/FieldExecution/routes/web.php`
- `Route::get('/projects/search', [FieldExecutionController::class, 'projectsSearch'])->name('projects.search');`  
  File: `app/Modules/FieldExecution/routes/web.php`

## Controllers

- `app/Modules/FieldExecution/Http/Controllers/FieldExecutionController.php`

## Models

- `app/Modules/FieldExecution/Models/ProjectDocumentModel.php`
- `app/Modules/FieldExecution/Models/ProjectSiteReportAttachmentModel.php`
- `app/Modules/FieldExecution/Models/ProjectSiteReportModel.php`

## Views

- `app/Modules/FieldExecution/Resources/views/documents.blade.php`
- `app/Modules/FieldExecution/Resources/views/site_reports.blade.php`

## Database / Migration

### `project_site_reports`
- Actions: `create`
- Columns: 21
  - `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`
- Migrations:
  - `app/Modules/FieldExecution/Database/migrations/2026_03_26_120000_create_field_execution_tables.php`
### `project_site_report_attachments`
- Actions: `create`
- Columns: 8
  - `site_report_id:foreignId`
  - `type:string`
  - `original_name:string`
  - `file_path:string`
  - `mime:string`
  - `size_bytes:unsignedBigInteger`
  - `uploaded_by:unsignedBigInteger`
  - `site_report_id:index`
- Migrations:
  - `app/Modules/FieldExecution/Database/migrations/2026_03_26_120000_create_field_execution_tables.php`
### `project_documents`
- Actions: `create`
- Columns: 25
  - `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`
- Migrations:
  - `app/Modules/FieldExecution/Database/migrations/2026_03_26_120000_create_field_execution_tables.php`
