Эмуляция НРД: один переключатель Выключена/Подмена/Полная имитация; контур отдельно
Было: правило «боевой ЛК + тестовый профиль → принудительно имитатор» не давало выключить эмуляцию, а подмена личности жила отдельным тумблером на другой странице — пользователь не мог понять состояние и выключить. Стало — явная модель (контур НРД и режим эмуляции независимы): - «Выключена» — заявки идут в выбранный контур (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>
This commit is contained in:
@@ -7,54 +7,51 @@
|
||||
Эти же флаги доступны в «Настройке» (ЛК — «Имитация НРД», QUIK — «имитация») — состояние общее.</p>
|
||||
</div>
|
||||
|
||||
{{/* ===== Эмулятор НРД ===== */}}
|
||||
{{/* ===== Эмуляция НРД ===== */}}
|
||||
<div class="card" id="emu-nsd-card">
|
||||
<h2><span class="dot {{if .NSDEmuOn}}warn{{else}}ok{{end}}"></span>Эмулятор НРД
|
||||
{{if .NSDEmuOn}}<span class="hero-status warn">включён</span>{{end}}</h2>
|
||||
<p class="muted">Заявки из личного кабинета и ручного ввода проходят весь путь (сверка с DEPO, блокировка в QUIK, сделка, статусы),
|
||||
но <b>в НРД ничего не отправляется</b>: ответ контрагента формирует внутренний имитатор.</p>
|
||||
{{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>
|
||||
<h2><span class="dot {{if ne .NSDMode "off"}}warn{{else}}ok{{end}}"></span>Эмуляция НРД
|
||||
{{if eq .NSDMode "imitate"}}<span class="hero-status warn">полная имитация</span>{{end}}
|
||||
{{if eq .NSDMode "substitute"}}<span class="hero-status warn">подмена личности</span>{{end}}</h2>
|
||||
<p class="muted">Контур НРД сейчас: <b>{{.Profile}}</b> — заявки уходят туда, когда эмуляция выключена (выбор контура — в «Настройке»). Контур и режим эмуляции независимы. Режимы эмуляции сбрасываются автоматически, когда заканчивается режим разработки.</p>
|
||||
{{if and (eq .NSDMode "off") .ProfileTest}}
|
||||
<p class="dq-warn">Контур тестовый ({{.Profile}}), а эмуляция выключена — реальные заявки клиентов уйдут в тестовый НРД с настоящими данными (НРД может их не узнать). Для теста используйте «Подмену личности».</p>
|
||||
{{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}}>
|
||||
Эмулировать НРД (заявки в настоящий НРД не уходят)</label>
|
||||
<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:10px;margin-top:10px">
|
||||
<label>Задержка решения, сек <span class="muted">(0..300)</span>
|
||||
<input type="number" name="delay_sec" min="0" max="300" value="{{.NSD.DelaySec}}" style="width:100%"></label>
|
||||
<label>Исход по заявке
|
||||
<select name="outcome" style="width:100%">
|
||||
<option value="confirm" {{if eq .NSD.Outcome "confirm"}}selected{{end}}>Подтвердить перевод</option>
|
||||
<option value="reject" {{if eq .NSD.Outcome "reject"}}selected{{end}}>Отклонить (код ниже)</option>
|
||||
<option value="timeout" {{if eq .NSD.Outcome "timeout"}}selected{{end}}>Не отвечать (таймаут)</option>
|
||||
</select></label>
|
||||
<label id="emu-nsd-code">Код отказа
|
||||
<select name="reject_code" style="width:100%">
|
||||
{{range .RejectCodes}}<option value="{{.Code}}" {{if eq $.NSD.RejectCode .Code}}selected{{end}}>{{.Label}}</option>{{end}}
|
||||
</select></label>
|
||||
<div class="dq-tiles">
|
||||
<label class="dq-tile"><input type="radio" name="mode" value="off" {{if eq .NSDMode "off"}}checked{{end}}><span><b>Выключена</b><small>Заявки клиентов уходят в выбранный контур НРД ({{.Profile}}) с реальными данными — как в боевой работе.</small></span></label>
|
||||
<label class="dq-tile"><input type="radio" name="mode" value="substitute" {{if eq .NSDMode "substitute"}}checked{{end}}><span><b>Подмена личности</b><small>Заявка уходит в контур НРД ({{.Profile}}), но у клиентов из списка блок инвестора заменяется на тест-инвестора{{if .RealNSDAs}} ({{.RealNSDAs}}){{end}}. DEPO и QUIK МНП — по реальному клиенту.</small></span></label>
|
||||
<label class="dq-tile"><input type="radio" name="mode" value="imitate" {{if eq .NSDMode "imitate"}}checked{{end}}><span><b>Полная имитация</b><small>В НРД ничего не отправляется — bj сам отвечает корректным файлом (ответ контрагента формирует внутренний имитатор).</small></span></label>
|
||||
</div>
|
||||
<div id="emu-nsd-sub" style="margin-top:10px;max-width:560px">
|
||||
<label>Паспорта клиентов для подмены <span class="muted">(серия номер, через «;»)</span>
|
||||
<input type="text" name="docs" value="{{.RealNSDDocs}}" placeholder="1110 754503" spellcheck="false" class="dq-mono" style="width:100%"></label>
|
||||
<p class="muted" style="font-size:12px;margin:4px 0 0">Заявки этих клиентов уйдут в НРД под данными тест-инвестора{{if .RealNSDAs}} <b>{{.RealNSDAs}}</b>{{end}}. Остальные — с настоящими данными.</p>
|
||||
</div>
|
||||
<div id="emu-nsd-imi">
|
||||
<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:10px;margin-top:10px">
|
||||
<label>Задержка ответа, сек <span class="muted">(0..300)</span>
|
||||
<input type="number" name="delay_sec" min="0" max="300" value="{{.NSD.DelaySec}}" style="width:100%"></label>
|
||||
<label>Ответ имитатора
|
||||
<select name="outcome" style="width:100%">
|
||||
<option value="confirm" {{if eq .NSD.Outcome "confirm"}}selected{{end}}>Подтвердить перевод</option>
|
||||
<option value="reject" {{if eq .NSD.Outcome "reject"}}selected{{end}}>Отклонить (код ниже)</option>
|
||||
<option value="timeout" {{if eq .NSD.Outcome "timeout"}}selected{{end}}>Не отвечать (таймаут)</option>
|
||||
</select></label>
|
||||
<label id="emu-nsd-code">Код отказа
|
||||
<select name="reject_code" style="width:100%">
|
||||
{{range .RejectCodes}}<option value="{{.Code}}" {{if eq $.NSD.RejectCode .Code}}selected{{end}}>{{.Label}}</option>{{end}}
|
||||
</select></label>
|
||||
</div>
|
||||
</div>
|
||||
<p class="dq-note" id="emu-nsd-st" aria-live="polite">Изменения сохраняются сразу.</p>
|
||||
<noscript><button type="submit" class="btn">Сохранить</button></noscript>
|
||||
</form>
|
||||
</div>
|
||||
<script>(function(){
|
||||
var f=document.getElementById('emu-nsd-form'), st=document.getElementById('emu-nsd-st'), code=document.getElementById('emu-nsd-code');
|
||||
function sync(){ code.style.opacity=(f.outcome.value==='reject')?'1':'.45'; }
|
||||
var f=document.getElementById('emu-nsd-form'), st=document.getElementById('emu-nsd-st');
|
||||
var sub=document.getElementById('emu-nsd-sub'), imi=document.getElementById('emu-nsd-imi'), code=document.getElementById('emu-nsd-code');
|
||||
function mode(){ var r=f.querySelector('input[name=mode]:checked'); return r?r.value:'off'; }
|
||||
function sync(){ var m=mode(); sub.hidden=(m!=='substitute'); imi.hidden=(m!=='imitate'); if(code) code.style.opacity=(f.outcome.value==='reject')?'1':'.45'; }
|
||||
f.addEventListener('change', function(){ sync();
|
||||
fetch(f.action,{method:'POST',body:new URLSearchParams(new FormData(f)),headers:{'Content-Type':'application/x-www-form-urlencoded','X-BJ-Ajax':'1'},cache:'no-store'})
|
||||
.then(function(r){ return r.text().then(function(t){ st.textContent=(r.ok?'✓ Сохранено: ':'✗ ')+t; }); })
|
||||
|
||||
@@ -63,21 +63,13 @@
|
||||
{{end}}
|
||||
|
||||
<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>
|
||||
<button class="b-init" style="background:var(--card);border-color:var(--border);color:var(--text)">Сохранить</button>
|
||||
</form>{{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>
|
||||
{{if .RealNSD.Enabled}}
|
||||
<p style="margin:0 0 6px;font-size:13.5px;color:var(--text)"><b>Сейчас подменяет:</b> заявки по паспорту(ам) <code>{{.RealNSD.Docs}}</code> → в НРД уходят от имени тест-инвестора <b>{{.RealNSDAs}}</b>. У клиента всё боевое (DEPO, QUIK МНП), в НРД — подменённый блок инвестора; ответы НРД применяются к заявке клиента, «Исполнена» в ЛК — по отчёту MS010.</p>
|
||||
{{else}}
|
||||
<p class="muted" style="margin:0 0 6px;font-size:13px">Выключена — заявки клиентов идут в выбранный контур НРД с реальными данными. При включении заявки клиентов из списка уходят в НРД под данными тест-инвестора (остальное — боевое).</p>
|
||||
{{end}}
|
||||
<p class="muted" style="margin:0;font-size:13px">Управление режимом эмуляции НРД (выключена / подмена / полная имитация) и список клиентов — на странице <a href="/admin/emulators#emu-nsd-card">«Эмуляторы»</a>.</p>
|
||||
</div>
|
||||
|
||||
<form method="post" action="/admin/m2m-testing/counterparty" class="cpf" id="cpForm">
|
||||
|
||||
Reference in New Issue
Block a user