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