using Rugrid.Sdaid.Notation.Documents;
using Rugrid.Sdaid.Notation.Glossary;
using Rugrid.Sdaid.Epas.Ntr.Glossary.Terms;
namespace Rugrid.Sdaid.Epas.Ntr.Epics.ActualConsumption
{
/// <summary>
/// Учёт фактического потребления ТЭР зданиями: структура хранения данных учёта, загрузка из
/// АИС ОИА ПЭО, просмотр на UI. Эпик второго этапа, реализует требование ТЗ 5.7.
/// </summary>
public class EPIC_ActualConsumption : IEpicDocument, IHasStructuralLinks
{
public SdaidLink[] Links => new[]
{
Rel.Realizes<Rugrid.Sdaid.Epas.Ntr.Requirements.FR_5_7_ActualConsumption>(),
Rel.Uses<Rugrid.Sdaid.Epas.Ntr.Infrastructure.AisOiaPeo.DOC_AisDataImport>(),
Rel.Uses<Rugrid.Sdaid.Epas.Ntr.Domain.ActualConsumptionModel.BC_ActualConsumptionModel>(),
Rel.Uses<Rugrid.Sdaid.Epas.Ntr.Domain.BuildingModel.DOC_Building>(),
};
public static string _refName = "Эпик: учёт фактического потребления ТЭР";
public string Name => "Учёт фактического потребления ТЭР";
public string Description =>
@"Сервис хранит данные о фактическом потреблении зданиями электрической и тепловой энергии, загружает их из АИС ОИА ПЭО и показывает пользователю в интерфейсе.";
public string Version => "0.1";
public string Status => "draft";
public string[] Comments => new string[0];
public static string Goal = $"""
## Цель
Реализовать в Сервисе учёт фактического потребления ТЭР: данные о фактическом потреблении
загружаются из {GlossaryAnchors.RefTo<AisOiaPeo>(AisOiaPeo.Name)} и предоставляются для
просмотра пользователю в интерфейсе.
Эпик реализует {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Ntr.Requirements.FR_5_7_ActualConsumption>()}.
""";
public static string Scope = $"""
## Состав работ
### Спецификация
| Задача | Предмет | Зависит от |
|---|---|---|
| S-1 | {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Ntr.Epics.ActualConsumption.UseCases.UC_ActualConsumption>()} — сквозной сценарий на бизнес-уровне. Выполнено | — |
| S-2 | {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Ntr.Domain.ActualConsumptionModel.DOC_EeConsumption>()}, {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Ntr.Domain.ActualConsumptionModel.DOC_TeConsumption>()}, {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Ntr.Domain.Reference.DOC_Period>()}. Выполнено | — |
| S-3 | {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Ntr.Infrastructure.AisOiaPeo.DOC_ActualConsumptionImport>()}. Выполнено | S-2 |
| S-4 | {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Ntr.Ui.Componetns.DOC_ActualConsumptionTab>()} и макет. Выполнено, макет согласован | S-2 |
| S-5 | {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Ntr.Api.Endpoints.ActualConsumption.DOC_GetActualConsumptionEndpoint>()}, {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Ntr.Backend.Handlers.ActualConsumption.DOC_GetActualConsumptionHandler>()}. Выполнено | S-4 |
| S-6 | Дополнение {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Ntr.Ui.Componetns.DOC_ActualConsumptionTab>()} ссылками на endpoint. Выполнено | S-5 |
### Реализация backend
| Задача | Предмет | Зависит от |
|---|---|---|
| B-1 | Доменные сущности потребления ЭЭ и ТЭ, справочник учётных периодов | S-2 |
| B-2 | Конфигурации EF, миграция, индексы | B-1 |
| B-3 | Модели чтения таблиц данных учёта в `AisReadDbContext` (готова только `RefPeriod`), загрузка справочника учётных периодов и данных учёта в составе импорта | S-3, B-2 |
| B-4 | Модель чтения Сервиса, запрос просмотра, право доступа на чтение | S-5, B-2 |
| B-5 | Первичная загрузка учётных периодов за прошлые годы | B-3 |
### Реализация UI
| Задача | Предмет | Зависит от |
|---|---|---|
| U-1 | Вкладки «Расход ЭЭ» и «Расход ТЭ» на организационном объекте и на здании | S-6, B-4 |
""";
public static string OutOfScope = $"""
## Вне состава
**Отчёты.** Вывод фактического потребления в отчёты Сервиса в этом эпике не рассматривается.
**Точки учёта как сущность Сервиса.** Точки учёта существуют в
{GlossaryAnchors.RefTo<AisOiaPeo>(AisOiaPeo.Name)} и сводятся к зданию при загрузке; в
Сервисе они не хранятся и на экране не показываются.
**Ручной ввод и корректировка факта.** Единственный источник данных учёта —
{GlossaryAnchors.RefTo<AisOiaPeo>(AisOiaPeo.Name)}; в Сервисе факт только читается.
**Расчёты на основе факта.** Фактические данные не участвуют в расчёте модели потребления
и не влияют на класс энергоэффективности.
**Иные виды ТЭР.** Вода, газ и топливо в модуль не входят.
""";
public static string Actors = """
## Акторы
| Роль | Что делает |
|---|---|
| Администратор Сервиса | Запускает импорт данных из АИС ОИА ПЭО, в составе которого загружаются данные учёта |
| `user` (Пользователь) | Просматривает данные учёта на вкладках «Расход ЭЭ» и «Расход ТЭ» |
Роль администратора Сервиса среди ролей Сервиса не описана: команда импорта существует, но
ни за одной из трёх ролей не закреплена.
""";
public static string Acceptance = """
## Acceptance criteria
| AC | Критерий |
|---|---|
| AC-L1 | На организационном объекте вкладки «Расход ЭЭ» и «Расход ТЭ» показывают потребление соответствующего ресурса за выбранный период по его зданиям, а при включённом переключателе «с потомками» — и по зданиям подчинённых объектов |
| AC-L2 | На здании те же вкладки показывают потребление ресурса этим зданием |
| AC-L3 | При открытии вкладки выбран период — календарный год, предшествующий текущему |
| AC-L4 | По каждому зданию выведен итог за год |
| AC-L5 | Значения показаны в единицах источника: ЭЭ в тыс. кВт·ч, ТЭ в Гкал |
| AC-L6 | Здания, по которым за выбранный период нет данных учёта, в перечне отсутствуют |
| AC-L7 | Вкладка здания без данных учёта за выбранный период показывает пустой перечень, а не ошибку |
| AC-X1 | Повторный импорт тех же месяцев не создаёт вторых записей по тому же зданию, месяцу и виду ТЭР |
""";
}
}