95 lines
4.6 KiB
Markdown
95 lines
4.6 KiB
Markdown
# Категории расходов и доходов (MVP)
|
||
|
||
## Базовый список категорий
|
||
|
||
Используются следующие категории для классификации транзакций:
|
||
|
||
| Категория | type |
|
||
|---|---|
|
||
| Продукты | expense |
|
||
| Авто | expense |
|
||
| Здоровье | expense |
|
||
| Арчи | expense |
|
||
| ЖКХ | expense |
|
||
| Дом | expense |
|
||
| Проезд | expense |
|
||
| Одежда | expense |
|
||
| Химия | expense |
|
||
| Косметика | expense |
|
||
| Инвестиции | transfer |
|
||
| Развлечения | expense |
|
||
| Общепит | expense |
|
||
| Штрафы | expense |
|
||
| Налоги | expense |
|
||
| Подписки | expense |
|
||
| Перевод | transfer |
|
||
| Наличные | expense |
|
||
| Подарки | expense |
|
||
| Спорт | expense |
|
||
| Отпуск | expense |
|
||
| Техника | expense |
|
||
| Поступления | income |
|
||
|
||
Особенности:
|
||
|
||
- Категории на данном этапе одноуровневые (без подкатегорий).
|
||
- Категории используются как для фильтрации и аналитики, так и для правил авто-категоризации.
|
||
- Категория `Перевод` используется для переводов (в т.ч. между своими счетами и на другие счета).
|
||
- Категория `Инвестиции` предназначена для операций, связанных с брокерским счётом/ценными бумагами.
|
||
- Категория `Поступления` используется для всех видов доходов (зарплата, кешбэк и др.), пока без детализации.
|
||
|
||
## Таблица `categories` (PostgreSQL)
|
||
|
||
Для хранения категорий используется отдельная таблица `categories`.
|
||
|
||
Рекомендуемая структура:
|
||
|
||
- `id BIGSERIAL PRIMARY KEY` — идентификатор категории.
|
||
- `name TEXT NOT NULL` — отображаемое имя категории (из списка выше).
|
||
- `type TEXT NOT NULL` — тип категории:
|
||
- `"expense"` — расходная категория;
|
||
- `"income"` — доходная категория;
|
||
- `"transfer"` — категории для переводов/движений между собственными счетами.
|
||
- `is_active BOOLEAN NOT NULL DEFAULT TRUE` — используется ли категория.
|
||
|
||
Рекомендуемый DDL:
|
||
|
||
```sql
|
||
CREATE TABLE categories (
|
||
id BIGSERIAL PRIMARY KEY,
|
||
name TEXT NOT NULL,
|
||
type TEXT NOT NULL,
|
||
is_active BOOLEAN NOT NULL DEFAULT TRUE
|
||
);
|
||
|
||
ALTER TABLE categories
|
||
ADD CONSTRAINT chk_categories_type
|
||
CHECK (type IN ('expense', 'income', 'transfer'));
|
||
```
|
||
|
||
Поля `is_category_confirmed` и `comment` относятся к таблице `transactions` (см. `edit_and_rules.md`).
|
||
|
||
Привязка к транзакциям:
|
||
|
||
- В таблице `transactions` поле `category_id` является внешним ключом на `categories(id)`.
|
||
- При авто- или ручной категоризации транзакции записывается соответствующий `category_id`.
|
||
|
||
## Алиасы счетов
|
||
|
||
- При первом появлении нового счёта (новая комбинация `bank + account_number`) после загрузки выписки
|
||
SPA предлагает пользователю ввести человекочитаемый алиас: например, `"Текущий"`, `"Накопительный"`, `"Брокерский"`.
|
||
- Алиас хранится в таблице `accounts` в отдельном поле, например `alias TEXT`.
|
||
- В таблице истории операций на фронтенде вместо номера счёта показывается `alias` (с возможностью при наведении/по клику увидеть полный номер).
|
||
|
||
Изменённая таблица `accounts` (добавлен алиас):
|
||
|
||
```sql
|
||
ALTER TABLE accounts
|
||
ADD COLUMN alias TEXT;
|
||
```
|
||
|
||
При создании нового счёта:
|
||
|
||
- Если алиас задан пользователем — сохраняем его в `accounts.alias`.
|
||
- Если пользователь пропустил ввод алиаса — можно задать временный (`"Счёт 1"`, `"Счёт 2"`) и предложить изменить его позже в настройках.
|