82c2dc36a6
В списке «Заявка на подбор — данные» колонки называются VacancyOpenReason и VacancyOpenReasonDetails; запрос с несуществующими OpenReason* падал, ошибка партиции глушилась в лог, и отчёт возвращался пустым. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> --------- Co-authored-by: gorbenko.pavel <gorbenko.pavel@tansu.kz> Reviewed-on: http://git.tnsu.kz/gorbenko.pavel/tnsu-approval-route/pulls/26
57 lines
2.9 KiB
C#
57 lines
2.9 KiB
C#
using System.Text.Json;
|
|
|
|
namespace Tnsu.ApprovalRoute.Application.Reports;
|
|
|
|
/// <summary>
|
|
/// Строка списка «Заявка на подбор — данные». Имена колонок — как в request-portal
|
|
/// (provisioning.json формы RecruitingSelection).
|
|
/// </summary>
|
|
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)
|
|
{
|
|
/// <summary>
|
|
/// Поля, которые нужны отчёту, — перечислены явно: список данных широкий
|
|
/// (полсотни колонок, часть — Note с многострочным текстом), и тянуть его
|
|
/// целиком по всем партициям только ради шестнадцати колонок незачем.
|
|
/// </summary>
|
|
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"));
|
|
}
|
|
}
|