From ea87958f43634c7d411ff04a36feacecdec2931f Mon Sep 17 00:00:00 2001 From: zuevav Date: Thu, 24 Sep 2026 14:23:12 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9C=D0=B0=D1=81=D1=82=D0=B5=D1=80=20=D0=BD?= =?UTF-8?q?=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B9=D0=BA=D0=B8:=20=D0=BF?= =?UTF-8?q?=D0=BE=D1=81=D0=BB=D0=B5=20=D1=81=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=B0=D0=B4=D0=BC=D0=B8=D0=BD=D0=B8=D1=81=D1=82?= =?UTF-8?q?=D1=80=D0=B0=D1=82=D0=BE=D1=80=D0=B0=20=E2=80=94=20=D1=81=D1=80?= =?UTF-8?q?=D0=B0=D0=B7=D1=83=20=D0=B2=20=D0=BC=D0=B0=D1=81=D1=82=D0=B5?= =?UTF-8?q?=D1=80;=207=20=D1=88=D0=B0=D0=B3=D0=BE=D0=B2=20(=D0=BB=D0=B8?= =?UTF-8?q?=D1=86=D0=B5=D0=BD=D0=B7=D0=B8=D1=8F,=20=D0=B1=D0=B0=D0=B7?= =?UTF-8?q?=D0=B0=20bj,=20=D1=83=D1=87=D1=91=D1=82=20DEPO,=20=D0=92=D0=B0?= =?UTF-8?q?=D0=BB=D0=B8=D0=B4=D0=B0=D1=82=D0=B0,=20=D1=81=D0=B5=D1=80?= =?UTF-8?q?=D1=82=D0=B8=D1=84=D0=B8=D0=BA=D0=B0=D1=82=D1=8B,=20=D1=88?= =?UTF-8?q?=D0=BB=D1=8E=D0=B7=20=D0=9D=D0=A0=D0=94,=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=B5=D1=80=D0=BA=D0=B0)=20=D1=81=20=D0=BF=D0=BE=D1=8F?= =?UTF-8?q?=D1=81=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=D0=BC=D0=B8=20=D1=87=D1=82?= =?UTF-8?q?=D0=BE/=D0=B7=D0=B0=D1=87=D0=B5=D0=BC/=D0=B3=D0=B4=D0=B5=20?= =?UTF-8?q?=D0=B2=D0=B7=D1=8F=D1=82=D1=8C,=20=D0=BA=D0=B0=D0=B6=D0=B4?= =?UTF-8?q?=D1=8B=D0=B9=20=D0=BC=D0=BE=D0=B6=D0=BD=D0=BE=20=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D0=BF=D1=83=D1=81=D1=82=D0=B8=D1=82=D1=8C;=20=D0=B8?= =?UTF-8?q?=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=BE=20=D0=B8?= =?UTF-8?q?=D0=BC=D1=8F=20=D0=BF=D0=BE=D0=BB=D1=8F=20URL=20=D0=98=D0=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi --- internal/lkgateway/firstrun.go | 8 +- internal/lkgateway/setup.go | 26 ++++- .../lkgateway/web/templates/admin_wizard.html | 107 +++++++++++++----- 3 files changed, 103 insertions(+), 38 deletions(-) diff --git a/internal/lkgateway/firstrun.go b/internal/lkgateway/firstrun.go index 7c605b6..3a6780d 100644 --- a/internal/lkgateway/firstrun.go +++ b/internal/lkgateway/firstrun.go @@ -101,17 +101,17 @@ func registerFirstRun(mux *http.ServeMux) { acancel() if err != nil { log.Printf("auth: первичная настройка: ключ продукта не принят: %v", err) - http.Redirect(w, r, "/admin/setup?flash="+url.QueryEscape("Лицензия: ключ продукта не принят — "+err.Error()+". Введите его в разделе «Лицензия».")+"#sec-license", http.StatusSeeOther) + http.Redirect(w, r, "/admin/wizard?step=1&flash="+url.QueryEscape("Администратор создан. Ключ продукта не принят: "+err.Error()+". Проверьте его и введите ещё раз."), http.StatusSeeOther) return } - http.Redirect(w, r, "/admin/setup?flash="+url.QueryEscape("Лицензия активирована. Дальше — подключение к базе DEPO, затем реквизиты НРД (кнопка «Определить из DEPO»)."), http.StatusSeeOther) + http.Redirect(w, r, "/admin/wizard?flash="+url.QueryEscape("Администратор создан, лицензия активирована. Мастер проведёт по остальным шагам — любой можно пропустить."), http.StatusSeeOther) return } if d.NeedKey { - http.Redirect(w, r, "/admin/setup?flash="+url.QueryEscape("Администратор создан. Лицензия ещё не активирована — введите ключ продукта в разделе «Лицензия», иначе модули и обновления недоступны.")+"#sec-license", http.StatusSeeOther) + http.Redirect(w, r, "/admin/wizard?step=1&flash="+url.QueryEscape("Администратор создан. Начнём с лицензии: без ключа продукта модули и обновления недоступны (шаг можно пропустить)."), http.StatusSeeOther) return } - http.Redirect(w, r, "/admin/setup", http.StatusSeeOther) + http.Redirect(w, r, "/admin/wizard", http.StatusSeeOther) return } w.WriteHeader(http.StatusUnauthorized) diff --git a/internal/lkgateway/setup.go b/internal/lkgateway/setup.go index f11824f..6f0d14c 100644 --- a/internal/lkgateway/setup.go +++ b/internal/lkgateway/setup.go @@ -166,9 +166,14 @@ type WizardData struct { Step int Settings Settings Suggest *DepoRequisites // предложение реквизитов из DEPO (после «Определить из DEPO») + Lic LicenseStatus + DepoLicensed bool + DepoDB string Certs []cryptocli.Certificate Flash string Done struct { + License bool + Depo bool Postgres bool Crypto bool Certs bool @@ -193,6 +198,11 @@ func (h *setupHandlers) renderWizard(w http.ResponseWriter, r *http.Request) { Certs: h.listCertsForUI(), Flash: r.URL.Query().Get("flash"), } + d.Lic = licenseStatus(h.rc) + d.Done.License = d.Lic.Valid + d.DepoLicensed = moduleAllowed(h.rc, "quik-mnp") + d.DepoDB = s.Fancy.DepoDB() + d.Done.Depo = strings.TrimSpace(s.Fancy.Server) != "" || !d.DepoLicensed d.Done.Postgres = s.Postgres.DSN != "" d.Done.Crypto = s.Crypto.Provider != "" && s.Crypto.Provider != "stub" && s.Crypto.ModulePath != "" d.Done.Certs = len(d.Certs) > 0 @@ -202,22 +212,26 @@ func (h *setupHandlers) renderWizard(w http.ResponseWriter, r *http.Request) { // Определяем текущий шаг. step := 1 if v := r.URL.Query().Get("step"); v != "" { - if n, err := strconv.Atoi(v); err == nil && n >= 1 && n <= 5 { + if n, err := strconv.Atoi(v); err == nil && n >= 1 && n <= 7 { step = n } } else { // Авто: первый незавершённый. switch { - case !d.Done.Postgres: + case !d.Done.License: step = 1 - case !d.Done.Crypto: + case !d.Done.Postgres: step = 2 - case !d.Done.Certs: + case !d.Done.Depo: step = 3 - case !d.Done.NSD: + case !d.Done.Crypto: step = 4 - default: + case !d.Done.Certs: step = 5 + case !d.Done.NSD: + step = 6 + default: + step = 7 } } d.Step = step diff --git a/internal/lkgateway/web/templates/admin_wizard.html b/internal/lkgateway/web/templates/admin_wizard.html index 2ead4c0..5c4fbdf 100644 --- a/internal/lkgateway/web/templates/admin_wizard.html +++ b/internal/lkgateway/web/templates/admin_wizard.html @@ -26,21 +26,72 @@

Пошаговый мастер первого запуска — состояние сохраняется после каждого шага

-
-
{{if .Done.Postgres}}✓{{else}}1{{end}}База
-
{{if .Done.Crypto}}✓{{else}}2{{end}}Валидата
-
{{if .Done.Certs}}✓{{else}}3{{end}}Сертификаты
-
{{if .Done.NSD}}✓{{else}}4{{end}}Шлюз НРД
-
{{if .Done.TestRun}}✓{{else}}5{{end}}Проверка
+
+
{{if .Done.License}}✓{{else}}1{{end}}Лицензия
+
{{if .Done.Postgres}}✓{{else}}2{{end}}База bj
+
{{if .Done.Depo}}✓{{else}}3{{end}}Учёт DEPO
+
{{if .Done.Crypto}}✓{{else}}4{{end}}Валидата
+
{{if .Done.Certs}}✓{{else}}5{{end}}Сертификаты
+
{{if .Done.NSD}}✓{{else}}6{{end}}Шлюз НРД
+
{{if .Done.TestRun}}✓{{else}}7{{end}}Проверка
+

Пропустить мастер и перейти в систему → — вернуться к нему можно из «Настройка → Мастер настройки»

{{if .Flash}}

{{.Flash}}

{{end}}
-{{/* ============= ШАГ 1: PostgreSQL ============= */}} + +{{/* ============= ШАГ 1: Лицензия ============= */}} {{if eq .Step 1}}
-

Шаг 1. PostgreSQL

+

Шаг 1. Лицензия

+
Что это. Ключ продукта (BJ-XXXX-XXXX-XXXX) привязывает этот сервер к вашей лицензии.
+ Зачем. От лицензии зависят модули (обмен с DEPO и QUIK, личный кабинет, НПР/УДС) и получение обновлений: bj скачает и поставит модули, входящие в лицензию, автоматически.
+ Где взять. Портал клиента lic.zetit.ru/portal или письмо от ZETIT.
+ {{if .Done.License}}

✓ Лицензия активна: {{.Lic.Tenant}}, план {{.Lic.Plan}}, модули: {{if .Lic.Features}}{{range $i, $f := .Lic.Features}}{{if $i}}, {{end}}{{$f}}{{end}}{{else}}только ядро{{end}}; {{.Lic.Message}}

{{end}} +
+ + + + +
+ +
+{{end}} + +{{/* ============= ШАГ 3: Учёт DEPO (Fancy) ============= */}} +{{if eq .Step 3}} +
+

Шаг 3. Учётная система DEPO (Fancy)

+
Что это. Подключение к базе депозитарного учёта DEPO (MS SQL / PostgreSQL).
+ Зачем. bj сверяет с DEPO каждый перевод (клиент, счёт, остаток, квалификация) и передаёт в DEPO поручения и их исполнение — документы создаются в учёте автоматически. Отсюда же bj возьмёт ваши реквизиты в НРД (шаг 6), чтобы не вводить их вручную.
+ Что нужно. Адрес сервера БД и логин с правами чтения DEPO и записи в трансферные таблицы FTV_M2M (выдаёт администратор СУБД).
+ {{if not .DepoLicensed}} +

Модуль обмена с DEPO и QUIK не входит в текущую лицензию — шаг пропускается. После добавления модуля в лицензию он станет доступен здесь и в «Настройка → Обмен Fancy».

+ {{else}} + {{if .Done.Depo}}

✓ Подключение сохранено: {{.Settings.Fancy.Server}}, база {{.DepoDB}}. {{if .Settings.Fancy.DepoTablesCheckOK}}Трансферные таблицы на месте.{{else}}Трансферные таблицы ещё не проверены — «Настройка → Обмен Fancy → Трансферные таблицы DEPO».{{end}}

{{end}} +
+ +
+
+
+
+
+ +
+ {{if .Settings.Fancy.Server}}{{end}}
+
+ {{end}} + +
+{{end}} +{{/* ============= ШАГ 1: PostgreSQL ============= */}} +{{if eq .Step 2}} +
+

Шаг 2. PostgreSQL

Сюда система пишет журнал сделок и принимает данные от команды Fansy.

@@ -70,16 +121,16 @@
- {{if .Done.Postgres}}К шагу 2 →{{else}}{{end}} + {{if .Done.Postgres}}К шагу 2 →{{else}}{{end}}
- {{if not .Done.Postgres}}

Пропустить (буду работать в режиме in-memory — без сохранения сделок)

{{end}} + {{if not .Done.Postgres}}

Пропустить (буду работать в режиме in-memory — без сохранения сделок)

{{end}}
{{end}} {{/* ============= ШАГ 2: Крипто (Валидата) ============= */}} -{{if eq .Step 2}} +{{if eq .Step 4}}
-

Шаг 2. СКЗИ «Валидата Клиент L»

+

Шаг 4. СКЗИ «Валидата Клиент L»

СКЗИ нужен для подписи XMLDSig и проверки квитанций НРД.

@@ -106,16 +157,16 @@
- ← К шагу 1 - {{if .Done.Crypto}}К шагу 3 →{{else}}Пропустить →{{end}} + ← К шагу 1 + {{if .Done.Crypto}}К шагу 3 →{{else}}Пропустить →{{end}}
{{end}} {{/* ============= ШАГ 3: Сертификаты ============= */}} -{{if eq .Step 3}} +{{if eq .Step 5}}
-

Шаг 3. Сертификаты

+

Шаг 5. Сертификаты

Импортируйте сертификаты вашей организации и сертификаты УЦ НРД (для проверки квитанций).

{{end}} {{/* ============= ШАГ 4: НРД ============= */}} -{{if eq .Step 4}} +{{if eq .Step 6}}
-

Шаг 4. Интеграционный шлюз НРД

+

Шаг 6. Интеграционный шлюз НРД

Адрес web-сервиса ONYX и имя ключевого контейнера НРД.

@@ -203,7 +254,7 @@
- +
@@ -220,7 +271,7 @@ {{if .Suggest}}{{if .Suggest.OrgName}}

Организация (из DEPO — проверьте): код участника, ИНН, наименование.

- +
@@ -242,17 +293,17 @@
{{end}} {{/* ============= ШАГ 5: Тест-ран (режим разработки) / проверка подключений ============= */}} -{{if eq .Step 5}} +{{if eq .Step 7}}
{{if devOn}} -

Шаг 5. Тестовая заявка

+

Шаг 7. Тестовая заявка

Прогон полного цикла: создание заявки → валидация → подпись → отправка в НРД (или mock) → ожидание Decision → подтверждение.

@@ -273,7 +324,7 @@ {{end}} {{else}} -

Шаг 5. Проверка подключений

+

Шаг 7. Проверка подключений

Проверьте, что база данных, СКЗИ и шлюз НРД доступны: на странице «Статус» bj проверяет каждое подключение и показывает, что нужно исправить.

Открыть проверку подключений → {{end}} @@ -288,7 +339,7 @@