9.0 KiB
Позиция 4: Редактирование транзакций и правила категорий
Цели
- Минимизировать ручной труд при категоризации транзакций.
- Обеспечить возможность "дообучения" системы за счёт действий пользователя.
- Отдельно обработать сложные случаи (маркетплейсы), где по описанию нельзя однозначно определить категорию.
Редактирование транзакций (SPA)
При открытии истории операций пользователь может открыть карточку редактирования транзакции.
Доступные действия для одной транзакции:
- Изменить категорию (выбор из списка категорий
categories). - При необходимости добавить/изменить пользовательский комментарий (
comment). - Включить/отключить опцию "Создать правило для похожих транзакций в будущем".
Ограничения:
- Описание операции (
description) не редактируется в SPA, чтобы сохранять оригинальные данные из банка.
Поле comment используется только для заметок пользователя и не влияет напрямую на
автоматические правила (на старте).
Поля в таблице transactions
К ранее описанной структуре добавляются поля:
is_category_confirmed BOOLEAN NOT NULL DEFAULT FALSE— признак того, что текущая категория транзакции подтверждена пользователем (явно или неявно).comment TEXT— пользовательский комментарий к транзакции.
Рекомендуемый DDL-дельта:
ALTER TABLE transactions
ADD COLUMN is_category_confirmed BOOLEAN NOT NULL DEFAULT FALSE;
ALTER TABLE transactions
ADD COLUMN comment TEXT;
Поведение при редактировании транзакции
При сохранении изменений в SPA backend выполняет:
-
Обновление транзакции:
- устанавливается новое значение
category_id; - при изменении комментария сохраняется
comment; - поле
is_category_confirmedустанавливается вTRUE.
- устанавливается новое значение
-
Если опция "Создать правило для похожих транзакций в будущем" включена (по умолчанию включена):
- создаётся новая запись в
category_rulesили обновляется существующая.
- создаётся новая запись в
Создание правил из транзакций
В карточке редактирования транзакции отображается блок "Правило для будущих операций":
-
Галочка (переключатель):
- по умолчанию включена;
- отвечает за то, будет ли на основе текущей транзакции создано/обновлено правило.
-
Поле "ключевая строка/шаблон" (pattern):
- заполняется автоматически (например, ключевым словом из
description), но пользователь может его скорректировать; - сохраняется в
category_rules.pattern.
- заполняется автоматически (например, ключевым словом из
-
Тип совпадения (match_type): на старте можно использовать только
"contains".- В дальнейшем допускается расширение до
"starts_with"и"regex".
- В дальнейшем допускается расширение до
При сохранении:
- создаётся правило в
category_rulesс полями:pattern— строка из формы;match_type— тип (на старте"contains");category_id— выбранная категория;priority— например, по умолчанию 100 для правил, созданных пользователем;requires_confirmation— еслиTRUE, транзакции, категоризированные этим правилом, получаютis_category_confirmed = FALSEи требуют ручного подтверждения. По умолчаниюFALSE. Используется для правил с неоднозначным соответствием (маркетплейсы и т.п.);is_active = TRUE.
Логика приоритета:
- Если для одной транзакции подходит несколько правил, выбирается правило
с максимальным значением
priority.
Правила с обязательным подтверждением (requires_confirmation)
Проблема: некоторые правила не могут однозначно определить категорию транзакции. Например, по описанию "OZON", "WILDBERRIES" невозможно понять, что именно было куплено (продукты, одежда, техника и т.п.).
Механизм:
- В таблице
category_rulesиспользуется флагrequires_confirmation BOOLEAN NOT NULL DEFAULT FALSE. - Если
requires_confirmation = TRUE:- правило присваивает категорию (например, "Дом" или любую другую, выбранную пользователем);
- но
is_category_confirmedу транзакции устанавливается вFALSE.
- Если
requires_confirmation = FALSE(по умолчанию):- правило присваивает категорию и
is_category_confirmed = TRUE.
- правило присваивает категорию и
Результат:
- Транзакции, категоризированные правилами с
requires_confirmation = TRUE, визуально подсвечиваются в истории как требующие внимания. - Пользователь может:
- подтвердить категорию (
is_category_confirmedстановитсяTRUE); - изменить категорию и при желании создать новое правило.
- подтвердить категорию (
Дополнительно:
- Для таких транзакций (например, маркетплейсы) полезно поле
comment, куда пользователь может записать, что конкретно было куплено (например, "корм для Арчи", "мебель", "одежда").
Применение правил к прошлым транзакциям
В интерфейсе управления правилами (отдельный раздел SPA) для каждого правила может быть доступна опция:
- "Применить правило к прошлым транзакциям".
При активации этой опции backend:
- находит все транзакции, подходящие под данное правило,
у которых
category_id IS NULLилиis_category_confirmed = FALSE; - проставляет им
category_id; - устанавливает
is_category_confirmed = FALSE(категория считается предварительной).
Транзакции с is_category_confirmed = TRUE не затрагиваются — пользовательские подтверждения неприкосновенны.
Пользователь может затем:
- отфильтровать операции по
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.
- передаются новые значения