feat(bj): модуль ЛК на PostgreSQL, обмен с DEPO, боевой ЛК с имитатором НРД, QUIK, НПР

- bj_exchange и «кран» Fancy убраны: данные модуля ЛК в PostgreSQL (схема lk)
- трансферные таблицы FTV_M2M: создание при установке, события, справочник участников
- сверка с DEPO: счёт, ФИО, дата рождения, ИИС по договору, квал-инвестор из опции DEPO
- боевой ЛК ЕСИА Финанс при тестовом ИШ: журнал, отказ через DEPO, статусы в ЛК
- онлайн-лицензирование в bj, план тестирования M2M для контрагента (интерактивный HTML)
- модули QUIK МНП, экспорт QUIK, НПР/УДС; документы и тестовые материалы

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
zuevav
2026-09-15 19:41:12 +03:00
parent 59fc774f08
commit da12a9ec1c
132 changed files with 29969 additions and 1089 deletions
+40
View File
@@ -0,0 +1,40 @@
package lkgateway
import (
"context"
"path/filepath"
"testing"
)
// Данные заявки ЛК на входе не бракуются: заявка забирается и уходит в журнал, решает
// проверка шлюза (сверка с DEPO) и формат НРД.
func TestLKClaimAcceptedForGatewayCheck(t *testing.T) {
rc, err := NewRuntimeConfig(filepath.Join(t.TempDir(), "setup.json"))
if err != nil {
t.Fatal(err)
}
cases := []struct {
name string
data map[string]any
}{
{"ISIN из ЛК-стенда (8 символов)", map[string]any{"paper": map[string]any{"name": "СБЕР", "isin": "RU123321", "registration_number": "321123"}, "paper_count": 1.0}},
{"ISIN длиннее 12", map[string]any{"paper": map[string]any{"isin": "RU0009029540X"}, "paper_count": 1.0}},
{"иностранная бумага", map[string]any{"paper": map[string]any{"isin": "US0378331005"}, "paper_count": 1.0}},
{"нет бумаги", map[string]any{"paper": map[string]any{"name": "СБЕР"}, "paper_count": 1.0}},
{"нет количества", map[string]any{"paper": map[string]any{"isin": "RU0009029540"}, "paper_count": 0.0}},
}
for _, c := range cases {
req, err := lkClaimToRequest(context.Background(), rc, LKEndpoint{}, map[string]any{"id": 1.0}, c.data)
if err != nil {
t.Errorf("%s: заявка должна приниматься в разбор, получили %v", c.name, err)
continue
}
if len(req.Securities) != 1 {
t.Errorf("%s: бумаг %d, ожидали 1", c.name, len(req.Securities))
continue
}
if _, err := dtoToClaim(req); err != nil {
t.Errorf("%s: пакет должен собираться без проверки формата, dtoToClaim: %v", c.name, err)
}
}
}