# pramacoder/pengajuanproposal architecture

> Architecture diagram of the GitHub repository pramacoder/pengajuanproposal, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-28). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/pramacoder/pengajuanproposal
- Repository: https://github.com/pramacoder/pengajuanproposal

## Overview

Sistem Pengajuan Proposal PKM is a multi-role Laravel application that takes student proposals through supervisor validation, reviewer assignment and review, revision, selection, university validation, and final funding decisions. Operators manage review stages and system data; students and faculty can monitor outcomes. The README documents the end-to-end stages and Supabase-backed relational data and fallback file storage. Sampled controller and service excerpts confirm reviewer assignment, review completion, and review retrieval; other stage connections reflect documented workflow, not inspection of every controller.

Main entry points: [`routes/web.php`](https://github.com/pramacoder/pengajuanproposal/blob/main/routes/web.php) (Web routes), [`app/Models/Proposal.php`](https://github.com/pramacoder/pengajuanproposal/blob/main/app/Models/Proposal.php) (Proposal and review data), [`app/Helpers/StorageHelper.php`](https://github.com/pramacoder/pengajuanproposal/blob/main/app/Helpers/StorageHelper.php) (Proposal file storage), [`app/Http/Controllers/Mahasiswa/ProposalController.php`](https://github.com/pramacoder/pengajuanproposal/blob/main/app/Http/Controllers/Mahasiswa/ProposalController.php) (Proposal submission)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_access["Access and operations"]
  node_routes["Web routes<br/>[web.php]"]
  node_auth["Authentication and roles<br/>[AuthController.php]"]
  node_accounts["Account management"]
  node_control["Phase control"]
end

subgraph group_proposal["Proposal lifecycle"]
  node_submission["Proposal submission"]
  node_supervision["Supervisor validation"]
  node_revisions["Proposal revisions"]
end

subgraph group_review["Review and selection"]
  node_assignment["Reviewer assignment"]
  node_administrative["Administrative review"]
  node_substantive["Substantive review"]
  node_completion["Review completion"]
  node_selection["Semi-final selection"]
end

subgraph group_outcome["Results and services"]
  node_university["Final validation"]
  node_final["Final funding decision"]
  node_monitoring["Proposal and result views"]
  node_notifications["Notifications"]
  node_proposaldata[("Proposal and review data<br/>[Proposal.php]")]
  node_filestorage["Proposal file storage<br/>[StorageHelper.php]"]
end

node_student(("Student"))
node_supervisor(("Supervisor"))
node_reviewer(("Reviewer"))
node_operator(("Operator"))
node_leadership(("University leadership"))
node_supabase[("Supabase storage")]
node_localdisk[("Local disk fallback")]

node_student -->|"opens application"| node_routes
node_supervisor -->|"opens application"| node_routes
node_reviewer -->|"opens application"| node_routes
node_operator -->|"opens application"| node_routes
node_leadership -->|"opens application"| node_routes
node_routes -->|"routes requests"| node_auth
node_routes -->|"dispatches submissions"| node_submission
node_routes -->|"dispatches validation"| node_supervision
node_routes -->|"dispatches assignments"| node_assignment
node_routes -->|"dispatches reviews"| node_administrative
node_routes -->|"dispatches reviews"| node_substantive
node_routes -->|"dispatches revisions"| node_revisions
node_routes -->|"dispatches decisions"| node_selection
node_routes -->|"dispatches validation"| node_university
node_routes -->|"dispatches decisions"| node_final
node_submission -->|"writes proposal"| node_proposaldata
node_submission -->|"stores documents"| node_filestorage
node_supervision -->|"updates validation"| node_proposaldata
node_assignment -->|"assigns reviewers"| node_proposaldata
node_assignment -->|"notifies assignment"| node_notifications
node_administrative -->|"records review"| node_proposaldata
node_substantive -->|"records scores"| node_proposaldata
node_substantive -->|"checks completion"| node_completion
node_completion -->|"reads reviews"| node_proposaldata
node_completion -->|"notifies revision"| node_notifications
node_revisions -->|"updates proposal"| node_proposaldata
node_revisions -->|"stores revisions"| node_filestorage
node_selection -->|"records outcomes"| node_proposaldata
node_university -->|"updates validation"| node_proposaldata
node_final -->|"records final results"| node_proposaldata
node_monitoring -->|"reads reviews and results"| node_proposaldata
node_notifications -->|"stores notifications"| node_proposaldata
node_filestorage -->|"uses primary storage"| node_supabase
node_filestorage -.->|"falls back"| node_localdisk
node_control -->|"gates active phases"| node_routes
node_accounts -->|"manages user records"| node_proposaldata

click node_routes "https://github.com/pramacoder/pengajuanproposal/blob/main/routes/web.php"
click node_auth "https://github.com/pramacoder/pengajuanproposal/blob/main/app/Http/Controllers/AuthController.php"
click node_accounts "https://github.com/pramacoder/pengajuanproposal/blob/main/app/Http/Controllers/Operator/AccountManagementController.php"
click node_control "https://github.com/pramacoder/pengajuanproposal/blob/main/app/Services/RuangKontrolService.php"
click node_submission "https://github.com/pramacoder/pengajuanproposal/blob/main/app/Http/Controllers/Mahasiswa/ProposalController.php"
click node_supervision "https://github.com/pramacoder/pengajuanproposal/blob/main/app/Http/Controllers/DosenController.php"
click node_revisions "https://github.com/pramacoder/pengajuanproposal/blob/main/app/Http/Controllers/Mahasiswa/ProposalRevisiController.php"
click node_assignment "https://github.com/pramacoder/pengajuanproposal/blob/main/app/Services/ReviewerAssignmentService.php"
click node_administrative "https://github.com/pramacoder/pengajuanproposal/blob/main/app/Http/Controllers/Reviewer/AdministratifController.php"
click node_substantive "https://github.com/pramacoder/pengajuanproposal/blob/main/app/Http/Controllers/Reviewer/SubstantifController.php"
click node_completion "https://github.com/pramacoder/pengajuanproposal/blob/main/app/Services/ReviewCompletionService.php"
click node_selection "https://github.com/pramacoder/pengajuanproposal/blob/main/app/Http/Controllers/Operator/HasilController.php"
click node_university "https://github.com/pramacoder/pengajuanproposal/blob/main/app/Http/Controllers/DosenController.php"
click node_final "https://github.com/pramacoder/pengajuanproposal/blob/main/app/Http/Controllers/PimpinanPTController.php"
click node_monitoring "https://github.com/pramacoder/pengajuanproposal/blob/main/app/Http/Controllers/Mahasiswa/ProposalReviewController.php"
click node_notifications "https://github.com/pramacoder/pengajuanproposal/blob/main/app/Services/NotificationService.php"
click node_proposaldata "https://github.com/pramacoder/pengajuanproposal/blob/main/app/Models/Proposal.php"
click node_filestorage "https://github.com/pramacoder/pengajuanproposal/blob/main/app/Helpers/StorageHelper.php"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_routes,node_auth,node_accounts,node_control,node_reviewer toneBlue
class node_submission,node_supervision,node_revisions,node_supabase,node_localdisk toneAmber
class node_assignment,node_administrative,node_substantive,node_completion,node_selection toneMint
class node_university,node_final,node_monitoring,node_notifications,node_proposaldata,node_filestorage toneRose
class node_student,node_supervisor,node_operator,node_leadership toneIndigo
```

## Components

### Access and operations

- [Web routes](https://github.com/pramacoder/pengajuanproposal/blob/main/routes/web.php): `routes/web.php`
- [Authentication and roles](https://github.com/pramacoder/pengajuanproposal/blob/main/app/Http/Controllers/AuthController.php): `app/Http/Controllers/AuthController.php`
- [Account management](https://github.com/pramacoder/pengajuanproposal/blob/main/app/Http/Controllers/Operator/AccountManagementController.php): `app/Http/Controllers/Operator/AccountManagementController.php`
- [Phase control](https://github.com/pramacoder/pengajuanproposal/blob/main/app/Services/RuangKontrolService.php): `app/Services/RuangKontrolService.php`

### Proposal lifecycle

- [Proposal submission](https://github.com/pramacoder/pengajuanproposal/blob/main/app/Http/Controllers/Mahasiswa/ProposalController.php): `app/Http/Controllers/Mahasiswa/ProposalController.php`
- [Supervisor validation](https://github.com/pramacoder/pengajuanproposal/blob/main/app/Http/Controllers/DosenController.php): `app/Http/Controllers/DosenController.php`
- [Proposal revisions](https://github.com/pramacoder/pengajuanproposal/blob/main/app/Http/Controllers/Mahasiswa/ProposalRevisiController.php): `app/Http/Controllers/Mahasiswa/ProposalRevisiController.php`

### Review and selection

- [Reviewer assignment](https://github.com/pramacoder/pengajuanproposal/blob/main/app/Services/ReviewerAssignmentService.php): `app/Services/ReviewerAssignmentService.php`
- [Administrative review](https://github.com/pramacoder/pengajuanproposal/blob/main/app/Http/Controllers/Reviewer/AdministratifController.php): `app/Http/Controllers/Reviewer/AdministratifController.php`
- [Substantive review](https://github.com/pramacoder/pengajuanproposal/blob/main/app/Http/Controllers/Reviewer/SubstantifController.php): `app/Http/Controllers/Reviewer/SubstantifController.php`
- [Review completion](https://github.com/pramacoder/pengajuanproposal/blob/main/app/Services/ReviewCompletionService.php): `app/Services/ReviewCompletionService.php`
- [Semi-final selection](https://github.com/pramacoder/pengajuanproposal/blob/main/app/Http/Controllers/Operator/HasilController.php): `app/Http/Controllers/Operator/HasilController.php`

### Results and services

- [Final validation](https://github.com/pramacoder/pengajuanproposal/blob/main/app/Http/Controllers/DosenController.php): `app/Http/Controllers/DosenController.php`
- [Final funding decision](https://github.com/pramacoder/pengajuanproposal/blob/main/app/Http/Controllers/PimpinanPTController.php): `app/Http/Controllers/PimpinanPTController.php`
- [Proposal and result views](https://github.com/pramacoder/pengajuanproposal/blob/main/app/Http/Controllers/Mahasiswa/ProposalReviewController.php): `app/Http/Controllers/Mahasiswa/ProposalReviewController.php`
- [Notifications](https://github.com/pramacoder/pengajuanproposal/blob/main/app/Services/NotificationService.php): `app/Services/NotificationService.php`
- [Proposal and review data](https://github.com/pramacoder/pengajuanproposal/blob/main/app/Models/Proposal.php): `app/Models/Proposal.php`
- [Proposal file storage](https://github.com/pramacoder/pengajuanproposal/blob/main/app/Helpers/StorageHelper.php): `app/Helpers/StorageHelper.php`

### Other components

- **Student**
- **Supervisor**
- **Reviewer**
- **Operator**
- **University leadership**
- **Supabase storage**
- **Local disk fallback**

## Connections

- Student → Web routes: opens application
- Supervisor → Web routes: opens application
- Reviewer → Web routes: opens application
- Operator → Web routes: opens application
- University leadership → Web routes: opens application
- Web routes → Authentication and roles: routes requests
- Web routes → Proposal submission: dispatches submissions
- Web routes → Supervisor validation: dispatches validation
- Web routes → Reviewer assignment: dispatches assignments
- Web routes → Administrative review: dispatches reviews
- Web routes → Substantive review: dispatches reviews
- Web routes → Proposal revisions: dispatches revisions
- Web routes → Semi-final selection: dispatches decisions
- Web routes → Final validation: dispatches validation
- Web routes → Final funding decision: dispatches decisions
- Proposal submission → Proposal and review data: writes proposal
- Proposal submission → Proposal file storage: stores documents
- Supervisor validation → Proposal and review data: updates validation
- Reviewer assignment → Proposal and review data: assigns reviewers
- Reviewer assignment → Notifications: notifies assignment
- Administrative review → Proposal and review data: records review
- Substantive review → Proposal and review data: records scores
- Substantive review → Review completion: checks completion
- Review completion → Proposal and review data: reads reviews
- Review completion → Notifications: notifies revision
- Proposal revisions → Proposal and review data: updates proposal
- Proposal revisions → Proposal file storage: stores revisions
- Semi-final selection → Proposal and review data: records outcomes
- Final validation → Proposal and review data: updates validation
- Final funding decision → Proposal and review data: records final results
- Proposal and result views → Proposal and review data: reads reviews and results
- Notifications → Proposal and review data: stores notifications
- Proposal file storage → Supabase storage: uses primary storage
- Proposal file storage → Local disk fallback: falls back
- Phase control → Web routes: gates active phases
- Account management → Proposal and review data: manages user records
