Требование НРД при подключении: зарегистрировать организацию в справочнике участников M2M.
+Без регистрации сервис отбивает запросы кодом M2M14. Отправляется обычным каналом — письмом
+на ` + participantFormRecipient + ` с вложенной анкетой (не через M2M-шлюз). Поля предзаполнены
+из автоопределения DEPO — проверьте юридические реквизиты.
+` + flashHTML + vErr + `
+
+
Предпросмотр анкеты (windows-1251)
+
` + html.EscapeString(xmlPreview) + `
+`
+ _, _ = w.Write([]byte(page))
+}
+
+func escapeAll(ss []string) []string {
+ out := make([]string, len(ss))
+ for i, s := range ss {
+ out[i] = html.EscapeString(s)
+ }
+ return out
+}
diff --git a/internal/lkgateway/participant_form_test.go b/internal/lkgateway/participant_form_test.go
new file mode 100644
index 0000000..241309b
--- /dev/null
+++ b/internal/lkgateway/participant_form_test.go
@@ -0,0 +1,100 @@
+package lkgateway
+
+import (
+ "strings"
+ "testing"
+
+ "git.zetit.ru/zuevav/Bridge-and-Join-s/internal/nsdxml"
+)
+
+func validPF() participantFormData {
+ return participantFormData{
+ INN: "7703807489", FullName: `ООО "Фонтвьель"`, ShortName: "Фонтвьель",
+ DisplayName: "Фонтвьель", DepoCode: "MC0413600000",
+ }
+}
+
+func TestParticipantFormValidate(t *testing.T) {
+ if errs := participantFormValidate(validPF()); len(errs) != 0 {
+ t.Fatalf("корректная анкета должна проходить, получили: %v", errs)
+ }
+ bad := validPF()
+ bad.INN = "770380748" // 9 цифр
+ if errs := participantFormValidate(bad); len(errs) == 0 {
+ t.Fatal("ИНН из 9 цифр должен отклоняться")
+ }
+ bad = validPF()
+ bad.DepoCode = "XX0413600000"
+ if errs := participantFormValidate(bad); len(errs) == 0 {
+ t.Fatal("код не в формате MC+10 должен отклоняться")
+ }
+ bad = validPF()
+ bad.DisplayName = ""
+ if errs := participantFormValidate(bad); len(errs) == 0 {
+ t.Fatal("пустой DisplayName должен отклоняться")
+ }
+ bad = validPF()
+ bad.BrokerCode = "MC12" // неверный формат
+ if errs := participantFormValidate(bad); len(errs) == 0 {
+ t.Fatal("неверный код брокера должен отклоняться")
+ }
+}
+
+func TestParticipantFormXML(t *testing.T) {
+ x := participantFormXML(validPF())
+ for _, want := range []string{
+ `encoding="windows-1251"`,
+ `7703807489`,
+ ``,
+ `MC0413600000`,
+ `(МСК)`,
+ } {
+ if !strings.Contains(x, want) {
+ t.Errorf("XML должен содержать %q\n---\n%s", want, x)
+ }
+ }
+ if strings.Contains(x, "") {
+ t.Error("без англ. полей блок Eng не должен появляться")
+ }
+ if strings.Contains(x, "") {
+ t.Error("без кода брокера блок BrokerPlace не должен появляться")
+ }
+ // С англ. и брокером — блоки появляются.
+ d := validPF()
+ d.EngFull, d.BrokerCode = "Fontvielle LLC", "MC0413600001"
+ x2 := participantFormXML(d)
+ if !strings.Contains(x2, "") || !strings.Contains(x2, "Fontvielle LLC") {
+ t.Error("с англ. наименованием блок Eng обязателен")
+ }
+ if !strings.Contains(x2, "") || !strings.Contains(x2, "MC0413600001") {
+ t.Error("с кодом брокера блок BrokerPlace обязателен")
+ }
+}
+
+func TestParticipantFormBytesCP1251(t *testing.T) {
+ b, err := participantFormBytes(validPF())
+ if err != nil {
+ t.Fatal(err)
+ }
+ // Декод обратно из 1251 — кириллица восстанавливается.
+ got := string(nsdxml.DecodeWindows1251(b))
+ if !strings.Contains(got, `ООО "Фонтвьель"`) {
+ t.Errorf("после cp1251 round-trip потеряна кириллица:\n%s", got)
+ }
+}
+
+func TestBuildMIMEAttach(t *testing.T) {
+ msg := string(buildMIMEAttach("a@b.ru", []string{"M2MOST@nsd.ru"}, "Тема", "тело", "form.xml", []byte(""), "application/xml"))
+ for _, want := range []string{
+ "multipart/mixed; boundary=",
+ "Content-Disposition: attachment; filename=\"form.xml\"",
+ "Content-Transfer-Encoding: base64",
+ "To: M2MOST@nsd.ru",
+ } {
+ if !strings.Contains(msg, want) {
+ t.Errorf("MIME должен содержать %q", want)
+ }
+ }
+}
diff --git a/internal/lkgateway/server.go b/internal/lkgateway/server.go
index 2d2af37..3ac5188 100644
--- a/internal/lkgateway/server.go
+++ b/internal/lkgateway/server.go
@@ -233,6 +233,7 @@ func NewServer(cfg ServerConfig) (*Server, error) {
registerSeedListing(mux, store)
registerHandbookRequest(mux, igwClient, igwChannel)
registerChainTest(mux, rc, igwClient != nil) // «Проверить всю цепочку» (мастер, глава «Запуск»)
+ registerParticipantForm(mux, rc) // анкета участника M2M (регистрация в НРД, participant_form.go)
return &Server{
cfg: cfg,