using Ban.Sdaid.Notation.Documents;
using Ban.Sdaid.Icd.Ui.Pages;
namespace Ban.Sdaid.Icd.Requirements
{
/// <summary>Проверка результатов распознавания оператором — задача 5 ТЗ.</summary>
public class FR_005_Verification : IFunctionalRequirementDocument
{
public static string _refName = "FR-005 «Верификация»";
public string Name => "FR-005. Верификация и корректировка данных";
public string Description =>
@"Сервис должен предоставлять рабочее место проверки: исходные данные пакета и результаты распознавания рядом с изображением, с возможностью корректировки и создания информационной карты.";
public string Version => "0.3";
public string Status => "draft";
public string[] Comments => new[]
{
"2026-08-26. По CR «Обязательные поля ИК»: выделение обязательных полей и откладывание проверки.",
};
public static string S1_Tabs = """
## Две вкладки проверки
Проверка пакета ведётся на двух вкладках.
| Вкладка | Что проверяется |
|---|---|
| Пакет ввода | состав кадров, опознанный вид ИК и соответствие кадров страницам формы |
| Проверка карты | значения полей рядом с изображением, их правка и создание карты |
Подтверждения этапов нет: пользователь либо создаёт информационную карту, либо
возвращает пакет в очередь.
""";
public static string S2_SourceTab = """
## Вкладка «Пакет ввода»
Показывается опознанный вид ИК, форма бланка и состав её страниц. Напротив каждой
страницы — кадр, который Сервис ей сопоставил, либо предложение доснять недостающий.
Пользователю доступно:
- **просмотр кадра** в полном размере, с лупой и переключателем «оригинал / обработанное»;
- **пересъёмка** и повторная загрузка кадра;
- **удаление** кадра;
- **переназначение страницы**: указать, что кадр относится к другой странице формы,
либо снять назначение;
- **досъёмка** страницы, для которой кадра нет.
Кадр, не отнесённый ни к одной странице, — лишний: он не распознаётся, а его удаление
и исключение повторной обработки не требуют.
Правка кадров, влияющих на разбор, делает результаты распознавания недействительными:
пакет возвращается в очередь по команде пользователя «Поставить в очередь», после чего
предлагается взять следующий пакет.
Если вид ИК определён неверно, пользователь отклоняет его действием «Вид ИК не распознан»
и может указать верный. Пакет уходит на повторную обработку с этим контекстом; при
неизвестном верном виде пакет помечается ошибочным.
""";
public static string S3_CardTab = $"""
## Вкладка «Проверка карты»
Распознанные значения показываются так, как они размещены на бланке: страница, раздел,
подпись поля. У каждого значения видна уверенность распознавания.
Значения можно править. **Распознанное сохраняется**: рядом с исправленным значением
видно, что прочла модель. Повторная обработка не затирает внесённое пользователем.
Выбор поля показывает страницу-источник с подсвеченной областью, из которой получено
значение; лупа позволяет разобрать рукописный текст, не открывая кадр отдельно.
**Экземпляр фонда не подбирается.** Привязка карты к экземпляру в состав Сервиса
не входит — это возможная доработка. Карта уходит в АБИС без идентификатора документа,
а сопоставление идёт по шифру и инвентарному номеру: они обязательны и в карте есть
всегда.
**Состав экспертов** сверяется со справочником; отсутствующего эксперта можно внести
в справочник, не покидая проверки.
**Обязательные поля выделены** так, чтобы незаполненное было видно сразу, без открытия
каждого раздела. Какие атрибуты обязательны, задаёт состав вида документа; перечень —
{SdaidAnchors.RefTo<Ban.Sdaid.Icd.Domain.Cards.Template.RequiredAttributes>()}.
**Создание карты** завершает проверку. Оно недоступно, пока не заполнены обязательные
поля состава: это единственный контроль полноты — состав кадров на него не влияет.
**Проверку можно отложить.** Правка значения сохраняется в пакете сразу, как её внесли,
отдельного действия сохранения нет. Пользователь, которому не хватает сведений, уходит
действием **«Взять следующий»**: пакет остаётся за ним в состоянии «Проверка», и он
возвращается к нему через очередь, когда сведения найдутся. Решение о том, где живёт
незавершённая работа, — {nameof(Ban.Sdaid.Icd.Arch.Adr.ADR_012_UnfinishedCardLivesInPacket)}.
""";
public static string S9_Prototype = $"""
## Прототип интерфейса
Требование реализуется на экране {SdaidAnchors.RefTo<ProcessingQueuePage>()}: слева очередь пакетов
с фильтром по состояниям, справа — две вкладки проверки выбранного пакета.
{SdaidHtml.LinkTo<ProcessingQueuePage>("queue.html", "Открыть прототип в новой вкладке")}
{SdaidHtml.IframeOf<ProcessingQueuePage>("queue.html", 720)}
""";
public static string S99_Related = $"""
## Связанные артефакты
- {nameof(Ban.Sdaid.Icd.Arch.Adr.ADR_008_PacketStatesAndTwoTabs)} — решение о четырёх состояниях и двух вкладках
- {nameof(Ban.Sdaid.Icd.Arch.Adr.ADR_007_InputWithoutPlan)} — решение о вводе без плана
- {nameof(Ban.Sdaid.Icd.Arch.Adr.ADR_012_UnfinishedCardLivesInPacket)} — решение о месте незавершённой работы
""";
}
}