# bbcares1/cats architecture

> Architecture diagram of the GitHub repository bbcares1/cats, 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/bbcares1/cats
- Repository: https://github.com/bbcares1/cats

## Overview

CATS is a training application and reimbursement management system. Employees plan and submit course applications, managers review them, and eligible employees can later submit fee claims with supporting documents; approved claims can be recorded as reimbursed. Administrators maintain staff, approval routing, course catalogue, holidays, and annual entitlements, while reporting and audit support oversight. The sampled sources show application and claim flows, document storage, and login-account loading. The README is empty, so additional wiring is represented only where the tree or excerpts support it.

Main entry points: [`src/main/java/sg/edu/nus/cats/service/ApplicationService.java`](https://github.com/bbcares1/cats/blob/main/src/main/java/sg/edu/nus/cats/service/ApplicationService.java) (Application lifecycle), [`src/main/java/sg/edu/nus/cats/service/ClaimService.java`](https://github.com/bbcares1/cats/blob/main/src/main/java/sg/edu/nus/cats/service/ClaimService.java) (Claim lifecycle), [`src/main/java/sg/edu/nus/cats/service/OutboxProcessor.java`](https://github.com/bbcares1/cats/blob/main/src/main/java/sg/edu/nus/cats/service/OutboxProcessor.java) (Mail delivery), [`src/main/java/sg/edu/nus/cats/web/ClaimController.java`](https://github.com/bbcares1/cats/blob/main/src/main/java/sg/edu/nus/cats/web/ClaimController.java) (Claim web)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_access["Access and web"]
  node_app_web["Application web"]
  node_claim_web["Claim web"]
  node_manager_web["Manager review"]
  node_api["JSON API"]
  node_auth["Login accounts"]
end

subgraph group_workflow["Training workflows"]
  node_application["Application lifecycle"]
  node_approval["Approval decisions"]
  node_claim["Claim lifecycle<br/>[ClaimService.java]"]
  node_documents["Document vault"]
  node_calendar["Calendar services"]
  node_entitlements["Entitlements"]
  node_ledger["Training ledger<br/>[LedgerService.java]"]
end

subgraph group_admin["Administration and oversight"]
  node_admin_services["Admin services"]
  node_catalogue["Catalogue admin"]
  node_reports["Reports<br/>[ReportService.java]"]
  node_audit["Audit trail<br/>[AuditService.java]"]
end

subgraph group_support["Persistence and integrations"]
  node_outbox["Mail outbox<br/>[OutboxService.java]"]
  node_mail_worker["Mail delivery"]
  node_mail_templates["Mail templates"]
  node_mail_gateway["Mail gateway<br/>[MailGateway.java]"]
  node_database[("Application database")]
  node_filesystem[("Private file storage")]
  node_user_repo["Account repository"]
  node_app_repo["Application repository"]
  node_claim_repo["Claim repository"]
  node_document_repo["Document repository"]
end

node_employee(("Employee"))
node_manager(("Manager"))
node_administrator(("Administrator"))
node_smtp["SMTP service"]

node_employee -->|"submits"| node_app_web
node_app_web -->|"creates"| node_application
node_application -->|"saves"| node_app_repo
node_application -->|"checks"| node_entitlements
node_application -->|"updates"| node_ledger
node_application -->|"records"| node_audit
node_manager -->|"reviews"| node_manager_web
node_manager_web -->|"decides"| node_approval
node_employee -->|"files claim"| node_claim_web
node_claim_web -->|"manages"| node_claim
node_claim -->|"reads and saves"| node_claim_repo
node_claim -->|"stores files"| node_documents
node_claim -->|"saves metadata"| node_document_repo
node_claim_web -->|"loads download"| node_documents
node_documents -->|"reads and writes"| node_filesystem
node_api -->|"previews"| node_application
node_api -->|"requests calendar"| node_calendar
node_auth -->|"loads account"| node_user_repo
node_user_repo -->|"queries"| node_database
node_app_repo -->|"queries and saves"| node_database
node_claim_repo -->|"queries and saves"| node_database
node_document_repo -->|"queries and saves"| node_database
node_administrator -->|"manages staff"| node_admin_services
node_administrator -->|"maintains reference data"| node_catalogue
node_administrator -->|"sets allowances"| node_entitlements
node_manager -->|"views reports"| node_reports
node_application -.->|"queues notices"| node_outbox
node_claim -.->|"queues notices"| node_outbox
node_mail_worker -->|"processes messages"| node_outbox
node_mail_worker -->|"renders content"| node_mail_templates
node_mail_worker -->|"sends through"| node_mail_gateway
node_mail_gateway -.->|"delivers mail"| node_smtp

click node_app_web "https://github.com/bbcares1/cats/blob/main/src/main/java/sg/edu/nus/cats/web/EmployeeApplicationController.java"
click node_claim_web "https://github.com/bbcares1/cats/blob/main/src/main/java/sg/edu/nus/cats/web/ClaimController.java"
click node_manager_web "https://github.com/bbcares1/cats/blob/main/src/main/java/sg/edu/nus/cats/web/ManagerApprovalController.java"
click node_api "https://github.com/bbcares1/cats/blob/main/src/main/java/sg/edu/nus/cats/web/api/CatsApiController.java"
click node_auth "https://github.com/bbcares1/cats/blob/main/src/main/java/sg/edu/nus/cats/security/CatsUserDetailsService.java"
click node_application "https://github.com/bbcares1/cats/blob/main/src/main/java/sg/edu/nus/cats/service/ApplicationService.java"
click node_approval "https://github.com/bbcares1/cats/blob/main/src/main/java/sg/edu/nus/cats/service/ApprovalService.java"
click node_claim "https://github.com/bbcares1/cats/blob/main/src/main/java/sg/edu/nus/cats/service/ClaimService.java"
click node_documents "https://github.com/bbcares1/cats/blob/main/src/main/java/sg/edu/nus/cats/service/DocumentStorageService.java"
click node_calendar "https://github.com/bbcares1/cats/blob/main/src/main/java/sg/edu/nus/cats/service/CalendarService.java"
click node_entitlements "https://github.com/bbcares1/cats/blob/main/src/main/java/sg/edu/nus/cats/service/EntitlementService.java"
click node_ledger "https://github.com/bbcares1/cats/blob/main/src/main/java/sg/edu/nus/cats/service/LedgerService.java"
click node_admin_services "https://github.com/bbcares1/cats/blob/main/src/main/java/sg/edu/nus/cats/service/StaffAdminService.java"
click node_catalogue "https://github.com/bbcares1/cats/blob/main/src/main/java/sg/edu/nus/cats/service/CatalogueAdminService.java"
click node_reports "https://github.com/bbcares1/cats/blob/main/src/main/java/sg/edu/nus/cats/service/ReportService.java"
click node_audit "https://github.com/bbcares1/cats/blob/main/src/main/java/sg/edu/nus/cats/service/AuditService.java"
click node_outbox "https://github.com/bbcares1/cats/blob/main/src/main/java/sg/edu/nus/cats/service/OutboxService.java"
click node_mail_worker "https://github.com/bbcares1/cats/blob/main/src/main/java/sg/edu/nus/cats/service/OutboxProcessor.java"
click node_mail_templates "https://github.com/bbcares1/cats/blob/main/src/main/java/sg/edu/nus/cats/service/mail/MailTemplateService.java"
click node_mail_gateway "https://github.com/bbcares1/cats/blob/main/src/main/java/sg/edu/nus/cats/service/mail/MailGateway.java"
click node_user_repo "https://github.com/bbcares1/cats/blob/main/src/main/java/sg/edu/nus/cats/repository/UserAccountRepository.java"
click node_app_repo "https://github.com/bbcares1/cats/blob/main/src/main/java/sg/edu/nus/cats/repository/CourseApplicationRepository.java"
click node_claim_repo "https://github.com/bbcares1/cats/blob/main/src/main/java/sg/edu/nus/cats/repository/CourseClaimRepository.java"
click node_document_repo "https://github.com/bbcares1/cats/blob/main/src/main/java/sg/edu/nus/cats/repository/ClaimDocumentRepository.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_app_web,node_claim_web,node_manager_web,node_api,node_auth toneBlue
class node_application,node_approval,node_claim,node_documents,node_calendar,node_entitlements,node_ledger toneAmber
class node_admin_services,node_catalogue,node_reports,node_audit toneMint
class node_outbox,node_mail_worker,node_mail_templates,node_mail_gateway,node_database,node_filesystem,node_user_repo,node_app_repo,node_claim_repo,node_document_repo toneRose
class node_employee,node_manager,node_administrator,node_smtp toneIndigo
```

## Components

### Access and web

- [Application web](https://github.com/bbcares1/cats/blob/main/src/main/java/sg/edu/nus/cats/web/EmployeeApplicationController.java): `src/main/java/sg/edu/nus/cats/web/EmployeeApplicationController.java`
- [Claim web](https://github.com/bbcares1/cats/blob/main/src/main/java/sg/edu/nus/cats/web/ClaimController.java): `src/main/java/sg/edu/nus/cats/web/ClaimController.java`
- [Manager review](https://github.com/bbcares1/cats/blob/main/src/main/java/sg/edu/nus/cats/web/ManagerApprovalController.java): `src/main/java/sg/edu/nus/cats/web/ManagerApprovalController.java`
- [JSON API](https://github.com/bbcares1/cats/blob/main/src/main/java/sg/edu/nus/cats/web/api/CatsApiController.java): `src/main/java/sg/edu/nus/cats/web/api/CatsApiController.java`
- [Login accounts](https://github.com/bbcares1/cats/blob/main/src/main/java/sg/edu/nus/cats/security/CatsUserDetailsService.java): `src/main/java/sg/edu/nus/cats/security/CatsUserDetailsService.java`

### Training workflows

- [Application lifecycle](https://github.com/bbcares1/cats/blob/main/src/main/java/sg/edu/nus/cats/service/ApplicationService.java): `src/main/java/sg/edu/nus/cats/service/ApplicationService.java`
- [Approval decisions](https://github.com/bbcares1/cats/blob/main/src/main/java/sg/edu/nus/cats/service/ApprovalService.java): `src/main/java/sg/edu/nus/cats/service/ApprovalService.java`
- [Claim lifecycle](https://github.com/bbcares1/cats/blob/main/src/main/java/sg/edu/nus/cats/service/ClaimService.java): `src/main/java/sg/edu/nus/cats/service/ClaimService.java`
- [Document vault](https://github.com/bbcares1/cats/blob/main/src/main/java/sg/edu/nus/cats/service/DocumentStorageService.java): `src/main/java/sg/edu/nus/cats/service/DocumentStorageService.java`
- [Calendar services](https://github.com/bbcares1/cats/blob/main/src/main/java/sg/edu/nus/cats/service/CalendarService.java): `src/main/java/sg/edu/nus/cats/service/CalendarService.java`
- [Entitlements](https://github.com/bbcares1/cats/blob/main/src/main/java/sg/edu/nus/cats/service/EntitlementService.java): `src/main/java/sg/edu/nus/cats/service/EntitlementService.java`
- [Training ledger](https://github.com/bbcares1/cats/blob/main/src/main/java/sg/edu/nus/cats/service/LedgerService.java): `src/main/java/sg/edu/nus/cats/service/LedgerService.java`

### Administration and oversight

- [Admin services](https://github.com/bbcares1/cats/blob/main/src/main/java/sg/edu/nus/cats/service/StaffAdminService.java): `src/main/java/sg/edu/nus/cats/service/StaffAdminService.java`
- [Catalogue admin](https://github.com/bbcares1/cats/blob/main/src/main/java/sg/edu/nus/cats/service/CatalogueAdminService.java): `src/main/java/sg/edu/nus/cats/service/CatalogueAdminService.java`
- [Reports](https://github.com/bbcares1/cats/blob/main/src/main/java/sg/edu/nus/cats/service/ReportService.java): `src/main/java/sg/edu/nus/cats/service/ReportService.java`
- [Audit trail](https://github.com/bbcares1/cats/blob/main/src/main/java/sg/edu/nus/cats/service/AuditService.java): `src/main/java/sg/edu/nus/cats/service/AuditService.java`

### Persistence and integrations

- [Mail outbox](https://github.com/bbcares1/cats/blob/main/src/main/java/sg/edu/nus/cats/service/OutboxService.java): `src/main/java/sg/edu/nus/cats/service/OutboxService.java`
- [Mail delivery](https://github.com/bbcares1/cats/blob/main/src/main/java/sg/edu/nus/cats/service/OutboxProcessor.java): `src/main/java/sg/edu/nus/cats/service/OutboxProcessor.java`
- [Mail templates](https://github.com/bbcares1/cats/blob/main/src/main/java/sg/edu/nus/cats/service/mail/MailTemplateService.java): `src/main/java/sg/edu/nus/cats/service/mail/MailTemplateService.java`
- [Mail gateway](https://github.com/bbcares1/cats/blob/main/src/main/java/sg/edu/nus/cats/service/mail/MailGateway.java): `src/main/java/sg/edu/nus/cats/service/mail/MailGateway.java`
- **Application database**
- **Private file storage**
- [Account repository](https://github.com/bbcares1/cats/blob/main/src/main/java/sg/edu/nus/cats/repository/UserAccountRepository.java): `src/main/java/sg/edu/nus/cats/repository/UserAccountRepository.java`
- [Application repository](https://github.com/bbcares1/cats/blob/main/src/main/java/sg/edu/nus/cats/repository/CourseApplicationRepository.java): `src/main/java/sg/edu/nus/cats/repository/CourseApplicationRepository.java`
- [Claim repository](https://github.com/bbcares1/cats/blob/main/src/main/java/sg/edu/nus/cats/repository/CourseClaimRepository.java): `src/main/java/sg/edu/nus/cats/repository/CourseClaimRepository.java`
- [Document repository](https://github.com/bbcares1/cats/blob/main/src/main/java/sg/edu/nus/cats/repository/ClaimDocumentRepository.java): `src/main/java/sg/edu/nus/cats/repository/ClaimDocumentRepository.java`

### Other components

- **Employee**
- **Manager**
- **Administrator**
- **SMTP service**

## Connections

- Employee → Application web: submits
- Application web → Application lifecycle: creates
- Application lifecycle → Application repository: saves
- Application lifecycle → Entitlements: checks
- Application lifecycle → Training ledger: updates
- Application lifecycle → Audit trail: records
- Manager → Manager review: reviews
- Manager review → Approval decisions: decides
- Employee → Claim web: files claim
- Claim web → Claim lifecycle: manages
- Claim lifecycle → Claim repository: reads and saves
- Claim lifecycle → Document vault: stores files
- Claim lifecycle → Document repository: saves metadata
- Claim web → Document vault: loads download
- Document vault → Private file storage: reads and writes
- JSON API → Application lifecycle: previews
- JSON API → Calendar services: requests calendar
- Login accounts → Account repository: loads account
- Account repository → Application database: queries
- Application repository → Application database: queries and saves
- Claim repository → Application database: queries and saves
- Document repository → Application database: queries and saves
- Administrator → Admin services: manages staff
- Administrator → Catalogue admin: maintains reference data
- Administrator → Entitlements: sets allowances
- Manager → Reports: views reports
- Application lifecycle → Mail outbox: queues notices
- Claim lifecycle → Mail outbox: queues notices
- Mail delivery → Mail outbox: processes messages
- Mail delivery → Mail templates: renders content
- Mail delivery → Mail gateway: sends through
- Mail gateway → SMTP service: delivers mail
