⟨/⟩ 35_ChangeRequests/DOC_CR_2026_08_28_AbisExportWithoutSelection.cs

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

using Ban.Sdaid.Notation.Documents;
using Ban.Sdaid.Icd.Requirements;
using Ban.Sdaid.Icd.Ui.Pages;
using Ban.Sdaid.Icd.Domain.Cards;

namespace Ban.Sdaid.Icd.ChangeRequests
{
    /// <summary>
    /// Запрос на изменение: отбор выборки и выгрузка вручную перестают быть путём передачи
    /// в АБИС. Файл формируется при создании карты.
    /// </summary>
    public class DOC_CR_2026_08_28_AbisExportWithoutSelection : IChangeRequestDocument, IHasStructuralLinks
    {
        public static string _refName = "запрос на изменение «Выгрузка в АБИС без отбора выборки»";

        public string Name => "Выгрузка в АБИС без отбора выборки";

        public string Description =>
            @"Отбор выборки и выгрузка вручную признаны лишней работой для библиотечного специалиста. Файл выгрузки формируется при создании карты; ручная выгрузка остаётся административной.";

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

        public string[] Comments => new[]
        {
            "2026-08-28. Заведён по итогам обсуждения с заказчиком.",
            "2026-08-28. Переработан: решение — файл при создании карты, а не расписание; расписание нужно только при пачечном формате.",
        };

        public SdaidLink[] Links => new[]
        {
            Rel.Uses<FR_007_AbisExport>(),
            Rel.Uses<FR_011_CardRegistry>(),
            Rel.Uses<InformationCardsPage>(),
            Rel.Uses<InformationCardSpec>(),
            Rel.Uses<Ban.Sdaid.Icd.Arch.Adr.ADR_013_ExportFileOnCardCreation>(),
            Rel.Uses<Ban.Sdaid.Icd.Arch.Adr.ADR_012_UnfinishedCardLivesInPacket>(),
        };

        public static string S1_Source = """
            ## Источник

            Со слов заказчика:

            > Заказчику не понравилась идея, что надо на вкладке «Информационные карты» отфильтровать
            > выборку и выгрузить выборку в файл для АБИС, это лишние действия специалиста библиотеки,
            > далёкого от выгрузок из одной АИС в другую, интеграции, файлов обмена и информационных
            > технологий. Заказчик предложил делать выгрузку автоматически по расписанию.

            Встречное предложение при обсуждении:

            > Но у меня возникла такая идея: при проверке пакета добавить к «Пакет ввода» и «Проверка
            > карты» ещё одну вкладку «Передача в АБИС». На вкладке показывать: реквизиты файла,
            > содержимое текстового файла для передачи в АБИС.
            """;

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

            ### Требуется

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

            ### Расписание оказалось не нужно

            Заказчик просил автоматическую выгрузку по расписанию, но условие задачи мягче,
            чем казалось. Во-первых, по
            {SdaidAnchors.RefTo<Ban.Sdaid.Icd.Arch.Adr.ADR_012_UnfinishedCardLivesInPacket>()}
            неполной карты не существует, значит всякая созданная карта пригодна к передаче
            и отбирать нечего. Во-вторых, Сервис файл **кладёт**, а не отправляет: доступность АБИС
            на работу оператора не влияет.

            Поэтому файл формируется **сразу при создании карты**: действие «Создать ИК» и есть
            команда на выгрузку. Требование заказчика выполняется полнее, чем расписанием, —
            действий не остаётся вовсе, а не переносится на ночь.

            Расписание понадобится **только если формат обмена не допускает файла на одну карту**
            и потребует собирать пачку. Решение и его границы —
            {SdaidAnchors.RefTo<Ban.Sdaid.Icd.Arch.Adr.ADR_013_ExportFileOnCardCreation>()}.

            ### Что отпадает

            Правило отбора выборки — «если строки не отмечены, выгружается вся выборка по фильтрам,
            если отмечены, то отмеченные». Оно было самым хрупким местом требования: ошибка означает
            передачу в АБИС не того объёма данных.

            ### Вкладка «Передача в АБИС» — отклонена

            **Момент жизни не тот.** Вкладка живёт в пакете, а файл строится по карте. Пока «Создать
            ИК» не нажата, карты нет; после нажатия пакет завершён, и пользователь переходит
            к следующему.

