⟨/⟩ 35_ChangeRequests/DOC_CR_2026_08_25_MandatoryCardFields.cs

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

using Ban.Sdaid.Notation.Documents;
using Ban.Sdaid.Notation.Glossary;
using Ban.Sdaid.Icd.Arch.Adr;
using Ban.Sdaid.Icd.Domain.Capture;
using Ban.Sdaid.Icd.Domain.Cards;
using Ban.Sdaid.Icd.Domain.Cards.Template;
using Ban.Sdaid.Icd.Epics.PacketProcessing;
using Ban.Sdaid.Icd.Epics.PacketProcessing.UseCases;
using Ban.Sdaid.Icd.Glossary.Terms;
using Ban.Sdaid.Icd.Requirements;
using Ban.Sdaid.Icd.Ui.Pages;
using Ban.Sdaid.Icd.Vision;

namespace Ban.Sdaid.Icd.ChangeRequests
{
    /// <summary>
    /// Запрос на изменение по резульататм совещания 25.08.2026: список обязательных полей информационной карты.
    /// </summary>
    public class DOC_CR_2026_08_25_MandatoryCardFields : IChangeRequestDocument, IHasStructuralLinks
    {
        public static string _refName = "запрос на изменение «Обязательные поля ИК»";

        public string Name => "CR 2026-08-25. Обязательные поля информационной карты";

        public string Description =>
            @"Заказчик передал список полей, обязательных к заполнению в информационной карте. Незаполненные поля выделяются визуально; проверку можно отложить, сохранив пакет ввода, а карта создаётся только когда обязательные поля заполнены.";

        public string Version => "0.1";
        public string Status => "draft";

        public string[] Comments => new[]
        {
            "2026-08-25. Совещание с заказчиком; список полей передан 2026-08-26.",
            "2026-08-26. Заведён до правок в артефактах: сначала фиксируем источник и объём.",
            "2026-08-26. Вопросы разбора сняты: список — для изданий, место хранения остаётся обязательным, «Б.и.» вписывает пользователь.",
            "2026-08-26. Разбор переработан: незавершённая карта живёт в пакете ввода, у карты состояния не появляется.",
            "2026-08-26. Заказчик поправил список: добавлено место издания с заглушкой «Б.м.»; перечень относится к книгам, для рукописей и рисунков будет свой.",
        };

        public SdaidLink[] Links => new[]
        {
            Rel.Uses<IcdVision>(),
            Rel.Uses<FR_005_Verification>(),
            Rel.Uses<FR_006_CardCreation>(),
            Rel.Uses<FR_007_AbisExport>(),
            Rel.Uses<ADR_006_CardDataStructure>(),
            Rel.Uses<ADR_012_UnfinishedCardLivesInPacket>(),
            Rel.Uses<EPIC_PacketProcessing>(),
            Rel.Uses<VerifyPacketUseCase>(),
            Rel.Uses<ProcessingQueuePage>(),
            Rel.Uses<ADR_008_PacketStatesAndTwoTabs>(),
            Rel.Uses<InformationCardSpec>(),
            Rel.Uses<InputPacketSpec>(),
            Rel.Uses<DocumentKindSpec>(),
            Rel.Uses<RequiredAttributes>(),
        };

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

            Обсуждалось на Совещании с БАН 2026-08-25; список полей передан 2026-08-26:

            > Есть список полей, обязательных к заполнению в информационной карте:
            > - Шифр;
            > - Инвентарный номер;
            > - Дата;
            > - Заглавие
            > - Место издания, рядом указано "если нет города, то Б.м." ;
            > - Издательство, рядом указано "если нет издательства, то Б.и."
            > - Год издания;
            > - Количество страниц;
            > - Формат.
            >
            >Это список для карты для книг. Для рукописей и рисунков свои метки, но они большей
            > частью будут дублироваться с метками полей книг. Потом отдельно пришлю/
            >
            > Список должен визуально выделяться (возможно иконкой), должно быть понятно, 
            > что пустое обязательное поле требуется заполнить.
            >
            > Возможен вариант, когда на бумажном бланке не заполнены все обязательные поля. В этом
            > случае пользователь должен иметь возможность сохранить результаты распознавания
            > бумажного бланка как черновик ИК, иметь возможность дособрать информацию, вернуться 
            > к обработке ИК и дозаполнить её. 
            > ИК в статусе черновик не может быть выгружена в файл для АБИС.

