Files
iistwin/migrations/0078_user_field_history.sql
Ильяс Султанов 4d65049e02 feat: рейтинговые автоматизации, мультивыбор user/role-полей, график history-number
Инфраструктура автоматизаций:
- триггер task.status_changed оживлён: вызов из executeTaskTransition (fire-and-forget) + фильтр triggerConfig.statusId
- ctx.users.setFieldValue(userId, fieldCodeOrId, value): запись user_profile_field_values с аудитом; для history-number — append в user_field_history (миграция 0078)
- документация sandbox обновлена (Automations.tsx, mcp.ts, AGENTS.md) по критическому правилу 2

Мультивыбор пользователей и ролей в user-поле:
- чекбокс «Множественный выбор (пользователи и роли)» в настройках поля (form_fields.allow_multiple)
- значение — массив ['user:ID','role:ID'], обратная совместимость с одиночными/legacy значениями
- UserRoleMultiSelect в карточке задачи, реестре и диалоге создания (роли добавлены и в одиночный сценарий создания)
- синк в task_assignees итерирует массив; role:ID раскрывается в членов роли; PATCH single — diff старого/нового значений
- отображение массивов: реестр, title-шаблоны, условия полей, MCP update_task_fields
- список орг-ролей (/api/roles) загружается всем пользователям (сервер и так был открыт) — роли доступны не только админам

График history-number в профиле:
- GET /api/users/:id/field-history/:fieldId?period=week|month|quarter|year (агрегация AVG по бакетам)
- диалог с LineChart (recharts) и переключателем периодов по клику на иконку у поля
2026-09-04 19:39:10 +03:00

18 lines
1022 B
SQL

-- История числовых значений пользовательских полей типа history-number.
-- Заполняется автоматизациями через ctx.users.setFieldValue (рейтинги, оценки и т.п.).
-- task_id — задача, из которой выставлена оценка (может быть NULL).
CREATE TABLE IF NOT EXISTS user_field_history (
id serial PRIMARY KEY,
organization_id integer NOT NULL REFERENCES organizations(id) ON DELETE CASCADE,
user_id integer NOT NULL REFERENCES users(id) ON DELETE CASCADE,
field_id integer NOT NULL REFERENCES user_profile_fields(id) ON DELETE CASCADE,
value numeric NOT NULL,
task_id integer REFERENCES tasks(id) ON DELETE SET NULL,
created_at timestamp DEFAULT now()
);
CREATE INDEX IF NOT EXISTS user_field_history_user_field_created_idx
ON user_field_history (user_id, field_id, created_at);
CREATE INDEX IF NOT EXISTS user_field_history_org_idx
ON user_field_history (organization_id);