Auto approve (#21)
Tests / frontend-test (push) Successful in 46s
Tests / backend-test (push) Successful in 3m39s

Co-authored-by: gorbenko.pavel <gorbenko.pavel@tansu.kz>
Reviewed-on: http://git.tnsu.kz/gorbenko.pavel/tnsu-approval-route/pulls/21
This commit was merged in pull request #21.
This commit is contained in:
2026-09-14 09:01:56 +00:00
parent e2b6227015
commit 2b8fe77fac
24 changed files with 1443 additions and 29 deletions
@@ -0,0 +1,40 @@
namespace Tnsu.ApprovalRoute.Application.Approvals;
public sealed class AutoApproveOptions
{
/// <summary>
/// Включено ли автосогласование вообще. Выключение снимает рекуррентную задачу
/// из Hangfire (см. Program.cs), а не просто делает её пустой: иначе в дашборде
/// осталась бы задача, которая регулярно запускается и ничего не делает.
/// </summary>
public bool Enabled { get; set; } = true;
/// <summary>
/// Расписание запуска (cron, UTC). Раз в час: SLA задаётся в ЧАСАХ, поэтому
/// час — предельная точность, которая вообще имеет смысл, а более частый опрос
/// всех списков SharePoint ничего не ускоряет по существу.
///
/// Следствие: шаг согласуется не в сам момент истечения SLA, а на ближайшем
/// запуске после него — то есть в пределах часа позже. Это осознанно: раньше
/// срока не согласуется никогда, а опоздание в пределах часа для срока,
/// измеряемого часами, роли не играет.
/// </summary>
public string Cron { get; set; } = "0 * * * *";
/// <summary>
/// Комментарий, который задача пишет в строку согласования вместо комментария
/// согласующего. Нужен, чтобы в матрице заявки было видно, что решение принял не
/// человек: других признаков у автосогласованной строки нет — статус и дата у неё
/// такие же, как у обычной.
/// </summary>
public string Comment { get; set; } = "Согласовано автоматически: истёк срок SLA по этому шагу.";
/// <summary>
/// Сколько строк автосогласовать максимум за один запуск. Предохранитель на
/// случай массового включения флага или сдвига дат: без него один запуск мог бы
/// пройти по всему архиву партиций и написать в SharePoint тысячи изменений,
/// упёршись в троттлинг. Остаток уедет в следующий запуск — задача идемпотентна
/// (уже решённые строки в выборку активных не попадают).
/// </summary>
public int MaxRowsPerRun { get; set; } = 200;
}