Files
Bridge-and-Join-s/internal/lkgateway/web/templates/part_letters.html
T

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" href="{{mailtoLink .}}" style="text-decoration:none;background:var(--card);color:var(--text);border:1px solid var(--border-strong,#c9cdd8)">Открыть в почте</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{'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;'}[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}}