Было: правило «боевой ЛК + тестовый профиль → принудительно имитатор» не давало выключить
эмуляцию, а подмена личности жила отдельным тумблером на другой странице — пользователь не мог
понять состояние и выключить.
Стало — явная модель (контур НРД и режим эмуляции независимы):
- «Выключена» — заявки идут в выбранный контур (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>
Было: на «Эмуляторы» баннер «Эмулятор НРД включён ... переключатель не выключает», и ни слова,
что для клиентов из 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>
Третий режим МНП (между «внутренняя имитация» и «боевая запись»): в bj цикл
идёт по обычному пользователю, а поручение в QUIK МНП уходит РЕАЛЬНО, но с
кодом другого, реально существующего в QUIK клиента (обобщение ручного теста
realtest «боевой ЛК → TEST3»).
- QuikMNPSettings: RealWrite + RealClientCode (валидация формата кода).
- Подмена кода — единая точка quikClientCodeFromPort (после ClientCodeMap);
портфель не трогаем. quikActive: RealWrite только при devMode и непустом
коде; Emulate (внутренняя имитация) в приоритете.
- Шаги боевого пути помечаются «[на подставного клиента <код>]» — видно в
«Поручениях QUIK».
- Карточка МНП на /admin/emulators — три взаимоисключающих режима
(выключено / имитация / реальная запись), поле кода, крупное предупреждение;
отдельный красный баннер «Реальные поручения в МНП на клиента <код> (режим
разработки)» — не смешиваем с баннером эмуляции НРД.
- disableEmulatorsIfDevOff сбрасывает и RealWrite (код остаётся, инертен),
новость явно фиксирует прекращение реальных поручений.
В режиме разработки новая страница /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).