⟨/⟩ Nts/60_Epics/NtsFuelCalc/EPIC_NtsFuelCalc.cs

399 строк · в начало

using System;
using Rugrid.Sdaid.Notation.Documents;

namespace Rugrid.Sdaid.Epas.Nts.Epics.NtsFuelCalc
{
    /// <summary>
    /// Эпик «Расчёт нормативного расхода топлива»: сквозной контекст модуля ЭНТС — главная
    /// страница и навигация, приём данных из АИС ОИА ПЭО, справочники, расчёт нормативного
    /// расхода автомобильного топлива ТС, представление и анализ результатов.
    /// Владелец открытых вопросов модуля.
    /// </summary>
    public class EPIC_NtsFuelCalc : IEpicDocument, IHasStructuralLinks, IFolder<NtsEpicsFolder>
    {
        public SdaidLink[] Links => new[]
        {
            Rel.Uses<Rugrid.Sdaid.Epas.Nts.Vision.DOC_NtsVision>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Nts.Domain.BC_Nts>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Nts.Domain.DOC_Vehicle>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Nts.Domain.DOC_VehicleCalc>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Nts.Domain.DOC_SelectedModifications>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Nts.Backend.Calc.DOC_NtsCalc>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Nts.Backend.Calc.DOC_InputModel>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Nts.Backend.Calc.DOC_OutputModel>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Nts.Backend.Calc.DOC_NtsCalcModel>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Nts.Backend.Calc.DOC_ProcessingStatusPolicy>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Nts.Backend.Calc.DOC_AisRefreshPolicy>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Nts.Backend.ModificationSelection.DOC_ModificationGroupSelection>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Nts.Backend.ModificationSelection.DOC_ModificationNameRecognition>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Nts.Domain.DOC_VehicleMarkAlias>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Nts.Domain.DOC_ProcessingStatus>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Nts.Infrastructure.AisOiaPeo.DOC_NtsAisImport>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Nts.Domain.DOC_NtsImportRun>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Nts.Domain.DOC_NtsImportRunStatus>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Nts.Ui.DOC_NtsMainPage>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Nts.Ui.DOC_NtsReferenceRegistry>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Nts.Ui.DOC_NtsReferenceRecords>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Nts.Ui.DOC_NtsAisImportPage>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Nts.Ui.DOC_NtsDocumentation>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Nts.Ui.DOC_VehicleRegistry>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Nts.Ui.DOC_VehicleCard>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Nts.Ui.DOC_ModificationSelectionModal>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Nts.Ui.DOC_VehicleMarkRegistry>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Nts.Ui.DOC_VehicleModificationRegistry>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Nts.Ui.DOC_VehicleModificationCard>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Nts.Epics.NtsFuelCalc.UseCases.UC_CreateVehicleModification>(),
        };

        public static string _refName = "Эпик: расчёт нормативного расхода топлива";

        public string Name => "Расчёт нормативного расхода топлива";

        public string Description =>
            @"Сквозной контекст модуля ЭНТС: навигация по организационной структуре, приём данных из АИС ОИА ПЭО, ведение справочников, расчёт нормативного расхода топлива ТС, отображение и анализ результатов.";

        public string Version => "0.2";
        public string Status => "draft";
        public string[] Comments => new string[0];

        public static string Goal = $"""
            ## Цель

            Реализовать модуль ЭНТС: от загрузки данных о ТС и справочников из АИС ОИА ПЭО
            и ведения данных, которых нет в АИС, до расчёта нормативного расхода автомобильного
            топлива, отображения и анализа результатов
            (см. {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Vision.DOC_NtsVision>()}).
            """;

