⟨/⟩ 40_Arch/ADR/ADR_012_UnfinishedCardLivesInPacket.cs

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

using System;
using Ban.Sdaid.Notation.Documents;
using Ban.Sdaid.Notation.Glossary;
using Ban.Sdaid.Icd.ChangeRequests;
using Ban.Sdaid.Icd.Glossary.Terms;

namespace Ban.Sdaid.Icd.Arch.Adr
{
    /// <summary>
    /// Решение: незавершённая работа над картой остаётся в пакете ввода. Информационная карта
    /// создаётся только с заполненными обязательными полями и состояния не имеет.
    /// </summary>
    public class ADR_012_UnfinishedCardLivesInPacket : IAdrDocument, IHasStructuralLinks
    {
        public static string _refName = "ADR-012 «Незавершённая карта живёт в пакете ввода»";

        public string Name => "ADR-012. Незавершённая карта живёт в пакете ввода";

        public string Description =>
            @"Где хранится работа над картой, которую не удалось закончить: в карте со статусом «черновик» или в пакете ввода.";

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

        public string[] Comments => new[]
        {
            "2026-08-26. Заведён по запросу на изменение «Обязательные поля ИК».",
        };

        public Type? Supersedes => null;

        public SdaidLink[] Links => new[]
        {
            Rel.Uses<DOC_CR_2026_08_25_MandatoryCardFields>(),
        };

        public static string S1_Context = $"""
            ## Контекст

            Часть обязательных полей может быть не заполнена на самом бумажном бланке. Заказчик
            просит не терять работу: сохранить проверенное, дособрать недостающие сведения
            и вернуться, чтобы дозаполнить. Выгружать такую карту в АБИС нельзя.

            Значения полей уже хранятся в {GlossaryAnchors.RefTo<InputPacket>("пакете ввода")} —
            вместе с уверенностью распознавания, кадром-источником и областью на нём; у пакета есть
            состояния и очередь, через которую к нему возвращаются. Информационная карта — результат
            проверки, состояния не имеет.
            """;

        public static string S2_Decision = """
            ## Решение

            **Незавершённая работа остаётся в пакете ввода.** Проверка завершается либо созданием
            карты, в которой заполнены все обязательные поля, либо ничем: пакет остаётся в состоянии
            «Проверка» за оператором вместе с внесёнными значениями.

            **Карта состояния не имеет.** Она создаётся только полной, и другой не бывает.
            «Черновик» — слово для описания ситуации, а не сущность модели и не элемент интерфейса.
            """;

        public static string S3_Rationale = """
            ## Обоснование

            Требование звучит как «не терять работу», а не как «завести неполную карту». Работа —
            это распознанные и поправленные значения, и они уже лежат в пакете. Дать карте статус
            «черновик» значит скопировать их туда же второй раз и держать один факт в двух местах,
            нарушив принятое правило: значения принадлежат пакету, потому что уверенность, кадр
            и область суть данные о распознавании, а не о результате.

            Полнота карты становится **инвариантом** вместо проверки. Запрет «не выгружать неполную
            карту» — правило, которое нужно всюду помнить и можно забыть: допустить существование
            объекта, а потом везде оговаривать, что с ним нельзя. Когда неполной карты не существует,
            запрещать нечего.

            Реестр карт остаётся реестром готовых карт, и ни выгрузке, ни поиску, ни отчётности
            не приходится различать два сорта записей.
            """;

        public static string S4_Consequences = """
            ## Следствия

            - Новых сущностей и состояний не появляется; миграций схемы не требуется.
            - Возврат к отложенной работе идёт через очередь тем же экраном проверки — второй экран
              редактирования карты не нужен.
            - Пакет живёт дольше обычного: занимает место в хранилище и остаётся закреплённым
              за оператором, пока тот не создаст карту или не вернёт пакет в очередь.
            - Жёсткое удаление пакета уничтожает и внесённые значения — это осознанная цена,
              такое удаление доступно не всякому.
            - Поле, которое нельзя установить в принципе, — повод пересмотреть перечень обязательных
              атрибутов вида, а не повод заводить карту-исключение.
            """;

        public static string S5_Alternatives = """
            ## Отвергнутые варианты

            **Карта со статусом «черновик».** Проверка всегда завершается созданием карты; неполная
            получает статус, к ней возвращаются и дозаполняют. Отвергнут: у карты появляется
            жизненный цикл, значения хранятся дважды, реестр карт смешивает черновики с готовыми
            картами, выгрузка обязана проверять статус, и требуется второй экран редактирования —
            с изображениями бланка, то есть та же проверка заново.
            """;
    }
}