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