Commit Graph

203 Commits

Author SHA1 Message Date
fontvielle e774fc8989 Анкета участника M2M: ссылка в разделе НРД + предзаполнение по фирме
- В «Настройка → НРД» добавлена карточка «Регистрация участника 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
2026-10-21 16:27:14 +03:00
fontvielle d10d39c94e ЕСИА Финанс: разметить обмен по моделям pull/push, Callback свернуть
Поля задавались «в двух местах» и выглядели нелогично. На деле это две разные
модели обмена заявками, а не дубли:
- 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
2026-10-21 15:58:25 +03:00
fontvielle 40245dd78a Мастер, шаг ключа: список установленных сертификатов свёрнут
На шаге «Ключ и сертификаты» таблица установленных сертификатов (сотни строк)
разворачивала страницу. Обёрнута в <details>: по умолчанию свёрнута, счётчик
виден в заголовке, раскрывается кликом. На странице «Настройка» этот список уже
свёрнут — приведено к тому же виду.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
2026-10-21 14:48:36 +03:00
fontvielle 83bf3f5b49 Шлюз НРД: компактнее шапка — короче интро шага и строка про версию ИШ
Верх страницы «Шлюз НРД» был перегружен текстом. Интро шага 7 сокращено до
одной строки; пояснение про версию ИШ в карточке «Шлюз на этом сервере» ужато
в одну тонкую строку, заголовок поджат. Смысл сохранён, статус ИШ стал заметнее.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
2026-10-21 11:53:40 +03:00
fontvielle 5757e1e46a Папки шлюза: пароль генерируется и показывается сразу при загрузке (когда папки ещё не открыты)
Раньше поле пароля было пустым с подсказкой «пусто — прежний», и оператору
приходилось нажимать «Сгенерировать». Теперь при открытии страницы, если папки
шлюза ещё не открыты по сети, bj сразу подставляет в поле новый надёжный пароль
(genPw, 16 символов, crypto.getRandomValues) и показывает его. Оператор может
оставить его или вписать свой. Если папки уже открыты — поле остаётся пустым
(пустое = оставить прежний пароль при повторном сохранении).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
2026-10-21 11:47:35 +03:00
fontvielle 365ec1196d Статус: карточка ключа организации — контур и пометка «ИСТЁК»; SMB-пароль папок шлюза — генерация и показ
Ключ организации на странице «Статус» теперь строится из своего сертификата
в справочнике активного профиля ИШ (ownStoreCerts), включая истёкший: карточка
показывает владельца, издателя, контур (боевой/тестовый) и срок. Истёкший ключ
виден явной пометкой «ИСТЁК» и отдельным заголовком, а не маскируется под
«ключ не подключён». Показать владельца ДО установки ключа нельзя — сертификата
нет в файлах флешки, он появляется в справочнике профиля только после установки.

Папки шлюза по сети (простой режим): кнопка «Сгенерировать» создаёт надёжный
пароль (16 символов, crypto.getRandomValues) прямо в поле, поле теперь видимое;
после сохранения пароль показывается один раз с кнопкой «Скопировать» —
записать, так как позже bj его не покажет. Пустое поле по-прежнему оставляет
прежний пароль при повторном сохранении.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
2026-10-21 11:29:48 +03:00
fontvielle 6e66bc1c86 ГСЧ: карточка видима по умолчанию, JS прячет только при подтверждённой готовности
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
2026-10-20 17:51:04 +03:00
fontvielle 62bae4e00a Ключ: не переспрашивать контур, если он выбран в мастере
Если контур НРД уже выбран в мастере (WantContour), на шаге «использовать ключ
с флешки» показываем его фиксированно («Боевой — выбран в мастере») с кнопкой
«Изменить», а не радио-вопросом заново. При расхождении с контуром по сертификату
— предупреждение.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
2026-10-20 17:15:52 +03:00
fontvielle 3d3d2e2ffe Ключ: подсказка — USB 3.0-флешке нужен контроллер USB 3.1 (xHCI) в ВМ
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
2026-10-20 17:11:21 +03:00
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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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
fontvielle 2e9b92f0e0 Карточка: не сбрасывать выделение текста при автообновлении
Пока пользователь выделяет текст мышью (например, копирует M2M GUID), автообновление
пропускает такт: live-опрос и перезагрузка карточки по смене подписи, а также подстановка
новых строк в журнале не выполняются, пока выделение активно (window.bjSelecting). Как только
выделение снято — обновление продолжается на следующем такте.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-13 16:54:57 +03:00
fontvielle cd6e2c424f Эмуляция НРД: один переключатель Выключена/Подмена/Полная имитация; контур отдельно
Было: правило «боевой ЛК + тестовый профиль → принудительно имитатор» не давало выключить
эмуляцию, а подмена личности жила отдельным тумблером на другой странице — пользователь не мог
понять состояние и выключить.

