Files
iistwin/migrations/0067_user_delegations.sql
Ильяс Султанов 667bddeac9 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 + фильтр «Замещение» на главной
- блок «Замещение» в профиле пользователя, бейдж «за <имя>» и баннер ознакомления в карточке задачи
2026-08-05 10:44:55 +03:00

26 lines
1.6 KiB
SQL

-- Замещение пользователей (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;