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
+44
View File
@@ -25,6 +25,9 @@ type CreateClaimRequest struct {
// InvestorDocumentOverride — если задан, переопределяет документ инвестора
// из анкеты. Используется тестом с роботом НРД (серия ДУЛ = код сценария).
InvestorDocumentOverride *Document `json:"investor_document_override,omitempty"`
// ClientAccount — торговый счёт депо клиента из заявки (ЛК): сверяется с DEPO —
// должен принадлежать найденному по паспорту инвестору и быть открыт.
ClientAccount string `json:"client_account,omitempty"`
}
// Investor — анкета.
@@ -34,6 +37,7 @@ type Investor struct {
FirstName string `json:"first_name"`
MiddleName string `json:"middle_name,omitempty"`
Document Document `json:"document"`
BirthDate string `json:"birth_date,omitempty"` // ГГГГ-ММ-ДД (из карточки пользователя ЛК), сверяется с DEPO
}
// Document — удостоверение личности.
@@ -141,6 +145,46 @@ type ClaimView struct {
M2MGUID m2m.UUID `json:"m2m_guid,omitempty"`
M2MResponse *NSDResponseView `json:"m2m_response,omitempty"`
M2MDecision *NSDDecisionView `json:"m2m_decision,omitempty"`
// RequestRawXML — точный M2MTransferRequest, отправленный в НРД
// (декодирован в UTF-8). Чтобы в карточке видеть отправленный пакет.
RequestRawXML string `json:"request_raw_xml,omitempty"`
// TestResult — для тестовых заявок роботу НРД: что ожидали по сценарию,
// что получили, и совпало ли. Nil для обычных (не тестовых) заявок.
TestResult *TestResultView `json:"test_result,omitempty"`
// Timeline — путь заявки во времени: положена в БД Fancy → вердикт «крана»
// → отправлена в шлюз НРД → ответ НРД. С длительностями между этапами.
Timeline []TimelineEvent `json:"timeline,omitempty"`
}
// TimelineEvent — один шаг в истории движения заявки.
type TimelineEvent struct {
Title string `json:"title"` // что произошло
Time time.Time `json:"time"` // когда
Detail string `json:"detail,omitempty"` // подробность (кто/что/причина)
Since string `json:"since,omitempty"` // сколько прошло с предыдущего шага (человекочит.)
Kind string `json:"kind"` // db | crane | gateway | response | reject
}
// TestResultView — самопроверка тестовой заявки роботу НРД: сценарий,
// ожидаемый и фактический результат, вердикт.
type TestResultView struct {
Scenario string `json:"scenario"` // 1111 / 2001 / 2002 / 3333
Title string `json:"title"` // человекочитаемое название сценария
Expected string `json:"expected"` // что ждём от робота
Got string `json:"got"` // что реально пришло
Status string `json:"status"` // ok | mismatch | waiting | error
Note string `json:"note,omitempty"` // пояснение
}
// statusFromBool ставит ok/mismatch и пояснение по результату сравнения.
func (t *TestResultView) statusFromBool(ok bool, okNote, badNote string) {
if ok {
t.Status = "ok"
t.Note = okNote
} else {
t.Status = "mismatch"
t.Note = badNote
}
}
// StageView — точка истории FSM для UI.