From eaf7fed6ae72d6df63962f0f23772e2e2ff5e88b Mon Sep 17 00:00:00 2001 From: zuevav Date: Wed, 7 Oct 2026 08:05:32 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=B2=D0=BE=D0=B4?= =?UTF-8?q?=D1=8B=20=D0=BD=D0=B0=20=D0=98=D0=98=D0=A1=20=E2=80=94=20=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0=D0=B7=20=D0=BA=D0=BE=D0=B4=D0=BE=D0=BC=20M2M?= =?UTF-8?q?06=20(=D0=B2=D0=BC=D0=B5=D1=81=D1=82=D0=BE=20M2M07)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Решение депозитария 07.10.2026: по ИИС отвечаем M2M06 «Приостановление операций по счёту депо зачисления». Код — константа iisRejectCode: отказ по всему переводу на ИИС (iisDecisions, авто и ручной режим), проверки «Перевод не на ИИС» и «Счёт не ИИС» (было M2M08); тексты в настройках, карточке входящего и справочнике кодов. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi --- internal/lkgateway/depo_check.go | 4 ++-- internal/lkgateway/depo_package_test.go | 4 ++-- internal/lkgateway/incoming_answer.go | 8 ++++++-- internal/lkgateway/m2mauto.go | 2 +- internal/lkgateway/m2mcodes.go | 2 +- .../lkgateway/web/templates/admin_incoming_detail.html | 2 +- internal/lkgateway/web/templates/admin_setup.html | 2 +- 7 files changed, 14 insertions(+), 10 deletions(-) diff --git a/internal/lkgateway/depo_check.go b/internal/lkgateway/depo_check.go index 0e9a868..1572c80 100644 --- a/internal/lkgateway/depo_check.go +++ b/internal/lkgateway/depo_check.go @@ -382,7 +382,7 @@ func partyChecks(p depoParty, ser, num, fio string) []depoCheck { Detail: pick3(p.accAny != "", p.accAny, pick3(p.faceOK, "у инвестора нет счёта "+depoAccPrefix()+"… в OD_CLIENTS", "не проверяется — инвестор не найден"))}, {Name: "Статус счёта строго «открыт»", OK: p.accOpen != "", Code: "M2M02", Detail: pick3(p.accAny == "", "не проверяется — счёта нет", pick3(p.accOpen != "", p.accOpen+" — открыт (STATE=0, без даты закрытия)", p.accAny+" — НЕ открыт (закрыт или STATE≠0)"))}, - {Name: "Счёт не ИИС", OK: p.iisOK, Code: "M2M08", Detail: p.iisDet}, + {Name: "Счёт не ИИС", OK: p.iisOK, Code: iisRejectCode, Detail: p.iisDet}, } } @@ -415,7 +415,7 @@ func runDepoCheck(it *IncomingTransfer) depoResult { isin := strings.ToUpper(strings.TrimSpace(s.ISIN)) sr := depoSecResult{ReferenceID: s.ReferenceID, Security: pick(isin, s.SecurityCode)} if incomingIsIIS(it) { // решение 25.09.2026: входящие переводы на ИИС не принимаем совсем - sr.Checks = append(sr.Checks, depoCheck{Name: "Перевод не на ИИС", OK: false, Code: "M2M07", + sr.Checks = append(sr.Checks, depoCheck{Name: "Перевод не на ИИС", OK: false, Code: iisRejectCode, Detail: "перевод на ИИС (в запросе договор ИИС) — входящие переводы на ИИС не принимаем, отказ по всем бумагам"}) } ruOK := strings.HasPrefix(isin, "RU") diff --git a/internal/lkgateway/depo_package_test.go b/internal/lkgateway/depo_package_test.go index 73a33aa..cee3e8b 100644 --- a/internal/lkgateway/depo_package_test.go +++ b/internal/lkgateway/depo_package_test.go @@ -31,7 +31,7 @@ func TestFinishResultPartial(t *testing.T) { } } -// Автоответ: частичное согласие уходит как есть; перевод на ИИС — отказ M2M07 по всем бумагам. +// Автоответ: частичное согласие уходит как есть; перевод на ИИС — отказ M2M06 по всем бумагам. func TestAutoDecisionsPartialAndIIS(t *testing.T) { it := &IncomingTransfer{Securities: []IncomingSecurity{{ReferenceID: "A"}, {ReferenceID: "B"}}} r := depoResult{Secs: []depoSecResult{{ReferenceID: "A", Recommend: "confirm"}, {ReferenceID: "B", Recommend: "reject", RejectCode: "M2M05"}}} @@ -42,7 +42,7 @@ func TestAutoDecisionsPartialAndIIS(t *testing.T) { it.IIS = true d, _ = autoDecisions(it, r) for _, x := range d { - if x.Confirm || x.RejectCode != "M2M07" { + if x.Confirm || x.RejectCode != "M2M06" { t.Fatalf("ИИС не принимаем: %+v", d) } } diff --git a/internal/lkgateway/incoming_answer.go b/internal/lkgateway/incoming_answer.go index 0a1904c..46368b4 100644 --- a/internal/lkgateway/incoming_answer.go +++ b/internal/lkgateway/incoming_answer.go @@ -154,7 +154,11 @@ func answerIncoming(ctx context.Context, deps incomingDeps, id string, decisions // transferringINN — ИНН нашей организации (передающий депозитарий в запросе, принимающий — в решении). func transferringINN(s Settings) string { return orgINN(s) } -// iisDecisions — входящие переводы на ИИС не принимаем (решение 25.09.2026): отказ M2M07 по всем +// iisRejectCode — код отказа по переводу на ИИС: M2M06 «Приостановление операций по счёту депо зачисления» +// (решение депозитария 07.10.2026; до этого — M2M07). +const iisRejectCode = "M2M06" + +// iisDecisions — входящие переводы на ИИС не принимаем (решение 25.09.2026): отказ iisRejectCode по всем // бумагам, даже если оператор отметил «принять». Остальные переводы — по каждой бумаге отдельно. func iisDecisions(it *IncomingTransfer, decisions []SecurityDecision) []SecurityDecision { if it == nil || !incomingIsIIS(it) { @@ -162,7 +166,7 @@ func iisDecisions(it *IncomingTransfer, decisions []SecurityDecision) []Security } out := make([]SecurityDecision, len(decisions)) for i, d := range decisions { - d.Confirm, d.RejectCode = false, "M2M07" + d.Confirm, d.RejectCode = false, iisRejectCode out[i] = d } return out diff --git a/internal/lkgateway/m2mauto.go b/internal/lkgateway/m2mauto.go index 76a67a5..cedcc96 100644 --- a/internal/lkgateway/m2mauto.go +++ b/internal/lkgateway/m2mauto.go @@ -4,7 +4,7 @@ package lkgateway // человека, чтобы соблюдать сроки и убрать человеческий фактор. // // - Входящий перевод ждёт решения → свежая сверка с DEPO → решение по её рекомендации: каждая -// бумага решается сама по себе (частичный приём), переводы на ИИС — отказ M2M07 по всем бумагам; +// бумага решается сама по себе (частичный приём), переводы на ИИС — отказ M2M06 по всем бумагам; // предупреждение со Strict (бумага для квалифицированных инвесторов // при неполной квалификации клиента) — отказ M2M08. Без сверки ничего не принимается: если DEPO // или ИШ недоступны, bj повторяет каждые m2mAutoRetry и шлёт оповещение. diff --git a/internal/lkgateway/m2mcodes.go b/internal/lkgateway/m2mcodes.go index f0a9662..f11ee14 100644 --- a/internal/lkgateway/m2mcodes.go +++ b/internal/lkgateway/m2mcodes.go @@ -25,7 +25,7 @@ var m2mRejectCatalog = []m2mCodeInfo{ {"M2M05", "Бумага не обслуживается зачисляющим депозитарием", "Зачисляющий депозитарий не оказывает услуги по учёту прав на данную ценную бумагу (не работает с этим выпуском)."}, {"M2M06", "Приостановление операций по счёту зачисления", - "По счёту депо зачисления действует приостановка/блокировка операций — зачислить бумаги нельзя."}, + "По счёту депо зачисления действует приостановка/блокировка операций — зачислить бумаги нельзя. В нашей системе этим кодом отклоняются также переводы на ИИС и запросы, полученные вне рабочего времени депозитария."}, {"M2M07", "Отказ принимающей стороны", "Общий отказ зачисляющего депозитария. В нашей системе применяется также для повторного (дублирующего) перевода — тот же инвестор и бумаги уже принимались ранее."}, {"M2M08", "Операция нарушит законодательство РФ", diff --git a/internal/lkgateway/web/templates/admin_incoming_detail.html b/internal/lkgateway/web/templates/admin_incoming_detail.html index 695d634..caac8d3 100644 --- a/internal/lkgateway/web/templates/admin_incoming_detail.html +++ b/internal/lkgateway/web/templates/admin_incoming_detail.html @@ -141,7 +141,7 @@ {{end}} -

Решение по каждой бумаге отдельно: принятые бумаги НРД переведёт (по каждой придёт свой черновик 16/1), по остальным уйдёт отказ с выбранным кодом.{{if and $.It (isIIS $.It)}} Перевод на ИИС — такие мы не принимаем: отказ M2M07 по всем бумагам будет отправлен в любом случае.{{end}}

+

Решение по каждой бумаге отдельно: принятые бумаги НРД переведёт (по каждой придёт свой черновик 16/1), по остальным уйдёт отказ с выбранным кодом.{{if and $.It (isIIS $.It)}} Перевод на ИИС — такие мы не принимаем: отказ M2M06 по всем бумагам будет отправлен в любом случае.{{end}}

diff --git a/internal/lkgateway/web/templates/admin_setup.html b/internal/lkgateway/web/templates/admin_setup.html index 5f9c41b..259da17 100644 --- a/internal/lkgateway/web/templates/admin_setup.html +++ b/internal/lkgateway/web/templates/admin_setup.html @@ -337,7 +337,7 @@ {{template "orgSection" .}}

Автоматический режим M2M

-

Без участия оператора, чтобы соблюдать сроки: ответ на входящие переводы по свежей сверке с DEPO (решение по каждой бумаге отдельно — возможен частичный приём; переводы на ИИС — отказ M2M07; бумага для квалифицированных инвесторов при неполной или непрочитанной квалификации клиента — отказ M2M08), подача поручения 16/1, как только НРД пришлёт черновик после нашего согласия, и подача поручения 16 по исходящим после согласия контрагента. Если DEPO или ИШ недоступны — bj повторяет каждые 3 минуты и шлёт оповещение; без сверки ничего не принимается. Обрабатывается только то, что пришло не раньше чем за сутки до включения. Кнопки в карточках остаются для ручной работы.

+

Без участия оператора, чтобы соблюдать сроки: ответ на входящие переводы по свежей сверке с DEPO (решение по каждой бумаге отдельно — возможен частичный приём; переводы на ИИС — отказ M2M06; бумага для квалифицированных инвесторов при неполной или непрочитанной квалификации клиента — отказ M2M08), подача поручения 16/1, как только НРД пришлёт черновик после нашего согласия, и подача поручения 16 по исходящим после согласия контрагента. Если DEPO или ИШ недоступны — bj повторяет каждые 3 минуты и шлёт оповещение; без сверки ничего не принимается. Обрабатывается только то, что пришло не раньше чем за сутки до включения. Кнопки в карточках остаются для ручной работы.