            Уточнение заказчика в тот же день:

            > Это карта информационная для книг. Для рукописей и рисунков свои метки, но они большей
            > частью будут дублироваться с метками полей книг. Потом отдельно пришлю
            >
            > Я ошиблась, конечно. Должно быть так:
            > - Шифр;
            > - Инвентарный номер;
            > - Дата;
            > - Заглавие
            > - Место издания, рядом указано "если нет города, то Б.м." ;
            > - Издательство, рядом указано "если нет издательства, то Б.и."
            > - Год издания;
            > - Количество страниц;
            > - Формат.
            """;

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

            ### Требование

            Требуется:

            - возможность установить свойство обязательности полей ИК;
            - подсветить обязательные поля в интерфейсе;
            - не дать выгрузить ИК, но дать возможность сохранить результаты работы, чтобы вернуться
              к ним позже и доделать.

            ### Где живёт незавершённая работа

            Рассмотрены два варианта: карта со статусом «черновик» и хранение незавершённого
            в пакете ввода. Выбран второй; сравнение и обоснование —
            {nameof(Ban.Sdaid.Icd.Arch.Adr.ADR_012_UnfinishedCardLivesInPacket)}.

            ### Что меняется на экране проверки

            Обязательные поля помечаются на вкладке «Проверка карты», пустое видно сразу. Действие
            «Создать ИК» доступно, когда заполнены все обязательные.

            Отдельного «Сохранить» не появляется: правка значения запоминается в
            {SdaidAnchors.RefTo<InputPacketSpec>()} сразу, как её внесли. Отложить работу — значит
            переключиться в очереди на другой пакет или взять следующий; экран мастер-деталь,
            карточку не закрывают. Отложенный пакет остаётся в состоянии «Проверка» за тем же
            оператором, возврат к нему — выбором в очереди. Если пользователь не намерен
            возвращаться, он отдаёт пакет действием «Вернуть в очередь».

            Рядом с «Создать ИК» появляется **«Взять следующий»** — выход для того, кто карту сейчас
            не создаёт. Действие навигационное: данных не меняет, пакет остаётся за оператором,
            выбор переходит на первый свободный.

            В очереди ничего не меняется: свои пакеты, включая отложенные, оператор находит
            переключателем «Только мои», а состояние у них обычное — «Проверка». Отдельного признака
            неполноты в строке пакета не заводим: каких полей не хватает, видно в самой карточке.
            «Черновик» остаётся словом заказчика для описания ситуации, в интерфейсе его нет.

            Жёсткое удаление сносит пакет вместе со значениями, как и раньше. Поле, которое нельзя
            установить в принципе, — повод пересмотреть перечень обязательных, а не судьба
            конкретного пакета.

            ### Как устанавливается обязательность

            Возможность установить обязательность предусмотрена **в модели данных**: признак стоит
            у вхождения атрибута в состав вида документа
            ({nameof(Ban.Sdaid.Icd.Domain.Cards.Template.DocumentKindAttributeSpec)}). Это настройка,
            а не код: изменить перечень значит изменить данные справочника, сборка и выкладка для
            этого не нужны, новых сущностей — тоже.

            Обязательность задаётся **по виду документа**: один и тот же атрибут может быть
            обязательным для издания и необязательным для рукописи. Поле бланка тут ни при чём —
            атрибут может быть обязательным, даже если клетки для него на бланке нет.

            Сценарий, экран и контракт её ведения **не специфицированы**.

            ### Принятые решения

            **Список относится к книгам.** Подтверждено заказчиком: перечень описывает карту
            на книгу, то есть {GlossaryAnchors.RefTo<Ban.Sdaid.Icd.Glossary.Terms.DocumentKind>("вид")}
            «издание — книга». Для рукописей и рисунков перечни свои, заказчик пришлёт отдельно;
            по его словам, они большей частью совпадут с книжными. Это подтверждает устройство модели:
            обязательность задаётся по виду документа, общий список на все виды не нужен.

            **Место хранения остаётся обязательным.** Заказчик перечислял поля бумажного бланка,
            а места хранения на бланке нет — оно относится к самой карте. Итоговый перечень для
            книги — десять полей: девять из списка плюс место хранения.

            **Отсутствие значения записывается явно, а не оставляется пустым.** У двух полей есть
            принятая на бланке заглушка: «Б.м.» вместо места издания и «Б.и.» вместо издательства.
            Вписывает её пользователь, Сервис не подставляет ничего: пустое поле означает
            «значение не указано» и обязательное поле незаполненным. Заглушку Сервис принимает как
            обычное значение и не разбирает.
            """;

