# lpuigo/projectportfoliomanager architecture

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

- Interactive diagram: https://gitdiagram.com/lpuigo/projectportfoliomanager
- Repository: https://github.com/lpuigo/projectportfoliomanager

## Overview

Project Portfolio Manager is a web application for maintaining project portfolios and reviewing their status, workload, and Jira-derived statistics. The main workflow runs from the browser’s project table through HTTP routes to the manager, which reads or changes project data and returns JSON; users can also inspect project statistics, workload schedules, timelines, and Jira logs. Statistics can be updated from imported files, while Jira queries provide a separate log integration. The graph reflects the supplied excerpts and README; several UI and manager subsystems are represented at their exact enclosing paths because their source was not sampled.

Main entry points: [`src/client/hvue/prjapp.go`](https://github.com/lpuigo/projectportfoliomanager/blob/master/src/client/hvue/prjapp.go) (Browser UI), [`src/server/manager/manager.go`](https://github.com/lpuigo/projectportfoliomanager/blob/master/src/server/manager/manager.go) (Application manager), [`src/server/main.go`](https://github.com/lpuigo/projectportfoliomanager/blob/master/src/server/main.go) (HTTP server), [`src/server/manager/prjmanager.go`](https://github.com/lpuigo/projectportfoliomanager/blob/master/src/server/manager/prjmanager.go) (Project manager)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_web["Web interface"]
  node_browser["Browser UI<br/>[prjapp.go]"]
  node_project_ui["Project table"]
  node_edit_ui["Project editor"]
  node_audit["Project audits<br/>[audit.go]"]
  node_stat_ui["Statistics views"]
  node_jira_ui["Jira statistics view"]
  node_schedule_ui["Workload and timeline"]
  node_frontmodel["Project view model<br/>[project.go]"]
end

subgraph group_api["HTTP application"]
  node_http["HTTP server<br/>[main.go]"]
  node_routes["API routes<br/>[route.go]"]
  node_manager["Application manager<br/>[manager.go]"]
end

subgraph group_portfolio["Portfolio domain"]
  node_project_manager["Project manager<br/>[prjmanager.go]"]
  node_portfolio_data["Project portfolio<br/>[prjportfolio.go]"]
  node_project_model["Project domain model<br/>[project.go]"]
  node_data_manager["Persistence and locking<br/>[datamanager.go]"]
end

subgraph group_insights["Statistics and insights"]
  node_stats["Statistics manager<br/>[statmanager.go]"]
  node_workload["Workload scheduling"]
  node_record_set["Indexed stat records"]
end

subgraph group_integrations["Data integrations"]
  node_file_processing["Stat file processing<br/>[fileprocesser.go]"]
  node_jira_manager["Jira manager<br/>[jiramanager.go]"]
  node_xlsx["Spreadsheet adaptor<br/>[xlsxadaptor.go]"]
end

node_user(("Portfolio user"))
node_jira_db[("Jira database")]

node_user -->|"uses"| node_browser
node_browser -->|"renders"| node_project_ui
node_browser -->|"opens"| node_edit_ui
node_browser -->|"opens"| node_stat_ui
node_browser -->|"opens"| node_jira_ui
node_browser -->|"opens"| node_schedule_ui
node_browser -->|"audits projects"| node_audit
node_browser -->|"maps project data"| node_frontmodel
node_browser -->|"requests API"| node_http
node_http -->|"initializes"| node_manager
node_http -->|"dispatches requests"| node_routes
node_routes -->|"invokes operations"| node_manager
node_manager -->|"manages projects"| node_project_manager
node_manager -->|"reads and updates stats"| node_stats
node_manager -->|"calculates schedule"| node_workload
node_manager -->|"requests Jira logs"| node_jira_manager
node_manager -->|"processes stat files"| node_file_processing
node_manager -->|"exports portfolio"| node_xlsx
node_project_manager -->|"loads and manages"| node_portfolio_data
node_project_manager -->|"locks and persists"| node_data_manager
node_data_manager -->|"persists portfolio"| node_portfolio_data
node_portfolio_data -->|"stores projects"| node_project_model
node_stats -->|"indexes stat records"| node_record_set
node_file_processing -->|"updates statistics"| node_stats
node_jira_manager -.->|"queries"| node_jira_db

click node_browser "https://github.com/lpuigo/projectportfoliomanager/blob/master/src/client/hvue/prjapp.go"
click node_project_ui "https://github.com/lpuigo/projectportfoliomanager/blob/master/src/client/hvue/comps/project_table/project_table_comp.go"
click node_edit_ui "https://github.com/lpuigo/projectportfoliomanager/blob/master/src/client/hvue/comps/project_edit_modal/project_edit_modal_comp.go"
click node_audit "https://github.com/lpuigo/projectportfoliomanager/blob/master/src/client/auditrules/audit.go"
click node_stat_ui "https://github.com/lpuigo/projectportfoliomanager/blob/master/src/client/hvue/comps/project_stat_modal/project_stat_modal.go"
click node_jira_ui "https://github.com/lpuigo/projectportfoliomanager/blob/master/src/client/hvue/comps/jira_stat_modal/jira_stat_modal_comp.go"
click node_schedule_ui "https://github.com/lpuigo/projectportfoliomanager/blob/master/src/client/hvue/comps/workloadschedule_modal/workloadschedule_modal.go"
click node_frontmodel "https://github.com/lpuigo/projectportfoliomanager/blob/master/src/client/frontmodel/project.go"
click node_http "https://github.com/lpuigo/projectportfoliomanager/blob/master/src/server/main.go"
click node_routes "https://github.com/lpuigo/projectportfoliomanager/blob/master/src/server/route/route.go"
click node_manager "https://github.com/lpuigo/projectportfoliomanager/blob/master/src/server/manager/manager.go"
click node_project_manager "https://github.com/lpuigo/projectportfoliomanager/blob/master/src/server/manager/prjmanager.go"
click node_portfolio_data "https://github.com/lpuigo/projectportfoliomanager/blob/master/src/server/manager/prjportfolio.go"
click node_project_model "https://github.com/lpuigo/projectportfoliomanager/blob/master/src/server/model/project.go"
click node_stats "https://github.com/lpuigo/projectportfoliomanager/blob/master/src/server/manager/statmanager.go"
click node_workload "https://github.com/lpuigo/projectportfoliomanager/blob/master/src/server/manager/workloadschedule/workloadschedule.go"
click node_file_processing "https://github.com/lpuigo/projectportfoliomanager/blob/master/src/server/manager/fileprocesser/fileprocesser.go"
click node_jira_manager "https://github.com/lpuigo/projectportfoliomanager/blob/master/src/server/manager/jiramanager/jiramanager.go"
click node_data_manager "https://github.com/lpuigo/projectportfoliomanager/blob/master/src/server/manager/datamanager/datamanager.go"
click node_record_set "https://github.com/lpuigo/projectportfoliomanager/blob/master/src/server/manager/recordindexedset/recordindexedset.go"
click node_xlsx "https://github.com/lpuigo/projectportfoliomanager/blob/master/src/server/manager/xlsxadaptor.go"

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_browser,node_project_ui,node_edit_ui,node_audit,node_stat_ui,node_jira_ui,node_schedule_ui,node_frontmodel,node_user toneBlue
class node_http,node_routes,node_manager,node_jira_db toneAmber
class node_project_manager,node_portfolio_data,node_project_model,node_data_manager toneMint
class node_stats,node_workload,node_record_set toneRose
class node_file_processing,node_jira_manager,node_xlsx toneIndigo
```

## Components

### Web interface

- [Browser UI](https://github.com/lpuigo/projectportfoliomanager/blob/master/src/client/hvue/prjapp.go): `src/client/hvue/prjapp.go`
- [Project table](https://github.com/lpuigo/projectportfoliomanager/blob/master/src/client/hvue/comps/project_table/project_table_comp.go): `src/client/hvue/comps/project_table/project_table_comp.go`
- [Project editor](https://github.com/lpuigo/projectportfoliomanager/blob/master/src/client/hvue/comps/project_edit_modal/project_edit_modal_comp.go): `src/client/hvue/comps/project_edit_modal/project_edit_modal_comp.go`
- [Project audits](https://github.com/lpuigo/projectportfoliomanager/blob/master/src/client/auditrules/audit.go): `src/client/auditrules/audit.go`
- [Statistics views](https://github.com/lpuigo/projectportfoliomanager/blob/master/src/client/hvue/comps/project_stat_modal/project_stat_modal.go): `src/client/hvue/comps/project_stat_modal/project_stat_modal.go`
- [Jira statistics view](https://github.com/lpuigo/projectportfoliomanager/blob/master/src/client/hvue/comps/jira_stat_modal/jira_stat_modal_comp.go): `src/client/hvue/comps/jira_stat_modal/jira_stat_modal_comp.go`
- [Workload and timeline](https://github.com/lpuigo/projectportfoliomanager/blob/master/src/client/hvue/comps/workloadschedule_modal/workloadschedule_modal.go): `src/client/hvue/comps/workloadschedule_modal/workloadschedule_modal.go`
- [Project view model](https://github.com/lpuigo/projectportfoliomanager/blob/master/src/client/frontmodel/project.go): `src/client/frontmodel/project.go`

### HTTP application

- [HTTP server](https://github.com/lpuigo/projectportfoliomanager/blob/master/src/server/main.go): `src/server/main.go`
- [API routes](https://github.com/lpuigo/projectportfoliomanager/blob/master/src/server/route/route.go): `src/server/route/route.go`
- [Application manager](https://github.com/lpuigo/projectportfoliomanager/blob/master/src/server/manager/manager.go): `src/server/manager/manager.go`

### Portfolio domain

- [Project manager](https://github.com/lpuigo/projectportfoliomanager/blob/master/src/server/manager/prjmanager.go): `src/server/manager/prjmanager.go`
- [Project portfolio](https://github.com/lpuigo/projectportfoliomanager/blob/master/src/server/manager/prjportfolio.go): `src/server/manager/prjportfolio.go`
- [Project domain model](https://github.com/lpuigo/projectportfoliomanager/blob/master/src/server/model/project.go): `src/server/model/project.go`
- [Persistence and locking](https://github.com/lpuigo/projectportfoliomanager/blob/master/src/server/manager/datamanager/datamanager.go): `src/server/manager/datamanager/datamanager.go`

### Statistics and insights

- [Statistics manager](https://github.com/lpuigo/projectportfoliomanager/blob/master/src/server/manager/statmanager.go): `src/server/manager/statmanager.go`
- [Workload scheduling](https://github.com/lpuigo/projectportfoliomanager/blob/master/src/server/manager/workloadschedule/workloadschedule.go): `src/server/manager/workloadschedule/workloadschedule.go`
- [Indexed stat records](https://github.com/lpuigo/projectportfoliomanager/blob/master/src/server/manager/recordindexedset/recordindexedset.go): `src/server/manager/recordindexedset/recordindexedset.go`

### Data integrations

- [Stat file processing](https://github.com/lpuigo/projectportfoliomanager/blob/master/src/server/manager/fileprocesser/fileprocesser.go): `src/server/manager/fileprocesser/fileprocesser.go`
- [Jira manager](https://github.com/lpuigo/projectportfoliomanager/blob/master/src/server/manager/jiramanager/jiramanager.go): `src/server/manager/jiramanager/jiramanager.go`
- [Spreadsheet adaptor](https://github.com/lpuigo/projectportfoliomanager/blob/master/src/server/manager/xlsxadaptor.go): `src/server/manager/xlsxadaptor.go`

### Other components

- **Portfolio user**
- **Jira database**

## Connections

- Portfolio user → Browser UI: uses
- Browser UI → Project table: renders
- Browser UI → Project editor: opens
- Browser UI → Statistics views: opens
- Browser UI → Jira statistics view: opens
- Browser UI → Workload and timeline: opens
- Browser UI → Project audits: audits projects
- Browser UI → Project view model: maps project data
- Browser UI → HTTP server: requests API
- HTTP server → Application manager: initializes
- HTTP server → API routes: dispatches requests
- API routes → Application manager: invokes operations
- Application manager → Project manager: manages projects
- Application manager → Statistics manager: reads and updates stats
- Application manager → Workload scheduling: calculates schedule
- Application manager → Jira manager: requests Jira logs
- Application manager → Stat file processing: processes stat files
- Application manager → Spreadsheet adaptor: exports portfolio
- Project manager → Project portfolio: loads and manages
- Project manager → Persistence and locking: locks and persists
- Persistence and locking → Project portfolio: persists portfolio
- Project portfolio → Project domain model: stores projects
- Statistics manager → Indexed stat records: indexes stat records
- Stat file processing → Statistics manager: updates statistics
- Jira manager → Jira database: queries
