using Rugrid.Sdaid.Notation.Documents;
using Rugrid.Sdaid.Notation.Glossary;
using Rugrid.Sdaid.Epas.Ntr.Glossary.Terms;
using Rugrid.Sdaid.Epas.Ntr.Epics.ActualConsumption;
namespace Rugrid.Sdaid.Epas.Ntr.Epics.ActualConsumption.UseCases
{
/// <summary>
/// Сквозной сценарий эпика: данные учёта попадают из АИС ОИА ПЭО в Сервис и становятся видны
/// пользователю на вкладках расхода ЭЭ и ТЭ.
/// </summary>
public class UC_ActualConsumption : IUseCaseDocument, IHasStructuralLinks
{
public SdaidLink[] Links => new[]
{
Rel.Realizes<EPIC_ActualConsumption>(),
Rel.Uses<Rugrid.Sdaid.Epas.Ntr.Domain.ActualConsumptionModel.BC_ActualConsumptionModel>(),
Rel.Uses<Rugrid.Sdaid.Epas.Ntr.Domain.BuildingModel.DOC_Building>(),
Rel.Uses<Rugrid.Sdaid.Epas.Ntr.Domain.OrgObjectModel.DOC_OrgObject>(),
Rel.Uses<Rugrid.Sdaid.Epas.Ntr.Infrastructure.AisOiaPeo.DOC_AisDataImport>(),
};
public static string _refName = "Загрузка и просмотр данных учёта";
public string Name => "Загрузка данных учёта и их просмотр";
public string Description =>
"Администратор Сервиса загружает данные учёта из АИС ОИА ПЭО; пользователь смотрит потребление ресурса по зданиям организационного объекта или по зданию.";
public string PrimaryActor => "Пользователь";
public static string Intro = $"""
## Цель сценария
Учёт ведётся в {GlossaryAnchors.RefTo<AisOiaPeo>(AisOiaPeo.Name)} помесячно по точкам учёта
здания. Сценарий доводит месячные значения до пользователя Сервиса: загрузка переносит их в
Сервис, сводя точки учёта к
{SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Ntr.Domain.BuildingModel.DOC_Building>()}, просмотр
показывает потребление ресурса по зданиям организационного объекта или по одному зданию.
Два потока независимы по времени: загрузка выполняется очередным прогоном импорта, просмотр
— когда пользователю потребуются данные. Общего состояния между ними нет, только сами
данные учёта.
""";
public static string Flow1 = $"""
## Поток 1. Загрузка данных учёта
Актор — администратор Сервиса.
**Given** в {GlossaryAnchors.RefTo<AisOiaPeo>(AisOiaPeo.Name)} есть данные учёта по точкам
учёта зданий за один или несколько месяцев, а в Сервисе эти здания уже заведены.
**When** администратор Сервиса запускает импорт данных из АИС ОИА ПЭО — единый прогон, в
котором загружаются все данные Сервиса: справочники, организационная структура, здания,
модели потребления и данные учёта.
**Then** Сервис сводит значения точек учёта к зданию и сохраняет по каждому зданию, месяцу
и виду ТЭР месячное потребление в единицах источника — тыс. кВт·ч для электрической
энергии, Гкал для тепловой.
**And** повторный импорт тех же месяцев обновляет ранее сохранённые значения, не создавая
вторых записей.
""";
public static string Flow2 = $"""
## Поток 2. Просмотр данных учёта
Актор — Пользователь.
**Given** данные учёта загружены.
**When** пользователь выбирает в блоке навигации организационный объект или здание и
открывает вкладку нужного ресурса — «Расход ЭЭ» или «Расход ТЭ».
**Then** Сервис показывает потребление этого ресурса за период: для организационного объекта
— по зданиям, находящимся в нём или ниже; для здания — по одному зданию.
**And** период по умолчанию — календарный год, предшествующий текущему; пользователь может
выбрать другой.
**And** по каждому зданию выведен итог за год.
**And** данные доступны только на чтение: изменить значение в Сервисе нельзя.
""";
public static string Flow2Alt = """
### Альтернативный ход: данных по зданию нет
**Given** по зданию данные учёта за выбранный период не загружены.
**When** пользователь открывает вкладку ресурса.
**Then** здание показано с пустыми значениями; это не ошибка.
""";
public static string Trace = """
## Шаг → артефакты
| Шаг | Артефакты |
|---|---|
| Загрузка данных учёта | контракт загрузки — задача S-3 эпика; сущность месячного потребления — S-2 |
| Просмотр данных учёта | вкладки — S-4 и S-6; запрос и хендлер — S-5; сущность месячного потребления — S-2 |
Таблица заполняется типизированными ссылками по мере появления артефактов: ссылка на ещё не
созданный документ ломает сборку спеки.
""";
public string Version => "0.1";
public string Status => "draft";
public string[] Comments => new string[0];
}
}