        public static string S3_BlastRadius = $"""
            ## Blast radius

            | Документ | Что меняется |
            |---|---|
            | {SdaidAnchors.RefTo<IcdVision>()} | пункт «Проверка карты»: проверку можно отложить, не создавая карту; создание по-прежнему требует полноты |
            | {SdaidAnchors.RefTo<FR_005_Verification>()} | визуальная пометка незаполненных обязательных полей при проверке |
            | {SdaidAnchors.RefTo<FR_006_CardCreation>()} | условие создания карты — заполненность обязательных полей; проверка откладывается сохранением пакета |
            | {SdaidAnchors.RefTo<InputPacketSpec>()} | пакет хранит проверенные значения и ждёт дозаполнения |
            | {SdaidAnchors.RefTo<ProcessingQueuePage>()} | пометка обязательных полей на вкладке «Проверка карты»; действие «Взять следующий» |
            | {SdaidAnchors.RefTo<VerifyPacketUseCase>()} | появляется выход из сценария без создания карты и возврат к отложенному пакету |
            | {SdaidAnchors.RefTo<DocumentKindSpec>()} | наполнение состава вида: какие атрибуты обязательны |

            {SdaidAnchors.RefTo<FR_007_AbisExport>()} и {SdaidAnchors.RefTo<FR_011_CardRegistry>()}
            не затрагиваются: неполной карты не существует, значит запрещать выгрузку нечему,
            а реестр карт остаётся реестром готовых карт.

            Реализация: пометка обязательных полей на проверке, действие «Взять следующий»,
            сохранение правок по мере ввода, наполнение справочника атрибутов вида. Миграций схемы
            не требуется — ни новых сущностей, ни новых состояний.
            """;

        public static string S4_Plan = $"""
            ## План

            1. ~~Завести ADR о том, где живёт незавершённая карта.~~ Выполнено:
               {nameof(Ban.Sdaid.Icd.Arch.Adr.ADR_012_UnfinishedCardLivesInPacket)}.
            2. ~~Завести документ обязательных атрибутов по видам ИК.~~ Выполнено:
               {nameof(Ban.Sdaid.Icd.Domain.Cards.Template.RequiredAttributes)}.
            3. Решить, нужен ли экран ведения состава видов и атрибутов или перечень меняется
               силами сопровождения. Вопрос **не к заказчику**: ему безразлично, как ведётся
               настройка, — важно, чтобы карты оцифровывались. Решается при планировании
               реализации.
            4. ~~Правки требований.~~ Выполнено: {nameof(Ban.Sdaid.Icd.Requirements.FR_005_Verification)}
               (выделение обязательных полей, откладывание проверки),
               {nameof(Ban.Sdaid.Icd.Requirements.FR_006_CardCreation)} (условие создания карты).
            5. ~~Поправить видение.~~ Выполнено: {SdaidAnchors.RefTo<IcdVision>()}, пункт «Проверка карты».
            6. ~~Описать в сценарии проверки выход без создания карты и возврат к отложенному пакету.~~
               Выполнено: {SdaidAnchors.RefTo<VerifyPacketUseCase>()}.
            7. ~~Обновить прототип и согласовать вид.~~ Выполнено: макет и спека
               {SdaidAnchors.RefTo<ProcessingQueuePage>()} обновлены и согласованы.
            8. Реализация: интерфейс, сохранение правок по мере ввода, наполнение справочника.
            """;

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

            | Пункт | Статус |
            |---|---|
            | Вопросы разбора сняты (вид ИК, место хранения, «Б.и.») | выполнено |
            | Место незавершённой карты: пакет ввода, а не состояние карты | решено, ADR-012 |
            | Список обязательных полей зафиксирован | выполнено для книги; рукопись и графика — ждём заказчика |
            | Пометка незаполненных полей | описана и показана на макете; реализация в работе |
            | Возврат к отложенному пакету | в работе |
            """;
    }
}