99 lines
4.6 KiB
Markdown
99 lines
4.6 KiB
Markdown
# Категории расходов и доходов (MVP)
|
||
|
||
## Базовый список категорий
|
||
|
||
Используются следующие категории для классификации транзакций:
|
||
|
||
- Продукты
|
||
- Авто
|
||
- Здоровье
|
||
- Арчи
|
||
- ЖКХ
|
||
- Дом
|
||
- Проезд
|
||
- Одежда
|
||
- Химия
|
||
- Косметика
|
||
- Инвестиции
|
||
- Развлечения
|
||
- Общепит
|
||
- Штрафы
|
||
- Налоги
|
||
- Подписки
|
||
- Перевод
|
||
- Наличные
|
||
- Подарки
|
||
- Спорт
|
||
- Отпуск
|
||
- Техника
|
||
- Поступления
|
||
|
||
Особенности:
|
||
|
||
- Категории на данном этапе одноуровневые (без подкатегорий).
|
||
- Категории используются как для фильтрации и аналитики, так и для правил авто-категоризации.
|
||
- Категория `Перевод` используется для переводов (в т.ч. между своими счетами и на другие счета).
|
||
- Категория `Инвестиции` предназначена для операций, связанных с брокерским счётом/ценными бумагами.
|
||
- Категория `Поступления` используется для всех видов доходов (зарплата, кешбэк и др.), пока без детализации.
|
||
|
||
## Таблица `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` — используется ли категория.
|
||
- `is_category_confirmed BOOLEAN NOT NULL DEFAULT FALSE` — подтверждена ли категория пользователем.
|
||
- `comment TEXT` — пользовательский комментарий (например, по маркетплейсам).
|
||
|
||
Рекомендуемый 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'));
|
||
|
||
ALTER TABLE transactions
|
||
ADD COLUMN is_category_confirmed BOOLEAN NOT NULL DEFAULT FALSE;
|
||
|
||
ALTER TABLE transactions
|
||
ADD COLUMN comment TEXT;
|
||
```
|
||
|
||
Привязка к транзакциям:
|
||
|
||
- В таблице `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"`) и предложить изменить его позже в настройках.
|