QUIK: имя базы МНП обязательно, доверие сертификату по умолчанию, памятка вместо пустых ссылок
- «База МНП» — в основной строке рядом с сервером и портом, обязательна (без неё модуль не подключается); «Дополнительно» — только шифрование. - «Доверять сертификату сервера» включено по умолчанию у ненастроенного QUIK (у QUIK сертификат свой, не на IP). - Строка версий над разделом обновляется сразу после проверки подключения (раньше — через 10 минут показывала старую ошибку). - «что ему настроить · документы ARQA» вели в никуда (техническая справка не входит в рабочую сборку, документов ARQA на сервере клиента нет): вместо них «Памятка администратору QUIK» — и в мастере, и в «Настройке». - Ссылки на техническую справку (Валидата, события bj2depo) — только в сборке со справкой; «Инструкция по размещению» ЛК вела на несуществующую страницу. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
This commit is contained in:
@@ -195,6 +195,10 @@ func (h *setupHandlers) saveQuik(w http.ResponseWriter, r *http.Request) {
|
|||||||
setupFlash(w, r, "QUIK МНП: укажите адрес сервера и логин")
|
setupFlash(w, r, "QUIK МНП: укажите адрес сервера и логин")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
if s.Database == "" { // без имени базы модуль не подключается (база логина по умолчанию — не она)
|
||||||
|
setupFlash(w, r, "QUIK МНП: укажите имя базы модуля неторговых поручений — его сообщает администратор QUIK")
|
||||||
|
return
|
||||||
|
}
|
||||||
if err := h.rc.UpdateQuik(s); err != nil {
|
if err := h.rc.UpdateQuik(s); err != nil {
|
||||||
setupFlash(w, r, "QUIK МНП: ошибка сохранения: "+err.Error())
|
setupFlash(w, r, "QUIK МНП: ошибка сохранения: "+err.Error())
|
||||||
return
|
return
|
||||||
@@ -245,6 +249,7 @@ func (h *setupHandlers) testQuik(w http.ResponseWriter, r *http.Request) {
|
|||||||
fmt.Fprintf(&b, "----------------------------------------\n")
|
fmt.Fprintf(&b, "----------------------------------------\n")
|
||||||
|
|
||||||
res, err := quikProbe(r.Context(), s)
|
res, err := quikProbe(r.Context(), s)
|
||||||
|
go refreshVersions(h.rc) // строка версий над разделом — по новому подключению, а не через 10 минут
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Fprintf(&b, "РЕЗУЛЬТАТ: ОШИБКА ПОДКЛЮЧЕНИЯ\n\n")
|
fmt.Fprintf(&b, "РЕЗУЛЬТАТ: ОШИБКА ПОДКЛЮЧЕНИЯ\n\n")
|
||||||
b.WriteString(quikErrorDetail(err))
|
b.WriteString(quikErrorDetail(err))
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
<span class="badge awaiting_decision">bj2depo</span> процедура FTV_M2M_JOB ({{.JobMode}}) читает события, создаёт документ 16/16-1 в DEPO, отвечает <code>DEPO_ORDER_CREATED</code> (номер документа) или <code>DEPO_ERROR</code> →
|
<span class="badge awaiting_decision">bj2depo</span> процедура FTV_M2M_JOB ({{.JobMode}}) читает события, создаёт документ 16/16-1 в DEPO, отвечает <code>DEPO_ORDER_CREATED</code> (номер документа) или <code>DEPO_ERROR</code> →
|
||||||
<span class="badge sent">документ</span> bj следит за состоянием документа (OD_DOCS: начальный ввод → конец обработки / отмена) и при отмене оповещает →
|
<span class="badge sent">документ</span> bj следит за состоянием документа (OD_DOCS: начальный ввод → конец обработки / отмена) и при отмене оповещает →
|
||||||
<span class="badge confirmed">события НРД</span> по ответам MS010 и M2M bj дописывает <code>BJ_ORDER_ACCEPTED / BJ_EXECUTED / BJ_REJECTED / BJ_CANCELLED</code>.
|
<span class="badge confirmed">события НРД</span> по ответам MS010 и M2M bj дописывает <code>BJ_ORDER_ACCEPTED / BJ_EXECUTED / BJ_REJECTED / BJ_CANCELLED</code>.
|
||||||
Опрос таблиц — раз в минуту. Подробности и словарь событий — <a href="/admin/help/fancy-events">страница для программиста Fancy</a>.
|
Опрос таблиц — раз в минуту.{{if internalDocs}} Подробности и словарь событий — <a href="/admin/help/fancy-events">страница для программиста Fancy</a>.{{end}}
|
||||||
</p>
|
</p>
|
||||||
<div style="display:flex;gap:18px;flex-wrap:wrap;font-size:13px;margin-top:6px">
|
<div style="display:flex;gap:18px;flex-wrap:wrap;font-size:13px;margin-top:6px">
|
||||||
<span>Переводов: <b>{{.Sum.Total}}</b></span>
|
<span>Переводов: <b>{{.Sum.Total}}</b></span>
|
||||||
@@ -72,5 +72,5 @@
|
|||||||
{{end}}
|
{{end}}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p style="margin-top:14px"><a href="/admin/help/fancy-events" class="muted">bj ↔ bj2depo: события, таблицы, действия job →</a></p>
|
{{if internalDocs}}<p style="margin-top:14px"><a href="/admin/help/fancy-events" class="muted">bj ↔ bj2depo: события, таблицы, действия job →</a></p>{{end}}
|
||||||
{{end}}
|
{{end}}
|
||||||
|
|||||||
@@ -239,7 +239,7 @@
|
|||||||
|
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<h2><span class="dot {{if .Settings.Crypto.Profile}}ok{{else}}warn{{end}}"></span>СКЗИ «Валидата Клиент L»</h2>
|
<h2><span class="dot {{if .Settings.Crypto.Profile}}ok{{else}}warn{{end}}"></span>СКЗИ «Валидата Клиент L»</h2>
|
||||||
<p class="muted">Активный профиль: <code>{{if .Settings.Crypto.Profile}}{{.Settings.Crypto.Profile}}{{else}}—{{end}}</code> · провайдер {{if and (not devOn) (or (eq .Settings.Crypto.Provider "stub") (eq .Settings.Crypto.Provider ""))}}<code>не настроен</code>{{else}}<code>{{.Settings.Crypto.Provider}}</code>{{end}}. Подробно — <a href="/admin/help/crypto">справка</a>.</p>
|
<p class="muted">Активный профиль: <code>{{if .Settings.Crypto.Profile}}{{.Settings.Crypto.Profile}}{{else}}—{{end}}</code> · провайдер {{if and (not devOn) (or (eq .Settings.Crypto.Provider "stub") (eq .Settings.Crypto.Provider ""))}}<code>не настроен</code>{{else}}<code>{{.Settings.Crypto.Provider}}</code>{{end}}. {{if internalDocs}}Подробно — <a href="/admin/help/crypto">справка</a>{{end}}.</p>
|
||||||
<div style="display:flex;gap:8px;flex-wrap:wrap;margin-top:12px">
|
<div style="display:flex;gap:8px;flex-wrap:wrap;margin-top:12px">
|
||||||
<form method="post" action="/admin/setup/crypto/check" style="margin:0"><button type="submit" class="btn btn-ok">✓ Проверить СКЗИ</button></form>
|
<form method="post" action="/admin/setup/crypto/check" style="margin:0"><button type="submit" class="btn btn-ok">✓ Проверить СКЗИ</button></form>
|
||||||
<form method="post" action="/admin/setup/crypto/test-sign" style="margin:0"><button type="submit" class="btn">✎ Подписать проверочный документ</button></form>
|
<form method="post" action="/admin/setup/crypto/test-sign" style="margin:0"><button type="submit" class="btn">✎ Подписать проверочный документ</button></form>
|
||||||
@@ -434,7 +434,7 @@
|
|||||||
<button type="submit" class="btn btn-ok">Сохранить</button>
|
<button type="submit" class="btn btn-ok">Сохранить</button>
|
||||||
{{if .Settings.LK.APIKey}}<a class="btn" href="/admin/setup/lk/dist.tar.gz">Скачать для своего сервера (Linux)</a>
|
{{if .Settings.LK.APIKey}}<a class="btn" href="/admin/setup/lk/dist.tar.gz">Скачать для своего сервера (Linux)</a>
|
||||||
<a class="btn" href="/admin/setup/lk/relay-php.zip">Скачать для PHP-хостинга</a>{{end}}
|
<a class="btn" href="/admin/setup/lk/relay-php.zip">Скачать для PHP-хостинга</a>{{end}}
|
||||||
<a class="btn btn-secondary" href="/admin/help/lk">Инструкция по размещению</a>
|
<a class="btn btn-secondary" href="/admin/help/lk-api">Инструкция по размещению</a>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
|
|||||||
@@ -86,10 +86,6 @@
|
|||||||
.dq-jobname { margin-top:14px; max-width:520px; }
|
.dq-jobname { margin-top:14px; max-width:520px; }
|
||||||
.dq-jobname label { display:block; margin:0; font-size:13.5px; font-weight:500; color:var(--text-2); }
|
.dq-jobname label { display:block; margin:0; font-size:13.5px; font-weight:500; color:var(--text-2); }
|
||||||
.dq-jobname input { display:block; width:100%; box-sizing:border-box; margin-top:5px; }
|
.dq-jobname input { display:block; width:100%; box-sizing:border-box; margin-top:5px; }
|
||||||
.wiz-memo { margin:10px 0 0; font-size:13.5px; }
|
|
||||||
.wiz-memo summary { cursor:pointer; color:var(--accent); }
|
|
||||||
.wiz-memo ul { margin:6px 0 8px; padding-left:20px; }
|
|
||||||
.wiz-memo li { margin:3px 0; }
|
|
||||||
.dq-box { border:1px solid var(--border); border-radius:12px; padding:14px 16px 16px; }
|
.dq-box { border:1px solid var(--border); border-radius:12px; padding:14px 16px 16px; }
|
||||||
.dq-box-bj { background:color-mix(in srgb, var(--accent-weak) 45%, transparent); }
|
.dq-box-bj { background:color-mix(in srgb, var(--accent-weak) 45%, transparent); }
|
||||||
.dq-box-h { font-weight:600; font-size:14.5px; margin:0 0 10px; }
|
.dq-box-h { font-weight:600; font-size:14.5px; margin:0 0 10px; }
|
||||||
@@ -466,16 +462,7 @@
|
|||||||
<div class="card">
|
<div class="card">
|
||||||
<h2><span class="dot {{if .Done.Quik}}ok{{else}}err{{end}}"></span>QUIK</h2>
|
<h2><span class="dot {{if .Done.Quik}}ok{{else}}err{{end}}"></span>QUIK</h2>
|
||||||
<p>Адрес и логин модуля неторговых поручений — у вашего администратора QUIK. Если модуля ещё нет, его подключает ARQA Technologies — письмо для них готово ниже.</p>
|
<p>Адрес и логин модуля неторговых поручений — у вашего администратора QUIK. Если модуля ещё нет, его подключает ARQA Technologies — письмо для них готово ниже.</p>
|
||||||
{{if .DepoLicensed}}{{template "letterCard" (letter "arqa")}}
|
{{if .DepoLicensed}}{{template "letterCard" (letter "arqa")}}{{end}}
|
||||||
<details class="wiz-memo"><summary>Памятка администратору QUIK</summary>
|
|
||||||
<p>Всё это описано в документации ARQA на модуль неторговых поручений — администратору QUIK она знакома:</p>
|
|
||||||
<ul>
|
|
||||||
<li>в QAdmin — классы <code>INSTROUTM2M</code> (вывод ценных бумаг) и <code>INSTRINM2M</code> (ввод), типы неторговых поручений M2M;</li>
|
|
||||||
<li>SQL-логин для bj с ролью <code>InstrEu</code> — его логин и пароль вписываются ниже;</li>
|
|
||||||
<li>справочник депозитариев-получателей <code>M2MDepoRecipients</code> заполняет bj; после первого заполнения модуль нужно перезапустить.</li>
|
|
||||||
</ul>
|
|
||||||
<a href="/admin/help/quik">Подробная инструкция для администратора QUIK →</a>
|
|
||||||
</details>{{end}}
|
|
||||||
{{if not .DepoLicensed}}<p class="muted">Модуль неторговых поручений не входит в текущую лицензию — шаг пропускается.</p>
|
{{if not .DepoLicensed}}<p class="muted">Модуль неторговых поручений не входит в текущую лицензию — шаг пропускается.</p>
|
||||||
{{else}}{{with .Fancy}}{{template "quikSection" .}}{{end}}
|
{{else}}{{with .Fancy}}{{template "quikSection" .}}{{end}}
|
||||||
{{if .Settings.Quik.Server}}{{template "mnpCheck" .}}{{end}}
|
{{if .Settings.Quik.Server}}{{template "mnpCheck" .}}{{end}}
|
||||||
@@ -525,7 +512,7 @@
|
|||||||
{{else}}
|
{{else}}
|
||||||
<p style="color:var(--err)">Валидата на этом сервере не найдена.</p>
|
<p style="color:var(--err)">Валидата на этом сервере не найдена.</p>
|
||||||
<div class="help-block">
|
<div class="help-block">
|
||||||
<strong>Как поставить.</strong> С образа Bridge&Join она ставится сама. Если bj ставили на готовую систему: пакеты <code>zpki</code> и <code>zsdk</code> из дистрибутива НРД (<a href="https://fs.moex.com/cdp/po/ClientL_Other.zip" target="_blank">ClientL_Other.zip</a> для Ubuntu 22.04, <a href="https://fs.moex.com/cdp/po/ClientL_ALSE.zip" target="_blank">ClientL_ALSE.zip</a> для Astra Linux) — <code>sudo apt install ./zpki_*.deb ./zsdk_*.deb</code>, подробнее — <a href="/admin/help/crypto">справка</a>. После установки обновите эту страницу.
|
<strong>Как поставить.</strong> С образа Bridge&Join она ставится сама. Если bj ставили на готовую систему: пакеты <code>zpki</code> и <code>zsdk</code> из дистрибутива НРД (<a href="https://fs.moex.com/cdp/po/ClientL_Other.zip" target="_blank">ClientL_Other.zip</a> для Ubuntu 22.04, <a href="https://fs.moex.com/cdp/po/ClientL_ALSE.zip" target="_blank">ClientL_ALSE.zip</a> для Astra Linux) — <code>sudo apt install ./zpki_*.deb ./zsdk_*.deb</code>{{if internalDocs}}, подробнее — <a href="/admin/help/crypto">справка</a>{{end}}. После установки обновите эту страницу.
|
||||||
</div>
|
</div>
|
||||||
{{if devOn}}<form method="post" action="/admin/setup/crypto" style="margin-top:12px">
|
{{if devOn}}<form method="post" action="/admin/setup/crypto" style="margin-top:12px">
|
||||||
<input type="hidden" name="provider" value="stub">
|
<input type="hidden" name="provider" value="stub">
|
||||||
|
|||||||
@@ -3,14 +3,17 @@
|
|||||||
{{template "verline" (.Versions.Get "quik-mnp")}}
|
{{template "verline" (.Versions.Get "quik-mnp")}}
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<h2><span class="dot {{if .Settings.Quik.Verified}}ok{{else if .Settings.Quik.Server}}warn{{else}}err{{end}}"></span>Подключение к модулю неторговых поручений</h2>
|
<h2><span class="dot {{if .Settings.Quik.Verified}}ok{{else if .Settings.Quik.Server}}warn{{else}}err{{end}}"></span>Подключение к модулю неторговых поручений</h2>
|
||||||
<p class="muted">{{if not .InWizard}}bj блокирует бумаги клиента в QUIK на время перевода через модуль неторговых поручений (МНП). {{end}}Нужен логин SQL с ролью <code>InstrEu</code> — его выдаёт администратор QUIK: <a href="/admin/help/quik">что ему настроить</a> · <a href="/admin/docs/">документы ARQA</a>.</p>
|
<p class="muted">{{if not .InWizard}}bj блокирует бумаги клиента в QUIK на время перевода через модуль неторговых поручений (МНП). {{end}}Нужен логин SQL с ролью <code>InstrEu</code> — его выдаёт администратор QUIK.</p>
|
||||||
|
{{template "quikMemo" .}}
|
||||||
<form method="post" action="/admin/setup/quik" style="margin-top:12px;display:grid;gap:10px;max-width:560px">
|
<form method="post" action="/admin/setup/quik" style="margin-top:12px;display:grid;gap:10px;max-width:560px">
|
||||||
<input type="hidden" name="check" value="1">
|
<input type="hidden" name="check" value="1">
|
||||||
<div style="display:grid;grid-template-columns:3fr 1fr;gap:10px">
|
<div style="display:grid;grid-template-columns:2.2fr .8fr 1.6fr;gap:10px">
|
||||||
<label>Сервер QUIK МНП
|
<label>Сервер QUIK МНП
|
||||||
<input type="text" name="server" value="{{.Settings.Quik.Server}}" placeholder="адрес или имя\экземпляр" style="width:100%" required></label>
|
<input type="text" name="server" value="{{.Settings.Quik.Server}}" placeholder="адрес или имя\экземпляр" style="width:100%" required></label>
|
||||||
<label>Порт
|
<label>Порт
|
||||||
<input type="number" name="port" value="{{if .Settings.Quik.Port}}{{.Settings.Quik.Port}}{{else}}1433{{end}}" style="width:100%"></label>
|
<input type="number" name="port" value="{{if .Settings.Quik.Port}}{{.Settings.Quik.Port}}{{else}}1433{{end}}" style="width:100%"></label>
|
||||||
|
<label>База МНП{{/* без имени базы модуль не подключается — обязательно */}}
|
||||||
|
<input type="text" name="database" value="{{.Settings.Quik.Database}}" placeholder="имя базы модуля" style="width:100%" required spellcheck="false"></label>
|
||||||
</div>
|
</div>
|
||||||
<div style="display:grid;grid-template-columns:1fr 1fr;gap:10px">
|
<div style="display:grid;grid-template-columns:1fr 1fr;gap:10px">
|
||||||
<label>Логин
|
<label>Логин
|
||||||
@@ -18,17 +21,15 @@
|
|||||||
<label>Пароль
|
<label>Пароль
|
||||||
<input type="password" name="password" placeholder="{{if .Settings.Quik.Password}}сохранён — пусто, чтобы не менять{{end}}" autocomplete="new-password" style="width:100%"></label>
|
<input type="password" name="password" placeholder="{{if .Settings.Quik.Password}}сохранён — пусто, чтобы не менять{{end}}" autocomplete="new-password" style="width:100%"></label>
|
||||||
</div>
|
</div>
|
||||||
<details {{if quikNeedsTrust .Settings.Quik}}open{{end}}><summary style="cursor:pointer;color:var(--accent);font-size:13px">Дополнительно: база и шифрование</summary>
|
<details {{if quikNeedsTrust .Settings.Quik}}open{{end}}><summary style="cursor:pointer;color:var(--accent);font-size:13px">Дополнительно: шифрование</summary>
|
||||||
<div style="display:grid;gap:10px;margin-top:8px">
|
<div style="display:grid;gap:10px;margin-top:8px">
|
||||||
<label>База МНП <span class="muted" style="font-weight:400">— пусто: база логина по умолчанию</span>
|
|
||||||
<input type="text" name="database" value="{{.Settings.Quik.Database}}" style="width:100%"></label>
|
|
||||||
<label>Шифрование
|
<label>Шифрование
|
||||||
<select name="encrypt" style="width:100%">
|
<select name="encrypt" style="width:100%">
|
||||||
<option value="true" {{if ne .Settings.Quik.Encrypt "disable"}}selected{{end}}>Шифровать соединение (обычно требуется)</option>
|
<option value="true" {{if ne .Settings.Quik.Encrypt "disable"}}selected{{end}}>Шифровать соединение (обычно требуется)</option>
|
||||||
<option value="disable" {{if eq .Settings.Quik.Encrypt "disable"}}selected{{end}}>Без шифрования</option>
|
<option value="disable" {{if eq .Settings.Quik.Encrypt "disable"}}selected{{end}}>Без шифрования</option>
|
||||||
</select></label>
|
</select></label>
|
||||||
<label style="display:flex;gap:8px;align-items:center;font-weight:400">
|
<label style="display:flex;gap:8px;align-items:center;font-weight:400">
|
||||||
<input type="checkbox" name="trust" value="1" {{if .Settings.Quik.Trust}}checked{{end}}>
|
<input type="checkbox" name="trust" value="1" {{if or .Settings.Quik.Trust (not .Settings.Quik.Server)}}checked{{end}}>{{/* по умолчанию — да: у QUIK сертификат свой */}}
|
||||||
Доверять сертификату сервера, даже самоподписанному</label>
|
Доверять сертификату сервера, даже самоподписанному</label>
|
||||||
</div>
|
</div>
|
||||||
</details>
|
</details>
|
||||||
@@ -108,3 +109,17 @@
|
|||||||
})();
|
})();
|
||||||
</script>
|
</script>
|
||||||
{{end}}
|
{{end}}
|
||||||
|
|
||||||
|
{{/* Памятка администратору QUIK — в мастере и в «Настройке». Без ссылок на техническую справку (её нет в
|
||||||
|
рабочей сборке) и на документы ARQA (их у клиента нет на сервере bj — они у администратора QUIK). */}}
|
||||||
|
{{define "quikMemo"}}
|
||||||
|
<details style="margin:2px 0 10px;font-size:13.5px"><summary style="cursor:pointer;color:var(--accent)">Памятка администратору QUIK — что настроить</summary>
|
||||||
|
<p style="margin:6px 0 4px">Всё это описано в документации ARQA на модуль неторговых поручений («Руководство администратора», «Таблицы и процедуры БД») — она есть у администратора QUIK:</p>
|
||||||
|
<ul style="margin:0 0 6px;padding-left:20px">
|
||||||
|
<li>в QAdmin — классы <code>INSTROUTM2M</code> (вывод ценных бумаг) и <code>INSTRINM2M</code> (ввод), типы неторговых поручений M2M;</li>
|
||||||
|
<li>SQL-логин для bj с ролью <code>InstrEu</code> — его логин и пароль вписываются в поля ниже;</li>
|
||||||
|
<li>справочник депозитариев-получателей <code>M2MDepoRecipients</code> заполняет bj; после первого заполнения модуль нужно перезапустить — QUIK читает справочник только при запуске.</li>
|
||||||
|
</ul>
|
||||||
|
{{if internalDocs}}<a href="/admin/help/quik">Подробная внутренняя справка →</a>{{end}}
|
||||||
|
</details>
|
||||||
|
{{end}}
|
||||||
|
|||||||
Reference in New Issue
Block a user