using System.Text.Json; namespace Tnsu.ApprovalRoute.Application.Reports; /// /// Строка ФАЗЫ ИСПОЛНЕНИЯ из списка «Заявка на подбор — согласование». Отчёту она /// даёт две колонки, которых нет в самой заявке: рекрутёр (исполнитель шага) и /// дата закрытия вакансии. /// /// Дата закрытия — это колонка Date выполненной строки: request-portal /// перезаписывает её в момент решения по шагу (см. setDecision в /// shared/approval/approvalList.service.ts), так что у строки со статусом /// «Выполнено» там именно дата закрытия, а не дата получения шага в работу. /// internal sealed record ExecutionRow( int TicketId, int StepOrder, string Status, string? ExecutorName, DateOnly? Date) { public const string Select = $"$select=Id,TicketId,ApprovalStatus,StepOrder,Date,TansuSiteApprover/Title" + $"&$expand=TansuSiteApprover&$filter=Phase eq '{Phase}'&$top=5000"; private const string Phase = "Исполнение"; /// Статус выполненной строки исполнения — по нему считаем вакансию закрытой. public const string Done = "Выполнено"; public static ExecutionRow? TryParse(JsonElement item) { // TicketId — Lookup на заявку; без него строку не с чем связать. var ticketId = SharePointJson.Int(item, "TicketId"); if (ticketId is null) return null; return new ExecutionRow( ticketId.Value, SharePointJson.Int(item, "StepOrder") ?? 0, SharePointJson.String(item, "ApprovalStatus") ?? string.Empty, SharePointJson.PersonTitle(item, "TansuSiteApprover"), SharePointJson.Date(item, "Date")); } }