промежуточный коммит
Tests / frontend-test (pull_request) Successful in 47s
Tests / backend-test (pull_request) Successful in 1m34s

This commit is contained in:
gorbenko.pavel
2026-08-26 17:17:47 +05:00
parent 19a46b0df8
commit 874e41990c
12 changed files with 640 additions and 3 deletions
@@ -0,0 +1,46 @@
using System.Text.Json;
namespace Tnsu.ApprovalRoute.Application.Reminders;
/// <summary>
/// Строка списка «Прием на работу — данные», разобранная из ответа SharePoint.
/// Имена колонок — как в request-portal (provisioning.json формы RecruitingHire).
/// </summary>
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;
}
/// <summary>Статусы списка данных («… — данные», колонка RequestStatus) — считаем приём завершённым по ним.</summary>
internal static class HireRequestStatuses
{
public const string Approved = "Согласовано";
public const string Closed = "Закрыта";
}