Files
Bridge-and-Join-s/internal/lkgateway/web/templates/admin_handbook.html
T
zuevav da12a9ec1c feat(bj): модуль ЛК на PostgreSQL, обмен с DEPO, боевой ЛК с имитатором НРД, QUIK, НПР
- bj_exchange и «кран» Fancy убраны: данные модуля ЛК в PostgreSQL (схема lk)
- трансферные таблицы FTV_M2M: создание при установке, события, справочник участников
- сверка с DEPO: счёт, ФИО, дата рождения, ИИС по договору, квал-инвестор из опции DEPO
- боевой ЛК ЕСИА Финанс при тестовом ИШ: журнал, отказ через DEPO, статусы в ЛК
- онлайн-лицензирование в bj, план тестирования M2M для контрагента (интерактивный HTML)
- модули QUIK МНП, экспорт QUIK, НПР/УДС; документы и тестовые материалы

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-15 19:41:12 +03:00

106 lines
4.8 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{{define "content"}}
<div class="card">
<h2>Справочник участников M2M</h2>
<p class="muted">Актуальная карта участников сервиса MOEX МОСТ (получена от НРД пакетом <code>#M2MTH</code>): ИНН, код участника (MC/EC/…), тип и наименование. Используется для сопоставления контрагента с кодом участника.
{{if .At}}<br><span style="font-size:12px">Справочник обновлён: <strong>{{.At}}</strong>.</span>{{end}}
</p>
{{if not .Participants}}
<div style="margin-top:12px;padding:14px;background:var(--warn-weak,#f6eed8);border-radius:10px">
<strong>Справочник ещё не загружен.</strong>
<p class="muted" style="margin:6px 0 0">Запросите его у НРД: <a href="/admin/setup">Настройка → Тесты → «Запросить справочник у НРД»</a>. Ответ придёт во входящие ИШ (~30–60 сек) и появится здесь.</p>
</div>
{{end}}
</div>
{{if .Participants}}
<div class="card">
<div style="display:flex;gap:12px;flex-wrap:wrap;align-items:center;justify-content:space-between">
<div style="flex:1;min-width:220px">
<input id="hb-search" type="text" placeholder="Поиск по наименованию, ИНН или коду…" autocomplete="off"
style="width:100%;max-width:520px" oninput="hbFilter()">
</div>
<div style="display:flex;gap:8px;align-items:center">
<select id="hb-kind" onchange="hbFilter()" style="max-width:200px">
<option value="">Все типы</option>
<option value="depo">Депозитарии</option>
<option value="broker">Брокеры</option>
<option value="place">Места расчётов</option>
</select>
<span class="muted" id="hb-count" style="font-size:13px;white-space:nowrap"></span>
</div>
</div>
<div class="tw" style="margin-top:14px">
<table id="hb-table">
<thead>
<tr>
<th style="width:150px">Код участника</th>
<th style="width:140px">ИНН</th>
<th style="width:120px">Тип</th>
<th>Наименование</th>
</tr>
</thead>
<tbody>
{{range .Participants}}
<tr class="hb-row" data-kind="{{.Kind}}"
data-s="{{.Code}} {{.INN}} {{.Name}}">
<td class="mono">{{if .Code}}{{.Code}}{{else}}—{{end}}</td>
<td class="mono">{{.INN}}</td>
<td>
{{if eq .Kind "depo"}}<span class="pill p-depo">депозитарий</span>
{{else if eq .Kind "broker"}}<span class="pill p-broker">брокер</span>
{{else if eq .Kind "place"}}<span class="pill p-place">место расчётов</span>
{{else}}{{.Kind}}{{end}}
</td>
<td>{{.Name}}</td>
</tr>
{{end}}
</tbody>
</table>
</div>
<p class="muted" id="hb-empty" style="display:none;margin-top:12px">Ничего не найдено по запросу.</p>
</div>
<style>
#hb-table td{vertical-align:middle}
.pill{font-family:var(--mono,monospace);font-size:11px;font-weight:600;padding:3px 9px;border-radius:999px;white-space:nowrap;display:inline-block}
.p-depo{background:var(--accent-weak,#e8ecfb);color:var(--accent,#1e4fd8)}
.p-broker{background:var(--warn-weak,#f6eed8);color:var(--warn-ink,#8a5806)}
.p-place{background:var(--ok-weak,#e2f1eb);color:var(--good-ink,#0c6144)}
mark{background:var(--accent-weak,#e8ecfb);color:inherit;padding:0 1px;border-radius:3px}
</style>
<script>
(function(){
var rows=[].slice.call(document.querySelectorAll('.hb-row'));
window.hbFilter=function(){
var q=(document.getElementById('hb-search').value||'').trim().toLowerCase();
var kind=document.getElementById('hb-kind').value;
var shown=0;
rows.forEach(function(r){
var s=(r.getAttribute('data-s')||'').toLowerCase();
var okQ=!q || s.indexOf(q)>=0;
var okK=!kind || r.getAttribute('data-kind')===kind;
var vis=okQ&&okK;
r.style.display=vis?'':'none';
if(vis)shown++;
});
document.getElementById('hb-count').textContent='Показано: '+shown+' из '+rows.length;
document.getElementById('hb-empty').style.display=shown?'none':'block';
};
hbFilter();
// Enter в поиске не отправляет форму
var inp=document.getElementById('hb-search');
inp.addEventListener('keydown',function(e){if(e.key==='Enter')e.preventDefault();});
inp.focus();
})();
</script>
{{end}}
<div class="card">
<details>
<summary style="cursor:pointer;font-weight:600;font-size:15px">Коды ошибок и отказов M2M — справка</summary>
<div style="margin-top:10px">{{.CodesHTML}}</div>
</details>
</div>
{{end}}