        public static string Scope = $"""
            ## Состав работ

            Сквозной сценарий модуля — {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Epics.NtsFuelCalc.UseCases.UC_NtsFuelCalc>()}.

            ### Спецификация

            | Задача | Предмет | Зависит от |
            |---|---|---|
            | S-1 | {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Domain.BC_Nts>()} — модель данных модуля: ТС, расчёт ТС, отобранные модификации и справочники. Выполнено | — |
            | S-2 | {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Backend.Calc.DOC_NtsCalc>()} — методика расчёта, ветки категорий ТС. В работе | S-1 |
            | S-3 | {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Backend.Calc.DOC_NtsCalcModel>()} и модели расчёта: {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Backend.Calc.DOC_InputModel>()}, {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Backend.Calc.DOC_OutputModel>()}. Выполнено | S-2 |
            | S-4 | {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Infrastructure.AisOiaPeo.DOC_NtsAisImport>()} — приём данных из АИС ОИА ПЭО. Выполнено | S-1 |
            | S-5 | {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Ui.DOC_VehicleRegistry>()}, {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Ui.DOC_VehicleCard>()} — экраны реестра и карточки ТС и макеты. Выполнено | S-3 |
            | S-6 | {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Ui.DOC_NtsMainPage>()} — главная страница, общие сведения о модуле, навигация и вкладки организационного объекта. Выполнено | S-5 |
            | S-7 | {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Ui.DOC_NtsDocumentation>()} — документация по использованию модуля. Выполнено | S-5, S-6 |
            | S-8 | {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Ui.DOC_NtsReferenceRegistry>()}, {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Ui.DOC_NtsReferenceRecords>()}, {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Ui.DOC_VehicleMarkRegistry>()}, {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Ui.DOC_VehicleModificationRegistry>()} — справочники и страницы записей. Выполнено | S-1, S-4 |
            | S-9 | {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Ui.DOC_NtsAisImportPage>()} — страница запуска и контроля импорта. Выполнено | S-4 |
            | S-10 | {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Ui.DOC_ModificationSelectionModal>()} — окно подбора модификаций и расчёта базовой нормы. Выполнено | S-2, S-3, S-5 |
            | S-11 | {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Ui.DOC_VehicleModificationCard>()} — карточка модификации справочника, точка входа из карточки ТС, {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Epics.NtsFuelCalc.UseCases.UC_CreateVehicleModification>()} | S-5, S-8 |

            ### Реализация backend

            | Задача | Предмет | Зависит от |
            |---|---|---|
            | B-1 | Доменные сущности и справочники модуля: ТС, расчёт ТС, отобранные модификации, марки, алиасы марок, модели и модификации, субъекты РФ, зимние надбавки, статусы расчёта | S-1 |
            | B-2 | Реализация расчёта по методике: лёгковые, автобусы, грузовые, самосвалы и спецтехника. Выполнено | S-2 |
            | B-3 | Модели чтения и запросы: навигация, реестр и карточка ТС, справочники, история импорта, подбор модификаций; права доступа | S-4, S-5, S-8, S-9, S-10 |
            | B-4 | Команды: сохранение карточки и расчёт, обновление из АИС, импорт, ведение собственных справочников | B-1, B-2, B-3 |
            """;

        public static string OutOfScope = $"""
            ## Вне состава

            **Организационная структура и характеристики ТС, загруженные из АИС**, в модуле
            не изменяются; модуль читает их из АИС. Субъект РФ организационного объекта выбирается
            на вкладке «Сведения» и используется для зимней надбавки. Остальные характеристики,
            которых нет в АИС, ведутся в ЭНТС (см. {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Vision.DOC_NtsVision>()},
            раздел «Границы»).

            **Создание и удаление ТС.** Состав ТС ведётся в АИС ОИА ПЭО; в реестре и карточке ТС
            создание и удаление не выполняются.

            **Отчёты.** Состав отчётов в ТЗ не задан — открытый вопрос {SdaidAnchors.RefTo<OQ_Vision>()}.
            """;

        public static string Actors = $"""
            ## Акторы

            Роли модуля и их действия — {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Vision.DOC_NtsVision>()},
            раздел «Роли пользователей».
            """;