Стало — явная модель (контур НРД и режим эмуляции независимы):
- «Выключена» — заявки идут в выбранный контур (NSD.Profile) с реальными данными клиента;
- «Подмена личности» — уходят в контур, но у клиентов из списка блок инвестора заменяется на
  тест-инвестора (Бубликов/Баранкин); DEPO и QUIK — по реальному клиенту;
- «Полная имитация» — в НРД ничего не уходит, bj сам отвечает (внутренний имитатор).
Режимы взаимоисключающие (ведутся флагами EmulateNSD/RealNSDTest.Enabled), принудительное
правило убрано. Единый 3-радио на /admin/emulators (как у QUIK), с показом контура, тест-инвестора
и списка паспортов; карточка на /admin/m2m-testing — статус + ссылка на «Эмуляторы».
Тесты обновлены под новую модель.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-13 16:02:06 +03:00
fontvielle 6ca556c2fc Подмена личности в НРД: понятный статус (кого→на кого) и явная кнопка «Выключить»
Было: на «Эмуляторы» баннер «Эмулятор НРД включён ... переключатель не выключает», и ни слова,
что для клиентов из real_nsd_test заявки идут МИМО имитатора в реальный TEST3 с подменой — и
выключить это оттуда нельзя (переключатель на другой странице). Пользователь не находил, как снять.

Теперь:
- /admin/emulators: при включённой подмене — заметный блок «Подмена личности в НРД включена»:
  по каким паспортам, в какой контур (TEST3) и от чьего имени (тест-инвестор) уходит запрос,
  плюс кнопка «Выключить подмену личности» прямо здесь.
- /admin/m2m-testing: карточка real-nsd показывает «Сейчас подменяет: паспорт X → как Y» и
  отдельную кнопку «Выключить подмену» (одним кликом), помимо чекбокса включения/списка.
- обработчик /admin/setup/lk-real-nsd honor-ит поле back и возвращает на страницу-источник,
  список паспортов при выключении сохраняется (docs передаётся скрытым полем).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-13 15:37:34 +03:00
fontvielle 2d2fbb6732 Карточка: удерживать скролл боковых блоков при автообновлении; DEPO: «Снять с очереди»
Скролл: автообновление карточки (bjReloadKeepScroll) раньше сохраняло только прокрутку окна,
а боковой «Путь заявки» (.claim-tl — position:fixed, свой overflow) и другие прокручиваемые
блоки (.settings-nav, .doc-toc) отбрасывало наверх. Теперь сохраняется и восстанавливается и
их scrollTop (JSON в sessionStorage, восстановление на rAF/timeout/load).

