docs: adds rules and agents specs

This commit is contained in:
Anton
2026-02-27 19:08:55 +03:00
commit 9551b93a09
12 changed files with 1151 additions and 0 deletions

View File

@@ -0,0 +1,141 @@
# Позиция 4: Редактирование транзакций и правила категорий
## Цели
- Минимизировать ручной труд при категоризации транзакций.
- Обеспечить возможность "дообучения" системы за счёт действий пользователя.
- Отдельно обработать сложные случаи (маркетплейсы), где по описанию нельзя однозначно определить категорию.
## Редактирование транзакций (SPA)
При открытии истории операций пользователь может открыть карточку редактирования транзакции.
Доступные действия для одной транзакции:
- Изменить категорию (выбор из списка категорий `categories`).
- При необходимости добавить/изменить пользовательский комментарий (`comment`).
- Включить/отключить опцию "Создать правило для похожих транзакций в будущем".
Ограничения:
- Описание операции (`description`) **не редактируется** в SPA, чтобы сохранять оригинальные данные из банка.
Поле `comment` используется только для заметок пользователя и не влияет напрямую на
автоматические правила (на старте).
## Поля в таблице `transactions`
К ранее описанной структуре добавляются поля:
- `is_category_confirmed BOOLEAN NOT NULL DEFAULT FALSE`
признак того, что текущая категория транзакции подтверждена пользователем
(явно или неявно).
- `comment TEXT` — пользовательский комментарий к транзакции.
Рекомендуемый DDL-дельта:
```sql
ALTER TABLE transactions
ADD COLUMN is_category_confirmed BOOLEAN NOT NULL DEFAULT FALSE;
ALTER TABLE transactions
ADD COLUMN comment TEXT;
```
## Поведение при редактировании транзакции
При сохранении изменений в SPA backend выполняет:
1. Обновление транзакции:
- устанавливается новое значение `category_id`;
- при изменении комментария сохраняется `comment`;
- поле `is_category_confirmed` устанавливается в `TRUE`.
2. Если опция "Создать правило для похожих транзакций в будущем" включена (по умолчанию включена):
- создаётся новая запись в `category_rules` или обновляется существующая.
## Создание правил из транзакций
В карточке редактирования транзакции отображается блок "Правило для будущих операций":
- Галочка (переключатель):
- по умолчанию **включена**;
- отвечает за то, будет ли на основе текущей транзакции создано/обновлено правило.
- Поле "ключевая строка/шаблон" (pattern):
- заполняется автоматически (например, ключевым словом из `description`),
но пользователь может его скорректировать;
- сохраняется в `category_rules.pattern`.
- Тип совпадения (match_type): на старте можно использовать только `"contains"`.
- В дальнейшем допускается расширение до `"starts_with"` и `"regex"`.
При сохранении:
- создаётся правило в `category_rules` с полями:
- `pattern` — строка из формы;
- `match_type` — тип (на старте `"contains"`);
- `category_id` — выбранная категория;
- `priority` — например, по умолчанию 100 для правил, созданных пользователем;
- `is_active = TRUE`.
Логика приоритета:
- Если для одной транзакции подходит несколько правил, выбирается правило
с максимальным значением `priority`.
## Особый случай: маркетплейсы
Проблема: по описанию вида "OZON", "WILDBERRIES" и т.п. невозможно
однозначно определить категорию (там могут быть любые товары).
Стратегия (MVP):
- Для маркетплейсов создаются специальные правила, которые:
- могут присваивать "предполагаемую" категорию (например, "Дом" или
любую другую, выбранную пользователем);
- при этом все транзакции, закатегоризированные таким правилом,
помечаются как `is_category_confirmed = FALSE`.
Результат:
- В истории операций такие транзакции визуально подсвечиваются
как требующие внимания пользователя.
- Пользователь может:
- подтвердить категорию (в этом случае `is_category_confirmed` становится `TRUE`);
- изменить категорию и при желании создать новое правило.
Дополнительно:
- Для маркетплейсов особенно полезно поле `comment`, куда пользователь может
записать, что конкретно было куплено (например, "корм для Арчи", "мебель", "одежда").
## Применение правил к прошлым транзакциям
В интерфейсе управления правилами (отдельный раздел SPA) для каждого правила
может быть доступна опция:
- "Применить правило к прошлым транзакциям".
При активации этой опции backend:
- находит все транзакции, подходящие под данное правило;
- проставляет им `category_id`;
- устанавливает `is_category_confirmed = FALSE` (категория считается предварительной).
Пользователь может затем:
- отфильтровать операции по `onlyUnconfirmed = true` через `/api/transactions`;
- просмотреть и при необходимости скорректировать категории;
- после ручного подтверждения транзакции становятся `is_category_confirmed = TRUE`.
## Связь с API `/api/transactions`
- Эндпоинт `/api/transactions` возвращает поля `isCategoryConfirmed` и `comment`,
что позволяет:
- отображать неподтверждённые категории отдельно (подсветка в UI);
- предоставлять фильтр "Только неподтверждённые" (`onlyUnconfirmed=true`).
- При редактировании транзакции через отдельный эндпоинт (например, `PUT /api/transactions/{id}`):
- передаются новые значения `categoryId` и/или `comment`;
- флаг `isCategoryConfirmed` устанавливается в `true`.