Анкета участника: статус регистрации по справочнику участников M2M

Регистрация подтверждается двумя путями: ответным документом НРД (ловим в
поллере) ИЛИ появлением организации в справочнике участников M2M боевого
контура. На странице анкеты добавлен статус: ищем нашу организацию в справочнике
по MC-коду, затем по ИНН (handbookByCode/handbookByINN); «есть» — регистрация
подтверждена, «нет» — ждём приёма анкеты (справочник обновляется ~10 минут).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
This commit is contained in:
fontvielle
2026-10-21 17:31:09 +03:00
parent eb5f08dfa6
commit 416f9bdcd5
2 changed files with 33 additions and 5 deletions
+2 -2
View File
@@ -20,8 +20,8 @@
"version": "2026.10.21.6"
},
"bj-server": {
"fingerprint": "f47475987712791a70a636cfa23a2a8d28f1e1ad898d3ff505c595f828d64a0b",
"version": "2026.10.21.11"
"fingerprint": "bbbd830ed300ae81eee05d87ad0fe59d0756a794f1d157c37bc36fe67c2e0f25",
"version": "2026.10.21.12"
},
"crypto-service.jar": {
"fingerprint": "2c4fd536bc9b1c20c69a70e8dcd374a61847b263aeb2e474c45debb01fbd8233",
+31 -3
View File
@@ -359,11 +359,39 @@ func registerParticipantForm(mux *http.ServeMux, rc *RuntimeConfig, igwClient *i
}
xmlPreview := participantFormXML(d)
participantFormRender(w, d, errs, action, flash, flashKind, xmlPreview, igwClient != nil && igwChannel != "", isProdIGW(igwChannel))
participantFormRender(w, d, errs, action, flash, flashKind, xmlPreview, participantRegStatus(rc), igwClient != nil && igwChannel != "", isProdIGW(igwChannel))
})
}
func participantFormRender(w http.ResponseWriter, d participantFormData, errs []string, action, flash, flashKind, xmlPreview string, igwConfigured, igwProd bool) {
// participantRegStatus — подтверждение регистрации появлением в справочнике участников
// M2M текущего контура: если наша организация (по MC-коду или ИНН) уже в справочнике —
// анкета принята. Это второй сигнал, помимо ответного документа от НРД.
func participantRegStatus(rc *RuntimeConfig) string {
if rc == nil {
return ""
}
s := rc.Snapshot()
contour := map[string]string{"prod": "боевого", "guest": "гостевого", "test3": "тестового"}[contourOf(currentNSDProfile())]
if contour == "" {
contour = "текущего"
}
hb, ok := handbookByCode(orgCode(s))
if !ok {
if inn := orgINN(s); inn != "" {
hb, ok = handbookByINN(inn)
}
}
if ok {
return `<div class="ok">В справочнике участников M2M ` + contour + ` контура: <b>есть</b> — ` +
html.EscapeString(pickStr(hb.Name, hb.FullName)) + `, код ` + html.EscapeString(hb.Code) +
`, ИНН ` + html.EscapeString(hb.INN) + `. Регистрация подтверждена.</div>`
}
return `<div class="note">В справочнике участников M2M ` + contour + ` контура нашей организации пока <b>нет</b>. ` +
`После приёма анкеты НРД организация появится в справочнике (обновляется каждые ~10 минут) — тогда здесь будет «есть». ` +
`Регистрацию подтверждает также ответный документ от НРД.</div>`
}
func participantFormRender(w http.ResponseWriter, d participantFormData, errs []string, action, flash, flashKind, xmlPreview, regHTML string, igwConfigured, igwProd bool) {
w.Header().Set("Content-Type", "text/html; charset=utf-8")
inp := func(name, label, val, ph string) string {
return `<label>` + label + `<input name="` + name + `" value="` + html.EscapeString(val) + `" placeholder="` + ph + `"></label>`
@@ -409,7 +437,7 @@ pre{background:#f6f8fa;border:1px solid #ddd;border-radius:8px;padding:12px;over
пакетом <code>#M2MPF</code> (businessLine=MOST, подпись боевым контейнером на стороне ИШ); письмо на
<code>` + participantFormRecipient + `</code> оставлено запасным каналом. Поля предзаполнены из
автоопределения DEPO — проверьте юридические реквизиты.</p>
` + flashHTML + vErr + `
` + regHTML + flashHTML + vErr + `
<form method="post">
<fieldset><legend>Организация</legend>
` + inp("inn", "ИНН (10 цифр)", d.INN, "7700000000") + `