        public static string Acceptance = """
            ## Acceptance criteria

            | AC | Критерий |
            |---|---|
            | AC-G1 | На главной странице в блоке «Общие сведения» показаны полное наименование модуля, условное обозначение «Модуль ЭНТС», назначение и цель создания; заголовок не дублирует верхнюю строку |
            | AC-N1 | Выбор организационного объекта в дереве навигации открывает вкладки «Сведения» и «Реестр ТС»; по умолчанию активна вкладка «Сведения» |
            | AC-R1 | Реестр ТС показывает ТС выбранного объекта, поддерживает переключатели «С потомками / Без потомков» и «Все / Действующие» (действующие — ТС без даты окончания эксплуатации), фильтры по колонкам и постраничный вывод; в строках видны нормативный расход и статус обработки |
            | AC-C1 | В карточке ТС доступны группы «Характеристики ТС», «Условия эксплуатации», «Параметры методики» и «Результаты расчёта»; «Сохранить и рассчитать» сохраняет данные и запускает расчёт |
            | AC-C2 | Окно подбора модификаций при каждом открытии строит базовую группу по виду ТС и топливу и маску автоуточнением из данных АИС (марка/модель/остаток наименования), независимо от способа подбора; «Отобранные» разово заполняются текущей группой ТС (сохранённой пользователем или полученной автоотбором) и дальше не зависят от изменений маски; ручные условия по марке, модели и модификации строгие; по «Отобранным» показываются $H_{min}$, $H_{max}$ и $H_s$; по «Применить» группа сохраняется, способ подбора становится «эксперт», значение $H_s$ переносится в карточку; если для вида ТС и топлива нет ни одной модификации с нормой — статус подбора «Не определена» (красный бейдж в карточке), «Сохранить и рассчитать» недоступна |
            | AC-S1 | Статус расчёта показан бейджем и принимает одно из значений: «Не выполнен», «Успешно выполнен», «Выполнен с ошибкой» |
            | AC-S2 | При статусе «Выполнен с ошибкой» показан текст ошибки из классификатора ошибок расчёта |
            | AC-S3 | Статус обработки ТС показан цветным бейджем в карточке (ниже статуса расчёта) и в реестре ТС; принимает значения: «Не выполнена», «Мало данных загружено», «Нет модификаций», «Отсутствуют данные для расчёта», «Автовыбор не подтверждён», «Модификация не определена», «Завершена» |
            | AC-S4 | Статус загрузки показан бейджем в группе «Сведения о ТС из АИС ОИА ПЭО» карточки ТС; принимает значения «Не выполнена», «Данных мало», «Загрузка выполнена»; при «Данных мало» карточка показывает пояснение с перечнем недостающих данных и блокирует «Сохранить и рассчитать» и «Подобрать модификацию» |
            | AC-F1 | Справочники сгруппированы по источнику ведения; справочники АИС и системные доступны только для просмотра, собственные справочники ЭНТС — для создания, изменения и удаления по правам пользователя |
            | AC-I1 | Страница импорта запускает пакетную загрузку от корневой компании (ПАО «Россети»), показывает статус, результат по наборам и ошибки; история запусков сохраняется и включает как пакетные запуски, так и одиночные обновления ТС из карточки (с указанием источника) |
            | AC-I2 | ТС, отсутствующее в очередной выгрузке АИС, не удаляется — у него выставляется признак `IsAbsentInAis`; при появлении ТС в выгрузке признак снимается, данные модуля и результаты расчёта не меняются |
            | AC-D1 | Документация содержит общие сведения, назначение и цель создания, порядок работы с модулем |
            | AC-X1 | Повторный импорт тех же данных из АИС не изменяет результаты расчёта, его статус и журнал |
            | AC-F2 | В подвале окна подбора модификаций всегда (не только при пустом отборе) доступна администратору модуля кнопка «Создать модификация», открывающая карточку модификации с предзаполненными видом ТС и видом топлива (точно) и предложенными маркой и моделью (редактируемыми); вид ТС и вид топлива с этой карточки не создаются — только выбор из значений АИС; марка и модель — выбор существующей записи или создание новой |
            | AC-X2 | «Обновить из АИС» в карточке ТС запрашивает подтверждение перед запуском; если вид ТС или вид топлива не изменились (по Id записи справочника) — подбор, сделанный способом «эксперт», не трогается, способом «авто» — повторяется по актуальному наименованию ТС; если изменились — прежняя группа подбора отбрасывается и выполняется новый автоподбор по новым виду/топливу, даже если данных всё равно недостаточно для расчёта; расчёт запускается безусловно и обновляет дату расчёта, при нехватке обязательных данных возвращает классифицированную ошибку, но видимый статус обработки всё равно показывает «Мало данных загружено» |
            """;
    }

    /// <summary>Открытые вопросы эпика, вынесенные из документа видения (OQ-1…OQ-3).</summary>
    public class OQ_Vision : ISdaidDocumentSection
    {
        public Type Document => typeof(EPIC_NtsFuelCalc);
        public Type Parent => typeof(object);
        public int Order => 100;
        public string Number => "OQ";
        public string Name => "Открытые вопросы — видение";

