namespace Tnsu.ApprovalRoute.Application.Approvals; public sealed class AutoApproveOptions { /// /// Включено ли автосогласование вообще. Выключение снимает рекуррентную задачу /// из Hangfire (см. Program.cs), а не просто делает её пустой: иначе в дашборде /// осталась бы задача, которая регулярно запускается и ничего не делает. /// public bool Enabled { get; set; } = true; /// /// Расписание запуска (cron, UTC). Раз в час: SLA задаётся в ЧАСАХ, поэтому /// час — предельная точность, которая вообще имеет смысл, а более частый опрос /// всех списков SharePoint ничего не ускоряет по существу. /// /// Следствие: шаг согласуется не в сам момент истечения SLA, а на ближайшем /// запуске после него — то есть в пределах часа позже. Это осознанно: раньше /// срока не согласуется никогда, а опоздание в пределах часа для срока, /// измеряемого часами, роли не играет. /// public string Cron { get; set; } = "0 * * * *"; /// /// Комментарий, который задача пишет в строку согласования вместо комментария /// согласующего. Нужен, чтобы в матрице заявки было видно, что решение принял не /// человек: других признаков у автосогласованной строки нет — статус и дата у неё /// такие же, как у обычной. /// public string Comment { get; set; } = "Согласовано автоматически: истёк срок SLA по этому шагу."; /// /// Сколько строк автосогласовать максимум за один запуск. Предохранитель на /// случай массового включения флага или сдвига дат: без него один запуск мог бы /// пройти по всему архиву партиций и написать в SharePoint тысячи изменений, /// упёршись в троттлинг. Остаток уедет в следующий запуск — задача идемпотентна /// (уже решённые строки в выборку активных не попадают). /// public int MaxRowsPerRun { get; set; } = 200; }