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 = """
## Отвергнутые варианты
**Отбор выборки вручную** — исходный порядок. Отвергнут заказчиком: отбор и файл обмена
не относятся к работе библиотечного специалиста, а правило отбора допускает передачу
не того объёма данных.
**Выгрузка только по расписанию.** Предложение заказчика в буквальном виде. Отвергнуто
как основной путь: если формат допускает файл на карту, расписание лишь откладывает
то, что можно сделать сразу, и заводит фонового исполнителя без нужды. Остаётся
в запасе на случай, когда формат требует пачку.
**Вкладка «Передача в АБИС» на проверке пакета.** Отвергнута: вкладки отвечают
на вопросы о пакете, а не показывают результат; в момент, когда вкладка была бы уместна,
карты ещё нет, а сразу после её создания пользователь уходит к следующему пакету.
Содержимое файла обмена адресовано не оператору.
**Состояние «принято в АБИС» у карты.** Отвергнуто: Сервис не наблюдает судьбу файла,
и такое состояние было бы обещанием знания, которого нет.
""";
}
}