- окно обновления bj после перезапуска ведёт обновление ИШ по этапам (загрузка, остановка,
резервная копия, установка, запуск, проверка) и закрывается только после проверки;
пока шлюз обновляется, то же окно на любой странице
- bj-igate-admin: этапы stop/backup/verify; после запуска сверяются версия, служба, движок,
каналы и ключ с прежними (иначе автооткат), обмен с НРД
- версия ИШ в строке НРД читается всегда заново (кэш 6 ч — только сайт НРД);
после установки версии пересобираются сразу
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
- Обновление ИШ из обновления bj: страница «Шлюз НРД» (мастер и «Настройка → НРД»)
перекрывается окном с ходом установки; успех — перезагрузка страницы, ошибка —
текст и журнал. Статус ИШ отдаёт upgrade_to (получена версия, обновится сам) и
installing (идёт установка) — вместо «ИШ не работает» и кнопки переустановки.
- Сбой после полного бэкапа (dpkg, запуск, движок не в Running) — bj-igate-admin
сам откатывает ИШ к прежней версии (этап rollback); итог — ошибка «обновление до X
не прошло: …, ИШ автоматически откатан к Y и работает». Проверено на 28
искусственным сбоем после установки пакета.
- Откат не опускает счётчики id в базе ИШ: иначе новые пакеты получали бы уже
виденные bj номера и поллер их пропускал.
- Автообновление ИШ после перезапуска ядра — через 20 с (было 2 мин), с повторами
через 2 и 10 мин, если дистрибутив дописан позже. В итоге обновления bj —
пояснение, что сам шлюз обновится через несколько минут.
- Строка версий над разделом НРД обновляется сразу при смене версии ИШ.
- Сводка «НРД → Организация» и раскрытие «Перенастроить» смотрят организацию так
же, как bj (orgEff: введённое или из справочника по коду) — не «не задана», когда
ИНН взят из справочника.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
- Одобрен дистрибутив ИШ 110.0.997 (deploy/release/igate-approved): клиенты
получают его компонентом igate-dist, bj-server обновляет ИШ сам (igateAutoUpgrade)
после применения обновления. Проверено на 28: установка 107.0.930 → 110.0.997
штатным bj-igate-admin, каналы сохранены, круг #M2MHR → #M2MTH с НРД TEST3 и
приём ответа поллером bj — работают.
- Бэкап перед установкой/обновлением ИШ стал полным: кроме /opt/nsd/igate и дампа
базы — данные /var/lib/igate (без флешки с ключом и кэша), юнит, обёртка запуска,
версия. Раньше откатиться было нечем: igate-dist.zip перезаписывается новой версией.
- bj-igate-admin rollback / rollback-now: возврат программы, данных и базы ИШ из
последнего бэкапа (pg_restore от postgres — с мандатными метками Astra). После
отката пришедшая версия не ставится автоматически (/var/lib/bj/igate-autoupgrade-skip),
следующая — снова да. Проверено на 28: 110.0.997 → 107.0.930 за 40 с, обмен с НРД работает.
- «Шлюз НРД»: кнопка «Откатить ИШ к <версия>», когда есть полная резервная копия.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
- Необязательные шаги «Модули», «Оповещения и копии», «Учётные записи» и каждый
модуль отдельно можно отложить кнопкой «Настроить позже»: мастер считает их
завершёнными, глава «Запуск» закрывается. Отметку можно снять («Вернуть в
мастер»); как только шаг настроен по-настоящему, отметка не показывается.
Хранится в /var/lib/bj/.bj/wizard-deferred.json (wizdefer.go).
- Шаг «Оповещения и копии» показывает, что уже настроено: почта, Zabbix,
резервные копии — видно частичную настройку, сделанную в «Настройке».
- Плашка «Требуется настройка — N из M» на главной считалась по старому списку
из 9 шагов и расходилась с мастером. Теперь и мастер, и главная используют одну
функцию wizDone и путь wizPath — те же шаги, лицензия и отметки «отложено».
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
На странице «Исходящие» (/admin/claims) сверху показываем карточку регистрации
участника: когда отправили анкету, пакет, наименование и вердикт НРД («принял»
/ «отклонил» с текстом, напр. M2M37). Данные — из participant-reg.json
(template-функция participantRegHTML). Карточки нет, пока анкету не отправляли.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
Ответ НРД на анкету приходит как M2MTransferResponse (M2MER) с нулевым GUID —
раньше он уходил в обработку перевода, «сделка не найдена», и отбрасывался.
Теперь нулевой GUID распознаётся как ответ на регистрацию участника:
- сырой XML сохраняется (captureNSDReply → nsd-replies);
- отправка анкеты и ответ НРД пишутся в participant-reg.json (время, пакет,
наименование, статус, коды, текст НРД);
- на странице «Регистрация участника M2M» показываем: когда отправили и вердикт
НРД («принял»/«отклонил» с текстом, напр. M2M37 «Некорректно указано
наименование участника в анкете»).
Текст берётся из самого ответа (serviceErrorTexts) — карту кодов не трогаем.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
Регистрация подтверждается двумя путями: ответным документом НРД (ловим в
поллере) ИЛИ появлением организации в справочнике участников M2M боевого
контура. На странице анкеты добавлен статус: ищем нашу организацию в справочнике
по MC-коду, затем по ИНН (handbookByCode/handbookByINN); «есть» — регистрация
подтверждена, «нет» — ждём приёма анкеты (справочник обновляется ~10 минут).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
После отправки анкеты участника (#M2MPF) НРД присылает ответ, схему которого мы
ещё не разбираем. Фаза 1 — отловить его на боевом контуре:
- входящий с корнем M2MTransferParticipantForm сохраняется как подлинный XML и
логируется отдельно (ответ НРД на анкету);
- любой неизвестный M2M-документ в default теперь тоже сохраняется (раньше молча
пропускался), чтобы увидеть реальный тип/схему.
Файлы: /var/lib/bj/.bj/nsd-replies/<время>-<tag>-id<N>-<тип>.xml (последние 100).
Разбор ответа встроим в систему, когда увидим реальный документ на бою.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
- Кнопка «Включить для всех пользователей» с предупреждением: заполнение
портфеля запускается для ВСЕХ открытых торговых счетов DEPO (по префиксу),
договор ЛК выводится из счёта по шаблону — так же как в тесте с одним клиентом,
только по торговым счетам. Поле AllClients; tick берёт пары из
lkPortfolioAllPairs. Прежний режим «по списку» (Pairs) сохранён.
- Поля именования (префикс счёта, шаблон договора, раздел, место хранения)
предзаполняются из базы DEPO (префикс — depoAccPrefix) и значений по умолчанию,
остаются редактируемыми.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
Ссылка вела на отдельную страницу. В разделе «НРД» карточка «Регистрация
участника M2M» теперь раскрывается вниз (<details>) и показывает анкету в том же
окне через iframe того же origin (lazy — грузится при раскрытии). Отдельная
вкладка оставлена запасной ссылкой.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
- В «Настройка → НРД» добавлена карточка «Регистрация участника M2M» со ссылкой
на /admin/setup/participant-form (раньше страница была только по URL).
- participantFormPrefill теперь заполняет анкету по реквизитам фирмы, а не только
из автоопределения DEPO: берёт ИНН/коды из настроек НРД и наименования
(полное/сокращённое/отображаемое/англ.) из справочника участников НРД
(по MC-коду, затем по ИНН); DisplayName/Short подставляются, если пусты.
- org.go: добавлен handbookByINN.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
Поля задавались «в двух местах» и выглядели нелогично. На деле это две разные
модели обмена заявками, а не дубли:
- pull — bj сам обращается к API ЛК (per-env, HTTP Basic), забирает заявки и
туда же PATCH-ит статус (lkActiveEndpoint/OnLKOutcome);
- push — ЛК сам шлёт заявки на bj (POST /claims/), статус bj возвращает на
единый CallbackURL (service.go).
Блок API ЛК помечен как «(pull) — основная модель». Поле Callback URL помечено
как push-модель и свёрнуто в <details> (развёрнуто только если уже заполнено) —
при подключении через API оно не используется. Поведение и структура настроек
не изменены, только текст и вёрстка.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
На шаге «Ключ и сертификаты» таблица установленных сертификатов (сотни строк)
разворачивала страницу. Обёрнута в <details>: по умолчанию свёрнута, счётчик
виден в заголовке, раскрывается кликом. На странице «Настройка» этот список уже
свёрнут — приведено к тому же виду.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
После успешной установки ключа на шаге «Ключ и сертификаты» не появлялась
кнопка «Далее»: шаг считался выполненным только по асинхронной сверке
справочника ИШ (nsdCertsCheck), а она сразу после установки отваливалась по
таймауту — root-воркер был занят перезапуском ИШ и повторной активацией
профиля. Ключ при этом уже подключён и подписывает.
- refreshCertStore: повторяет сверку до 5 раз (воркер освобождается — проходит),
вместо одной попытки с таймаутом.
- Шаг 8 в мастере выполнен, если справочник собран ИЛИ мастер ключа прошёл до
конца (ИШ подтвердил подпись) — «Далее» появляется сразу, не дожидаясь сверки.
Добавлен потокобезопасный keyWizardState.installed().
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
Верх страницы «Шлюз НРД» был перегружен текстом. Интро шага 7 сокращено до
одной строки; пояснение про версию ИШ в карточке «Шлюз на этом сервере» ужато
в одну тонкую строку, заголовок поджат. Смысл сохранён, статус ИШ стал заметнее.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
Раньше поле пароля было пустым с подсказкой «пусто — прежний», и оператору
приходилось нажимать «Сгенерировать». Теперь при открытии страницы, если папки
шлюза ещё не открыты по сети, bj сразу подставляет в поле новый надёжный пароль
(genPw, 16 символов, crypto.getRandomValues) и показывает его. Оператор может
оставить его или вписать свой. Если папки уже открыты — поле остаётся пустым
(пустое = оставить прежний пароль при повторном сохранении).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
Ключ организации на странице «Статус» теперь строится из своего сертификата
в справочнике активного профиля ИШ (ownStoreCerts), включая истёкший: карточка
показывает владельца, издателя, контур (боевой/тестовый) и срок. Истёкший ключ
виден явной пометкой «ИСТЁК» и отдельным заголовком, а не маскируется под
«ключ не подключён». Показать владельца ДО установки ключа нельзя — сертификата
нет в файлах флешки, он появляется в справочнике профиля только после установки.
Папки шлюза по сети (простой режим): кнопка «Сгенерировать» создаёт надёжный
пароль (16 символов, crypto.getRandomValues) прямо в поле, поле теперь видимое;
после сохранения пароль показывается один раз с кнопкой «Скопировать» —
записать, так как позже bj его не покажет. Пустое поле по-прежнему оставляет
прежний пароль при повторном сохранении.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
Пересборку справочника crestor запускает igate, а /var/lib/bj был 0750 bj:bj —
igate не мог пройти в staging и выдавал ложное «нет local.pse». bj-server при
старте даёт /var/lib/bj traverse (0751) — доезжает обновлением. Воркер
bj-keymedia-install тоже даёт права и показывает реальную ошибку crestor вместо
спама «dropped older CRL» (для новых ISO). Убрана ошибочная подсказка про ГСЧ.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
Раньше готовность кэшировалась в памяти и не возвращалась в «не готов»: после
перезагрузки ВМ seed Валидаты пропадал, а bj рапортовал «готов» и прятал карточку
датчика — пересборка справочника падала без понятной причины. Теперь rngCheck
каждый раз проверяет живьём у воркера.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
Если контур НРД уже выбран в мастере (WantContour), на шаге «использовать ключ
с флешки» показываем его фиксированно («Боевой — выбран в мастере») с кнопкой
«Изменить», а не радио-вопросом заново. При расхождении с контуром по сертификату
— предупреждение.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
При отсутствии флешки по умолчанию выбирался режим «Сформировать на новой
флешке», и после «Перепроверить флешку» экран прыгал туда. Теперь по умолчанию
всегда «Подключить флешку» (пустое состояние внутри с кнопкой перепроверки).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
- В режиме флешки — кнопка «↻ Перепроверить флешку» (и когда флешка есть, и когда нет)
с индикатором «Ищу флешку…».
- Пустое состояние поясняет: на виртуальной машине USB нужно пробросить в гостя.
- listFlashDrives ловит и съёмный диск с ФС без таблицы разделов (type=disk).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
Свёрнутый блок «Что должно быть на флешке» в шаге «Ключ подписи»: ключ *.vdk
(обязательно), папка spr<N> с local.gdbm+local.pse (обязательно), *.crl/key.reg/
vdkeys необязательны; раскладка любая — bj ищет *.vdk и spr<N>/local.gdbm в любой
папке (как в bj-keymedia-install stage-media).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
- quikDetectAccounts: Export не имеет колонки QuikFirm (ошибка 207 Invalid column
name) — запросы по Actions/Export выполняются по отдельности, источник без нужной
колонки пропускается.
- «Полный ответ сервера (последняя проверка)» свёрнут в details, чтобы не прятать
настройки ниже.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
Кнопка была submit внутри формы режима, у которой обработчик submit делает
preventDefault — клик ничего не отправлял. Теперь type=button + fetch на
/admin/setup/quik/detect-account (X-BJ-Ajax), результат в строке статуса,
найденный счёт подставляется в поле.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
Кнопка «Определить из QUIK» у поля «Торговый счёт для поручений» (режим
чтение+запись). bj читает distinct Account из Actions/Export по коду фирмы
(QuikFirm/FirmID = код участника): один счёт — подставляет, несколько —
показывает на выбор, нет истории — просит ввести вручную. Только чтение.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
Причина «нет процедур» при успешной установке: проверка идёт логином bj_user, а
OBJECT_ID под ним возвращает NULL для объектов без прав — FTV_M2M_JOB виден (ему
выдан EXECUTE), 4 FTV_M2M_PROCESS_* нет. Процедуры установлены и работают (JOB
вызывает их по цепочке владения dbo), но проверка их не видела.
Теперь установка и скачиваемый скрипт выдают GRANT EXECUTE на все 5 процедур.
Убрана ложная блокировка установки по отсутствию пользователя SYSDBA (CREATE
проходит и без него; строка EXECUTE AS проверяется в рантайме).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
Процедуры FTV_M2M_PROCESS_* содержат EXECUTE AS USER=SYSDBA; SQL Server требует
этого пользователя при CREATE (FTV_M2M_JOB без EXECUTE AS создаётся, а 4 PROCESS_* — нет).
- «Проверить возможности» проверяет наличие пользователя EXECUTE AS (из текста процедур)
и блокирует установку с понятным сообщением, если его нет.
- Ошибка установки сохраняется в статус (не мелькает флешем) с подсказкой про SYSDBA.
- Подсказка добавлена и в мастере при «Подготовить».
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
- «Подготовить» в мастере (step 3, режим «дать логин администратора») теперь ставит
и процедуры обработки bj2depo (CREATE OR ALTER) + GRANT, не только логин/таблицы/джобу.
- Скачиваемый скрипт мастера включает процедуры.
- Тексты процедур редактируются под клиента (Настройка → Обмен DEPO → Процедуры):
сохранённый вариант используется при установке и при «Подготовить». Пусто/совпадение
со встроенным — исходная версия.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
Процедуры FTV_M2M_PROCESS_* и FTV_M2M_JOB встроены в bj (depoprocs/*.sql).
В разделе «Учёт DEPO» карточка «Процедуры обработки bj2depo»:
- «Проверить возможности» — подключение, это ли база DEPO, какие процедуры
установлены, есть ли право CREATE PROCEDURE и логин bj в базе (ничего не меняет);
- «Установить» — логином администратора SQL (разово, не сохраняется) выполняет
CREATE OR ALTER в порядке WIRING→OPERATION→EVENTS→CREATE→JOB и GRANT EXECUTE
на FTV_M2M_JOB логину bj; без прав — отказ без изменений;
- скачивание единого скрипта для ручной установки в SSMS.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
Новый шаг 14 «Обновление» в отдельной первой главе мастера. Секция
«Обновления» вынесена из admin_setup.html в {{define "updateSection"}}
(part_fancy.html) и переиспользуется и в настройках, и в шаге мастера —
один источник правды. В мастере рендерится обычным блоком (без
settings-section/active), заголовок h1 скрыт (есть свой h2 шага).
Шаг необязательный (не блокирует путь), зелёный пока нет версии новее;
при наличии обновления — предупреждающая точка. Добавлена пятая глава,
поэтому wizChaptersLine расширен до «Пять глав».
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XG3zNMMf2LMoDpXo22mwMX
Шаг «Время и сеть»:
- Кнопка «Синхронизировать»: bj сам пробует российские серверы точного
времени ВНИИФТРИ (мини-SNTP зонд по UDP/123), и только если из сети они
недоступны — просит указать свой сервер (контроллер домена/маршрутизатор).
Статус времени берётся из timedatectl (timeSynced), а не из флага шага.
- Поле «Доменное имя сервера»: имена вписываются в самоподписанный сертификат
(SAN), чтобы интерфейс открывался по имени без предупреждения браузера.
Сертификат перевыпускается на лету; A-запись заводит админ сети на DNS.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XG3zNMMf2LMoDpXo22mwMX
Требование: в тест анкету не слать, подача только в бою. send_igw теперь
пропускается лишь при боевом канале ИШ (Channel=PROD, профиль prod-*);
в тестовом/гостевом контуре отправка через шлюз заблокирована (кнопка
disabled + явный статус, серверная проверка isProdIGW как defense-in-depth).
Скачивание XML и письмо на M2MOST@nsd.ru остаются доступны везде.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XG3zNMMf2LMoDpXo22mwMX
НРД открыл приём анкеты (M2MTransferParticipantForm) в пром-контуре.
По формату НРД анкета — отдельный тип ЭД M2MPF: тег <package> = "#" +
первые 5 символов имени типа ЭД → "#M2MPF", businessLine=MOST (как и
остальные M2M-сообщения; на ИШ <107.0.0.904 businessLine опускается).
Подпись — боевым ГОСТ-контейнером на стороне ИШ.
- nsdadapter/router.go: тип PackageM2MParticipantForm "#M2MPF";
KindParticipantForm теперь маппится на него (был ошибочно
Assets_investment).
- lkgateway/participant_form.go: действие send_igw — упаковка анкеты
через igw.PackXML(..., "#M2MPF") и отправка igwClient.SendPackage в
канал профиля (в боевом контуре — prod-gost). Кнопка «Отправить через
шлюз (боевой ИШ)»; письмо на M2MOST@nsd.ru оставлено запасным каналом.
Статус готовности ИШ на странице.
- lkgateway/server.go: проброс igwClient/igwChannel в registerParticipantForm.
Образец — sendHandbookRequest (#M2MHR) через тот же ИШ.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XG3zNMMf2LMoDpXo22mwMX
Страница /admin/setup/client-profile: скачать эталон текущей конфигурации (секреты
затёрты) и — для стенда — применить профиль клиента вручную. На боевом профиль
приходит с сервера лицензий (поле config_profile в ответе активации/продления) и
предзаполняет ещё НЕ настроенные разделы мастера, ничего не перетирая. Локальный
фолбэк — файл client-profile.json рядом с setup.json. Администратор правит профиль
под клиента на lic (отличия от стандарта).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XG3zNMMf2LMoDpXo22mwMX
Требование НРД при подключении к сервису M2M (МОСТ): зарегистрировать организацию
в справочнике участников анкетой M2MTransferParticipantForm, иначе сервис отбивает
запросы кодом M2M14. Регистрация идёт ОБЫЧНЫМ каналом (письмом на M2MOST@nsd.ru с
вложением), не через M2M-шлюз.
- Новая страница /admin/setup/participant-form (participant_form.go):
предзаполнение из автоопределения DEPO (ИНН, наименования, код депозитария),
правка оператором, валидация (формат ИНН/кодов + m2m.HandbookParticipant.Validate),
предпросмотр анкеты, «Скачать» (windows-1251) и «Отправить в НРД» письмом с
вложением-анкетой.
- Генерация XML строкой-шаблоном по образцу НРД (namespace participant/form,
CreationTimestamp по МСК, блоки Eng/BrokerPlace — опциональны), кодировка
windows-1251 через nsdxml.EncodeWindows1251; экранирование текста только & < >.
- Почта: выделен транспорт smtpDeliver из sendSMTP; добавлены buildMIMEAttach
(multipart/mixed + base64-вложение) и sendSMTPAttach.
- Тесты: валидация, генерация XML (Eng/BrokerPlace), cp1251 round-trip, MIME-вложение.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XG3zNMMf2LMoDpXo22mwMX
- Карточка заявки: операторский «Путь заявки» (claimTimelineOperator) короткими
понятными вехами + сворачиваемый технический журнал (buildClaimTimeline);
QUIK показан пошагово (register/sign/deny/deposit) с верными временами, отказ
регистрации больше не выглядит успехом (quikActionFailTitles).
- Баннеры: «в НРД не отправлено», когда пакет сформирован, но не ушёл (нет
submitted_to_nsd и не Fail); заголовок карточки и бейдж учитывают это; красный
баннер QUIK при отказе, строгий «нет бумаг» только при реальном шорт/недостатке.
- НРД-ответ «Поручение с исходящим номером … уже существует» теперь REG_DUP
(предупреждение-дубль, не красный «Отказ в регистрации»); не влияет на od.Rejected.
- Idempotency: submitguard.go (inflightSubmit) + защита точек подачи от
двойного срабатывания (manual + auto-loop, двойной клик): submitOutgoingFor,
submitIncomingOrderFor, QuikOutRegister (ранний возврат при registered/signed).
- DEPO-алерты: водяной знак depoFailAlertedID засеивается текущим MAX(ID) на
старте процесса (Hlth03) — после рестарта bj больше не поднимает повторно
алерты про уже известные ошибки обработки событий BJ_*.
- Тесты: claimnotsent_render_test.go (хелперы + рендер карточки).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XG3zNMMf2LMoDpXo22mwMX
Форма «Загрузка справочника из файла» на /admin/handbook принимает
подлинный формат НРД (hk:M2MTransferHandbook, windows-1251 — тот же,
что приходит пакетом #M2MTH и который отдаёт кнопка «XML»). Разбор и
сохранение идут тем же путём, что у поллера при ответе НРД:
nsdxml.Unmarshal → writeHandbookRawXML (сырой XML для байт-в-байт
выгрузки) → saveHandbookEx (плоский JSON) → перезапись FTV_M2M_HANDBOOK
в DEPO → синхронизация получателей в МНП. На сервер лицензий ручной файл
НЕ рассылается (saveHandbookEx push=false): справочник одного стенда не
должен становиться облачным для всех клиентов. Нужно для закрытого
контура и когда шлюз к НРД недоступен.
- handbook_import.go: обработчик importHandbook (POST /admin/handbook/import)
- nsdpoller.go: saveHandbook → saveHandbookEx(hb, push)
- admin.go: маршрут import, поле Flash, renderHandbook читает ?flash=
- admin_handbook.html: карточка загрузки + вывод flash
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XG3zNMMf2LMoDpXo22mwMX
1) XML-выгрузка справочника (/admin/handbook → XML) теперь в формате НРД
(hk:M2MTransferHandbook: SettlementPlaces/Participants, Rus/Eng,
Depository/BrokerPlace). Поллер сохраняет подлинный XML от НРД
(writeHandbookRawXML → m2m-handbook.xml) и выгрузка отдаёт его как есть
(windows-1251, байт в байт). Для установок без своего шлюза — реконструкция
того же формата из плоского JSON (reconstructHandbookXML), проверено
парсером НРД.
2) findDealForResponse: ответ сервиса МОСТ с конкретным GUID, которого нет
среди ИСХОДЯЩИХ сделок (например M2M31 на наше решение по ВХОДЯЩЕМУ
переводу), больше НЕ пришивается по эвристике FIFO к чужой исходящей
заявке и не отклоняет её ошибочно. FIFO остаётся только для ответа с
нулевым/пустым GUID (поведение НРД при M2M14).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Поллер строк в работе (/admin/journal/live, tick в layout.html) обновлял
только нижнюю live-строку, а верхний бейдж статуса оставался тем, что
отрисовал сервер при загрузке — после отправки показывал «не отправлено»,
пока страницу не обновишь. LiveStatus получил поля badge/badgeText/outcome
(заполняются в liveOutgoing/liveIncoming из тех же источников, что и строка
журнала), tick синхронизирует верхний бейдж и бейдж исхода. Касается
журнала обмена, «Исходящих» и «Входящих» — у всех общий поллер.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
manualSend выбирал отправителя грубо: при любой включённой эмуляции (и
imitate, и substitute) уходил на внутренний имитатор. Теперь логика как в
lkemulate.go: imitate — имитатор (в НРД ничего); substitute — реальная
отправка в НРД, клиент из списка RealNSDTest.Docs идёт с заменой блока
инвестора на тест-инвестора (realTestPut для журнала «кто под кем»),
остальные — с настоящими данными; off — реально с настоящими данными.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
На странице /admin/handbook добавлены кнопки «JSON» и «XML» — скачивание
сохранённого справочника участников (readHandbook: от НРД #M2MTH, копия с
сервера лицензий или встроенный снимок) файлом. JSON отдаётся как есть с
отступами, XML формируется из плоских записей. Маршруты /admin/handbook/
export.json и export.xml под админ-авторизацией.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
bj на старте сам пишет пустое сигнальное событие HANDBOOK; чтобы оно не
перекрывало последний результат джобы Fancy, QEv11 берёт свежайшее событие
HANDBOOK, у которого заполнен COMMENT или STATE.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>