Мастер настройки проще: один вопрос на экран, подробности — под «Подробнее»

- «Время и сеть»: пояс компьютера пользователя предлагается одной кнопкой, пояс применяется сразу при
  выборе; сервер времени — только если не синхронизируется; «сделано установщиком» — строкой внизу.
- «Лицензия»: модули словами, а не кодами (quik-mnp → «QUIK: неторговые поручения…»); пояснения — только
  пока ключа нет; поле ключа крупное, одно.
- «Учёт DEPO»: главный вопрос «Как подготовить базу» первым, короткие подписи; кружки переключателей
  больше не сплющиваются длинным текстом.
- «QUIK»: одна кнопка «Сохранить и проверить»; база и шифрование — под «Дополнительно», без «true/disable»
  и TrustServerCertificate; автоматический цикл и справочник получателей в мастере свёрнуты.
- «Организация»: без логотипа (он в «Оформлении»), кнопки одного цвета. «Шлюз НРД», «Ключ», «Оповещения»:
  по одному абзацу, письма и устройство автообновления сертификатов — под раскрытием.
- Мастер и «Подготовка модулей» — без меню системы; подзаголовок не повторяет названия глав.
- Подсказка о восстановлении из копии ведёт на первую страницу (в мастере его больше нет).

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-06 11:58:58 +03:00
parent 8905ebc6fb
commit 6a68dc927f
13 changed files with 234 additions and 133 deletions
+34 -30
View File
@@ -2,40 +2,43 @@
{{define "quikSection"}}
{{template "verline" (.Versions.Get "quik-mnp")}}
<div class="card">
<h2><span class="dot {{if .Settings.Quik.Verified}}ok{{else if .Settings.Quik.Server}}warn{{else}}err{{end}}"></span>Подключение к БД МНП QUIK (MSSQL)</h2>
<p class="muted">При выводе бумаг клиентом bj блокирует их количество в QUIK через API Модуля неторговых поручений (хранимые процедуры). БД <strong>боевая</strong> — проверка только на чтение (версия + наличие M2M-объектов), без записи. Подключение под логином с ролью <code>InstrEu</code>.<br>
<a href="/admin/help/quik"><strong>Инструкция для администратора QUIK</strong></a> — что настроить в QuikAdmin для M2M · <a href="/admin/docs/">документы ARQA</a>.</p>
<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>
<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="адрес 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="логин 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>Шифрование канала
<select name="encrypt" style="width:100%">
<option value="true" {{if eq .Settings.Quik.Encrypt "true"}}selected{{end}}>true — с TLS (боевой сервер обычно требует)</option>
<option value="disable" {{if eq .Settings.Quik.Encrypt "disable"}}selected{{end}}>disable — без TLS</option>
</select></label>
<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}}>
Доверять сертификату сервера (TrustServerCertificate — для самоподписанного)</label>
<div style="display:flex;gap:8px;flex-wrap:wrap">
<button type="submit" class="btn btn-ok">Сохранить</button>
<input type="hidden" name="check" value="1">
<div style="display:grid;grid-template-columns:3fr 1fr;gap:10px">
<label>Сервер QUIK МНП
<input type="text" name="server" value="{{.Settings.Quik.Server}}" placeholder="адрес или имя\экземпляр" style="width:100%" required></label>
<label>Порт
<input type="number" name="port" value="{{if .Settings.Quik.Port}}{{.Settings.Quik.Port}}{{else}}1433{{end}}" style="width:100%"></label>
</div>
<div style="display:grid;grid-template-columns:1fr 1fr;gap:10px">
<label>Логин
<input type="text" name="user" value="{{.Settings.Quik.User}}" style="width:100%" required autocomplete="off"></label>
<label>Пароль
<input type="password" name="password" placeholder="{{if .Settings.Quik.Password}}сохранён — пусто, чтобы не менять{{end}}" autocomplete="new-password" style="width:100%"></label>
</div>
<details><summary style="cursor:pointer;color:var(--accent);font-size:13px">Дополнительно: база и шифрование (обычно не нужно)</summary>
<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>Шифрование
<select name="encrypt" style="width:100%">
<option value="true" {{if ne .Settings.Quik.Encrypt "disable"}}selected{{end}}>Шифровать соединение (обычно требуется)</option>
<option value="disable" {{if eq .Settings.Quik.Encrypt "disable"}}selected{{end}}>Без шифрования</option>
</select></label>
<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}}>
Доверять сертификату сервера, даже самоподписанному</label>
</div>
</details>
<div><button type="submit" class="btn">Сохранить и проверить</button> <span class="muted" style="font-size:12.5px;margin-left:6px">проверка только читает — в QUIK ничего не меняется</span></div>
</form>
<div style="display:flex;gap:8px;flex-wrap:wrap;margin-top:12px">
<form method="post" action="/admin/setup/quik/test" style="margin:0"><button type="submit" class="btn">Проверить подключение (чтение)</button></form>
</div>
<p class="muted" style="margin-top:12px">Статус: {{if .Settings.Quik.Verified}}<span style="color:var(--ok)">✓ подключение проверено</span>{{else}}<span class="muted">не проверено</span>{{end}}</p>
</div>
<div class="card" id="sec-quik-cycle">
<h2><span class="dot {{if .Settings.Quik.Emulate}}warn{{else if not .Settings.Quik.WritesEnabled}}warn{{else if or .Settings.Quik.AutoOut .Settings.Quik.AutoIn}}ok{{else}}warn{{end}}"></span>Автоматический цикл M2M в МНП{{if .Settings.Quik.Emulate}} <span class="hero-status warn">{{if devOn}}имитация{{else}}остановлен{{end}}</span>{{end}}</h2>
{{if .InWizard}}<details><summary style="cursor:pointer;list-style:none"><h2 style="display:inline">{{else}}<h2>{{end}}<span class="dot {{if .Settings.Quik.Emulate}}warn{{else if not .Settings.Quik.WritesEnabled}}warn{{else if or .Settings.Quik.AutoOut .Settings.Quik.AutoIn}}ok{{else}}warn{{end}}"></span>Автоматический цикл M2M в МНП{{if .Settings.Quik.Emulate}} <span class="hero-status warn">{{if devOn}}имитация{{else}}остановлен{{end}}</span>{{end}}</h2>{{if .InWizard}} <span class="muted" style="font-size:13px">— {{if .Settings.Quik.WritesEnabled}}включён{{else}}выключен: bj ничего не пишет в QUIK{{end}} · настроить ▸</span></summary>{{end}}
<p class="muted">Что делает bj в Модуле неторговых поручений по ходу перевода: <strong>исходящий</strong> — при отправке в НРД регистрирует «Вывод ЦБ (M2M)» (QUIK блокирует бумаги), по подтверждению подписывает (списание), по отказу снимает с причиной; <strong>входящий</strong> — после приёма нашего поручения НРД регистрирует «Ввод ЦБ (M2M)» (зачисление сразу). Каждый шаг виден в карточке перевода и на странице <a href="/admin/quik">QUIK МНП</a>.</p>
<form method="post" action="/admin/setup/quik/cycle" style="margin-top:12px;display:grid;gap:10px;max-width:640px">
<input type="hidden" name="section" value="sec-quik-cycle">
@@ -55,7 +58,7 @@
<input type="checkbox" name="poll_terminal" value="1" {{if .Settings.Quik.PollTerminal}}checked{{end}}>
Принимаем поручения M2M из QUIK: клиентам разрешена подача «Вывод ЦБ (M2M)» из терминала / мобильного приложения — bj опрашивает их и создаёт заявку оператору. Если фирма такую подачу не разрешает, оставьте выключенным: раздел «Поручения QUIK» их показывать не будет.</label>
<label>Торговый счёт для регистрации поручений
<input type="text" name="account" value="{{.Settings.Quik.Account}}" placeholder="L01+00000F00" style="width:100%"></label>
<input type="text" name="account" value="{{.Settings.Quik.Account}}" placeholder="торговый счёт фирмы в QUIK" style="width:100%"></label>
<div style="display:grid;grid-template-columns:1fr 1fr;gap:10px">
<label>МНП-инструмент вывода <span class="muted">(пусто = взять из класса INSTROUTM2M)</span>
<input type="text" name="sec_out" value="{{.Settings.Quik.SecOut}}" placeholder="RUROUTM2M" style="width:100%"></label>
@@ -63,9 +66,10 @@
<input type="text" name="sec_in" value="{{.Settings.Quik.SecIn}}" placeholder="RURINM2M" style="width:100%"></label>
</div>
<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>
<textarea name="client_code_map" rows="3" style="width:100%;font-family:ui-monospace,monospace;font-size:12px" placeholder="БР-12-3=BR123">{{quikCodeMap .Settings.Quik.ClientCodeMap}}</textarea></label>
<div style="display:flex;gap:8px;flex-wrap:wrap"><button type="submit" class="btn">Сохранить</button></div>
</form>
{{if .InWizard}}</details>{{end}}
</div>
{{if .Settings.Quik.LastReport}}