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