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; }
}