Справочник участников — своего контура; регистрация — по справочнику НРД; поиск клиентов портфеля

readHandbook брал самый свежий из своего, общего (с сервера лицензий) и
встроенного — общий был тестовым (TEST3, 166 участников, прислан с 28), и на
боевом 9 bj считал «регистрация подтверждена», хотя в боевом справочнике
НРД (89) нас нет. Теперь при своём справочнике от НРД — только он; на сервер
лицензий справочник уходит только с боевого контура.

Регистрация участника проверяется по справочнику, полученному от НРД;
появились в нём — анкета отмечается принятой автоматически, плашка уходит.

Портфель ЛК: клиенты DEPO списком по клику (первые 50 по алфавиту), «не
найдено» вместо «поиск недоступен» (пустой ответ был null).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
This commit is contained in:
fontvielle
2026-10-22 11:28:13 +03:00
parent 6fc0ff5d3d
commit f296ac5ad8
6 changed files with 86 additions and 29 deletions
@@ -708,7 +708,7 @@
<div style="font-size:13px;font-weight:600;margin-bottom:4px">Залить одному клиенту (для теста)</div>
<div style="display:flex;gap:10px;align-items:flex-end;flex-wrap:wrap">
<label style="display:flex;flex-direction:column;gap:3px;font-size:12px;min-width:320px">Клиент DEPO — ФИО, портфель или счёт
<input id="lkpf-q" autocomplete="off" placeholder="например, Погонщикова или БР-859"></label>
<input id="lkpf-q" autocomplete="off" placeholder="нажмите — список клиентов; или ФИО, портфель, счёт"></label>
<input type="hidden" name="client_port" id="lkpf-port"><input type="hidden" name="client_lk" id="lkpf-lk">
<button class="btn" type="submit" name="action" value="client_push" id="lkpf-push" disabled>Залить сейчас</button>
<button class="btn" type="submit" name="action" value="client_add" id="lkpf-add" disabled>Добавить в постоянное заполнение</button>
@@ -726,20 +726,23 @@
sel.innerHTML=ok?('Выбран: <b>'+esc(c.name)+'</b> · портфель DEPO '+esc(c.port)+' · счёт '+esc(c.account)+' → договор в ЛК <b>'+esc(c.lk)+'</b>'):'У клиента нет торгового счёта — договор в ЛК не определить';
list.innerHTML='';
}
q.addEventListener('input',function(){
clearTimeout(t); var v=q.value.trim(); if(v.length<2){list.innerHTML='';return}
function load(){
clearTimeout(t); var v=q.value.trim(); if(v.length===1){list.innerHTML='';return}
list.innerHTML='<span class="muted">ищу в DEPO…</span>';
t=setTimeout(function(){
fetch('/admin/setup/lk-portfolio/clients?q='+encodeURIComponent(v),{cache:'no-store'}).then(function(r){return r.json()}).then(function(d){
if(d.error){list.innerHTML='<span style="color:var(--err)">'+esc(d.error)+'</span>';return}
fetch('/admin/setup/lk-portfolio/clients?q='+encodeURIComponent(v),{cache:'no-store'}).then(function(r){if(!r.ok) throw new Error(r.status); return r.json()}).then(function(d){
if(d&&d.error){list.innerHTML='<span style="color:var(--err)">DEPO: '+esc(d.error)+'</span>';return}
if(!d||!d.length){list.innerHTML='<span class="muted">не найдено</span>';return}
list.innerHTML=''; d.forEach(function(c){
var a=document.createElement('a'); a.href='#'; a.style.display='block'; a.style.padding='2px 0';
a.innerHTML=esc(c.name)+' · '+esc(c.port)+' · '+esc(c.account)+(c.lk?' → '+esc(c.lk):'');
a.onclick=function(e){e.preventDefault(); pick(c)}; list.appendChild(a);
});
}).catch(function(){list.innerHTML='<span style="color:var(--err)">поиск недоступен</span>'});
}).catch(function(e){list.innerHTML='<span style="color:var(--err)">поиск не ответил ('+esc(e&&e.message||'сеть')+') — повторите</span>'});
},300);
});
}
q.addEventListener('input',load);
q.addEventListener('focus',function(){ if(!list.innerHTML) load(); });
})();
</script>
{{range lkPortfolioStates}}<div class="muted" style="font-size:12.5px;margin-top:8px"><b>{{.LK}}</b> ← {{.Depo}}: {{if .Err}}<span style="color:var(--err)">ошибка — {{.Err}}</span>{{else if .PushedAt.IsZero}}сверено {{.CheckedAt.Format "15:04:05"}}, отправки ещё не было{{else}}отправлено {{.PushedAt.Format "02.01 15:04:05"}} ({{.Lines}} бумаг), сверено {{.CheckedAt.Format "15:04:05"}}{{end}}{{range .Skipped}}<br>пропущено: {{.}}{{end}}</div>{{end}}