Обходной лист (#7)
Tests / frontend-test (push) Successful in 1m16s

Co-authored-by: gorbenko.pavel <gorbenko.pavel@tansu.kz>
Reviewed-on: http://git.tnsu.kz/timur.gorodetskiy/request-portal/pulls/7
This commit was merged in pull request #7.
This commit is contained in:
2026-08-17 05:43:38 +00:00
parent a937e33f2e
commit 364835eaf7
47 changed files with 1962 additions and 359 deletions
@@ -4,6 +4,21 @@ import { FLOW_RESOURCE, FLOW_NOTIFY_URL } from '../config';
import { ApprovalListService } from './approvalList.service';
import { REQUEST_STATUS } from './models/statuses';
/**
* ВРЕМЕННАЯ ЗАГЛУШКА на период обкатки рассылки: уведомление отправляется,
* только если активный шаг назначен на этот адрес. Для всех остальных
* согласующих поток не вызывается вообще — письма не будет.
*
* Ограничение стоит ЗДЕСЬ, на стороне портала, а не в потоке Power Automate,
* потому что адресата поток определяет САМ по RowID — тело запроса на выбор
* получателя не влияет. Значит, единственный способ не отправить письмо, не
* трогая поток, — не дёргать его. Переадресовать письмо на тестовый ящик
* отсюда нельзя по той же причине: поток такого параметра не принимает.
*
* Пустая строка — заглушка снята, уведомления идут всем как обычно.
*/
const NOTIFY_ONLY_TO = 'gorbenko.pavel@tnsu.kz';
// Данные формы для тела запроса к потоку (постоянны для формы).
export interface INotifyTarget {
requestTypeId: number; // RequestTypeId (id типа заявки во внешнем API маршрутов)
@@ -27,6 +42,24 @@ async function postNotify(context: WebPartContext, body: Record<string, unknown>
}
}
// Разрешена ли отправка на согласующего активной строки (см. NOTIFY_ONLY_TO).
//
// Неизвестный адрес (пользователь не найден, поле пустое, запрос упал) —
// НЕ отправляем: пока заглушка включена, сомнение трактуется в пользу
// «письмо живому человеку лучше не слать», а не наоборот.
async function isNotifyAllowed(approval: ApprovalListService, approverId: number): Promise<boolean> {
if (!NOTIFY_ONLY_TO) return true;
const email = await approval.resolveUserEmail(approverId);
if (email.toLowerCase() === NOTIFY_ONLY_TO.toLowerCase()) return true;
console.warn(
`[Оповещение] Включена заглушка рассылки: письмо для «${email || 'адрес неизвестен'}» не отправлено ` +
`(разрешён только ${NOTIFY_ONLY_TO})`
);
return false;
}
// Находит АКТИВНЫЙ шаг маршрута (На согласовании / На исполнении) и уведомляет его.
// Вызывать после отправки заявки и после каждого положительного решения. Поток по
// переданным полям сам находит согласующего/исполнителя и шлёт уведомление.
@@ -45,6 +78,9 @@ export async function notifyActiveStep(
if (!active) {
return;
}
if (!(await isNotifyAllowed(approval, active.approverId))) {
return;
}
await postNotify(context, {
RequestTypeId: target.requestTypeId,
RowID: active.id,