DEPO: на «Обмен с DEPO» рядом с «Вернуть в очередь» добавлена «Снять с очереди» — помечает
застрявшие записи STATE=SKIPPED (QHl04-06, depoDismissFailures), обработчик их больше не берёт
и они уходят из списка ошибок. Для устаревших/ненужных записей (напр. старые тестовые).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-13 13:15:34 +03:00
fontvielle 8f44d6fcb9 Журнал обмена: автопоявление новых заявок; карточка не прыгает наверх при автообновлении
Журнал: новый эндпоинт /admin/journal/rows (строки новее since, рендер тем же шаблоном
journalrow) + JS раз в 8 с подставляет новые заявки сверху с мягкой подсветкой (row-new),
без перезагрузки и без дёрганья; счётчик обновляется, плашка «нет переводов» убирается.
Таблица теперь рендерится всегда (tbody#journal-body), строка вынесена в {{define journalrow}}.

Карточка заявки: автообновление по смене подписи раньше делало location.reload() и сбрасывало
прокрутку наверх — мешало читать. Теперь bjReloadKeepScroll() сохраняет позицию прокрутки
(sessionStorage) и восстанавливает после перезагрузки; автообновление сохранено.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-13 12:50:20 +03:00
zuevav 6c42e0378d feat(admin): эмулятор МНП — режим реальной записи в МНП на подставного клиента
Третий режим МНП (между «внутренняя имитация» и «боевая запись»): в bj цикл
идёт по обычному пользователю, а поручение в QUIK МНП уходит РЕАЛЬНО, но с
кодом другого, реально существующего в QUIK клиента (обобщение ручного теста
realtest «боевой ЛК → TEST3»).

- QuikMNPSettings: RealWrite + RealClientCode (валидация формата кода).
- Подмена кода — единая точка quikClientCodeFromPort (после ClientCodeMap);
  портфель не трогаем. quikActive: RealWrite только при devMode и непустом
  коде; Emulate (внутренняя имитация) в приоритете.
- Шаги боевого пути помечаются «[на подставного клиента <код>]» — видно в
  «Поручениях QUIK».
- Карточка МНП на /admin/emulators — три взаимоисключающих режима
  (выключено / имитация / реальная запись), поле кода, крупное предупреждение;
  отдельный красный баннер «Реальные поручения в МНП на клиента <код> (режим
  разработки)» — не смешиваем с баннером эмуляции НРД.
- disableEmulatorsIfDevOff сбрасывает и RealWrite (код остаётся, инертен),
  новость явно фиксирует прекращение реальных поручений.
2026-10-08 00:45:06 +03:00
zuevav fd238c1078 feat(admin): dev-страница «Эмуляторы» — переключатели и настройки эмуляции НРД и МНП QUIK
В режиме разработки новая страница /admin/emulators с двумя клавишами:

- «Эмулятор НРД» (флаг LK.EmulateNSD): заявки ЛК и ручного ввода идут через
  внутренний имитатор, в НРД ничего не отправляется. Настройки: задержка
  решения (0–300 с), исход (подтвердить/отклонить/не отвечать), код отказа
  M2M01–M2M09/18. Сендер перенастраивается в рантайме через потокобезопасный
  mock.Sender.Reconfigure — без перезапуска.
- «Эмулятор МНП QUIK» (флаг QuikMNP.Emulate): шаги цикла без записи в боевую
  БД МНП. Настройки: задержка шага (0–60 с), точечные отказы по шагам
  (регистрация/подпись/отказ/зачисление) — эмулированный отказ ведёт себя как
  боевой: шаг OK=false, состояние не продвигается, повтор на следующем проходе.

Настройки хранятся в setup.json (nsd_emu/mnp_emu), обратная совместимость —
дефолты. Баннер «Режим эмуляции» показывается и при ручном включении
эмуляторов (раньше зависел только от отсутствия ИШ). Пункт меню «Эмуляторы»
и две плитки на дашборде — только в dev. Пути занесены в devOnlyPath.

Попутно: исправлен race в TestLicenseActivateAndRenew (cleanup восстанавливал
DefaultLicensePublicKey без moduleEnforceMu — падал под -race и на чистом HEAD).
2026-10-07 21:34:39 +03:00
zuevav bbeb59e3bc QUIK, Криптография, НРД — сводка «что настроено и как» сверху, формы — под «Перенастроить»
- QUIK: подключение к модулю (сервер, база, логин, проверено), как bj работает с QUIK (и отклонения из расширенных), торговый счёт, поручения из терминала, справочник получателей; формы и проверка МНП — под «Перенастроить».
- Криптография: «Подпись работает / ключ скоро закончится / ключ не подключён» с кнопкой установки; ключ организации (срок, заменить), СКЗИ, bj-crypto, сертификаты НРД в справочнике шлюза; остальное — под «Перенастроить» (без повтора плашки «ключ не подключён»).
- НРД: организация, реквизиты, кто отвечает на переводы, шлюз (версия, активный контур, канал, ключ) и папки по сети — из тех же запросов, что блок шлюза (события bj-igate-status / bj-igate-share, без лишних обращений к root-обработчику); формы — под «Перенастроить».
- «Перенастроить» раскрыто само, если что-то не настроено.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
2026-10-07 11:23:55 +03:00
zuevav 686889ee72 «Обмен с DEPO»: сводка состояния вместо форм; настройка — под «Перенастроить»
- Сверху — «Обмен с DEPO работает / настроен не до конца / не подключён» и сведения: база DEPO, сервер и СУБД, логин bj, начало номера торговых счетов, признак ИИС (отказ M2M06), трансферные таблицы, кто запускает обработку и итог последней проверки (✓/✗ и когда).
- Все прежние формы — под «Перенастроить»; раскрыто само, если что-то не проверено.
- Общий стиль сведений «название — значение» (.kv) — в оформлении для настроек.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
2026-10-07 10:35:02 +03:00
zuevav b496fad3e8 Настройка: меню разделов не прыгает, другой раздел открывается с начала
- Место под полосу прокрутки зарезервировано всегда (scrollbar-gutter: stable): короткий раздел без прокрутки и длинный с ней больше не сдвигают страницу и меню вбок.
- Меню разделов — на месте при прокрутке и целиком на экране (своя прокрутка, если не помещается по высоте).
- Выбор другого раздела — страница с его начала, а не с той высоты, где листали прежний (после сохранения формы — как раньше, к месту формы).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
2026-10-07 10:30:02 +03:00
zuevav ed598281e8 Активные сессии — строками: «Завершить» не вылезает за карточку; браузер и система одним словом
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
2026-10-07 10:24:27 +03:00
zuevav 6e6ab3a4fd Папки шлюза: тестовый — igate_exchange_test, боевой — igate_exchange; все папки в сообщении; Samba — в установщике
- Имена папок: тестовый контур — igate_exchange_test, боевой — igate_exchange (было igate_exchange и igate_exchange_prod); bj переименовывает открытые по прежней схеме сам — при сверке, в первый раз через 30 с после запуска.
- После сохранения — все открытые папки с контуром: \\IP\igate_exchange_test (тестовый TEST3), \\IP\igate_exchange (боевой).
- Закрыть папки — Samba выключается (сервер не отвечает по SMB, пока папок нет).
- Установщик (bj-installer, preseed Debian, слой пакетов образа Ubuntu): samba, winbind, libnss-winbind — заранее, чтобы в закрытом контуре папки открывались без интернета; необязательной частью (нет на диске и нет сети — установка bj продолжается); службы выключены до открытия папок.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 10:10:18 +03:00
zuevav 9553bd6e22 Папки шлюза по сети — два режима: простой (один логин) или через домен (группы и сотрудники bj)
- «Через домен»: сервер bj подключается к домену AD (winbind, один раз — учётной записью администратора домена, bj её не сохраняет); папки igate_exchange(_prod) открыты группам с ролью в bj и доменным сотрудникам bj — своим входом в Windows; краткое имя домена bj берёт из AD (crossRef nETBIOSName).
- Список доступа bj сверяет сам: после изменения групп, сотрудников и настроек входа (через несколько секунд) и раз в 15 минут.
- «Простой»: как было — один логин и пароль Samba; переход с домена выключает вход через домен (учётная запись компьютера в домене остаётся).
- bj-igate-admin share: режимы simple/domain, join (realm, workgroup, admin), проверка списка доступа на недопустимые символы, состояние — mode/joined/realm.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
2026-10-07 09:01:46 +03:00
zuevav 0bdcf0f9d8 Папки шлюза по сети: Windows спрашивает логин и пароль; блок виден сразу, пароль скрыт
- bj-igate-admin share: при открытии — «map to guest = never»: с «bad user» Samba пускала текущую учётную запись Windows гостем, гостю в папку нельзя, и Windows сразу писала «нет доступа» без окна логина и пароля.
- Блок «Папки шлюза по сети» — не под раскрытием, со своим заголовком; поле пароля — скрытое (было открытым текстом).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
2026-10-07 08:41:31 +03:00
zuevav 4d938acc29 Контуры НРД: карточки одной высоты — класс активной карточки совпадал с рядом кнопок (margin-top:auto сдвигал её вниз)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
2026-10-07 08:38:22 +03:00
zuevav a53b9f9e9f Автоматический режим M2M по умолчанию; контуры НРД карточками; адрес папок шлюза для проводника; Zabbix — в «Диагностике»
- M2M: «bj сам — автоматически» — режим по умолчанию (где ни разу не выбирали; момент включения записывается, берутся переводы не старше суток до него); «Оператор» — запасной; явный выбор не меняется.
- Контуры НРД: TEST3 и боевой — карточки с состоянием (Активный / Готов / Нужен ключ / Канала нет); «Сделать активным» видна всегда, без ключа неактивна с пояснением; «Установить ключ», «Обновить канал».
- Папки шлюза по сети: после открытия — адреса для проводника (\\IP\igate_exchange и по имени сервера, боевой — igate_exchange_prod) с кнопкой «Скопировать»; bj-igate-admin share status отдаёт ip, host, shares.
- Zabbix перенесён из «Оповещений» в «Диагностику».

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
2026-10-07 08:29:25 +03:00
zuevav 6b490986e4 «Обновления» — одна карточка состояния и одна кнопка; проверка при открытии раздела; «Службы» — в «Диагностике»
- Сверху: «Установлены последние версии» (когда проверено) или «Доступно обновление X — Установить обновление» (всё сразу), или «Проверить не удалось»; кнопка «Проверить сейчас».
- При открытии раздела bj проверяет обновления сам, если последней проверке больше 10 минут (и не чаще раза в 10 минут из браузера — без зацикливания, если источник не настроен); check отвечает JSON для экрана.
- «Компоненты и версии» (обновить один компонент) и «Расширенные настройки» (обновление из файла, источник и канал, ключ, автопроверка) — под раскрытием.
- «Службы» с перезапуском перенесены в «Диагностику»; подсказка в письме о службе — туда же.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
2026-10-07 08:19:34 +03:00
zuevav 56068af897 QUIK и НРД в настройках — простой вид и расширенный под раскрытием; выбор «Кто отвечает на переводы M2M»
- QUIK: в карточке режима — одна галочка «Клиенты подают поручения из QUIK (терминал и мобильное приложение)», сохраняется сразу; предупреждение, если режим изменён в расширенных; «Расширенные настройки» (отдельно исходящие/входящие, инструменты МНП, коды клиентов) свёрнуты, без дубля счёта и галочки терминала; формы цикла не сбрасывают поля, которых не прислали.
- НРД: организация — код, ИНН, наименование в ряд; реквизиты в НРД — общий блок с мастером (nsdRequisites), «Определить из DEPO» видна (была белым по белому); блок шлюза из мастера (контуры, доступ к папкам по сети) — и в настройках; ручная настройка шлюза — под «Расширенными настройками».
- Автоматический режим M2M: вместо галочки с «Сохранить» — выбор плиткой «bj сам — автоматически / Оператор», сохраняется сразу (m2mAutoCard); тот же выбор — в мастере на шаге «Проверка»; подробности — под раскрытием.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
2026-10-07 08:15:06 +03:00
zuevav eaf7fed6ae Переводы на ИИС — отказ кодом M2M06 (вместо M2M07)
Решение депозитария 07.10.2026: по ИИС отвечаем M2M06 «Приостановление операций по счёту депо зачисления». Код — константа iisRejectCode: отказ по всему переводу на ИИС (iisDecisions, авто и ручной режим), проверки «Перевод не на ИИС» и «Счёт не ИИС» (было M2M08); тексты в настройках, карточке входящего и справочнике кодов.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
2026-10-07 08:05:32 +03:00
zuevav 6f9896d12e Пользователи в настройках — как в мастере: простой вид и расширенный под раскрытием
- Блок «Учётные записи» мастера вынесен в part_accounts.html (accountsAdd, accountsAD) и стоит и в мастере, и в Настройка → Пользователи: роли плитками, создать сотрудника (с модулями), сотрудники и группы из домена.
- Список сотрудников: строка — кружок, имя, логин, источник, последний вход, роль; «Изменить» раскрывает правку (имя, e-mail, роль, пароль, модули, «может входить»), «Удалить сотрудника» — тихой ссылкой с подтверждением.
- «Расширенные настройки» под раскрытием: роли и права, домен вручную (контроллер, Base DN, сертификат ЦС, служебная запись, группы → роли, роль по умолчанию, время сессии), проверка входа, перепроверка групп; подписи укорочены, поля в ряд.
- Ссылки-кнопки (dq-link, «убрать») одинаковые в настройках и мастере.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
2026-10-07 08:03:16 +03:00
zuevav fb75086db2 «Настройка» в одном стандарте с мастером: раздел — одна карточка, подблоки через разделители, подпись над полем
- Раздел настроек оформлен как шаг мастера: одна карточка (радиус 16), заголовок 21px и вводный текст, вложенные блоки — без своих рамок, через тонкий разделитель; выделенные плашки (ключ не подключён, вход открыт) — класс callout.
- Поля в сетке (почта, Zabbix и др.): подпись над полем, поле во всю колонку — в настройках «Порт [587]» вставал в строку; правило общее для настроек и мастера.
- Текст абзацев 14.5px (пояснения 13.5px) — как в мастере; крупные цветные строки состояния больше не кричат.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
2026-10-07 01:31:36 +03:00