feat: сводный лист «Результаты» с диаграммами в отчёте по вакансиям

Второй лист xlsx по образцу ручного отчёта HR: горизонтальная таблица
по рекрутёрам (всего/в работе %/закрыто %) и две вертикальные таблицы
с долей каждого рекрутёра в общем объёме и в объёме "в работе" — плюс
по круговой диаграмме на каждую (VacancyReportSummary,
VacancyReportWorkbook.BuildSummarySheet).

Библиотека для xlsx сменена с ClosedXML на NPOI: у ClosedXML нет
поддержки Excel-диаграмм вовсе, только у NPOI из бесплатных вариантов
она есть (XSSFChart/DataSources из NPOI.OOXML). Переписан весь
генератор, тесты читают файл обратно тем же NPOI. Заодно запинена
System.Security.Cryptography.Xml до 10.0.11 — версия, которую тянет
NPOI транзитивно (8.0.2), с известной уязвимостью.

Вакансии без рекрутёра сведены в «Без рекрутёра» и всегда идут в
таблицах последними — не участник рейтинга, а технический хвост.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
gorbenko.pavel
2026-08-28 11:12:45 +05:00
parent 24d2cd7a6a
commit 4dac12302c
5 changed files with 657 additions and 188 deletions
@@ -4,8 +4,8 @@
<ProjectReference Include="..\Tnsu.ApprovalRoute.Infrastructure\Tnsu.ApprovalRoute.Infrastructure.csproj" />
</ItemGroup>
<ItemGroup>
<!-- Генерация xlsx для отчётов (Reports/) — стили, формулы, autofilter. -->
<PackageReference Include="ClosedXML" />
<!-- Генерация xlsx для отчётов (Reports/) — стили, формулы, autofilter, диаграммы. -->
<PackageReference Include="NPOI" />
<PackageReference Include="FluentResults" />
<PackageReference Include="FluentValidation" />
<PackageReference Include="FluentValidation.DependencyInjectionExtensions" />