     1|# ezBookkeeping
     2|[![License](https://img.shields.io/badge/license-MIT-green.svg)](https://github.com/mayswind/ezbookkeeping/blob/master/LICENSE)
     3|[![Go Report](https://goreportcard.com/badge/github.com/mayswind/ezbookkeeping)](https://goreportcard.com/report/github.com/mayswind/ezbookkeeping)
     4|[![Latest Release](https://img.shields.io/github/release/mayswind/ezbookkeeping.svg?style=flat)](https://github.com/mayswind/ezbookkeeping/releases)
     5|[![Latest Build](https://img.shields.io/github/actions/workflow/status/mayswind/ezbookkeeping/build-snapshot.yml?branch=main)](https://github.com/mayswind/ezbookkeeping/actions)
     6|[![Latest Docker Image Size](https://img.shields.io/docker/image-size/mayswind/ezbookkeeping.svg?style=flat)](https://hub.docker.com/r/mayswind/ezbookkeeping)
     7|[![Docker Pulls](https://img.shields.io/docker/pulls/mayswind/ezbookkeeping)](https://hub.docker.com/r/mayswind/ezbookkeeping)
     8|[![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/mayswind/ezbookkeeping)
     9|
    10|[![Recommend By HelloGitHub](https://api.hellogithub.com/v1/widgets/recommend.svg?rid=ded5af09da574ec1811ddb154f1b2093&claim_uid=LT7EZxeBukCnh0K)](https://hellogithub.com/en/repository/mayswind/ezbookkeeping)
    11|[![Trending](https://trendshift.io/api/badge/repositories/12917)](https://trendshift.io/repositories/12917)
    12|
    13|## Introduction
    14|ezBookkeeping is a lightweight, self-hosted personal finance app with a user-friendly interface and powerful bookkeeping features. It helps you record daily transactions, import data from various sources, and quickly search and filter your bills. You can analyze historical data using built-in charts or perform custom queries with your own chart dimensions to better understand spending patterns and financial trends. ezBookkeeping is easy to deploy, and you can start it with just one single Docker command. Designed to be resource-efficient, it runs smoothly on devices such as Raspberry Pi, NAS, and MicroServers.
    15|
    16|ezBookkeeping offers tailored interfaces for both mobile and desktop devices. With support for PWA (Progressive Web Apps), you can even [add it to your mobile home screen](https://raw.githubusercontent.com/wiki/mayswind/ezbookkeeping/img/mobile/add_to_home_screen.gif) and use it like a native app.
    17|
    18|Live Demo: [https://ezbookkeeping-demo.mayswind.net](https://ezbookkeeping-demo.mayswind.net)
    19|
    20|## Features
    21|- **Open Source & Self-Hosted**
    22|    - Built for privacy and control
    23|- **Lightweight & Fast**
    24|    - Minimal resource usage, runs smoothly even on low-resource devices
    25|- **Easy Installation**
    26|    - Docker support
    27|    - Supports SQLite, MySQL, PostgreSQL
    28|    - Cross-platform (Windows, macOS, Linux)
    29|    - Works on x86, amd64, ARM architectures
    30|- **User-Friendly Interface**
    31|    - UI optimized for both mobile and desktop
    32|    - PWA support for native-like mobile experience
    33|    - Dark mode
    34|- **AI-Powered Features**
    35|    - Receipt image recognition
    36|    - MCP (Model Context Protocol) support for AI integration
    37|    - Agent Skill and API command-line script tools support for AI integration
    38|- **Powerful Bookkeeping**
    39|    - Two-level accounts and categories
    40|    - Image attachments for transactions
    41|    - Location tracking with maps
    42|    - Scheduled transactions
    43|    - Advanced filtering, search, visualization and analysis
    44|- **Localization & Internationalization**
    45|    - Multi-language and multi-currency support
    46|    - Multiple exchange rate sources with automatic updates
    47|    - Multi-timezone support
    48|    - Custom formats for dates, numbers and currencies
    49|- **Security**
    50|    - Two-factor authentication (2FA)
    51|    - OIDC external authentication
    52|    - Login rate limiting
    53|    - Application lock (PIN code / WebAuthn)
    54|- **Data Import & Export**
    55|    - Supports CSV, OFX, QFX, QIF, IIF, Camt.052, Camt.053, MT940, GnuCash, Firefly III, Beancount and more
    56|
    57|For a full list of features, visit the [Full Feature List](https://ezbookkeeping.mayswind.net/features/).
    58|
    59|## Screenshots
    60|### Desktop Version
    61|[![ezBookkeeping](https://raw.githubusercontent.com/wiki/mayswind/ezbookkeeping/img/desktop/en.png)](https://raw.githubusercontent.com/wiki/mayswind/ezbookkeeping/img/desktop/en.png)
    62|
    63|### Mobile Version
    64|[![ezBookkeeping](https://raw.githubusercontent.com/wiki/mayswind/ezbookkeeping/img/mobile/en.png)](https://raw.githubusercontent.com/wiki/mayswind/ezbookkeeping/img/mobile/en.png)
    65|
    66|## Installation
    67|### Run with Docker
    68|Visit [Docker Hub](https://hub.docker.com/r/mayswind/ezbookkeeping) to see all images and tags.
    69|
    70|**Latest Release:**
    71|
    72|    $ docker run -p8080:8080 mayswind/ezbookkeeping
    73|
    74|**Latest Daily Build:**
    75|
    76|    $ docker run -p8080:8080 mayswind/ezbookkeeping:latest-snapshot
    77|
    78|### Install from Binary
    79|Download the latest release: [https://github.com/mayswind/ezbookkeeping/releases](https://github.com/mayswind/ezbookkeeping/releases)
    80|
    81|**Linux / macOS**
    82|
    83|    $ ./ezbookkeeping server run
    84|
    85|**Windows**
    86|
    87|    > .\ezbookkeeping.exe server run
    88|
    89|By default, ezBookkeeping listens on port 8080. You can then visit `http://{YOUR_HOST_ADDRESS}:8080/` .
    90|
    91|### Build from Source
    92|Make sure you have [Golang](https://golang.org/), [GCC](https://gcc.gnu.org/), [Node.js](https://nodejs.org/) and [NPM](https://www.npmjs.com/) installed. Then download the source code, and follow these steps:
    93|
    94|**Linux / macOS**
    95|
    96|    $ ./build.sh package -o ezbookkeeping.tar.gz
    97|
    98|All the files will be packaged in `ezbookkeeping.tar.gz`.
    99|
   100|**Windows**
   101|
   102|    > .\build.bat package -o ezbookkeeping.zip
   103|
   104|or
   105|
   106|    PS > .\build.ps1 package -Output ezbookkeeping.zip
   107|
   108|All the files will be packaged in `ezbookkeeping.zip`.
   109|
   110|You can also build a Docker image. Make sure you have [Docker](https://www.docker.com/) installed, then follow these steps:
   111|
   112|**Linux**
   113|
   114|    $ ./build.sh docker
   115|
   116|## Contributing
   117|We welcome contributions of all kinds.
   118|
   119|If you find a bug, please [submit an issue](https://github.com/mayswind/ezbookkeeping/issues) on GitHub.
   120|
   121|If you would like to contribute code, you can fork the repository and open a pull request.
   122|
   123|Improvements to documentation, feature suggestions, and other forms of feedback are also appreciated.
   124|
   125|You can view existing contributors on the [Contributor Graph](https://github.com/mayswind/ezbookkeeping/graphs/contributors).
   126|
   127|## Translating
   128|Help make ezBookkeeping accessible to users around the world. We welcome help to improve existing translations or add new ones. If you would like to contribute a translation, please refer to the [translation guide](https://ezbookkeeping.mayswind.net/translating).
   129|
   130|Currently available translations:
   131|
   132|| Tag | Language | Progress | Contributors |
   133|| --- | --- | --- | --- |
   134|| de | Deutsch | [![Translation Progress](https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Fmayswind%2FezBookkeeping-i18n-badge%2Fmain%2Fbadges%2Fde.json)](https://github.com/mayswind/ezBookkeeping-i18n-badge/blob/main/untranslated/de.json) | [@chrgm](https://github.com/chrgm), [@1270o1](https://github.com/1270o1) |
   135|| en | English | [![Translation Progress](https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Fmayswind%2FezBookkeeping-i18n-badge%2Fmain%2Fbadges%2Fen.json)](https://github.com/mayswind/ezBookkeeping-i18n-badge/blob/main/untranslated/en.json) | / |
   136|| es | Español | [![Translation Progress](https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Fmayswind%2FezBookkeeping-i18n-badge%2Fmain%2Fbadges%2Fes.json)](https://github.com/mayswind/ezBookkeeping-i18n-badge/blob/main/untranslated/es.json) | [@Miguelonlonlon](https://github.com/Miguelonlonlon), [@abrugues](https://github.com/abrugues), [@AndresTeller](https://github.com/AndresTeller), [@diegofercri](https://github.com/diegofercri) |
   137|| fr | Français | [![Translation Progress](https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Fmayswind%2FezBookkeeping-i18n-badge%2Fmain%2Fbadges%2Ffr.json)](https://github.com/mayswind/ezBookkeeping-i18n-badge/blob/main/untranslated/fr.json) | [@brieucdlf](https://github.com/brieucdlf) |
   138|| it | Italiano | [![Translation Progress](https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Fmayswind%2FezBookkeeping-i18n-badge%2Fmain%2Fbadges%2Fit.json)](https://github.com/mayswind/ezBookkeeping-i18n-badge/blob/main/untranslated/it.json) | [@waron97](https://github.com/waron97) |
   139|| ja | 日本語 | [![Translation Progress](https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Fmayswind%2FezBookkeeping-i18n-badge%2Fmain%2Fbadges%2Fja.json)](https://github.com/mayswind/ezBookkeeping-i18n-badge/blob/main/untranslated/ja.json) | [@tkymmm](https://github.com/tkymmm) |
   140|| kn | ಕನ್ನಡ | [![Translation Progress](https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Fmayswind%2FezBookkeeping-i18n-badge%2Fmain%2Fbadges%2Fkn.json)](https://github.com/mayswind/ezBookkeeping-i18n-badge/blob/main/untranslated/kn.json) | [@Darshanbm05](https://github.com/Darshanbm05) |
   141|| ko | 한국어 | [![Translation Progress](https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Fmayswind%2FezBookkeeping-i18n-badge%2Fmain%2Fbadges%2Fko.json)](https://github.com/mayswind/ezBookkeeping-i18n-badge/blob/main/untranslated/ko.json) | [@overworks](https://github.com/overworks) |
   142|| nl | Nederlands | [![Translation Progress](https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Fmayswind%2FezBookkeeping-i18n-badge%2Fmain%2Fbadges%2Fnl.json)](https://github.com/mayswind/ezBookkeeping-i18n-badge/blob/main/untranslated/nl.json) | [@automagics](https://github.com/automagics) |
   143|| pt-BR | Português (Brasil) | [![Translation Progress](https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Fmayswind%2FezBookkeeping-i18n-badge%2Fmain%2Fbadges%2Fpt-BR.json)](https://github.com/mayswind/ezBookkeeping-i18n-badge/blob/main/untranslated/pt-BR.json) | [@thecodergus](https://github.com/thecodergus), [@balaios](https://github.com/balaios) |
   144|| ru | Русский | [![Translation Progress](https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Fmayswind%2FezBookkeeping-i18n-badge%2Fmain%2Fbadges%2Fru.json)](https://github.com/mayswind/ezBookkeeping-i18n-badge/blob/main/untranslated/ru.json) | [@artegoser](https://github.com/artegoser), [@dshemin](https://github.com/dshemin) |
   145|| sl | Slovenščina | [![Translation Progress](https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Fmayswind%2FezBookkeeping-i18n-badge%2Fmain%2Fbadges%2Fsl.json)](https://github.com/mayswind/ezBookkeeping-i18n-badge/blob/main/untranslated/sl.json) | [@thehijacker](https://github.com/thehijacker) |
   146|| ta | தமிழ் | [![Translation Progress](https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Fmayswind%2FezBookkeeping-i18n-badge%2Fmain%2Fbadges%2Fta.json)](https://github.com/mayswind/ezBookkeeping-i18n-badge/blob/main/untranslated/ta.json) | [@hhharsha36](https://github.com/hhharsha36) |
   147|| th | ไทย | [![Translation Progress](https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Fmayswind%2FezBookkeeping-i18n-badge%2Fmain%2Fbadges%2Fth.json)](https://github.com/mayswind/ezBookkeeping-i18n-badge/blob/main/untranslated/th.json) | [@natthavat28](https://github.com/natthavat28) |
   148|| tr | Türkçe | [![Translation Progress](https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Fmayswind%2FezBookkeeping-i18n-badge%2Fmain%2Fbadges%2Ftr.json)](https://github.com/mayswind/ezBookkeeping-i18n-badge/blob/main/untranslated/tr.json) | [@aydnykn](https://github.com/aydnykn) |
   149|| uk | Українська | [![Translation Progress](https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Fmayswind%2FezBookkeeping-i18n-badge%2Fmain%2Fbadges%2Fuk.json)](https://github.com/mayswind/ezBookkeeping-i18n-badge/blob/main/untranslated/uk.json) | [@nktlitvinenko](https://github.com/nktlitvinenko) |
   150|| vi | Tiếng Việt | [![Translation Progress](https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Fmayswind%2FezBookkeeping-i18n-badge%2Fmain%2Fbadges%2Fvi.json)](https://github.com/mayswind/ezBookkeeping-i18n-badge/blob/main/untranslated/vi.json) | [@f97](https://github.com/f97) |
   151|| zh-Hans | 中文 (简体) | [![Translation Progress](https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Fmayswind%2FezBookkeeping-i18n-badge%2Fmain%2Fbadges%2Fzh-Hans.json)](https://github.com/mayswind/ezBookkeeping-i18n-badge/blob/main/untranslated/zh-Hans.json) | / |
   152|| zh-Hant | 中文 (繁體) | [![Translation Progress](https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Fmayswind%2FezBookkeeping-i18n-badge%2Fmain%2Fbadges%2Fzh-Hant.json)](https://github.com/mayswind/ezBookkeeping-i18n-badge/blob/main/untranslated/zh-Hant.json) | / |
   153|
   154|## Documentation
   155|1. [English](https://ezbookkeeping.mayswind.net)
   156|1. [中文 (简体)](https://ezbookkeeping.mayswind.net/zh_Hans)
   157|
   158|## License
   159|[MIT](https://github.com/mayswind/ezbookkeeping/blob/master/LICENSE)
   160|


terminal

Output:
.editorconfig
.gitea/workflows/deploy.yml
.gitea/workflows/docker-release.yml
.gitea/workflows/docker-snapshot.yml
.github/ISSUE_TEMPLATE/bug-report.yml
.github/ISSUE_TEMPLATE/config.yml
.github/ISSUE_TEMPLATE/feature-request.yml
.github/actions/build-linux-docker-and-package/action.yml
.github/actions/build-macos-backend/action.yml
.github/actions/build-macos-package/action.yml
.github/actions/build-windows-backend/action.yml
.github/actions/build-windows-package/action.yml
.github/actions/push-linux-docker/action.yml
.github/scripts/update-i18n-progress.js
.github/workflows/build-non-main-branch.yml
.github/workflows/build-release.yml
.github/workflows/build-snapshot.yml
.github/workflows/update-i18n-progress.yml
.gitignore
Dockerfile
LICENSE
README.md
build.bat
build.ps1
build.sh
cmd/base.go
cmd/cron_jobs.go
cmd/database.go
cmd/initializer.go
cmd/security.go
cmd/user_data.go
cmd/utility.go
cmd/webserver.go
conf/ezbookkeeping.ini
contributors.json
docker-bake.hcl
docker/backend-build-pre-setup.sh
docker/docker-entrypoint.sh
docker/frontend-build-pre-setup.sh
eslint.config.mjs
etc/systemd/ezbookkeeping.service
ezbookkeeping.go
go.mod
go.sum
package-lock.json
package.json
pkg/api/accounts.go
pkg/api/amap_api_proxies.go
pkg/api/authorizations.go
pkg/api/base.go
pkg/api/data_managements.go
pkg/api/default.go
pkg/api/exchange_rates.go
pkg/api/explorers.go
pkg/api/forget_passwords.go
pkg/api/healths.go
pkg/api/large_language_models.go
pkg/api/map_image_proxies.go
pkg/api/model_context_protocols.go
pkg/api/oauth2_authentications.go
pkg/api/qrcodes.go
pkg/api/server_settings.go
pkg/api/systems.go
pkg/api/tokens.go
pkg/api/transaction_categories.go
pkg/api/transaction_pictures.go
pkg/api/transaction_tag_groups.go
pkg/api/transaction_tags.go
pkg/api/transaction_templates.go
pkg/api/transactions.go
pkg/api/twofactor_authorizations.go
pkg/api/user_app_cloud_settings.go
pkg/api/user_external_auths.go
pkg/api/users.go
pkg/auth/oauth2/data/oauth2_user_info.go
pkg/auth/oauth2/oauth2_authentication.go
pkg/auth/oauth2/oauth2_context.go
pkg/auth/oauth2/provider/common/common_oauth2_provider.go
pkg/auth/oauth2/provider/gitea/gitea_oauth2_datasource.go
pkg/auth/oauth2/provider/gitea/gitea_oauth2_datasource_test.go
pkg/auth/oauth2/provider/github/github_oauth2_provider.go
pkg/auth/oauth2/provider/github/github_oauth2_provider_test.go
pkg/auth/oauth2/provider/nextcloud/nextcloud_oauth2_datasource.go
pkg/auth/oauth2/provider/nextcloud/nextcloud_oauth2_datasource_test.go
pkg/auth/oauth2/provider/oauth2_provider.go
pkg/auth/oauth2/provider/oidc/oidc_provider.go
pkg/avatars/avatar_provider.go
pkg/avatars/avatar_provider_container.go
pkg/avatars/gravatar_provider.go
pkg/avatars/gravatar_provider_test.go
pkg/avatars/internal_storage_provider.go
pkg/avatars/internal_storage_provider_test.go
pkg/avatars/null_avatar_provider.go
pkg/avatars/null_avatar_provider_test.go
pkg/cli/base.go
pkg/cli/user_data.go
pkg/converters/alipay/alipay_app_transaction_data_csv_file_importer.go
pkg/converters/alipay/alipay_transaction_data_csv_file_importer.go
pkg/converters/alipay/alipay_transaction_data_csv_file_importer_test.go
pkg/converters/alipay/alipay_transaction_data_extrator.go
pkg/converters/alipay/alipay_transaction_data_row_parser.go
pkg/converters/alipay/alipay_web_transaction_data_csv_file_importer.go
pkg/converters/beancount/beancount_amount_expression_evaluator.go
pkg/converters/beancount/beancount_amount_expression_evaluator_test.go
pkg/converters/beancount/beancount_data.go
pkg/converters/beancount/beancount_data_reader.go
pkg/converters/beancount/beancount_data_reader_test.go
pkg/converters/beancount/beancount_data_test.go
pkg/converters/beancount/beancount_transaction_data_file_importer.go
pkg/converters/beancount/beancount_transaction_data_file_importer_test.go
pkg/converters/beancount/beancount_transaction_data_table.go
pkg/converters/camt/camt_data.go
pkg/converters/camt/camt_data_reader.go
pkg/converters/camt/camt_statement_transaction_data_table.go
pkg/converters/camt/camt_transaction_data_file_importer.go
pkg/converters/camt/camt_transaction_data_file_importer_test.go
pkg/converters/converter/data_table_transaction_data_exporter.go
pkg/converters/converter/data_table_transaction_data_importer.go
pkg/converters/converter/transaction_data_converter.go
pkg/converters/converter/transaction_data_importer_options.go
pkg/converters/converter/transaction_data_importer_options_test.go
pkg/converters/csv/csv_file_basic_data_table.go
pkg/converters/csv/csv_file_basic_data_table_test.go
pkg/converters/custom/custom_data_parser.go
pkg/converters/custom/custom_transaction_data_dsv_file_importer.go
pkg/converters/custom/custom_transaction_data_dsv_file_importer_test.go
pkg/converters/custom/custom_transaction_data_excel_file_importer.go
pkg/converters/custom/custom_transaction_data_excel_file_importer_test.go
pkg/converters/custom/custom_transaction_plain_text_data_table.go
pkg/converters/datatable/basic_data_table.go
pkg/converters/datatable/basic_data_table_test.go
pkg/converters/datatable/basic_data_table_to_common_data_table_wrapper.go
pkg/converters/datatable/basic_data_table_to_common_data_table_wrapper_test.go
pkg/converters/datatable/basic_data_table_to_transaction_data_table_wrapper.go
pkg/converters/datatable/basic_data_table_to_transaction_data_table_wrapper_test.go
pkg/converters/datatable/common_data_table.go
pkg/converters/datatable/common_data_table_to_transaction_data_table_wrapper.go
pkg/converters/datatable/common_data_table_to_transaction_data_table_wrapper_test.go
pkg/converters/datatable/sub_basic_data_table.go
pkg/converters/datatable/sub_basic_data_table_test.go
pkg/converters/datatable/transaction_data_table.go
pkg/converters/datatable/writable_transaction_data_table.go
pkg/converters/datatable/writable_transaction_data_table_test.go
pkg/converters/default/default_transaction_data_csv_file_converter.go
pkg/converters/default/default_transaction_data_json_file_importer.go
pkg/converters/default/default_transaction_data_plain_text_converter.go
pkg/converters/default/default_transaction_data_plain_text_converter_test.go
pkg/converters/default/default_transaction_data_tsv_file_converter.go
pkg/converters/default/default_transaction_plain_text_data_table.go
pkg/converters/excel/excel_mscfb_file_basic_data_table.go
pkg/converters/excel/excel_mscfb_file_basic_data_table_test.go
pkg/converters/excel/excel_ooxml_file_basic_data_table.go
pkg/converters/excel/excel_ooxml_file_basic_data_table_test.go
pkg/converters/feidee/feidee_mymoney_app_transaction_data_csv_file_importer.go
pkg/converters/feidee/feidee_mymoney_app_transaction_data_csv_file_importer_test.go
pkg/converters/feidee/feidee_mymoney_app_transaction_data_extrator.go
pkg/converters/feidee/feidee_mymoney_elecloud_transaction_data_row_parser.go
pkg/converters/feidee/feidee_mymoney_elecloud_transaction_data_xlsx_file_importer.go
pkg/converters/feidee/feidee_mymoney_elecloud_transaction_data_xlsx_file_importer_test.go
pkg/converters/feidee/feidee_mymoney_transaction_data_row_parser.go
pkg/converters/feidee/feidee_mymoney_web_transaction_data_xls_file_importer.go
pkg/converters/feidee/feidee_mymoney_web_transaction_data_xls_file_importer_test.go
pkg/converters/fireflyIII/fireflyiii_transaction_data_csv_file_importer.go
pkg/converters/fireflyIII/fireflyiii_transaction_data_csv_file_importer_test.go
pkg/converters/fireflyIII/fireflyiii_transaction_data_row_parser.go
pkg/converters/gnucash/gnucash_data.go
pkg/converters/gnucash/gnucash_data_reader.go
pkg/converters/gnucash/gnucash_transaction_data_file_importer.go
pkg/converters/gnucash/gnucash_transaction_data_file_importer_test.go
pkg/converters/gnucash/gnucash_transaction_data_table.go
pkg/converters/iif/iif_data.go
pkg/converters/iif/iif_data_reader.go
pkg/converters/iif/iif_transaction_data_file_importer.go
pkg/converters/iif/iif_transaction_data_file_importer_test.go
pkg/converters/iif/iif_transaction_data_table.go
pkg/converters/jdcom/jdcom_finance_transaction_data_csv_file_importer.go
pkg/converters/jdcom/jdcom_finance_transaction_data_csv_file_importer_test.go
pkg/converters/jdcom/jdcom_finance_transaction_data_extrator.go
pkg/converters/jdcom/jdcom_finance_transaction_data_row_parser.go
pkg/converters/mt/mt_data.go
pkg/converters/mt/mt_data_reader.go
pkg/converters/mt/mt_data_reader_test.go
pkg/converters/mt/mt_data_test.go
pkg/converters/mt/mt_transaction_data_file_importer.go
pkg/converters/mt/mt_transaction_data_file_importer_test.go
pkg/converters/mt/mt_transaction_data_table.go
pkg/converters/ofx/ofx_data.go
pkg/converters/ofx/ofx_data_reader.go
pkg/converters/ofx/ofx_data_reader_test.go
pkg/converters/ofx/ofx_transaction_data_file_importer.go
pkg/converters/ofx/ofx_transaction_data_file_importer_test.go
pkg/converters/ofx/ofx_transaction_data_table.go
pkg/converters/qif/qif_data.go
pkg/converters/qif/qif_data_reader.go
pkg/converters/qif/qif_data_reader_test.go
pkg/converters/qif/qif_transaction_data_file_importer.go
pkg/converters/qif/qif_transaction_data_file_importer_test.go
pkg/converters/qif/qif_transaction_data_table.go
pkg/converters/sgml/sgml_decoder.go
pkg/converters/sgml/sgml_decoder_test.go


Ich lasse jetzt drei isolierte Analyse-Worker parallel laufen: Frontend/UX, Backend/Datenmodell/API, und JARVIS-Vergleich/Roadmap. Ich verifiziere die Ergebnisse danach selbst über gezielte Repo-Inspektion, bevor ich das Dokument schreibe.

Explanation:
**Analyzing tasks and code structure**

I need to be efficient with this project. I'm planning to use execute_code to extract the file tree, package.json, routes, and models. It might be helpful to compare it with FinanceManager too. I think I should consider using subagents in parallel for analyzing both the frontend and backend. Also, I want to delegate three tasks to summarize everything without copying code. Using delegate_task with terminal/read sounds like a good idea to avoid context issues.

Analysiere das ezBookkeeping-Frontend gründlich für eine reine Referenzanalyse. Keine Änderungen. Fokus: Stack, Routing, Komponentenstruktur, Desktop/Mobile Views, Transaktionsliste UX, Statistik/Analyse UX, State Management, API Client Patterns, relevante Dateipfade. Gib eine strukturierte deutsche Zusammenfassung mit konkreten Konzepten, die JARVIS als Idee übernehmen kann, ohne Code/Assets zu kopieren.

Context: Repo liegt read-only als Referenz unter /home/agent/.hermes/reference_repos/ezbookkeeping. Nutzer verlangt: kein Fremdcode kopieren, Lizenz beachten, keine Implementierung, nur Analyse. Besonders relevant: Transaktionsliste, Suche/Filter, Datum/Monat, Summen, gruppierte Tabellen, Kategorien mit Icons, Konto/Tags/Beschreibung/Pagination; Statistik: Zeitraumsteuerung, Diagrammtypen, Kategorieanalyse, Trends, Vermögenstrends, Filter, Pie/Donut/Bar/Trend/Treemap/Sunburst/Heatmap/Calendar Heatmap. Antworte Deutsch.

Analysiere das ezBookkeeping-Backend gründlich für eine reine Referenzanalyse. Keine Änderungen. Fokus: Go-Backend, API-Struktur, Datenmodelle, Transaktions-/Kategorie-/Account-/Tag-/Template-/ExchangeRate-Modelle, Importlogik, Statistik/Explorer-Funktionen, DB/Migrationen, Build-System. Gib konkrete Pfade und architektonische Patterns, die als Idee für JARVIS FastAPI geeignet sind.

Context: Repo liegt read-only als Referenz unter /home/agent/.hermes/reference_repos/ezbookkeeping. Nutzer verlangt: kein Fremdcode kopieren, keine Assets, Lizenznotiz, keine Implementierung, keine Runtime-DB. Antworte Deutsch. JARVIS ist Python/FastAPI/Vue/SQLite/Runtime-separiert; Review/Confirm/Audit und kein Provider on render sind zentrale Constraints.

Vergleiche anhand des FinanceManager-Repos den aktuellen JARVIS Budget-/Ausgaben-/Analyse-Stand mit den ezBookkeeping-Konzepten und entwirf Funktionsmatrix, Navigationsvorschlag und 4-stufige Roadmap. Keine Codeänderungen. Nur Analyse und Designvorschläge.

Context: JARVIS FinanceManager liegt unter /home/agent/.hermes/repos/FinanceManager. ezBookkeeping liegt unter /home/agent/.hermes/reference_repos/ezbookkeeping. Nutzer verlangt Dokument: JARVIS Finance System – ezBookkeeping Reference Analysis & Budget UX Roadmap, Markdown unter docs/budget/. Keine Runtime-Daten lesen/ändern, keine echten Beträge, keine Implementierung. Budget-Sicherheitsprinzipien: Preview/Confirm/Audit, Runtime außerhalb Repo, no provider on render, keine technischen IDs im User Mode, keine mass imports ohne Confirm. Antworte Deutsch.


Summary:
## Was ich getan habe

- Das ezBookkeeping-Frontend unter `/home/agent/.hermes/reference_repos/ezbookkeeping` read-only analysiert.
- Fokusbereiche geprüft:
  - Stack und Build-Setup
  - Desktop/Mobile-Split
  - Routing
  - Komponentenstruktur
  - Transaktionsliste UX
  - Statistik-/Analyse-UX
  - State Management
  - API-Client-Patterns
  - relevante Dateipfade
- Keine Dateien erstellt oder geändert.

## Ergebnis der Referenzanalyse

### 1. Stack / Architektur

ezBookkeeping ist ein modernes Vue-Frontend mit klarer Trennung zwischen Desktop- und Mobile-Oberfläche.

**Technologien:**

- Vue 3 mit Composition API
- TypeScript
- Vite
- Pinia für State Management
- Vue Router für Desktop
- Framework7 Router für Mobile
- Vuetify 3 für Desktop UI
- Framework7 Vue für Mobile UI
- Axios als zentraler API-Client
- ECharts / vue-echarts für Diagramme
- Moment / moment-timezone für Zeitlogik
- vue-i18n für Mehrsprachigkeit
- PWA über `vite-plugin-pwa`
- Sass/SCSS für Styles

**Wichtige Dateien:**

- `package.json`
- `vite.config.ts`
- `src/index-main.ts`
- `src/desktop-main.ts`
- `src/mobile-main.ts`

**Konzept für JARVIS:**

- Gleiche Fachlogik, aber getrennte UI-Shells für Desktop und Mobile.
- Desktop und Mobile dürfen unterschiedliche Komponentenbibliotheken nutzen, solange Stores, Models und Business-Logik geteilt werden.
- Zentrale Baselogik in wiederverwendbaren Composables/Base-Dateien kapseln, UI-spezifische Views nur als Präsentationsschicht.

---

### 2. Desktop/Mobile-Split

Der Einstieg erfolgt über `src/index-main.ts`. Dort wird per User-Agent erkannt, ob Mobile oder Desktop geladen wird:

- Desktop: `desktop.html#/`
- Mobile: `mobile.html#/`

**Desktop:**

- Entry: `src/desktop-main.ts`
- App: `src/DesktopApp.vue`
- Router: `src/router/desktop.ts`
- UI: Vuetify
- Layout: `src/views/desktop/MainLayout.vue`

**Mobile:**

- Entry: `src/mobile-main.ts`
- App: `src/MobileApp.vue`
- Router: `src/router/mobile.ts`
- UI: Framework7
- Mobile-typische Patterns:
  - Pull-to-refresh
  - Infinite scroll
  - Swipeout actions
  - Action sheets
  - Popovers
  - Bottom toolbar
  - Sheet-basierte Auswahlkomponenten

**Konzept für JARVIS:**

- Statt responsiver Einheitsoberfläche: dedizierte Desktop- und Mobile-Flows.
- Gemeinsame Domain-Logik, getrennte View-Komposition.
- Mobile UX stärker auf Bottom Toolbar, Sheets, Infinite Scroll und kompakte Cards ausrichten.
- Desktop UX stärker auf Navigation Drawer, Tabellen, Dialoge, Toolbar-Aktionen und breite Visualisierungen ausrichten.

---

### 3. Routing

#### Desktop Routing

Datei: `src/router/desktop.ts`

Desktop verwendet `vue-router` mit Hash-History.

Wichtige Routen:

- `/` → Home
- `/transaction/list` → Transaktionsliste
- `/statistics/transaction` → Statistik/Analyse
- `/insights/explorer` → Explorer
- `/account/list`
- `/category/list`
- `/tag/list`
- `/template/list`
- `/schedule/list`
- `/exchange_rates`
- `/user/settings`
- `/app/settings`
- Auth-Routen:
  - `/login`
  - `/signup`
  - `/unlock`
  - `/verify_email`
  - `/forgetpassword`
  - `/resetpassword`
  - `/oauth2/callback`

Desktop-Routen übernehmen viele Filter als Query-Props, z. B. bei Transaktionen:

- `pageType`
- `dateType`
- `maxTime`
- `minTime`
- `type`
- `categoryIds`
- `accountIds`
- `tagFilter`
- `amountFilter`
- `keyword`

Statistik-Route übernimmt u. a.:

- `analysisType`
- `chartDataType`
- `chartType`
- `chartDateType`
- `startTime`
- `endTime`
- `filterAccountIds`
- `filterCategoryIds`
- `tagFilter`
- `keyword`
- `sortingType`
- Aggregationstypen

#### Mobile Routing

Datei: `src/router/mobile.ts`

Mobile verwendet Framework7-Routing.

Wichtige Routen:

- `/transaction/list`
- `/transaction/add`
- `/transaction/edit`
- `/transaction/detail`
- `/transaction/filter/amount`
- `/statistic/transaction`
- `/statistic/settings`
- `/settings/filter/account`
- `/settings/filter/category`
- `/settings/filter/tag`
- Accounts, Categories, Tags, Templates, Settings usw.

**Auth Guards:**

Beide Router prüfen:

- nicht eingeloggt → Login
- eingeloggt, aber gesperrt → Unlock
- bereits eingeloggt → nicht zurück zu Login/Signup

**Konzept für JARVIS:**

- Filterzustand in URL-Query serialisieren, damit Ansichten teilbar, bookmarkbar und wiederherstellbar sind.
- Desktop und Mobile dürfen unterschiedliche Routen haben, sollten aber dieselben Filtermodelle verwenden.
- Auth- und Unlock-Guard zentral und früh im Routing halten.

---

### 4. Komponentenstruktur

Die Struktur ist konsequent nach Plattform und Fachbereich getrennt.

**Views:**

- `src/views/desktop/...`
- `src/views/mobile/...`
- `src/views/base/...`

**Base-Logik:**

- `src/views/base/transactions/TransactionListPageBase.ts`
- `src/views/base/statistics/StatisticsTransactionPageBase.ts`
- `src/views/base/accounts/...`
- `src/views/base/categories/...`
- usw.

**Komponenten:**

- `src/components/common/...`
- `src/components/desktop/...`
- `src/components/mobile/...`
- `src/components/base/...`

**Diagramm-Komponenten Desktop:**

- `src/components/desktop/PieChart.vue`
- `src/components/desktop/RadarChart.vue`
- `src/components/desktop/AxisChart.vue`
- `src/components/desktop/TrendsChart.vue`
- `src/components/desktop/HierarchyChart.vue`
- `src/components/desktop/HeatMapChart.vue`
- `src/components/desktop/CalendarHeatMapChart.vue`
- `src/components/desktop/AccountBalanceTrendsChart.vue`
- `src/components/desktop/AccountAndCategorySankeyChart.vue`

**Diagramm-Komponenten Mobile:**

- `src/components/mobile/PieChart.vue`
- `src/components/mobile/TrendsBarChart.vue`
- `src/components/mobile/AccountBalanceTrendsBarChart.vue`

**Gemeinsame Komponenten:**

- `src/components/common/TransactionCalendar.vue`
- `src/components/common/DateTimePicker.vue`
- `src/components/common/MonthPicker.vue`
- `src/components/common/MapView.vue`

**Konzept für JARVIS:**

- `base`-Composables für gemeinsame View-Logik sind sehr nützlich.
- UI-Komponenten plattformspezifisch halten, aber Datenaufbereitung, Filterlogik und Formatierung teilen.
- Für JARVIS wäre eine ähnliche Struktur sinnvoll:
  - `views/base/...` für Fachlogik
  - `views/desktop/...` für Desktop-Layout
  - `views/mobile/...` für Mobile-Layout
  - `components/common/...` für echte Cross-Platform-Komponenten
  - `components/desktop/...` und `components/mobile/...` für UI-spezifische Varianten

---

### 5. Transaktionsliste UX

Relevante Dateien:

- Desktop View: `src/views/desktop/transactions/ListPage.vue`
- Mobile View: `src/views/mobile/transactions/ListPage.vue`
- Gemeinsame Basislogik: `src/views/base/transactions/TransactionListPageBase.ts`
- Store: `src/stores/transaction.ts`
- Models: `src/models/transaction.ts`
- Core: `src/core/transaction.ts`
- API: `src/lib/services.ts`

#### Listenmodi

Definiert in `TransactionListPageBase.ts`:

- `Transaction List`
- `Transaction Calendar`
- `Transaction Gallery`

Desktop nutzt links eine Navigation Drawer-Auswahl. Mobile nutzt ein Popover im Navbar-Titel.

#### Desktop-UX

Die Desktop-Transaktionsliste ist tabellen- und filterorientiert.

Elemente:

- Vuetify Card mit Navigation Drawer
- Page-Type-Umschalter links
- Transaktionstyp-Auswahl:
  - All Types
  - Modify Balance
  - Income
  - Expense
  - Transfer
- Transactions per page
- Schnell-Datumsbereiche im vertikalen Tab-Menü
- Toolbar:
  - Add
  - AI Image Recognition, falls aktiviert
  - Vorlagen-Menü
  - Import
  - Export CSV/TSV
  - Refresh
  - Keyword-Suche nach Beschreibung
- Datumsbereich mit Links/Rechts-Navigation
- Summenanzeige für Income/Expense bzw. Inflows/Outflows
- Kalenderansicht mit täglichen Summen
- Tabellenansicht mit Header-Filtern für Zeit, Kategorie, Konto usw.
- Kategorie- und Konto-Auswahl über Menüs/Dialoge
- Multi-Select-Konzepte für Kategorien/Konten/Tags
- Pagination bzw. seitenweises Laden
- Gallery-Modus für Transaktionen mit Bildern

#### Mobile-UX

Mobile ist deutlich app-orientierter.

Elemente:

- `f7-page` mit:
  - Pull-to-refresh
  - Infinite scroll
  - optionaler Searchbar
- Navbar:
  - Back
  - Titel als Page-Type-Auswahl
  - Suche
  - Plus/Add
- Bottom Toolbar:
  - Datum zurück
  - Datumsfilter
  - Datum vor
  - Kategorie
  - Konto
  - Mehr-Menü
- Mehr-Menü für:
  - Transaktionstyp
  - Tags
  - Amount Filter
  - weitere Filter
- Monatsweise gruppierte Accordion-Listen
- Monatstitel mit Summen:
  - Income/Expense oder Inflows/Outflows
- Transaktionseinträge:
  - Datum links
  - Kategorie-Icon
  - Kategorie/Typ
  - Betrag rechts
  - Beschreibung
  - Uhrzeit
  - Konto
  - Tags optional
- Swipeout-Aktionen für mobile Bearbeitung/Löschen
- Skeleton Loading States
- Kalenderansicht und Gallery-Ansicht auch auf Mobile

#### Gruppierung und Summen

Im Store `src/stores/transaction.ts` werden Transaktionen in `TransactionMonthList` gruppiert:

- `year`
- `month`
- `yearDashMonth`
- `opened`
- `items`
- `totalAmount`
- `dailyTotalAmounts`

Monatssummen enthalten:

- `income`
- `expense`
- `incompleteIncome`
- `incompleteExpense`

Das erlaubt bei paginierten Daten unvollständige Summen sauber zu kennzeichnen.

#### Filtermodell

`TransactionListFilter` enthält:

- `dateType`
- `maxTime`
- `minTime`
- `type`
- `categoryIds`
- `accountIds`
- `tagFilter`
- `amountFilter`
- `keyword`

Tags werden über ein eigenes Tag-Filter-Modell verarbeitet, u. a.:

- Has any
- Has all
- Not has any
- Not has all
- Without Tags

#### API für Transaktionsliste

In `src/lib/services.ts`:

- `getTransactions`
  - `v1/transactions/list.json`
  - unterstützt Zeit, Typ, Kategorien, Konten, Tags, Betrag, Keyword, Bilder, Count, Page
- `getAllTransactionsByMonth`
  - `v1/transactions/list/by_month.json`
- `getAllTransactions`
  - `v1/transactions/list/all.json`
- `getTransaction`
- `addTransaction`
- `modifyTransaction`
- `deleteTransaction`
- Batch-Update für Kategorien, Konten, Tags
- Batch-Delete
- Import/Export
- Bilder-Upload

**Konkrete JARVIS-Ideen ohne Code/Asset-Übernahme:**

- Monatsweise Transaktionsgruppen mit einklappbaren Abschnitten.
- Monatssummen direkt im Gruppenkopf.
- Incomplete-Summen bei paginierten/incremental geladenen Daten markieren.
- Drei Ansichten: Liste, Kalender, Galerie.
- Filterleiste Desktop in Tabellenkopf/Drawer, Mobile als Bottom Toolbar + Sheets.
- Query-State in URL spiegeln.
- Add-Menü mit Vorlagen und optionaler KI-Belegerkennung.
- Beschreibungssuche als schnelles Keyword-Feld.
- Amount-Filter als eigene Detailseite/Sheet.
- Kategorien mit Icon/Farbe als primäres visuelles Orientierungselement.
- Konto-, Kategorie-, Tag-Filter getrennt, aber kombinierbar.
- Mobile: Infinite Scroll + Pull-to-refresh statt klassischer Pagination.
- Desktop: Pagination/Count-Auswahl für präzise Datenarbeit.

---

### 6. Statistik / Analyse UX

Relevante Dateien:

- Desktop View: `src/views/desktop/statistics/TransactionPage.vue`
- Mobile View: `src/views/mobile/statistics/TransactionPage.vue`
- Basislogik: `src/views/base/statistics/StatisticsTransactionPageBase.ts`
- Store: `src/stores/statistics.ts`
- Core Types: `src/core/statistics.ts`
- Explorer Core: `src/core/explorer.ts`
- Diagramm-Komponenten: `src/components/desktop/...`, `src/components/mobile/...`

#### Analysearten

In `src/core/statistics.ts`:

- `CategoricalAnalysis`
- `TrendAnalysis`
- `AssetTrends`

#### Chart Data Types

Unterstützte Datenperspektiven:

- Overview
- Outflows By Account
- Expense By Account
- Expense By Primary Category
- Expense By Secondary Category
- Inflows By Account
- Income By Account
- Income By Primary Category
- Income By Secondary Category
- Account Total Assets
- Account Total Liabilities
- Total Outflows
- Total Expense
- Total Inflows
- Total Income
- Net Cash Flow
- Net Income
- Net Worth

#### Chart Types Statistik

Kategorische Analyse:

- Pie Chart
- Bar Chart
- Radar Chart, Desktop-only

Trendanalyse:

- Area Chart
- Column Chart
- Bubble Chart

Asset Trends:

- verwendet ebenfalls Trend-Chart-Typen
- Aggregation mit Last-Wert statt Summe

Aggregationstypen:

- Daily
- Monthly
- Quarterly
- Yearly
- FiscalYearly
- BillingCycle, vorhanden als Typ

#### Desktop Statistik UX

Desktop verwendet:

- Navigation Drawer links:
  - Analyseart
  - Chart Type
  - Sort Order
  - Chart Data Type
- Toolbar:
  - Datumsbereich mit Links/Rechts-Navigation
  - Aggregationstyp für Trends/Asset Trends
  - Refresh
  - Keyword-Filter
  - Mehr-Menü:
    - Filter Accounts
    - Filter Transaction Categories
    - Filter Transaction Tags
    - Export Results
    - Settings
- Overview-Analyse als Sankey:
  - `AccountAndCategorySankeyChart`
- Pie Chart für kategorische Analyse
- Bar/List-Ansicht mit Fortschrittsbalken
- Radar Chart auf Desktop
- Trend Chart mit:
  - Stacked Option
  - Year-over-year
  - Period-over-period
  - Tooltips mit Summen
  - Click-to-filter/navigation

#### Mobile Statistik UX

Mobile ist reduzierter:

- Navbar-Titel öffnet Popover für Chart Data Type, gruppiert nach:
  - Categorical Analysis
  - Trend Analysis
  - Asset Trends
- Mehr-Menü für Filter/Settings
- Kartenbasierte Darstellung
- Pie Chart mit Center Text und ausgewähltem Item
- Bar/List-Ansicht mit Progressbar je Kategorie/Konto
- Trend/Asset Trends als `TrendsBarChart`
- Pull-to-refresh

#### Explorer / Advanced Analytics

Zusätzlich zu klassischer Statistik gibt es einen Desktop-Explorer:

- Route: `/insights/explorer`
- View: `src/views/desktop/insights/ExplorerPage.vue`
- Core: `src/core/explorer.ts`
- Store: `src/stores/explorer.ts`
- Tabs:
  - Query
  - Data Table
  - Editable Data Table
  - Chart

Explorer unterstützt deutlich mehr Charttypen:

- Pie
- Stacked Column
- 100% Stacked Column
- Grouped Column
- Grouped Line
- Stacked Area
- 100% Stacked Area
- Grouped Bubble
- Radar
- Treemap
- Sunburst
- Heatmap
- Calendar Heatmap

Dazu gibt es Dimensionen wie:

- Datum
- Jahr-Monat
- Quartal
- Fiskaljahr
- Wochentag
- Monatstag
- Monat im Jahr
- Stunde
- Zeitzone
- Transaktionstyp
- Konto
- Konto-Kategorie
- Währung
- Primär-/Sekundärkategorie
- Betragsbereiche

Und Metriken wie:

- Transaction Count
- Active Transaction Days
- Transactions per Active Day
- Total Amount
- Total Income
- Total Expense
- Net Income
- Expense / Income Ratio
- Savings Rate
- Average
- Median
- Min/Max
- Quartile
- Percentile
- Top 5 Share
- Variance
- Standard Deviation
- Skewness
- Kurtosis

**Konkrete JARVIS-Ideen ohne Code/Asset-Übernahme:**

- Statistik in drei Hauptmodi trennen:
  - Kategorie/Konto-Analyse
  - Trends
  - Vermögensentwicklung
- Chart-Datenperspektive getrennt vom Chart-Typ modellieren.
- Datumsbereich, Aggregation, Sortierung, Filter und Keyword als einheitliches Filtermodell.
- Desktop: volle Analyseoberfläche mit Drawer, Export, mehreren Charttypen.
- Mobile: reduzierte, konsumierbare Statistik-Cards.
- Overview als Flussdiagramm/Sankey-Idee für Geldflüsse zwischen Konto und Kategorie.
- Kategorie-/Konto-Listen mit Progressbars als Alternative zu Charts.
- Drilldown per Klick auf Chart-Element in gefilterte Transaktionsliste.
- Separaten “Explorer” als Advanced-Analytics-Bereich einplanen, statt die normale Statistik zu überfrachten.
- Für Explorer nützlich:
  - Dimension + Metric + ChartType-Modell
  - Heatmap/Calendar Heatmap für zeitliche Aktivität
  - Treemap/Sunburst für Hierarchien
  - Bubble/Grouped Charts für mehrdimensionale Auswertungen

---

### 7. State Management

Pinia-Stores liegen in `src/stores`.

Wichtige Stores:

- `src/stores/index.ts`
  - Root Store
  - Auth
  - Reset aller States
  - Notification
- `src/stores/user.ts`
- `src/stores/setting.ts`
- `src/stores/account.ts`
- `src/stores/transaction.ts`
- `src/stores/statistics.ts`
- `src/stores/explorer.ts`
- `src/stores/transactionCategory.ts`
- `src/stores/transactionTag.ts`
- `src/stores/transactionTemplate.ts`
- `src/stores/overview.ts`
- `src/stores/exchangeRates.ts`
- `src/stores/environment.ts`
- `src/stores/desktopPage.ts`

#### Pattern

- Stores verwenden Composition API mit `defineStore(..., () => {})`.
- State über `ref`.
- Derived State über `computed`.
- API-Aufrufe im Store, nicht direkt in den Views.
- Views rufen Store-Methoden auf und verwenden Base-Composables für berechnete Darstellung.
- Nach Änderungen werden abhängige Stores invalidiert, z. B. Transaktionen beeinflussen Overview, Statistics, Explorer usw.
- Filterzustände liegen zentral im Store.
- Listenstatus enthält Invalidierungsflags, z. B. `transactionListStateInvalid`.
- Daten werden in Models transformiert, z. B. `Transaction.ofMulti(...)`.

**Konzept für JARVIS:**

- Store als fachliche Datenquelle, nicht nur UI-State.
- Für jede Hauptdomäne eigener Store.
- Filtermodelle zentral im Store halten.
- Derived Filter Maps, Count-Werte und Display-Namen als computed bereitstellen.
- Invalidierungsflags für abhängige Dashboards/Statistiken nutzen.
- Nach CRUD-Operationen gezielt Listen aktualisieren oder invalidieren.
- Shared Root Store für Login/Logout/Reset/Notifications.

---

### 8. API Client Patterns

Relevante Dateien:

- `src/lib/services.ts`
- `src/core/api.ts`
- `src/consts/api.ts`

#### Axios Setup

`src/lib/services.ts` ist ein großer zentraler API-Service.

Patterns:

- `axios.defaults.baseURL = getBasePath() + BASE_API_URL_PATH`
- globaler Timeout
- Request Interceptor:
  - Bearer Token aus Userstate
  - `X-Timezone-Offset`
  - `X-Timezone-Name`
- Response Interceptor:
  - verarbeitet cancelable Requests
  - behandelt Auth-Fehlercodes
  - löscht Token/Userinfo
  - reload bei ungültigem/abgelaufenem Token
- API Response Wrapper:
  - `ApiResponse<T>`
  - `ErrorResponse`

#### API-Methoden

Services sind als Methodenobjekt organisiert:

- Auth
- User/Profile
- Tokens
- Settings
- Accounts
- Transactions
- Statistics
- Categories
- Tags
- Templates
- Import/Export
- Exchange Rates
- Explorer
- AI Receipt Recognition
- Maps/Proxy

#### Transaktions-API-Pattern

List-Endpunkte nehmen Filter als Query-Parameter:

- Zeitbereich
- Typ
- Kategorie-IDs
- Konto-IDs
- Tag-Filter
- Amount-Filter
- Keyword
- Bilder
- Pagination
- Trim-Flags für Account/Category/Tag

#### Statistik-API-Pattern

- `getTransactionStatistics`
- `getTransactionStatisticsTrends`
- `getTransactionStatisticsAssetTrends`
- `getTransactionAmounts`

Filter werden serverseitig angewendet:

- Zeitraum
- Tag Filter
- Keyword
- use transaction timezone
- Aggregationslogik teils im Frontend, teils serverseitig geliefert

**Konzept für JARVIS:**

- Einen zentralen API-Client mit Interceptors verwenden.
- Zeitzone explizit in Headern mitschicken.
- Auth-Fehler zentral behandeln.
- API-Responses typisieren.
- Services domänenweise logisch gruppieren, auch wenn technisch in einer Datei oder Modulstruktur.
- Filter serialisierbar halten.
- Für lange Operationen eigene Timeouts definieren:
  - Upload
  - Import
  - Export
  - Batch Updates
  - LLM/KI
- Optional cancelable Requests für interaktive Such-/Analyseansichten.

---

### 9. Relevante Dateipfade für JARVIS-Referenz

**Build / Entry:**

- `package.json`
- `vite.config.ts`
- `src/index-main.ts`
- `src/desktop-main.ts`
- `src/mobile-main.ts`

**Routing:**

- `src/router/desktop.ts`
- `src/router/mobile.ts`

**Transaktionen:**

- `src/views/desktop/transactions/ListPage.vue`
- `src/views/mobile/transactions/ListPage.vue`
- `src/views/base/transactions/TransactionListPageBase.ts`
- `src/views/desktop/transactions/list/dialogs/EditDialog.vue`
- `src/views/desktop/transactions/list/dialogs/AIImageRecognitionDialog.vue`
- `src/views/mobile/transactions/EditPage.vue`
- `src/views/mobile/transactions/AmountFilterPage.vue`
- `src/stores/transaction.ts`
- `src/models/transaction.ts`
- `src/core/transaction.ts`
- `src/consts/transaction.ts`

**Statistik / Analyse:**

- `src/views/desktop/statistics/TransactionPage.vue`
- `src/views/mobile/statistics/TransactionPage.vue`
- `src/views/base/statistics/StatisticsTransactionPageBase.ts`
- `src/stores/statistics.ts`
- `src/core/statistics.ts`
- `src/views/desktop/statistics/transaction/dialogs/ExportDialog.vue`

**Explorer / Advanced Analytics:**

- `src/views/desktop/insights/ExplorerPage.vue`
- `src/views/desktop/insights/tabs/ExplorerQueryTab.vue`
- `src/views/desktop/insights/tabs/ExplorerChartTab.vue`
- `src/views/desktop/insights/tabs/ExplorerDataTableTab.vue`
- `src/views/desktop/insights/tabs/ExplorerEditableDataTableTab.vue`
- `src/stores/explorer.ts`
- `src/core/explorer.ts`
- `src/models/explorer.ts`

**Diagramme:**

- `src/components/desktop/PieChart.vue`
- `src/components/desktop/RadarChart.vue`
- `src/components/desktop/AxisChart.vue`
- `src/components/desktop/TrendsChart.vue`
- `src/components/desktop/HierarchyChart.vue`
- `src/components/desktop/HeatMapChart.vue`
- `src/components/desktop/CalendarHeatMapChart.vue`
- `src/components/desktop/AccountBalanceTrendsChart.vue`
- `src/components/desktop/AccountAndCategorySankeyChart.vue`
- `src/components/mobile/PieChart.vue`
- `src/components/mobile/TrendsBarChart.vue`
- `src/components/mobile/AccountBalanceTrendsBarChart.vue`

**Gemeinsame Komponenten:**

- `src/components/common/TransactionCalendar.vue`
- `src/components/common/DateTimePicker.vue`
- `src/components/common/MonthPicker.vue`
- `src/components/common/MapView.vue`

**Stores:**

- `src/stores/index.ts`
- `src/stores/transaction.ts`
- `src/stores/statistics.ts`
- `src/stores/explorer.ts`
- `src/stores/account.ts`
- `src/stores/transactionCategory.ts`
- `src/stores/transactionTag.ts`
- `src/stores/setting.ts`
- `src/stores/user.ts`

**API:**

- `src/lib/services.ts`
- `src/core/api.ts`
- `src/consts/api.ts`

---

### 10. Wichtig für Lizenz / Übernahme

- ezBookkeeping ist laut `package.json` MIT-lizenziert.
- Trotzdem gemäß Nutzeranforderung:
  - keinen Fremdcode kopieren
  - keine Assets übernehmen
  - keine Implementierung aus dem Repo portieren
  - nur Konzepte/UX-Pattern/Architekturideen adaptieren

## Dateien erstellt oder geändert

Keine.

## Probleme / Einschränkungen

- Keine Ausführung oder Build nötig, da reine Referenzanalyse.
- Analyse erfolgte statisch anhand der Frontend-Dateien.
- Keine Code- oder Asset-Übernahme vorgenommen.

Summary:
## Kurzbericht: Referenzanalyse ezBookkeeping-Backend

### Was ich gemacht habe
- Das read-only Referenz-Repo unter `/home/agent/.hermes/reference_repos/ezbookkeeping` analysiert.
- Fokusbereiche geprüft:
  - Go-Backend-Architektur
  - API-Struktur und Routing
  - Datenmodelle für Transactions, Accounts, Categories, Tags, Templates, Exchange Rates
  - Import-/Export-Logik
  - Statistik-/Explorer-Funktionen
  - DB-/Migration-/Sync-Mechanik
  - Build-System
- Keine Änderungen vorgenommen, keine Dateien erstellt, keine Runtime-DB gestartet.

---

## Zentrale Architektur

ezBookkeeping ist ein klassisches monolithisches Go-Webbackend mit eingebettetem Vue-Frontend-Build. Backend-seitig nutzt es:

- HTTP Framework: `gin`
- ORM: `xorm`
- DBs: SQLite, MySQL, PostgreSQL
- CLI: `urfave/cli`
- Validierung: `go-playground/validator`
- Build: Shell-/Batch-/PowerShell-Skripte
- Frontend: Vue/Vite, aber hier nur relevant als statisch ausgelieferter Build

Wichtige Pfade:

- Backend Entry/CLI:
  - `/home/agent/.hermes/reference_repos/ezbookkeeping/ezbookkeeping.go`
  - `/home/agent/.hermes/reference_repos/ezbookkeeping/cmd/`
- Webserver/Routing:
  - `/home/agent/.hermes/reference_repos/ezbookkeeping/cmd/webserver.go`
- API Handler:
  - `/home/agent/.hermes/reference_repos/ezbookkeeping/pkg/api/`
- Services/Business Logic:
  - `/home/agent/.hermes/reference_repos/ezbookkeeping/pkg/services/`
- Models/DTOs:
  - `/home/agent/.hermes/reference_repos/ezbookkeeping/pkg/models/`
- DB Layer:
  - `/home/agent/.hermes/reference_repos/ezbookkeeping/pkg/datastore/`
- Import/Export Converter:
  - `/home/agent/.hermes/reference_repos/ezbookkeeping/pkg/converters/`
- Exchange Rates:
  - `/home/agent/.hermes/reference_repos/ezbookkeeping/pkg/exchangerates/`
- Build:
  - `/home/agent/.hermes/reference_repos/ezbookkeeping/build.sh`
  - `/home/agent/.hermes/reference_repos/ezbookkeeping/build.bat`
  - `/home/agent/.hermes/reference_repos/ezbookkeeping/build.ps1`
  - `/home/agent/.hermes/reference_repos/ezbookkeeping/go.mod`
  - `/home/agent/.hermes/reference_repos/ezbookkeeping/package.json`

---

## API-Struktur

Hauptdatei:

- `/home/agent/.hermes/reference_repos/ezbookkeeping/cmd/webserver.go`

Pattern:

- `gin.New()`
- globale Middleware:
  - Recovery
  - GZip optional
  - RequestId
  - RequestLog
  - JWT/Auth Middleware
- API-Gruppe:
  - `/api`
  - `/api/v1`
- JSON-Endpunkte enden konsequent mit `.json`
- Handler werden über Wrapper gebunden:
  - `bindApi`
  - `bindApiWithTokenUpdate`
  - `bindJSONRPCApi`
  - `bindCsv`
  - `bindTsv`
  - `bindImage`

Beispiele aus `/cmd/webserver.go`:

- Accounts:
  - `GET /api/v1/accounts/list.json`
  - `GET /api/v1/accounts/get.json`
  - `POST /api/v1/accounts/add.json`
  - `POST /api/v1/accounts/modify.json`
  - `POST /api/v1/accounts/delete.json`
- Transactions:
  - `GET /api/v1/transactions/count.json`
  - `GET /api/v1/transactions/list.json`
  - `GET /api/v1/transactions/list/by_month.json`
  - `GET /api/v1/transactions/statistics.json`
  - `GET /api/v1/transactions/statistics/trends.json`
  - `GET /api/v1/transactions/statistics/asset_trends.json`
  - `POST /api/v1/transactions/add.json`
  - `POST /api/v1/transactions/modify.json`
  - `POST /api/v1/transactions/delete.json`
  - `POST /api/v1/transactions/import.json`
- Categories:
  - `/api/v1/transaction/categories/...`
- Tags:
  - `/api/v1/transaction/tags/...`
  - `/api/v1/transaction/tags/groups/...`
- Templates:
  - `/api/v1/transaction/templates/...`
- Explorer:
  - `/api/v1/insights/explorers/...`
- Exchange Rates:
  - `/api/v1/exchange_rates/latest.json`
  - `/api/v1/exchange_rates/user_custom/update.json`
  - `/api/v1/exchange_rates/user_custom/delete.json`

Für JARVIS FastAPI interessant:

- Klare Trennung:
  - Router/HTTP Handler
  - Service Layer
  - Model/DTO Layer
  - DB Layer
- Einheitliche Response-Wrapper:
  - Erfolg/Error zentral in `utils.PrintJsonSuccessResult` / `utils.PrintJsonErrorResult`
- Auth/Middleware zentral vor API-Gruppe
- Feature Flags steuern Routenregistrierung, z.B. Import, Pictures, LLM, OAuth2

Für JARVIS würde ich das Pattern übertragen als:

- `app/api/v1/transactions.py`
- `app/services/transactions.py`
- `app/models/transaction.py`
- `app/schemas/transaction.py`
- `app/db/session.py`
- `app/core/security.py`
- `app/core/responses.py`

---

## Datenmodelle

### Transactions

Pfad:

- `/home/agent/.hermes/reference_repos/ezbookkeeping/pkg/models/transaction.go`

Wichtige Konzepte:

- `TransactionType`
  - Modify Balance
  - Income
  - Expense
  - Transfer
- Intern gibt es zusätzlich `TransactionDbType`:
  - Modify Balance
  - Income
  - Expense
  - Transfer Out
  - Transfer In

Das ist architektonisch wichtig: Transfers werden intern als zwei DB-nahe Bewegungen gedacht bzw. mit Related-Feldern modelliert.

Core-Felder:

- `TransactionId`
- `Uid`
- `Deleted`
- `Type`
- `CategoryId`
- `AccountId`
- `TransactionTime`
- `TimezoneUtcOffset`
- `Amount`
- `RelatedId`
- `RelatedAccountId`
- `RelatedAccountAmount`
- `HideAmount`
- `Comment`
- `GeoLongitude`
- `GeoLatitude`
- `CreatedIp`
- `ScheduledCreated`
- `CreatedUnixTime`
- `UpdatedUnixTime`
- `DeletedUnixTime`

Patterns:

- Beträge als `int64`, nicht Float.
- Soft Delete über `Deleted` und `DeletedUnixTime`.
- Zeit als Unix-/Sequence-ID-orientierte Integerwerte.
- Starke Indexierung über XORM Tags:
  - `uid`
  - `deleted`
  - `type`
  - `account_id`
  - `category_id`
  - `transaction_time`
  - Geodatenindex für Karten/Location-Queries

Für JARVIS geeignet:

- Geld als Integer Minor Units speichern.
- Transaction-DTOs und DB-Modelle trennen.
- Transfer-Transaktionen explizit modellieren, z.B. mit `related_transaction_id` oder doppelter Ledger-Buchung.
- Soft Delete + Audit-Columns übernehmen.
- Für Review/Confirm/Audit: Transaktionen nie direkt Provider-rendern oder unbestätigt persistieren, sondern Draft/Review-State ergänzen.

---

### Accounts

Pfad:

- `/home/agent/.hermes/reference_repos/ezbookkeeping/pkg/models/account.go`

Konzepte:

- Account-Kategorien:
  - Cash
  - Checking
  - Credit Card
  - Virtual
  - Debt
  - Receivables
  - Investment
  - Savings
  - Certificate of Deposit
- Account-Typen:
  - Single Account
  - Multi Sub Accounts
- Zwei-Level-Hierarchie über:
  - `ParentAccountId`
  - `LevelOneAccountParentId = 0`

Core-Felder:

- `AccountId`
- `Uid`
- `Deleted`
- `Category`
- `Type`
- `ParentAccountId`
- `Name`
- `DisplayOrder`
- `Icon`
- `Color`
- `Currency`
- `Balance`
- `Comment`
- `Extend`
- `Hidden`
- Timestamps

`AccountExtend` als BLOB/JSON-artiges Zusatzobjekt:

- `LastReconciledTime`
- `CreditCardStatementDate`

Patterns:

- Hierarchische Accounts.
- `DisplayOrder` für UI-Sortierung.
- `Hidden` getrennt von `Deleted`.
- Asset/Liability über Kategorie-Mapping.

Für JARVIS:

- Gute Idee: `hidden` vs. `deleted` trennen.
- Für SQLite/FastAPI: `extend` besser als JSON-Spalte oder eigene Tabellen, nicht opaque BLOB.
- Account-Balance sollte aus Ledger ableitbar sein oder mit Reconciliation/Audit abgesichert werden.

---

### Categories

Pfad:

- `/home/agent/.hermes/reference_repos/ezbookkeeping/pkg/models/transaction_category.go`

Konzepte:

- Category-Typen:
  - Income
  - Expense
  - Transfer
- Zwei-Level-Hierarchie:
  - `ParentCategoryId`
  - `LevelOneTransactionCategoryParentId = 0`

Core-Felder:

- `CategoryId`
- `Uid`
- `Deleted`
- `Type`
- `ParentCategoryId`
- `Name`
- `DisplayOrder`
- `Icon`
- `Color`
- `Hidden`
- `Comment`
- Timestamps

Patterns:

- Kategorien sind user-scoped.
- Soft delete.
- Hide vs delete.
- Batch create mit Subcategories.

Für JARVIS:

- Category tree als adjacency list reicht.
- Zusätzlich `type` für Income/Expense/Transfer übernehmen.
- Farben/Icons nicht kopieren, nur als Konzept übernehmen.

---

### Tags und Tag Groups

Pfade:

- `/home/agent/.hermes/reference_repos/ezbookkeeping/pkg/models/transaction_tag.go`
- `/home/agent/.hermes/reference_repos/ezbookkeeping/pkg/models/transaction_tag_group.go`
- `/home/agent/.hermes/reference_repos/ezbookkeeping/pkg/models/transaction_tag_index.go`

`TransactionTag`:

- `TagId`
- `Uid`
- `Deleted`
- `TagGroupId`
- `Name`
- `DisplayOrder`
- `Hidden`
- Timestamps

`TransactionTagIndex` ist Join-/Index-Tabelle zwischen Transactions und Tags.

Wichtig:

- Max tags per transaction:
  - `MaximumTagsCountOfTransaction = 10`
- Tag-Filter unterstützt:
  - has any
  - has all
  - not has any
  - not has all
  - no tag

Für JARVIS:

- Viele-zu-viele Tabelle `transaction_tags`.
- Optional `tag_groups`.
- Tag-Filter als eigene Query-Komponente designen.
- Limits serverseitig validieren.

---

### Transaction Templates / Scheduled Transactions

Pfad:

- `/home/agent/.hermes/reference_repos/ezbookkeeping/pkg/models/transaction_template.go`

Konzepte:

- Template-Typ:
  - Normal
  - Schedule
- Frequenz:
  - Disabled
  - Weekly
  - Monthly
  - Daily
  - Yearly

Core-Felder:

- `TemplateId`
- `Uid`
- `Deleted`
- `TemplateType`
- `Name`
- `Type`
- `CategoryId`
- `AccountId`
- `ScheduledFrequencyType`
- `ScheduledFrequency`
- `ScheduledStartTime`
- `ScheduledEndTime`
- `ScheduledAt`
- `ScheduledTimezoneUtcOffset`
- `TagIds`
- `Amount`
- `RelatedAccountId`
- `RelatedAccountAmount`
- `HideAmount`
- `Comment`
- `DisplayOrder`
- `Hidden`
- Timestamps

Auffällig:

- Tags sind im Template als kommagetrennter String gespeichert (`TagIds`), nicht als Join-Tabelle.
- Scheduled Transactions werden im TransactionService verarbeitet:
  - `/pkg/services/transactions.go`
  - Funktion `CreateScheduledTransactions`

Für JARVIS:

- Besser normalisiert:
  - `templates`
  - `template_tags`
  - `scheduled_rules`
- Für Review/Confirm/Audit: geplante Transaktionen zunächst als Draft erzeugen und bestätigen lassen, statt direkt final zu buchen.

---

### Exchange Rates

Pfade:

- `/home/agent/.hermes/reference_repos/ezbookkeeping/pkg/models/exchange_rate.go`
- `/home/agent/.hermes/reference_repos/ezbookkeeping/pkg/exchangerates/`
- `/home/agent/.hermes/reference_repos/ezbookkeeping/pkg/services/user_custom_exchange_rates.go`
- `/home/agent/.hermes/reference_repos/ezbookkeeping/pkg/api/exchange_rates.go`

Konzepte:

- Viele externe Data Provider:
  - ECB
  - Norges Bank
  - Swiss National Bank
  - National Bank of Ukraine/Romania/Poland/Kazakhstan/Georgia
  - Reserve Bank APIs etc.
- User Custom Exchange Rates:
  - `UserCustomExchangeRate`
  - PK-artig über `Uid`, `DeletedUnixTime`, `Currency`
- Rate intern als Integer-Faktor:
  - `UserCustomExchangeRateFactorInDatabase = 100000000`

Patterns:

- Externe Provider sind als Adapter/Provider implementiert.
- Custom rates werden user-scoped gespeichert.
- Raten werden für Response wieder zu String/Float formatiert.

Für JARVIS:

- Gut übertragbar:
  - Provider Interface
  - Cache/Refresh getrennt von User Overrides
  - Integer-/Decimal-Precision statt Float
- Constraint beachten: “kein Provider on render”.
  - Externe Provider sollten nicht während UI-Render/API-Read synchron abgefragt werden.
  - Stattdessen Background-Refresh + gecachter Snapshot + Audit-Log.

---

## Importlogik

Zentrale Pfade:

- `/home/agent/.hermes/reference_repos/ezbookkeeping/pkg/converters/transaction_data_converters.go`
- `/home/agent/.hermes/reference_repos/ezbookkeeping/pkg/converters/converter/transaction_data_converter.go`
- `/home/agent/.hermes/reference_repos/ezbookkeeping/pkg/converters/datatable/transaction_data_table.go`
- `/home/agent/.hermes/reference_repos/ezbookkeeping/pkg/converters/custom/`
- `/home/agent/.hermes/reference_repos/ezbookkeeping/pkg/models/imported_transaction.go`
- `/home/agent/.hermes/reference_repos/ezbookkeeping/pkg/api/transactions.go`
- `/home/agent/.hermes/reference_repos/ezbookkeeping/pkg/services/transactions.go`

Unterstützte Importformate laut Factory:

- ezBookkeeping CSV/TSV/JSON
- OFX/QFX
- QIF
- IIF
- Camt.052 / Camt.053
- MT940
- GnuCash
- Firefly III CSV
- Beancount
- Feidee
- Alipay
- WeChat Pay
- JD Finance
- Custom CSV/TSV/DSV
- Custom XLS/XLSX

Architektur:

- `TransactionDataImporter` Interface:
  - `ParseImportedData(...)`
- `TransactionDataExporter` Interface:
  - `ToExportedContent(...)`
- Einheitliches Zwischenmodell:
  - `ImportTransaction`
  - `ImportTransactionResponse`
- DataTable-Abstraktion:
  - `TransactionDataTable`
  - `TransactionDataRow`
  - `TransactionDataRowIterator`
  - `TransactionDataRowParser`

Custom Import:

- Nutzer kann Spalten mappen:
  - Zeit
  - Zeitzone
  - Typ
  - Kategorie
  - Konto
  - Betrag
  - Related Account
  - Related Amount
  - Geo
  - Tags
  - Description
- Validierung erforderlicher Spalten, z.B. Time, Type, Amount.

Import-API:

- `/api/v1/transactions/parse_custom_file.json`
- `/api/v1/transactions/parse_import.json`
- `/api/v1/transactions/import.json`
- `/api/v1/transactions/import/process.json`

Batch-Import-Service:

- `/pkg/services/transactions.go`
- `BatchCreateTransactions(...)`

Für JARVIS besonders geeignet:

- Import zweistufig:
  1. Datei parsen in neutralen Import-Draft.
  2. Mapping/Review/Confirm.
  3. Erst nach Confirm persistieren.
- Das passt sehr gut zu JARVIS Constraints:
  - Review/Confirm/Audit
  - keine Runtime-DB aus Referenz übernehmen
  - keine Fremdlogik kopieren
- Empfehlung:
  - `import_sessions`
  - `import_rows`
  - `import_row_errors`
  - `confirmed_transaction_id`
  - Audit trail pro Import-Session
- Parser als Plugin-Interface in Python:
  - `BaseImporter`
  - `parse(bytes) -> list[ImportRow]`
  - `normalize(row) -> TransactionDraft`
  - `validate(draft) -> ValidationResult`

---

## Statistik- und Explorer-Funktionen

### Transaction Statistics

Pfade:

- `/home/agent/.hermes/reference_repos/ezbookkeeping/pkg/api/transactions.go`
- `/home/agent/.hermes/reference_repos/ezbookkeeping/pkg/services/transactions.go`
- `/home/agent/.hermes/reference_repos/ezbookkeeping/pkg/models/transaction.go`

Wichtige Service-Funktionen in `/pkg/services/transactions.go`:

- `GetAccountsTotalIncomeAndExpense`
- `GetAccountsAndCategoriesTotalInflowAndOutflow`
- `GetAccountsAndCategoriesMonthlyInflowAndOutflow`
- `GetAllTransactionsInOneAccountWithAccountBalanceByMaxTime`
- `GetAllAccountsDailyOpeningAndClosingBalance`
- `GetTransactionCount`
- `GetTransactionsByMaxTime`

API-Endpunkte:

- `/transactions/statistics.json`
- `/transactions/statistics/trends.json`
- `/transactions/statistics/asset_trends.json`
- `/transactions/amounts.json`
- `/transactions/reconciliation_statements.json`

Patterns:

- Statistik wird großteils aus Transaction Queries berechnet.
- Paging erfolgt über `maxTransactionTime` und `TransactionTime` als Cursor/Sequence.
- Filterdimensionen:
  - Zeitbereich
  - Typ
  - Kategorie
  - Account
  - Tags
  - Amount Filter
  - Keyword
  - Pictures
- Option `useTransactionTimezone` taucht in Statistikfunktionen auf.

Für JARVIS:

- Cursor-basierte Pagination statt Offset ist sinnvoll.
- Statistik-Query-Service getrennt vom Command-Service.
- Für SQLite:
  - Materialized summary tables optional, aber erst nach Audit-Konzept.
  - Für kleine private Datenmengen reichen aggregierte SQL Queries.
- Wichtiger Constraint:
  - Keine Provider-Aufrufe beim Rendern von Statistikseiten.
  - Exchange rates für Statistik sollten aus Snapshot-Tabelle kommen.

---

### Insights Explorer

Pfade:

- `/home/agent/.hermes/reference_repos/ezbookkeeping/pkg/models/explorer.go`
- `/home/agent/.hermes/reference_repos/ezbookkeeping/pkg/api/explorers.go`
- `/home/agent/.hermes/reference_repos/ezbookkeeping/pkg/services/explorer.go`
- Frontend-Referenz:
  - `/home/agent/.hermes/reference_repos/ezbookkeeping/src/views/desktop/insights/ExplorerPage.vue`
  - `/home/agent/.hermes/reference_repos/ezbookkeeping/src/views/desktop/insights/tabs/ExplorerQueryTab.vue`
  - `/home/agent/.hermes/reference_repos/ezbookkeeping/src/views/desktop/insights/tabs/ExplorerChartTab.vue`

Model:

- `InsightsExplorer`
  - `ExplorerId`
  - `Uid`
  - `Deleted`
  - `Name`
  - `DisplayOrder`
  - `Data`
  - `Hidden`
  - Timestamps

`Data` ist ein JSON-Blob/String mit Explorer-Konfiguration.

API:

- list
- get
- add
- modify
- hide
- move
- delete

Patterns:

- Explorer speichert Query-/Chart-Konfiguration, nicht unbedingt Query-Ergebnisse.
- User-scoped saved views.
- Flexible JSON-Config.

Für JARVIS:

- Sehr geeignet als “saved analytics views”.
- Besser in Python:
  - `explorer_views` mit JSON-Spalte
  - Pydantic Schema für Versionierung:
    - `schema_version`
    - `dimensions`
    - `measures`
    - `filters`
    - `chart_type`
- Wichtig:
  - Saved Explorer Config nie ungeprüft als SQL ausführen.
  - Query Builder whitelist-basiert.
  - Audit für Explorer-Änderungen.

---

## DB und Migrationen

Pfade:

- `/home/agent/.hermes/reference_repos/ezbookkeeping/pkg/datastore/`
- `/home/agent/.hermes/reference_repos/ezbookkeeping/cmd/database.go`

DB Layer:

- `DataStoreContainer`
  - `UserStore`
  - `TokenStore`
  - `UserDataStore`
- Aktuell alle drei Stores auf derselben DB-Instanz, aber als logische Trennung vorbereitet.
- `DataStore.Choose(key)` ist Sharding-vorbereitet, gibt aber aktuell immer DB 0 zurück.
- `Database.DoTransaction(...)` kapselt Begin/Commit/Rollback.

Migration/Schema:

- Keine klassische migrationsbasierte Versionierung gefunden.
- Stattdessen:
  - XORM `Sync2(...)` auf Models
  - `/cmd/database.go`
  - `database update`
  - optional Auto-Update beim Serverstart über `config.AutoUpdateDatabase`

Synchronisierte Tabellen u.a.:

- User
- TwoFactor
- TokenRecord
- Account
- Transaction
- TransactionCategory
- TransactionTagGroup
- TransactionTag
- TransactionTagIndex
- TransactionTemplate
- TransactionPictureInfo
- UserCustomExchangeRate
- UserApplicationCloudSetting
- UserExternalAuth
- InsightsExplorer

Für JARVIS:

- Nicht übernehmen:
  - automatische ORM-Schema-Syncs als primäre Migration.
- Besser:
  - Alembic-Migrationen
  - explizite versionierte Migrationen
  - Runtime-DB getrennt von Repo/Code
- Gute Idee:
  - logische Trennung User/Auth/UserData.
  - transaction helper / unit-of-work.
  - soft delete + timestamps konsequent.

---

## Services und Business-Logic-Pattern

Pfade:

- `/home/agent/.hermes/reference_repos/ezbookkeeping/pkg/services/base.go`
- `/home/agent/.hermes/reference_repos/ezbookkeeping/pkg/services/transactions.go`
- `/home/agent/.hermes/reference_repos/ezbookkeeping/pkg/services/accounts.go`
- `/home/agent/.hermes/reference_repos/ezbookkeeping/pkg/services/transaction_categories.go`
- `/home/agent/.hermes/reference_repos/ezbookkeeping/pkg/services/transaction_tags.go`
- `/home/agent/.hermes/reference_repos/ezbookkeeping/pkg/services/transaction_templates.go`

Pattern:

- Globale Singleton Services:
  - `services.Transactions`
  - `services.Accounts`
  - `services.TransactionCategories`
  - etc.
- Services enthalten:
  - DB Container
  - UUID Generator
  - Validierung
  - Transaktionen
  - Query Composition
- APIs rufen Services auf, bauen Responses zusammen.

Für JARVIS:

- Statt Singletons besser Dependency Injection über FastAPI.
- Service Layer aber unbedingt übernehmen:
  - API dünn halten.
  - Geschäftslogik in Services.
  - DB Session pro Request.
  - Command/Query-Trennung optional.

---

## Build-System

Wichtige Pfade:

- `/home/agent/.hermes/reference_repos/ezbookkeeping/build.sh`
- `/home/agent/.hermes/reference_repos/ezbookkeeping/build.bat`
- `/home/agent/.hermes/reference_repos/ezbookkeeping/build.ps1`
- `/home/agent/.hermes/reference_repos/ezbookkeeping/go.mod`
- `/home/agent/.hermes/reference_repos/ezbookkeeping/package.json`
- `/home/agent/.hermes/reference_repos/ezbookkeeping/docker-bake.hcl`
- `/home/agent/.hermes/reference_repos/ezbookkeeping/docker/`

Build Types in `build.sh`:

- `backend`
- `frontend`
- `package`
- `docker`

Backend Build:

- `go get .`
- `go vet -v ./...`
- `go test ./... -v`
- `CGO_ENABLED=1 go build ...`
- Version/Commit via ldflags:
  - `main.Version`
  - `main.CommitHash`
  - `main.BuildUnixTime`

Frontend Build:

- `npm install`
- `npm run lint`
- `npm run test`
- `npm run build`

Package:

- Backend binary
- Frontend `dist` als `public`
- `conf`
- `templates`
- `LICENSE`
- Runtime-Verzeichnisse:
  - `data`
  - `storage`
  - `log`

Für JARVIS:

- Gute Idee:
  - Build metadata einbetten bzw. `/version` Endpoint.
  - Frontend/Backend separat baubar.
- Für JARVIS Runtime-separiert:
  - Keine Runtime-DB ins Build-Paket.
  - `data/`, `storage/`, `logs/` außerhalb Repo/Container mounten.
  - Config via env/config file, nicht hardcoded.

---

## Konkrete Patterns, die für JARVIS FastAPI/Vue/SQLite geeignet sind

### 1. Saubere Domänentrennung

Empfohlene Struktur:

```text
app/
  api/v1/
    accounts.py
    transactions.py
    categories.py
    tags.py
    templates.py
    exchange_rates.py
    imports.py
    statistics.py
    explorer.py
  services/
    accounts.py
    transactions.py
    imports.py
    statistics.py
    exchange_rates.py
    explorer.py
  models/
    account.py
    transaction.py
    category.py
    tag.py
    template.py
    exchange_rate.py
    import_session.py
    audit.py
  schemas/
    ...
  db/
    session.py
    migrations/
  core/
    auth.py
    responses.py
    config.py
    audit.py
```

### 2. Transaction Draft / Review / Confirm

ezBookkeeping importiert nach Parse/Confirm. Für JARVIS noch stärker machen:

- `transaction_drafts`
- `review_status`
  - pending
  - reviewed
  - confirmed
  - rejected
- `confirmed_transaction_id`
- `audit_events`

Wichtig wegen Nutzerconstraint:

- Kein Provider on render.
- Jede externe/importierte/AI-generierte Buchung muss Review/Confirm durchlaufen.

### 3. Integer Money Model

Von ezBookkeeping übernehmen:

- Beträge nicht als Float.
- In JARVIS:
  - `amount_minor: int`
  - `currency: str`
  - optional `scale`

### 4. Soft Delete und Hidden trennen

Übernehmen:

- `deleted`
- `deleted_at`
- `hidden`

Nutzen:

- `hidden` für UI.
- `deleted` für Audit/Recovery.

### 5. Import Plugin Architecture

Inspiriert von `/pkg/converters/`:

```python
class BaseImporter:
    def parse(self, data: bytes) -> list[ImportRow]: ...
    def normalize(self, row: ImportRow) -> TransactionDraft: ...
```

Registry:

```python
IMPORTERS = {
    "csv": CsvImporter,
    "ofx": OfxImporter,
    "custom_xlsx": CustomExcelImporter,
}
```

Aber: keine Fremdimplementierung kopieren.

### 6. Explorer als gespeicherte Query-Konfiguration

Inspiriert von `InsightsExplorer.Data`.

Für JARVIS:

- JSON config speichern.
- Query-Builder nur über Whitelist:
  - erlaubte Dimensionen
  - erlaubte Measures
  - erlaubte Filter
- Kein raw SQL aus UI.

### 7. Exchange Rate Snapshot statt Live Provider

Von ezBookkeeping Provider-Adapter-Idee übernehmen, aber JARVIS-Constraint beachten:

- Background Task aktualisiert `exchange_rate_snapshots`.
- UI/API liest nur Snapshots.
- User Overrides separat.
- Provider Calls auditieren.
- Kein Provider-Aufruf während Render/API-Read.

### 8. Account/Category/Tag DisplayOrder

Für Vue UI sinnvoll:

- `display_order`
- Move API
- Batch reorder endpoint

### 9. Transaction Query Builder

ezBookkeeping hat starke Filterlogik in `TransactionService`.

Für JARVIS:

- Query Object:
  - account_ids
  - category_ids
  - tag filters
  - amount range
  - date range
  - keyword
  - type
- Cursor Pagination:
  - `before_time`
  - `limit`
- Für SQLite Indizes:
  - `(user_id, deleted, transaction_time)`
  - `(user_id, deleted, account_id, transaction_time)`
  - `(user_id, deleted, category_id, transaction_time)`
  - tag join index

---

## Lizenz-/Compliance-Hinweis

- ezBookkeeping ist laut `package.json`, `README.md` und `LICENSE` MIT-lizenziert.
- Für JARVIS: nur Konzepte/Patterns verwenden.
- Keinen Fremdcode, keine Assets, keine Icons, keine Templates, keine konkreten Implementierungen kopieren.
- Falls Ideen direkt erkennbar aus ezBookkeeping übernommen werden, eine Referenz-/Inspirationsnotiz in interner Doku ist empfehlenswert.

---

## Dateien erstellt oder geändert

Keine.

---

## Probleme / Einschränkungen

- Keine Änderungen vorgenommen, wie gefordert.
- Keine Runtime-DB gestartet.
- Keine Tests/Builds ausgeführt, da reine Referenzanalyse.
- Es gibt keine klassische Migration-Historie; Schema wird über XORM `Sync2` aus Models synchronisiert. Für JARVIS sollte stattdessen Alembic genutzt werden.

Summary:
Erledigt.

- **Was ich gemacht habe**
  - FinanceManager-Budget-/Ausgaben-/Analyse-Stand im Repo analysiert.
  - ezBookkeeping als Referenz anhand README, Transaktionsliste, Import-Dialog, Overview Cards und Statistikseite verglichen.
  - Ein deutsches Markdown-Dokument mit Funktionsmatrix, Navigationsvorschlag und 4-stufiger Roadmap erstellt.
  - Keine Runtime-Daten gelesen/geändert, keine echten Beträge verwendet, keine Codeänderungen vorgenommen.

- **Was ich gefunden/ausgearbeitet habe**
  - JARVIS ist beim sicheren Budget-Kern bereits stark: Budgetstatus, Preview/Confirm/Audit, Import-Kandidaten, Review, Splits, Batch Preview, Kategorie-/Konto-/Plan-Grundlagen.
  - ezBookkeeping ist stärker bei UX-Reife: dichte Filter, Import-Wizard, mobile/desktop Transaktions-UX, breite Statistik- und Chart-Navigation.
  - Empfehlung: ezBookkeeping-Konzepte adaptieren, aber JARVIS-spezifisch mit Sicherheitsprinzipien: Preview/Confirm/Audit, Runtime außerhalb Repo, no provider on render, keine technischen IDs im User Mode, keine Mass Imports ohne Confirm.
  - Roadmap in 4 Stufen:
    1. Konsolidierung und User-Mode-Polish
    2. Geführter Import- und Review-Wizard
    3. Analyse-Hub und Budget-Intelligenz
    4. Automatisierung, Belege und fortgeschrittene Finanzplanung

- **Datei erstellt**
  - `/home/agent/.hermes/repos/FinanceManager/docs/budget/jarvis-finance-system-ezbookkeeping-reference-analysis-budget-ux-roadmap.md`

- **Verifikation**
  - Datei wurde erfolgreich geschrieben und gelesen.
  - `git status --short` zeigt nur den neuen Doku-Ordner:
    - `?? docs/budget/`

- **Issues**
  - Keine technischen Probleme.
  - Keine Codeänderungen vorgenommen.


Die Worker-Ergebnisse sind da. Ich prüfe jetzt die erzeugte Doku und ein paar Kernbefunde selbst gegen die Repos, damit der Abschluss nicht nur auf Worker-Selbstbericht beruht — Vertrauen ist gut, `read_file` ist besser.

Explanation:
**Verifying documentation and status**

I've created a document, but I need to double-check that its content is adequate. It's important to inspect the document closely. I'll also look into our to-do status and independently check key files, like the package.json. It seems like executing some code could be helpful here. Additionally, I should probably check the git status to make sure everything's up to date. Let's get this done!

git status --short --branch && test -d /home/agent/.hermes/reference_repos/ezbookkeeping/.git && echo REF_CLONE_OK && git -C /home/agent/.hermes/reference_repos/ezbookkeeping rev-parse --show-toplevel && git -C /home/agent/.hermes/reference_repos/ezbookkeeping rev-parse --short HEAD


     1|# JARVIS Finance System – ezBookkeeping Reference Analysis & Budget UX Roadmap
     2|
     3|Stand: 2026-05-17
     4|Scope: Analyse- und Designvorschlag für Budget, Ausgaben und Analyse im FinanceManager-Repo anhand ezBookkeeping als Referenz. Keine Runtime-Daten, keine echten Beträge, keine Implementierung.
     5|
     6|## 1. Executive Summary
     7|
     8|JARVIS hat bereits einen ungewöhnlich starken Budget-Kern für einen MVP:
     9|
    10|- Budget-Konten, Kategorien, Tags, Budgetpläne, Einnahmenpläne und bestätigte Budget-Transaktionen sind vorhanden.
    11|- Ausgaben- und Import-Review folgen bereits dem Sicherheitsmodell `Preview → Confirm → Audit`.
    12|- Import-Kandidaten, Confidence, Regeln, Duplikat-/Transfer-Hinweise, Splits und Batch-Preview sind vorhanden.
    13|- Analyse deckt Budget vs Ist, Monatswerte, Prognose und Ampelstatus je Kategorie ab.
    14|- Navigation trennt bereits Budget, Ausgaben und Setup; einige Analyse- und Spezialbereiche sind bewusst Roadmap-Placeholder statt Fake-Funktionen.
    15|
    16|Gegenüber ezBookkeeping fehlen vor allem UX-Reife und Analysebreite:
    17|
    18|- ezBookkeeping bietet eine sehr dichte Transaktionsliste mit Seitennavigation, Datumsshifts, Kalender-/Listen-/Galerie-Modi, schnellen Filtermenüs und Export.
    19|- ezBookkeeping hat ein ausgebautes Statistikmodul mit Analyse-Typen, Chart-Typen, Datendimensionen, Zeitaggregation, Sankey/Pie/Bar/Radar/Trend und drill-down in gefilterte Transaktionen.
    20|- ezBookkeeping unterstützt breitere Importformate und einen mehrstufigen Importdialog mit Upload, Spaltenmapping oder Script, Check & Modify, Import und Ergebnis.
    21|- ezBookkeeping nutzt Account-/Kategorie-/Tag-Hierarchien sichtbar und konsistent als Filterdimensionen.
    22|
    23|Empfehlung: JARVIS sollte nicht ezBookkeeping kopieren, sondern dessen Konzepte in ein sicheres, budgetzentriertes JARVIS-Modell übersetzen: weniger generische Buchhaltung, mehr geführter Budget-Cockpit-Flow mit klaren Arbeitsmodi, Confirm-Grenzen und User-Mode ohne technische IDs.
    24|
    25|## 2. Quellenbasis im Repo
    26|
    27|### JARVIS FinanceManager
    28|
    29|Analysierte Bereiche:
    30|
    31|- Backend Budget API: `src/jarvis_finance/api/routers/budget.py`
    32|- Budget Services:
    33|  - `budget_overview.py`
    34|  - `budget_transactions.py`
    35|  - `budget_imports.py`
    36|  - `budget_categories.py`
    37|  - `budget_accounts.py`
    38|  - `budget_plans.py` über API-Surface
    39|  - `budget_seed_review.py` über API-Surface
    40|- Frontend:
    41|  - `frontend/src/pages/BudgetOverviewPage.vue`
    42|  - `BudgetTransactionsPage.vue`
    43|  - `BudgetImportReviewPage.vue`
    44|  - `BudgetCategoriesPage.vue`
    45|  - `BudgetIncomePage.vue`, `BudgetRulesPage.vue`, `BudgetAccountsPage.vue`, `BudgetSetupPage.vue` über Navigation/API-Kontext
    46|  - `frontend/src/components/SidebarNav.vue`
    47|  - `frontend/src/router/index.ts`
    48|
    49|### ezBookkeeping Reference
    50|
    51|Analysierte Bereiche:
    52|
    53|- `README.md` Feature-Basis
    54|- Desktop Overview Cards:
    55|  - `IncomeExpenseOverviewCard.vue`
    56|  - `MonthlyIncomeAndExpenseCard.vue`
    57|- Desktop Transactions:
    58|  - `transactions/ListPage.vue`
    59|  - `transactions/import/ImportDialog.vue`
    60|- Desktop Statistics:
    61|  - `statistics/TransactionPage.vue`
    62|- Mobile Pages aus Dateistruktur:
    63|  - Transactions, Statistics, Accounts, Categories, Tags, Settings
    64|
    65|## 3. Sicherheits- und Designprinzipien für JARVIS
    66|
    67|Diese Prinzipien sind nicht optional und müssen alle Budget-/Ausgaben-/Analyse-Erweiterungen begrenzen:
    68|
    69|1. **Preview / Confirm / Audit**
    70|   - Jede dauerhafte Änderung braucht sichtbare Vorschau, explizite Bestätigung und Audit-Eintrag.
    71|   - Batch-Aktionen brauchen eine aggregierte Vorschau inklusive Konflikten und überschaubarem Umfang.
    72|
    73|2. **Runtime außerhalb Repo**
    74|   - Keine Budget-Runtime-Daten, Importdateien oder echten Beträge im Git-Repo.
    75|   - Doku und UI dürfen Muster und anonymisierte Beispiele enthalten, aber keine Live-Werte.
    76|
    77|3. **No provider on render**
    78|   - Budget- und Analyse-Seiten dürfen beim Rendern keine externen Provider, OCR, AI oder Markt-/FX-Provider ungefragt aufrufen.
    79|   - Datenaktualisierung ist eine explizite Nutzeraktion oder vorbereiteter Backend-Job mit Statusanzeige.
    80|
    81|4. **Keine technischen IDs im User Mode**
    82|   - User-Mode zeigt Kontonamen, Kategorien, Status und menschenlesbare Referenzen.
    83|   - Technische IDs bleiben in Debug-/Audit-Ansichten oder Developer Mode.
    84|
    85|5. **Keine Mass Imports ohne Confirm**
    86|   - Import ist immer staged: Einlesen → Kandidaten → Review/Regeln → Preview → Confirm.
    87|   - Keine direkte Massenbuchung aus Datei, Zwischenablage, OCR oder Regelengine.
    88|
    89|## 4. Funktionsmatrix: JARVIS vs ezBookkeeping
    90|
    91|Legende:
    92|
    93|- **Stark vorhanden**: Im JARVIS Repo klar umgesetzt und UI/API-angebunden.
    94|- **Teilweise vorhanden**: Grundlage existiert, aber UX/Abdeckung/Reife fehlen.
    95|- **Roadmap**: Noch nicht produktiv oder nur Placeholder.
    96|- **Nicht übernehmen**: Passt nicht oder nur mit Sicherheitsanpassung.
    97|
    98|### 4.1 Budget- und Planungsfunktionen
    99|
   100|| Bereich | JARVIS aktueller Stand | ezBookkeeping Konzept | Gap / Designchance | Empfehlung |
   101||---|---|---|---|---|
   102|| Budgetstatus | Stark vorhanden: Kategorie-Status, Monats- und Jahresbudget, Ist, Durchschnitt, Prognose, Ampel, Kategorie-Drawer | Kein klassisches Budgetmodul im Vordergrund; Fokus auf Transaktionsanalyse | JARVIS ist hier stärker budgetzentriert als ezBookkeeping | Beibehalten und als Haupt-Cockpit ausbauen |
   103|| Budgetpläne | API vorhanden: Plan Items, Preview/Confirm/Archive, Income-Plans | Eher wiederkehrende/planbare Transaktionen und historische Analyse | Editor ist in JARVIS noch Roadmap/Placeholder | Eigenen Plan-Editor mit Kalender-/Monatsmatrix bauen |
   104|| Einnahmenplanung | API und UI-Seite vorhanden: Income Status/Plans | Einnahmen als Transaktionstyp und Analyse-Dimension | JARVIS trennt Planung und Ist besser | Als eigener Navigationsbereich behalten |
   105|| Fixkosten / recurring | Placeholder in Navigation | Scheduled Transactions | Feature-Lücke | Stufe 3: Wiederkehrende erwartete Zahlungen als Kandidaten, nicht als stille Auto-Buchung |
   106|| Ziele/Szenarien | Placeholder / außerhalb Budget | Nicht Kern im analysierten UI-Ausschnitt | Feature-Lücke | Später, nach stabiler Budgetbasis |
   107|
   108|### 4.2 Ausgaben und Transaktionen
   109|
   110|| Bereich | JARVIS aktueller Stand | ezBookkeeping Konzept | Gap / Designchance | Empfehlung |
   111||---|---|---|---|---|
   112|| Effektive Ausgaben | Vorhanden: bestätigte Ausgaben, Filter, Summary Cards, Detaildrawer, Kategorie/Tag/Beschreibung ändern | Sehr reife Transaction List mit Typfilter, Zeitraum, Kategorie, Konto, Tags, Amount Filter, Kalender/Galerie/Liste, Export | JARVIS Filter-UX weniger dicht; Tags noch nur begrenzt sichtbar | Stufe 1: Filterleiste und Drawer verbessern, keine IDs in Feldern |
   113|| Manuelle Ausgabe | Vorhanden: Preview → Confirm | ezBookkeeping Add Transaction inklusive Templates und AI Image Recognition Option | JARVIS sicherer, aber weniger schnell | Schnell-Erfassung mit Templates nur nach Preview/Confirm |
   114|| Reversal / Adjustment | Backend vorhanden, UI verweist informativ; Update blockiert Betragsänderungen | Transaktionsbearbeitung flexibler | JARVIS Sicherheitsvorteil; UX noch unfertig | Eigener Reversal-/Adjustment-Flow im Drawer |
   115|| Transfers | Backend Preview/Confirm vorhanden; Import-Kandidaten können Transfer markieren | Transaktionstyp Transfer ist erstklassig | UI-Lücke | Stufe 2: Transfer als User-Mode Flow sichtbar machen |
   116|| Tags | Backend vorhanden; UI rudimentär, Tag-Route Placeholder | Tags und Tag-Gruppen stark in Listen/Filtern integriert | Lücke | Tags zu vollwertiger Setup- und Filterdimension machen |
   117|| Anhänge / Belege | Roadmap-Hinweis, kein Fake-OCR | ezBookkeeping: Image Attachments, Receipt Recognition | Bewusst nicht vorhanden | Nur später mit no-provider-on-render, Upload-Preview, manuellem Confirm |
   118|| Location | Nicht vorhanden | ezBookkeeping Location/Maps | Für Budget nicht kritisch | Nicht priorisieren |
   119|
   120|### 4.3 Import und Review
   121|
   122|| Bereich | JARVIS aktueller Stand | ezBookkeeping Konzept | Gap / Designchance | Empfehlung |
   123||---|---|---|---|---|
   124|| Import-Kandidaten | Stark vorhanden: CSV/Rows, Bank, Credit Card, Migros, Source Type, Confidence, Status, Review Reason, Duplicate, Transfer | Mehrstufiger Import Wizard: Upload, Define Column oder Custom Script, Check & Modify, Import, Final Result | JARVIS hat starke Safety, aber weniger generischen Wizard | Stufe 2: Wizard-UX nach ezBookkeeping, aber JARVIS Confirm-Modell behalten |
   125|| Spaltenmapping | Teilweise über spezifische Parser/Seed-Funktionen, kein generisches UI-Mapping | Define Column Tab | Lücke | Generisches Mapping nur als Kandidaten-Erzeuger, keine Direktbuchung |
   126|| Scripted Import | Nicht für User Mode vorgesehen | Custom Script Step | Sicherheitsrisiko | Nicht in User Mode übernehmen; höchstens Developer/Offline Tool |
   127|| Check & Modify | Vorhanden als Import Review Seite mit Inline-Kategorie, Detail, Split, Batch | CheckData Tab mit Filter-/Tool-Menüs | JARVIS Review ist stark, aber UI kompakter möglich | Review zum zentralen Arbeitscockpit machen |
   128|| Batch Aktionen | Vorhanden: Kategorie, Confirm Preview, Confirm, Ignore, Reopen, Transfer, Covered | Batch Replace/Create/Update in Import/Insights | JARVIS muss begrenzt bleiben | Batch nur mit Preview, Konflikten, Limit und Audit |
   129|| Duplikate | Teilweise: duplicate_of, Status, Review Summary | In Import und Transaktionsliste integriert | Detailmodul fehlt | Stufe 2: dedizierter Duplikat-Review |
   130|| Spezialquellen | Migros/Credit Card/Bank Regeln vorhanden | Viele Dateiformate | JARVIS ist haushaltsspezifischer | Quellen gezielt statt breit generisch ausbauen |
   131|
   132|### 4.4 Kategorien, Konten und Struktur
   133|
   134|| Bereich | JARVIS aktueller Stand | ezBookkeeping Konzept | Gap / Designchance | Empfehlung |
   135||---|---|---|---|---|
   136|| Kategorien | Vorhanden: Typ, Parent, Farbe, Icon, Archive, Delete Empty, Merge Preview | Zwei-Level-Kategorien, Icons/Farben, Filterintegration | JARVIS hat Baum, aber User-Mode noch technische Typen sichtbar | Kategorie-UX vereinfachen: Einnahmen/Ausgaben, Unterkategorien, sichtbare Namen |
   137|| Kategorie-Merge | Preview/Confirm vorhanden | Verwaltung und Display Order | Starkes JARVIS Sicherheitsfeature | Behalten, vor Confirm Auswirkungszahlen zeigen |
   138|| Konten | Budget Accounts mit Typ, Currency, optional Linked Account | Zwei-Level Accounts, Accountfilter, Reconciliation | JARVIS Konto-UX weniger umfassend | Kontoübersicht mit Aktivstatus, Standardkonto, Sichtbarkeit |
   139|| Reconciliation | Nicht für Budget vorhanden | Account Reconciliation Statement | Lücke | Optional Stufe 4, nur wenn Bankdaten-Workflow reif ist |
   140|| Display Order / Hidden | Teilweise sort_order / archive | Display Order und Hidden in Kategorien/Konten/Tags | Lücke | Setup-Polish Stufe 2/3 |
   141|
   142|### 4.5 Analyse und Reporting
   143|
   144|| Bereich | JARVIS aktueller Stand | ezBookkeeping Konzept | Gap / Designchance | Empfehlung |
   145||---|---|---|---|---|
   146|| Budget vs Ist | Stark vorhanden mit Kategoriezeilen und Monatsanalyse | Statistikmodul kann kategorisch und Trends analysieren | JARVIS ist budgetzentriert, ezBookkeeping ist explorativer | JARVIS Analyse-Hub ergänzen, Budget-Cockpit behalten |
   147|| Cashflow Monatsverlauf | Vorhanden als einfache Liste/Chartdaten | Monthly Income/Expense Card mit interaktivem Chart | JARVIS Visualisierung einfacher | Stufe 1: bessere interaktive Monatskarten, Drilldown |
   148|| Kategorieanalyse | Teilweise: Top Categories, Detail Breakdown nach Merchant/Source | Pie/Bar/Radar/Sankey, Prozent, Filter, Drilldown | Größte Analyse-Lücke | Stufe 3: Analyse-Labor mit sicheren vordefinierten Views |
   149|| Trendanalyse | Teilweise: Prognose und monatliche Actuals | Trend Analysis mit Aggregation, YoY/Period-over-period | Lücke | Stufe 3/4, ohne Provider und ohne Scheingenauigkeit |
   150|| Export | Nicht prominent im Budget UX | Export Results / CSV/TSV | Lücke | Nur anonymisierte/gewählte Exporte, Confirm-Dialog |
   151|| Insights / Query Explorer | Nicht für Budget | ezBookkeeping Insights Explorer mit Query/Charts/Data Table und Batch Updates | Mächtig, aber riskant | Nur Read-only Analyse zuerst; Batch aus Insights nicht übernehmen ohne Preview/Confirm |
   152|
   153|### 4.6 Mobile UX
   154|
   155|| Bereich | JARVIS aktueller Stand | ezBookkeeping Konzept | Gap / Designchance | Empfehlung |
   156||---|---|---|---|---|
   157|| Mobile Navigation | Bottom Nav mit Home, Budget, Ausgaben, Crypto, Portfolio, Mehr | Separate mobile Pages für Home, Transactions, Statistics, Accounts, Categories, Settings | JARVIS gut begonnen | Mobile Budget/Ausgaben als 3 Kern-Tabs priorisieren |
   158|| Mobile Budget Cards | Vorhanden | Native-like PWA und mobile-optimierte Seiten | JARVIS weniger umfassend | Keine Tabellen auf Mobile; Karten + Drilldown |
   159|| Mobile Transaction Review | Vorhanden für Ausgabenkarten, Review eher tabellarisch | Eigene Mobile Transaction Pages | Import Review mobil noch schwer | Stufe 2: mobile Review Cards mit Swipe/Confirm nur nach Preview |
   160|
   161|## 5. JARVIS Ist-Stand als Produktmodell
   162|
   163|### 5.1 Bereits produktnah vorhanden
   164|
   165|- Budget-Cockpit nach Kategorie:
   166|  - Monat/Jahr auswählbar
   167|  - Plan/Ist/Prognose/Ampel
   168|  - Monatsanalyse je Kategorie
   169|  - Monatlicher Breakdown nach Händler/Quelle
   170|  - Drilldown zu Buchungen
   171|- Effektive Ausgaben:
   172|  - Liste bestätigter Ausgaben
   173|  - Filter nach Jahr, Monat, Konto, Kategorie, Tag, Quelle, Händler, Suche
   174|  - Mobile Cards und Desktop-Tabelle
   175|  - Detaildrawer mit Audit-Änderungen für Kategorie/Beschreibung/Tags
   176|- Manuelle Ausgaben:
   177|  - Preview und Confirm
   178|  - FX-Status-Hinweise
   179|  - Kategorie-Warnung
   180|- Import Review:
   181|  - Kandidatenstatus, Confidence, Klassifikation, Review Reason
   182|  - Tabs für Auto/Review/Galaxus/Migros/Covered/Duplikate/Unklar/Ignoriert
   183|  - Kategoriezuweisung, neue Kategorie aus Review, Ignore/Reopen/Transfer
   184|  - Splits
   185|  - Batch Confirm Preview mit Konflikten
   186|- Setup:
   187|  - Kategorien mit Preview/Confirm, Update, Archive, Delete Empty, Merge Preview
   188|  - Konten und Regeln als eigene Bereiche
   189|- API-Surface:
   190|  - Budget Accounts, Categories, Tags, Plans, Income Plans, Transactions, Transfers, Seed Candidates, Transaction Candidates, Rules, Charts, Status
   191|
   192|### 5.2 Wichtige aktuelle UX-Friktionen
   193|
   194|- User sieht teilweise technische Feldnamen oder IDs, z. B. Konto-ID-Filter im Kategorie-Drawer oder technische Statuswerte.
   195|- Budgetanalyse ist funktional, aber visuell noch listen-/tabellenlastig.
   196|- Transaktionsliste hat weniger schnelle Filter-Interaktion als ezBookkeeping, insbesondere für Zeitraum, Betragsfilter, Mehrfach-Kategorien/-Konten/-Tags.
   197|- Tags sind kein vollwertiger Navigations- und Analysegegenstand.
   198|- Reversal/Adjustment und Transfer existieren im Backend stärker als in der UX.
   199|- Import Wizard fehlt als geführter Ablauf; Review-Seite ist mächtig, aber nicht als Schrittprozess erklärt.
   200|- Einige Navigationseinträge sind Placeholder; gut aus Sicherheitsgründen, aber die Informationsarchitektur kann klarer priorisieren.
   201|
   202|## 6. ezBookkeeping-Konzepte, die JARVIS übernehmen sollte
   203|
   204|### 6.1 Direkt übernehmen, aber JARVIS-sicher umsetzen
   205|
   206|1. **Transaktionslisten-Filter als Primär-UX**
   207|   - Zeitraum mit schnellen Presets und Vor/Zurück-Schieben.
   208|   - Kategorie/Konto/Tag als Menüs mit Namen, Icons/Farben, Mehrfachauswahl.
   209|   - Betrag als eigener Filtertyp.
   210|   - Suchfeld prominent.
   211|
   212|2. **Analyse-Seitennavigation**
   213|   - Analyse-Typen als linke/obere Subnavigation: Überblick, Kategorie, Trend, Cashflow, Review-Qualität.
   214|   - Chart-Typen nur wenn Daten vorhanden und sinnvoll.
   215|
   216|3. **Interaktive Monats-/Kategorie-Charts**
   217|   - Klick auf Monat oder Kategorie öffnet gefilterte Transaktionen.
   218|   - Kein Chart ohne Drilldown.
   219|
   220|4. **Import als Wizard**
   221|   - Datei/Quelle wählen.
   222|   - Spalten prüfen/mappen.
   223|   - Kandidaten erzeugen.
   224|   - Check & Modify.
   225|   - Preview/Confirm.
   226|   - Ergebnis mit Audit-Referenz.
   227|
   228|5. **Leere Zustände und Loading States**
   229|   - ezBookkeeping ist konsequent mit `No data` und Skeletons.
   230|   - JARVIS sollte leere Zustände handlungsorientiert formulieren: „Noch keine Buchungen – erst Review abschließen oder manuelle Ausgabe erfassen.“
   231|
   232|### 6.2 Nur angepasst übernehmen
   233|
   234|1. **AI Receipt Recognition**
   235|   - Nur als expliziter Import-Job, nicht beim Rendern.
   236|   - Ergebnis immer Kandidat, nie direkte Buchung.
   237|   - OCR/AI-Ausgaben mit Confidence und Review Reason.
   238|
   239|2. **Custom Script Import**
   240|   - Nicht im normalen User Mode.
   241|   - Nur Developer-/Admin-Tool mit lokalem Dry Run, Audit und ohne Zugriff auf Runtime-Repo-Daten.
   242|
   243|3. **Insights Explorer mit Batch Updates**
   244|   - Erst read-only.
   245|   - Batch aus Analyse heraus nur über bestehende Review-/Preview-/Confirm-Pipeline.
   246|
   247|4. **Export**
   248|   - Nur ausgewählte/gefilterte Daten.
   249|   - Vor Export Zusammenfassung anzeigen.
   250|   - Keine technischen IDs im User-Export, außer expliziter Audit/Developer Export.
   251|
   252|### 6.3 Nicht prioritär übernehmen
   253|
   254|- Location/Maps für Ausgaben.
   255|- Breite Importformat-Abdeckung vor Stabilisierung der Kernquellen.
   256|- Galerie-Modus für Transaktionen, solange Beleganhänge fehlen.
   257|- App-Lock/2FA im FinanceManager-Budgetkontext, sofern Auth nicht Teil dieses Moduls ist.
   258|
   259|## 7. Navigationsvorschlag
   260|
   261|

Use offset=261 to continue reading (showing 1-260 of 762 lines)


     1|{
     2|  "name": "ezbookkeeping",
     3|  "version": "1.5.0",
     4|  "private": true,
     5|  "repository": {
     6|    "type": "git",
     7|    "url": "git+https://github.com/mayswind/ezbookkeeping.git"
     8|  },
     9|  "author": "MaysWind <i@mayswind.net>",
    10|  "license": "MIT",
    11|  "bugs": {
    12|    "url": "https://github.com/mayswind/ezbookkeeping/issues"
    13|  },
    14|  "scripts": {
    15|    "serve": "cross-env NODE_ENV=development vite",
    16|    "build": "cross-env NODE_ENV=production vite build",
    17|    "serve:dist": "vite preview",
    18|    "lint": "vue-tsc --noEmit && eslint . --fix",
    19|    "test": "vitest run"
    20|  },
    21|  "dependencies": {
    22|    "@mdi/js": "7.4.47",
    23|    "@vuepic/vue-datepicker": "12.1.0",
    24|    "axios": "1.15.2",
    25|    "cbor-js": "0.1.0",
    26|    "chardet": "2.1.1",
    27|    "clipboard": "2.0.11",
    28|    "crypto-js": "4.2.0",
    29|    "dom7": "4.0.6",
    30|    "echarts": "6.0.0",
    31|    "framework7": "9.0.3",
    32|    "framework7-icons": "5.0.5",
    33|    "framework7-vue": "9.0.3",
    34|    "jalaali-js": "1.2.8",
    35|    "leaflet": "1.9.4",
    36|    "line-awesome": "1.3.0",
    37|    "moment": "2.30.1",
    38|    "moment-timezone": "0.6.1",
    39|    "pinia": "3.0.4",
    40|    "register-service-worker": "1.7.2",
    41|    "skeleton-elements": "4.0.1",
    42|    "swiper": "12.1.3",
    43|    "ua-parser-js": "1.0.39",
    44|    "vue": "3.5.33",
    45|    "vue-echarts": "8.0.1",
    46|    "vue-i18n": "11.3.2",
    47|    "vue-router": "5.0.6",
    48|    "vue3-perfect-scrollbar": "2.0.0",
    49|    "vuedraggable": "4.1.0",
    50|    "vuetify": "3.12.5"
    51|  },
    52|  "devDependencies": {
    53|    "@jest/globals": "30.3.0",
    54|    "@tsconfig/node24": "24.0.4",
    55|    "@types/cbor-js": "0.1.1",
    56|    "@types/crypto-js": "4.2.2",
    57|    "@types/git-rev-sync": "2.0.2",
    58|    "@types/jalaali-js": "1.2.0",
    59|    "@types/node": "25.6.0",
    60|    "@types/ua-parser-js": "0.7.39",
    61|    "@vitejs/plugin-vue": "6.0.6",
    62|    "@vue/eslint-config-typescript": "14.7.0",
    63|    "@vue/tsconfig": "0.9.1",
    64|    "cross-env": "10.1.0",
    65|    "eslint": "10.2.1",
    66|    "eslint-plugin-vue": "10.9.0",
    67|    "git-rev-sync": "3.0.2",
    68|    "postcss-preset-env": "11.2.1",
    69|    "sass": "1.99.0",
    70|    "ts-node": "10.9.2",
    71|    "typescript": "6.0.3",
    72|    "vite": "7.3.2",
    73|    "vite-plugin-checker": "0.13.0",
    74|    "vite-plugin-pwa": "1.2.0",
    75|    "vite-plugin-vuetify": "2.1.3",
    76|    "vitest": "4.1.5",
    77|    "vue-tsc": "3.2.7"
    78|  },
    79|  "browserslist": [
    80|    "last 5 Chrome versions",
    81|    "last 5 Firefox versions",
    82|    "last 5 Safari versions",
    83|    "last 5 Edge versions",
    84|    "last 5 ChromeAndroid versions",
    85|    "last 5 iOS versions",
    86|    "not IE <= 11",
    87|    "not dead"
    88|  ]
    89|}
    90|