            **Вкладки — это вопросы, а не этапы.** По
            {SdaidAnchors.RefTo<Ban.Sdaid.Icd.Arch.Adr.ADR_008_PacketStatesAndTwoTabs>()} их две,
            потому что вопросов о пакете два: верны ли исходные данные и верно ли Сервис их прочитал.
            Показ результата — не вопрос о пакете.

            **Адресат не тот.** Заказчик указывает, что специалист далёк от файлов обмена. Проверить
            и исправить содержимое такого файла он не сможет.

            ### Что надо вернуть

            Пока пользователь выгружал сам, он видел, что выгрузил. Теперь файл появляется без него,
            поэтому заводится **журнал выгрузок**: когда сформирован файл, какие карты вошли, где
            он лежит. Содержимому файла место здесь — тут его читает тот, кто в состоянии
            с ним что-то сделать.

            ### Ручная выгрузка

            Остаётся на {SdaidAnchors.RefTo<InformationCardsPage>()} как административное действие:
            сформировать файл заново, если прежний утрачен. Основным путём быть перестаёт; поиск,
            фильтры и отметку о выгрузке реестр сохраняет.

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

            | Решение | Почему |
            |---|---|
            | Файл формируется при создании карты | отбор выборки — работа не для библиотечного специалиста, а отбирать и нечего |
            | Граница Сервиса — файл; загрузка в АБИС вне его | Сервис файл кладёт, а не отправляет, и судьбы его не наблюдает |
            | Отметка означает «файл сформирован» | другого Сервис не знает; состояния «принято в АБИС» у карты нет |
            | Расписание — только при пачечном формате | иначе оно откладывает то, что можно сделать сразу |
            | Выгрузка — самостоятельная сущность | по одной дате в карте не собрать, что ушло вместе, и не за что зацепить повтор |
            | Заводится журнал выгрузок | файл появляется без участия человека и иначе незаметен |
            | Ручная выгрузка сохраняется как административный путь | нужна, если файл утрачен |

            ### Требует уточнения у заказчика

            Кому и как передаётся сформированный файл, кто отвечает за то, что он дошёл.

            **OQ-V-4 определяет устройство решения.** Пока формат не назван, неизвестно, допускает ли
            он файл на карту, — а значит, неизвестно, понадобится ли расписание вообще.
            """;

        public static string S3_BlastRadius = $"""
            ## Что затронуто

            | Артефакт | Что меняется |
            |---|---|
            | {SdaidAnchors.RefTo<FR_007_AbisExport>()} | выгрузка привязана к созданию карты; правило отбора выборки уходит из основного сценария |
            | {SdaidAnchors.RefTo<FR_011_CardRegistry>()} | реестр перестаёт быть местом, где формируется выборка на выгрузку |
            | {SdaidAnchors.RefTo<InformationCardsPage>()} | панель выгрузки становится административной |
            | Видение, п. 7 и сценарий 4 | экспорт перестаёт быть отдельным действием хранителя |
            | Новая сущность «выгрузка» | заводится: момент, состав карт, файл |
            | Новый экран «Журнал выгрузок» | заводится |
            | {SdaidAnchors.RefTo<InformationCardSpec>()} | не меняется: дата выгрузки уже есть |
            """;

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

            1. ~~Завести ADR о моменте выгрузки.~~ Выполнено: ADR-013.
            2. ~~Описать сущность «выгрузка» в доменной модели.~~ Выполнено: `Export/CardExport`.
            3. ~~Переписать FR-007.~~ Выполнено.
            4. ~~Поправить FR-011 и спеку экрана реестра.~~ Выполнено.
            5. ~~Поправить видение: раздел 4.2.~~ Выполнено. Перечень задач в разделе 2 — цитата ТЗ, не правится.
            6. ~~Описать экран «Журнал выгрузок».~~ Выполнено; макет ждёт согласования.
            7. Задать заказчику вопросы: формат обмена (OQ-V-4), кому передаётся файл и кто за это отвечает.
            """;

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

            | Что | Состояние |
            |---|---|
            | Отбор выборки вручную как основной путь | отменён |
            | Файл при создании карты | принято, ADR-013 |
            | Выгрузка по расписанию | только при пачечном формате |
            | Третья вкладка «Передача в АБИС» | отклонена |
            | Сущность «выгрузка» | описана |
            | Журнал выгрузок | описан, макет ждёт согласования |
            | Формат выгрузки | блокирующий вопрос к заказчику |
            """;
    }
}