        public string Body => """
        - **OQ-1. Отчёты.** Требования к модулю «Отчёты» в ТЗ не заданы — есть только заголовок
          раздела. Состав отчётов нужно получить от заказчика.
        - **OQ-2. Состав собственных справочников.** По ТЗ состав предоставляет заказчик. В модели
          зафиксированы марки, модели, модификации ТС, субъекты РФ и предельные значения зимних
          надбавок; коэффициенты за срок эксплуатации — параметр методики, отдельного справочника
          нет. Нужно подтвердить состав и источник первичного наполнения.
        - **OQ-3. Средний нормативный расход.** В методике итоговый расход определён как среднее
          городского и пригородного расхода, слагаемые расшифрованы. Открытым остаётся состав
          средних показателей для отчётов и их сопоставление с фактическим потреблением.
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Открытые вопросы эпика, вынесенные из документа методики (OQ-4…OQ-6).</summary>
    public class OQ_Calc : ISdaidDocumentSection
    {
        public Type Document => typeof(EPIC_NtsFuelCalc);
        public Type Parent => typeof(object);
        public int Order => 110;
        public string Number => "OQ";
        public string Name => "Открытые вопросы — методика";

        public string Body => """
        - **OQ-4. Ветки категорий.** Ветки лёгковых автомобилей, автобусов, грузовых, самосвалов
          и спецтехники реализованы и проверены контрольными примерами. Открытым остаётся
          согласование состава слагаемых и порядка применения коэффициентов с заказчиком.
        - **OQ-5. Ручные надбавки.** D_{нас}, D_{ост}, D_{пон}, D_{спец}, D_{чс}, D_{прос} приходят из формы
          ввода и суммируются в обе сезонные суммы. На контрольном примере лёгкового они равны нулю.
        - **OQ-6. Оборудование спецавтомобилей.** Расход на работу отопителя (автобусы) добавляется
          вне поправочного коэффициента — решено. Для спецавтомобилей расход на оборудование
          учитывается в ветке `fuel.special_vehicle` и проверен контрольным примером. Открытым
          остаётся согласование состава оборудования с заказчиком.
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Открытые вопросы эпика, вынесенные из документа транспортного средства (OQ-7…OQ-8).</summary>
    public class OQ_Vehicle : ISdaidDocumentSection
    {
        public Type Document => typeof(EPIC_NtsFuelCalc);
        public Type Parent => typeof(object);
        public int Order => 120;
        public string Number => "OQ";
        public string Name => "Открытые вопросы — транспортное средство";

        public string Body => """
        - **OQ-7. Два вида топлива.** У ТС основной и дополнительный вид топлива. Методика знает
          один: от вида топлива зависят нормы расхода на транспортную работу. Какой использовать
          в расчёте, если заполнены оба.
        - **OQ-8. Летние и зимние нормы.** Нормы расхода ведутся парами: летняя и зимняя, на пробег
          и на час работы. Методика задаёт базовую норму из справочника модификаций и применяет
          к ней сезонные поправочные коэффициенты. Соотношение этих величин нужно определить.
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Открытые вопросы эпика, вынесенные из документа приёма данных из АИС (OQ-9…OQ-12).</summary>
    public class OQ_AisImport : ISdaidDocumentSection
    {
        public Type Document => typeof(EPIC_NtsFuelCalc);
        public Type Parent => typeof(object);
        public int Order => 130;
        public string Number => "OQ";
        public string Name => "Открытые вопросы — загрузка из АИС";

        public string Body => """
        - **OQ-9. Где держать процедуры интеграции.** Приём данных из АИС ОИА ПЭО — общий механизм
          для модулей ОПЭС; у ЭНЗС он описан в своей папке, здесь описан приём данных ЭНТС.
          Нужно решить, остаются ли описания по модулям или общая часть переезжает в платформу.
        - **OQ-10. Отбор по типу организационного объекта.** В запросе выгрузки отбор идёт по
          `navs.navtypealias = 'o_fsk'` — это компания. ТС числятся за ПМЭС и МЭС, поэтому отбор
          либо означает «все ТС компании», а привязка к ПМЭС и МЭС лежит в самой записи `navs`,
          либо требует уточнения.
        - **OQ-11. Данные, которых нет в выгрузке.** Методика использует величины, отсутствующие
          в составе наборов: пробег за период и с начала эксплуатации, собственная масса ТС,
          признаки надбавок (климат-контроль, кондиционер, прогрев, работа в загородной зоне).
          Нужно решить, добавляются ли они в выгрузку или вводятся в модуле.
        - **OQ-12. Выбывшие записи.** Поведение, когда запись исчезла из выгрузки АИС. Для справочников
          вопрос острее: в ЭНЗС неудаление записей, которых уже нет в АИС, привело к перекрытию
          диапазонов классов энергоэффективности (CR 2026-08-19, пункт 5).
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Открытые вопросы эпика, вынесенные из документов справочников (OQ-13).</summary>
    public class OQ_References : ISdaidDocumentSection
    {
        public Type Document => typeof(EPIC_NtsFuelCalc);
        public Type Parent => typeof(object);
        public int Order => 140;
        public string Number => "OQ";
        public string Name => "Открытые вопросы — справочники";

