Подмена личности в НРД: понятный статус (кого→на кого) и явная кнопка «Выключить»

Было: на «Эмуляторы» баннер «Эмулятор НРД включён ... переключатель не выключает», и ни слова,
что для клиентов из 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>
This commit is contained in:
fontvielle
2026-10-13 15:37:34 +03:00
parent 2d2fbb6732
commit 6ca556c2fc
4 changed files with 36 additions and 2 deletions
+6
View File
@@ -47,6 +47,9 @@ func registerEmulators(mux *http.ServeMux, a *admin, rc *RuntimeConfig) {
NSDFlag bool
NSD NSDEmuSettings
RejectCodes []emuRejectOption
RealNSDOn bool
RealNSDDocs string
RealNSDAs string
QuikEmuOn bool
QuikMode string
QuikRealCode string
@@ -57,6 +60,9 @@ func registerEmulators(mux *http.ServeMux, a *admin, rc *RuntimeConfig) {
NSDEmuOn: nsdOn,
NSDEmuWhy: nsdWhy,
NSDFlag: s.LK.EmulateNSD,
RealNSDOn: s.LK.RealNSDTest.Enabled,
RealNSDDocs: s.LK.RealNSDTest.Docs,
RealNSDAs: realNSDAsText(),
NSD: s.NSDEmu.Defaults(),
RejectCodes: emuRejectOptions(),
QuikEmuOn: s.Quik.Emulate && devMode(rc),
+9 -2
View File
@@ -230,8 +230,15 @@ func registerRealNSDTest(mux *http.ServeMux, rc *RuntimeConfig) {
}
log.Printf("real-test: %v, клиенты: %s", lk.RealNSDTest.Enabled, lk.RealNSDTest.Docs)
back := "/admin/setup"
if ref := r.Referer(); strings.Contains(ref, "/admin/m2m-testing") {
back = "/admin/m2m-testing"
switch b := r.FormValue("back"); b {
case "/admin/m2m-testing", "/admin/emulators", "/admin/setup":
back = b
default:
if ref := r.Referer(); strings.Contains(ref, "/admin/m2m-testing") {
back = "/admin/m2m-testing"
} else if strings.Contains(ref, "/admin/emulators") {
back = "/admin/emulators"
}
}
http.Redirect(w, r, back+"#lk-real-nsd", http.StatusSeeOther)
})
@@ -16,6 +16,20 @@
{{if and .NSDEmuOn (ne .NSDEmuWhy "включена в настройках")}}
<p class="dq-warn">Сейчас имитация действует принудительно: {{.NSDEmuWhy}} — переключатель её не выключает.</p>
{{end}}
{{if .RealNSDOn}}
<div class="dq-warn" style="margin:8px 0;padding:12px 14px;border-radius:8px;background:var(--warn-weak,#fbf3d9)">
<b>⚠ Подмена личности в НРД включена</b> — для этих клиентов имитатор НЕ используется.<br>
Заявки по паспорту(ам) <code>{{.RealNSDDocs}}</code> уходят в <b>реальный тестовый НРД (TEST3)</b> с подменой на тест-инвестора <b>{{.RealNSDAs}}</b> (запрос отправляется от его имени; GUID, бумаги и счета настоящие, DEPO и QUIK МНП — боевые). Поэтому ответ приходит не от имитатора, а от реального НРД — и если на той стороне никто не отвечает, заявка ждёт.
{{if can "settings"}}
<form method="post" action="/admin/setup/lk-real-nsd" style="margin-top:10px" onsubmit="return confirm('Выключить подмену личности в НРД? Новые заявки этих клиентов снова пойдут через имитатор (а не в реальный TEST3).');">
<input type="hidden" name="back" value="/admin/emulators">
<input type="hidden" name="docs" value="{{.RealNSDDocs}}">
<button class="btn" type="submit">Выключить подмену личности</button>
</form>
<p class="muted" style="margin:6px 0 0;font-size:12px">Настроить список клиентов — на странице «Тестирование M2M».</p>
{{end}}
</div>
{{end}}
<form method="post" action="/admin/emulators/nsd" id="emu-nsd-form" class="dq">
<label style="display:flex;gap:8px;align-items:center;font-weight:600">
<input type="checkbox" name="emulate" value="1" {{if .NSDFlag}}checked{{end}}>
@@ -65,7 +65,14 @@
<div class="card" id="real-nsd" style="margin:10px 0;{{if .RealNSD.Enabled}}background:var(--warn-weak,#fbf3d9){{end}}">
<h3 style="margin:0 0 6px;font-size:15px">Тест «боевой ЛК → тестовый контур НРД» {{if .RealNSD.Enabled}}<span class="badge awaiting_decision">включён</span>{{else}}<span class="badge draft">выключен</span>{{end}}</h3>
<p class="muted" style="margin:0 0 8px;font-size:13px">Заявки клиентов из списка (из ЛК ЕСИА Финанс) проходят у нас всё по-настоящему: проверка шлюза и поручение в DEPO, блокировка и списание в QUIK МНП (<b>боевая запись</b>), статусы в ЛК. В НРД (TEST3) запрос уходит с данными тест-инвестора <b>{{.RealNSDAs}}</b> — GUID, референсы, бумаги и счета настоящие, ответы НРД применяются к заявке клиента. «Исполнена» в ЛК — по отчёту НРД об исполнении (MS010). Остальные заявки ЛК — как раньше (без отправки в НРД).</p>
{{if .RealNSD.Enabled}}<p style="margin:0 0 10px;font-size:13.5px;color:var(--text)"><b>Сейчас подменяет:</b> заявки по паспорту(ам) <code>{{.RealNSD.Docs}}</code> → в НРД (TEST3) уходят от имени <b>{{.RealNSDAs}}</b>. Запрос отправляется от тест-инвестора; у клиента всё боевое (DEPO, QUIK МНП).</p>
{{if can "settings"}}<form method="post" action="/admin/setup/lk-real-nsd" style="margin:0 0 10px" onsubmit="return confirm('Выключить подмену личности в НРД? Новые заявки этих клиентов снова пойдут через имитатор (а не в реальный TEST3).');">
<input type="hidden" name="back" value="/admin/m2m-testing">
<input type="hidden" name="docs" value="{{.RealNSD.Docs}}">
<button class="btn" type="submit" style="background:var(--err-weak,#fdecea);border-color:var(--err,#b3261e);color:var(--err,#b3261e)">Выключить подмену</button>
</form>{{end}}{{end}}
{{if can "settings"}}<form method="post" action="/admin/setup/lk-real-nsd" class="cpf" onsubmit="return !this.enabled.checked || confirm('Включить? Для клиентов из списка QUIK МНП будет записывать по-настоящему (блокировка и списание бумаг).');">
<input type="hidden" name="back" value="/admin/m2m-testing">
<label style="flex-direction:row;align-items:center;gap:6px;font-size:13px;color:var(--text)"><input type="checkbox" name="enabled" style="min-width:0"{{if .RealNSD.Enabled}} checked{{end}}> включить</label>
<label style="min-width:280px">Паспорта клиентов (серия номер, через «;»)
<input name="docs" value="{{.RealNSD.Docs}}" placeholder="1110 754503"></label>