using System.Text.Json; namespace Tnsu.ApprovalRoute.Application.Reminders; /// /// Строка списка «Прием на работу — данные», разобранная из ответа SharePoint. /// Имена колонок — как в request-portal (provisioning.json формы RecruitingHire). /// internal sealed record HireRow( int Id, string Status, string? CandidateName, DateTimeOffset? HireDate, string? ProbationPeriod, string? RequestUniqueCode) { public static HireRow? TryParse(JsonElement item) { if (!item.TryGetProperty("Id", out var idProp) || !idProp.TryGetInt32(out var id)) return null; return new HireRow( id, GetString(item, "RequestStatus") ?? string.Empty, GetString(item, "CandidateName"), TryGetDate(item, "HireDate"), GetString(item, "ProbationPeriod"), GetString(item, "RequestUniqueCode")); } private static string? GetString(JsonElement e, string name) => e.TryGetProperty(name, out var v) && v.ValueKind == JsonValueKind.String ? v.GetString() : null; private static DateTimeOffset? TryGetDate(JsonElement e, string name) => e.TryGetProperty(name, out var v) && v.ValueKind == JsonValueKind.String && DateTimeOffset.TryParse(v.GetString(), out var parsed) ? parsed : null; } /// Статусы списка данных («… — данные», колонка RequestStatus) — считаем приём завершённым по ним. internal static class HireRequestStatuses { public const string Approved = "Согласовано"; public const string Closed = "Закрыта"; }