Справочник участников: поиск по ИНН/названию/коду вместо списка (ручной ввод, организация); ручной ввод — только НРД
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -37,6 +37,12 @@
|
||||
.mf-hit{display:flex;justify-content:space-between;gap:10px;flex-wrap:wrap;align-items:center;padding:7px 0;border-top:1px solid var(--border)}
|
||||
.mf-pos{display:block;width:100%;text-align:left;padding:7px 10px;margin:3px 0;border-radius:8px;border:1px solid var(--border);background:var(--card);color:var(--text);cursor:pointer;font-size:13px}
|
||||
.mf-pos:hover:not([disabled]){border-color:var(--accent)}.mf-pos[disabled]{opacity:.5;cursor:not-allowed}
|
||||
.hb-box{position:relative}
|
||||
.hb-res{margin-top:4px;max-height:300px;overflow:auto;border-radius:8px}
|
||||
.hb-res:empty{display:none}
|
||||
.hb-hit{display:block;width:100%;text-align:left;padding:7px 10px;margin:2px 0;border-radius:8px;border:1px solid var(--border);background:var(--card);color:var(--text);cursor:pointer;font-size:13px}
|
||||
.hb-hit:hover{border-color:var(--accent)}
|
||||
.hb-m{color:var(--muted);font-size:12px}
|
||||
.mf-sign{display:grid;grid-template-columns:1fr 1fr;gap:40px;margin-top:40px}
|
||||
.mf-sign div{border-top:1px solid #000;padding-top:4px;font-size:12px}
|
||||
@media print{
|
||||
@@ -114,7 +120,7 @@
|
||||
<div class="k">Документ</div><div>код {{$o.DocType}} · {{$o.DocSeries}} № {{$o.DocNumber}}{{if $o.DocIssueDate}} · выдан {{$o.DocIssueDate}}{{end}}{{if $o.DocIssuer}} · {{$o.DocIssuer}}{{end}}</div>
|
||||
<div class="k">Счёт депо / договор</div><div>{{$o.Account}}{{if $o.Contract}} · договор {{$o.Contract}}{{end}}{{if $o.QuikCode}} · код в торговой системе {{$o.QuikCode}}{{end}}</div>
|
||||
<div class="k">Принимающий депозитарий</div><div>{{$o.RecvName}} · ИНН {{$o.RecvINN}}{{if $o.RecvCode}} · {{$o.RecvCode}}{{end}}{{if $o.RecvAccount}} · счёт клиента {{$o.RecvAccount}}{{end}}</div>
|
||||
<div class="k">Место расчётов</div><div>{{if eq $o.SettlePlace "spb"}}СПБ Банк{{else}}НРД{{end}}{{if $o.CostInfo}} · со сведениями о расходах{{end}}</div>
|
||||
<div class="k">Место расчётов</div><div>НРД{{if $o.CostInfo}} · со сведениями о расходах{{end}}</div>
|
||||
<div class="k">Бумаги</div><div>{{range $o.Securities}}<div>{{.ISIN}}{{if .Code}} ({{.Code}}){{end}}{{if .Name}} — {{.Name}}{{end}} × <b>{{.Qty}}</b></div>{{end}}</div>
|
||||
{{if $o.Comment}}<div class="k">Комментарий</div><div>{{$o.Comment}}</div>{{end}}
|
||||
{{if $o.GUID}}<div class="k">Идентификатор перевода</div><div><code>{{$o.GUID}}</code>, отправлено {{msk $o.SentAt}} · {{$o.SentBy}}</div>{{end}}
|
||||
@@ -332,17 +338,15 @@ function mfRerun(){const f=document.getElementById('mf');if(f&&f.closest('detail
|
||||
|
||||
<div class="mf-h">4. Принимающая сторона</div>
|
||||
<div class="mf-grid">
|
||||
<div class="wide"><label>Депозитарий из справочника участников M2M</label>
|
||||
<select id="hb" onchange="mfPickHB(this)">
|
||||
<option value="">— выбрать —</option>
|
||||
{{$inn := .O.RecvINN}}{{range .Handbook}}<option value="{{.INN}}" data-name="{{.Name}}" {{if eq $inn .INN}}selected{{end}}>{{.Name}} · ИНН {{.INN}} · {{.Code}}</option>{{end}}
|
||||
</select>
|
||||
<div class="wide"><label>Найти в справочнике участников M2M</label>
|
||||
<input id="hbq" placeholder="ИНН, часть названия или код участника" autocomplete="off">
|
||||
<div id="hbres" class="hb-res"></div>
|
||||
{{if not .Handbook}}<span class="mf-note">Справочник участников ещё не получен от НРД — введите ИНН вручную.</span>{{end}}</div>
|
||||
<div><label class="mf-req">ИНН принимающего депозитария</label><input name="recv_inn" id="recv_inn" value="{{.O.RecvINN}}" maxlength="10" inputmode="numeric"></div>
|
||||
<div><label>Наименование</label><input name="recv_name" id="recv_name" value="{{.O.RecvName}}"></div>
|
||||
<div><label>Счёт клиента у принимающего</label><input name="recv_account" value="{{.O.RecvAccount}}" placeholder="для сведения"></div>
|
||||
<div><label>Место расчётов</label>
|
||||
<select name="settle_place"><option value="nrd" {{if ne .O.SettlePlace "spb"}}selected{{end}}>НРД</option><option value="spb" {{if eq .O.SettlePlace "spb"}}selected{{end}}>СПБ Банк</option></select></div>
|
||||
<input value="НРД" disabled></div>
|
||||
<div class="wide"><label style="display:flex;gap:8px;align-items:center;color:var(--text);font-size:13.5px"><input type="checkbox" name="cost_info" value="1" style="width:auto" {{if .O.CostInfo}}checked{{end}}> Передать сведения о расходах на приобретение (если клиент просил в поручении)</label></div>
|
||||
</div>
|
||||
<p class="mf-note">Бумаги списываются с нашего места хранения в НРД: {{if .NSD.DeponentCode}}депонент <code>{{.NSD.DeponentCode}}</code>, счёт <code>{{.NSD.AccountID}}</code>, раздел <code>{{.NSD.SectionID}}</code>{{else}}реквизиты не заданы в настройках НРД{{end}}.</p>
|
||||
@@ -387,6 +391,24 @@ async function mfPick(i,j){
|
||||
}
|
||||
let mfPos=[];
|
||||
function mfSec(k){const p=mfPos[k];document.getElementById('f_isin').value=p.isin;document.getElementById('f_sname').value=p.name;const q=document.getElementById('f_qty');q.placeholder='доступно '+p.qty;q.focus()}
|
||||
function mfPickHB(s){const o=s.options[s.selectedIndex];if(!o.value)return;document.getElementById('recv_inn').value=o.value;document.getElementById('recv_name').value=o.dataset.name||''}
|
||||
// hbFind — подбор участника справочника НРД по ИНН, названию или коду (без учёта регистра и кавычек).
|
||||
function hbNorm(s){return String(s||'').toLowerCase().replace(/ё/g,'е').replace(/[«»"'“”.,()]/g,' ').replace(/\s+/g,' ').trim()}
|
||||
function hbFind(list,q){q=hbNorm(q);if(q.length<2)return[];const words=q.split(' ');
|
||||
return list.map(p=>{const hay=hbNorm([p.inn,p.code,p.name,p.full_name,p.display_name,p.eng_name].join(' '));
|
||||
if(!words.every(w=>hay.includes(w)))return null;
|
||||
const score=(String(p.inn).startsWith(q)||String(p.code).toLowerCase().startsWith(q)?0:hbNorm(p.name).startsWith(q)||hbNorm(p.display_name).startsWith(q)?1:2)+(p.kind==='depo'?0:0.5);
|
||||
return {p,score}}).filter(Boolean).sort((a,b)=>a.score-b.score).slice(0,12).map(x=>x.p)}
|
||||
function hbBind(inp,box,list,onPick){
|
||||
const esc=s=>String(s??'').replace(/[&<>"]/g,c=>({'&':'&','<':'<','>':'>','"':'"'}[c]));
|
||||
let hits=[];
|
||||
const draw=()=>{hits=hbFind(list,inp.value);box.innerHTML=inp.value.trim().length<2?'':(hits.length?hits.map((p,i)=>'<button type="button" class="hb-hit" data-i="'+i+'"><b>'+esc(p.name)+'</b> <span class="hb-m">ИНН '+esc(p.inn)+' · '+esc(p.code)+(p.kind==='broker'?' · брокер':'')+'</span></button>').join(''):'<div class="hb-m" style="padding:6px 2px">В справочнике не найдено — введите ИНН и наименование в поля ниже.</div>')};
|
||||
inp.addEventListener('input',draw);
|
||||
inp.addEventListener('keydown',e=>{if(e.key==='Enter'){e.preventDefault();if(hits[0]){onPick(hits[0]);box.innerHTML=''}}if(e.key==='Escape')box.innerHTML=''});
|
||||
box.addEventListener('click',e=>{const b=e.target.closest('.hb-hit');if(!b)return;onPick(hits[+b.dataset.i]);box.innerHTML=''});
|
||||
}
|
||||
{
|
||||
const inp=document.getElementById('hbq');
|
||||
if(inp)hbBind(inp,document.getElementById('hbres'),{{.Handbook}}||[],p=>{document.getElementById('recv_inn').value=p.inn;document.getElementById('recv_name').value=p.name;inp.value=p.name+' · ИНН '+p.inn})
|
||||
}
|
||||
</script>
|
||||
{{end}}
|
||||
|
||||
Reference in New Issue
Block a user