diff --git a/internal/lkgateway/participant_form.go b/internal/lkgateway/participant_form.go index b0a95bc..73d73cf 100644 --- a/internal/lkgateway/participant_form.go +++ b/internal/lkgateway/participant_form.go @@ -5,10 +5,12 @@ package lkgateway // участников M2M, иначе сервис МОСТ отбивает запросы кодом M2M14 «Код ЭДО НРД // отправителя отсутствует в справочнике участников M2M». Здесь bj формирует // заполненную анкету (предзаполнение из автоопределения DEPO), даёт проверить -// (валидация + показ XML в windows-1251) и предлагает отправить её в НРД обычным -// каналом — письмом на M2MOST@nsd.ru с вложением (не через M2M-шлюз). +// (валидация + показ XML в windows-1251) и отправляет её в НРД: в боевом контуре — +// через ИШ пакетом #M2MPF (businessLine=MOST, подпись боевым контейнером на стороне +// ИШ), либо запасным каналом — письмом на M2MOST@nsd.ru с вложением. import ( + "context" "encoding/base64" "fmt" "html" @@ -18,6 +20,8 @@ import ( "time" "git.zetit.ru/zuevav/Bridge-and-Join-s/internal/m2m" + "git.zetit.ru/zuevav/Bridge-and-Join-s/internal/nsdadapter" + "git.zetit.ru/zuevav/Bridge-and-Join-s/internal/nsdadapter/igw" "git.zetit.ru/zuevav/Bridge-and-Join-s/internal/nsdxml" ) @@ -215,7 +219,7 @@ func sendSMTPAttach(s SMTPSettings, subject, body, filename string, attach []byt // registerParticipantForm — страница «Регистрация участника M2M»: форма, проверка, // скачивание анкеты, отправка письмом на M2MOST@nsd.ru. -func registerParticipantForm(mux *http.ServeMux, rc *RuntimeConfig) { +func registerParticipantForm(mux *http.ServeMux, rc *RuntimeConfig, igwClient *igw.Client, igwChannel string) { mux.HandleFunc("/admin/setup/participant-form", func(w http.ResponseWriter, r *http.Request) { d := participantFormPrefill(rc) action := "" @@ -277,12 +281,41 @@ func registerParticipantForm(mux *http.ServeMux, rc *RuntimeConfig) { } } + if action == "send_igw" { + switch { + case len(errs) > 0: + flash, flashKind = "Анкета не прошла проверку — исправьте поля ниже.", "err" + case igwClient == nil || igwChannel == "": + flash, flashKind = "Боевой ИШ не настроен (раздел «НРД», профиль prod-*). Отправка через шлюз недоступна — переключитесь в боевой контур.", "err" + default: + body, encErr := participantFormBytes(d) + if encErr != nil { + flash, flashKind = "кодировка windows-1251: "+encErr.Error(), "err" + break + } + pkg, _ := nsdadapter.RouteToPackageType(nsdadapter.KindParticipantForm) + zipBody, zErr := igw.PackXML(body, "M2MTransferParticipantForm.xml", string(pkg)) + if zErr != nil { + flash, flashKind = "упаковка пакета: "+zErr.Error(), "err" + break + } + ctx, cancel := context.WithTimeout(r.Context(), 20*time.Second) + id, sErr := igwClient.SendPackage(ctx, igwChannel, string(pkg), zipBody) + cancel() + if sErr != nil { + flash, flashKind = "отправка через ИШ не удалась: "+sErr.Error(), "err" + break + } + flash, flashKind = "Анкета отправлена через ИШ ("+string(pkg)+", пакет id="+id+"). Ждём подтверждения регистрации от НРД.", "ok" + } + } + xmlPreview := participantFormXML(d) - participantFormRender(w, d, errs, action, flash, flashKind, xmlPreview) + participantFormRender(w, d, errs, action, flash, flashKind, xmlPreview, igwClient != nil && igwChannel != "") }) } -func participantFormRender(w http.ResponseWriter, d participantFormData, errs []string, action, flash, flashKind, xmlPreview string) { +func participantFormRender(w http.ResponseWriter, d participantFormData, errs []string, action, flash, flashKind, xmlPreview string, igwReady bool) { w.Header().Set("Content-Type", "text/html; charset=utf-8") inp := func(name, label, val, ph string) string { return `` @@ -301,6 +334,11 @@ func participantFormRender(w http.ResponseWriter, d participantFormData, errs [] } flashHTML = `
Боевой ИШ: настроен — анкету можно отправить через шлюз (#M2MPF).
` + if !igwReady { + igwStatus = `Боевой ИШ: не настроен (раздел «НРД», профиль prod-*). Пока доступны «Скачать» и «Отправить письмом».
Требование НРД при подключении: зарегистрировать организацию в справочнике участников M2M.
-Без регистрации сервис отбивает запросы кодом M2M14. Отправляется обычным каналом — письмом
-на ` + participantFormRecipient + ` с вложенной анкетой (не через M2M-шлюз). Поля предзаполнены
-из автоопределения DEPO — проверьте юридические реквизиты.
#M2MPF (businessLine=MOST, подпись боевым контейнером на стороне ИШ); письмо на
+` + participantFormRecipient + ` оставлено запасным каналом. Поля предзаполнены из
+автоопределения DEPO — проверьте юридические реквизиты.
` + flashHTML + vErr + `