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 |
| Список обязательных полей зафиксирован | выполнено для книги; рукопись и графика — ждём заказчика |
| Пометка незаполненных полей | описана и показана на макете; реализация в работе |
| Возврат к отложенному пакету | в работе |
""";
}
}