⟨/⟩ Nts/35_ChangeRequests/DOC_CR_2026_10_30_WinterAllowanceDisplay.cs

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

using Rugrid.Sdaid.Notation.Documents;

namespace Rugrid.Sdaid.Epas.Nts.ChangeRequests
{
    /// <summary>
    /// `InputModel.ClimateRegionAllowance` (D_район) обязателен для расчёта, но нигде не
    /// отображается в UI — ни субъект РФ эксплуатации, ни найденная запись справочника зимних
    /// надбавок. Ошибку `fuel.cf_climate_region` диагностировать было нечем. Добавлен вывод на
    /// вкладке «Сведения» орг. объекта и в карточке ТС.
    /// </summary>
    public class DOC_CR_2026_10_30_WinterAllowanceDisplay : IChangeRequestDocument, IHasStructuralLinks, IFolder<NtsChangeRequestsFolder>
    {
        public SdaidLink[] Links => new[]
        {
            Rel.Uses<Rugrid.Sdaid.Epas.Nts.Ui.DOC_NtsMainPage>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Nts.Ui.DOC_VehicleCard>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Nts.Domain.DOC_WinterAllowance>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Nts.Backend.Calc.DOC_NtsCalcErrors>(),
        };

        public static string _refName = "CR 2026-10-30: вывод зимней надбавки по климатическому району";

        public string Name => "Вывод зимней надбавки по климатическому району";

        public string Description =>
            @"InputModel.ClimateRegionAllowance (D_район) обязателен для расчёта, но нигде не отображается в UI. Добавлен вывод на вкладке «Сведения» орг. объекта (запись справочника зимних надбавок по субъекту) и в карточке ТС (субъект эксплуатации и применённая надбавка).";

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

        public static string Source = """"
            ## Источник (как есть)

            По итогам аудита полноты доменной модели (сверка UI/методики с доменом): поле
            `InputModel.ClimateRegionAllowance` (`RequiredForCalc = "Да"`) не имеет прямого
            `[CalcSource]` — источник не атрибут ТС, а поиск по цепочке `Vehicle.OrgObject →
            NavEntity.Subject → WinterAllowance` (справочник «Предельные значения зимних
            надбавок», по субъекту РФ). Это ожидаемо и уже задокументировано в `InputModel.cs`.

            Но ни субъект РФ эксплуатации, ни найденная запись справочника, ни сама применённая
            надбавка нигде не показываются пользователю — ни на карточке ТС, ни на вкладке
            «Сведения» орг. объекта. При этом у `fuel.cf_climate_region` уже есть классифицированная
            ошибка («Субъект РФ эксплуатации не определён — неизвестна зимняя надбавка»,
            `DOC_NtsCalcErrors`) — но диагностировать её причину в UI нечем.
            """";

        public static string Analysis = """"
            ## Разбор

            Решены два места вывода:

            **Вкладка «Сведения» орг. объекта.** Там уже есть поле «Субъект РФ» (выбирается из
            справочника субъектов). Под ним — найденная для этого субъекта запись
            `WinterAllowance`: срок действия (`Period`), количество месяцев действия (`Months`),
            предельная величина надбавки, % (`LimitPercent`). Если субъект не выбран или для него
            нет записи — показывается буквальный текст ошибки классификатора (решение
            пользователя: не придумывать отдельную формулировку для этого контекста — один факт,
            один текст, что и в карточке ТС, и в классификаторе).

            **Карточка ТС, группа «Условия эксплуатации».** Два новых read-only поля в начале
            группы (до полей ввода): «Субъект РФ эксплуатации» (найден по владельцу ТС — другой
            субъект, чем на вкладке орг. объекта, если ТС и владелец размещены в разных регионах)
            и «Поправочный коэффициент на климатический район, D_район, %» (предельная величина
            надбавки найденной записи). Решение пользователя: если субъект/надбавка не определены —
            текст ошибки показывается в ОБОИХ полях, не только в одном — оба поля одинаково
            свидетельствуют об одной и той же причине отказа.
            """";

