⟨/⟩ 40_Arch/ADR/ADR_013_ExportFileOnCardCreation.cs

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

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

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

        public string Name => "ADR-013. Файл выгрузки формируется при создании карты";

        public string Description =>
            @"Когда и по чьей команде появляется файл для АБИС: по отбору выборки вручную, по расписанию или при создании информационной карты.";

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

        public string[] Comments => new[]
        {
            "2026-08-28. Заведён по запросу на изменение «Выгрузка в АБИС по расписанию».",
        };

        public Type? Supersedes => null;

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

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

            По {nameof(Ban.Sdaid.Icd.Requirements.FR_007_AbisExport)} пользователь отбирал карты
            фильтрами реестра, отмечал строки и выгружал выборку одним действием. Правило отбора
            приходилось оговаривать отдельно — не отмечено ничего, значит выгружается вся выборка, —
            и оно же было самым опасным местом требования: ошибка означает передачу в АБИС не того
            объёма данных.

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

            Два обстоятельства меняют условие задачи. Первое: по
            {nameof(ADR_012_UnfinishedCardLivesInPacket)} неполной карты не существует, поэтому
            **всякая созданная карта пригодна к передаче** — отбирать и проверять нечего. Второе:
            Сервис файл **кладёт**, а не отправляет; что происходит с ним дальше, он не наблюдает.
            """;

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

            **Граница Сервиса — файл.** Сервис формирует файл выгрузки и сохраняет его. Загрузка
            файла в АБИС выполняется вне Сервиса и им не наблюдается.

            **Файл формируется при создании карты.** Действие «Создать ИК» и есть команда на выгрузку;
            отдельного действия у пользователя нет. Инициатор — хранитель, а не планировщик.

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

            **Пачка появляется только по требованию формата.** Если формат обмена не допускает файла
            на одну карту, добавляется сборка накопленных карт в общий файл по расписанию. Тогда
            и только тогда у Сервиса возникает работа, которую никто не инициировал.

            **Выгрузка — самостоятельная сущность:** момент, состав карт, файл. При выгрузке
            по карте состав — одна карта. Дата в информационной карте остаётся отметкой
            «файл сформирован», а подробности живут в выгрузке.
            """;

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

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

            Привязки к внешней системе при этом не возникает: Сервис пишет файл, а не обращается
            к АБИС. Доступность чужой системы не может помешать хранителю создать карту — эти два
            процесса разведены самой границей файла.

            Отметка «файл сформирован» честна: она утверждает ровно то, что Сервис наблюдал.
            Отметка «принято в АБИС» потребовала бы обратного канала, которого нет, и означала бы
            знание, которого у Сервиса не будет.

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

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

            - Ручная выгрузка на реестре карт сохраняется как **административное действие**:
              сформировать файл заново, если прежний утрачен или испорчен. Основным путём быть
              перестаёт.
            - Нужен **журнал выгрузок**: когда сформирован файл, какие карты вошли, где он лежит.
              Без него автоматически созданный файл незаметен.
            - Нужно место, где видно, что последняя выгрузка состоялась. Если формат потребует
              пачки и появится расписание, там же должно быть видно, что планировщик жив.
            - **Формат обмена определяет устройство решения**: допускает ли он файл на карту или
              требует пачку. До ответа (OQ-V-4) неизвестно, понадобится ли расписание вообще.
            - За то, что сформированный файл дошёл до АБИС, отвечает не Сервис. Кому и как
              передаётся файл — договорённость с заказчиком, а не часть Сервиса.
            - Карта после создания не правится, поэтому повторная выгрузка по изменению данных
              не возникает.
            """;

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

            **Отбор выборки вручную** — исходный порядок. Отвергнут заказчиком: отбор и файл обмена
            не относятся к работе библиотечного специалиста, а правило отбора допускает передачу
            не того объёма данных.

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

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

            **Состояние «принято в АБИС» у карты.** Отвергнуто: Сервис не наблюдает судьбу файла,
            и такое состояние было бы обещанием знания, которого нет.
            """;
    }
}