a2608076a4
- клиенту — «шлюз НРД» вместо «ИШ» (установка, статусы, этапы, ключ, переводы); расшифровка «(ИШ)» — только в заголовке окна обновления - контур — «тестовый (TEST3)»; в строке шлюза — «работает · версия …» - меню = заголовки разделов: «Обмен с DEPO», «Пользователи и вход», «Оформление отчётов» - мастер: заголовок шага = его название в колонке шагов - вторичная кнопка — классом btn-secondary, а не стилями в разметке - узкий экран: поля и сетки с жёсткой шириной не вылезают, таблицы прокручиваются, анкета участника — по высоте экрана Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
69 lines
6.8 KiB
HTML
69 lines
6.8 KiB
HTML
{{/* Готовое письмо (letters.go): текст с реквизитами, копирование, файл, открыть в почте. Аргумент — *Letter. */}}
|
|
{{define "letterCard"}}{{with .}}
|
|
<details class="letter" style="border:1px solid var(--border);border-radius:8px;padding:8px 12px;margin:8px 0;background:var(--card)">
|
|
<summary style="cursor:pointer;font-weight:600">✉ {{.Title}}</summary>
|
|
<p class="muted" style="font-size:12.5px;margin:6px 0">Кому: {{.To}}<br>Тема: {{.Subject}}</p>
|
|
<pre class="copyable" style="white-space:pre-wrap;font-size:12.5px;max-height:320px;overflow:auto">{{.Body}}</pre>
|
|
<p class="muted" style="font-size:12px;margin:4px 0 8px">В квадратных скобках — то, чего bj не знает: впишите перед отправкой.</p>
|
|
<div style="display:flex;gap:8px;flex-wrap:wrap">
|
|
<a class="btn" href="/admin/setup/letters/{{.Key}}.txt" style="text-decoration:none">Скачать текст</a>
|
|
<a class="btn btn-secondary" href="{{mailtoLink .}}" style="text-decoration:none">Открыть в почте</a>
|
|
</div>
|
|
</details>
|
|
{{end}}{{end}}
|
|
|
|
{{/* Проверка всей цепочки (chaintest.go). Данные — WizardData. */}}
|
|
{{define "chainTest"}}
|
|
<div class="card" id="chain">
|
|
<h2><span class="dot" id="ch-dot"></span>Проверить всю цепочку</h2>
|
|
<p class="muted" style="margin:0 0 8px">Сквозная проверка без настоящего перевода: bj по очереди проходит каждое звено и показывает, какое работает, а какое нет.{{if .DepoLicensed}} Учёт DEPO — проверочное событие, QUIK — только чтение (пробная блокировка — по желанию, ниже).{{end}} НРД — запрос справочника участников через шлюз: шлюз подписывает его ключом организации, НРД отвечает.</p>
|
|
{{if .DepoLicensed}}
|
|
<details style="margin:6px 0 10px">
|
|
<summary style="cursor:pointer;color:var(--accent);font-size:13px">Добавить пробную блокировку в QUIK (1 бумага клиента — заблокировать и сразу снять)</summary>
|
|
<div id="ch-blk" style="display:grid;gap:8px;margin-top:8px;max-width:640px">
|
|
<p class="muted" style="font-size:12.5px;margin:0">В боевом QUIK будет зарегистрировано поручение «Вывод ЦБ (M2M)» на 1 шт. и сразу снято: в QUIK оно останется в истории как снятое. Нужны код клиента в QUIK и бумага, которая у клиента есть.</p>
|
|
<div style="display:grid;grid-template-columns:1fr 1fr;gap:8px">
|
|
<label style="margin:0">Код клиента в QUIK<input id="ch-client" placeholder="BR859" autocomplete="off" style="width:100%;box-sizing:border-box;margin-top:4px"></label>
|
|
<label style="margin:0">ISIN бумаги<input id="ch-isin" value="RU0009029540" autocomplete="off" style="width:100%;box-sizing:border-box;margin-top:4px"></label>
|
|
</div>
|
|
<label style="margin:0">Депозитарий-получатель (условный)<select id="ch-inn" style="width:100%;box-sizing:border-box;margin-top:4px">{{range handbookDepos}}<option value="{{.INN}}">{{.Name}} · ИНН {{.INN}}</option>{{end}}</select></label>
|
|
<label style="display:flex;gap:8px;align-items:center;font-weight:400;margin:0"><input type="checkbox" id="ch-blk-on" style="width:auto"> Разрешаю записать в QUIK пробное поручение и снять его</label>
|
|
</div>
|
|
</details>
|
|
{{end}}
|
|
<button type="button" class="btn" id="ch-run" style="background:var(--ok);border-color:var(--ok)">▶ Проверить всю цепочку</button>
|
|
<div id="ch-sum" style="font-weight:600;margin:10px 0 4px"></div>
|
|
<table style="width:100%"><tbody id="ch-rows"></tbody></table>
|
|
</div>
|
|
<script>
|
|
(function(){
|
|
var rows=document.getElementById('ch-rows'), sum=document.getElementById('ch-sum'), dot=document.getElementById('ch-dot'), btn=document.getElementById('ch-run');
|
|
function esc(s){return String(s==null?'':s).replace(/[&<>"]/g,function(c){return{'&':'&','<':'<','>':'>','"':'"'}[c]})}
|
|
var ic={wait:'<span class="muted">○</span>',run:'<span style="color:var(--accent)">◌</span>',ok:'<span style="color:var(--ok)">✓</span>',warn:'<span style="color:var(--warn)">⚠</span>',err:'<span style="color:var(--err)">✗</span>'};
|
|
function draw(d){
|
|
var st=d.steps||[];
|
|
rows.innerHTML=st.map(function(s){return '<tr><td style="width:22px;vertical-align:top">'+ic[s.state]+'</td><td style="vertical-align:top;padding-right:10px"><b>'+esc(s.title)+'</b>'+(s.state==='run'?' <span class="muted">— проверяю…</span>':'')+(s.detail?'<br><span class="muted" style="font-size:12.5px">'+esc(s.detail)+'</span>':'')+'</td></tr>'}).join('');
|
|
if(d.running){ sum.textContent='Проверяю цепочку… (до нескольких минут: НРД отвечает не сразу)'; btn.disabled=true; dot.className='dot'; return; }
|
|
btn.disabled=false;
|
|
if(!st.length){ sum.textContent=''; return; }
|
|
var bad=st.filter(function(s){return s.state==='err'});
|
|
if(bad.length){ sum.innerHTML='<span style="color:var(--err)">✗ Не работает: '+esc(bad.map(function(s){return s.title}).join('; '))+'</span>'; dot.className='dot err'; }
|
|
else { sum.innerHTML='<span style="color:var(--ok)">✓ Вся цепочка работает'+(d.finished?' (проверено в '+esc(d.finished)+')':'')+'</span>'; dot.className='dot ok'; }
|
|
}
|
|
function poll(){ fetch('/admin/setup/chain-test/status',{cache:'no-store'}).then(function(r){return r.json()}).then(function(d){ draw(d); if(d.running) setTimeout(poll,2000); }).catch(function(){ setTimeout(poll,4000); }); }
|
|
btn.onclick=function(){
|
|
var p=new URLSearchParams(), on=document.getElementById('ch-blk-on');
|
|
if(on && on.checked){
|
|
p.set('quik_block','1'); p.set('quik_client',document.getElementById('ch-client').value.trim());
|
|
p.set('quik_isin',document.getElementById('ch-isin').value.trim()); p.set('quik_inn',document.getElementById('ch-inn').value);
|
|
if(!confirm('Зарегистрировать в QUIK пробное поручение «Вывод ЦБ (M2M)» на 1 шт. и сразу снять его?')) return;
|
|
}
|
|
sum.textContent='Запускаю…';
|
|
fetch('/admin/setup/chain-test',{method:'POST',body:p,cache:'no-store'}).then(function(r){return r.json()}).then(function(d){
|
|
if(!d.ok){ sum.innerHTML='<span style="color:var(--err)">✗ '+esc(d.error)+'</span>'; return; } setTimeout(poll,800); });
|
|
};
|
|
poll();
|
|
})();
|
|
</script>
|
|
{{end}}
|