        public string Body => """
        - **OQ-13. Ведение справочников.** В справочниках ЭНТС зафиксированы марки, модели,
          модификации ТС, субъекты РФ и предельные значения зимних надбавок. Нужно согласовать
          права на создание, изменение и удаление записей, а также порядок разовой загрузки
          справочника «Марка, модель и модификация ТС» из нормативного документа.
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Открытые вопросы эпика, вынесенные из базовой нормы (OQ-18).</summary>
    public class OQ_BaseNorm : ISdaidDocumentSection
    {
        public Type Document => typeof(EPIC_NtsFuelCalc);
        public Type Parent => typeof(object);
        public int Order => 145;
        public string Number => "OQ";
        public string Name => "Открытые вопросы — базовая норма";

        public string Body => """
        - **OQ-18. Какая норма справочника считается базовой.** Спека
          `InputModel.BaseConsumptionRates` и секция `fuel.base_norm` говорят только про
          `VehicleModification.NormPerMileage`; прототип и подготовленный справочник используют
          `NormPerMileage`, а при её отсутствии — `TransportNorm`. Это не придирка к формулировке:
          у автобусов и самосвалов норма на пробег часто пустая, а транспортная заполнена —
          только транспортной нормой заполнено около 416 строк справочника (автобусы и самосвалы),
          ещё 5 строк не имеют ни одной из двух. Если оставить спеку как есть, для этих видов ТС
          базовая группа окажется пустой, а $H_s$ — неопределённой, хотя прототип для них считает.
          Нужно подтвердить, что для автобусов и самосвалов базовой является именно транспортная
          норма, и определить поле (или правило выбора поля), которое считается «установленной
          нормой» для базовой группы.
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Открытые вопросы эпика, вынесенные из документа реестра ТС (OQ-14, OQ-15).</summary>
    public class OQ_VehicleRegistry : ISdaidDocumentSection
    {
        public Type Document => typeof(EPIC_NtsFuelCalc);
        public Type Parent => typeof(object);
        public int Order => 150;
        public string Number => "OQ";
        public string Name => "Открытые вопросы — реестр ТС";

        public string Body => """
        - **OQ-14. Данные, вносимые в модуле.** По ТЗ модуль обеспечивает внесение данных, которых
          нет в АИС. Состав таких данных определится, когда закроются открытые вопросы методики
          (пробег, собственная масса, признаки надбавок — см. OQ-11).
        - **OQ-15. Результаты расчёта в реестре.** По ТЗ реестр отображает результаты расчёта
          нормативного потребления. Состав показателей определится вместе с выходной моделью расчёта.
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Открытые вопросы эпика, вынесенные из документа карточки ТС (OQ-16).</summary>
    public class OQ_VehicleCard : ISdaidDocumentSection
    {
        public Type Document => typeof(EPIC_NtsFuelCalc);
        public Type Parent => typeof(object);
        public int Order => 160;
        public string Number => "OQ";
        public string Name => "Открытые вопросы — карточка ТС";

        public string Body => """
        - **OQ-16. Состав результатов расчёта.** Состав промежуточных итогов расчёта определится
          вместе с выходной моделью расчёта.
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }

    /// <summary>Открытые вопросы эпика, вынесенные из окна подбора модификаций (OQ-17).</summary>
    public class OQ_ModificationSelection : ISdaidDocumentSection
    {
        public Type Document => typeof(EPIC_NtsFuelCalc);
        public Type Parent => typeof(object);
        public int Order => 170;
        public string Number => "OQ";
        public string Name => "Открытые вопросы — окно подбора модификаций";

