# nosma/banktransactionsanalyzer architecture

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

## Overview

Bank Transactions Analyzer is a web application for importing bank statements and Midata CSV files, browsing and tagging transactions, and viewing income and expense statistics. The main workflow is browser upload → server-side file validation and parsing → transaction persistence and monthly-stat recomputation; separate API paths serve transaction lists, tagging, and statistics. The graph reflects the supplied controller and service excerpts. Front-end wiring and other unsampled subsystem details are represented conservatively from the file tree and README.

Main entry points: [`webApp/src/main/java/personal/bank/transaction/analyzer/database/dao/BankTransactionDao.java`](https://github.com/nosma/banktransactionsanalyzer/blob/master/webApp/src/main/java/personal/bank/transaction/analyzer/database/dao/BankTransactionDao.java) (Transaction repository), [`webApp/src/main/java/personal/bank/transaction/analyzer/web/controller/UploadController.java`](https://github.com/nosma/banktransactionsanalyzer/blob/master/webApp/src/main/java/personal/bank/transaction/analyzer/web/controller/UploadController.java) (Upload API), [`webApp/src/main/resources/static/scripts/app.js`](https://github.com/nosma/banktransactionsanalyzer/blob/master/webApp/src/main/resources/static/scripts/app.js) (AngularJS app), [`webApp/src/main/java/personal/bank/transaction/analyzer/web/service/MidataWriterService.java`](https://github.com/nosma/banktransactionsanalyzer/blob/master/webApp/src/main/java/personal/bank/transaction/analyzer/web/service/MidataWriterService.java) (Midata writer)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_ui["Web interface"]
  node_frontend["AngularJS app<br/>[app.js]"]
  node_upload_ui["Upload view<br/>[upload.js]"]
  node_transaction_ui["Transaction view<br/>[transactions.js]"]
  node_statistics_ui["Statistics view<br/>[statistics.js]"]
end

subgraph group_import["Transaction import"]
  node_upload_controller["Upload API"]
  node_file_parser["File validation<br/>[FileParser.java]"]
  node_statement_parser["Statement CSV parser"]
  node_midata_parser["Midata CSV parser"]
  node_statement_writer["Statement writer"]
  node_midata_writer["Midata writer"]
end

subgraph group_analysis["Transactions and statistics"]
  node_bank_api["Transaction API"]
  node_bank_service["Transaction queries<br/>[BankService.java]"]
  node_stats_api["Statistics API"]
  node_stats_service["Statistics calculations"]
  node_month_service["Monthly aggregation"]
end

subgraph group_tags["Transaction tagging"]
  node_tag_api["Tag API<br/>[TagController.java]"]
  node_tag_loader["Tag configuration<br/>[TagLoader.java]"]
end

subgraph group_persistence["Persistence"]
  node_bank_dao["Transaction repository"]
  node_midata_dao["Midata repository"]
  node_month_dao["Monthly-stat repository<br/>[MonthStatDao.java]"]
  node_tag_dao["Tag-rule repository<br/>[TagRuleDao.java]"]
  node_database[("Application database")]
end

node_user(("User"))

node_user -->|"uses"| node_frontend
node_frontend -->|"routes to"| node_upload_ui
node_frontend -->|"routes to"| node_transaction_ui
node_frontend -->|"routes to"| node_statistics_ui
node_upload_ui -->|"uploads files"| node_upload_controller
node_transaction_ui -->|"requests lists"| node_bank_api
node_statistics_ui -->|"requests metrics"| node_stats_api
node_upload_controller -->|"checks support"| node_file_parser
node_upload_controller -->|"parses statements"| node_statement_parser
node_upload_controller -->|"parses Midata"| node_midata_parser
node_upload_controller -->|"dispatches statements"| node_statement_writer
node_upload_controller -->|"dispatches Midata"| node_midata_writer
node_statement_writer -->|"saves transactions"| node_bank_dao
node_statement_writer -->|"recomputes totals"| node_month_service
node_midata_writer -->|"saves imports"| node_midata_dao
node_midata_writer -->|"saves transactions"| node_bank_dao
node_midata_writer -->|"recomputes totals"| node_month_service
node_bank_api -->|"delegates queries"| node_bank_service
node_bank_service -->|"reads transactions"| node_bank_dao
node_stats_api -->|"delegates calculations"| node_stats_service
node_stats_service -->|"reads transactions"| node_bank_dao
node_stats_service -->|"reads monthly stats"| node_month_dao
node_month_service -->|"reads transactions"| node_bank_dao
node_month_service -->|"rebuilds monthly stats"| node_month_dao
node_tag_api -->|"reads and updates"| node_bank_dao
node_tag_api -->|"saves tag rules"| node_tag_dao
node_tag_api -->|"loads predefined tags"| node_tag_loader
node_bank_dao -->|"persists records"| node_database
node_midata_dao -->|"persists records"| node_database
node_month_dao -->|"persists aggregates"| node_database
node_tag_dao -->|"persists rules"| node_database

click node_frontend "https://github.com/nosma/banktransactionsanalyzer/blob/master/webApp/src/main/resources/static/scripts/app.js"
click node_upload_ui "https://github.com/nosma/banktransactionsanalyzer/blob/master/webApp/src/main/resources/static/scripts/controllers/upload.js"
click node_transaction_ui "https://github.com/nosma/banktransactionsanalyzer/blob/master/webApp/src/main/resources/static/scripts/controllers/transactions.js"
click node_statistics_ui "https://github.com/nosma/banktransactionsanalyzer/blob/master/webApp/src/main/resources/static/scripts/controllers/statistics.js"
click node_upload_controller "https://github.com/nosma/banktransactionsanalyzer/blob/master/webApp/src/main/java/personal/bank/transaction/analyzer/web/controller/UploadController.java"
click node_file_parser "https://github.com/nosma/banktransactionsanalyzer/blob/master/webApp/src/main/java/personal/bank/transaction/analyzer/parser/FileParser.java"
click node_statement_parser "https://github.com/nosma/banktransactionsanalyzer/blob/master/webApp/src/main/java/personal/bank/transaction/analyzer/parser/StatementCsvParser.java"
click node_midata_parser "https://github.com/nosma/banktransactionsanalyzer/blob/master/webApp/src/main/java/personal/bank/transaction/analyzer/parser/MidataCsvParser.java"
click node_statement_writer "https://github.com/nosma/banktransactionsanalyzer/blob/master/webApp/src/main/java/personal/bank/transaction/analyzer/web/service/StatementWriterService.java"
click node_midata_writer "https://github.com/nosma/banktransactionsanalyzer/blob/master/webApp/src/main/java/personal/bank/transaction/analyzer/web/service/MidataWriterService.java"
click node_bank_api "https://github.com/nosma/banktransactionsanalyzer/blob/master/webApp/src/main/java/personal/bank/transaction/analyzer/web/controller/BankController.java"
click node_bank_service "https://github.com/nosma/banktransactionsanalyzer/blob/master/webApp/src/main/java/personal/bank/transaction/analyzer/web/service/BankService.java"
click node_stats_api "https://github.com/nosma/banktransactionsanalyzer/blob/master/webApp/src/main/java/personal/bank/transaction/analyzer/web/controller/BankStatisticsController.java"
click node_stats_service "https://github.com/nosma/banktransactionsanalyzer/blob/master/webApp/src/main/java/personal/bank/transaction/analyzer/web/service/BankStatisticsService.java"
click node_month_service "https://github.com/nosma/banktransactionsanalyzer/blob/master/webApp/src/main/java/personal/bank/transaction/analyzer/web/service/MonthStatService.java"
click node_tag_api "https://github.com/nosma/banktransactionsanalyzer/blob/master/webApp/src/main/java/personal/bank/transaction/analyzer/web/controller/TagController.java"
click node_tag_loader "https://github.com/nosma/banktransactionsanalyzer/blob/master/webApp/src/main/java/personal/bank/transaction/analyzer/web/service/TagLoader.java"
click node_bank_dao "https://github.com/nosma/banktransactionsanalyzer/blob/master/webApp/src/main/java/personal/bank/transaction/analyzer/database/dao/BankTransactionDao.java"
click node_midata_dao "https://github.com/nosma/banktransactionsanalyzer/blob/master/webApp/src/main/java/personal/bank/transaction/analyzer/database/dao/MidataTransactionDao.java"
click node_month_dao "https://github.com/nosma/banktransactionsanalyzer/blob/master/webApp/src/main/java/personal/bank/transaction/analyzer/database/dao/MonthStatDao.java"
click node_tag_dao "https://github.com/nosma/banktransactionsanalyzer/blob/master/webApp/src/main/java/personal/bank/transaction/analyzer/database/dao/TagRuleDao.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_frontend,node_upload_ui,node_transaction_ui,node_statistics_ui,node_user toneBlue
class node_upload_controller,node_file_parser,node_statement_parser,node_midata_parser,node_statement_writer,node_midata_writer toneAmber
class node_bank_api,node_bank_service,node_stats_api,node_stats_service,node_month_service toneMint
class node_tag_api,node_tag_loader toneRose
class node_bank_dao,node_midata_dao,node_month_dao,node_tag_dao,node_database toneIndigo
```

## Components

### Web interface

- [AngularJS app](https://github.com/nosma/banktransactionsanalyzer/blob/master/webApp/src/main/resources/static/scripts/app.js): `webApp/src/main/resources/static/scripts/app.js`
- [Upload view](https://github.com/nosma/banktransactionsanalyzer/blob/master/webApp/src/main/resources/static/scripts/controllers/upload.js): `webApp/src/main/resources/static/scripts/controllers/upload.js`
- [Transaction view](https://github.com/nosma/banktransactionsanalyzer/blob/master/webApp/src/main/resources/static/scripts/controllers/transactions.js): `webApp/src/main/resources/static/scripts/controllers/transactions.js`
- [Statistics view](https://github.com/nosma/banktransactionsanalyzer/blob/master/webApp/src/main/resources/static/scripts/controllers/statistics.js): `webApp/src/main/resources/static/scripts/controllers/statistics.js`

### Transaction import

- [Upload API](https://github.com/nosma/banktransactionsanalyzer/blob/master/webApp/src/main/java/personal/bank/transaction/analyzer/web/controller/UploadController.java): `webApp/src/main/java/personal/bank/transaction/analyzer/web/controller/UploadController.java`
- [File validation](https://github.com/nosma/banktransactionsanalyzer/blob/master/webApp/src/main/java/personal/bank/transaction/analyzer/parser/FileParser.java): `webApp/src/main/java/personal/bank/transaction/analyzer/parser/FileParser.java`
- [Statement CSV parser](https://github.com/nosma/banktransactionsanalyzer/blob/master/webApp/src/main/java/personal/bank/transaction/analyzer/parser/StatementCsvParser.java): `webApp/src/main/java/personal/bank/transaction/analyzer/parser/StatementCsvParser.java`
- [Midata CSV parser](https://github.com/nosma/banktransactionsanalyzer/blob/master/webApp/src/main/java/personal/bank/transaction/analyzer/parser/MidataCsvParser.java): `webApp/src/main/java/personal/bank/transaction/analyzer/parser/MidataCsvParser.java`
- [Statement writer](https://github.com/nosma/banktransactionsanalyzer/blob/master/webApp/src/main/java/personal/bank/transaction/analyzer/web/service/StatementWriterService.java): `webApp/src/main/java/personal/bank/transaction/analyzer/web/service/StatementWriterService.java`
- [Midata writer](https://github.com/nosma/banktransactionsanalyzer/blob/master/webApp/src/main/java/personal/bank/transaction/analyzer/web/service/MidataWriterService.java): `webApp/src/main/java/personal/bank/transaction/analyzer/web/service/MidataWriterService.java`

### Transactions and statistics

- [Transaction API](https://github.com/nosma/banktransactionsanalyzer/blob/master/webApp/src/main/java/personal/bank/transaction/analyzer/web/controller/BankController.java): `webApp/src/main/java/personal/bank/transaction/analyzer/web/controller/BankController.java`
- [Transaction queries](https://github.com/nosma/banktransactionsanalyzer/blob/master/webApp/src/main/java/personal/bank/transaction/analyzer/web/service/BankService.java): `webApp/src/main/java/personal/bank/transaction/analyzer/web/service/BankService.java`
- [Statistics API](https://github.com/nosma/banktransactionsanalyzer/blob/master/webApp/src/main/java/personal/bank/transaction/analyzer/web/controller/BankStatisticsController.java): `webApp/src/main/java/personal/bank/transaction/analyzer/web/controller/BankStatisticsController.java`
- [Statistics calculations](https://github.com/nosma/banktransactionsanalyzer/blob/master/webApp/src/main/java/personal/bank/transaction/analyzer/web/service/BankStatisticsService.java): `webApp/src/main/java/personal/bank/transaction/analyzer/web/service/BankStatisticsService.java`
- [Monthly aggregation](https://github.com/nosma/banktransactionsanalyzer/blob/master/webApp/src/main/java/personal/bank/transaction/analyzer/web/service/MonthStatService.java): `webApp/src/main/java/personal/bank/transaction/analyzer/web/service/MonthStatService.java`

### Transaction tagging

- [Tag API](https://github.com/nosma/banktransactionsanalyzer/blob/master/webApp/src/main/java/personal/bank/transaction/analyzer/web/controller/TagController.java): `webApp/src/main/java/personal/bank/transaction/analyzer/web/controller/TagController.java`
- [Tag configuration](https://github.com/nosma/banktransactionsanalyzer/blob/master/webApp/src/main/java/personal/bank/transaction/analyzer/web/service/TagLoader.java): `webApp/src/main/java/personal/bank/transaction/analyzer/web/service/TagLoader.java`

### Persistence

- [Transaction repository](https://github.com/nosma/banktransactionsanalyzer/blob/master/webApp/src/main/java/personal/bank/transaction/analyzer/database/dao/BankTransactionDao.java): `webApp/src/main/java/personal/bank/transaction/analyzer/database/dao/BankTransactionDao.java`
- [Midata repository](https://github.com/nosma/banktransactionsanalyzer/blob/master/webApp/src/main/java/personal/bank/transaction/analyzer/database/dao/MidataTransactionDao.java): `webApp/src/main/java/personal/bank/transaction/analyzer/database/dao/MidataTransactionDao.java`
- [Monthly-stat repository](https://github.com/nosma/banktransactionsanalyzer/blob/master/webApp/src/main/java/personal/bank/transaction/analyzer/database/dao/MonthStatDao.java): `webApp/src/main/java/personal/bank/transaction/analyzer/database/dao/MonthStatDao.java`
- [Tag-rule repository](https://github.com/nosma/banktransactionsanalyzer/blob/master/webApp/src/main/java/personal/bank/transaction/analyzer/database/dao/TagRuleDao.java): `webApp/src/main/java/personal/bank/transaction/analyzer/database/dao/TagRuleDao.java`
- **Application database**

### Other components

- **User**

## Connections

- User → AngularJS app: uses
- AngularJS app → Upload view: routes to
- AngularJS app → Transaction view: routes to
- AngularJS app → Statistics view: routes to
- Upload view → Upload API: uploads files
- Transaction view → Transaction API: requests lists
- Statistics view → Statistics API: requests metrics
- Upload API → File validation: checks support
- Upload API → Statement CSV parser: parses statements
- Upload API → Midata CSV parser: parses Midata
- Upload API → Statement writer: dispatches statements
- Upload API → Midata writer: dispatches Midata
- Statement writer → Transaction repository: saves transactions
- Statement writer → Monthly aggregation: recomputes totals
- Midata writer → Midata repository: saves imports
- Midata writer → Transaction repository: saves transactions
- Midata writer → Monthly aggregation: recomputes totals
- Transaction API → Transaction queries: delegates queries
- Transaction queries → Transaction repository: reads transactions
- Statistics API → Statistics calculations: delegates calculations
- Statistics calculations → Transaction repository: reads transactions
- Statistics calculations → Monthly-stat repository: reads monthly stats
- Monthly aggregation → Transaction repository: reads transactions
- Monthly aggregation → Monthly-stat repository: rebuilds monthly stats
- Tag API → Transaction repository: reads and updates
- Tag API → Tag-rule repository: saves tag rules
- Tag API → Tag configuration: loads predefined tags
- Transaction repository → Application database: persists records
- Midata repository → Application database: persists records
- Monthly-stat repository → Application database: persists aggregates
- Tag-rule repository → Application database: persists rules
