From e774fc8989bef7637a9ea38cffa2040bf6b6aa16 Mon Sep 17 00:00:00 2001 From: fontvielle Date: Wed, 21 Oct 2026 16:27:14 +0300 Subject: [PATCH] =?UTF-8?q?=D0=90=D0=BD=D0=BA=D0=B5=D1=82=D0=B0=20=D1=83?= =?UTF-8?q?=D1=87=D0=B0=D1=81=D1=82=D0=BD=D0=B8=D0=BA=D0=B0=20M2M:=20?= =?UTF-8?q?=D1=81=D1=81=D1=8B=D0=BB=D0=BA=D0=B0=20=D0=B2=20=D1=80=D0=B0?= =?UTF-8?q?=D0=B7=D0=B4=D0=B5=D0=BB=D0=B5=20=D0=9D=D0=A0=D0=94=20+=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B5=D0=B4=D0=B7=D0=B0=D0=BF=D0=BE=D0=BB=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BF=D0=BE=20=D1=84=D0=B8=D1=80?= =?UTF-8?q?=D0=BC=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - В «Настройка → НРД» добавлена карточка «Регистрация участника M2M» со ссылкой на /admin/setup/participant-form (раньше страница была только по URL). - participantFormPrefill теперь заполняет анкету по реквизитам фирмы, а не только из автоопределения DEPO: берёт ИНН/коды из настроек НРД и наименования (полное/сокращённое/отображаемое/англ.) из справочника участников НРД (по MC-коду, затем по ИНН); DisplayName/Short подставляются, если пусты. - org.go: добавлен handbookByINN. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn --- deploy/release/component-versions.json | 4 +- internal/lkgateway/org.go | 14 ++++++ internal/lkgateway/participant_form.go | 44 ++++++++++++++++++- .../lkgateway/web/templates/admin_setup.html | 5 +++ 4 files changed, 63 insertions(+), 4 deletions(-) diff --git a/deploy/release/component-versions.json b/deploy/release/component-versions.json index 32816c0..a16fedf 100644 --- a/deploy/release/component-versions.json +++ b/deploy/release/component-versions.json @@ -20,8 +20,8 @@ "version": "2026.10.21.6" }, "bj-server": { - "fingerprint": "feab9bc0b3c4d7008e579ba559301cde5ccb2571beee27d8d5f9bc535c462e51", - "version": "2026.10.21.7" + "fingerprint": "f519a86230ac6521f1e1623c4daa56d3eb6791fabf951e28fb1a89e825d02bd9", + "version": "2026.10.21.8" }, "crypto-service.jar": { "fingerprint": "2c4fd536bc9b1c20c69a70e8dcd374a61847b263aeb2e474c45debb01fbd8233", diff --git a/internal/lkgateway/org.go b/internal/lkgateway/org.go index 7961d44..72d5e76 100644 --- a/internal/lkgateway/org.go +++ b/internal/lkgateway/org.go @@ -34,6 +34,20 @@ func handbookParticipants() []HandbookEntry { return out } +// handbookByINN — участник справочника по ИНН (первый не-"place"). +func handbookByINN(inn string) (HandbookEntry, bool) { + inn = strings.TrimSpace(inn) + if inn == "" { + return HandbookEntry{}, false + } + for _, p := range handbookParticipants() { + if p.INN == inn { + return p, true + } + } + return HandbookEntry{}, false +} + // handbookByCode — участник по MC-коду. func handbookByCode(code string) (HandbookEntry, bool) { code = strings.ToUpper(strings.TrimSpace(code)) diff --git a/internal/lkgateway/participant_form.go b/internal/lkgateway/participant_form.go index d12aa6c..62b20fb 100644 --- a/internal/lkgateway/participant_form.go +++ b/internal/lkgateway/participant_form.go @@ -63,8 +63,48 @@ func participantFormPrefill(rc *RuntimeConfig) participantFormData { d.DepoCode = strings.TrimSpace(r.DeponentCode) } } - if d.DepoCode == "" && rc != nil { - d.DepoCode = strings.TrimSpace(rc.Snapshot().NSD.DeponentCode) + if rc != nil { + s := rc.Snapshot() + // Реквизиты нашей организации из настроек НРД и справочника участников — + // заполняем то, чего не дало автоопределение DEPO. + if d.INN == "" { + d.INN = orgINN(s) + } + if d.DepoCode == "" { + d.DepoCode = strings.ToUpper(strings.TrimSpace(pick(s.NSD.DeponentCode, s.NSD.OrgCode))) + } + // Карточка нашей фирмы в справочнике участников НРД: по MC-коду, затем по ИНН. + hb, ok := handbookByCode(orgCode(s)) + if !ok && d.INN != "" { + hb, ok = handbookByINN(d.INN) + } + if ok { + if d.FullName == "" { + d.FullName = strings.TrimSpace(pick(hb.FullName, hb.Name)) + } + if d.ShortName == "" { + d.ShortName = strings.TrimSpace(hb.Name) + } + if d.DisplayName == "" { + d.DisplayName = strings.TrimSpace(pick(hb.DisplayName, hb.Name)) + } + if d.EngFull == "" { + d.EngFull = strings.TrimSpace(hb.EngName) + } + if hb.Kind == "broker" && d.BrokerCode == "" { + d.BrokerCode = strings.ToUpper(strings.TrimSpace(hb.Code)) + } + } + if d.FullName == "" { + d.FullName = strings.TrimSpace(s.NSD.OrgName) + } + } + // DisplayName/Short обязательны в анкете — подставим из того, что есть. + if d.DisplayName == "" { + d.DisplayName = strings.TrimSpace(pick(d.ShortName, d.FullName)) + } + if d.ShortName == "" { + d.ShortName = strings.TrimSpace(pick(d.DisplayName, d.FullName)) } return d } diff --git a/internal/lkgateway/web/templates/admin_setup.html b/internal/lkgateway/web/templates/admin_setup.html index e1c5a77..fc1be4f 100644 --- a/internal/lkgateway/web/templates/admin_setup.html +++ b/internal/lkgateway/web/templates/admin_setup.html @@ -360,6 +360,11 @@

bj сам ставит и настраивает интеграционный шлюз НРД на этом сервере: контуры TEST3 и боевой, переключение между ними, доступ к папкам шлюза по сети.

{{template "igateInstall" .}} +
+

Регистрация участника M2M

+

Анкета участника M2MTransferParticipantForm — НРД требует её перед работой: без регистрации сервис МОСТ отбивает запросы кодом M2M14. bj заполняет анкету по реквизитам фирмы (настройки НРД и справочник участников), даёт проверить и показывает XML, затем отправляет в боевой контур через ИШ (пакет #M2MPF) или письмом на M2MOST@nsd.ru.

+ Открыть анкету участника → +
Расширенные настройкишлюз вручную: контур, адрес веб-сервиса, ключевой контейнер, версия ИШ — обычно bj задаёт их сам