From cabf2e2c172eb8d210266c9b6c4ed4076acd168b Mon Sep 17 00:00:00 2001 From: zuevav Date: Thu, 24 Sep 2026 23:15:01 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9C=D0=B0=D1=81=D1=82=D0=B5=D1=80:=209=20?= =?UTF-8?q?=D1=88=D0=B0=D0=B3=D0=BE=D0=B2=20=E2=80=94=20=D0=BE=D1=80=D0=B3?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20(=D1=80?= =?UTF-8?q?=D0=B5=D0=BA=D0=B2=D0=B8=D0=B7=D0=B8=D1=82=D1=8B=20=D0=B8=D0=B7?= =?UTF-8?q?=20DEPO,=20=D0=BB=D0=BE=D0=B3=D0=BE=D1=82=D0=B8=D0=BF)=20=D0=B8?= =?UTF-8?q?=20QUIK=20=D0=9C=D0=9D=D0=9F=20=D0=BE=D0=B1=D1=89=D0=B8=D0=BC?= =?UTF-8?q?=D0=B8=20=D0=B1=D0=BB=D0=BE=D0=BA=D0=B0=D0=BC=D0=B8=20=D0=B8?= =?UTF-8?q?=D0=B7=20=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B5=D0=BA;=20?= =?UTF-8?q?=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D0=B8=20=D0=B2=D0=B8=D0=B4=D0=BD?= =?UTF-8?q?=D1=8B=20=D1=81=D1=82=D1=80=D0=BE=D0=B3=D0=BE=20=D0=BF=D0=BE=20?= =?UTF-8?q?=D0=BB=D0=B8=D1=86=D0=B5=D0=BD=D0=B7=D0=B8=D0=B8;=20=D0=95?= =?UTF-8?q?=D0=A1=D0=98=D0=90=20=D0=A4=D0=B8=D0=BD=D0=B0=D0=BD=D1=81=20?= =?UTF-8?q?=E2=80=94=20=D0=BE=D1=82=D0=B4=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B?= =?UTF-8?q?=D0=B9=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8C;=20=D0=BB=D0=BE?= =?UTF-8?q?=D0=B3=D0=BE=D1=82=D0=B8=D0=BF=20=D0=A4=D0=BE=D0=BD=D1=82=D0=B2?= =?UTF-8?q?=D1=8C=D0=B5=D0=BB=D1=8C=20=D1=82=D0=BE=D0=BB=D1=8C=D0=BA=D0=BE?= =?UTF-8?q?=20=D1=83=20=D0=A4=D0=BE=D0=BD=D1=82=D0=B2=D1=8C=D0=B5=D0=BB?= =?UTF-8?q?=D1=8C;=20=D0=BF=D0=BE=D1=8F=D1=81=D0=BD=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=BF=D0=BE=20=D1=81=D1=82=D0=BE=D1=80=D0=BE=D0=BD?= =?UTF-8?q?=D0=BD=D0=B8=D0=BC=20=D0=BA=D0=BE=D0=BC=D0=BF=D0=BE=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D1=82=D0=B0=D0=BC?= 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/admin.go | 6 +- internal/lkgateway/auth.go | 6 +- internal/lkgateway/fontvielle_logo.go | 27 +- internal/lkgateway/licensecheck.go | 1 + internal/lkgateway/lkconnector.go | 3 + internal/lkgateway/m2mplan_export.go | 7 +- internal/lkgateway/setup.go | 40 ++- .../lkgateway/web/templates/admin_setup.html | 277 ++---------------- .../lkgateway/web/templates/admin_wizard.html | 176 +++++------ .../lkgateway/web/templates/part_fancy.html | 116 ++++++++ .../lkgateway/web/templates/part_org.html | 67 +++++ .../lkgateway/web/templates/part_quik.html | 82 ++++++ 12 files changed, 430 insertions(+), 378 deletions(-) create mode 100644 internal/lkgateway/web/templates/part_fancy.html create mode 100644 internal/lkgateway/web/templates/part_org.html create mode 100644 internal/lkgateway/web/templates/part_quik.html diff --git a/internal/lkgateway/admin.go b/internal/lkgateway/admin.go index c72fd07..1b0a9c3 100644 --- a/internal/lkgateway/admin.go +++ b/internal/lkgateway/admin.go @@ -43,10 +43,7 @@ var templateFuncs = template.FuncMap{ "fallbackTpl": fallback, // logoSrc — data-URI логотипа отчётов: загруженный из настроек или встроенный. "logoSrc": func(uri string) template.URL { - if strings.TrimSpace(uri) == "" { - return template.URL(fontvielleLogoDataURI) - } - return template.URL(uri) + return template.URL(defaultLogoDataURI(uri)) }, // m2mCode — человекочитаемое название кода M2M: «Текст (M2Mxx)». "m2mCode": m2mCodeLabel, @@ -216,6 +213,7 @@ func newAdmin() (*admin, error) { parse := func(content string) (*template.Template, error) { return template.New("layout.html").Funcs(templateFuncs).ParseFS(templatesFS, "web/templates/layout.html", + "web/templates/part_*.html", // общие блоки (например, «Обмен Fancy» для настроек и мастера) "web/templates/"+content) } home, err := parse("admin_home.html") diff --git a/internal/lkgateway/auth.go b/internal/lkgateway/auth.go index 6923d9b..f53d105 100644 --- a/internal/lkgateway/auth.go +++ b/internal/lkgateway/auth.go @@ -893,13 +893,15 @@ func moduleForPath(p string) string { return "quik-mnp" case has("/admin/setup/quikexport"): return "quik-export" - case strings.HasPrefix(p, "/admin/setup/lk/"): // личный кабинет клиента (bj-lk); /admin/setup/lk* без «/» — ЕСИА Финанс, ядро + case strings.HasPrefix(p, "/admin/setup/lk/"): // личный кабинет клиента (bj-lk) return "web-cabinet" + case p == "/admin/setup/lk", has("/admin/setup/lk-check"), has("/admin/setup/lk-integration"), has("/admin/setup/lk-pull"): + return "esia-finance" // интеграция с платформой ЕСИА Финанс — отдельный модуль лицензии } return "" } -var moduleTitles = map[string]string{"quik-mnp": "QUIK: неторговые поручения и обмен с DEPO", "quik-export": "Экспорт биржевой информации QUIK", "web-cabinet": "Личный кабинет клиента", "npr": "Риск-монитор НПР / УДС"} +var moduleTitles = map[string]string{"esia-finance": "ЕСИА Финанс", "quik-mnp": "QUIK: неторговые поручения и обмен с DEPO", "quik-export": "Экспорт биржевой информации QUIK", "web-cabinet": "Личный кабинет клиента", "npr": "Риск-монитор НПР / УДС"} func moduleNotLicensed(w http.ResponseWriter, f string) { w.Header().Set("Content-Type", "text/html; charset=utf-8") diff --git a/internal/lkgateway/fontvielle_logo.go b/internal/lkgateway/fontvielle_logo.go index f8dd007..ce3904f 100644 --- a/internal/lkgateway/fontvielle_logo.go +++ b/internal/lkgateway/fontvielle_logo.go @@ -11,7 +11,32 @@ func orgLogoIMG() string { return `Логотип организации` } } - return fontvielleLogoIMG + if builtinLogoAllowed() { + return fontvielleLogoIMG + } + return "" // своего логотипа нет — справа в шапке пусто +} + +// builtinLogoAllowed — встроенный логотип Фонтвьель только на сервере Фонтвьель (лицензия выдана +// им): у других клиентов на чистой установке чужого логотипа быть не должно. +func builtinLogoAllowed() bool { + if globalRC == nil { + return false + } + t := strings.ToLower(licenseStatus(globalRC).Tenant) + return strings.Contains(t, "фонтвьел") || strings.Contains(t, "fontvielle") +} + +// defaultLogoDataURI — логотип для отчётов: загруженный в «Оформлении», иначе встроенный (только у +// Фонтвьель), иначе пусто. +func defaultLogoDataURI(uploaded string) string { + if u := strings.TrimSpace(uploaded); u != "" { + return u + } + if builtinLogoAllowed() { + return fontvielleLogoDataURI + } + return "" } // fontvielle_logo.go — логотип ООО ИК «Фонтвьель» (data-URI PNG), встраивается в diff --git a/internal/lkgateway/licensecheck.go b/internal/lkgateway/licensecheck.go index 1152264..d991934 100644 --- a/internal/lkgateway/licensecheck.go +++ b/internal/lkgateway/licensecheck.go @@ -42,6 +42,7 @@ var knownFeatures = []struct{ Key, Title string }{ {"quik-mnp", "QUIK: модуль неторговых поручений (цикл M2M)"}, {"quik-export", "QUIK: экспорт биржевой информации"}, {"npr", "Риск-монитор НПР / УДС"}, + {"esia-finance", "ЕСИА Финанс (платформа личного кабинета)"}, } func licenseFeatureViews(rc *RuntimeConfig) []LicenseFeatureView { diff --git a/internal/lkgateway/lkconnector.go b/internal/lkgateway/lkconnector.go index d8e46fa..6b85b5f 100644 --- a/internal/lkgateway/lkconnector.go +++ b/internal/lkgateway/lkconnector.go @@ -274,6 +274,9 @@ func (s *Server) pollLKClaims(ctx context.Context) { if _, ok := lkActiveEndpoint(s.rc); !ok { continue // ЛК не настроен — тихо ждём } + if !moduleAllowed(s.rc, "esia-finance") { + continue // ЕСИА Финанс — отдельный модуль лицензии + } cctx, cancel := context.WithTimeout(ctx, 50*time.Second) res, err := PullLKClaims(cctx, s.rc, s.svc) cancel() diff --git a/internal/lkgateway/m2mplan_export.go b/internal/lkgateway/m2mplan_export.go index d976a95..4ee7826 100644 --- a/internal/lkgateway/m2mplan_export.go +++ b/internal/lkgateway/m2mplan_export.go @@ -71,13 +71,12 @@ func writeM2MPlanHTML(w http.ResponseWriter, r *http.Request, h *setupHandlers) Date: strings.TrimSpace(r.URL.Query().Get("date")), Generated: time.Now().Format("02.01.2006"), CpName: nonEmpty(plan.CounterpartyName, "Контрагент"), CpCode: plan.CounterpartyCode, CpINN: plan.CounterpartyINN, - OurName: nonEmpty(m2mPartyName(ourCode), "Фонтвьель"), OurCode: ourCode, OurINN: nonEmpty(plan.OurINN, m2mINNByCode(ourCode)), + OurName: nonEmpty(m2mPartyName(ourCode), orgName(h.rc.Snapshot())), OurCode: ourCode, OurINN: nonEmpty(plan.OurINN, m2mINNByCode(ourCode)), } if d.Date == "" { d.Date = time.Now().AddDate(0, 0, 1).Format("02.01.2006") } - d.LogoSrc = template.URL(fontvielleLogoDataURI) - if u := strings.TrimSpace(h.rc.Snapshot().Branding.LogoDataURI); strings.HasPrefix(u, "data:image/") { + if u := defaultLogoDataURI(h.rc.Snapshot().Branding.LogoDataURI); strings.HasPrefix(u, "data:image/") { d.LogoSrc = template.URL(u) } party := func(k string) string { @@ -290,7 +289,7 @@ select.btn{padding:4px 8px} @media print{body{background:#fff;color:#000}.card{border:none;padding:8px 0;page-break-inside:avoid}.wrap{padding:0}.toolbar,.noprint,.st button:not(.on){display:none}textarea.f,input.f{border:none;padding:0}}
-
{{.OurName}}{{.OurName}} · код участника {{.OurCode}}
+
{{if .LogoSrc}}{{.OurName}}{{end}}{{.OurName}} · код участника {{.OurCode}}

План тестирования переводов ценных бумаг через MOEX МОСТ (M2M)

Тестовый контур НРД · дата проведения: {{.Date}} · документ сформирован {{.Generated}}

diff --git a/internal/lkgateway/setup.go b/internal/lkgateway/setup.go index 5ba5c70..ddd03d7 100644 --- a/internal/lkgateway/setup.go +++ b/internal/lkgateway/setup.go @@ -175,6 +175,7 @@ type WizardData struct { DepoEdition string // редакция SQL Server клиента (пусто — не определена) DepoAgent bool // у SQL Server есть SQL Agent (не Express, не PostgreSQL) DepoJobDef string // способ обработки по умолчанию для мастера + Fancy *SetupData // шаг 3: общий блок «Обмен Fancy» (тот же, что в настройках) ValidataVer string // версия установленной «Валидаты Клиент L» (пусто — не установлена) CryptoSvc string // состояние службы bj-crypto (systemctl is-active) PGSummary string // куда подключена база bj, без пароля @@ -185,6 +186,8 @@ type WizardData struct { Done struct { License bool Depo bool + Org bool // организация (код участника, ИНН) задана + Quik bool // QUIK МНП проверен (или модуль не в лицензии) Postgres bool Crypto bool Certs bool @@ -253,17 +256,37 @@ func (h *setupHandlers) renderWizard(w http.ResponseWriter, r *http.Request) { progress := wizardProgress() step := progress + 1 if v := r.URL.Query().Get("step"); v != "" { - if n, err := strconv.Atoi(v); err == nil && n >= 1 && n <= 7 { + if n, err := strconv.Atoi(v); err == nil && n >= 1 && n <= wizardSteps { step = n if n-1 > progress { setWizardProgress(n - 1) } } } - if step > 7 { - step = 7 + if step > wizardSteps { + step = wizardSteps } d.Step = step + if step == 4 && strings.TrimSpace(s.Fancy.Server) != "" && (orgCode(s) == "" || orgINN(s) == "") && depoDetectResult() == nil { + // организация ещё не задана, а база DEPO подключена — определяем реквизиты сами: карточка + // покажет их заполненными, пользователю остаётся проверить и сохранить + ctx, cancel := context.WithTimeout(r.Context(), 15*time.Second) + if res, err := depoDetectRequisites(ctx, s.Fancy); err == nil { + lastDepoDetect.mu.Lock() + lastDepoDetect.r = res + lastDepoDetect.mu.Unlock() + d.Suggest = res + } else { + log.Printf("wizard: реквизиты из DEPO не определены: %v", err) + } + cancel() + } + if step >= 3 && step <= 5 { // DEPO, организация, QUIK МНП — общие блоки из «Настройки» + fd := h.setupData(w, r, "") + d.Fancy = &fd + } + d.Done.Org = orgCode(s) != "" && orgINN(s) != "" + d.Done.Quik = !d.DepoLicensed || s.Quik.Verified if step == 3 && d.DepoLicensed && strings.TrimSpace(s.Fancy.Server) != "" { // Есть ли у сервера SQL Agent: у Express его нет, у PostgreSQL — тоже; тогда обработку // запускает сам bj. Иначе по умолчанию джобу SQL Agent создаёт bj. @@ -304,6 +327,10 @@ func depoServerEdition(ctx context.Context, f FancyMSSQLSettings) (string, bool) return ed, eng != 4 } +// wizardSteps — шагов в мастере: 1 лицензия, 2 база bj, 3 учёт DEPO, 4 наша организация, 5 QUIK МНП, +// 6 Валидата, 7 сертификаты, 8 шлюз НРД, 9 проверка. +const wizardSteps = 9 + // wizardProgressFile — номер последнего пройденного шага мастера (переход «Далее» на шаг N // означает, что шаги до N пройдены). const wizardProgressFile = "/var/lib/bj/.bj/wizard-progress" @@ -477,6 +504,11 @@ func HealthLabel(name string) string { } func (h *setupHandlers) renderSetup(w http.ResponseWriter, req *http.Request, flash string) { + render(w, h.tpl.a.setup, h.setupData(w, req, flash)) +} + +// setupData — данные страницы «Настройка»; их же получает общий блок «Обмен Fancy» в мастере. +func (h *setupHandlers) setupData(w http.ResponseWriter, req *http.Request, flash string) SetupData { s := h.rc.Snapshot() r := h.rc.ReadinessSummary() ready := 0 @@ -526,7 +558,7 @@ func (h *setupHandlers) renderSetup(w http.ResponseWriter, req *http.Request, fl if errVal := errMsgFromQuery(_q(w)); errVal != "" { data.Error = errVal } - render(w, h.tpl.a.setup, data) + return data } func (h *setupHandlers) savePostgres(w http.ResponseWriter, r *http.Request) { diff --git a/internal/lkgateway/web/templates/admin_setup.html b/internal/lkgateway/web/templates/admin_setup.html index 1ecb40f..7351661 100644 --- a/internal/lkgateway/web/templates/admin_setup.html +++ b/internal/lkgateway/web/templates/admin_setup.html @@ -6,14 +6,14 @@
- {{if or .AdvancedUnlocked (mod "quik-mnp")}} + {{if mod "quik-mnp"}} {{/* ============ ОБМЕН FANCY (MSSQL) — перспективный модуль ============ */}}

Обмен Fancy (MSSQL / PostgreSQL)

- {{template "verline" (.Versions.Get "depo")}} -
-

Подключение к серверу БД клиента

-

Сервер учётной базы Fancy DEPO: картотека лиц, счета и договоры, остатки, опции (признак квалифицированного инвестора), трансферные таблицы обмена. Поддерживаются Microsoft SQL Server и PostgreSQL. База указывается ниже, в карточке «Трансферные таблицы DEPO».

-
- - - - - - -
-
-
- -
-

Трансферные таблицы DEPO

-

Через эти таблицы bj обменивается с учётной системой DEPO: поручения FTV_M2M и их строки FTV_M2M_LINES, события FTV_M2M_EVENTS, справочник участников НРД FTV_M2M_HANDBOOK. Таблицы создаются в базе DEPO на сервере из подключения выше ({{if .DepoTables.Postgres}}PostgreSQL{{else}}Microsoft SQL Server{{end}}). Создание можно повторять: добавляются только недостающие таблицы, колонки и индексы, данные не меняются.

-
- - - - - -
-
- - {{if eq .Settings.Fancy.DepoTablesMode "auto"}} -
- -
Логин с правами на базу {{.DepoTables.DB}}
- {{if .DepoTables.Postgres}}Владелец базы или суперпользователь.{{else}}Роль db_owner в базе (или db_ddladmin + db_securityadmin).{{end}} Если оставить поля пустыми, bj попробует своим логином {{.DepoTables.User}}.
-
- - -
-
-
- {{else if eq .Settings.Fancy.DepoTablesMode "script"}} -
Скрипт для администратора СУБД — скачать {{.DepoTables.ScriptFile}} -
{{.DepoTables.Script}}
- {{end}} - -
-
- логином bj: таблицы на месте, колонки совпадают, есть права на чтение и запись -
- {{if .Settings.Fancy.DepoTablesCheck}}

{{if .Settings.Fancy.DepoTablesCheckOK}}✓{{else}}✗{{end}} {{.Settings.Fancy.DepoTablesCheck}} ({{.Settings.Fancy.DepoTablesCheckAt.Format "02.01.2006 15:04"}})

{{end}} -
- -
-

Где запускается обработка трансферных таблиц DEPO

-

Поручения и события, которые bj пишет в FTV_M2M*, обрабатывает процедура {{.DepoJob.Proc}} в базе DEPO. Выберите, кто её запускает, выполните инструкцию и нажмите «Проверить готовность» — без зелёной отметки обмен с DEPO работать не будет.

-
- - - - -
- - - -
-

Процедура обработки выполняется от имени пользователя базы DEPO (у разработчика Fancy это SYSDBA). У клиента такого пользователя может не быть или он называется иначе: «Проверить готовность» проверит, что он есть в базе.

-
-
- - {{if eq .Settings.Fancy.DepoJobMode "bj"}} -
Инструкция для администратора SQL клиента — выполнить один раз: -
{{.DepoJob.GrantScript}}
- {{else if eq .Settings.Fancy.DepoJobMode "sql-auto"}} -
Инструкция для администратора SQL клиента — выдать логину bj права оператора SQL Agent (SQL Agent должен быть запущен): -
{{.DepoJob.AgentRights}}
-
- {{else if eq .Settings.Fancy.DepoJobMode "sql-manual"}} -
Инструкция для администратора SQL клиента — создать джобу (SQL Agent должен быть запущен, служебная учётная запись Agent должна иметь право выполнять процедуру): -
{{.DepoJob.AgentScript}}
- {{end}} - - {{if .Settings.Fancy.DepoJobMode}} -
-
- для вариантов с джобой bj пишет служебное событие BJ_PING и ждёт до 40 с, пока обработчик его отметит -
- {{if .Settings.Fancy.DepoJobCheck}}

{{if .Settings.Fancy.DepoJobCheckOK}}✓{{else}}✗{{end}} {{.Settings.Fancy.DepoJobCheck}} ({{.Settings.Fancy.DepoJobCheckAt.Format "02.01.2006 15:04"}})

{{end}} - {{if and (eq .Settings.Fancy.DepoJobMode "bj") .Settings.Fancy.DepoJobLast}}

Последний вызов процедуры — {{.Settings.Fancy.DepoJobLast}}

{{end}} - {{end}} -
+ {{template "fancySection" .}}
{{/* ============ QUIK МНП ============ */}}

QUIK — Модуль неторговых поручений

- {{template "verline" (.Versions.Get "quik-mnp")}} -
-

Подключение к БД МНП QUIK (MSSQL)

-

При выводе бумаг клиентом bj блокирует их количество в QUIK через API Модуля неторговых поручений (хранимые процедуры). БД боевая — проверка только на чтение (версия + наличие M2M-объектов), без записи. Подключение под логином с ролью InstrEu.
- Инструкция для администратора QUIK — что настроить в QuikAdmin для M2M · документы ARQA.

-
- - - - - - - -
- -
-
-
-
-
-

Статус: {{if .Settings.Quik.Verified}}✓ подключение проверено{{else}}не проверено{{end}}

-
- -
-

Автоматический цикл M2M в МНП{{if .Settings.Quik.Emulate}} {{if devOn}}имитация{{else}}остановлен{{end}}{{end}}

-

Что делает bj в Модуле неторговых поручений по ходу перевода: исходящий — при отправке в НРД регистрирует «Вывод ЦБ (M2M)» (QUIK блокирует бумаги), по подтверждению подписывает (списание), по отказу снимает с причиной; входящий — после приёма нашего поручения НРД регистрирует «Ввод ЦБ (M2M)» (зачисление сразу). Каждый шаг виден в карточке перевода и на странице QUIK МНП.

-
- - -{{if devOn}} {{end}} - - - - -
- - -
- -
-
-
- - {{if .Settings.Quik.LastReport}} -
-

Полный ответ сервера (последняя проверка)

-

Можно выделить и скопировать целиком — для отправки коллегам/аутсорсеру QUIK. - {{if not .Settings.Quik.LastAt.IsZero}}Проверка от {{.Settings.Quik.LastAt.Format "02.01.2006 15:04:05"}} UTC.{{end}}

-
- -
-
{{.Settings.Quik.LastReport}}
-
- {{end}} + {{template "quikSection" .}}
{{end}}{{/* /AdvancedUnlocked — конец перспективных модулей Fancy/QUIK */}} @@ -381,12 +202,12 @@ {{/* ============ ЭКСПОРТ БИРЖЕВОЙ ИНФОРМАЦИИ (QUIK) ============ */}} - {{if or .AdvancedUnlocked (mod "quik-export") (mod "npr")}} + {{if or (mod "quik-export") (mod "npr")}}
- {{if or .AdvancedUnlocked (mod "quik-export")}}{{.QuikExport.HTML}}{{end}} + {{if mod "quik-export"}}{{.QuikExport.HTML}}{{end}} {{/* модуль НПР/УДС работает поверх базы экспорта QUIK — его настройки здесь же */}} - {{if or .AdvancedUnlocked (mod "npr")}}
+ {{if mod "npr"}}

Модуль «НПР / УДС» (риск-монитор по данным QUIK)

Показывает НПР1 / НПР2 / УДС клиентов маржинальной торговли по базе экспорта QUIK (схема npr). Отдельно лицензируемый модуль (признак npr); при включении в меню появляется пункт «НПР / УДС». Подключение — логин только для чтения.

{{template "verline" (.Versions.Get "bj-npr")}} @@ -489,70 +310,7 @@

НРД

{{template "verline" (.Versions.Get "ish")}} -
-

Наша организация

-

Депозитарий — участник MOEX МОСТ, от имени которого bj отправляет и принимает переводы: ИНН передающего и зачисляющего депозитария в пакетах, код отправителя и код фирмы в QUIK. Выберите себя из справочника участников НРД или введите данные вручную.

- {{if and .OrgINN .OrgCode}}

{{if .OrgName}}{{.OrgName}}{{else}}—{{end}} · ИНН {{.OrgINN}} · код {{.OrgCode}}{{if not .Settings.NSD.OrgINN}} (ИНН взят из справочника по коду){{end}}

- {{else}}

Организация не задана — переводы не будут сформированы.

{{end}} -
- - -
-
- - - {{if not .Participants}}Справочник участников ещё не получен — запросите его в «Диагностике» или введите данные вручную.{{end}} - - - - - - - {{if .Suggest}}{{if .Suggest.OrgName}}Из DEPO: {{.Suggest.OrgName}}, ИНН {{.Suggest.OrgINN}}, код {{.Suggest.OrgCode}} — подставлено в пустые поля.{{end}}{{end}} -
-
-
+ {{template "orgSection" .}}

Автоматический режим M2M

Без участия оператора, чтобы соблюдать сроки: ответ на входящие переводы по свежей сверке с DEPO (пакет принимается только целиком; бумага для квалифицированных инвесторов при неполной или непрочитанной квалификации клиента — отказ M2M08), подача поручения 16/1, как только НРД пришлёт черновик после нашего согласия, и подача поручения 16 по исходящим после согласия контрагента. Если DEPO или ИШ недоступны — bj повторяет каждые 3 минуты и шлёт оповещение; без сверки ничего не принимается. Обрабатывается только то, что пришло не раньше чем за сутки до включения. Кнопки в карточках остаются для ручной работы.

@@ -625,7 +383,7 @@ function hbBind(inp,box,list,onPick){ {{/* ============ ЛИЧНЫЙ КАБИНЕТ ============ */}} {{/* ============ КАБИНЕТ КЛИЕНТА (наш модуль bj-lk) ============ */}} - {{if or .AdvancedUnlocked (mod "web-cabinet")}} + {{if mod "web-cabinet"}}

Кабинет клиента

Наш личный кабинет для клиентов депозитария: модуль bj-lk на своём сервере или PHP-хостинге, связь с ядром, учётные записи клиентов и сотрудников. Интеграция с платформой ЕСИА Финанс — отдельный раздел.

@@ -796,6 +554,7 @@ function hbBind(inp,box,list,onPick){ {{end}} {{/* ============ ЕСИА ФИНАНС (внешняя платформа ЛК) ============ */}} + {{if mod "esia-finance"}}

ЕСИА Финанс

Интеграция с внешней платформой личного кабинета ЕСИА Финанс: адрес для клиента, приём заявок M2M, возврат статуса и подключение к API (тест/бой). Наш собственный кабинет настраивается в разделе «Кабинет клиента».

@@ -924,6 +683,7 @@ function hbBind(inp,box,list,onPick){

Итог (сколько получено / отправлено, ошибки) появится вверху страницы.

+ {{end}} {{/* ============ ДИАГНОСТИКА (id sec-tests сохранён для ссылок) ============ */}}
@@ -1208,10 +968,10 @@ function hbBind(inp,box,list,onPick){
Сейчас в отчётах:
- логотип + {{if logoSrc .Settings.Branding.LogoDataURI}}логотип{{else}}логотип не загружен{{end}}
- {{if .Settings.Branding.LogoDataURI}}Загружен свой логотип{{if .Settings.Branding.LogoName}}: {{.Settings.Branding.LogoName}}{{end}}.{{else}}Используется стандартный (встроенный) логотип.{{end}} + {{if .Settings.Branding.LogoDataURI}}Загружен свой логотип{{if .Settings.Branding.LogoName}}: {{.Settings.Branding.LogoName}}{{end}}.{{else}}Свой логотип не загружен — в шапке отчётов справа пусто.{{end}}
@@ -1222,8 +982,8 @@ function hbBind(inp,box,list,onPick){

Форматы: PNG, JPG, GIF, WEBP, SVG. Максимум 512 КБ. Рекомендуется горизонтальный логотип (высота в шапке — 28px).

{{if .Settings.Branding.LogoDataURI}} -
- + +
{{end}}
@@ -1293,4 +1053,3 @@ function hbBind(inp,box,list,onPick){ })(); {{end}} -{{define "verline"}}{{if .Title}}

{{.Title}}: {{if .Version}}{{.Version}}{{else}}не определена{{end}}{{with .Detail}} · {{.}}{{end}}{{with .Err}} · {{.}}{{end}}

{{end}}{{end}} diff --git a/internal/lkgateway/web/templates/admin_wizard.html b/internal/lkgateway/web/templates/admin_wizard.html index fc3038a..c86fed8 100644 --- a/internal/lkgateway/web/templates/admin_wizard.html +++ b/internal/lkgateway/web/templates/admin_wizard.html @@ -32,10 +32,12 @@ a.wstep:hover .bub { box-shadow:0 0 0 4px var(--accent-weak); } {{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 .Done.Org}}✓{{else}}4{{end}}Организация + {{if .Done.Quik}}✓{{else}}5{{end}}QUIK МНП + {{if .Done.Crypto}}✓{{else}}6{{end}}Валидата + {{if .Done.Certs}}✓{{else}}7{{end}}Сертификаты + {{if .Done.NSD}}✓{{else}}8{{end}}Шлюз НРД + {{if .Done.TestRun}}✓{{else}}9{{end}}Проверка

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

@@ -88,83 +90,14 @@ a.wstep:hover .bub { box-shadow:0 0 0 4px var(--accent-weak); }

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

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

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

{{else}} -

Три части: подключение к базе, трансферные таблицы обмена, обработка (job), которая превращает записи bj в документы DEPO.

- -

1. Подключение к базе DEPO {{if .Settings.Fancy.Server}}✓ {{.Settings.Fancy.Server}}{{end}}

-
- -
-
-
-
-
- -
- {{if .Settings.Fancy.Server}}{{end}}
-
- {{if .Settings.Fancy.Server}} - {{$btn2 := "background:var(--card);color:var(--text);border:1px solid var(--border-strong,#c9cdd8)"}} -

2. Трансферные таблицы FTV_M2M {{if .Settings.Fancy.DepoTablesCheckOK}}✓ на месте{{end}}

-
Что это. Четыре таблицы в базе DEPO, через которые идёт обмен: поручения FTV_M2M и их строки, события FTV_M2M_EVENTS, справочник участников НРД. Данные учёта они не трогают; создание можно повторять — добавляется только недостающее.
-
- - - - - -
- {{if not .Settings.Fancy.DepoTablesCheckOK}} -
- -

Создать таблицы в базе {{.DepoTables.DB}}. Логин администратора СУБД ({{if .DepoTables.Postgres}}владелец базы{{else}}db_owner в базе или sa{{end}}) нужен один раз и не сохраняется; bj заодно выдаст права своему логину {{.DepoTables.User}}. Пусто — попробовать логином bj.

-
- - -
-
или скачать скрипт для администратора
-
- {{end}} -
- {{if .Settings.Fancy.DepoTablesCheck}}

{{if .Settings.Fancy.DepoTablesCheckOK}}✓{{else}}✗{{end}} {{.Settings.Fancy.DepoTablesCheck}}

{{end}} - -

3. Обработка обмена (job) {{if .Settings.Fancy.DepoJobCheckOK}}✓ работает{{end}}

-
Что это. Процедура {{.DepoJob.Proc}} в базе DEPO каждые {{.DepoJob.Every}} с забирает записи bj из трансферных таблиц и создаёт по ним документы и операции DEPO. Кто-то должен её запускать.
- {{if .DepoEdition}}Ваш сервер: {{.DepoEdition}} — {{if .DepoAgent}}есть SQL Server Agent, рекомендуем джобу Agent, её создаст bj.{{else}}редакция без SQL Server Agent, процедуру будет запускать сам bj.{{end}}{{else if .DepoTables.Postgres}}Ваш сервер: PostgreSQL — процедуру будет запускать сам bj.{{end}}
- {{$mode := .Settings.Fancy.DepoJobMode}}{{if not $mode}}{{$mode = .DepoJobDef}}{{end}} -
- - - - - {{if not .DepoTables.Postgres}}{{end}} - - {{if not .DepoTables.Postgres}}{{end}} -
-
- {{if eq .Settings.Fancy.DepoJobMode "sql-auto"}} -
- -

Создать джобу {{.DepoJob.Name}}. Логин администратора SQL (sysadmin, например sa) нужен один раз и не сохраняется. SQL Server Agent должен быть запущен.

-
- - -
-
-
- {{else if eq .Settings.Fancy.DepoJobMode "bj"}} -

Администратору SQL — выполнить один раз:

{{.DepoJob.GrantScript}}
- {{else if eq .Settings.Fancy.DepoJobMode "sql-manual"}} -

Скрипт для администратора SQL:

{{.DepoJob.AgentScript}}
- {{end}} - {{if .Settings.Fancy.DepoJobMode}} -
bj кладёт служебное событие и ждёт до 40 с, пока его обработают
- {{if .Settings.Fancy.DepoJobCheck}}

{{if .Settings.Fancy.DepoJobCheckOK}}✓{{else}}✗{{end}} {{.Settings.Fancy.DepoJobCheck}}

{{end}} - {{end}} - {{end}} +

Это тот же раздел, что «Настройка → Обмен Fancy»: подключение к базе, трансферные таблицы и обработка (job). Что настроите здесь — сразу там, и наоборот.

+ {{if .DepoEdition}}

Ваш SQL Server: {{.DepoEdition}} — {{if .DepoAgent}}есть SQL Server Agent: рекомендуем джобу Agent, её создаст bj (способ по умолчанию).{{else}}без SQL Server Agent: обработку будет запускать сам bj.{{end}}

{{end}} + {{with .Fancy}}
{{template "fancySection" .}}
{{end}} {{end}}
← К шагу 2 @@ -211,10 +144,51 @@ a.wstep:hover .bub { box-shadow:0 0 0 4px var(--accent-weak); }
{{end}} -{{/* ============= ШАГ 2: Крипто (Валидата) ============= */}} +{{/* ============= ШАГ 4: Наша организация ============= */}} {{if eq .Step 4}}
-

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

+

Шаг 4. Наша организация

+
Что это. Депозитарий — участник MOEX МОСТ, от имени которого bj отправляет и принимает переводы: код участника, ИНН и наименование попадают в пакеты НРД и в поручения QUIK.
+ Откуда взять. Если на шаге 3 подключена база DEPO, bj сам определяет реквизиты по учёту — проверьте их и сохраните. Иначе выберите себя из справочника участников НРД или введите вручную.
+ {{if .Suggest}}{{if .Suggest.OrgName}}{{if not .Done.Org}}

✓ Определено из DEPO: {{.Suggest.OrgName}}, ИНН {{.Suggest.OrgINN}}, код {{.Suggest.OrgCode}}{{if .Suggest.AccountID}}, счёт НРД {{.Suggest.AccountID}}{{end}}. Поля ниже заполнены — проверьте и нажмите «Сохранить».

{{end}}{{end}}{{end}} + {{with .Fancy}}{{template "orgSection" .}}{{end}} +
+

Логотип организации (необязательно)

+

Показывается справа в шапке отчётов для регулятора. Можно загрузить сейчас или позже в «Настройка → Оформление».

+ {{if .Settings.Branding.LogoDataURI}}

логотип

{{end}} +
+ + + +
+
+
+ ← К шагу 3 + {{if .Done.Org}}К шагу 5 →{{else}}Пропустить →{{end}} +
+
+{{end}} + +{{/* ============= ШАГ 5: QUIK МНП ============= */}} +{{if eq .Step 5}} +
+

Шаг 5. QUIK — модуль неторговых поручений

+
Что это. Модуль неторговых поручений QUIK (МНП) — продукт компании ARQA Technologies, разработчика QUIK. Через него bj блокирует бумаги клиента в QUIK на время перевода, снимает блокировку при отказе и после исполнения проводит поручение.
+ Если МНП у вас ещё нет. Обратитесь в ARQA Technologies (arqatech.com, служба поддержки QUIK) и попросите подключить модуль неторговых поручений для работы с внешней системой. После подключения ARQA выдаст адрес сервера МНП и учётные данные — их и нужно ввести ниже.
+ Если МНП уже есть. Адрес сервера и учётные данные — у вашего администратора QUIK.
+ {{if not .DepoLicensed}}

Модуль неторговых поручений не входит в текущую лицензию — шаг пропускается.

+ {{else}}{{with .Fancy}}{{template "quikSection" .}}{{end}}{{end}} +
+ ← К шагу 4 + {{if .Done.Quik}}К шагу 6 →{{else}}Пропустить →{{end}} +
+
+{{end}} + +{{/* ============= ШАГ 2: Крипто (Валидата) ============= */}} +{{if eq .Step 6}} +
+

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

СКЗИ «Валидата Клиент L» проверяет подписи НРД на квитанциях и сообщениях и нужно для работы с ключами и сертификатами (шаг 5).

{{if .ValidataVer}}

✓ Валидата установлена вместе с bj: версия {{.ValidataVer}}, каталог /opt/Validata/VDCSP. Ничего настраивать на этом шаге не нужно.

@@ -231,20 +205,21 @@ a.wstep:hover .bub { box-shadow:0 0 0 4px var(--accent-weak); } {{end}}
- ← К шагу 3 - {{if .Done.Crypto}}К шагу 5 →{{else}}Пропустить →{{end}} + ← К шагу 5 + {{if .Done.Crypto}}К шагу 7 →{{else}}Пропустить →{{end}}
{{end}} {{/* ============= ШАГ 3: Сертификаты ============= */}} -{{if eq .Step 5}} +{{if eq .Step 7}}
-

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

+

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

Здесь две части: ключ и сертификат вашей организации (ставите вы) и сертификаты НРД и удостоверяющих центров (bj ведёт их сам).

1. Ключ и сертификат организации

-
Что это. Ключ ЭП, которым подписываются сообщения в НРД, и его сертификат (выдаёт УЦ Московской биржи). Архив ключа с паролем вам передаёт НРД/УЦ.
+
Что это. Ключ электронной подписи вашей организации для обмена с НРД и его сертификат.
+ К кому обратиться. Ключ выдаёт Удостоверяющий центр Московской биржи; оформляется по заявке в рамках подключения к электронному документообороту НРД. Вам передадут архив ключа и пароль к нему — его и загружают в мастере установки ключа.
Как поставить. Мастер установки ключа: загрузить архив → запись на носитель → справочник сертификатов → проверка подписи Валидатой.
Открыть мастер установки ключа → @@ -279,21 +254,21 @@ a.wstep:hover .bub { box-shadow:0 0 0 4px var(--accent-weak); } {{end}}
{{end}} {{/* ============= ШАГ 4: НРД ============= */}} -{{if eq .Step 6}} +{{if eq .Step 8}}
-

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

+

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

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

Что это? Интеграционный шлюз (ИШ) НРД — это компонент, через который наши M2M-сообщения отправляются в НРД. {{if devOn}}У НРД есть 4 контура: GUEST (для разработки) и TEST3 (предпродакшен), каждый в варианте ГОСТ или RSA.{{else}}У НРД есть тестовый контур (TEST3) и боевой контур, каждый в варианте ГОСТ или RSA.{{end}}
- Где взять? Дистрибутив ИШ и инструкции — на сайте НРД nsd.ru/workflow/system/programs/. Доступ к тестовым контурам выдаётся НРД по заявке (см. DOC/instr_podkl_stend_v3.pdf). + К кому обратиться. Программу ИШ выпускает НРД (дистрибутив и инструкции — nsd.ru/workflow/system/programs). Доступ к контурам НРД (сначала тестовый TEST3, затем боевой) выдаёт НРД по заявке: обратитесь к вашему менеджеру НРД или в клиентскую поддержку по электронному документообороту. НРД сообщит ваш депозитарный код, счёт и раздел — если учёт в DEPO подключён, bj подставит их сам.
@@ -324,14 +299,7 @@ a.wstep:hover .bub { box-shadow:0 0 0 4px var(--accent-weak); }
- {{if .Suggest}}{{if .Suggest.OrgName}}
-

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

- -
-
-
- -
{{end}}{{end}} +

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

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

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

+

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

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

@@ -379,7 +347,7 @@ a.wstep:hover .bub { box-shadow:0 0 0 4px var(--accent-weak); } {{end}} {{else}} -

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

+

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

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

Открыть проверку подключений → {{end}} @@ -394,7 +362,7 @@ a.wstep:hover .bub { box-shadow:0 0 0 4px var(--accent-weak); }
diff --git a/internal/lkgateway/web/templates/part_fancy.html b/internal/lkgateway/web/templates/part_fancy.html new file mode 100644 index 0000000..d5bedfc --- /dev/null +++ b/internal/lkgateway/web/templates/part_fancy.html @@ -0,0 +1,116 @@ +{{/* Раздел «Обмен Fancy» — один и тот же в «Настройка → Обмен Fancy» и на шаге 3 мастера + настройки (данные — SetupData). Правки — только здесь. */}} +{{define "fancySection"}} + {{template "verline" (.Versions.Get "depo")}} +
+

Подключение к серверу БД клиента

+

Сервер учётной базы Fancy DEPO: картотека лиц, счета и договоры, остатки, опции (признак квалифицированного инвестора), трансферные таблицы обмена. Поддерживаются Microsoft SQL Server и PostgreSQL. База указывается ниже, в карточке «Трансферные таблицы DEPO».

+
+ + + + + + +
+
+
+ +
+

Трансферные таблицы DEPO

+

Через эти таблицы bj обменивается с учётной системой DEPO: поручения FTV_M2M и их строки FTV_M2M_LINES, события FTV_M2M_EVENTS, справочник участников НРД FTV_M2M_HANDBOOK. Таблицы создаются в базе DEPO на сервере из подключения выше ({{if .DepoTables.Postgres}}PostgreSQL{{else}}Microsoft SQL Server{{end}}). Создание можно повторять: добавляются только недостающие таблицы, колонки и индексы, данные не меняются.

+
+ + + + + +
+
+ + {{if eq .Settings.Fancy.DepoTablesMode "auto"}} +
+ +
Логин с правами на базу {{.DepoTables.DB}}
+ {{if .DepoTables.Postgres}}Владелец базы или суперпользователь.{{else}}Роль db_owner в базе (или db_ddladmin + db_securityadmin).{{end}} Если оставить поля пустыми, bj попробует своим логином {{.DepoTables.User}}.
+
+ + +
+
+
+ {{else if eq .Settings.Fancy.DepoTablesMode "script"}} +
Скрипт для администратора СУБД — скачать {{.DepoTables.ScriptFile}} +
{{.DepoTables.Script}}
+ {{end}} + +
+
+ логином bj: таблицы на месте, колонки совпадают, есть права на чтение и запись +
+ {{if .Settings.Fancy.DepoTablesCheck}}

{{if .Settings.Fancy.DepoTablesCheckOK}}✓{{else}}✗{{end}} {{.Settings.Fancy.DepoTablesCheck}} ({{.Settings.Fancy.DepoTablesCheckAt.Format "02.01.2006 15:04"}})

{{end}} +
+ +
+

Где запускается обработка трансферных таблиц DEPO

+

Поручения и события, которые bj пишет в FTV_M2M*, обрабатывает процедура {{.DepoJob.Proc}} в базе DEPO. Выберите, кто её запускает, выполните инструкцию и нажмите «Проверить готовность» — без зелёной отметки обмен с DEPO работать не будет.

+
+ + + + +
+ + + +
+

Процедура обработки выполняется от имени пользователя базы DEPO (у разработчика Fancy это SYSDBA). У клиента такого пользователя может не быть или он называется иначе: «Проверить готовность» проверит, что он есть в базе.

+
+
+ + {{if eq .Settings.Fancy.DepoJobMode "bj"}} +
Инструкция для администратора SQL клиента — выполнить один раз: +
{{.DepoJob.GrantScript}}
+ {{else if eq .Settings.Fancy.DepoJobMode "sql-auto"}} +
+ +
Создать джобу {{.DepoJob.Name}} — SQL Server Agent должен быть запущен. Логин администратора SQL (sysadmin, например sa) используется один раз и не сохраняется; пусто — bj попробует своим логином.
+
+ + +
+
+
+
Без логина администратора: выдать логину bj роль оператора SQL Agent (скрипт) +
{{.DepoJob.AgentRights}}
+ {{else if eq .Settings.Fancy.DepoJobMode "sql-manual"}} +
Инструкция для администратора SQL клиента — создать джобу (SQL Agent должен быть запущен, служебная учётная запись Agent должна иметь право выполнять процедуру): +
{{.DepoJob.AgentScript}}
+ {{end}} + + {{if .Settings.Fancy.DepoJobMode}} +
+
+ для вариантов с джобой bj пишет служебное событие BJ_PING и ждёт до 40 с, пока обработчик его отметит +
+ {{if .Settings.Fancy.DepoJobCheck}}

{{if .Settings.Fancy.DepoJobCheckOK}}✓{{else}}✗{{end}} {{.Settings.Fancy.DepoJobCheck}} ({{.Settings.Fancy.DepoJobCheckAt.Format "02.01.2006 15:04"}})

{{end}} + {{if and (eq .Settings.Fancy.DepoJobMode "bj") .Settings.Fancy.DepoJobLast}}

Последний вызов процедуры — {{.Settings.Fancy.DepoJobLast}}

{{end}} + {{end}} +
+{{end}} + +{{define "verline"}}{{if .Title}}

{{.Title}}: {{if .Version}}{{.Version}}{{else}}не определена{{end}}{{with .Detail}} · {{.}}{{end}}{{with .Err}} · {{.}}{{end}}

{{end}}{{end}} diff --git a/internal/lkgateway/web/templates/part_org.html b/internal/lkgateway/web/templates/part_org.html new file mode 100644 index 0000000..7d2a8b3 --- /dev/null +++ b/internal/lkgateway/web/templates/part_org.html @@ -0,0 +1,67 @@ +{{/* «Наша организация» — одна и та же в «Настройка → НРД» и в мастере настройки (данные — SetupData). */}} +{{define "orgSection"}} +
+

Наша организация

+

Депозитарий — участник MOEX МОСТ, от имени которого bj отправляет и принимает переводы: ИНН передающего и зачисляющего депозитария в пакетах, код отправителя и код фирмы в QUIK. Выберите себя из справочника участников НРД или введите данные вручную.

+ {{if and .OrgINN .OrgCode}}

{{if .OrgName}}{{.OrgName}}{{else}}—{{end}} · ИНН {{.OrgINN}} · код {{.OrgCode}}{{if not .Settings.NSD.OrgINN}} (ИНН взят из справочника по коду){{end}}

+ {{else}}

Организация не задана — переводы не будут сформированы.

{{end}} +
+ + +
+
+ + + {{if not .Participants}}Справочник участников ещё не получен — запросите его в «Диагностике» или введите данные вручную.{{end}} + + + + + + + {{if .Suggest}}{{if .Suggest.OrgName}}Из DEPO: {{.Suggest.OrgName}}, ИНН {{.Suggest.OrgINN}}, код {{.Suggest.OrgCode}} — подставлено в пустые поля.{{end}}{{end}} +
+
+
+{{end}} diff --git a/internal/lkgateway/web/templates/part_quik.html b/internal/lkgateway/web/templates/part_quik.html new file mode 100644 index 0000000..4f8ea66 --- /dev/null +++ b/internal/lkgateway/web/templates/part_quik.html @@ -0,0 +1,82 @@ +{{/* «QUIK — модуль неторговых поручений» — один и тот же в настройках и в мастере (данные — SetupData). */}} +{{define "quikSection"}} + {{template "verline" (.Versions.Get "quik-mnp")}} +
+

Подключение к БД МНП QUIK (MSSQL)

+

При выводе бумаг клиентом bj блокирует их количество в QUIK через API Модуля неторговых поручений (хранимые процедуры). БД боевая — проверка только на чтение (версия + наличие M2M-объектов), без записи. Подключение под логином с ролью InstrEu.
+ Инструкция для администратора QUIK — что настроить в QuikAdmin для M2M · документы ARQA.

+
+ + + + + + + +
+ +
+
+
+
+
+

Статус: {{if .Settings.Quik.Verified}}✓ подключение проверено{{else}}не проверено{{end}}

+
+ +
+

Автоматический цикл M2M в МНП{{if .Settings.Quik.Emulate}} {{if devOn}}имитация{{else}}остановлен{{end}}{{end}}

+

Что делает bj в Модуле неторговых поручений по ходу перевода: исходящий — при отправке в НРД регистрирует «Вывод ЦБ (M2M)» (QUIK блокирует бумаги), по подтверждению подписывает (списание), по отказу снимает с причиной; входящий — после приёма нашего поручения НРД регистрирует «Ввод ЦБ (M2M)» (зачисление сразу). Каждый шаг виден в карточке перевода и на странице QUIK МНП.

+
+ + +{{if devOn}} {{end}} + + + + +
+ + +
+ +
+
+
+ + {{if .Settings.Quik.LastReport}} +
+

Полный ответ сервера (последняя проверка)

+

Можно выделить и скопировать целиком — для отправки коллегам/аутсорсеру QUIK. + {{if not .Settings.Quik.LastAt.IsZero}}Проверка от {{.Settings.Quik.LastAt.Format "02.01.2006 15:04:05"}} UTC.{{end}}

+
+ +
+
{{.Settings.Quik.LastReport}}
+
+ {{end}} +{{end}}