# a2le/enviro365-withdrawal-management architecture

> Architecture diagram of the GitHub repository a2le/enviro365-withdrawal-management, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-10). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/a2le/enviro365-withdrawal-management
- Repository: https://github.com/a2le/enviro365-withdrawal-management

## Overview

Enviro365 is a portfolio and withdrawal application: the dashboard loads an investor portfolio and withdrawal history, then supports submitting withdrawals, refreshing balances/history, and exporting statements. The frontend calls a Spring Boot API; the API separates controllers, business services, repositories, and JPA domain entities. The README documents portfolio viewing, rule validation, balance updates, history, and investor-filtered CSV export. Core frontend/API calls and withdrawal persistence are supported by excerpts; some capability links rely on README documentation because their implementation was not sampled.

Main entry points: [`enviro365-withdrawal-ui/src/pages/Dashboard.jsx`](https://github.com/a2le/enviro365-withdrawal-management/blob/main/enviro365-withdrawal-ui/src/pages/Dashboard.jsx) (Dashboard), [`enviro365-withdrawal-ui/src/services/withdrawalService.js`](https://github.com/a2le/enviro365-withdrawal-management/blob/main/enviro365-withdrawal-ui/src/services/withdrawalService.js) (API client service), [`giftntintiliapi/src/main/java/com/enviro/assessment/junior/giftntintili/service/WithdrawalService.java`](https://github.com/a2le/enviro365-withdrawal-management/blob/main/giftntintiliapi/src/main/java/com/enviro/assessment/junior/giftntintili/service/WithdrawalService.java) (Withdrawal service), [`giftntintiliapi/src/main/java/com/enviro/assessment/junior/giftntintili/repository/InvestorRepository.java`](https://github.com/a2le/enviro365-withdrawal-management/blob/main/giftntintiliapi/src/main/java/com/enviro/assessment/junior/giftntintili/repository/InvestorRepository.java) (Investor repository)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_ui["Withdrawal UI"]
  node_dashboard["Dashboard<br/>[Dashboard.jsx]"]
  node_portfolio_card["Portfolio card<br/>[PortfolioCard.jsx]"]
  node_withdrawal_form["Withdrawal form<br/>[WithdrawalForm.jsx]"]
  node_history["Withdrawal history"]
  node_csv_button["CSV export"]
  node_ui_service["API client service"]
  node_axios["HTTP client<br/>[axios.js]"]
end

subgraph group_api["API endpoints"]
  node_investor_api["Investor endpoint"]
  node_withdrawal_api["Withdrawal endpoints"]
  node_error_handler["API error handling"]
end

subgraph group_logic["Business services"]
  node_investor_service["Portfolio service"]
  node_withdrawal_service["Withdrawal service"]
  node_investor_repo["Investor repository"]
  node_product_repo["Product repository"]
  node_withdrawal_repo["Withdrawal repository"]
end

subgraph group_domain["Portfolio domain"]
  node_investor_entity["Investor record<br/>[Investor.java]"]
  node_product_entity["Product and balance<br/>[Product.java]"]
  node_withdrawal_entity["Withdrawal record<br/>[Withdrawal.java]"]
  node_database[("H2 database")]
end

node_investor(("Investor"))

node_investor -.->|"uses dashboard"| node_dashboard
node_dashboard -->|"loads data"| node_ui_service
node_dashboard -->|"renders portfolio"| node_portfolio_card
node_dashboard -->|"renders form"| node_withdrawal_form
node_dashboard -->|"renders history"| node_history
node_dashboard -->|"renders export"| node_csv_button
node_withdrawal_form -->|"submits request"| node_ui_service
node_csv_button -->|"requests export"| node_ui_service
node_ui_service -->|"sends HTTP"| node_axios
node_ui_service -.->|"requests portfolio"| node_investor_api
node_ui_service -.->|"requests withdrawals"| node_withdrawal_api
node_investor_api -->|"delegates portfolio"| node_investor_service
node_withdrawal_api -->|"delegates operations"| node_withdrawal_service
node_investor_service -->|"loads investor"| node_investor_repo
node_withdrawal_service -->|"loads and saves product"| node_product_repo
node_withdrawal_service -->|"stores and lists"| node_withdrawal_repo
node_investor_repo -->|"persists"| node_investor_entity
node_product_repo -->|"persists"| node_product_entity
node_withdrawal_repo -->|"persists"| node_withdrawal_entity
node_investor_entity -->|"owns products"| node_product_entity
node_withdrawal_entity -->|"references product"| node_product_entity
node_database -.->|"stores records"| node_investor_repo
node_withdrawal_service -.->|"raises rule errors"| node_error_handler

click node_dashboard "https://github.com/a2le/enviro365-withdrawal-management/blob/main/enviro365-withdrawal-ui/src/pages/Dashboard.jsx"
click node_portfolio_card "https://github.com/a2le/enviro365-withdrawal-management/blob/main/enviro365-withdrawal-ui/src/components/PortfolioCard.jsx"
click node_withdrawal_form "https://github.com/a2le/enviro365-withdrawal-management/blob/main/enviro365-withdrawal-ui/src/components/WithdrawalForm.jsx"
click node_history "https://github.com/a2le/enviro365-withdrawal-management/blob/main/enviro365-withdrawal-ui/src/components/WithdrawalHistory.jsx"
click node_csv_button "https://github.com/a2le/enviro365-withdrawal-management/blob/main/enviro365-withdrawal-ui/src/components/CsvExportButton.jsx"
click node_ui_service "https://github.com/a2le/enviro365-withdrawal-management/blob/main/enviro365-withdrawal-ui/src/services/withdrawalService.js"
click node_axios "https://github.com/a2le/enviro365-withdrawal-management/blob/main/enviro365-withdrawal-ui/src/api/axios.js"
click node_investor_api "https://github.com/a2le/enviro365-withdrawal-management/blob/main/giftntintiliapi/src/main/java/com/enviro/assessment/junior/giftntintili/controller/InvestorController.java"
click node_withdrawal_api "https://github.com/a2le/enviro365-withdrawal-management/blob/main/giftntintiliapi/src/main/java/com/enviro/assessment/junior/giftntintili/controller/WithdrawalController.java"
click node_investor_service "https://github.com/a2le/enviro365-withdrawal-management/blob/main/giftntintiliapi/src/main/java/com/enviro/assessment/junior/giftntintili/service/InvestorService.java"
click node_withdrawal_service "https://github.com/a2le/enviro365-withdrawal-management/blob/main/giftntintiliapi/src/main/java/com/enviro/assessment/junior/giftntintili/service/WithdrawalService.java"
click node_investor_repo "https://github.com/a2le/enviro365-withdrawal-management/blob/main/giftntintiliapi/src/main/java/com/enviro/assessment/junior/giftntintili/repository/InvestorRepository.java"
click node_product_repo "https://github.com/a2le/enviro365-withdrawal-management/blob/main/giftntintiliapi/src/main/java/com/enviro/assessment/junior/giftntintili/repository/ProductRepository.java"
click node_withdrawal_repo "https://github.com/a2le/enviro365-withdrawal-management/blob/main/giftntintiliapi/src/main/java/com/enviro/assessment/junior/giftntintili/repository/WithdrawalRepository.java"
click node_investor_entity "https://github.com/a2le/enviro365-withdrawal-management/blob/main/giftntintiliapi/src/main/java/com/enviro/assessment/junior/giftntintili/entity/Investor.java"
click node_product_entity "https://github.com/a2le/enviro365-withdrawal-management/blob/main/giftntintiliapi/src/main/java/com/enviro/assessment/junior/giftntintili/entity/Product.java"
click node_withdrawal_entity "https://github.com/a2le/enviro365-withdrawal-management/blob/main/giftntintiliapi/src/main/java/com/enviro/assessment/junior/giftntintili/entity/Withdrawal.java"
click node_error_handler "https://github.com/a2le/enviro365-withdrawal-management/blob/main/giftntintiliapi/src/main/java/com/enviro/assessment/junior/giftntintili/exception/GlobalExceptionHandler.java"
click node_database "https://github.com/a2le/enviro365-withdrawal-management/blob/main/giftntintiliapi/src/main/resources/application.properties"

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_dashboard,node_portfolio_card,node_withdrawal_form,node_history,node_csv_button,node_ui_service,node_axios toneBlue
class node_investor_api,node_withdrawal_api,node_error_handler toneAmber
class node_investor_service,node_withdrawal_service,node_investor_repo,node_product_repo,node_withdrawal_repo toneMint
class node_investor_entity,node_product_entity,node_withdrawal_entity,node_database toneRose
class node_investor toneIndigo
```

## Components

### Withdrawal UI

- [Dashboard](https://github.com/a2le/enviro365-withdrawal-management/blob/main/enviro365-withdrawal-ui/src/pages/Dashboard.jsx): `enviro365-withdrawal-ui/src/pages/Dashboard.jsx`
- [Portfolio card](https://github.com/a2le/enviro365-withdrawal-management/blob/main/enviro365-withdrawal-ui/src/components/PortfolioCard.jsx): `enviro365-withdrawal-ui/src/components/PortfolioCard.jsx`
- [Withdrawal form](https://github.com/a2le/enviro365-withdrawal-management/blob/main/enviro365-withdrawal-ui/src/components/WithdrawalForm.jsx): `enviro365-withdrawal-ui/src/components/WithdrawalForm.jsx`
- [Withdrawal history](https://github.com/a2le/enviro365-withdrawal-management/blob/main/enviro365-withdrawal-ui/src/components/WithdrawalHistory.jsx): `enviro365-withdrawal-ui/src/components/WithdrawalHistory.jsx`
- [CSV export](https://github.com/a2le/enviro365-withdrawal-management/blob/main/enviro365-withdrawal-ui/src/components/CsvExportButton.jsx): `enviro365-withdrawal-ui/src/components/CsvExportButton.jsx`
- [API client service](https://github.com/a2le/enviro365-withdrawal-management/blob/main/enviro365-withdrawal-ui/src/services/withdrawalService.js): `enviro365-withdrawal-ui/src/services/withdrawalService.js`
- [HTTP client](https://github.com/a2le/enviro365-withdrawal-management/blob/main/enviro365-withdrawal-ui/src/api/axios.js): `enviro365-withdrawal-ui/src/api/axios.js`

### API endpoints

- [Investor endpoint](https://github.com/a2le/enviro365-withdrawal-management/blob/main/giftntintiliapi/src/main/java/com/enviro/assessment/junior/giftntintili/controller/InvestorController.java): `giftntintiliapi/src/main/java/com/enviro/assessment/junior/giftntintili/controller/InvestorController.java`
- [Withdrawal endpoints](https://github.com/a2le/enviro365-withdrawal-management/blob/main/giftntintiliapi/src/main/java/com/enviro/assessment/junior/giftntintili/controller/WithdrawalController.java): `giftntintiliapi/src/main/java/com/enviro/assessment/junior/giftntintili/controller/WithdrawalController.java`
- [API error handling](https://github.com/a2le/enviro365-withdrawal-management/blob/main/giftntintiliapi/src/main/java/com/enviro/assessment/junior/giftntintili/exception/GlobalExceptionHandler.java): `giftntintiliapi/src/main/java/com/enviro/assessment/junior/giftntintili/exception/GlobalExceptionHandler.java`

### Business services

- [Portfolio service](https://github.com/a2le/enviro365-withdrawal-management/blob/main/giftntintiliapi/src/main/java/com/enviro/assessment/junior/giftntintili/service/InvestorService.java): `giftntintiliapi/src/main/java/com/enviro/assessment/junior/giftntintili/service/InvestorService.java`
- [Withdrawal service](https://github.com/a2le/enviro365-withdrawal-management/blob/main/giftntintiliapi/src/main/java/com/enviro/assessment/junior/giftntintili/service/WithdrawalService.java): `giftntintiliapi/src/main/java/com/enviro/assessment/junior/giftntintili/service/WithdrawalService.java`
- [Investor repository](https://github.com/a2le/enviro365-withdrawal-management/blob/main/giftntintiliapi/src/main/java/com/enviro/assessment/junior/giftntintili/repository/InvestorRepository.java): `giftntintiliapi/src/main/java/com/enviro/assessment/junior/giftntintili/repository/InvestorRepository.java`
- [Product repository](https://github.com/a2le/enviro365-withdrawal-management/blob/main/giftntintiliapi/src/main/java/com/enviro/assessment/junior/giftntintili/repository/ProductRepository.java): `giftntintiliapi/src/main/java/com/enviro/assessment/junior/giftntintili/repository/ProductRepository.java`
- [Withdrawal repository](https://github.com/a2le/enviro365-withdrawal-management/blob/main/giftntintiliapi/src/main/java/com/enviro/assessment/junior/giftntintili/repository/WithdrawalRepository.java): `giftntintiliapi/src/main/java/com/enviro/assessment/junior/giftntintili/repository/WithdrawalRepository.java`

### Portfolio domain

- [Investor record](https://github.com/a2le/enviro365-withdrawal-management/blob/main/giftntintiliapi/src/main/java/com/enviro/assessment/junior/giftntintili/entity/Investor.java): `giftntintiliapi/src/main/java/com/enviro/assessment/junior/giftntintili/entity/Investor.java`
- [Product and balance](https://github.com/a2le/enviro365-withdrawal-management/blob/main/giftntintiliapi/src/main/java/com/enviro/assessment/junior/giftntintili/entity/Product.java): `giftntintiliapi/src/main/java/com/enviro/assessment/junior/giftntintili/entity/Product.java`
- [Withdrawal record](https://github.com/a2le/enviro365-withdrawal-management/blob/main/giftntintiliapi/src/main/java/com/enviro/assessment/junior/giftntintili/entity/Withdrawal.java): `giftntintiliapi/src/main/java/com/enviro/assessment/junior/giftntintili/entity/Withdrawal.java`
- [H2 database](https://github.com/a2le/enviro365-withdrawal-management/blob/main/giftntintiliapi/src/main/resources/application.properties): `giftntintiliapi/src/main/resources/application.properties`

### Other components

- **Investor**

## Connections

- Investor → Dashboard: uses dashboard (evidence: `README.md`)
- Dashboard → API client service: loads data (evidence: `enviro365-withdrawal-ui/src/pages/Dashboard.jsx`)
- Dashboard → Portfolio card: renders portfolio (evidence: `enviro365-withdrawal-ui/src/pages/Dashboard.jsx`)
- Dashboard → Withdrawal form: renders form (evidence: `enviro365-withdrawal-ui/src/pages/Dashboard.jsx`)
- Dashboard → Withdrawal history: renders history (evidence: `enviro365-withdrawal-ui/src/pages/Dashboard.jsx`)
- Dashboard → CSV export: renders export (evidence: `enviro365-withdrawal-ui/src/pages/Dashboard.jsx`)
- Withdrawal form → API client service: submits request (evidence: `enviro365-withdrawal-ui/src/components/WithdrawalForm.jsx`)
- CSV export → API client service: requests export (evidence: `enviro365-withdrawal-ui/src/components/CsvExportButton.jsx`)
- API client service → HTTP client: sends HTTP (evidence: `enviro365-withdrawal-ui/src/services/withdrawalService.js`)
- API client service → Investor endpoint: requests portfolio (evidence: `README.md`)
- API client service → Withdrawal endpoints: requests withdrawals (evidence: `README.md`)
- Investor endpoint → Portfolio service: delegates portfolio (evidence: `giftntintiliapi/src/main/java/com/enviro/assessment/junior/giftntintili/controller/InvestorController.java`)
- Withdrawal endpoints → Withdrawal service: delegates operations (evidence: `giftntintiliapi/src/main/java/com/enviro/assessment/junior/giftntintili/controller/WithdrawalController.java`)
- Portfolio service → Investor repository: loads investor (evidence: `giftntintiliapi/src/main/java/com/enviro/assessment/junior/giftntintili/service/InvestorService.java`)
- Withdrawal service → Product repository: loads and saves product (evidence: `giftntintiliapi/src/main/java/com/enviro/assessment/junior/giftntintili/service/WithdrawalService.java`)
- Withdrawal service → Withdrawal repository: stores and lists (evidence: `giftntintiliapi/src/main/java/com/enviro/assessment/junior/giftntintili/service/WithdrawalService.java`)
- Investor repository → Investor record: persists (evidence: `giftntintiliapi/src/main/java/com/enviro/assessment/junior/giftntintili/repository/InvestorRepository.java`)
- Product repository → Product and balance: persists (evidence: `giftntintiliapi/src/main/java/com/enviro/assessment/junior/giftntintili/repository/ProductRepository.java`)
- Withdrawal repository → Withdrawal record: persists (evidence: `giftntintiliapi/src/main/java/com/enviro/assessment/junior/giftntintili/repository/WithdrawalRepository.java`)
- Investor record → Product and balance: owns products (evidence: `giftntintiliapi/src/main/java/com/enviro/assessment/junior/giftntintili/entity/Investor.java`)
- Withdrawal record → Product and balance: references product (evidence: `giftntintiliapi/src/main/java/com/enviro/assessment/junior/giftntintili/entity/Withdrawal.java`)
- H2 database → Investor repository: stores records (evidence: `README.md`)
- Withdrawal service → API error handling: raises rule errors (evidence: `README.md`)
