Firebird: автоопределение из DEPO как на MSSQL — реквизиты организации и поиск без учёта регистра
Проверено по шагам мастера, что bj берёт из DEPO сам: подготовка базы, префикс счетов (шаг 3), реквизиты (шаг 4), готовность (шаг 10), ручной ввод, подбор клиента для портфеля ЛК. - Реквизиты (Det01): счёт НРД ссылается на исходную версию лица, а ИНН НРД бывает только в новых (в исходной — ИНН НДЦ) — лицо по любой версии (ID или SELF_ID; ИНН НРД или MNEM «НДЦ»); номер счёта — и «счёт/раздел», не только «счёт/LEI/код/раздел». Счёт НРД — тот, с которым записан выбранный раздел (пара «раздел + счёт» — по ней процедуры находят место хранения), а не самый частый. Для MSSQL — только шире: прежнее находится. - Поиск по ФИО, договору и счёту — без учёта регистра, как в MSSQL (Cyrillic_General_CI_AS): в базе Fancy с кодировкой NONE регистр кириллицы различается — Firebird-варианты сравнивают в WIN1251 (подбор клиента для портфеля ЛК — запросы вынесены в fsql/lkportfolio.go, поиск и список договоров). - На копии базы: шаг 4 — счёт, код, разделы, ИНН и наименования организации; поиск «бр-1147», «бубликов» находит; FBLivePrepare — 103 из 103. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
This commit is contained in:
@@ -75,14 +75,15 @@ func depoDetectRequisites(ctx context.Context, fs FancyMSSQLSettings) (*DepoRequ
|
||||
accounts := map[string]int{}
|
||||
codes := map[string]int{}
|
||||
sections := map[string]bool{}
|
||||
pairs := map[string]map[string]int{} // открытый раздел → счета, с которыми он записан в DEPO
|
||||
for rows.Next() {
|
||||
var number, name string
|
||||
var state int
|
||||
if rows.Scan(&number, &state, &name) != nil {
|
||||
continue
|
||||
}
|
||||
parts := strings.Split(strings.TrimSpace(number), "/")
|
||||
if len(parts) < 4 {
|
||||
parts := strings.Split(strings.TrimSpace(number), "/") // счёт/LEI/код/раздел или счёт/раздел
|
||||
if len(parts) < 2 {
|
||||
continue
|
||||
}
|
||||
acc, sec := strings.TrimSpace(parts[0]), strings.TrimSpace(parts[len(parts)-1])
|
||||
@@ -93,6 +94,12 @@ func depoDetectRequisites(ctx context.Context, fs FancyMSSQLSettings) (*DepoRequ
|
||||
codes[m[2]]++
|
||||
if state == 0 {
|
||||
sections[sec] = true
|
||||
if depoAccountRe.MatchString(acc) {
|
||||
if pairs[sec] == nil {
|
||||
pairs[sec] = map[string]int{}
|
||||
}
|
||||
pairs[sec][acc]++
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -124,7 +131,21 @@ func depoDetectRequisites(ctx context.Context, fs FancyMSSQLSettings) (*DepoRequ
|
||||
}
|
||||
res.Notes = append(res.Notes, "раздела "+want+" нет среди открытых — проверьте выбранный раздел")
|
||||
}
|
||||
if len(accounts) > 1 {
|
||||
// счёт — тот, с которым выбранный раздел записан в DEPO: по паре «раздел + счёт» процедуры обработки
|
||||
// находят место хранения (у организации бывает несколько счетов в НРД с торговым разделом)
|
||||
if p := pairs[res.SectionID]; len(p) > 0 {
|
||||
res.AccountID = mostCommon(p)
|
||||
if len(p) > 1 {
|
||||
var other []string
|
||||
for a := range p {
|
||||
if a != res.AccountID {
|
||||
other = append(other, a)
|
||||
}
|
||||
}
|
||||
sort.Strings(other)
|
||||
res.Notes = append(res.Notes, fmt.Sprintf("раздел %s записан в DEPO с несколькими счетами в НРД — выбран %s, есть ещё %s: проверьте по договору с НРД", res.SectionID, res.AccountID, strings.Join(other, ", ")))
|
||||
}
|
||||
} else if len(accounts) > 1 {
|
||||
res.Notes = append(res.Notes, fmt.Sprintf("в DEPO несколько депозитарных счетов в НРД (%d) — выбран самый частый %s", len(accounts), res.AccountID))
|
||||
}
|
||||
// организация по коду участника
|
||||
|
||||
Reference in New Issue
Block a user