namespace Tnsu.ApprovalRoute.Application.Reports; /// /// Отчёт по вакансиям за период — ровно то, что ложится на лист «Список вакансий /// (все)» в xlsx: интервал плюс вакансии, разбитые по объектам/проектам. /// public sealed record VacancyReport(DateOnly From, DateOnly To, IReadOnlyList Groups); /// /// Объект/проект и его вакансии. Имя группы становится строкой-разделителем на /// листе (как «КЭС КУРЧАТОВ» в образце отчёта); пустое имя — вакансии, у которых /// объект в заявке не указан, они идут первым блоком без разделителя. /// public sealed record VacancyReportGroup(string Name, IReadOnlyList Rows); /// /// Одна вакансия — строка листа. Колонки A/B (нумерация), G (в работе), J (срок /// отработки) и итоги здесь не хранятся: их считает сам xlsx формулами, чтобы /// цифры пересчитывались, если строку в файле поправят руками. /// public sealed record VacancyReportRow( // C — «Вакансия»: должность из заявки на подбор. string Position, // D — «Подразделение» ответственного за подачу заявки. string? Department, // E — «Кол-во вакансий». int VacanciesCount, // F — «количество закрытых вакансий»: сколько заявок на приём завели по этой заявке на подбор. int ClosedCount, // H — «Дата подачи заявки». DateOnly? SubmitDate, // I — «Дата закрытия вакансии»: дата решения по последнему шагу исполнения. DateOnly? ClosingDate, // K — «Дата выхода»: самая поздняя дата приёма среди принятых по этой вакансии. DateOnly? StartDate, // L — «Инициатор заявки». string? Initiator, // M — «Вместо сотрудника Ф.И.О.». string? ReplacedEmployee, // O — «Закрыта вакансия»: да / нет / частично. string ClosedFlag, // P — «Рекрутер»: исполнитель фазы исполнения заявки на подбор. string? Recruiter); /// Значения колонки O. «Пауза» из образца отчёта не выводится — такого статуса в заявке нет. public static class VacancyClosedFlags { public const string Yes = "да"; public const string No = "нет"; public const string Partial = "частично"; }