Initial income_calculator project

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-02-23 16:49:24 +03:00
commit 31dc287c3d
44 changed files with 1935 additions and 0 deletions

78
README.md Normal file
View File

@@ -0,0 +1,78 @@
# Личные финансы — учёт баланса и выписок
Учёт операций по нескольким банкам: импорт PDF-выписок, дедупликация, расчёт баланса, дохода, дебета/кредита, копилки. Дашборд с фильтрами и графиками на localhost.
## Поддерживаемые банки
- **Т** — Т-банк (файлы `Т-MM-YY.pdf`)
- **С** — Сбербанк (`С-MM-YY.pdf`)
- **Я** — Яндекс Банк (`Я-MM-YY.pdf`)
Выписки кладутся в папку `Выписки банков/`.
## Запуск
### Вариант 1: Docker (рекомендуется)
Нужны установленные Docker и Make.
```bash
make run
```
Откройте в браузере **http://127.0.0.1:8000**. База данных хранится в Docker-volume `income_calculator_data`, папка `Выписки банков/` с хоста монтируется в контейнер — импорт из папки работает с вашими PDF.
Полезные команды:
- `make stop` — остановить контейнер
- `make logs` — логи
- `make shell` — shell внутри контейнера
- `make help` — список целей
### Вариант 2: Локально (venv)
1. Создать venv и установить зависимости:
```bash
python3 -m venv venv
./venv/bin/pip install -r backend/requirements.txt
```
2. Запустить сервер:
```bash
cd /path/to/income_calculator
PYTHONPATH=. ./venv/bin/uvicorn backend.main:app --host 127.0.0.1 --port 8000
```
3. Открыть в браузере: **http://127.0.0.1:8000**
### Настройки приложения
В разделе **Настройки**:
- Выбрать **зарплатный банк** (кнопка «Сделать зарплатным»), при необходимости — **зарплатную карту** (доход считается по приходам на этот банк или только на выбранную карту).
- Включить при необходимости «Доход только по зарплатной карте».
- Нажать **Импорт из папки**, чтобы загрузить все выписки из `Выписки банков/`, или загрузить один PDF вручную.
## Дашборд
- **Фильтры**: период (дата с/по), банки (галочки), **«Не учитывать переводы»** — при включении все операции с текстом «Перевод» в описании исключаются из расчётов (баланс, доход, дебет/кредит, копилка и графики).
- **Сводка**: суммарный баланс, доход (по зарплатному банку/карте), дебет, кредит, копилка (накопления).
- **Графики**: доход и расход по месяцам, динамика остатка, динамика копилки.
- **Операции**: список с пагинацией; у каждой операции можно снять галочку «В расчёте», тогда она не участвует в балансе и сводке.
**Копилка**: операции с описанием «Перевод между счетами одного клиента» (Яндекс Банк): отрицательная сумма — взнос в копилку, положительная — вывод; в сводке и на графике отображается итог по копилке.
## Структура проекта
- `backend/` — FastAPI, SQLite, парсеры выписок Т/С/Я, API и раздача статики.
- `frontend/dist/` — фронтенд (один HTML с Chart.js), сборка не требуется.
- `Выписки банков/` — PDF-выписки (`Т-MM-YY.pdf`, `С-MM-YY.pdf`, `Я-MM-YY.pdf`).
База данных: **SQLite** — `backend/finance.db`.
## API (кратко)
- **Банки**: `GET /api/banks`, `PUT /api/banks/salary/{id}`.
- **Счета**: `GET /api/accounts`, `POST /api/accounts/{account_id}/opening-balance`.
- **Импорт**: `POST /api/import/upload`, `POST /api/import/from-folder`.
- **Баланс и операции**: `GET /api/balance/summary`, `GET /api/balance/by-account`, `GET /api/transactions` (параметры: `period_start`, `period_end`, `bank_ids`).
- **Графики**: `GET /api/charts/income-expense`, `GET /api/charts/balance-dynamics`, `GET /api/charts/savings-dynamics` (те же параметры фильтрации).
- **Настройки**: `GET/PUT /api/settings/income` (зарплатная карта, «только по карте»), `GET/PUT /api/settings/exclude-transfers` (не учитывать переводы).