QUIK, Криптография, НРД — сводка «что настроено и как» сверху, формы — под «Перенастроить»

- QUIK: подключение к модулю (сервер, база, логин, проверено), как bj работает с QUIK (и отклонения из расширенных), торговый счёт, поручения из терминала, справочник получателей; формы и проверка МНП — под «Перенастроить».
- Криптография: «Подпись работает / ключ скоро закончится / ключ не подключён» с кнопкой установки; ключ организации (срок, заменить), СКЗИ, bj-crypto, сертификаты НРД в справочнике шлюза; остальное — под «Перенастроить» (без повтора плашки «ключ не подключён»).
- НРД: организация, реквизиты, кто отвечает на переводы, шлюз (версия, активный контур, канал, ключ) и папки по сети — из тех же запросов, что блок шлюза (события bj-igate-status / bj-igate-share, без лишних обращений к root-обработчику); формы — под «Перенастроить».
- «Перенастроить» раскрыто само, если что-то не настроено.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
This commit is contained in:
zuevav
2026-10-07 11:23:55 +03:00
parent 7c78e9ae0b
commit bbeb59e3bc
3 changed files with 87 additions and 9 deletions
@@ -105,8 +105,14 @@
{{/* ============ QUIK МНП ============ */}}
<section class="settings-section" id="sec-quik">
<h1>QUIK — Модуль неторговых поручений</h1>
{{template "quikStatus" .}}
<div class="card">
<details class="adv-box" {{if not (and .Settings.Quik.Server .Settings.Quik.Verified)}}open{{end}}>
<summary><span class="sum-h">Перенастроить</span><span class="muted">подключение к модулю, как bj работает с QUIK, поручения из терминала, расширенные настройки, проверка модуля</span></summary>
{{template "quikSection" .}}
{{if .Settings.Quik.Server}}{{template "mnpCheck" .}}{{end}}
</details>
</div>
</section>
{{end}}{{/* /AdvancedUnlocked — конец перспективных модулей Fancy/QUIK */}}
@@ -242,7 +248,11 @@
{{/* ============ КРИПТОГРАФИЯ ============ */}}
<section class="settings-section" id="sec-crypto">
<h1>Криптография</h1>
{{template "verline" (.Versions.Get "crypto-service.jar")}}{{template "verline" (.Versions.Get "validata")}}{{template "verline" (.Versions.Get "java")}}
{{template "cryptoStatus" .}}
<div class="card">
<details class="adv-box" {{if not (and cryptoReady orgKeyCert)}}open{{end}}>
<summary><span class="sum-h">Перенастроить</span><span class="muted">ключ организации, проверка СКЗИ, сертификаты НРД в справочнике шлюза, версии</span></summary>
<div style="margin-top:16px">{{template "verline" (.Versions.Get "crypto-service.jar")}}{{template "verline" (.Versions.Get "validata")}}{{template "verline" (.Versions.Get "java")}}</div>
{{$kc := orgKeyCert}}
{{if and cryptoReady $kc}}
@@ -253,12 +263,6 @@
<a href="/admin/setup/keywizard" class="btn btn-ok" style="margin-top:6px;display:inline-block">Установить новый ключ →</a>
{{else}}<p class="muted" style="font-size:13px;margin:6px 0 0">Перевыпустили ключ (новый сертификат) или нужен ключ другого контура — <a href="/admin/setup/keywizard">заменить ключ</a>: bj поможет подключить флешку или записать новый ключ из архива.</p>{{end}}
</div>
{{else}}
<div class="card callout" style="background:var(--accent-weak)">
<h2>Ключ организации не подключён</h2>
<p class="muted">Пошаговая установка: флешка с ключом или архив ключа от НРД с паролем → справочник сертификатов → проверка подписи → готово.</p>
<a href="/admin/setup/keywizard" class="btn btn-ok" style="margin-top:10px;display:inline-block">Установить ключ →</a>
</div>
{{end}}
<div class="card">
@@ -336,12 +340,18 @@
{{end}}
</div>
{{end}}
</details>
</div>
</section>
{{/* ============ НРД ============ */}}
<section class="settings-section" id="sec-nsd">
<h1>НРД</h1>
{{template "verline" (.Versions.Get "ish")}}
{{template "nsdStatus" .}}
<div class="card">
<details class="adv-box" {{if not (and .Settings.NSD.OrgINN .Settings.NSD.OrgCode .Settings.NSD.DeponentCode .Settings.NSD.AccountID .Settings.NSD.SectionID .Settings.NSD.IGWBaseURL)}}open{{end}}>
<summary><span class="sum-h">Перенастроить</span><span class="muted">организация, реквизиты в НРД, кто отвечает на переводы, шлюз и контуры, папки шлюза по сети</span></summary>
{{template "orgSection" .}}
{{template "nsdRequisites" .}}
{{template "m2mAutoCard" (withRet . "")}}
@@ -397,6 +407,8 @@
</script>
</details>
</div>
</details>
</div>
</section>
{{/* ============ ЛИЧНЫЙ КАБИНЕТ ============ */}}
@@ -194,7 +194,7 @@
return rows.join(''); }
function show(d){
if(!d.ok){ stl.innerHTML=bad(d.error||'состояние не получено'); return; }
cur=d;
cur=d; try{ window.dispatchEvent(new CustomEvent('bj-igate-share',{detail:d})); }catch(e){}
if(d.manual){ stl.innerHTML=ok('папки открыты вручную (smb.conf) для '+esc(d.user||'—')+' — bj их не меняет'); f.hidden=true; return; }
var a=d.access||{}, g=a.groups||[], u=a.users||[];
acc.innerHTML=(g.length||u.length)?('Доступ получат: '+(g.length?'группы <b>'+g.map(esc).join('</b>, <b>')+'</b>':'')+(g.length&&u.length?'; ':'')+(u.length?'сотрудники <b>'+u.map(esc).join('</b>, <b>')+'</b>':'')+'. Список — из Настройка → Пользователи, обновляется сам.'):'<span style="color:var(--warn)">В bj пока нет групп и сотрудников домена с доступом — добавьте их в Настройка → Пользователи («Сотрудники из домена»).</span>';
@@ -231,7 +231,7 @@
var st=null;
function load(){
fetch('/admin/setup/igate/status',{cache:'no-store'}).then(function(r){return r.json()}).then(function(d){
st=d;
st=d; try{ window.dispatchEvent(new CustomEvent('bj-igate-status',{detail:d})); }catch(e){} // сводка раздела «НРД»
if(!d.ok){ head.innerHTML=bad(d.error); return; }
var ri=document.getElementById('ig-reinst'), bb=document.getElementById('ig-bnd'), bv=document.getElementById('ig-bnd-v');
var running=d.installed&&d.engine==='Running';
@@ -0,0 +1,66 @@
{{/* Сводки разделов «Настройки»: что настроено и как — одним взглядом; формы — под «Перенастроить».
Тот же принцип, что у «Обмена с DEPO» (fancyStatus). */}}
{{define "quikStatus"}}{{$q := .Settings.Quik}}{{$ok := and $q.Server $q.Verified}}
<div class="card" id="sec-quik-status">
<div class="stc {{if $ok}}stc-ok{{else if $q.Server}}stc-err{{else}}stc-warn{{end}}"><span class="stc-ic"></span>
<div class="stc-b"><b>{{if $ok}}QUIK подключён{{else if $q.Server}}Подключение к QUIK не проверено{{else}}QUIK не подключён{{end}}</b>
<small>{{if $ok}}{{if $q.WritesEnabled}}Чтение и запись — боевая работа: bj сам блокирует бумаги, списывает и зачисляет.{{else}}Только чтение — bj читает данные, в QUIK ничего не меняет.{{end}} Изменить — «Перенастроить» ниже.{{else if $q.Server}}Проверьте подключение в «Перенастроить» — «Сохранить и проверить».{{else}}Подключите модуль неторговых поручений — мастером настройки (шаг «QUIK») или в «Перенастроить».{{end}}</small></div>
{{if not $q.Server}}<a class="btn" href="/admin/wizard?step=5" style="flex:none">Открыть мастер</a>{{end}}</div>
{{if $q.Server}}
<dl class="kv">
<dt>Модуль неторговых поручений</dt><dd><b>{{$q.Server}}{{if $q.Port}}:{{$q.Port}}{{end}}</b>{{if $q.Database}}, база <code>{{$q.Database}}</code>{{end}}, логин <code>{{$q.User}}</code>{{if $q.Verified}} <span class="kv-ok">✓</span> <span class="muted">проверено{{if not $q.LastAt.IsZero}} {{msk $q.LastAt}}{{end}}</span>{{else}} <span class="kv-no">✗</span> не проверено{{end}}</dd>
<dt>Как bj работает с QUIK</dt><dd>{{if $q.WritesEnabled}}<b>Чтение и запись</b> — боевая работа{{else}}<b>Только чтение</b>{{end}}{{with quikModeCustom $q}}<div style="color:var(--warn);font-size:13px">⚠ {{.}}</div>{{end}}{{if $q.Emulate}}<div style="color:var(--warn);font-size:13px">⚠ {{if devOn}}режим имитации — в МНП ничего не пишется{{else}}записи в QUIK сейчас не выполняются{{end}}</div>{{end}}</dd>
{{if $q.WritesEnabled}}<dt>Торговый счёт</dt><dd>{{if $q.Account}}<code>{{$q.Account}}</code>{{else}}<span class="kv-no">✗</span> не задан{{end}}</dd>{{end}}
<dt>Поручения клиентов из QUIK</dt><dd>{{if $q.PollTerminal}}принимаются — из терминала и мобильного приложения; оператору приходит уведомление{{else}}нет — клиенты подают поручения через депозитарий{{end}}</dd>
<dt>Справочник получателей</dt><dd class="muted" style="font-size:13px">{{quikRecipientsInfo}}</dd>
</dl>
{{end}}
</div>
{{end}}
{{define "cryptoStatus"}}{{$kc := orgKeyCert}}{{$ok := and cryptoReady $kc}}
<div class="card" id="sec-crypto-status">
<div class="stc {{if $ok}}{{if lt (index $kc "Days") 30}}stc-err{{else}}stc-ok{{end}}{{else}}stc-warn{{end}}"><span class="stc-ic"></span>
<div class="stc-b"><b>{{if $ok}}{{if lt (index $kc "Days") 30}}Ключ организации скоро закончится{{else}}Подпись работает{{end}}{{else}}Ключ организации не подключён{{end}}</b>
<small>{{if $ok}}СКЗИ «Валидата» установлена, ключ организации подключён — документы для НРД подписываются.{{if lt (index $kc "Days") 30}} Получите новый ключ в Удостоверяющем центре и установите его.{{end}}{{else}}Пошаговая установка: флешка с ключом или архив ключа от НРД с паролем → справочник сертификатов → проверка подписи.{{end}}</small></div>
{{if or (not $ok) (lt (index $kc "Days") 30)}}<a class="btn" href="/admin/setup/keywizard" style="flex:none">{{if $ok}}Установить новый ключ →{{else}}Установить ключ →{{end}}</a>{{end}}</div>
<dl class="kv">
{{if $kc}}<dt>Ключ организации</dt><dd>«{{index $kc "Owner"}}» · выдан {{index $kc "Issuer"}} · действует до <b>{{index $kc "Until"}}</b> <span class="muted">(осталось {{index $kc "Days"}} дн.)</span> · <a href="/admin/setup/keywizard">заменить ключ</a></dd>{{end}}
{{with .Versions.Get "validata"}}<dt>СКЗИ «Валидата Клиент L»</dt><dd>{{if .Version}}{{if cryptoReady}}<span class="kv-ok">✓</span> {{end}}{{.Version}}{{else}}<span class="kv-no">✗</span> не определена{{end}}{{with .Detail}} <span class="muted">· {{.}}</span>{{end}}</dd>{{end}}
{{with .Versions.Get "crypto-service.jar"}}<dt>Проверка подписи (bj-crypto)</dt><dd>{{if .Version}}{{.Version}}{{else}}не определена{{end}}{{with .Err}} <span style="color:var(--err)">· {{.}}</span>{{end}}</dd>{{end}}
<dt>Сертификаты НРД в справочнике шлюза</dt><dd>{{if .NSDCerts.Pending}}<span class="kv-warn">⚠</span> есть изменения к применению ({{.NSDCerts.Pending}}){{else if .NSDCerts.LastRun.IsZero}}ещё не сверялись{{else}}<span class="kv-ok">✓</span> сверены {{msk .NSDCerts.LastRun}}{{end}} <span class="muted">· bj сверяет сам при запуске и раз в 6 часов</span></dd>
</dl>
</div>
{{end}}
{{define "nsdStatus"}}{{$n := .Settings.NSD}}{{$a := .Settings.M2MAuto}}{{$org := and $n.OrgINN $n.OrgCode}}{{$req := and $n.DeponentCode $n.AccountID $n.SectionID}}{{$ok := and $org $req $n.IGWBaseURL}}
<div class="card" id="sec-nsd-status">
<div class="stc {{if $ok}}stc-ok{{else}}stc-err{{end}}" id="nsd-st-card"><span class="stc-ic"></span>
<div class="stc-b"><b id="nsd-st-title">{{if $ok}}Обмен с НРД настроен{{else}}Обмен с НРД настроен не до конца{{end}}</b>
<small>{{if $ok}}Организация, реквизиты и шлюз — ниже. Изменить — «Перенастроить».{{else}}Что не так — в строках ниже с ✗; поправить — в «Перенастроить» или мастером настройки.{{end}}</small></div></div>
<dl class="kv">
<dt>Организация</dt><dd>{{if $org}}<b>{{if $n.OrgName}}{{$n.OrgName}}{{else}}—{{end}}</b> · ИНН <code>{{$n.OrgINN}}</code> · код <code>{{$n.OrgCode}}</code>{{else}}<span class="kv-no">✗</span> не задана{{end}}</dd>
<dt>Реквизиты в НРД</dt><dd>{{if $req}}код <code>{{$n.DeponentCode}}</code> · счёт <code>{{$n.AccountID}}</code> · раздел <code>{{$n.SectionID}}</code>{{else}}<span class="kv-no">✗</span> не заданы{{end}}</dd>
<dt>Кто отвечает на переводы</dt><dd>{{if $a.Enabled}}<b>bj сам — автоматически</b>{{else}}<b>Оператор</b> <span class="muted">— запасной режим</span>{{end}}{{if not $a.ChangedAt.IsZero}} <span class="muted">· с {{msk $a.ChangedAt}}</span>{{end}}</dd>
<dt>Шлюз НРД</dt><dd id="nsd-st-gw">{{if $n.IGWBaseURL}}контур <code>{{$n.Profile}}</code> · <span class="muted">проверяю шлюз…</span>{{else}}<span class="kv-no">✗</span> не настроен{{end}}</dd>
<dt>Папки шлюза по сети</dt><dd id="nsd-st-share"><span class="muted">проверяю…</span></dd>
</dl>
</div>
<script>(function(){
function esc(s){return String(s==null?'':s).replace(/[&<>"]/g,function(c){return{'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;'}[c]})}
var gw=document.getElementById('nsd-st-gw'), sh=document.getElementById('nsd-st-share');
window.addEventListener('bj-igate-status',function(e){ var d=e.detail||{}; if(!gw) return;
if(!d.ok){ gw.innerHTML='<span class="kv-no">✗</span> состояние не получено'; return; }
if(!d.installed){ gw.innerHTML='<span class="kv-no">✗</span> шлюз на этом сервере не установлен'; return; }
var run=d.engine==='Running', c=d.active_contour==='prod'?'боевой':'тестовый TEST3', code=(d.active_contour==='prod'?'PROD':'TEST3')+(d.deponent||''), ch=(d.channels||[]).filter(function(x){return x.code===code})[0];
gw.innerHTML=(run?'<span class="kv-ok">✓</span> ИШ '+esc(d.version)+' работает':'<span class="kv-no">✗</span> ИШ '+esc(d.version)+' не работает'+(d.keymedia==='missing'?' — ждёт флешку с ключом':''))+' · активный контур <b>'+c+'</b>'+(ch?(' · канал '+(ch.enabled?'включён':'выключен')+(ch.profile?' · ключ '+esc(ch.profile):' · <span style="color:var(--err)">ключ не установлен</span>')):'');
});
window.addEventListener('bj-igate-share',function(e){ var d=e.detail||{}; if(!sh) return;
if(d.manual){ sh.textContent='открыты вручную (smb.conf)'; return; }
if(!d.on){ sh.innerHTML='закрыты <span class="muted">— открыть: «Перенастроить» → «Папки шлюза по сети»</span>'; return; }
var ip=d.ip||location.hostname, names=(d.shares&&d.shares.length)?d.shares:['igate_exchange'];
sh.innerHTML='открыты '+(d.mode==='domain'?'через домен '+esc(d.realm||'')+' — своим входом в Windows':'для '+esc(d.user||'—'))+': '+names.map(function(n){return '<code>\\\\'+esc(ip)+'\\'+esc(n)+'</code>'}).join(', ');
});
})();</script>
{{end}}