Commit Graph

496 Commits

Author SHA1 Message Date
fontvielle 0616f69518 Ключ: пояснение — имя папки справочника любое (spr1046/LAP_NEW), ищется по local.gdbm/local.pse
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
2026-10-20 16:49:02 +03:00
fontvielle a79bc8d3c1 Релиз 2026.10.20.11 (stable)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
2026-10-20 16:46:57 +03:00
fontvielle 55859292ef Ключ: режим «Подключить флешку» — по умолчанию (перепроверка не прыгала на «Сформировать»)
При отсутствии флешки по умолчанию выбирался режим «Сформировать на новой
флешке», и после «Перепроверить флешку» экран прыгал туда. Теперь по умолчанию
всегда «Подключить флешку» (пустое состояние внутри с кнопкой перепроверки).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
2026-10-20 16:46:18 +03:00
fontvielle 21faec2e0a Релиз 2026.10.20.10 (stable)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
2026-10-20 16:43:55 +03:00
fontvielle 3b375d2d1e Ключ: кнопка «Перепроверить флешку» + подсказка про проброс USB в ВМ; детект ловит USB-диск без разделов
- В режиме флешки — кнопка «↻ Перепроверить флешку» (и когда флешка есть, и когда нет)
  с индикатором «Ищу флешку…».
