Справочник участников — своего контура; регистрация — по справочнику НРД; поиск клиентов портфеля

readHandbook брал самый свежий из своего, общего (с сервера лицензий) и
встроенного — общий был тестовым (TEST3, 166 участников, прислан с 28), и на
боевом 9 bj считал «регистрация подтверждена», хотя в боевом справочнике
НРД (89) нас нет. Теперь при своём справочнике от НРД — только он; на сервер
лицензий справочник уходит только с боевого контура.

Регистрация участника проверяется по справочнику, полученному от НРД;
появились в нём — анкета отмечается принятой автоматически, плашка уходит.

Портфель ЛК: клиенты DEPO списком по клику (первые 50 по алфавиту), «не
найдено» вместо «поиск недоступен» (пустой ответ был null).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
This commit is contained in:
fontvielle
2026-10-22 11:28:13 +03:00
parent 6fc0ff5d3d
commit f296ac5ad8
6 changed files with 86 additions and 29 deletions
+45
View File
@@ -149,6 +149,9 @@ func recordParticipantReply(status string, resp *m2m.M2MTransferResponse, rawFil
// participantAccepted — последняя отправленная анкета принята НРД.
func participantAccepted() bool {
if in, _, _, _ := nsdHandbookHasUs(globalRC); in {
return true // уже в справочнике участников НРД — зарегистрированы (в т.ч. без анкеты из bj)
}
r := loadParticipantReg()
return !r.RespAt.IsZero() && !strings.EqualFold(r.Status, "ERROR") && !strings.EqualFold(r.Status, "INFO")
}
@@ -185,3 +188,45 @@ func participantBanner() template.HTML {
return template.HTML(`<div class="stc ` + cls + `" style="margin:0 0 14px"><span class="stc-ic"></span><div class="stc-b"><b>` + esc(head) +
`</b><small>` + esc(body) + ` <a href="#nsd-participant" onclick="var d=document.getElementById('pf-box');if(d)d.open=true">Открыть анкету →</a></small></div></div>`)
}
// nsdHandbookHasUs — наша организация в справочнике участников M2M, который этот bj получил от НРД
// (handbookFile, текущий контур). known=false — справочника от НРД ещё нет. Общий справочник с
// сервера лицензий здесь не годится: он собран с других установок и контуров.
func nsdHandbookHasUs(rc *RuntimeConfig) (in, known bool, at time.Time, n int) {
b, err := os.ReadFile(handbookFile)
if err != nil || rc == nil {
return false, false, time.Time{}, 0
}
var h struct {
At time.Time `json:"at"`
Participants []HandbookEntry `json:"participants"`
}
if json.Unmarshal(b, &h) != nil {
return false, false, time.Time{}, 0
}
s := rc.Snapshot()
code, inn := strings.ToUpper(strings.TrimSpace(orgCode(s))), strings.TrimSpace(orgINN(s))
for _, p := range h.Participants {
if (code != "" && strings.EqualFold(p.Code, code)) || (code == "" && inn != "" && p.INN == inn) {
return true, true, h.At, len(h.Participants)
}
}
return false, true, h.At, len(h.Participants)
}
// participantHandbookCheck — после каждого справочника от НРД: появились в нём, а анкета ещё не
// отмечена принятой — регистрация подтверждена справочником.
func participantHandbookCheck(rc *RuntimeConfig) {
in, known, at, _ := nsdHandbookHasUs(rc)
if !in || !known {
return
}
r := loadParticipantReg()
if r.SentAt.IsZero() || (!r.RespAt.IsZero() && !strings.EqualFold(r.Status, "INFO") && !strings.EqualFold(r.Status, "ERROR")) {
return
}
saveParticipantReg(func(r *participantReg) {
r.RespAt, r.Status, r.Codes = at, "OK", nil
r.RespText = "организация появилась в справочнике участников M2M НРД"
})
}