feat: замещение пользователей (substitution) — заместители по умолчанию и по формам, контур ознакомления, inbox reasons
- таблица user_delegations (миграция 0067) + колонки delegated_from_user_id/pending_review в task_assignees - delegation.service: резолвер с цепочкой и защитой от циклов, bulk-до-назначение чанками, чистка истёкших замещений - центральный хук в addTaskAssignee: заместитель добавляется при любом назначении (ручном, автопереходе, user-поле, MCP) - контур ознакомления: после перехода отсутствующий остаётся в исполнителях с pending_review, снимается кнопкой «Ознакомлен» - inbox reasons delegation/delegation_review + фильтр «Замещение» на главной - блок «Замещение» в профиле пользователя, бейдж «за <имя>» и баннер ознакомления в карточке задачи
This commit is contained in:
25
migrations/0067_user_delegations.sql
Normal file
25
migrations/0067_user_delegations.sql
Normal file
@@ -0,0 +1,25 @@
|
||||
-- Замещение пользователей (delegation/substitution, референс — Pyrus).
|
||||
-- user_delegations: кто кого замещает, на какой период и (опционально) по какой форме.
|
||||
-- form_id IS NULL — заместитель по умолчанию для всех форм.
|
||||
CREATE TABLE IF NOT EXISTS user_delegations (
|
||||
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,
|
||||
delegate_user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||||
form_id INTEGER REFERENCES forms(id) ON DELETE CASCADE,
|
||||
date_from DATE NOT NULL,
|
||||
date_to DATE NOT NULL,
|
||||
is_active BOOLEAN NOT NULL DEFAULT TRUE,
|
||||
created_by INTEGER REFERENCES users(id) ON DELETE SET NULL,
|
||||
created_at TIMESTAMP DEFAULT NOW()
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS user_delegations_user_active_idx ON user_delegations(user_id, is_active);
|
||||
CREATE INDEX IF NOT EXISTS user_delegations_org_idx ON user_delegations(organization_id);
|
||||
|
||||
-- task_assignees: признак строки заместителя (delegated_from_user_id — кого замещает)
|
||||
-- и флаг «на ознакомлении» (pending_review — отсутствующий вернулся в задачу после перехода).
|
||||
ALTER TABLE task_assignees
|
||||
ADD COLUMN IF NOT EXISTS delegated_from_user_id INTEGER REFERENCES users(id) ON DELETE CASCADE;
|
||||
ALTER TABLE task_assignees
|
||||
ADD COLUMN IF NOT EXISTS pending_review BOOLEAN NOT NULL DEFAULT FALSE;
|
||||
Reference in New Issue
Block a user