# agnare/staffsense architecture

> Architecture diagram of the GitHub repository agnare/staffsense, 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/agnare/staffsense
- Repository: https://github.com/agnare/staffsense
- Video tour (about a minute): https://gitdiagram.com/agnare/staffsense/video

## Overview

StaffSense is an HR platform for employee attrition-risk prediction and task management, with surveys, workforce metrics, projects, and one-on-one meetings as related capabilities. The main risk workflow builds employee features, requests a prediction from the separately hosted StaffSenseML service, saves the result, and presents risk details. Task-board requests use a service to create and update tasks. Sampled source supports some repository interactions; other documented controller capabilities are shown without speculative wiring. The legacy ML service is excluded from the primary runtime map.

Main entry points: [`demo/src/main/java/com/staffsense/demo/service/AttritionMlService.java`](https://github.com/agnare/staffsense/blob/main/demo/src/main/java/com/staffsense/demo/service/AttritionMlService.java) (Prediction workflow), [`demo/src/main/java/com/staffsense/demo/repository/TaskRepository.java`](https://github.com/agnare/staffsense/blob/main/demo/src/main/java/com/staffsense/demo/repository/TaskRepository.java) (Task records), [`demo/src/main/java/com/staffsense/demo/controller/RiskController.java`](https://github.com/agnare/staffsense/blob/main/demo/src/main/java/com/staffsense/demo/controller/RiskController.java) (Risk views), [`demo/src/main/java/com/staffsense/demo/controller/task/ProjectBoardController.java`](https://github.com/agnare/staffsense/blob/main/demo/src/main/java/com/staffsense/demo/controller/task/ProjectBoardController.java) (Project board)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_web["Web workflows"]
  node_riskui["Risk views"]
  node_analytics["Analytics"]
  node_dashboard["Dashboard"]
  node_auth["Authentication"]
  node_surveyui["Survey workflows"]
  node_board["Project board"]
end

subgraph group_risk["Risk and insights"]
  node_insights["Model insights"]
  node_attrition["Prediction workflow"]
end

subgraph group_workforce["Workforce operations"]
  node_surveylogic["Survey service<br/>[SurveyService.java]"]
  node_templates["Survey templates"]
  node_oneonone["One-on-ones"]
  node_employees["Employee management"]
  node_tasklogic["Task service<br/>[TaskService.java]"]
  node_kpi["KPI calculation"]
  node_workload["Workload calculation"]
end

subgraph group_data["Persistence and ML"]
  node_ml{{"StaffSenseML"}}
  node_surveydb[("Survey records")]
  node_taskdb[("Task records")]
  node_userdb[("User records")]
  node_predictiondb[("Prediction records")]
  node_kpirepo[("KPI records")]
  node_workloadrepo[("Workload records")]
end

node_employee(("Employee"))
node_manager(("Manager"))

node_employee -->|"submits responses"| node_surveyui
node_manager -->|"reviews risk"| node_riskui
node_manager -->|"manages tasks"| node_board
node_surveyui -->|"submits responses"| node_surveylogic
node_surveylogic -->|"reads/writes"| node_surveydb
node_surveylogic -->|"uses templates"| node_templates
node_board -->|"creates tasks"| node_tasklogic
node_board -->|"loads board"| node_taskdb
node_board -->|"loads users"| node_userdb
node_tasklogic -->|"reads/writes"| node_taskdb
node_tasklogic -->|"loads assignee"| node_userdb
node_tasklogic -->|"loads project"| node_taskdb
node_kpi -->|"reads tasks"| node_taskdb
node_kpi -->|"saves history"| node_kpirepo
node_workload -->|"reads tasks"| node_taskdb
node_workload -->|"reads/writes"| node_workloadrepo
node_riskui -->|"recomputes risk"| node_attrition
node_riskui -->|"loads employees"| node_userdb
node_riskui -->|"loads predictions"| node_predictiondb
node_attrition -->|"requests prediction"| node_ml
node_attrition -->|"loads employee"| node_userdb
node_attrition -->|"reads tasks"| node_taskdb
node_attrition -->|"reads KPI"| node_kpirepo
node_attrition -->|"reads workload"| node_workloadrepo
node_attrition -->|"reads survey data"| node_surveydb
node_attrition -->|"saves prediction"| node_predictiondb

click node_riskui "https://github.com/agnare/staffsense/blob/main/demo/src/main/java/com/staffsense/demo/controller/RiskController.java"
click node_analytics "https://github.com/agnare/staffsense/blob/main/demo/src/main/java/com/staffsense/demo/controller/AnalyticsController.java"
click node_dashboard "https://github.com/agnare/staffsense/blob/main/demo/src/main/java/com/staffsense/demo/controller/DashboardController.java"
click node_auth "https://github.com/agnare/staffsense/blob/main/demo/src/main/java/com/staffsense/demo/controller/AuthController.java"
click node_surveyui "https://github.com/agnare/staffsense/blob/main/demo/src/main/java/com/staffsense/demo/controller/SurveyController.java"
click node_surveylogic "https://github.com/agnare/staffsense/blob/main/demo/src/main/java/com/staffsense/demo/service/SurveyService.java"
click node_templates "https://github.com/agnare/staffsense/blob/main/demo/src/main/java/com/staffsense/demo/service/SurveyTemplateService.java"
click node_oneonone "https://github.com/agnare/staffsense/blob/main/demo/src/main/java/com/staffsense/demo/controller/OneOnOneController.java"
click node_employees "https://github.com/agnare/staffsense/blob/main/demo/src/main/java/com/staffsense/demo/service/EmployeeService.java"
click node_board "https://github.com/agnare/staffsense/blob/main/demo/src/main/java/com/staffsense/demo/controller/task/ProjectBoardController.java"
click node_tasklogic "https://github.com/agnare/staffsense/blob/main/demo/src/main/java/com/staffsense/demo/service/task/TaskService.java"
click node_kpi "https://github.com/agnare/staffsense/blob/main/demo/src/main/java/com/staffsense/demo/service/metrics/KpiCalculationService.java"
click node_workload "https://github.com/agnare/staffsense/blob/main/demo/src/main/java/com/staffsense/demo/service/metrics/WorkloadCalculationService.java"
click node_insights "https://github.com/agnare/staffsense/blob/main/demo/src/main/java/com/staffsense/demo/service/metrics/ModelInsightService.java"
click node_attrition "https://github.com/agnare/staffsense/blob/main/demo/src/main/java/com/staffsense/demo/service/AttritionMlService.java"
click node_surveydb "https://github.com/agnare/staffsense/blob/main/demo/src/main/java/com/staffsense/demo/repository/SurveyRepository.java"
click node_taskdb "https://github.com/agnare/staffsense/blob/main/demo/src/main/java/com/staffsense/demo/repository/TaskRepository.java"
click node_userdb "https://github.com/agnare/staffsense/blob/main/demo/src/main/java/com/staffsense/demo/repository/UserRepository.java"
click node_predictiondb "https://github.com/agnare/staffsense/blob/main/demo/src/main/java/com/staffsense/demo/repository/AttritionPredictionRepository.java"
click node_kpirepo "https://github.com/agnare/staffsense/blob/main/demo/src/main/java/com/staffsense/demo/repository/kpi/KpiRecordRepository.java"
click node_workloadrepo "https://github.com/agnare/staffsense/blob/main/demo/src/main/java/com/staffsense/demo/repository/workload/WorkloadRecordRepository.java"

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_riskui,node_analytics,node_dashboard,node_auth,node_surveyui,node_board toneBlue
class node_insights,node_attrition toneAmber
class node_surveylogic,node_templates,node_oneonone,node_employees,node_tasklogic,node_kpi,node_workload toneMint
class node_ml,node_surveydb,node_taskdb,node_userdb,node_predictiondb,node_kpirepo,node_workloadrepo toneRose
class node_employee,node_manager toneIndigo
```

## Components

### Web workflows

- [Risk views](https://github.com/agnare/staffsense/blob/main/demo/src/main/java/com/staffsense/demo/controller/RiskController.java): `demo/src/main/java/com/staffsense/demo/controller/RiskController.java`
- [Analytics](https://github.com/agnare/staffsense/blob/main/demo/src/main/java/com/staffsense/demo/controller/AnalyticsController.java): `demo/src/main/java/com/staffsense/demo/controller/AnalyticsController.java`
- [Dashboard](https://github.com/agnare/staffsense/blob/main/demo/src/main/java/com/staffsense/demo/controller/DashboardController.java): `demo/src/main/java/com/staffsense/demo/controller/DashboardController.java`
- [Authentication](https://github.com/agnare/staffsense/blob/main/demo/src/main/java/com/staffsense/demo/controller/AuthController.java): `demo/src/main/java/com/staffsense/demo/controller/AuthController.java`
- [Survey workflows](https://github.com/agnare/staffsense/blob/main/demo/src/main/java/com/staffsense/demo/controller/SurveyController.java): `demo/src/main/java/com/staffsense/demo/controller/SurveyController.java`
- [Project board](https://github.com/agnare/staffsense/blob/main/demo/src/main/java/com/staffsense/demo/controller/task/ProjectBoardController.java): `demo/src/main/java/com/staffsense/demo/controller/task/ProjectBoardController.java`

### Risk and insights

- [Model insights](https://github.com/agnare/staffsense/blob/main/demo/src/main/java/com/staffsense/demo/service/metrics/ModelInsightService.java): `demo/src/main/java/com/staffsense/demo/service/metrics/ModelInsightService.java`
- [Prediction workflow](https://github.com/agnare/staffsense/blob/main/demo/src/main/java/com/staffsense/demo/service/AttritionMlService.java): `demo/src/main/java/com/staffsense/demo/service/AttritionMlService.java`

### Workforce operations

- [Survey service](https://github.com/agnare/staffsense/blob/main/demo/src/main/java/com/staffsense/demo/service/SurveyService.java): `demo/src/main/java/com/staffsense/demo/service/SurveyService.java`
- [Survey templates](https://github.com/agnare/staffsense/blob/main/demo/src/main/java/com/staffsense/demo/service/SurveyTemplateService.java): `demo/src/main/java/com/staffsense/demo/service/SurveyTemplateService.java`
- [One-on-ones](https://github.com/agnare/staffsense/blob/main/demo/src/main/java/com/staffsense/demo/controller/OneOnOneController.java): `demo/src/main/java/com/staffsense/demo/controller/OneOnOneController.java`
- [Employee management](https://github.com/agnare/staffsense/blob/main/demo/src/main/java/com/staffsense/demo/service/EmployeeService.java): `demo/src/main/java/com/staffsense/demo/service/EmployeeService.java`
- [Task service](https://github.com/agnare/staffsense/blob/main/demo/src/main/java/com/staffsense/demo/service/task/TaskService.java): `demo/src/main/java/com/staffsense/demo/service/task/TaskService.java`
- [KPI calculation](https://github.com/agnare/staffsense/blob/main/demo/src/main/java/com/staffsense/demo/service/metrics/KpiCalculationService.java): `demo/src/main/java/com/staffsense/demo/service/metrics/KpiCalculationService.java`
- [Workload calculation](https://github.com/agnare/staffsense/blob/main/demo/src/main/java/com/staffsense/demo/service/metrics/WorkloadCalculationService.java): `demo/src/main/java/com/staffsense/demo/service/metrics/WorkloadCalculationService.java`

### Persistence and ML

- **StaffSenseML**
- [Survey records](https://github.com/agnare/staffsense/blob/main/demo/src/main/java/com/staffsense/demo/repository/SurveyRepository.java): `demo/src/main/java/com/staffsense/demo/repository/SurveyRepository.java`
- [Task records](https://github.com/agnare/staffsense/blob/main/demo/src/main/java/com/staffsense/demo/repository/TaskRepository.java): `demo/src/main/java/com/staffsense/demo/repository/TaskRepository.java`
- [User records](https://github.com/agnare/staffsense/blob/main/demo/src/main/java/com/staffsense/demo/repository/UserRepository.java): `demo/src/main/java/com/staffsense/demo/repository/UserRepository.java`
- [Prediction records](https://github.com/agnare/staffsense/blob/main/demo/src/main/java/com/staffsense/demo/repository/AttritionPredictionRepository.java): `demo/src/main/java/com/staffsense/demo/repository/AttritionPredictionRepository.java`
- [KPI records](https://github.com/agnare/staffsense/blob/main/demo/src/main/java/com/staffsense/demo/repository/kpi/KpiRecordRepository.java): `demo/src/main/java/com/staffsense/demo/repository/kpi/KpiRecordRepository.java`
- [Workload records](https://github.com/agnare/staffsense/blob/main/demo/src/main/java/com/staffsense/demo/repository/workload/WorkloadRecordRepository.java): `demo/src/main/java/com/staffsense/demo/repository/workload/WorkloadRecordRepository.java`

### Other components

- **Employee**
- **Manager**

## Connections

- Employee → Survey workflows: submits responses
- Manager → Risk views: reviews risk
- Manager → Project board: manages tasks
- Survey workflows → Survey service: submits responses
- Survey service → Survey records: reads/writes
- Survey service → Survey templates: uses templates
- Project board → Task service: creates tasks
- Project board → Task records: loads board
- Project board → User records: loads users
- Task service → Task records: reads/writes
- Task service → User records: loads assignee
- Task service → Task records: loads project
- KPI calculation → Task records: reads tasks
- KPI calculation → KPI records: saves history
- Workload calculation → Task records: reads tasks
- Workload calculation → Workload records: reads/writes
- Risk views → Prediction workflow: recomputes risk
- Risk views → User records: loads employees
- Risk views → Prediction records: loads predictions
- Prediction workflow → StaffSenseML: requests prediction
- Prediction workflow → User records: loads employee
- Prediction workflow → Task records: reads tasks
- Prediction workflow → KPI records: reads KPI
- Prediction workflow → Workload records: reads workload
- Prediction workflow → Survey records: reads survey data
- Prediction workflow → Prediction records: saves prediction
