ЛК: итог «Исполнена» по MS010, GUID без учёта регистра, заявка при отказе МНП берётся один раз; тестовый контур не трогает боевой ЛК

Перевод 97EAD00C (заявка ЛК #71741, 23.10.2026) исполнен в QUIK и НРД (MS010),
но в ЛК статус не изменился, а сделка осталась «Подтверждена»:
- связки guid → заявка ЛК искались с учётом регистра: мы шлём GUID строчными,
  НРД отвечает заглавными — OnLKOutcome молча не находил заявку. Ключи —
  строчными (lkGUIDKey), старые записи приводятся при загрузке; итог модуля
  ЛК (lk.transfer_requests) — lower(guid);
- после MS010 по всем строкам поручения 16 сделка → «Исполнена» (CompleteSUB16),
  итог — в ЛК (outOnExecuted, каждый проход order-watch, повтор безвреден);
  в бою согласие контрагента — ещё не «Исполнена»: статус ждёт MS010, как в
  тесте «боевой ЛК → TEST3»; имитатор НРД — итог сразу.

Тестовый 28 с боевым ЛК взял ту же заявку и после отказа МНП («запрещен для
операции шорт» — бумагу уже заблокировал 9) брал её каждые 10 секунд: 108
сделок с новыми GUID и столько же писем.
- Сделка заведена, а отправка не прошла (МНП не заблокировал) — заявка
  помечается взятой и связывается с переводом: дальше — оператор в карточке.
- Боевой ЛК при тестовом профиле ИШ (lkProdOnTestNSD): заявки клиентов не
  берутся (кроме теста «боевой ЛК → тестовый НРД»), портфели не заполняются,
  предупреждение в настройках ЛК.
- Письма: в теме и первой строке — сервер bj и контур НРД («[bj ТЕСТ …]»
  у тестового); письма о входящих — метка только у тестового.
- История FSM — по МСК с датой, «текущее состояние» вместо «сейчас».
- Карточка теста «боевой ЛК → тестовый НРД» — только в режиме разработки
  (включённый тест виден всегда, чтобы его выключить).

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-23 16:04:44 +03:00
parent ffd69b0698
commit 32d88fc42a
11 changed files with 333 additions and 20 deletions
+10 -1
View File
@@ -33,6 +33,10 @@ func notifyDepositoryIncoming(rc *RuntimeConfig, it *IncomingTransfer) {
}
subject := "MOEX МОСТ (M2M): к вам переведены ценные бумаги — требуется учёт"
body := buildIncomingEmailBody(it)
if !nsdProfileProd(cfg.NSD.Profile) { // письмо тестового сервера не принять за боевое
tag, line := alertServer(cfg.NSD.Profile)
subject, body = tag+subject, line+body
}
s := smtp
s.To = notifyRecipients(cfg, "incoming") // получатели по маршруту «входящие переводы»
if err := sendSMTP(s, subject, body); err != nil {
@@ -95,7 +99,12 @@ func notifyDepositoryAccepted(rc *RuntimeConfig, it *IncomingTransfer, confirmed
m := smtp
m.To = notifyRecipients(cfg, "incoming")
if err := sendSMTP(m, subject, b.String()); err != nil {
text := b.String()
if !nsdProfileProd(cfg.NSD.Profile) { // письмо тестового сервера не принять за боевое
tag, line := alertServer(cfg.NSD.Profile)
subject, text = tag+subject, line+text
}
if err := sendSMTP(m, subject, text); err != nil {
log.Printf("lk-gateway: письмо депозитарию о приёме GUID=%s не доставлено: %v", it.GUID, err)
return
}