        public string Body => $"""
        - **OQ-17. Статусная модель — снят.** Зафиксированы `CalculationStatus`
          (не выполнен / успешно выполнен / выполнен с ошибкой), `AisLoadStatus`
          (не выполнена / данных мало / загрузка выполнена) и `ProcessingStatus`
          (не выполнена / мало данных загружено / нет модификаций / отсутствуют данные для
          расчёта / автовыбор не подтверждён / модификация не определена / завершена). Способ
          подбора — «авто» / «эксперт»; статус подбора — «не выполнен» / «не определена» /
          «определена» / «определена группа» (бейдж «не определена» — красный: подбор проводился
          и дал пустой результат, в отличие от нейтрального «не выполнен»). Правило вычисления
          `ProcessingStatus` описано в политике статуса обработки.
        - **OQ-19. Хранение маски — снят.** Маска нигде не хранится: она формируется заново из
          данных АИС при каждом открытии окна подбора и не зависит ни от способа подбора, ни от
          сохранённых «Отобранных» (см. `ModificationSelectionModal`, правило 3). Хранилище в
          домене не требуется.
        - **OQ-20. Мастер-список марок и алиасы — снят.** Мастер-список марок — справочник
          {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Domain.DOC_VehicleMark>()}; алиасы —
          отдельная дочерняя сущность {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Domain.DOC_VehicleMarkAlias>()}
          (один алиас — одна марка), заводится через типовой механизм ведения справочников ЭНТС
          ({SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Ui.DOC_NtsReferenceRegistry>()} →
          {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Ui.DOC_NtsReferenceRecords>()}), как и
          {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Domain.DOC_VehicleModel>()}. Внешнего
          (вне-доменного) мастер-списка больше не требуется.
        - **OQ-21. Источник для спецтехники.** Прототип распознаёт марку и модель только по
          «Марка и модель базы ТС»; в диагностике подготовки справочников дополнительно
          использовалось «Модель спец. автомобиля». Нужно решить, какое поле (или оба) является
          источником для спецтехники.
        - **OQ-22. Маска после автоподбора — снят.** Маска больше не «остаётся прежней» ни в
          каком случае — она всегда формируется заново из текущих данных АИС при открытии
          (см. OQ-19), поэтому рассинхронизация с группой невозможна.
        - **OQ-23. Два пустых состояния.** Прототип показывает один текст «нет модификаций для
          Вид ТС «…» и Вид топлива «…»» и когда кандидатов нет вовсе, и когда их отсекли ручные
          условия. Нужно решить, различать ли эти состояния текстом.
        - **OQ-24. Смена вида ТС/топлива и уже отобранные модификации — снят.** Ответ уже есть в
          {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Backend.Calc.DOC_AisRefreshPolicy>()} (раздел
          «Подбор модификации», строка «Изменились»): прежняя группа отбрасывается целиком,
          выполняется новый автоподбор по новым виду/топливу — поэтому «Отобранные», не
          соответствующие новому виду/топливу, не остаются.
        - **OQ-25. Эталонная норма — хранить ли отдельно от расчёта ТС — снят.**
          {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.ChangeRequests.DOC_CR_2026_11_03_ReferenceConsumption>()}
          решил, по аналогии с базовой нормой, не хранить эталонную норму вида ТС и топлива как
          отдельную НСИ-величину — она пересчитывается при каждом открытии окна подбора и при
          каждом расчёте, сохраняется только в разрезе конкретного ТС
          (`VehicleCalc.ReferenceConsumptionRate`). Это решение для текущего объёма, не требует
          отдельного подтверждения. Отдельно, не как часть этого вопроса: если позже понадобится
          агрегированная отчётность «эталон по виду ТС и топливу» (не по ТС) — кэш придётся
          выносить отдельно, это будущий самостоятельный CR, а не доработка текущего решения.
        - **OQ-26. Детализация эталонного расхода по периодам.** Тот же
          {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.ChangeRequests.DOC_CR_2026_11_03_ReferenceConsumption>()}
          ограничил состав эталонных величин одним итоговым $Q_эт$ (аналог $Q_н$), не вводя
          эталонные аналоги промежуточных $Q^зима_эт$, $Q^гор_эт$ и т. п. Если заказчику нужна
          детализация — потребуется отдельный CR.
        """;
        public string Version => "";
        public string Status => "";
        public string[] Comments => new string[0];
    }
}