Files
tnsu-approval-route/backend/Tnsu.ApprovalRoute.Application/Reports/SelectionRow.cs
T
gorbenko.pavel 82c2dc36a6
Tests / backend-test (push) Successful in 1m50s
Tests / frontend-test (push) Successful in 1m25s
Исправить имена колонок причины открытия вакансии в отчёте по вакансиям (#26)
В списке «Заявка на подбор — данные» колонки называются 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
2026-10-06 10:05:29 +00:00

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