- Пустое состояние поясняет: на виртуальной машине USB нужно пробросить в гостя.
- listFlashDrives ловит и съёмный диск с ФС без таблицы разделов (type=disk).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
2026-10-20 16:43:17 +03:00
fontvielle 59e88e13f9 Релиз 2026.10.20.9 (stable)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
2026-10-20 16:39:27 +03:00
fontvielle 2cba793faa Ключ подписи: в мастере — что должно быть на флешке
Свёрнутый блок «Что должно быть на флешке» в шаге «Ключ подписи»: ключ *.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
2026-10-20 16:38:45 +03:00
fontvielle a81c4c569f Релиз 2026.10.20.8 (stable)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
2026-10-20 15:59:03 +03:00
fontvielle a13c9d6184 QUIK: автоподбор счёта — устойчив к разным колонкам; отчёт свёрнут
- 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
2026-10-20 15:58:27 +03:00
fontvielle 9397af94a9 Релиз 2026.10.20.7 (stable)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
2026-10-20 15:55:36 +03:00
fontvielle 571a7d0e67 QUIK: кнопка «Определить из QUIK» — обычная кнопка + fetch (submit форма перехватывала)
Кнопка была 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
2026-10-20 15:54:56 +03:00
fontvielle 40e2c33860 Релиз 2026.10.20.6 (stable)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
2026-10-20 15:48:13 +03:00
fontvielle b654c70d49 QUIK: автоподбор торгового счёта фирмы из БД МНП
Кнопка «Определить из 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
2026-10-20 15:47:35 +03:00
fontvielle f900cf3877 Релиз 2026.10.20.5 (stable)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
2026-10-20 15:34:31 +03:00
fontvielle 801f1d722f DEPO: выдавать bj_user право на ВСЕ процедуры (иначе проверка их не видит)
Причина «нет процедур» при успешной установке: проверка идёт логином 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
2026-10-20 15:33:51 +03:00
fontvielle bf26495b6f Релиз 2026.10.20.4 (stable)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
2026-10-20 14:21:48 +03:00
fontvielle a3abcd5412 DEPO: процедуры с EXECUTE AS — проверка пользователя SYSDBA, понятная ошибка
Процедуры 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
2026-10-20 14:21:11 +03:00
fontvielle 8a298ae074 Релиз 2026.10.20.3 (stable): версии компонентов
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
2026-10-20 14:13:35 +03:00
fontvielle eef6c9d996 DEPO: процедуры ставятся в мастере «Подготовить» + правка под клиента
- «Подготовить» в мастере (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
2026-10-20 14:12:54 +03:00
fontvielle 45edbdbae6 Релиз 2026.10.20.2 (stable): версии компонентов
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
2026-10-20 13:57:19 +03:00
fontvielle 045dfac6c7 DEPO: установка процедур bj2depo из bj (проверка возможностей + применение)
Процедуры 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
2026-10-20 13:56:40 +03:00
fontvielle 63fbb64012 Релиз 2026.10.20.1 (stable): версии компонентов
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
2026-10-20 12:14:27 +03:00
fontvielle 817472c72d Убрать временную отдачу презентации/ISO перед релизом
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
2026-10-20 12:13:25 +03:00
fontvielle b7360b93b2 Мастер: «Обновление» — первый пункт, к которому можно вернуться
Новый шаг 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
2026-10-19 17:22:29 +03:00
fontvielle 2df7b0f54a Мастер: авто-синхронизация времени (ВНИИФТРИ) и доменные имена сервера
Шаг «Время и сеть»:
- Кнопка «Синхронизировать»: 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
2026-10-16 15:15:09 +03:00
fontvielle 33861d98d8 Анкета участника M2M: отправка через шлюз только в боевом контуре
Требование: в тест анкету не слать, подача только в бою. 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
2026-10-16 13:11:47 +03:00
fontvielle af60277411 Анкета участника M2M: отправка в НРД через ИШ пакетом #M2MPF
НРД открыл приём анкеты (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
2026-10-16 13:07:40 +03:00
fontvielle 22eb6c6f11 docs: рецепт сборки ISO проверен на 2026.10.16.1 (команда, входы, публикация в канал iso)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XG3zNMMf2LMoDpXo22mwMX
2026-10-16 10:03:35 +03:00
fontvielle c58465e7c8 docs: профиль клиента — контракт bj и сторона сервера лицензий (для Вадима)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XG3zNMMf2LMoDpXo22mwMX
2026-10-16 09:59:55 +03:00
fontvielle 13832fefad Профиль клиента: выгрузка эталона и предзаполнение мастера под клиента
Страница /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
2026-10-16 09:58:23 +03:00
fontvielle 3ba8dcc931 docs: памятка по сборке, релизу и авто-раскату bj (process runbook)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XG3zNMMf2LMoDpXo22mwMX
2026-10-16 09:46:29 +03:00
fontvielle b853fbfd39 Релиз 2026.10.16.1 (stable): версии компонентов
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XG3zNMMf2LMoDpXo22mwMX
2026-10-16 09:44:05 +03:00
fontvielle c021fb8273 Анкета участника M2M: сформировать → проверить → отправить в НРД (обычный канал)
Требование НРД при подключении к сервису 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
2026-10-15 18:20:03 +03:00
fontvielle c476cfd7a3 ЛК-карточка и M2M: операторский путь заявки, баннеры «в НРД не отправлено», дубль-поручение, idempotency, фикс DEPO-алертов
- Карточка заявки: операторский «Путь заявки» (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
2026-10-15 17:47:28 +03:00
fontvielle 5beb726e5b Справочник M2M: ручная загрузка файла в формате НРД
Форма «Загрузка справочника из файла» на /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
2026-10-15 11:18:50 +03:00
fontvielle ba3ae22c49 Релиз 2026.10.14.3 (stable): выгрузка справочника XML в формате НРД; фикс FIFO
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-14 19:17:18 +03:00
fontvielle 567706e0a1 Справочник: выгрузка XML в подлинном формате НРД; фикс ошибочного FIFO-сопоставления ответа
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>
2026-10-14 19:10:18 +03:00
fontvielle c9ea6067fb Релиз 2026.10.14.2 (stable): ручной ввод — подмена личности; живой бейдж статуса
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-14 18:47:17 +03:00
fontvielle b442f21818 Журнал/списки: верхний бейдж статуса обновляется живьём, без F5
Поллер строк в работе (/admin/journal/live, tick в layout.html) обновлял
только нижнюю live-строку, а верхний бейдж статуса оставался тем, что
отрисовал сервер при загрузке — после отправки показывал «не отправлено»,
пока страницу не обновишь. LiveStatus получил поля badge/badgeText/outcome
(заполняются в liveOutgoing/liveIncoming из тех же источников, что и строка
журнала), tick синхронизирует верхний бейдж и бейдж исхода. Касается
журнала обмена, «Исходящих» и «Входящих» — у всех общий поллер.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-14 18:36:40 +03:00
fontvielle 4dc00cdcce Ручной ввод M2M: режим подмены личности как в ЛК-потоке
manualSend выбирал отправителя грубо: при любой включённой эмуляции (и
imitate, и substitute) уходил на внутренний имитатор. Теперь логика как в
lkemulate.go: imitate — имитатор (в НРД ничего); substitute — реальная
отправка в НРД, клиент из списка RealNSDTest.Docs идёт с заменой блока
инвестора на тест-инвестора (realTestPut для журнала «кто под кем»),
остальные — с настоящими данными; off — реально с настоящими данными.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-14 18:25:13 +03:00
fontvielle 13aefbdc01 Релиз 2026.10.14.1 (stable): bj-server — выгрузка справочника JSON/XML
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-14 18:13:41 +03:00
fontvielle 8cdf1e0ed6 Справочник участников M2M: выгрузка в JSON и XML
На странице /admin/handbook добавлены кнопки «JSON» и «XML» — скачивание
сохранённого справочника участников (readHandbook: от НРД #M2MTH, копия с
сервера лицензий или встроенный снимок) файлом. JSON отдаётся как есть с
отступами, XML формируется из плоских записей. Маршруты /admin/handbook/
export.json и export.xml под админ-авторизацией.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-14 18:05:54 +03:00
fontvielle a81c214427 Справочник: читать последний HANDBOOK с непустым COMMENT/STATE
bj на старте сам пишет пустое сигнальное событие HANDBOOK; чтобы оно не
перекрывало последний результат джобы Fancy, QEv11 берёт свежайшее событие
HANDBOOK, у которого заполнен COMMENT или STATE.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-14 11:17:35 +03:00
fontvielle e4b164c6e5 Справочник участников: показывать результат обработки джобой Fancy
На странице «Справочник участников M2M» теперь выводится итог обработки
справочника джобой bj2depo — STATE/COMMENT последнего события HANDBOOK
из FTV_M2M_EVENTS (поле COMMENT пишет Fancy). Расхождения/предупреждения
выделяются цветом и значком: КРИТИЧ/ОШИБКА — красным, ПРЕДУПРЕЖДЕНИЕ —
жёлтым, «изменений нет» — зелёным, чтобы оператор видел, что проверить.

Только чтение (fsql.QEv11, TOP 1 по EVENT_DATE), короткий таймаут 4с,
страница не висит если DEPO недоступна.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-14 11:16:19 +03:00
fontvielle c73f6120d3 M2M ИИС: приём «всё или ничего» (настройка AcceptIIS, по умолчанию выкл)
Правильная обработка входящих переводов на ИИС вместо прежнего сплошного отказа.
Настройка AcceptIIS (карточка «Кто отвечает на переводы M2M»):
 - выкл (по умолчанию) — поведение не меняется: перевод на ИИС отклоняется целиком (M2M06);
 - вкл — ИИС принимается ТОЛЬКО целиком: все бумаги зачисляются на ИИС-счёт клиента;
   если хоть одной бумаги нет в учёте / не проходит сверку — отказ по ВСЕМУ переводу.

Изменения:
 - iisDecisions: «всё или ничего» (при выкл — отказ всем; при вкл — либо все принять,
   либо все отклонить, сохраняя реальные коды отказа по проблемным бумагам);
 - depo_check: при вкл приёме ИИС убран искусственный отказ «Перевод не на ИИС»,
   добавлена проверка «Счёт зачисления — ИИС» (partyChecks получил флаг wantIIS);
 - настройка AcceptIIS в Settings + геттер/сеттер + обработчик /admin/setup/accept-iis
   + тумблер в part_nsd.html; тесты обновлены.
Жёсткий запрет частичного ИИС в answerIncoming (коммит dc8b785) остаётся как страховка.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-14 10:43:21 +03:00
fontvielle dc8b785a4b M2M incoming: жёсткий запрет частичного решения по ИИС-переводу
Перевод по договору ИИС принимается только целиком: если в одном решении
есть и подтверждённые, и отклонённые бумаги — answerIncoming отказывается
отправлять такое решение. Частичный приём ИИС привёл бы к неполному переводу
и двум ИИС у клиента с потерей льгот. Запрет не обойти ручным решением
оператора и переживёт смягчение политики приёма ИИС (iisDecisions).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-14 10:02:51 +03:00
fontvielle d154506464 Настройка грузится быстро: список пользователей ЛК из кэша; морфинг — якорная привязка прокрутки
1) Страница «Настройка» висела до 10 с, когда ЛК ЕСИА Финанс медленный/недоступен: setupData
   синхронно тянул список пользователей из ЛК (lkUsersForSetup, таймаут 10 с). Теперь список
   берётся из кэша мгновенно, обновляется в фоне с коротким таймаутом (3 с); при недоступном ЛК
   показывается сохранённый список с пометкой. Страница больше не ждёт ЛК.
2) Морфинг карточки: добавлена якорная привязка — запоминаем верхний видимый блок и после
   обновления корректируем прокрутку, чтобы при изменении высоты карточек выше обзора вид не
   подпрыгивал (устраняет «прыгнула чуть выше»).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-13 18:16:42 +03:00
fontvielle a6c925572b Карточка: обновление в DOM на месте (без перезагрузки) — страница не дёргается; бейджи не переносятся
Вместо location.reload при смене подписи карточка теперь обновляется рекурсивным морфингом
<main>: догружаем ту же страницу и сливаем только изменившиеся узлы, одинаковые поддеревья не
трогаем. Прокрутка окна и боковых блоков («Путь заявки» .claim-tl / .in-tl) не сбивается,
выделение в неизменном тексте сохраняется, нет прыжков и мигания. Морфинг пропускается, если
правится форма (dirty) или идёт выделение. Копи-кнопки переинициализируются (bjInitCopyBars).
Плюс .badge { white-space:nowrap } — в журнале стрелка «↗ Исходящий» больше не переносится над словом.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-13 18:08:34 +03:00
fontvielle 007164d4cf release: выпуск 2026.10.13.2 (канал stable) — bj-server с накопленными UI-правками
Эмуляция НРД (3 режима), пауза автообновления при выделении текста, автопоявление строк
журнала, фикс прокрутки карточки, «снять с очереди» DEPO, отметка подмены над XML. Отпечаток
сменил только bj-server (одна go1.26.8) → версии прочих без изменений. Опубликовано на
lic.zetit.ru, прежний 2026.10.13.1 удалён.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-13 17:36:15 +03:00
fontvielle f4311f1fa5 Карточка: при подмене личности явно указывать, что в НРД ушли подменённые данные
В режиме эмуляции «Подмена личности» XML в карточке — это наша запись с РЕАЛЬНЫМИ данными
клиента, а в НРД ушла копия с подменённым блоком инвестора (тест-инвестор). Над XML теперь
выводится предупреждение «В НРД отправлены ПОДМЕНЁННЫЕ данные, не эти» с указанием, под чьими
данными ушло (realTestGet по GUID → claimData.SubstAs). Без подмены — текст как раньше.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-13 17:35:04 +03:00