24d2cd7a6a
GET api/reports/vacancies?from=&to= отдаёт лист «Список вакансий (все)» по образцу ручного отчёта HR: те же шестнадцать колонок, разделители по объектам, двойная нумерация, итоги формулами. Данные — из двух форм портала: «Заявка на подбор» даёт вакансию, «Приём на работу» — её закрытие (связь по SelectionRequestId + SelectionRequestListId). Рекрутёр и дата закрытия берутся из фазы «Исполнение» парного списка «— согласование»: в самой заявке их нет. Период отбирает заявки по «Дате подачи заявки» с откатом на Created — поле заполняется руками и часто пустое. Заявки на приём периодом не ограничены: приём по вакансии из начала интервала мог оформляться уже после его конца. Колонка «Комментарии» остаётся пустой — в ручном отчёте это пометки рекрутёра, которым в заявках пока негде храниться. Генерация — ClosedXML (MIT): нужны стили, формулы и autofilter, а EPPlus с v5 под Polyform Noncommercial. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
36 lines
1.4 KiB
C#
36 lines
1.4 KiB
C#
using System.Text.Json;
|
|
|
|
namespace Tnsu.ApprovalRoute.Application.Reports;
|
|
|
|
/// <summary>
|
|
/// Строка списка «Прием на работу — данные» в том объёме, в каком она нужна отчёту:
|
|
/// на какую заявку на подбор ссылается, кого и когда приняли.
|
|
/// </summary>
|
|
internal sealed record HireLinkRow(
|
|
int SelectionRequestId,
|
|
string? SelectionRequestListId,
|
|
string Status,
|
|
string? CandidateName,
|
|
string? ReplacedEmployee,
|
|
DateOnly? HireDate)
|
|
{
|
|
public const string Select =
|
|
"$select=Id,RequestStatus,SelectionRequestId,SelectionRequestListId," +
|
|
"CandidateName,ReplacedEmployee,HireDate&$top=5000";
|
|
|
|
/// <summary>Заявка на приём без ссылки на подбор отчёту бесполезна — её отбрасываем.</summary>
|
|
public static HireLinkRow? TryParse(JsonElement item)
|
|
{
|
|
var selectionId = SharePointJson.Int(item, "SelectionRequestId");
|
|
if (selectionId is null or <= 0) return null;
|
|
|
|
return new HireLinkRow(
|
|
selectionId.Value,
|
|
SharePointJson.String(item, "SelectionRequestListId"),
|
|
SharePointJson.String(item, "RequestStatus") ?? string.Empty,
|
|
SharePointJson.String(item, "CandidateName"),
|
|
SharePointJson.String(item, "ReplacedEmployee"),
|
|
SharePointJson.Date(item, "HireDate"));
|
|
}
|
|
}
|