feat: Ербол Шаймерденов правит все поля и вложения заявки на рабочее место

Полное право правки стало раздельным по формам: раньше общий список открыл
бы Ерболу и подбор с приёмом. В «Организации рабочего места» право действует,
пока он есть в маршруте (согласование или исполнение) и заявка «На
согласовании» или «Выполнение», независимо от того, чья сейчас очередь.
Правки пишутся в журнал (подсветка «Было: …»), перед «Согласовать»
проверяются обязательные поля. Блок вложений вынесен в общий компонент.

Нужна новая колонка WorkplaceApproverChangesJson в списке данных.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Тимур Городецкий
2026-10-07 12:08:25 +05:00
parent 2ade16ce1d
commit cfbca8c2b2
16 changed files with 301 additions and 106 deletions
@@ -1,21 +1,25 @@
import { RequestTypeId } from '../../models/types';
/**
* Кто на СВОЁМ АКТИВНОМ шаге согласования может править ВСЕ поля заявки
* (а не только отдельные, как расчётная группа в RecruitingHire).
*
* Пока фиксированный email одного человека (Алтынай Бултурукова, начальник
* отдела подбора и адаптации персонала) — группы SharePoint для этого ещё
* нет, как и в routeEditRights.ts. ВРЕМЕННО.
* Пока фиксированные email по формам — групп SharePoint для этого ещё нет,
* как и в routeEditRights.ts. ВРЕМЕННО. Список свой у каждой формы: право в
* одной форме не должно молча открывать правку в другой.
*
* Подключено только в «Заявке на подбор» и «Заявке на прием» (Реферальная
* рекомендация — нет, по решению Тимура 2026-09-24). С 2026-10-06 право
* открывает и вложения: добавлять и удалять файлы (см. shared/attachments/
* useAttachmentEditor).
* Реферальная рекомендация — без права (решение Тимура 2026-09-24). С
* 2026-10-06 право открывает и вложения: добавлять и удалять файлы (см.
* shared/attachments/useAttachmentEditor).
*/
const FULL_FIELD_EDITOR_EMAILS: ReadonlySet<string> = new Set([
'a.bulturukova@tnsu.kz' // Алтынай Бултурукова
]);
const FULL_FIELD_EDITORS: Partial<Record<RequestTypeId, ReadonlyArray<string>>> = {
'recruiting-selection': ['a.bulturukova@tnsu.kz'], // Алтынай Бултурукова
'recruiting-hire': ['a.bulturukova@tnsu.kz'], // Алтынай Бултурукова
'it-workplace-setup': ['shaimerdenov.yerbol@tnsu.kz'] // Ербол Шаймерденов
};
/** Может ли этот email править все поля заявки на своём активном шаге (см. выше). */
export function canEditAllFields(email: string | undefined): boolean {
return !!email && FULL_FIELD_EDITOR_EMAILS.has(email.trim().toLowerCase());
/** Может ли этот email править все поля заявки этой формы на своём активном шаге (см. выше). */
export function canEditAllFields(formId: RequestTypeId, email: string | undefined): boolean {
const editors = FULL_FIELD_EDITORS[formId];
return !!email && !!editors && editors.indexOf(email.trim().toLowerCase()) !== -1;
}