Своя организация в настройках (справочник НРД или вручную) вместо зашитого ИНН; ручной ввод: поиск клиента и бумаг в DEPO, одна бумага на поручение
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -150,7 +150,7 @@ ORDER BY e.ID;</pre>
|
||||
|
||||
<h2 id="handbook">Справочник участников M2M (M2MTH) → таблица FTV_M2M_HANDBOOK</h2>
|
||||
<p>НРД ведёт справочник участников переводов по MOEX МОСТ: кто депозитарий, кто брокер, их коды участника и ИНН, плюс места расчётов. bj получает его от НРД (сообщение M2MTransferHandbook) при старте и обновляет раз в сутки; по нему bj определяет контрагента по ИНН из перевода и наполняет справочник депозитариев в QUIK МНП. Предлагаем отдавать его в DEPO целиком в отдельную таблицу — тогда <code>CONTRAGENT_M2M_CODE</code> из FTV_M2M раскрывается в ИНН и наименование, и по нему можно заводить контрагентов в DEPO.</p>
|
||||
<p class="muted">Сейчас в справочнике 158 участников и 2 мест расчётов (получено 2026-09-09). Наш код участника — <code>MC0413600000</code>.</p>
|
||||
<p class="muted">Сейчас в справочнике 158 участников и 2 мест расчётов (получено 2026-09-09).</p>
|
||||
<table>
|
||||
<thead><tr><th style="width:190px">Поле таблицы</th><th style="width:130px">Тип</th><th>Откуда у bj / что означает</th></tr></thead>
|
||||
<tbody>
|
||||
@@ -201,7 +201,7 @@ ORDER BY e.ID;</pre>
|
||||
INSERT INTO dbo.FTV_M2M (GUID, DIRECTION, CONTRAGENT_M2M_CODE, DEPONENT_NAME, DEPONENT_DOC)
|
||||
VALUES ('5325B860-3265-49B6-986D-FA84FB41FE27', 'IN', 'MC0034900000', N'Иванов Иван Иванович', '0000 000000');
|
||||
INSERT INTO dbo.FTV_M2M_LINES (GUID, REFERENCE, ISIN, SEC_CODE, SHARE, AMOUNT, PLACE_NUMBER, DEPO_NUMBER)
|
||||
VALUES ('5325B860-3265-49B6-986D-FA84FB41FE27', 'M2M0000002675550', 'RU000A107UL4', 'RU000A107UL4', 18824, 1, '36MC0413600000F00', N'ВТНКЦ00000001');
|
||||
VALUES ('5325B860-3265-49B6-986D-FA84FB41FE27', 'M2M0000002675550', 'RU000A107UL4', 'RU000A107UL4', 18824, 1, '36MC0000000000F00', N'ВТНКЦ00000001');
|
||||
INSERT INTO dbo.FTV_M2M_EVENTS (GUID, REFERENCE, EVENT_TYPE, EVENT_DATE)
|
||||
VALUES ('5325B860-3265-49B6-986D-FA84FB41FE27', NULL, 'BJ_RECEIVED', '2026-09-17T09:21:26.000'); -- время получения M2MTR в bj
|
||||
COMMIT;
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
<ol>
|
||||
<li><b>Примите поручение.</b> Проверьте, что поручение подписано клиентом или представителем, датировано и содержит реквизиты бумаг и принимающего депозитария. Если действует представитель, проверьте доверенность.</li>
|
||||
<li><b>Создайте поручение в системе:</b> «Ручной ввод M2M» → «Новое поручение». Заполните поля по бумажному поручению (описание полей — ниже).</li>
|
||||
<li><b>Найдите клиента в учётной системе</b> кнопкой «Найти в DEPO по документу», если учётная система подключена. Пустые поля (ФИО, дата рождения, счёт, наименования бумаг) заполнятся из учётной системы. Сверьте их с поручением.</li>
|
||||
<li><b>Найдите клиента в учётной системе</b>, если она подключена: в поле поиска введите фамилию (или ФИО), либо серию и номер документа, и нажмите «Найти в DEPO». Показываются клиенты с открытым торговым счётом. Нажмите на нужный счёт: система подставит ФИО, дату рождения, документ, кем и когда он выдан, счёт, договор и телефон, а ниже покажет бумаги клиента на торговом разделе с остатками. Выберите бумагу и укажите количество. Сверьте подставленные данные с поручением клиента.</li>
|
||||
<li><b>Выполните сверку с DEPO</b> кнопкой «Сохранить и сверить с DEPO». Система проверяет:
|
||||
<ul>
|
||||
<li>клиента по документу, ФИО и дате рождения;</li>
|
||||
@@ -48,7 +48,7 @@
|
||||
<tr><td>ФИО, дата рождения</td><td>Как в документе. Дата рождения сверяется с анкетой депонента.</td></tr>
|
||||
<tr><td>Счёт депо клиента</td><td>Торговый счёт депо, с которого списываются бумаги. Он должен принадлежать клиенту и быть открыт.</td></tr>
|
||||
<tr><td>Договор, код в торговой системе</td><td>Для сведения и поиска клиента в торговой системе.</td></tr>
|
||||
<tr><td>Ценные бумаги</td><td>ISIN (только российские выпуски, начинаются с RU) и количество. Дробное количество допускается для паёв. Код НРД можно не указывать.</td></tr>
|
||||
<tr><td>Ценная бумага</td><td><b>Одно поручение — одна бумага</b>: если клиент переводит несколько бумаг, на каждую оформляется отдельное поручение. ISIN (только российские выпуски, начинаются с RU) и количество; дробное количество допускается для паёв. Код НРД можно не указывать.</td></tr>
|
||||
<tr><td>Принимающий депозитарий</td><td>Выбирается из справочника участников M2M, который bj получает от НРД. Если депозитария нет в справочнике, перевод через MOEX МОСТ невозможен.</td></tr>
|
||||
<tr><td>Счёт у принимающего</td><td>Для сведения: принимающий депозитарий сам находит клиента по документу.</td></tr>
|
||||
<tr><td>Место расчётов</td><td>НРД или СПБ Банк — как в поручении клиента.</td></tr>
|
||||
|
||||
@@ -56,7 +56,7 @@
|
||||
|
||||
<h2 id="s2">Шаг 2. Добавить классы в плагин МНП</h2>
|
||||
<p><em>Где:</em> QUIK Administrator → Модули → МНП → справочник <strong>«Классы инструментов»</strong>. <em>Документ:</em> МОСТ п. 4.1, шаг 2, стр. 11.</p>
|
||||
<p>Добавьте оба класса, созданных на шаге 1, и на каждом выберите фирму, по которой будет меняться позиция клиента: <code>MC0413600000</code> (Фондовый рынок).</p>
|
||||
<p>Добавьте оба класса, созданных на шаге 1, и на каждом выберите фирму, по которой будет меняться позиция клиента, — код участника вашей организации (Фондовый рынок).</p>
|
||||
|
||||
<h2 id="s3">Шаг 3. Создать инструменты МНП</h2>
|
||||
<p><em>Где:</em> QUIK Administrator → Модули → МНП → справочник <strong>«Инструменты»</strong>. <em>Документ:</em> МОСТ п. 4.2, стр. 14.</p>
|
||||
@@ -68,7 +68,7 @@
|
||||
</tbody>
|
||||
</table>
|
||||
<p>Коды берите <strong>ровно такие</strong>, как в документе: bj передаёт их в вызовах процедур. Если инструменты уже созданы под другими кодами (например, по имени класса), сообщите нам коды — мы подставим их в настройках.</p>
|
||||
<p>Затем на <strong>сервере QUIK</strong> в настройках Библиотеки расчёта лимитов по фирме <code>MC0413600000</code> добавьте эти инструменты и привяжите к валюте (рубли) и тегу расчётов, с которого списывается комиссия депозитария: раздел «Инструменты» / «Параметры учёта неторговых поручений» (МОСТ п. 4.2, стр. 14, второй абзац).</p>
|
||||
<p>Затем на <strong>сервере QUIK</strong> в настройках Библиотеки расчёта лимитов по фирме вашей организации добавьте эти инструменты и привяжите к валюте (рубли) и тегу расчётов, с которого списывается комиссия депозитария: раздел «Инструменты» / «Параметры учёта неторговых поручений» (МОСТ п. 4.2, стр. 14, второй абзац).</p>
|
||||
|
||||
<h2 id="s4">Шаг 4. Включить типы поручений M2M</h2>
|
||||
<p><em>Где:</em> QUIK Administrator → Модули → МНП → справочник <strong>«Типы поручений»</strong>. <em>Документ:</em> МОСТ п. 4.3, стр. 16–22.</p>
|
||||
@@ -122,7 +122,7 @@
|
||||
<tr><td>Клиент сам подал «Вывод ЦБ (M2M)» из QUIK</td><td>bj видит его в экспорте, оповещает оператора; после создания заявки поручение привязывается в карточке, дальше — как обычный исходящий</td><td>своё поручение «Активно», затем исполнено или снято с причиной</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p class="muted">Код клиента QUIK bj берёт из номера портфеля клиента в DEPO: «БР-859» → «BR859». Исключения задаются в той же форме настроек. Каждый шаг с ответом модуля виден в карточке перевода и на странице <a href="/admin/quik">QUIK МНП</a>; при ошибке приходит оповещение и есть кнопки для ручного повтора.</p>
|
||||
<p class="muted">Код клиента QUIK bj берёт из номера портфеля клиента в DEPO: «БР-001» → «BR001». Исключения задаются в той же форме настроек. Каждый шаг с ответом модуля виден в карточке перевода и на странице <a href="/admin/quik">QUIK МНП</a>; при ошибке приходит оповещение и есть кнопки для ручного повтора.</p>
|
||||
|
||||
<h2 id="verify">Как проверить, что всё готово</h2>
|
||||
<ol>
|
||||
|
||||
@@ -31,6 +31,12 @@
|
||||
.mf-kv{display:grid;grid-template-columns:minmax(150px,220px) 1fr;gap:4px 14px;font-size:13.5px}
|
||||
.mf-kv .k{color:var(--muted)}
|
||||
.dc-ok{color:var(--ok);font-weight:700}.dc-bad{color:var(--err);font-weight:700}.dc-warn{color:var(--warn);font-weight:700}
|
||||
.mf-find{background:var(--card-2);border:1px solid var(--border);border-radius:10px;padding:10px;margin-bottom:10px}
|
||||
.mf-find input{padding:7px 9px;border-radius:8px;border:1px solid var(--border);background:var(--card);color:var(--text);font-size:13.5px}
|
||||
.mf-res:empty{display:none}.mf-res{margin:8px 0}
|
||||
.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}
|
||||
.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{
|
||||
@@ -291,12 +297,20 @@ function mfRerun(){const f=document.getElementById('mf');if(f&&f.closest('detail
|
||||
</div>
|
||||
|
||||
<div class="mf-h">2. Клиент (как в поручении и анкете депонента)</div>
|
||||
{{if .DepoOn}}
|
||||
<div class="mf-find">
|
||||
<div style="display:flex;gap:8px;flex-wrap:wrap">
|
||||
<input id="dq" placeholder="Фамилия (или ФИО), либо серия и номер документа" style="flex:1;min-width:260px" onkeydown="if(event.key==='Enter'){event.preventDefault();mfFind()}">
|
||||
<button type="button" class="btn" onclick="mfFind()">Найти в DEPO</button>
|
||||
</div>
|
||||
<div id="dres" class="mf-res"></div>
|
||||
</div>
|
||||
{{end}}
|
||||
<div class="mf-grid">
|
||||
<div><label class="mf-req">Вид документа</label>
|
||||
<select name="doc_type">{{$dt := .O.DocType}}{{range .DocTypes}}<option value="{{.Code}}" {{if eq $dt .Code}}selected{{end}}>{{.Code}} — {{.Title}}</option>{{end}}</select></div>
|
||||
<div><label>Серия</label><input name="doc_series" value="{{.O.DocSeries}}" placeholder="4 цифры для паспорта РФ"></div>
|
||||
<div><label class="mf-req">Номер</label><input name="doc_number" value="{{.O.DocNumber}}"></div>
|
||||
<div style="display:flex;align-items:flex-end">{{if .DepoOn}}<button type="submit" name="do" value="lookup" class="btn btn-secondary" style="width:100%" title="Найти клиента в учётной системе по документу и заполнить пустые поля">Найти в DEPO по документу</button>{{end}}</div>
|
||||
<div><label>Дата выдачи</label><input type="date" name="doc_issue_date" value="{{.O.DocIssueDate}}"></div>
|
||||
<div class="wide"><label>Кем выдан</label><input name="doc_issuer" value="{{.O.DocIssuer}}"></div>
|
||||
<div><label class="mf-req">Фамилия</label><input name="last_name" value="{{.O.LastName}}"></div>
|
||||
@@ -304,20 +318,17 @@ function mfRerun(){const f=document.getElementById('mf');if(f&&f.closest('detail
|
||||
<div><label>Отчество</label><input name="middle_name" value="{{.O.MiddleName}}"></div>
|
||||
<div><label class="mf-req">Дата рождения</label><input type="date" name="birth_date" value="{{.O.BirthDate}}"></div>
|
||||
<div><label>Договор (брокерский / депозитарный)</label><input name="contract" value="{{.O.Contract}}"></div>
|
||||
<div><label class="mf-req">Счёт депо клиента</label><input name="account" value="{{.O.Account}}" placeholder="торговый счёт депо"></div>
|
||||
<div><label class="mf-req">Счёт депо клиента</label><input name="account" id="f_account" value="{{.O.Account}}" placeholder="торговый счёт депо"></div>
|
||||
<div><label>Код клиента в торговой системе</label><input name="quik_code" value="{{.O.QuikCode}}"></div>
|
||||
<div><label>Телефон для связи</label><input name="phone" value="{{.O.Phone}}"></div>
|
||||
</div>
|
||||
|
||||
<div class="mf-h">3. Ценные бумаги</div>
|
||||
<div class="mf-h">3. Ценная бумага</div>
|
||||
<div id="dpos" class="mf-res"></div>
|
||||
<div class="mf-sec mf-note" style="margin-bottom:2px"><span class="mf-req">ISIN</span><span>Код НРД</span><span class="nm">Наименование</span><span class="mf-req">Количество</span><span></span></div>
|
||||
<div id="secs">
|
||||
{{range .O.Securities}}
|
||||
<div class="mf-sec"><input name="sec_isin" value="{{.ISIN}}" placeholder="RU…" maxlength="12"><input name="sec_code" value="{{.Code}}" placeholder="необязательно"><input class="nm" name="sec_name" value="{{.Name}}" placeholder="заполнится из DEPO"><input name="sec_qty" value="{{.Qty}}" inputmode="decimal"><button type="button" class="x" onclick="mfDel(this)" title="Убрать">×</button></div>
|
||||
{{end}}
|
||||
</div>
|
||||
<button type="button" class="btn btn-secondary" onclick="mfAdd()" style="margin-top:4px">+ Бумага</button>
|
||||
<p class="mf-note">Через MOEX МОСТ переводятся только российские выпуски (ISIN начинается с RU). Дробное количество — для паёв, через точку или запятую.</p>
|
||||
{{$sec := index .O.Securities 0}}
|
||||
<div class="mf-sec"><input name="sec_isin" id="f_isin" value="{{$sec.ISIN}}" placeholder="RU…" maxlength="12"><input name="sec_code" value="{{$sec.Code}}" placeholder="необязательно"><input class="nm" name="sec_name" id="f_sname" value="{{$sec.Name}}" placeholder="заполнится из DEPO"><input name="sec_qty" id="f_qty" value="{{$sec.Qty}}" inputmode="decimal"><span></span></div>
|
||||
<p class="mf-note">Одно поручение — одна бумага: на каждую бумагу оформляется отдельное поручение. Через MOEX МОСТ переводятся только российские выпуски (ISIN начинается с RU). Дробное количество — для паёв, через точку или запятую.</p>
|
||||
|
||||
<div class="mf-h">4. Принимающая сторона</div>
|
||||
<div class="mf-grid">
|
||||
@@ -345,10 +356,37 @@ function mfRerun(){const f=document.getElementById('mf');if(f&&f.closest('detail
|
||||
<a href="/admin/manual" class="btn btn-secondary">К списку</a>
|
||||
</div>
|
||||
</form>
|
||||
<template id="secRow"><div class="mf-sec"><input name="sec_isin" placeholder="RU…" maxlength="12"><input name="sec_code" placeholder="необязательно"><input class="nm" name="sec_name" placeholder="заполнится из DEPO"><input name="sec_qty" inputmode="decimal"><button type="button" class="x" onclick="mfDel(this)" title="Убрать">×</button></div></template>
|
||||
<script>
|
||||
function mfAdd(){document.getElementById('secs').appendChild(document.getElementById('secRow').content.cloneNode(true))}
|
||||
function mfDel(b){const rows=document.querySelectorAll('#secs .mf-sec');if(rows.length>1){b.parentNode.remove()}else{b.parentNode.querySelectorAll('input').forEach(i=>i.value='')}}
|
||||
const mfEsc=s=>String(s??'').replace(/[&<>"]/g,c=>({'&':'&','<':'<','>':'>','"':'"'}[c]));
|
||||
let mfFaces=[];
|
||||
function mfSet(n,v){const e=document.querySelector('#mf [name="'+n+'"]');if(e&&v!==undefined&&v!==null)e.value=v}
|
||||
async function mfFind(){
|
||||
const q=document.getElementById('dq').value.trim(),box=document.getElementById('dres');
|
||||
box.innerHTML='<span class="mf-note">Поиск…</span>';
|
||||
try{const r=await (await fetch('/admin/manual/depo/search?q='+encodeURIComponent(q))).json();
|
||||
if(r.error){box.innerHTML='<span class="dc-bad">'+mfEsc(r.error)+'</span>';return}
|
||||
mfFaces=r.items||[];
|
||||
box.innerHTML=mfFaces.map((f,i)=>'<div class="mf-hit"><div><b>'+mfEsc(f.name)+'</b><div class="mf-note">'+(f.birth?'д.р. '+mfEsc(f.birth)+' · ':'')+'документ '+mfEsc(f.doc_ser)+' '+mfEsc(f.doc_num)+'</div></div><div style="display:flex;gap:6px;flex-wrap:wrap">'+
|
||||
(f.accounts||[]).map((a,j)=>'<button type="button" class="btn btn-secondary" onclick="mfPick('+i+','+j+')"'+(a.iis?' title="ИИС — перевод через M2M не выполняется"':'')+'>'+mfEsc(a.number)+(a.contract?' · '+mfEsc(a.contract):'')+(a.iis?' · ИИС':'')+'</button>').join('')+'</div></div>').join('');
|
||||
}catch(e){box.innerHTML='<span class="dc-bad">Поиск не выполнен: '+mfEsc(e)+'</span>'}
|
||||
}
|
||||
async function mfPick(i,j){
|
||||
const f=mfFaces[i],a=f.accounts[j];
|
||||
mfSet('last_name',f.last_name);mfSet('first_name',f.first_name);mfSet('middle_name',f.middle_name||'');mfSet('birth_date',f.birth||'');
|
||||
if(f.doc_type)mfSet('doc_type',f.doc_type);
|
||||
mfSet('doc_series',f.doc_ser||'');mfSet('doc_number',f.doc_num);mfSet('doc_issue_date',f.doc_date||'');mfSet('doc_issuer',f.doc_issuer||'');
|
||||
mfSet('account',a.number);mfSet('contract',a.contract||'');if(f.phone)mfSet('phone',f.phone);
|
||||
document.getElementById('dres').innerHTML='<span class="dc-ok">Подставлено из DEPO: '+mfEsc(f.name)+', счёт '+mfEsc(a.number)+'. Сверьте с поручением клиента.</span>';
|
||||
const box=document.getElementById('dpos');box.innerHTML='<span class="mf-note">Загрузка бумаг клиента…</span>';
|
||||
try{const r=await (await fetch('/admin/manual/depo/positions?client='+a.client_id)).json();
|
||||
if(r.error){box.innerHTML='<span class="dc-bad">'+mfEsc(r.error)+'</span>';return}
|
||||
const items=r.items||[];mfPos=items;
|
||||
if(!items.length){box.innerHTML='<span class="mf-note">На торговом разделе счёта '+mfEsc(a.number)+' бумаг нет.</span>';return}
|
||||
box.innerHTML='<div class="mf-note" style="margin-bottom:4px">Бумаги на торговом разделе '+mfEsc(a.number)+' — выберите одну:</div>'+items.map((p,k)=>'<button type="button" class="mf-pos"'+(p.russian?'':' disabled title="иностранный выпуск — через M2M не переводится"')+' onclick="mfSec('+k+')"><b>'+mfEsc(p.isin)+'</b> '+mfEsc(p.name)+' <span class="mf-note">· '+p.qty+' шт.</span></button>').join('');
|
||||
}catch(e){box.innerHTML='<span class="dc-bad">'+mfEsc(e)+'</span>'}
|
||||
}
|
||||
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||''}
|
||||
</script>
|
||||
{{end}}
|
||||
|
||||
@@ -199,13 +199,13 @@
|
||||
<a href="/admin/help/quik"><strong>Инструкция для администратора QUIK</strong></a> — что настроить в QuikAdmin для M2M · <a href="/admin/docs/">документы ARQA</a>.</p>
|
||||
<form method="post" action="/admin/setup/quik" style="margin-top:12px;display:grid;gap:10px;max-width:560px">
|
||||
<label>Сервер (host или host\instance)
|
||||
<input type="text" name="server" value="{{.Settings.Quik.Server}}" placeholder="91.209.122.88" style="width:100%" required></label>
|
||||
<input type="text" name="server" value="{{.Settings.Quik.Server}}" placeholder="адрес SQL Server QUIK" style="width:100%" required></label>
|
||||
<label>Порт
|
||||
<input type="number" name="port" value="{{if .Settings.Quik.Port}}{{.Settings.Quik.Port}}{{else}}1433{{end}}" placeholder="8849" style="width:100%"></label>
|
||||
<label>Имя БД (если требуется, иначе оставьте пустым)
|
||||
<input type="text" name="database" value="{{.Settings.Quik.Database}}" placeholder="(по умолчанию)" style="width:100%"></label>
|
||||
<label>Логин (роль InstrEu)
|
||||
<input type="text" name="user" value="{{.Settings.Quik.User}}" placeholder="BROKER_88" style="width:100%" required></label>
|
||||
<input type="text" name="user" value="{{.Settings.Quik.User}}" placeholder="логин SQL" style="width:100%" required></label>
|
||||
<label>Пароль
|
||||
<input type="password" name="password" placeholder="{{if .Settings.Quik.Password}}•••••• — оставьте пустым, чтобы не менять{{else}}пароль SQL-логина{{end}}" autocomplete="off" style="width:100%"></label>
|
||||
<label>Шифрование канала
|
||||
@@ -254,7 +254,7 @@
|
||||
<label>МНП-инструмент ввода <span class="muted">(пусто = из класса INSTRINM2M)</span>
|
||||
<input type="text" name="sec_in" value="{{.Settings.Quik.SecIn}}" placeholder="RURINM2M" style="width:100%"></label>
|
||||
</div>
|
||||
<label>Исключения кодов клиентов <span class="muted">(по умолчанию «БР-859» → «BR859»; строка «номер портфеля=код QUIK»)</span>
|
||||
<label>Исключения кодов клиентов <span class="muted">(по умолчанию «БР-001» → «BR001»; строка «номер портфеля=код QUIK»)</span>
|
||||
<textarea name="client_code_map" rows="3" style="width:100%;font-family:ui-monospace,monospace;font-size:12px" placeholder="БР-4-4=BR44">{{quikCodeMap .Settings.Quik.ClientCodeMap}}</textarea></label>
|
||||
<div style="display:flex;gap:8px;flex-wrap:wrap"><button type="submit" class="btn btn-ok">Сохранить</button></div>
|
||||
</form>
|
||||
@@ -472,6 +472,28 @@
|
||||
<section class="settings-section" id="sec-nsd">
|
||||
<h1>НРД</h1>
|
||||
{{template "verline" (.Versions.Get "ish")}}
|
||||
<div class="card" id="sec-org">
|
||||
<h2><span class="dot {{if and .OrgINN .OrgCode}}ok{{else}}err{{end}}"></span>Наша организация</h2>
|
||||
<p class="muted">Депозитарий — участник MOEX МОСТ, от имени которого bj отправляет и принимает переводы: ИНН передающего и зачисляющего депозитария в пакетах, код отправителя и код фирмы в QUIK. Выберите себя из справочника участников НРД или введите данные вручную.</p>
|
||||
{{if and .OrgINN .OrgCode}}<p style="margin:8px 0 0"><b>{{if .OrgName}}{{.OrgName}}{{else}}—{{end}}</b> · ИНН <code>{{.OrgINN}}</code> · код <code>{{.OrgCode}}</code>{{if not .Settings.NSD.OrgINN}} <span class="muted">(ИНН взят из справочника по коду)</span>{{end}}</p>
|
||||
{{else}}<p style="margin:8px 0 0;color:var(--err)">Организация не задана — переводы не будут сформированы.</p>{{end}}
|
||||
<form method="post" action="/admin/setup/org" style="margin-top:12px;display:grid;gap:10px;max-width:680px">
|
||||
<input type="hidden" name="section" value="sec-org">
|
||||
<label>Из справочника участников M2M</label>
|
||||
<select name="hb" onchange="var o=this.options[this.selectedIndex];if(o.value){this.form.org_code.value=o.value;this.form.org_inn.value=o.dataset.inn;this.form.org_name.value=o.dataset.name}">
|
||||
<option value="">— выбрать себя —</option>
|
||||
{{$code := .OrgCode}}{{range .Participants}}<option value="{{.Code}}" data-inn="{{.INN}}" data-name="{{if .FullName}}{{.FullName}}{{else}}{{.Name}}{{end}}" {{if eq .Code $code}}selected{{end}}>{{.Name}} · ИНН {{.INN}} · {{.Code}}</option>{{end}}
|
||||
</select>
|
||||
{{if not .Participants}}<span class="muted" style="font-size:12px">Справочник участников ещё не получен — запросите его в «Диагностике» или введите данные вручную.</span>{{end}}
|
||||
<label>Код участника</label>
|
||||
<input type="text" name="org_code" value="{{.Settings.NSD.OrgCode}}" placeholder="MC0000000000" maxlength="12">
|
||||
<label>ИНН</label>
|
||||
<input type="text" name="org_inn" value="{{.Settings.NSD.OrgINN}}" maxlength="10" inputmode="numeric">
|
||||
<label>Наименование</label>
|
||||
<input type="text" name="org_name" value="{{.Settings.NSD.OrgName}}">
|
||||
<div><button type="submit" class="btn btn-ok">Сохранить</button></div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="card" id="m2m-auto">
|
||||
<h2><span class="dot {{if .Settings.M2MAuto.Enabled}}ok{{else}}warn{{end}}"></span>Автоматический режим M2M</h2>
|
||||
<p class="muted">Без участия оператора, чтобы соблюдать сроки: <strong>ответ на входящие переводы</strong> по свежей сверке с DEPO (пакет принимается только целиком; бумага для квалифицированных инвесторов при неполной или непрочитанной квалификации клиента — отказ M2M08), <strong>подача поручения 16/1</strong>, как только НРД пришлёт черновик после нашего согласия, и <strong>подача поручения 16</strong> по исходящим после согласия контрагента. Если DEPO или ИШ недоступны — bj повторяет каждые 3 минуты и шлёт оповещение; без сверки ничего не принимается. Обрабатывается только то, что пришло не раньше чем за сутки до включения. Кнопки в карточках остаются для ручной работы.</p>
|
||||
@@ -504,7 +526,7 @@
|
||||
<hr style="border:none;border-top:1px solid var(--border);margin:6px 0">
|
||||
<p class="muted" style="margin:0">Депозитарные реквизиты (откуда списываются бумаги) — из договора/письма НРД. Нужны для формирования заявки на перевод.</p>
|
||||
<label>Депозитарный код</label>
|
||||
<input type="text" name="deponent_code" value="{{.Settings.NSD.DeponentCode}}" placeholder="напр. MC0413600000">
|
||||
<input type="text" name="deponent_code" value="{{.Settings.NSD.DeponentCode}}" placeholder="MC0000000000">
|
||||
<label>Депозитарный счёт</label>
|
||||
<input type="text" name="account_id" value="{{.Settings.NSD.AccountID}}" placeholder="депозитарный счёт">
|
||||
<label>Раздел счёта</label>
|
||||
@@ -549,14 +571,14 @@
|
||||
<div>
|
||||
<label>Адрес ЛК</label>
|
||||
<div style="display:flex;gap:8px;align-items:center;margin-top:4px">
|
||||
<input type="text" name="lk_public_url" value="{{.Settings.LK.PublicURL}}" placeholder="https://fontvielle.ef.winr.pro" style="flex:1">
|
||||
<input type="text" name="lk_public_url" value="{{.Settings.LK.PublicURL}}" placeholder="https://lk.example.ru" style="flex:1">
|
||||
{{if .Settings.LK.PublicURL}}<a class="btn btn-secondary" href="{{.Settings.LK.PublicURL}}" target="_blank" rel="noopener">Открыть →</a>{{end}}
|
||||
</div>
|
||||
<span class="muted" style="font-size:12px">{{if .DevMode}}Показывается ссылкой на дашборде для первичного теста.{{else}}Адрес, по которому клиенты входят в личный кабинет.{{end}}</span>
|
||||
</div>
|
||||
<div>
|
||||
<label>Callback URL <span class="muted" style="font-weight:400">(куда bj шлёт статус заявки)</span></label>
|
||||
<input type="text" name="callback_url" value="{{.Settings.LK.CallbackURL}}" placeholder="https://fontvielle.ef.winr.pro" style="margin-top:4px">
|
||||
<input type="text" name="callback_url" value="{{.Settings.LK.CallbackURL}}" placeholder="https://lk.example.ru" style="margin-top:4px">
|
||||
<span class="muted" style="font-size:12px">{{if not .Settings.LK.CallbackURL}}Не настроен — уведомления в ЛК отключены. Для обмена с НРД не требуется.{{end}}</span>
|
||||
</div>
|
||||
<div><button type="submit" class="btn">Сохранить и проверить</button></div>
|
||||
@@ -577,7 +599,7 @@
|
||||
</div>
|
||||
<form method="post" action="/admin/setup/lk-integration" style="display:grid;gap:9px">
|
||||
<input type="hidden" name="env" value="test">
|
||||
<div><label>Адрес API</label><input type="text" name="base_url" value="{{.Settings.LK.Test.BaseURL}}" placeholder="https://fontvielle.ef.winr.pro/manager/api" style="margin-top:3px"></div>
|
||||
<div><label>Адрес API</label><input type="text" name="base_url" value="{{.Settings.LK.Test.BaseURL}}" placeholder="https://lk.example.ru/manager/api" style="margin-top:3px"></div>
|
||||
<div><label>Логин</label><input type="text" name="login" value="{{.Settings.LK.Test.Login}}" autocomplete="off" style="margin-top:3px"></div>
|
||||
<div><label>Пароль</label><input type="password" name="password" value="" placeholder="{{if .Settings.LK.Test.Password}}•••••• (не менять — оставьте пустым){{end}}" autocomplete="new-password" style="margin-top:3px"></div>
|
||||
<div style="display:flex;gap:8px;flex-wrap:wrap;margin-top:2px">
|
||||
|
||||
Reference in New Issue
Block a user