using System.Text.Json; namespace Tnsu.ApprovalRoute.Application.Reports; /// /// Строка списка «Заявка на подбор — данные». Имена колонок — как в request-portal /// (provisioning.json формы RecruitingSelection). /// internal sealed record SelectionRow( int Id, string ListId, string Status, string? Position, string? DepartmentName, string? ObjectProject, int VacanciesCount, DateOnly? SubmitDate, string? Initiator, string? OpenReason, string? OpenReasonDetails) { /// /// Поля, которые нужны отчёту, — перечислены явно: список данных широкий /// (полсотни колонок, часть — Note с многострочным текстом), и тянуть его /// целиком по всем партициям только ради шестнадцати колонок незачем. /// public const string Select = "$select=Id,RequestStatus,Position,DepartmentName,ObjectProject,OpenVacanciesCount," + "SubmitDate,Created,VacancyOpenReason,VacancyOpenReasonDetails,Responsible/Title&$expand=Responsible&$top=5000"; public static SelectionRow? TryParse(JsonElement item, string listId) { var id = SharePointJson.Int(item, "Id"); if (id is null) return null; return new SelectionRow( id.Value, listId, SharePointJson.String(item, "RequestStatus") ?? string.Empty, SharePointJson.String(item, "Position"), SharePointJson.String(item, "DepartmentName"), SharePointJson.String(item, "ObjectProject"), // Пустое «Количество открытых вакансий» — это одна вакансия: заявку // подают на конкретную должность, и ноль вакансий в отчёте сломал бы // и итог по колонке E, и признак «закрыта» (0 из 0). SharePointJson.Int(item, "OpenVacanciesCount") is { } count and > 0 ? count : 1, // Дата подачи — поле формы, заполняется руками и может быть пустым; // тогда берём дату создания элемента. Тем же правилом заявки // отбираются по интервалу (см. VacancyReportService.PeriodFilter) — // иначе заявка попадала бы в отчёт, но с пустой колонкой H. SharePointJson.Date(item, "SubmitDate") ?? SharePointJson.Date(item, "Created"), SharePointJson.PersonTitle(item, "Responsible"), SharePointJson.String(item, "VacancyOpenReason"), SharePointJson.String(item, "VacancyOpenReasonDetails")); } }