using Tnsu.ApprovalRoute.Domain.Enums; namespace Tnsu.ApprovalRoute.Application.TemplateRoutes; /// /// ДЕЙСТВУЮЩИЙ SLA шага в часах — наследование уже применено: значение шага, а /// если на шаге не задано, то значение типа заявки. null означает, что SLA не /// настроен нигде, то есть напоминаний по этому шагу не будет. /// Резолв отдаёт именно итоговое значение, чтобы вызывающая сторона /// (request-portal) просто записала его в строку списка согласования и не /// повторяла у себя правило наследования. /// /// /// Спрашивать ли причину просрочки — так же с уже применённым наследованием. /// /// /// HeadType шага (Chief/DirectionHead/DirectorTansu/ManagingDirectorTansu/DepartmentHead), /// если исполнитель задан типом руководителя, иначе null. В отличие от /// (реальная должность резолвнутого сотрудника из справочника api.tnsu.kz — свободный /// текст), это код роли из самого шага маршрута — чтобы вызывающая сторона могла отличить, /// например, «директора Tansu» от «руководителя направления», не разбирая Position текстом. /// /// /// Согласовать шаг автоматически по истечении SLA. Значение шага маршрута как есть — /// наследовать его неоткуда (у типа заявки такого поля нет, см. /// TemplateRouteStep.AutoApprove). Вызывающая сторона (request-portal) просто /// переносит его в строку списка согласования: решает по нему не она, а фоновая /// задача бэкенда (AutoApproveService). /// public sealed record ResolvedRouteStepDto( int Id, int OrderNo, string? ExecutorEmail, string? Position, bool AllowReassignToOtherApprovers, string? Warning = null, int? SlaHours = null, bool? AskOverdueReason = null, HeadType? PositionCode = null, bool AutoApprove = false); public sealed record ResolveTemplateRouteResultDto( int RouteId, bool RequiresControl, IReadOnlyList Steps); /// Значение поля списка SharePoint (field_name шага) для проверки условий шагов при resolve. public sealed record ResolveFieldValueDto(string FieldName, string Value); /// /// Отдел для шагов с HeadType.DepartmentHead ("руководитель указанного отдела") — /// не выводится из инициатора, поэтому должен быть передан явно. Необязателен: /// если в маршруте нет такого шага, поле не нужно; если есть, а поле не /// передано — шаг не резолвится и получает предупреждение (см. /// TemplateRouteService.ResolveStepAsync), весь запрос при этом не падает. /// public sealed record ResolveTemplateRouteRequest( int RequestTypeId, string? UserEmail, Guid? ProjectId, RouteStepStatus Status, IReadOnlyList? FieldValues = null, Guid? DepartmentId = null);