# kobusvanwyk/wcso-portal architecture

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

- Interactive diagram: https://gitdiagram.com/kobusvanwyk/wcso-portal
- Repository: https://github.com/kobusvanwyk/wcso-portal

## Overview

WCSO Portal & Website is a planned single-domain Tina4 PHP application for the Whale Coast Symphony Orchestra: a public website, member portal, and committee event-planning/admin area. The documented committee workflow is to plan a concert through four approval gates, manage its programme and projected budget, then record delivery actuals and review a report. The sampled implementation supports parts of the public site and committee workflow; the README says implementation has not yet started, so portal capabilities and several integrations are documented plans rather than verified runtime wiring.

Main entry points: [`src/routes/admin.php`](https://github.com/kobusvanwyk/wcso-portal/blob/main/src/routes/admin.php) (Committee routes), [`index.php`](https://github.com/kobusvanwyk/wcso-portal/blob/main/index.php) (Tina4 request app), [`src/app/Funnel.php`](https://github.com/kobusvanwyk/wcso-portal/blob/main/src/app/Funnel.php) (Gate rules), [`src/app/Budget.php`](https://github.com/kobusvanwyk/wcso-portal/blob/main/src/app/Budget.php) (Budget calculations)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_web["Public website"]
  node_public_routes["Public pages<br/>[public.php]"]
  node_home_route["Home page<br/>[home.php]"]
  node_public_views["Website templates"]
end

subgraph group_committee["Committee planning"]
  node_admin_routes["Committee routes<br/>[admin.php]"]
  node_admin_views["Admin templates"]
  node_funnel["Gate rules<br/>[Funnel.php]"]
  node_budget["Budget calculations<br/>[Budget.php]"]
end

subgraph group_domain["Event domain"]
  node_event["Concert lifecycle<br/>[Event.php]"]
  node_member_model["Member roles<br/>[Member.php]"]
  node_gate_answer[("Gate answers<br/>[GateAnswer.php]")]
  node_gate_approval[("Approval audit<br/>[GateApproval.php]")]
  node_event_budget[("Event projections<br/>[EventBudget.php]")]
  node_budget_cost[("Budget line items<br/>[BudgetCost.php]")]
  node_repertoire["Programme selection<br/>[Repertoire.php]"]
  node_piece[("Music library<br/>[Piece.php]")]
end

subgraph group_portal["Member portal plan"]
  node_portal_capabilities["Portal capabilities"]
  node_music_drive["Google Drive music"]
  node_email["Brevo / SMTP"]
end

node_visitor(("Visitor"))
node_committee_user(("Committee user"))
node_member(("Orchestra member"))
node_app["Tina4 request app<br/>[index.php]"]

node_visitor -->|"requests pages"| node_app
node_committee_user -->|"requests admin"| node_app
node_member -.->|"requests portal"| node_app
node_app -->|"dispatches"| node_public_routes
node_app -->|"dispatches"| node_home_route
node_app -->|"dispatches"| node_admin_routes
node_public_routes -->|"renders"| node_public_views
node_home_route -->|"renders"| node_public_views
node_admin_routes -->|"renders"| node_admin_views
node_admin_routes -->|"checks roles"| node_member_model
node_admin_routes -->|"reads and updates"| node_event
node_admin_routes -->|"checks gates"| node_funnel
node_admin_routes -->|"gets projections"| node_budget
node_admin_routes -->|"manages programme"| node_repertoire
node_admin_routes -->|"manages pieces"| node_piece
node_funnel -->|"reads answers"| node_gate_answer
node_funnel -->|"checks approvals"| node_gate_approval
node_budget -->|"reads projection"| node_event_budget
node_budget -->|"reads costs"| node_budget_cost
node_repertoire -->|"looks up duration"| node_piece
node_portal_capabilities -.->|"planned linking"| node_music_drive
node_portal_capabilities -.->|"planned email"| node_email

click node_app "https://github.com/kobusvanwyk/wcso-portal/blob/main/index.php"
click node_public_routes "https://github.com/kobusvanwyk/wcso-portal/blob/main/src/routes/public.php"
click node_home_route "https://github.com/kobusvanwyk/wcso-portal/blob/main/src/routes/home.php"
click node_public_views "https://github.com/kobusvanwyk/wcso-portal/tree/main/src/templates/pages"
click node_admin_routes "https://github.com/kobusvanwyk/wcso-portal/blob/main/src/routes/admin.php"
click node_admin_views "https://github.com/kobusvanwyk/wcso-portal/tree/main/src/templates/pages/admin"
click node_funnel "https://github.com/kobusvanwyk/wcso-portal/blob/main/src/app/Funnel.php"
click node_budget "https://github.com/kobusvanwyk/wcso-portal/blob/main/src/app/Budget.php"
click node_event "https://github.com/kobusvanwyk/wcso-portal/blob/main/src/orm/Event.php"
click node_member_model "https://github.com/kobusvanwyk/wcso-portal/blob/main/src/orm/Member.php"
click node_gate_answer "https://github.com/kobusvanwyk/wcso-portal/blob/main/src/orm/GateAnswer.php"
click node_gate_approval "https://github.com/kobusvanwyk/wcso-portal/blob/main/src/orm/GateApproval.php"
click node_event_budget "https://github.com/kobusvanwyk/wcso-portal/blob/main/src/orm/EventBudget.php"
click node_budget_cost "https://github.com/kobusvanwyk/wcso-portal/blob/main/src/orm/BudgetCost.php"
click node_repertoire "https://github.com/kobusvanwyk/wcso-portal/blob/main/src/orm/Repertoire.php"
click node_piece "https://github.com/kobusvanwyk/wcso-portal/blob/main/src/orm/Piece.php"
click node_portal_capabilities "https://github.com/kobusvanwyk/wcso-portal/tree/main/src/routes"

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_public_routes,node_home_route,node_public_views,node_committee_user toneBlue
class node_admin_routes,node_admin_views,node_funnel,node_budget toneAmber
class node_event,node_member_model,node_gate_answer,node_gate_approval,node_event_budget,node_budget_cost,node_repertoire,node_piece,node_app toneMint
class node_portal_capabilities,node_music_drive,node_email toneRose
class node_visitor,node_member toneIndigo
```

## Components

### Public website

- [Public pages](https://github.com/kobusvanwyk/wcso-portal/blob/main/src/routes/public.php): `src/routes/public.php`
- [Home page](https://github.com/kobusvanwyk/wcso-portal/blob/main/src/routes/home.php): `src/routes/home.php`
- [Website templates](https://github.com/kobusvanwyk/wcso-portal/tree/main/src/templates/pages): `src/templates/pages`

### Committee planning

- [Committee routes](https://github.com/kobusvanwyk/wcso-portal/blob/main/src/routes/admin.php): `src/routes/admin.php`
- [Admin templates](https://github.com/kobusvanwyk/wcso-portal/tree/main/src/templates/pages/admin): `src/templates/pages/admin`
- [Gate rules](https://github.com/kobusvanwyk/wcso-portal/blob/main/src/app/Funnel.php): `src/app/Funnel.php`
- [Budget calculations](https://github.com/kobusvanwyk/wcso-portal/blob/main/src/app/Budget.php): `src/app/Budget.php`

### Event domain

- [Concert lifecycle](https://github.com/kobusvanwyk/wcso-portal/blob/main/src/orm/Event.php): `src/orm/Event.php`
- [Member roles](https://github.com/kobusvanwyk/wcso-portal/blob/main/src/orm/Member.php): `src/orm/Member.php`
- [Gate answers](https://github.com/kobusvanwyk/wcso-portal/blob/main/src/orm/GateAnswer.php): `src/orm/GateAnswer.php`
- [Approval audit](https://github.com/kobusvanwyk/wcso-portal/blob/main/src/orm/GateApproval.php): `src/orm/GateApproval.php`
- [Event projections](https://github.com/kobusvanwyk/wcso-portal/blob/main/src/orm/EventBudget.php): `src/orm/EventBudget.php`
- [Budget line items](https://github.com/kobusvanwyk/wcso-portal/blob/main/src/orm/BudgetCost.php): `src/orm/BudgetCost.php`
- [Programme selection](https://github.com/kobusvanwyk/wcso-portal/blob/main/src/orm/Repertoire.php): `src/orm/Repertoire.php`
- [Music library](https://github.com/kobusvanwyk/wcso-portal/blob/main/src/orm/Piece.php): `src/orm/Piece.php`

### Member portal plan

- [Portal capabilities](https://github.com/kobusvanwyk/wcso-portal/tree/main/src/routes): `src/routes`
- **Google Drive music**
- **Brevo / SMTP**

### Other components

- **Visitor**
- **Committee user**
- **Orchestra member**
- [Tina4 request app](https://github.com/kobusvanwyk/wcso-portal/blob/main/index.php): `index.php`

## Connections

- Visitor → Tina4 request app: requests pages
- Committee user → Tina4 request app: requests admin
- Orchestra member → Tina4 request app: requests portal
- Tina4 request app → Public pages: dispatches
- Tina4 request app → Home page: dispatches
- Tina4 request app → Committee routes: dispatches
- Public pages → Website templates: renders
- Home page → Website templates: renders
- Committee routes → Admin templates: renders
- Committee routes → Member roles: checks roles
- Committee routes → Concert lifecycle: reads and updates
- Committee routes → Gate rules: checks gates
- Committee routes → Budget calculations: gets projections
- Committee routes → Programme selection: manages programme
- Committee routes → Music library: manages pieces
- Gate rules → Gate answers: reads answers
- Gate rules → Approval audit: checks approvals
- Budget calculations → Event projections: reads projection
- Budget calculations → Budget line items: reads costs
- Programme selection → Music library: looks up duration
- Portal capabilities → Google Drive music: planned linking
- Portal capabilities → Brevo / SMTP: planned email
