# taskininorizon-dev/inorizon-efms architecture

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

- Interactive diagram: https://gitdiagram.com/taskininorizon-dev/inorizon-efms
- Repository: https://github.com/taskininorizon-dev/inorizon-efms

## Overview

Inorizon EFMS is a browser-based expense and fund management system backed by an Express API and MongoDB. Visitors enter a keyword for read-only access; an Admin signs in to manage members and record or amend ledger transactions. The client loads dashboard summaries and reports from the API, while server controllers enforce ledger rules, persist transactions, and record audit events. Voucher uploads use Cloudinary. The sampled source confirms the transaction, authentication, and dashboard paths; other documented capabilities are represented at their listed route/controller paths, with uncertain internal wiring omitted.

Main entry points: [`server/src/app.js`](https://github.com/taskininorizon-dev/inorizon-efms/blob/main/server/src/app.js) (Express API), [`server/src/controllers/transaction.controller.js`](https://github.com/taskininorizon-dev/inorizon-efms/blob/main/server/src/controllers/transaction.controller.js) (Transaction handling), [`server/src/services/audit.service.js`](https://github.com/taskininorizon-dev/inorizon-efms/blob/main/server/src/services/audit.service.js) (Audit logging), [`server/src/models/Transaction.js`](https://github.com/taskininorizon-dev/inorizon-efms/blob/main/server/src/models/Transaction.js) (Transactions)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_client["Client experience"]
  node_ui["Workspace UI<br/>[App.jsx]"]
  node_api["API client<br/>[client.js]"]
end

subgraph group_access["API and access"]
  node_app["Express API<br/>[app.js]"]
  node_authroutes["Authentication routes<br/>[auth.routes.js]"]
  node_auth["Authentication<br/>[auth.controller.js]"]
  node_membersroutes["Member routes<br/>[member.routes.js]"]
  node_members["Member management"]
end

subgraph group_finance["Ledger and finance"]
  node_transroutes["Transaction routes"]
  node_finroutes["Finance routes<br/>[finance.routes.js]"]
  node_transaction["Transaction handling"]
  node_financecontroller["Fund and expense handling"]
  node_ledger["Ledger rules<br/>[ledger.service.js]"]
end

subgraph group_oversight["Reporting and oversight"]
  node_dashboardroutes["Dashboard routes"]
  node_dashboard["Dashboard analytics"]
  node_reportroutes["Report routes<br/>[report.routes.js]"]
  node_reports["Reports"]
  node_auditroutes["Audit routes<br/>[audit.routes.js]"]
  node_audit["Audit logging<br/>[audit.service.js]"]
  node_settingsroutes["Settings routes<br/>[setting.routes.js]"]
  node_settings["Settings"]
end

subgraph group_state["Persistent state"]
  node_transactionsdb[("Transactions<br/>[Transaction.js]")]
  node_usersdb[("Users<br/>[User.js]")]
  node_refreshdb[("Refresh tokens<br/>[RefreshToken.js]")]
  node_auditdb[("Audit logs<br/>[AuditLog.js]")]
end

node_visitor(("Visitor or Admin"))
node_mongodb[("MongoDB")]
node_cloudinary[("Cloudinary")]

node_visitor -->|"uses"| node_ui
node_ui -->|"requests data"| node_api
node_api -->|"calls API"| node_app
node_app -->|"dispatches"| node_authroutes
node_app -->|"dispatches"| node_membersroutes
node_app -->|"dispatches"| node_transroutes
node_app -->|"dispatches"| node_finroutes
node_app -->|"dispatches"| node_dashboardroutes
node_app -->|"dispatches"| node_reportroutes
node_app -->|"dispatches"| node_auditroutes
node_app -->|"dispatches"| node_settingsroutes
node_authroutes -->|"dispatches"| node_auth
node_membersroutes -->|"dispatches"| node_members
node_transroutes -->|"dispatches"| node_transaction
node_finroutes -->|"dispatches"| node_financecontroller
node_dashboardroutes -->|"dispatches"| node_dashboard
node_reportroutes -->|"dispatches"| node_reports
node_auditroutes -->|"dispatches"| node_audit
node_settingsroutes -->|"dispatches"| node_settings
node_auth -->|"reads and updates"| node_usersdb
node_auth -->|"rotates sessions"| node_refreshdb
node_auth -->|"records events"| node_audit
node_transaction -->|"checks ledger"| node_ledger
node_transaction -->|"reads and writes"| node_transactionsdb
node_transaction -->|"records changes"| node_audit
node_transaction -.->|"deletes assets"| node_cloudinary
node_financecontroller -->|"creates and summarizes"| node_ledger
node_financecontroller -->|"lists transactions"| node_transactionsdb
node_financecontroller -->|"records events"| node_audit
node_dashboard -->|"gets summary"| node_ledger
node_dashboard -->|"aggregates activity"| node_transactionsdb
node_members -->|"manages members"| node_usersdb
node_audit -->|"writes logs"| node_auditdb
node_reports -->|"queries transactions"| node_transactionsdb
node_settings -->|"stores settings"| node_mongodb
node_transactionsdb -->|"persists"| node_mongodb
node_usersdb -->|"persists"| node_mongodb
node_refreshdb -->|"persists"| node_mongodb
node_auditdb -->|"persists"| node_mongodb

click node_ui "https://github.com/taskininorizon-dev/inorizon-efms/blob/main/client/src/App.jsx"
click node_api "https://github.com/taskininorizon-dev/inorizon-efms/blob/main/client/src/api/client.js"
click node_app "https://github.com/taskininorizon-dev/inorizon-efms/blob/main/server/src/app.js"
click node_authroutes "https://github.com/taskininorizon-dev/inorizon-efms/blob/main/server/src/routes/auth.routes.js"
click node_auth "https://github.com/taskininorizon-dev/inorizon-efms/blob/main/server/src/controllers/auth.controller.js"
click node_membersroutes "https://github.com/taskininorizon-dev/inorizon-efms/blob/main/server/src/routes/member.routes.js"
click node_members "https://github.com/taskininorizon-dev/inorizon-efms/blob/main/server/src/controllers/member.controller.js"
click node_transroutes "https://github.com/taskininorizon-dev/inorizon-efms/blob/main/server/src/routes/transaction.routes.js"
click node_finroutes "https://github.com/taskininorizon-dev/inorizon-efms/blob/main/server/src/routes/finance.routes.js"
click node_transaction "https://github.com/taskininorizon-dev/inorizon-efms/blob/main/server/src/controllers/transaction.controller.js"
click node_financecontroller "https://github.com/taskininorizon-dev/inorizon-efms/blob/main/server/src/controllers/finance.controller.js"
click node_ledger "https://github.com/taskininorizon-dev/inorizon-efms/blob/main/server/src/services/ledger.service.js"
click node_dashboardroutes "https://github.com/taskininorizon-dev/inorizon-efms/blob/main/server/src/routes/dashboard.routes.js"
click node_dashboard "https://github.com/taskininorizon-dev/inorizon-efms/blob/main/server/src/controllers/dashboard.controller.js"
click node_reportroutes "https://github.com/taskininorizon-dev/inorizon-efms/blob/main/server/src/routes/report.routes.js"
click node_reports "https://github.com/taskininorizon-dev/inorizon-efms/blob/main/server/src/controllers/report.controller.js"
click node_auditroutes "https://github.com/taskininorizon-dev/inorizon-efms/blob/main/server/src/routes/audit.routes.js"
click node_audit "https://github.com/taskininorizon-dev/inorizon-efms/blob/main/server/src/services/audit.service.js"
click node_settingsroutes "https://github.com/taskininorizon-dev/inorizon-efms/blob/main/server/src/routes/setting.routes.js"
click node_settings "https://github.com/taskininorizon-dev/inorizon-efms/blob/main/server/src/controllers/setting.controller.js"
click node_transactionsdb "https://github.com/taskininorizon-dev/inorizon-efms/blob/main/server/src/models/Transaction.js"
click node_usersdb "https://github.com/taskininorizon-dev/inorizon-efms/blob/main/server/src/models/User.js"
click node_refreshdb "https://github.com/taskininorizon-dev/inorizon-efms/blob/main/server/src/models/RefreshToken.js"
click node_auditdb "https://github.com/taskininorizon-dev/inorizon-efms/blob/main/server/src/models/AuditLog.js"

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_ui,node_api toneBlue
class node_app,node_authroutes,node_auth,node_membersroutes,node_members,node_mongodb,node_cloudinary toneAmber
class node_transroutes,node_finroutes,node_transaction,node_financecontroller,node_ledger toneMint
class node_dashboardroutes,node_dashboard,node_reportroutes,node_reports,node_auditroutes,node_audit,node_settingsroutes,node_settings toneRose
class node_transactionsdb,node_usersdb,node_refreshdb,node_auditdb,node_visitor toneIndigo
```

## Components

### Client experience

- [Workspace UI](https://github.com/taskininorizon-dev/inorizon-efms/blob/main/client/src/App.jsx): `client/src/App.jsx`
- [API client](https://github.com/taskininorizon-dev/inorizon-efms/blob/main/client/src/api/client.js): `client/src/api/client.js`

### API and access

- [Express API](https://github.com/taskininorizon-dev/inorizon-efms/blob/main/server/src/app.js): `server/src/app.js`
- [Authentication routes](https://github.com/taskininorizon-dev/inorizon-efms/blob/main/server/src/routes/auth.routes.js): `server/src/routes/auth.routes.js`
- [Authentication](https://github.com/taskininorizon-dev/inorizon-efms/blob/main/server/src/controllers/auth.controller.js): `server/src/controllers/auth.controller.js`
- [Member routes](https://github.com/taskininorizon-dev/inorizon-efms/blob/main/server/src/routes/member.routes.js): `server/src/routes/member.routes.js`
- [Member management](https://github.com/taskininorizon-dev/inorizon-efms/blob/main/server/src/controllers/member.controller.js): `server/src/controllers/member.controller.js`

### Ledger and finance

- [Transaction routes](https://github.com/taskininorizon-dev/inorizon-efms/blob/main/server/src/routes/transaction.routes.js): `server/src/routes/transaction.routes.js`
- [Finance routes](https://github.com/taskininorizon-dev/inorizon-efms/blob/main/server/src/routes/finance.routes.js): `server/src/routes/finance.routes.js`
- [Transaction handling](https://github.com/taskininorizon-dev/inorizon-efms/blob/main/server/src/controllers/transaction.controller.js): `server/src/controllers/transaction.controller.js`
- [Fund and expense handling](https://github.com/taskininorizon-dev/inorizon-efms/blob/main/server/src/controllers/finance.controller.js): `server/src/controllers/finance.controller.js`
- [Ledger rules](https://github.com/taskininorizon-dev/inorizon-efms/blob/main/server/src/services/ledger.service.js): `server/src/services/ledger.service.js`

### Reporting and oversight

- [Dashboard routes](https://github.com/taskininorizon-dev/inorizon-efms/blob/main/server/src/routes/dashboard.routes.js): `server/src/routes/dashboard.routes.js`
- [Dashboard analytics](https://github.com/taskininorizon-dev/inorizon-efms/blob/main/server/src/controllers/dashboard.controller.js): `server/src/controllers/dashboard.controller.js`
- [Report routes](https://github.com/taskininorizon-dev/inorizon-efms/blob/main/server/src/routes/report.routes.js): `server/src/routes/report.routes.js`
- [Reports](https://github.com/taskininorizon-dev/inorizon-efms/blob/main/server/src/controllers/report.controller.js): `server/src/controllers/report.controller.js`
- [Audit routes](https://github.com/taskininorizon-dev/inorizon-efms/blob/main/server/src/routes/audit.routes.js): `server/src/routes/audit.routes.js`
- [Audit logging](https://github.com/taskininorizon-dev/inorizon-efms/blob/main/server/src/services/audit.service.js): `server/src/services/audit.service.js`
- [Settings routes](https://github.com/taskininorizon-dev/inorizon-efms/blob/main/server/src/routes/setting.routes.js): `server/src/routes/setting.routes.js`
- [Settings](https://github.com/taskininorizon-dev/inorizon-efms/blob/main/server/src/controllers/setting.controller.js): `server/src/controllers/setting.controller.js`

### Persistent state

- [Transactions](https://github.com/taskininorizon-dev/inorizon-efms/blob/main/server/src/models/Transaction.js): `server/src/models/Transaction.js`
- [Users](https://github.com/taskininorizon-dev/inorizon-efms/blob/main/server/src/models/User.js): `server/src/models/User.js`
- [Refresh tokens](https://github.com/taskininorizon-dev/inorizon-efms/blob/main/server/src/models/RefreshToken.js): `server/src/models/RefreshToken.js`
- [Audit logs](https://github.com/taskininorizon-dev/inorizon-efms/blob/main/server/src/models/AuditLog.js): `server/src/models/AuditLog.js`

### Other components

- **Visitor or Admin**
- **MongoDB**
- **Cloudinary**

## Connections

- Visitor or Admin → Workspace UI: uses
- Workspace UI → API client: requests data
- API client → Express API: calls API
- Express API → Authentication routes: dispatches
- Express API → Member routes: dispatches
- Express API → Transaction routes: dispatches
- Express API → Finance routes: dispatches
- Express API → Dashboard routes: dispatches
- Express API → Report routes: dispatches
- Express API → Audit routes: dispatches
- Express API → Settings routes: dispatches
- Authentication routes → Authentication: dispatches
- Member routes → Member management: dispatches
- Transaction routes → Transaction handling: dispatches
- Finance routes → Fund and expense handling: dispatches
- Dashboard routes → Dashboard analytics: dispatches
- Report routes → Reports: dispatches
- Audit routes → Audit logging: dispatches
- Settings routes → Settings: dispatches
- Authentication → Users: reads and updates
- Authentication → Refresh tokens: rotates sessions
- Authentication → Audit logging: records events
- Transaction handling → Ledger rules: checks ledger
- Transaction handling → Transactions: reads and writes
- Transaction handling → Audit logging: records changes
- Transaction handling → Cloudinary: deletes assets
- Fund and expense handling → Ledger rules: creates and summarizes
- Fund and expense handling → Transactions: lists transactions
- Fund and expense handling → Audit logging: records events
- Dashboard analytics → Ledger rules: gets summary
- Dashboard analytics → Transactions: aggregates activity
- Member management → Users: manages members
- Audit logging → Audit logs: writes logs
- Reports → Transactions: queries transactions
- Settings → MongoDB: stores settings
- Transactions → MongoDB: persists
- Users → MongoDB: persists
- Refresh tokens → MongoDB: persists
- Audit logs → MongoDB: persists
