Анкета участника: ответ НРД принимается автоматически — квитанция и ответ сервиса

Квитанции ЭДО НРД (пакеты C, «Уведомление о получении Пакетов…»)
разбираются: для нашей анкеты (#M2MPF…) — отметка «доставлена в НРД»
с временем, ошибка первичной обработки — отказ с текстом квитанции.
Ответ сервиса: INFO — «принята в обработку», OK — принята, ERROR —
отказ с кодом; документ-ответ M2MTransferParticipantForm — регистрация
подтверждена. Всё видно в строке «Исходящих», на странице анкеты и в
плашке раздела НРД. После запуска bj перечитывает квитанции за день
отправки, если отметки ещё нет (22.10 на 9 квитанция пришла раньше).

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:14:22 +03:00
parent f50b338294
commit 6fc0ff5d3d
6 changed files with 202 additions and 6 deletions
+22 -4
View File
@@ -28,6 +28,9 @@ type participantReg struct {
Codes []string `json:"codes,omitempty"`
RespText string `json:"resp_text,omitempty"`
RawFile string `json:"raw_file,omitempty"`
// Квитанция ЭДО НРД о получении пакета (пакет C): НРД получил анкету, первичная обработка прошла.
DeliveredAt time.Time `json:"delivered_at,omitempty"`
Package string `json:"package,omitempty"` // имя пакета из квитанции (#M2MPF….ZIP)
}
var participantRegMu sync.Mutex
@@ -98,7 +101,7 @@ func saveParticipantReg(mut func(*participantReg)) {
// StatusClass, StatusText — статус отправки анкеты для строк списков (класс бейджа и текст).
func (r participantReg) StatusClass() string {
switch {
case r.RespAt.IsZero():
case r.RespAt.IsZero(), strings.EqualFold(r.Status, "INFO"):
return "awaiting_decision"
case strings.EqualFold(r.Status, "ERROR"):
return "rejected"
@@ -108,8 +111,12 @@ func (r participantReg) StatusClass() string {
func (r participantReg) StatusText() string {
switch {
case r.RespAt.IsZero() && !r.DeliveredAt.IsZero():
return "Доставлена в НРД · ждём ответ"
case r.RespAt.IsZero():
return "Ждёт ответа НРД"
return "Отправлена · ждём квитанцию НРД"
case strings.EqualFold(r.Status, "INFO"):
return "Принята НРД в обработку"
case strings.EqualFold(r.Status, "ERROR"):
if len(r.Codes) > 0 {
return "Отклонена НРД · " + strings.Join(r.Codes, ", ")
@@ -143,7 +150,16 @@ func recordParticipantReply(status string, resp *m2m.M2MTransferResponse, rawFil
// participantAccepted — последняя отправленная анкета принята НРД.
func participantAccepted() bool {
r := loadParticipantReg()
return !r.RespAt.IsZero() && !strings.EqualFold(r.Status, "ERROR")
return !r.RespAt.IsZero() && !strings.EqualFold(r.Status, "ERROR") && !strings.EqualFold(r.Status, "INFO")
}
// recordParticipantFormReply — НРД прислал документ-ответ на анкету (M2MTransferParticipantForm):
// регистрация подтверждена.
func recordParticipantFormReply(rawFile string) {
saveParticipantReg(func(r *participantReg) {
r.RespAt, r.Status, r.Codes = time.Now(), "OK", nil
r.RespText, r.RawFile = "НРД подтвердил регистрацию участника", rawFile
})
}
// participantBanner — плашка наверху раздела НРД: анкета не отправлена, ждёт ответа или отклонена.
@@ -158,7 +174,9 @@ func participantBanner() template.HTML {
"Без регистрации участника НРД не принимает запросы на переводы. Проверьте анкету и отправьте её."
switch {
case r.SentAt.IsZero():
case r.RespAt.IsZero():
case r.RespAt.IsZero() && !r.DeliveredAt.IsZero():
cls, head, body = "stc-run", "Анкета участника M2M доставлена в НРД — ждём ответ", "Квитанция НРД "+r.DeliveredAt.In(listMSK).Format("02.01.2006 15:04:05")+": пакет получен, ошибок нет. Плашка пропадёт, когда НРД примет анкету."
case r.RespAt.IsZero(), strings.EqualFold(r.Status, "INFO"):
cls, head, body = "stc-run", "Анкета участника M2M ждёт ответа НРД", "Отправлена "+r.SentAt.In(listMSK).Format("02.01.2006 15:04")+". Плашка пропадёт, когда НРД примет анкету."
case strings.EqualFold(r.Status, "ERROR"):
cls, head = "stc-err", "НРД отклонил анкету участника M2M"