ad62ac96ac
Шаг маршрута получает флаг «Автосогласование» (AutoApprove). Когда у активной строки такого шага истекает SLA, часовая задача Hangfire принимает за согласующего положительное решение: помечает строку, двигает очередь и пересчитывает статус заявки — тем же набором правил, что и портал, когда решение принимает человек (зеркало approverDecision.service.ts/decide). Флаг не nullable, в отличие от SLA рядом: наследовать его неоткуда — у типа заявки такого поля нет и быть не должно. - ApprovalRow и константы статусов переехали в общий Approvals: их теперь читают и напоминания, и автосогласование, разъезжаться разбору одного и того же списка нельзя; - SharePointClient научился MERGE'ить элементы (раньше умел только читать). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
31 lines
1.7 KiB
C#
31 lines
1.7 KiB
C#
namespace Tnsu.ApprovalRoute.Application.Approvals;
|
|
|
|
/// <summary>
|
|
/// Конвенция имён списков портала заявок: у каждой пары списков имя данных и имя
|
|
/// согласования отличаются только суффиксом после длинного тире (см.
|
|
/// Get-NumberedListTitle в request-portal/provisioning/Provision-Lists.ps1 —
|
|
/// именно провижинер эти имена и ставит).
|
|
///
|
|
/// Отдельным классом, а не приватным методом сервиса: правило нужно и
|
|
/// напоминаниям (ReminderService), и автосогласованию (AutoApproveService), и
|
|
/// разъехаться между ними оно не должно — переименование одного списка из пары
|
|
/// молча оставило бы один из сценариев без строк.
|
|
/// </summary>
|
|
internal static class ApprovalListNaming
|
|
{
|
|
/// <summary>
|
|
/// «Заявка на приём 1 — данные» → «Заявка на приём 1 — согласование».
|
|
/// null — имя не по конвенции, список согласования по нему не найти.
|
|
/// </summary>
|
|
public static string? ApprovalListTitleFor(string dataListTitle)
|
|
{
|
|
var index = dataListTitle.LastIndexOf('—');
|
|
if (index < 0) return null;
|
|
|
|
var suffix = dataListTitle[(index + 1)..].Trim();
|
|
return suffix.Equals("данные", StringComparison.OrdinalIgnoreCase)
|
|
? $"{dataListTitle[..index].TrimEnd()} — согласование"
|
|
: null;
|
|
}
|
|
}
|