        public static string BlastRadius = """"
            ## Blast radius

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

            | Документ | Правка |
            |---|---|
            | `Nts/65_Ui/NtsMainPage.cs` | раздел «Структура экрана», вкладка «Сведения» — вывод записи `WinterAllowance` под полем «Субъект РФ»; новые связи на `DOC_WinterAllowance`, `DOC_NtsCalcErrors` |
            | `Nts/65_Ui/VehicleCard.cs` | группа «Условия эксплуатации» — два новых read-only поля в начале группы (таблица «Описание полей» + текстовое описание группы); новые связи на `DOC_WinterAllowance`, `DOC_NtsCalcErrors` |

            ### Прототип

            | Файл | Правка |
            |---|---|
            | `Nts/65_Ui/html/main-page.html` | блок «Зимняя надбавка» под полем «Субъект РФ» на вкладке «Сведения» |
            | `Nts/65_Ui/html/vehicle-card.html` | два новых поля в начале группы «Условия эксплуатации» |
            | `Ntr/65_Ui/html/shell.js` | функция поиска записи `WinterAllowance` по субъекту (по демо-справочнику), заполнение обоих мест вывода, обработка случая «не найдено» — текст ошибки в оба поля |
            """";

        public static string Plan = """"
            ## План

            1. `NtsMainPage.cs`/`VehicleCard.cs` — правки спецификации (сделано).
            2. Прототип: демо-справочник зимних надбавок по субъектам (если такого ещё нет в
               `nts-ref.js`), функция поиска и рендера, оба места вывода.
            3. Собрать (`dotnet build`, `build-html.cmd`).
            4. `testovich` — реальным выполнением: найденная запись совпадает по нескольким
               субъектам; случай «субъект/запись не найдены» — текст ошибки виден в обоих местах.
            5. Зафиксировать «Итог».
            """";

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

            - **AC-1.** На вкладке «Сведения» орг. объекта под полем «Субъект РФ» показана запись
              справочника зимних надбавок для этого субъекта (срок действия, количество месяцев,
              предельная величина, %), либо текст ошибки классификатора, если субъект не выбран
              или записи нет.
            - **AC-2.** В карточке ТС, в начале группы «Условия эксплуатации», показаны «Субъект РФ
              эксплуатации» (по владельцу ТС) и «Поправочный коэффициент на климатический район,
              D_район, %» (предельная величина найденной записи).
            - **AC-3.** Если субъект/запись не определены — текст ошибки показан в ОБОИХ полях
              карточки ТС, один и тот же буквальный текст, что и в классификаторе ошибок.
            """";

        public static string Result = """"
            ## Итог

            Выполнено полностью. Спека: `NtsMainPage.cs` (блок «Зимняя надбавка» на вкладке
            «Сведения», с субъектом РФ первым полем группы), `VehicleCard.cs` (два новых поля в
            «Условиях эксплуатации»). Прототип: `main-page.html`, `vehicle-card.html`,
            `shell.js` (`fillOrgCard`, `computeNorm`, `winterAllowanceByOwnerName`).

            По пути к закрытию нашлись и были исправлены два не связанных с замыслом CR, но
            блокировавших его реальных бага прототипа: устаревшая версия `?v=` у `shell.js`/
            `shell.css` в `<script>`/`<link>` (браузер не подхватывал новый код без ручной
            жёсткой перезагрузки) и неверный путь навигации «дерево → Реестр ТС → Сведения»,
            вёдший на общую карточку ЭНТР (`mes-info.html`/`pmes-info.html`/`company-info.html`)
            вместо инлайн-вкладки ЭНТС на `main-page.html` — оба зафиксированы и устранены в
            `shell.js` по ходу расследования.

            `testovich` (финальный прогон) реальным выполнением подтвердил все три AC и путь
            навигации: AC-1 — блок виден и заполнен (МЭС Волги: 01.XI..31.III, 5 мес., 10,00 %);
            AC-2 — оба поля карточки ТС заполнены корректно (Самарская область, 10,00 %);
            AC-3 — при неизвестном субъекте оба поля показывают буквальный текст ошибки
            классификатора (`fuel.cf_climate_region`). Находок нет.
            """";
    }
}