using Tnsu.ApprovalRoute.Domain.Enums; namespace Tnsu.ApprovalRoute.Domain.Entities; public class TemplateRouteStep { public int Id { get; set; } public int OrderNo { get; set; } public string? ExecutorEmail { get; set; } public string? Position { get; set; } public ProjectRole? ProjectRole { get; set; } public HeadType? HeadType { get; set; } public RouteStepStatus Status { get; set; } = RouteStepStatus.Approval; public int RouteId { get; set; } public bool AllowReassignToOtherApprovers { get; set; } /// /// SLA этого шага в часах — перекрывает . /// null означает ИМЕННО «не задано, наследовать от типа заявки», а 0 — /// осознанное «напоминать сразу», поэтому поле обязано быть nullable и не /// должно получать значение по умолчанию. /// public int? SlaHours { get; set; } /// /// Спрашивать ли причину просрочки на этом шаге — перекрывает /// . Здесь тоже три состояния: /// null — наследовать от типа, true/false — явный выбор. /// public bool? AskOverdueReason { get; set; } /// /// Согласовывать шаг автоматически, когда истёк его SLA (см. ). /// /// Не nullable, в отличие от SLA-полей рядом: наследовать тут нечего — у типа /// заявки такого «значения по умолчанию» нет и быть не должно (включить /// автосогласование сразу всем шагам типа — не настройка, а авария), поэтому /// три состояния не нужны, хватает обычного «включено/выключено». /// /// Действует только вместе с SLA: без действующего SLA (ни на шаге, ни на типе /// заявки) отсчитывать нечего, и фоновая задача такой шаг пропускает /// (см. AutoApproveService). /// public bool AutoApprove { get; set; } /// Как объединяются между собой — не действует, если условий меньше двух. public ConditionsLogic ConditionsLogic { get; set; } = ConditionsLogic.And; /// Условия появления шага. Пусто — шаг применяется всегда. public List Conditions { get; set; } = []; public TemplateRoute? Route { get; set; } }