From 29e9dbcfbce823dbdd426c048210ec870cbf4bdc Mon Sep 17 00:00:00 2001 From: zuevav Date: Thu, 24 Sep 2026 23:24:03 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9C=D0=B0=D1=81=D1=82=D0=B5=D1=80,=20=D1=88?= =?UTF-8?q?=D0=B0=D0=B3=203=20DEPO=20=E2=80=94=20=D0=BF=D0=BE=20=D1=8D?= =?UTF-8?q?=D0=BA=D1=80=D0=B0=D0=BD=D0=B0=D0=BC:=20=D0=BE=D0=BF=D0=B8?= =?UTF-8?q?=D1=81=D0=B0=D0=BD=D0=B8=D0=B5=20=E2=86=92=20=D0=BF=D0=BE=D0=B4?= =?UTF-8?q?=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D0=B5=20(=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B0=20=D1=81=D1=80=D0=B0?= =?UTF-8?q?=D0=B7=D1=83)=20=E2=86=92=20=D1=82=D0=B0=D0=B1=D0=BB=D0=B8?= =?UTF-8?q?=D1=86=D1=8B=20(bj=20=D0=B8=D0=BB=D0=B8=20=D1=81=D0=BA=D1=80?= =?UTF-8?q?=D0=B8=D0=BF=D1=82)=20=E2=86=92=20=D0=BE=D0=B1=D1=80=D0=B0?= =?UTF-8?q?=D0=B1=D0=BE=D1=82=D0=BA=D0=B0=20(job)=20=E2=86=92=20=D0=B3?= =?UTF-8?q?=D0=BE=D1=82=D0=BE=D0=B2=D0=BE;=20=D1=81=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BE=D1=87=D0=BD=D0=B8=D0=BA=20=D1=83=D1=87=D0=B0=D1=81?= =?UTF-8?q?=D1=82=D0=BD=D0=B8=D0=BA=D0=BE=D0=B2=20M2M=20=D0=B2=D1=81=D1=82?= =?UTF-8?q?=D1=80=D0=BE=D0=B5=D0=BD=20=D1=81=D0=BD=D0=B8=D0=BC=D0=BA=D0=BE?= =?UTF-8?q?=D0=BC=20=D0=B4=D0=BB=D1=8F=20=D1=87=D0=B8=D1=81=D1=82=D0=BE?= =?UTF-8?q?=D0=B9=20=D1=83=D1=81=D1=82=D0=B0=D0=BD=D0=BE=D0=B2=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi --- internal/lkgateway/admin.go | 4 +- internal/lkgateway/auth.go | 2 +- internal/lkgateway/depoevents.go | 4 +- internal/lkgateway/handbook/m2m-handbook.json | 1 + internal/lkgateway/handbook_embed.go | 22 +++ internal/lkgateway/incoming_notify.go | 2 +- internal/lkgateway/m2mtest.go | 2 +- internal/lkgateway/org.go | 3 +- internal/lkgateway/setup.go | 11 ++ .../lkgateway/web/templates/admin_wizard.html | 85 +++++++- internal/lkgateway/wizard_depo.go | 185 ++++++++++++++++++ 11 files changed, 302 insertions(+), 19 deletions(-) create mode 100644 internal/lkgateway/handbook/m2m-handbook.json create mode 100644 internal/lkgateway/handbook_embed.go create mode 100644 internal/lkgateway/wizard_depo.go diff --git a/internal/lkgateway/admin.go b/internal/lkgateway/admin.go index 1b0a9c3..2f6208a 100644 --- a/internal/lkgateway/admin.go +++ b/internal/lkgateway/admin.go @@ -7,7 +7,6 @@ import ( "fmt" "html/template" "net/http" - "os" "path" "strings" "time" @@ -53,6 +52,7 @@ var templateFuncs = template.FuncMap{ "devOn": authTemplateFuncs["devOn"], "devLicensed": authTemplateFuncs["devLicensed"], "mod": func(f string) bool { return globalRC == nil || moduleAllowed(globalRC, f) }, // модуль в лицензии + "depoSubs": func() any { return depoWizardSubs }, // экраны шага 3 мастера "authOpen": authOpen, "internalDocs": func() bool { return internalDocsBuilt }, "roleTitle": roleTitle, @@ -683,7 +683,7 @@ type handbookData struct { func (a *admin) renderHandbook(w http.ResponseWriter, _ *http.Request) { data := handbookData{page: nowPage("Справочник участников", "handbook")} data.CodesHTML = template.HTML(m2mSpravkaHTML(false)) // справка по кодам ошибок - if raw, err := os.ReadFile(handbookFile); err == nil { + if raw, err := readHandbook(); err == nil { var hb struct { At string `json:"at"` Participants []HandbookEntry `json:"participants"` diff --git a/internal/lkgateway/auth.go b/internal/lkgateway/auth.go index f53d105..06f0589 100644 --- a/internal/lkgateway/auth.go +++ b/internal/lkgateway/auth.go @@ -889,7 +889,7 @@ func devOnlyPath(p string) bool { func moduleForPath(p string) string { has := func(pre string) bool { return p == pre || strings.HasPrefix(p, pre+"/") } switch { - case has("/admin/quik"), has("/admin/setup/quik"), has("/admin/fancy-queue"), has("/admin/setup/fancy"), has("/admin/manual/depo"): + case has("/admin/quik"), has("/admin/setup/quik"), has("/admin/fancy-queue"), has("/admin/setup/fancy"), has("/admin/setup/wizard-depo"), has("/admin/manual/depo"): return "quik-mnp" case has("/admin/setup/quikexport"): return "quik-export" diff --git a/internal/lkgateway/depoevents.go b/internal/lkgateway/depoevents.go index adde0ff..cdfd2dd 100644 --- a/internal/lkgateway/depoevents.go +++ b/internal/lkgateway/depoevents.go @@ -273,7 +273,7 @@ func depoUpsertOrder(rc *RuntimeConfig, guid, direction, cpCode, deponentName, d // handbookCodeByINN — MC-код депозитария по ИНН из сохранённого справочника. func handbookCodeByINN(inn string) string { - raw, err := os.ReadFile(handbookFile) + raw, err := readHandbook() if err != nil { return "" } @@ -542,7 +542,7 @@ func depoPollOrders(ctx context.Context, db *sql.DB, rc *RuntimeConfig) { var depoHandbookWritten time.Time func depoWriteHandbook(rc *RuntimeConfig) error { - raw, err := os.ReadFile(handbookFile) + raw, err := readHandbook() if err != nil { return err } diff --git a/internal/lkgateway/handbook/m2m-handbook.json b/internal/lkgateway/handbook/m2m-handbook.json new file mode 100644 index 0000000..13e958d --- /dev/null +++ b/internal/lkgateway/handbook/m2m-handbook.json @@ -0,0 +1 @@ +{"at":"2026-09-24T13:59:24+03:00","participants":[{"inn":"7707025725","code":"MC0005600000","kind":"depo","name":"АО АКБ \"ЦентроКредит\"","full_name":"Акционерный коммерческий банк \"ЦентроКредит\"(акционерное общество)","display_name":"АО АКБ \"ЦентроКредит\""},{"inn":"9714012520","code":"MC0418000000","kind":"depo","name":"ИК ФИАНИТ","full_name":"АО ИК ФИАНИТ","display_name":"ИК ФИАНИТ"},{"inn":"5617000264","code":"MC0319000000","kind":"depo","name":"ООО \"Инбанк\"","full_name":"Общество с ограниченной ответственностью \"Инбанк\"","display_name":"ООО \"Инбанк\""},{"inn":"6660040152","code":"EC0276600000","kind":"depo","name":"ГроттБьерн (АО)","full_name":"Акционерное общество \"Финансовое ателье ГроттБьерн\"","display_name":"ГроттБьерн (АО)","eng_name":"GrottBjorn, JSC"},{"inn":"7744003039","code":"MC0224000000","kind":"depo","name":"ООО \"Первый Клиентский Банк\"","full_name":"\"Первый Клиентский Банк\" (Общество с ограниченной ответственностью)","display_name":"Первый Клиентский Банк","eng_name":"OOO \"Pervyy Kliyentskiy Bank\""},{"inn":"7715750741","code":"MC0314300000","kind":"depo","name":"ООО Концерн \"ДЖЕНЕРАЛ-ИНВЕСТ\"","full_name":"Общество с ограниченной ответственностью Концерн \"ДЖЕНЕРАЛ-ИНВЕСТ\"","display_name":"Концерн Дженерал-Инвест","eng_name":"Concern General Invest LLC"},{"inn":"7744001497","code":"MC00098000MM","kind":"depo","name":"Банк ГПБ (АО)","full_name":"\"Газпромбанк\" (Акционерное общество)","display_name":"Газпромбанк","eng_name":"Bank GPB (JSC)"},{"inn":"9718183438","code":"MC0572100000","kind":"depo","name":"ООО \"Кадерус Брокер\"","full_name":"Общество с ограниченной ответственностью \"Кадерус Брокер\"","display_name":"Кадерус Брокер ООО"},{"inn":"2204000595","code":"NC0125400000","kind":"depo","name":"АО КБ \"Модульбанк\"","full_name":"Акционерное общество Коммерческий Банк \"Модульбанк\"","display_name":"Модульбанк"},{"inn":"7703807489","code":"MC0413600000","kind":"depo","name":"ООО \"ИК \"Фонтвьель\"","full_name":"Общество с ограниченной ответственностью \"Инвестиционная Компания \"Фонтвьель\"","display_name":"Фонтвьель, ИК ООО","eng_name":"\"IC \"Fontvielle\" LLC"},{"inn":"7708733569","code":"MC0356800000","kind":"depo","name":"ИК Тренд","full_name":"ООО ИК Тренд","display_name":"ИК Тренд"},{"inn":"7729405872","code":"MC0034900000","kind":"depo","name":"ПАО Банк ЗЕНИТ","full_name":"Банк ЗЕНИТ (публичное акционерное общество)","display_name":"Зенит Банк","eng_name":"Bank ZENIT"},{"inn":"6608003052","code":"EC01060000MM","kind":"depo","name":"ПАО Банк Синара","full_name":"Публичное акционерное общество Банк Синара","display_name":"Банк Синара"},{"inn":"4214005204","code":"NC0126700000","kind":"depo","name":"Углеметбанк","full_name":"АО Углеметбанк","display_name":"Углеметбанк"},{"inn":"7744000912","code":"MC0038600000","kind":"depo","name":"БАНК ПСБ","full_name":"ПАО БАНК ПСБ","display_name":"БАНК ПСБ"},{"inn":"7702045051","code":"MC00480000SD","kind":"depo","name":"МТС-Банк","full_name":"ПАО МТС-Банк","display_name":"МТС-Банк"},{"inn":"7750005845","code":"MC0068800000","kind":"depo","name":"МП Банк","full_name":"ООО МП Банк","display_name":"МП Банка"},{"inn":"4205029262","code":"UDR000N17460","kind":"depo","name":"Компания Примула","full_name":"ООО Компания Примула","display_name":"Компания Примула"},{"inn":"5000001042","code":"MC0000700000","kind":"depo","name":"Банк Возрождение","full_name":"Банк Возрождение","display_name":"Банк Возрождение","eng_name":"Vozrozhdenie"},{"inn":"7708018456","code":"MC0028500000","kind":"depo","name":"АО \"НДБанк\"","full_name":"Акционерное общество \"Народный доверительный банк\"","display_name":"НДБанк","eng_name":"PTB"},{"inn":"9703165605","code":"MC0709900000","kind":"depo","name":"АВИ Капитал","full_name":"ООО АВИ Капитал","display_name":"АВИ Капитал"},{"inn":"7709258228","code":"MC0089500000","kind":"depo","name":"ООО Ренессанс Брокер","full_name":"ООО Ренессанс Брокер","display_name":"ООО Ренессанс Брокер"},{"inn":"7702015515","code":"MC00314000TR","kind":"depo","name":"АО Атон","full_name":"АО Атон","display_name":"АО Атон"},{"inn":"6608008004","code":"EC0025800000","kind":"depo","name":"ПАО КБ \"УБРиР\"","full_name":"Публичное акционерное общество \"Уральский банк реконструкции и развития\"","display_name":"УБРиР","eng_name":"UBRD, PJSC"},{"inn":"2539013067","code":"VC0029800000","kind":"depo","name":"ПАО СКБ Приморья \"Примсоцбанк\"","full_name":"Публичное акционерное общество Социальный коммерческий банк Приморья \"Примсоцбанк\"","display_name":"Примсоцбанк, Социальный коммерческий банк Приморья"},{"inn":"9710138306","code":"MC0257200000","kind":"depo","name":"АО ИК \"Вектор Капитал\"","full_name":"Акционерное общество Инвестиционная компания \"Вектор Капитал\"","display_name":"Вектор Капитал","eng_name":"Vector Capital"},{"inn":"7736046991","code":"MC0059600000","kind":"depo","name":"АКБ \"Абсолют Банк\" (ПАО)","full_name":"Акционерный коммерческий банк \"Абсолют Банк\" (публичное акционерное общество)","display_name":"Абсолют Банк","eng_name":"Absolut Bank"},{"inn":"9705202605","code":"MC0584700000","kind":"depo","name":"АО \"ТуОушен Капитал\"","full_name":"Акционерное общество \"ТуОушен Капитал\"","display_name":"ТуОушен Капитал, АО","eng_name":"JSC 2Ocean Capital"},{"inn":"6905011218","code":"MC0109400000","kind":"depo","name":"АО ГУТА-БАНК","full_name":"АКЦИОНЕРНОЕ ОБЩЕСТВО \"ГУТА-БАНК\"","display_name":"АО ГУТА-БАНК"},{"inn":"7813067004","code":"PC0057000000","kind":"depo","name":"АО Актив","full_name":"Акционерное общество Актив","display_name":"АО Актив"},{"inn":"7704477040","code":"MC0489400000","kind":"depo","name":"ООО БК \"Ингосстрах-инвестиции\"","full_name":"ООО БК \"Ингосстрах-инвестиции\"","display_name":"ООО БК \"Ингосстрах-инвестиции\""},{"inn":"5501047418","code":"NC0089900000","kind":"depo","name":"АО Октан-Брокер","full_name":"Акционерное общество \"Октан-Брокер\"","display_name":"АО Октан-Брокер"},{"inn":"3900001002","code":"MC0139100000","kind":"depo","name":"ББР Банк (АО)","full_name":"ББР Банк (акционерное общество)","display_name":"ББР Банк (АО)"},{"inn":"7703115760","code":"MC0003400000","kind":"depo","name":"АО ИК ЕВРОФИНАНСЫ","full_name":"АКЦИОНЕРНЫЙ КОММЕРЧЕСКИЙ БАНК \"ЕВРОФИНАНС МОСНАРБАНК\" (акционерное общество)","display_name":"АО ИК ЕВРОФИНАНСЫ"},{"inn":"9702049204","code":"MC0422100000","kind":"depo","name":"АО Москва Сити Секьюритиз","full_name":"Общество с ограниченной ответственностью \"Москва Сити Секьюритиз\"","display_name":"АО Москва Сити Секьюритиз"},{"inn":"7736618039","code":"MC0347600000","kind":"depo","name":"ООО РСД","full_name":"Общество с ограниченной ответственностью \"Рыночный Спецдепозитарий\"","display_name":"ООО РСД"},{"inn":"7831000034","code":"MC0020800000","kind":"depo","name":"СПБ Банк","full_name":"ПАО СПБ Банк","display_name":"СПБ Банк"},{"inn":"7725038124","code":"MC0034600000","kind":"depo","name":"АО \"Банк ДОМ.РФ\"","full_name":"Акционерное общество \"Банк ДОМ.РФ\"","display_name":"Банк ДОМ.РФ","eng_name":"Bank DOM.RF"},{"inn":"7812001441","code":"PC0080000000","kind":"depo","name":"АО СПВБ","full_name":"Закрытое акционерное общество \"Санкт-Петербургский Расчетно-Депозитарный Центр\"","display_name":"АО СПВБ"},{"inn":"5407198829","code":"MC0V04400000","kind":"depo","name":"АО Арка 1","full_name":"АО Арка 1","display_name":"АО Арка 1"},{"inn":"7709221010","code":"MC0063100000","kind":"depo","name":"ООО АЛОР +","full_name":"Общество с ограниченной ответственностью \"АЛОР +\"","display_name":"ООО АЛОР +"},{"inn":"9722031822","code":"MC0423200000","kind":"depo","name":"АО ИК Индевор Финанс","full_name":"Акционерное общество Инвестиционная компания \"Индевор Финанс\"","display_name":"АО ИК Индевор Финанс"},{"inn":"7734731423","code":"MC0416300000","kind":"depo","name":"ООО ИК \"Айсберг Финанс\"","full_name":"Общество с ограниченной ответственностью Инвестиционная компания \"Айсберг Финанс\"","display_name":"Айсберг Финанс, ИК"},{"inn":"7718112024","code":"MC0078300000","kind":"depo","name":"АО \"ИФК \"ДВМ-ИНВЕСТ\"","full_name":"Акционерное общество \"ИНВЕСТИЦИОННО-ФИНАНСОВАЯ КОМПАНИЯ \"ДВМ-ИНВЕСТ\"","display_name":"ДВМ-инвест, ИФК"},{"inn":"3128110570","code":"MC0453300000","kind":"depo","name":"ООО \"ИК \"ФИНПРОИНВЕСТ\"","full_name":"Общество с ограниченной ответственностью \"ИНВЕСТИЦИОННАЯ КОМПАНИЯ \"ФИНПРОИНВЕСТ\"","display_name":"ФИНПРОИНВЕСТ, ИК ООО"},{"inn":"9729319955","code":"MC05537000MM","kind":"depo","name":"ООО ИК \"Айгенис\"","full_name":"Общество с ограниченной ответственностью \"Инвестиционная компания \"Айгенис\"","display_name":"ООО ИК \"Айгенис\"","eng_name":"\"Aigenis\" LLC"},{"inn":"7714056040","code":"MC0076100000","kind":"depo","name":"АО Банк Инго","full_name":"Акционерное общество Ингосстрах Банк","display_name":"АО Банк Инго"},{"inn":"7705260427","code":"MC0014600000","kind":"depo","name":"АКБ Ланта-Банк (АО)","full_name":"Акционерное общество коммерческий банк \"Ланта-Банк\"","display_name":"АКБ Ланта-Банк (АО)"},{"inn":"4101011782","code":"MC0019400000","kind":"depo","name":"АО Солид Банк","full_name":"Акционерное общество \"Солид Банк\"","display_name":"АО Солид Банк"},{"inn":"7423004062","code":"PC0125800000","kind":"depo","name":"АО Банк Снежинский","full_name":"Акционерное общество Банк конверсии \"Снежинский\"","display_name":"АО Банк Снежинский"},{"inn":"8602190258","code":"MC0012000000","kind":"depo","name":"АО БАНК СНГБ","full_name":"Акционерное общество \"Сургутнефтегазбанк\"","display_name":"АО БАНК СНГБ"},{"inn":"7744001144","code":"MC0115700000","kind":"depo","name":"АО Нацинвестпромбанк","full_name":"\"Национальный инвестиционно-промышленный банк\" (Акционерное Общество)","display_name":"АО Нацинвестпромбанк"},{"inn":"5008009854","code":"MC0131900000","kind":"depo","name":"АО ИФК Солид","full_name":"Акционерное общество Инвестиционно-финансовая компания \"Солид\"","display_name":"АО ИФК Солид"},{"inn":"9725079692","code":"MC0547300SBP","kind":"depo","name":"ООО Го Инвест","full_name":"Общество с ограниченной ответственностью \"Го Инвест\"","display_name":"ООО Го Инвест"},{"inn":"7841364200","code":"PC0294300000","kind":"depo","name":"ООО ПТЦ","full_name":"Общество с ограниченной ответственностью \"Петербургский технический центр\"","display_name":"ООО ПТЦ"},{"inn":"7743330386","code":"MC0490300000","kind":"depo","name":"Т-Инвест Лаб","full_name":"Общество с ограниченной ответственностью \"Тинькофф Инвест Лаб\"","display_name":"Т-Инвест Лаб"},{"inn":"7709315684","code":"MC0032400000","kind":"depo","name":"АО \"Банк ФИНАМ\"","full_name":"Акционерное общество \"Инвестиционный Банк \"ФИНАМ\"","display_name":"АО \"Банк ФИНАМ\""},{"inn":"5406820109","code":"MC0V04500000","kind":"depo","name":"АО Арка 2","full_name":"АО Арка 2","display_name":"АО Арка 2"},{"inn":"5404154492","code":"NC0035500000","kind":"depo","name":"Банк Левобережный","full_name":"ПАО Банк Левобережный","display_name":"Банк Левобережный"},{"inn":"7744000126","code":"MC0135200000","kind":"depo","name":"КБ Ренессанс Кредит","full_name":"ООО КБ Ренессанс Кредит","display_name":"КБ Ренессанс Кредит"},{"inn":"7702070139","code":"MC0003300001","kind":"depo","name":"БАНК ВТБ","full_name":"ПАО БАНК ВТБ","display_name":"БАНК ВТБ"},{"inn":"7840060671","code":"PC0094600000","kind":"depo","name":"КИТ Финанс","full_name":"АО КИТ Финанс","display_name":"КИТ Финанс"},{"inn":"9703077050","code":"MC0546800000","kind":"depo","name":"ОЗОН Банк","full_name":"ООО ОЗОН Банк","display_name":"ОЗОН Банк"},{"inn":"7722061076","code":"MC0012500000","kind":"depo","name":"Славянский Банк","full_name":"Славянский Банк","display_name":"Славянский Банк"},{"inn":"7744002356","code":"MC0012300000","kind":"depo","name":"ОКЕАН БАНК","full_name":"ОКЕАН БАНК (акционерное общество)","display_name":"ОКЕАН БАНК"},{"inn":"7806027770","code":"PC0085800000","kind":"depo","name":"АО Инвестиционная компания ЛМС","full_name":"Акционерное общество \"Инвестиционная компания \"Ленмонтажстрой\"","display_name":"АО Инвестиционная компания ЛМС"},{"inn":"7703211512","code":"MC00350000MM","kind":"depo","name":"АКБ НРБанк (АО)","full_name":"Акционерный коммерческий банк \"Национальный Резервный Банк\" (акционерное общество)","display_name":"АКБ НРБанк (АО)"},{"inn":"7729605134","code":"MC0284500000","kind":"depo","name":"ООО Московские партнеры","full_name":"Общество с ограниченной ответственностью \"Московские партнеры\"","display_name":"ООО Московские партнеры"},{"inn":"7706196340","code":"MC0076700000","kind":"depo","name":"АО АКБ НОВИКОМБАНК","full_name":"Акционерный Коммерческий Банк \"НОВИКОМБАНК\" акционерное общество","display_name":"АО АКБ НОВИКОМБАНК"},{"inn":"4216004076","code":"NC0015700000","kind":"depo","name":"АО Кузнецкбизнесбанк","full_name":"Акционерный Банк \"Кузнецкбизнесбанк\" (акционерное общество)","display_name":"АО Кузнецкбизнесбанк"},{"inn":"7717116241","code":"MC0138200000","kind":"depo","name":"АО ИК Ай Ти Инвест","full_name":"Акционерное общество \"Инвестиционная компания \"Ай Ти Инвест\"","display_name":"АО ИК Ай Ти Инвест"},{"inn":"7446045354","code":"MC0083900000","kind":"depo","name":"ООО ИК \"ММК-Финанс\"","full_name":"Общество с ограниченной ответственностью Инвестиционная компания \"ММК-Финанс\"","display_name":"MMK-Финанс"},{"inn":"7704081545","code":"MC0099600000","kind":"depo","name":"ПАО ИК РУСС-ИНВЕСТ","full_name":"Публичное акционерное общество \"ИНВЕСТИЦИОННАЯ КОМПАНИЯ ИК РУСС-ИНВЕСТ\"","display_name":"ПАО ИК РУСС-ИНВЕСТ"},{"inn":"5406851442","code":"MC0573700000","kind":"depo","name":"АО \"Инвестиционная компания Юнисервис Капитал\"","full_name":"АО \"Инвестиционная компания Юнисервис Капитал\"","display_name":"АО \"Инвестиционная компания Юнисервис Капитал\""},{"inn":"7703432705","code":"MC0459000000","kind":"depo","name":"ООО \"Апрель Капитал Брокер\"","full_name":"Общество с ограниченной ответственностью \"Апрель Капитал Брокер\"","display_name":"Апрель Капитал Брокер, ООО","eng_name":"April Capital Broker Ltd"},{"inn":"7831000122","code":"PC0043300000","kind":"depo","name":"АО \"АБ \"РОССИЯ\"","full_name":"Акционерное общество \"Акционерный Банк \"РОССИЯ\"","display_name":"АБ РОССИЯ"},{"inn":"7709303960","code":"MC0154200000","kind":"depo","name":"ООО \"ИК ВЕЛЕС Капитал\"","full_name":"Общество с ограниченной ответственностью \"ИК ВЕЛЕС Капитал\"","display_name":"ИК ВЕЛЕС Капитал","eng_name":"\"IC VELES Capital\" LLC"},{"inn":"6829000290","code":"MC0065800000","kind":"depo","name":"Банк \"СЕРВИС РЕЗЕРВ\" (АО)","full_name":"Банк \"СЕРВИС РЕЗЕРВ\" (акционерное общество)","display_name":"СЕРВИС РЕЗЕРВ, Банк АО","eng_name":"Bank \"SERVICE RESERVE\" (JSC)"},{"inn":"7715560268","code":"MC0V03600000","kind":"depo","name":"АО Диасофт1","full_name":"АО Диасофт1","display_name":"АО Диасофт1","eng_name":"string"},{"inn":"0103001895","code":"MC0377800000","kind":"depo","name":"ООО КБ \"ГТ банк\"","full_name":"Коммерческий банк \"Газтрансбанк\" (Общество с ограниченной ответственностью)","display_name":"Газтрансбанк"},{"inn":"7702668793","code":"MC0292900002","kind":"depo","name":"ООО СБ-Брокер","full_name":"Общество с ограниченной ответственностью СБ-Брокер","display_name":"ООО СБ-Брокер"},{"inn":"7801739364","code":"MC0740100000","kind":"depo","name":"АО ДОХОДЪ Брокер","full_name":"АКЦИОНЕРНОЕ ОБЩЕСТВО \"ДОХОДЪ БРОКЕР\"","display_name":"АО ДОХОДЪ Брокер"},{"inn":"5902060906","code":"MC0540500000","kind":"depo","name":"ООО ИК Финдом","full_name":"Общество с ограниченной ответственностью Инвестиционная компания \"Финдом\"","display_name":"ООО ИК Финдом"},{"inn":"7714184726","code":"MC0093000000","kind":"depo","name":"ООО СДК \"Гарант\"","full_name":"Общество с ограниченной ответственностью \"Специализированная депозитарная компания \"Гарант\"","display_name":"ООО СДК \"Гарант\""},{"inn":"9715302870","code":"MC0V03700000","kind":"depo","name":"АО Диасофт2","full_name":"АО Диасофт2","display_name":"АО Диасофт2","eng_name":"string"},{"inn":"7736153344","code":"MC0054400000","kind":"depo","name":"Банк \"ВБРР\" (АО)","full_name":"Акционерное общество \"Всероссийский банк развития регионов\"","display_name":"Банк \"ВБРР\" (АО)","eng_name":"string"},{"inn":"2801023444","code":"MC0285500000","kind":"depo","name":"\"Азиатско-Тихоокеанский Банк\" (АО)","full_name":"\"Азиатско-Тихоокеанский Банк\" (Акционерное общество)","display_name":"\"Азиатско-Тихоокеанский Банк\" (АО)","eng_name":"JSC Asian-Pacific Bank"},{"inn":"2129013377","code":"GC0097700000","kind":"depo","name":"ООО \"Гофмаклер\"","full_name":"Общество с ограниченной ответственностью \"Гофмаклер\"","display_name":"ООО \"Гофмаклер\""},{"inn":"7709138570","code":"MC0026700000","kind":"depo","name":"ПАО АКБ \"Металлинвестбанк\"","full_name":"АКЦИОНЕРНЫЙ КОММЕРЧЕСКИЙ БАНК \"МЕТАЛЛУРГИЧЕСКИЙ ИНВЕСТИЦИОННЫЙ БАНК\" (ПУБЛИЧНОЕ АКЦИОНЕРНОЕ ОБЩЕСТВО)","display_name":"Металлинвестбанк","eng_name":"METALLINVESTBANK"},{"inn":"1660055801","code":"MC0587200000","kind":"depo","name":"ООО \"ЕАР\"","full_name":"Общество с ограниченной ответственностью \"Евроазиатский Регистратор\"","display_name":"ООО \"ЕАР\""},{"inn":"7701796023","code":"MC0326900000","kind":"depo","name":"ООО \"ИНТЕР РАО Инвест\"","full_name":"Общество с ограниченной ответственностью \"ИНТЕР РАО Инвест\"","display_name":"ИНТЕР РАО Инвест"},{"inn":"5402075245","code":"MC0726100000","kind":"depo","name":"АО \"Капитал\"","full_name":"Акционерное общество \"Капитал\"","display_name":"Капитал АО"},{"inn":"7725114488","code":"MC0134700000","kind":"depo","name":"АО \"Россельхозбанк\"","full_name":"Акционерное общество \"Российский Сельскохозяйственный банк\"","display_name":"Россельхозбанк"},{"inn":"7728168971","code":"MC000050MOST","kind":"depo","name":"АО \"АЛЬФА-БАНК\"","full_name":"АКЦИОНЕРНОЕ ОБЩЕСТВО \"АЛЬФА-БАНК\"","display_name":"Альфа-Банк","eng_name":"ALFA-BANK"},{"inn":"9713028125","code":"MC0V03900000","kind":"depo","name":"АО ЦФТ 2","full_name":"АО ЦФТ 2","display_name":"АО ЦФТ 2","eng_name":"TEST"},{"inn":"1101300820","code":"MC0031700000","kind":"depo","name":"\"Северный Народный Банк\" (АО)","full_name":"\"Северный Народный Банк\" (акционерное общество)","display_name":"Северный Народный Банк, АО","eng_name":"Severny Narodny Bank"},{"inn":"7705380065","code":"MC00960000MM","kind":"depo","name":"АО \"Специализированный депозитарий \"ИНФИНИТУМ\"","full_name":"Акционерное общество \"Специализированный депозитарий \"ИНФИНИТУМ\"","display_name":"ИНФИНИТУМ","eng_name":"INFINITUM A.S."},{"inn":"7718686491","code":"MC0265600000","kind":"depo","name":"ООО \"РОНИН\"","full_name":"Общество с ограниченной ответственностью \"РОН Инвест\"","display_name":"РОНИН","eng_name":"RONIN"},{"inn":"7421000200","code":"PC0021400000","kind":"depo","name":"ПАО \"ЧЕЛЯБИНВЕСТБАНК\"","full_name":"АКЦИОНЕРНЫЙ ЧЕЛЯБИНСКИЙ ИНВЕСТИЦИОННЫЙ БАНК \"ЧЕЛЯБИНВЕСТБАНК\" (ПУБЛИЧНОЕ АКЦИОНЕРНОЕ ОБЩЕСТВО)","display_name":"ЧЕЛЯБИНВЕСТБАНК","eng_name":"\"Chelyabinvestbank\""},{"inn":"7718104217","code":"MC0121700000","kind":"depo","name":"ООО КБ \"АРЕСБАНК\"","full_name":"Коммерческий Банк \"АРЕСБАНК\" общество с ограниченной ответственностью","display_name":"АРЕСБАНК, КБ","eng_name":"\"ARESBANK\", Ltd."},{"inn":"7707583536","code":"MC0359800000","kind":"depo","name":"ООО \"ИК \"Гелиус Капитал\"","full_name":"Общество с ограниченной ответственностью \"Инвестиционная компания \"Гелиус Капитал\"","display_name":"Гелиус Капитал","eng_name":"Gelius Capital"},{"inn":"2130190797","code":"MC0294900000","kind":"depo","name":"АО \"НФК-Сбережения\"","full_name":"Акционерное общество \"Инвестиционная компания \"НФК-Сбережения\"","display_name":"НФК-Сбережения","eng_name":"JSC \"NFK-Savings\""},{"inn":"7730059592","code":"MC0084000000","kind":"depo","name":"АКБ \"Трансстройбанк\" (АО)","full_name":"Акционерный коммерческий банк Трансстройбанк (Акционерное общество)","display_name":"Трансстройбанк, АКБ","eng_name":"\"Transstroibank\""},{"inn":"7729003482","code":"MC0012900000","kind":"depo","name":"АКБ \"Держава\" ПАО","full_name":"\"Акционерный коммерческий банк \"Держава\" публичное акционерное общество\"","display_name":"Держава"},{"inn":"2634028786","code":"PC0045400000","kind":"depo","name":"ПАО \"Банк Ставр\"","full_name":"Публичное акционерное общество \"Банк Ставр\"","display_name":"ПАО \"Банк Ставр\""},{"inn":"5026014060","code":"MC0134100000","kind":"depo","name":"АО КБ \"АГРОПРОМКРЕДИТ\"","full_name":"Акционерное общество коммерческий банк \"АГРОПРОМКРЕДИТ\"","display_name":"АГРОПРОМКРЕДИТ"},{"inn":"7731038186","code":"MC0061900000","kind":"depo","name":"АО \"Инвестиционная компания \"ФИНАМ\"","full_name":"Акционерное общество \"Инвестиционная компания \"ФИНАМ\"","display_name":"Инвестиционная компания ФИНАМ","eng_name":"Investment Company FINAM"},{"inn":"7744000302","code":"MC0054300000","kind":"depo","name":"АО \"Райффайзенбанк\"","full_name":"Акционерное общество \"Райффайзенбанк\"","display_name":"Райффайзенбанк"},{"inn":"7708022300","code":"MC0098700000","kind":"depo","name":"АО \"Банк Интеза\"","full_name":"Акционерное общество \"Банк Интеза\"","display_name":"Банк Интеза","eng_name":"Banca Intesa"},{"inn":"7710070848","code":"MC0095600000","kind":"depo","name":"ООО КБ \"Транспортный\"","full_name":"Коммерческий банк \"Транспортный\" (общество с ограниченной ответственностью)","display_name":"Транспортный","eng_name":"Transportny"},{"inn":"7708207809","code":"MC0164300000","kind":"depo","name":"ООО \"БК РЕГИОН\"","full_name":"Общество с ограниченной ответственностью \"Брокерская компания \"РЕГИОН\"","display_name":"РЕГИОН БРОКЕР","eng_name":"REGION BC"},{"inn":"7702021163","code":"MC0060700000","kind":"depo","name":"ПАО АКБ «АВАНГАРД»","full_name":"Акционерный Коммерческий банк «АВАНГАРД» — публичное акционерное общество","display_name":"Банк АВАНГАРД","eng_name":"AVANGARD BANK"},{"inn":"9728109419","code":"MC0223200000","kind":"depo","name":"АО \"СПЕКТР ИНВЕСТ\"","full_name":"АКЦИОНЕРНОЕ ОБЩЕСТВО \"СПЕКТР ИНВЕСТ\"","display_name":"СПЕКТР ИНВЕСТ","eng_name":"Spectr Invest"},{"inn":"7724136129","code":"MC0005900000","kind":"depo","name":"АО \"ТРИНФИКО\"","full_name":"Акционерное общество \"ТРИНФИКО\"","display_name":"Акционерное общество \"ТРИНФИКО\""},{"inn":"6314012819","code":"SC0156800000","kind":"depo","name":"АО \"ИК \"Газинвест\"","full_name":"Акционерное общество \"Инвестиционная компания \"Газинвест\"","display_name":"Газинвест, ИК"},{"inn":"7723623472","code":"MC0282300000","kind":"depo","name":"ООО \"ИК \"Грандис Капитал\"","full_name":"Общество с ограниченной ответственностью \"Инвестиционная компания \"Грандис Капитал\"","display_name":"ООО \"ИК \"Грандис Капитал\"","eng_name":"\"GCIC\", Ltd"},{"inn":"7705011188","code":"MC0003600000","kind":"depo","name":"Банк \"Кредит-Москва\" (ПАО)\"","full_name":"Акционерный Коммерческий Банк \"Кредит-Москва\" (публичное акционерное общество)","display_name":"Кредит-Москва","eng_name":"Credit-Moscow"},{"inn":"7718011918","code":"MC0042900000","kind":"depo","name":"ПАО \"РОСДОРБАНК\"","full_name":"\"РОССИЙСКИЙ АКЦИОНЕРНЫЙ КОММЕРЧЕСКИЙ ДОРОЖНЫЙ БАНК\" (ПУБЛИЧНОЕ АКЦИОНЕРНОЕ ОБЩЕСТВО)","display_name":"ПАО \"РОСДОРБАНК\""},{"inn":"7802953900","code":"MC0742000000","kind":"depo","name":"ООО \"Инвестика\"","full_name":"Общество с ограниченной ответственностью \"Инвестика\"","display_name":"Инвестика, ООО"},{"inn":"7202072360","code":"MC0016300000","kind":"depo","name":"ОАО \"СИБНЕФТЕБАНК\"","full_name":"открытое акционерное общество \"Акционерный Сибирский Нефтяной банк\"","display_name":"ОАО \"СИБНЕФТЕБАНК\""},{"inn":"5406121446","code":"NC00589000MM","kind":"depo","name":"ООО «Компания БКС»","full_name":"Общество с ограниченной ответственностью «Компания Брокеркредитсервис»","display_name":"Компания БКС","eng_name":"BCS"},{"inn":"7744000038","code":"MC0075000000","kind":"depo","name":"АО АКБ \"МЕЖДУНАРОДНЫЙ ФИНАНСОВЫЙ КЛУБ\"","full_name":"АКЦИОНЕРНОЕ ОБЩЕСТВО АКЦИОНЕРНЫЙ КОММЕРЧЕСКИЙ БАНК \"МЕЖДУНАРОДНЫЙ ФИНАНСОВЫЙ КЛУБ\"","display_name":"МФК"},{"inn":"7734202860","code":"MC0030300000","kind":"depo","name":"ПАО \"МОСКОВСКИЙ КРЕДИТНЫЙ БАНК\"","full_name":"\"МОСКОВСКИЙ КРЕДИТНЫЙ БАНК\" (публичное акционерное общество)","display_name":"ПАО \"МОСКОВСКИЙ КРЕДИТНЫЙ БАНК\"","eng_name":"CREDIT BANK OF MOSCOW"},{"inn":"7831000027","code":"PC0002600001","kind":"depo","name":"ПАО \"Банк \"Санкт-Петербург\"","full_name":"ПУБЛИЧНОЕ АКЦИОНЕРНОЕ ОБЩЕСТВО \"БАНК \"САНКТ-ПЕТЕРБУРГ\"","display_name":"БСПБ","eng_name":"BSPB"},{"inn":"7701033078","code":"MC0088200000","kind":"depo","name":"АО «ИК «РИКОМ-ТРАСТ»","full_name":"Акционерное общество «Инвестиционная компания «РИКОМ-ТРАСТ»","display_name":"АО «ИК «РИКОМ-ТРАСТ»","eng_name":"RICOM-TRUST IC Ltd"},{"inn":"7720931020","code":"MC0073600000","kind":"depo","name":"АО \"Банк ДАЛЕНА\"","full_name":"Акционерное общество \"Банк ДАЛЕНА\"","display_name":"АО \"Банк ДАЛЕНА\""},{"inn":"7750004270","code":"MC0163900000","kind":"depo","name":"АО \"Банк Финсервис\"","full_name":"Акционерное общество \"Банк Финсервис\"","display_name":"Финсервис"},{"inn":"1653001570","code":"GC0090400000","kind":"depo","name":"АО \"ЦД РТ\"","full_name":"Акционерное общество \"Центральный депозитарий Республики Татарстан\"","display_name":"ЦД РТ","eng_name":"CD RT"},{"inn":"7710140679","code":"MSA253200000","kind":"depo","name":"АО \"ТБанк\"","full_name":"Акционерное общество \"ТБанк\"","display_name":"ТБанк","eng_name":"TBank"},{"inn":"9703192084","code":"MC0433000000","kind":"depo","name":"АО \"ИК \"Горизонт\"","full_name":"Акционерное общество \"Инвестиционная компания \"Горизонт\"","display_name":"Горизонт ИК"},{"inn":"7733295710","code":"MC04368000MM","kind":"depo","name":"ООО \"Ньютон Инвестиции\"","full_name":"Общество с ограниченной ответственностью \"Ньютон Инвестиции\"","display_name":"Ньютон Инвестиции"},{"inn":"9703197607","code":"MC0724500000","kind":"depo","name":"АО \"СДК \"Сириус\"","full_name":"Акционерное общество \"Специализированная депозитарная компания \"Сириус\"","display_name":"СДК СИРИУС"},{"inn":"7703747769","code":"MC0358000000","kind":"depo","name":"ООО \"СДК \"Гранит\"","full_name":"Общество с ограниченной ответственностью \"Специализированная депозитарная компания \"Гранит\"","display_name":"СДК Гранит"},{"inn":"4401116480","code":"MC0253800000","kind":"depo","name":"ПАО «СОВКОМБАНК»","full_name":"Публичное акционерное общество \"Совкомбанк\"","display_name":"СОВКОМБАНК","eng_name":"Sovcombank"},{"inn":"9704261012","code":"MC0767400000","kind":"depo","name":"ООО \"АМАНИТА КАПИТАЛ\"","full_name":"ОБЩЕСТВО С ОГРАНИЧЕННОЙ ОТВЕТСТВЕННОСТЬЮ \"АМАНИТА КАПИТАЛ\"","display_name":"ООО \"АМАНИТА КАПИТАЛ\""},{"inn":"7708397772","code":"MC0070400000","kind":"depo","name":"ООО \"Экспобанк\"","full_name":"Общество с ограниченной ответственностью \"Экспобанк\"","display_name":"Экспобанк","eng_name":"Expobank"},{"inn":"7725239261","code":"MC0337100000","kind":"depo","name":"ООО ИК \"Орлиная река\"","full_name":"Общество с ограниченной ответственностью Инвестиционная компания \"Орлиная река\"","display_name":"Орлиная река"},{"inn":"8603001619","code":"MC0017800000","kind":"depo","name":"АО АБ \"Капитал\"","full_name":"Акционерный банк \"Капитал\" (акционерное общество)","display_name":"АО АБ \"Капитал\"","eng_name":"Bank \"Capital\""},{"inn":"7706537061","code":"MC0190800000","kind":"depo","name":"АО ИК \"АКБФ\"","full_name":"Акционерное общество Инвестиционная компания \"АКБФ\"","display_name":"АКБФ","eng_name":"AKBF"},{"inn":"9703160540","code":"MC0723300000","kind":"depo","name":"АО \"РАКУРС ИНВЕСТ\"","full_name":"АКЦИОНЕРНОЕ ОБЩЕСТВО \"РАКУРС ИНВЕСТ\"","display_name":"АО РАКУРС ИНВЕСТ","eng_name":"RAKURS INVEST JSC"},{"inn":"7710030411","code":"MC00A1500000","kind":"depo","name":"АJ \"ЮниКредит Банк\"","full_name":"Акционерное общество \"ЮниКредит Банк\"","display_name":"ЮниКредит Банк"},{"inn":"7702526358","code":"MC02199000MM","kind":"depo","name":"ООО \"Твой Брокер\"","full_name":"Общество с ограниченной ответственностью \"Твой Брокер\"","display_name":"Твой Брокер"},{"inn":"5260059340","code":"GC0100700000","kind":"depo","name":"АО \"КОШЕЛЕВ-БАНК\"","full_name":"Акционерное общество \"КОШЕЛЕВ-БАНК\"","display_name":"КОШЕЛЕВ-БАНК","eng_name":"KOSHELEV-BANK"},{"inn":"7704002409","code":"MC0032700000","kind":"depo","name":"АО ФК \"Профит Хауз\"","full_name":"Акционерное общество Финансовая компания \"Профит Хауз\"","display_name":"ПрофитХауз"},{"inn":"7728185046","code":"MC0001700000","kind":"depo","name":"ЗАО \"М БАНК\"","full_name":"Закрытое акционерное общество \"МОССТРОЙЭКОНОМБАНК\"","display_name":"М Банк","eng_name":"Mbank"},{"inn":"7705934210","code":"MC0356400M2M","kind":"depo","name":"ООО ИК \"Цифра Брокер\"","full_name":"Общество с ограниченной ответственностью Инвестиционная компания \"Цифра Брокер\"","display_name":"Цифра Брокер","eng_name":"Cifra broker"},{"inn":"7724096412","code":"MC0034700000","kind":"depo","name":"Банк ИПБ (АО)","full_name":"\"ИНТЕРПРОГРЕССБАНК\" (Акционерное общество)","display_name":"Банк ИПБ","eng_name":"Bаnk IPB"},{"inn":"7453002182","code":"MC0032100000","kind":"depo","name":"ПАО \"Челиндбанк\"","full_name":"АКЦИОНЕРНЫЙ КОММЕРЧЕСКИЙ БАНК \"ЧЕЛИНДБАНК\" (публичное акционерное общество)","display_name":"Челиндбанк"},{"inn":"3666007300","code":"RC0252900000","kind":"depo","name":"ООО \"Инвестиционная палата\"","full_name":"Общество с ограниченной ответственностью \"Инвестиционная палата\"","display_name":"ООО \"Инвестиционная палата\""},{"inn":"7718581509","code":"MC0277000000","kind":"depo","name":"ООО \"ФК \"Линия Инвестиций\"","full_name":"Общество с ограниченной ответственностью \"Финансовая компания \"Линия Инвестиций\"","display_name":"Линия Инвестиций"},{"inn":"9703176533","code":"MC0753200000","kind":"depo","name":"ООО \"А7-Брокер\"","full_name":"Общество с ограниченной ответственностью \"А7-Брокер\"","display_name":"ООО \"А7-Брокер\"","eng_name":"\"A7-BROKER\" LLC"},{"inn":"7712002554","code":"MC0055400000","kind":"depo","name":"ООО «банк Раунд»","full_name":"Общество с ограниченной ответственностью «банк Раунд»","display_name":"банк Раунд","eng_name":"bank Round"},{"inn":"2536020789","code":"VC0026400000","kind":"depo","name":"ПАО АКБ \"Приморье\"","full_name":"Акционерный коммерческий банк \"Приморье\" (публичное акционерное общество)","display_name":"Банк Приморье","eng_name":"Bank Primorye"},{"inn":"7750056670","code":"MC0419800000","kind":"depo","name":"ЦМРБанк (ООО)","full_name":"ЦМРБанк (общество с ограниченной ответственностью)","display_name":"ЦМРБанк"},{"inn":"7707083893","code":"MC00025000MM","kind":"depo","name":"ПАО Сбербанк","full_name":"Публичное акционерное общество \"Сбербанк России\"","display_name":"СБЕР","eng_name":"SBER"},{"inn":"7727034333","code":"MC0090500000","kind":"depo","name":"АО \"ИК \"Орион Капитал\"","full_name":"Акционерное общество \"Инвестиционная компания \"Орион Капитал\"","display_name":"АО \"ИК \"Орион Капитал\"","eng_name":"JSC \"IC \"Orion Capital\""},{"inn":"1655500084","code":"GC0140800000","kind":"depo","name":"АО Банк \"Аверс\"","full_name":"Акционерное общество Банк \"Аверс\"","display_name":"АО Банк \"Аверс\"","eng_name":"Bank Avers JSC"},{"inn":"6163011391","code":"RC0061500000","kind":"depo","name":"ПАО КБ «Центр-инвест»","full_name":"Публичное акционерное общество коммерческий банк «Центр-инвест»","display_name":"«Центр-инвест»"},{"inn":"9725165895","code":"MC07253000MM","kind":"depo","name":"ООО \"НЭКСТ\"","full_name":"Общество с ограниченной ответственностью \"НЭКСТ\"","display_name":"НЭКСТ","eng_name":"NEXT"},{"inn":"5407125059","code":"MC0V03800000","kind":"depo","name":"АО ЦФТ 1","full_name":"АО ЦФТ 1","display_name":"АО ЦФТ 1","eng_name":"TEST"},{"inn":"3525023780","code":"GC0109900000","kind":"depo","name":"АО \"БАНК СГБ\"","full_name":"Акционерное общество \"СЕВЕРГАЗБАНК\"","display_name":"СЕВЕРГАЗБАНК"},{"inn":"7717728910","code":"MC0566800000","kind":"depo","name":"ООО \"АСПК\"","full_name":"Общество с ограниченной ответственностью \"АСПК\"","display_name":"АСПК","eng_name":"ASPK"}],"settlement_places":[{"inn":"7831000034","code":"","kind":"place","name":"АО \"СПБ Банк\"","display_name":"Акционерное общество \"СПБ Банк\""},{"inn":"7702165310","code":"","kind":"place","name":"НКО АО НРД","display_name":" Небанковская кредитная организация акционерное общество \"Национальный расчетный депозитарий\""}]} \ No newline at end of file diff --git a/internal/lkgateway/handbook_embed.go b/internal/lkgateway/handbook_embed.go new file mode 100644 index 0000000..d4552ea --- /dev/null +++ b/internal/lkgateway/handbook_embed.go @@ -0,0 +1,22 @@ +package lkgateway + +import ( + _ "embed" + "os" +) + +// Снимок справочника участников M2M (получен от НРД, открытые данные): на чистой установке +// шлюза НРД ещё нет, и справочник не получить — тогда поиск организации и остальные места +// работают по снимку, поставляемому с bj. Как только bj получит справочник от НРД (M2MTH), +// используется он. Снимок обновляется с выпусками bj. +// +//go:embed handbook/m2m-handbook.json +var handbookSnapshot []byte + +// readHandbook — справочник от НРД, если он уже получен, иначе встроенный снимок. +func readHandbook() ([]byte, error) { + if b, err := os.ReadFile(handbookFile); err == nil && len(b) > 0 { + return b, nil + } + return handbookSnapshot, nil +} diff --git a/internal/lkgateway/incoming_notify.go b/internal/lkgateway/incoming_notify.go index c83ede2..dc1e263 100644 --- a/internal/lkgateway/incoming_notify.go +++ b/internal/lkgateway/incoming_notify.go @@ -179,7 +179,7 @@ func handbookNameByCode(code string) string { if code == "" { return "" } - raw, err := os.ReadFile(handbookFile) + raw, err := readHandbook() if err != nil { return "" } diff --git a/internal/lkgateway/m2mtest.go b/internal/lkgateway/m2mtest.go index 9c57c0b..e81af7e 100644 --- a/internal/lkgateway/m2mtest.go +++ b/internal/lkgateway/m2mtest.go @@ -744,7 +744,7 @@ func handbookLoad() { } byCode, byINN, codeINN := map[string]string{}, map[string]string{}, map[string]string{} var entries []HandbookEntry - if b, err := os.ReadFile(handbookFile); err == nil { + if b, err := readHandbook(); err == nil { var doc struct { Participants []HandbookEntry `json:"participants"` Places []HandbookEntry `json:"settlement_places"` diff --git a/internal/lkgateway/org.go b/internal/lkgateway/org.go index df46b48..9646a77 100644 --- a/internal/lkgateway/org.go +++ b/internal/lkgateway/org.go @@ -7,7 +7,6 @@ package lkgateway import ( "encoding/json" "net/http" - "os" "regexp" "strings" ) @@ -16,7 +15,7 @@ var regexpMCCode = regexp.MustCompile(`^[A-Z]{2}[0-9A-Z]{10}$`) // handbookParticipants — участники M2M из справочника НРД (без мест расчётов). func handbookParticipants() []HandbookEntry { - raw, err := os.ReadFile(handbookFile) + raw, err := readHandbook() if err != nil { return nil } diff --git a/internal/lkgateway/setup.go b/internal/lkgateway/setup.go index ddd03d7..9ca45fb 100644 --- a/internal/lkgateway/setup.go +++ b/internal/lkgateway/setup.go @@ -80,6 +80,10 @@ func registerSetup(mux *http.ServeMux, a *admin, rc *RuntimeConfig, svc *Service mux.HandleFunc("/admin/setup/update/apply", h.applyUpdate) mux.HandleFunc("/admin/setup/update/upload", h.uploadUpdate) mux.HandleFunc("/admin/setup/update/progress", h.updateProgress) + mux.HandleFunc("/admin/setup/wizard-depo/conn", h.wizardDepoConn) + mux.HandleFunc("/admin/setup/wizard-depo/tables", h.wizardDepoTables) + mux.HandleFunc("/admin/setup/wizard-depo/job", h.wizardDepoJob) + mux.HandleFunc("/admin/setup/wizard-depo/recheck", h.wizardDepoRecheck) mux.HandleFunc("/admin/setup/license", h.saveLicense) mux.HandleFunc("/admin/setup/license/activate", h.licenseActivate) mux.HandleFunc("/admin/setup/license/renew", h.licenseRenewNow) @@ -176,6 +180,7 @@ type WizardData struct { DepoAgent bool // у SQL Server есть SQL Agent (не Express, не PostgreSQL) DepoJobDef string // способ обработки по умолчанию для мастера Fancy *SetupData // шаг 3: общий блок «Обмен Fancy» (тот же, что в настройках) + Sub string // экран шага 3 (учёт DEPO): intro|conn|tables|job|done ValidataVer string // версия установленной «Валидаты Клиент L» (пусто — не установлена) CryptoSvc string // состояние службы bj-crypto (systemctl is-active) PGSummary string // куда подключена база bj, без пароля @@ -285,6 +290,12 @@ func (h *setupHandlers) renderWizard(w http.ResponseWriter, r *http.Request) { fd := h.setupData(w, r, "") d.Fancy = &fd } + if step == 3 { + d.Sub = depoWizardSub(r.URL.Query().Get("sub")) + if r.URL.Query().Get("sub") == "" && d.Done.Depo { + d.Sub = "done" + } + } d.Done.Org = orgCode(s) != "" && orgINN(s) != "" d.Done.Quik = !d.DepoLicensed || s.Quik.Verified if step == 3 && d.DepoLicensed && strings.TrimSpace(s.Fancy.Server) != "" { diff --git a/internal/lkgateway/web/templates/admin_wizard.html b/internal/lkgateway/web/templates/admin_wizard.html index c86fed8..b309d1c 100644 --- a/internal/lkgateway/web/templates/admin_wizard.html +++ b/internal/lkgateway/web/templates/admin_wizard.html @@ -84,24 +84,89 @@ a.wstep:hover .bub { box-shadow:0 0 0 4px var(--accent-weak); } {{end}} -{{/* ============= ШАГ 3: Учёт DEPO (Fancy) ============= */}} +{{/* ============= ШАГ 3: Учёт DEPO (Fancy) — по экранам ============= */}} {{if eq .Step 3}}

Шаг 3. Учётная система DEPO (Fancy)

-
Что это. Подключение к базе депозитарного учёта DEPO (MS SQL / PostgreSQL).
- Зачем. bj сверяет с DEPO каждый перевод (клиент, счёт, остаток, квалификация) и передаёт в DEPO поручения и их исполнение — документы создаются в учёте автоматически. Отсюда же bj возьмёт ваши реквизиты в НРД (шаг 6), чтобы не вводить их вручную.
- К кому обратиться. Адрес сервера базы DEPO, логин и пароль даёт ваш администратор баз данных (тот, кто обслуживает сервер учёта Fancy). Процедуру обработки обмена в базе DEPO ставит разработчик вашей системы учёта Fancy — если её ещё нет, bj подскажет на проверке.
- Что ввести здесь. Адрес сервера, логин и пароль. Всё остальное — таблицы обмена, джобу обработки, реквизиты вашей организации — bj подготовит сам; для таблиц и джобы понадобится разово логин администратора SQL, он не сохраняется.
{{if not .DepoLicensed}} -

Модуль обмена с DEPO и QUIK не входит в текущую лицензию — шаг пропускается. После добавления модуля в лицензию он станет доступен здесь и в «Настройка → Обмен Fancy».

+

Модуль обмена с DEPO и QUIK не входит в текущую лицензию — шаг пропускается.

{{else}} -

Это тот же раздел, что «Настройка → Обмен Fancy»: подключение к базе, трансферные таблицы и обработка (job). Что настроите здесь — сразу там, и наоборот.

- {{if .DepoEdition}}

Ваш SQL Server: {{.DepoEdition}} — {{if .DepoAgent}}есть SQL Server Agent: рекомендуем джобу Agent, её создаст bj (способ по умолчанию).{{else}}без SQL Server Agent: обработку будет запускать сам bj.{{end}}

{{end}} - {{with .Fancy}}
{{template "fancySection" .}}
{{end}} + {{$sub := .Sub}} +
{{range $i, $x := depoSubs}}{{add $i 1}}. {{$x.Title}}{{end}}
+ + {{if eq $sub "intro"}} +
Что это. Подключение bj к базе депозитарного учёта DEPO (Fancy).
+ Зачем. bj сверяет с учётом каждый перевод (клиент, счёт, остаток, квалификация) и сам передаёт в DEPO поручения и их исполнение — документы в учёте создаются автоматически. Отсюда же bj возьмёт реквизиты вашей организации (шаг 4).
+ Что понадобится. Адрес сервера базы DEPO, логин и пароль — их даёт ваш администратор баз данных. Для создания таблиц обмена и джобы обработки может понадобиться разово логин администратора SQL — он не сохраняется. Процедуру обработки обмена в базе DEPO ставит разработчик системы учёта Fancy; если её ещё нет, bj скажет об этом на проверке.
+ Как пойдём. Подключение → таблицы обмена → обработка → проверка. Каждый шаг проверяется сразу.
+
Начать →
+ + {{else if eq $sub "conn"}} +

Адрес сервера учётной базы DEPO и логин, под которым bj будет с ней работать. По «Далее» bj сохранит и сразу проверит подключение.

+
+
+
+
+
+
+
+ +
← Назад
+
+ + {{else if eq $sub "tables"}} +

Четыре таблицы обмена FTV_M2M* в базе {{.DepoTables.DB}}: через них bj передаёт поручения и события в DEPO. Данные учёта они не трогают. Кто их создаёт?

+
+ + +
+ + +
+ +
← Назад
+
+ + + {{else if eq $sub "job"}} +

Процедура {{.DepoJob.Proc}} в базе DEPO каждые {{.DepoJob.Every}} с превращает записи bj в документы и операции учёта. Кто её запускает?

+ {{if .DepoEdition}}

Ваш сервер: {{.DepoEdition}} — {{if .DepoAgent}}есть SQL Server Agent, рекомендуем первый вариант.{{else}}без SQL Server Agent, подходит вариант «запускает bj».{{end}}

{{end}} + {{$mode := .Settings.Fancy.DepoJobMode}}{{if not $mode}}{{$mode = .DepoJobDef}}{{end}}{{if not $mode}}{{$mode = "sql-auto"}}{{end}} +
+ {{if not .DepoTables.Postgres}}{{end}} + + {{if not .DepoTables.Postgres}}{{end}} +
+ + +
+ + + +
← Назад
+

Проверка: bj кладёт служебное событие и ждёт до 40 секунд, пока обработка его отметит.

+
+ + + {{else if eq $sub "done"}} + + + + +
Подключение к базе DEPO{{if .Settings.Fancy.Server}}✓ {{.Settings.Fancy.Server}}, база {{.DepoTables.DB}}{{else}}не настроено{{end}}
Таблицы обмена FTV_M2M{{if .Settings.Fancy.DepoTablesCheckOK}}✓ на месте{{else}}✗ {{.Settings.Fancy.DepoTablesCheck}}{{end}}
Обработка (job){{if .Settings.Fancy.DepoJobCheckOK}}✓ работает{{else}}✗ {{.Settings.Fancy.DepoJobCheck}}{{end}}
+ {{if .Done.Depo}}

Учёт DEPO подключён и проверен. Можно переходить к шагу 4 — там bj предложит реквизиты вашей организации из DEPO.

{{end}} +
+ {{end}} {{end}}
← К шагу 2 - {{if .Done.Depo}}К шагу 4 →{{else}}Пропустить →{{end}}
+ {{if .Done.Depo}}К шагу 4 →{{else}}Пропустить шаг →{{end}}
{{end}} {{/* ============= ШАГ 1: PostgreSQL ============= */}} diff --git a/internal/lkgateway/wizard_depo.go b/internal/lkgateway/wizard_depo.go new file mode 100644 index 0000000..45e7f5a --- /dev/null +++ b/internal/lkgateway/wizard_depo.go @@ -0,0 +1,185 @@ +package lkgateway + +// Шаг 3 мастера настройки (учёт DEPO) — маленький мастер по экранам вместо простыни настроек: +// описание → подключение → трансферные таблицы → обработка (job) → готово. Каждый экран делает +// своё действие по «Далее» и сразу проверяет результат; при ошибке экран не меняется, ошибка +// показывается понятным текстом. Полный раздел «Обмен Fancy» остаётся в «Настройке». + +import ( + "context" + "net/http" + "net/url" + "strings" + "time" +) + +// depoWizardSubs — экраны шага 3 по порядку. +var depoWizardSubs = []struct{ Key, Title string }{ + {"intro", "Что это"}, + {"conn", "Подключение"}, + {"tables", "Таблицы обмена"}, + {"job", "Обработка"}, + {"done", "Готово"}, +} + +func depoWizardSub(v string) string { + for _, s := range depoWizardSubs { + if s.Key == v { + return v + } + } + return "intro" +} + +// wizDepoGo — перейти на экран шага 3 с сообщением (ok=false — сообщение об ошибке). +func wizDepoGo(w http.ResponseWriter, r *http.Request, sub, msg string, ok bool) { + u := "/admin/wizard?step=3&sub=" + sub + if msg != "" { + if ok { + msg = "✓ " + msg + } else { + msg = "✗ " + msg + } + u += "&flash=" + url.QueryEscape(msg) + } + http.Redirect(w, r, u, http.StatusSeeOther) +} + +// wizardDepoConn — POST /admin/setup/wizard-depo/conn: сохранить подключение и сразу проверить его. +func (h *setupHandlers) wizardDepoConn(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost || !requireDepo(w, r) { + return + } + s := h.fancyFromForm(r) + if db := strings.TrimSpace(r.FormValue("depo_database")); db != "" { + if !validDBName(db) { + wizDepoGo(w, r, "conn", "имя базы DEPO — только латинские буквы, цифры и _, начинается с буквы", false) + return + } + if db != s.DepoDatabase { + s.DepoTablesCheck, s.DepoTablesCheckOK = "", false + } + s.DepoDatabase = db + } + if s.Server == "" || s.User == "" { + wizDepoGo(w, r, "conn", "укажите адрес сервера и логин", false) + return + } + if err := h.rc.UpdateFancy(s); err != nil { + wizDepoGo(w, r, "conn", "не сохранилось: "+err.Error(), false) + return + } + ctx, cancel := context.WithTimeout(r.Context(), 15*time.Second) + defer cancel() + if _, err := fancyPing(ctx, s, "master"); err != nil { + wizDepoGo(w, r, "conn", "к серверу подключиться не удалось — "+err.Error()+". Проверьте адрес, порт, логин и пароль.", false) + return + } + if _, err := fancyPing(ctx, s, s.DepoDB()); err != nil { + wizDepoGo(w, r, "conn", "сервер отвечает, но база "+s.DepoDB()+" недоступна этим логином — "+err.Error(), false) + return + } + wizDepoGo(w, r, "tables", "подключение к "+s.Server+", база "+s.DepoDB()+" — работает", true) +} + +// wizardDepoTables — POST /admin/setup/wizard-depo/tables: создать таблицы (bj) или проверить созданные +// администратором по скрипту. +func (h *setupHandlers) wizardDepoTables(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost || !requireDepo(w, r) { + return + } + s := h.rc.Snapshot().Fancy + mode := r.FormValue("depo_tables_mode") + if mode != "script" { + mode = "auto" + } + if s.DepoTablesMode != mode { + s.DepoTablesMode = mode + _ = h.rc.UpdateFancy(s) + } + ctx, cancel := context.WithTimeout(r.Context(), 2*time.Minute) + defer cancel() + if mode == "auto" && r.FormValue("action") != "check" { + if _, err := depoTablesCreate(ctx, s, r.FormValue("admin_user"), r.FormValue("admin_password")); err != nil { + wizDepoGo(w, r, "tables", "таблицы не созданы — "+err.Error()+". Если у логина bj нет прав, введите разово логин администратора SQL.", false) + return + } + } + msg, ok := depoTablesCheck(ctx, s) + h.saveDepoTablesCheck(msg, ok) + if !ok { + wizDepoGo(w, r, "tables", msg, false) + return + } + if !s.IsPostgres() { + _ = depoWriteHandbook(h.rc) + } + wizDepoGo(w, r, "job", "таблицы обмена на месте: "+msg, true) +} + +// wizardDepoJob — POST /admin/setup/wizard-depo/job: выбрать, кто запускает обработку, сделать нужное +// (для «джобу создаёт bj» — создать) и проверить служебным событием. +func (h *setupHandlers) wizardDepoJob(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost || !requireDepo(w, r) { + return + } + s := h.rc.Snapshot().Fancy + mode := r.FormValue("depo_job_mode") + if mode != "bj" && mode != "sql-auto" && mode != "sql-manual" { + mode = "sql-auto" + } + if s.DepoJobMode != mode { + s.DepoJobCheck, s.DepoJobCheckOK = "", false + } + s.DepoJobMode, s.DepoJobRun = mode, mode == "bj" + if err := h.rc.UpdateFancy(s); err != nil { + wizDepoGo(w, r, "job", "не сохранилось: "+err.Error(), false) + return + } + ctx, cancel := context.WithTimeout(r.Context(), 90*time.Second) + defer cancel() + if mode == "sql-auto" && r.FormValue("action") != "check" { + if err := depoJobCreateAgent(ctx, h.rc, r.FormValue("admin_user"), r.FormValue("admin_password")); err != nil && !strings.Contains(err.Error(), "уже существует") { + wizDepoGo(w, r, "job", "джоба не создана — "+err.Error(), false) + return + } + } + msg, ok := depoJobCheck(ctx, h.rc) + s = h.rc.Snapshot().Fancy + s.DepoJobCheck, s.DepoJobCheckOK, s.DepoJobCheckAt = msg, ok, time.Now() + _ = h.rc.UpdateFancy(s) + if !ok { + wizDepoGo(w, r, "job", "обработка пока не работает — "+msg, false) + return + } + wizDepoGo(w, r, "done", "обработка работает: "+msg, true) +} + +// wizardDepoRecheck — POST /admin/setup/wizard-depo/recheck: перепроверить всё на экране «Готово». +func (h *setupHandlers) wizardDepoRecheck(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost || !requireDepo(w, r) { + return + } + s := h.rc.Snapshot().Fancy + ctx, cancel := context.WithTimeout(r.Context(), 90*time.Second) + defer cancel() + if _, err := fancyPing(ctx, s, s.DepoDB()); err != nil { + wizDepoGo(w, r, "conn", "подключение не работает — "+err.Error(), false) + return + } + msg, ok := depoTablesCheck(ctx, s) + h.saveDepoTablesCheck(msg, ok) + if !ok { + wizDepoGo(w, r, "tables", msg, false) + return + } + jmsg, jok := depoJobCheck(ctx, h.rc) + s = h.rc.Snapshot().Fancy + s.DepoJobCheck, s.DepoJobCheckOK, s.DepoJobCheckAt = jmsg, jok, time.Now() + _ = h.rc.UpdateFancy(s) + if !jok { + wizDepoGo(w, r, "job", jmsg, false) + return + } + wizDepoGo(w, r, "done", "всё перепроверено", true) +}