Отказ сервиса M2M в ЛК — словами (наша расшифровка или текст НРД), M2M43; «передавать информацию о расходах» в QUIK — по заявке клиента

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
This commit is contained in:
zuevav
2026-09-29 15:37:34 +03:00
parent 7cd3583844
commit 44d6d7a74d
5 changed files with 84 additions and 7 deletions
+25 -5
View File
@@ -184,11 +184,7 @@ func (s *Server) applyIncoming(ctx context.Context, p igw.Package) error {
// ERROR сервиса МОСТ — отказ: замыкаем на ЛК с человекочитаемой причиной.
if strings.EqualFold(string(resp.StatusCode), "ERROR") {
reason := "Отклонено сервисом MOEX МОСТ"
if c := strings.TrimSpace(codes); c != "" {
parts := make([]string, 0)
for _, code := range strings.Fields(c) {
parts = append(parts, m2mCodeLabel(code))
}
if parts := serviceErrorTexts(resp); len(parts) > 0 {
reason = strings.Join(parts, "; ")
}
// Итог для заявки модуля ЛК (lk.transfer_requests): 'declined' — отказ после отправки в НРД.
@@ -358,3 +354,27 @@ func saveHandbook(hb *m2m.M2MTransferHandbook) (changed bool) {
}
return changed
}
// serviceErrorTexts — причины отказа сервиса M2M понятными словами: наша расшифровка кода, иначе текст
// из ответа НРД (он есть в каждом Response), иначе сам код. Раньше неизвестный bj код уходил клиенту
// в ЛК голым («M2M43»).
func serviceErrorTexts(resp *m2m.M2MTransferResponse) []string {
var parts []string
seen := map[string]bool{}
for _, rr := range resp.Responses {
code := strings.TrimSpace(rr.Code)
if code == "" || seen[code] {
continue
}
seen[code] = true
switch {
case m2mCodeText(code) != "":
parts = append(parts, m2mCodeLabel(code))
case strings.TrimSpace(rr.Text) != "":
parts = append(parts, strings.TrimSpace(rr.Text)+" ("+code+")")
default:
parts = append(parts, code)
}
}
return parts
}