diff --git a/internal/lkgateway/depo_detect.go b/internal/lkgateway/depo_detect.go
index 7b7739d..87646cb 100644
--- a/internal/lkgateway/depo_detect.go
+++ b/internal/lkgateway/depo_detect.go
@@ -27,9 +27,11 @@ type DepoRequisites struct {
Sections []string // все открытые разделы счёта
OrgCode string // = DeponentCode
OrgINN string
- OrgName string
- OrgShort string
- OrgEng string
+ OrgName string // краткое (OD_FACES.NAME)
+ OrgShort string // = OrgName (MNEM в DEPO — мнемоника, не наименование)
+ OrgEng string // английское краткое
+ OrgFull string // полное (OD_U_FACES.FULL_NAME)
+ OrgEngFull string // английское полное
Notes []string // что не нашли / на что обратить внимание
At time.Time
}
@@ -127,15 +129,23 @@ func depoDetectRequisites(ctx context.Context, fs FancyMSSQLSettings) (*DepoRequ
}
// организация по коду участника
if res.DeponentCode != "" {
- var name, inn, mnem, eng string
- err := db.QueryRowContext(ctx, fsql.Det02, sql.Named("code", res.DeponentCode)).Scan(&name, &inn, &mnem, &eng)
+ var name, inn, mnem, eng, full, engFull string
+ err := db.QueryRowContext(ctx, fsql.Det03, sql.Named("code", res.DeponentCode)).Scan(&name, &inn, &mnem, &eng, &full, &engFull)
+ if err != nil && err != sql.ErrNoRows {
+ err = db.QueryRowContext(ctx, fsql.Det02, sql.Named("code", res.DeponentCode)).Scan(&name, &inn, &mnem, &eng)
+ }
switch {
case err == sql.ErrNoRows:
res.Notes = append(res.Notes, "лицо с кодом "+res.DeponentCode+" в DEPO не найдено — ИНН и наименование организации введите вручную")
case err != nil:
res.Notes = append(res.Notes, "карточка организации: "+err.Error())
default:
- res.OrgCode, res.OrgINN, res.OrgName, res.OrgShort, res.OrgEng = res.DeponentCode, strings.TrimSpace(inn), strings.TrimSpace(name), strings.TrimSpace(mnem), strings.TrimSpace(eng)
+ _ = mnem
+ res.OrgCode, res.OrgINN, res.OrgName, res.OrgShort, res.OrgEng = res.DeponentCode, strings.TrimSpace(inn), strings.TrimSpace(name), strings.TrimSpace(name), strings.TrimSpace(eng)
+ res.OrgFull, res.OrgEngFull = strings.TrimSpace(full), strings.TrimSpace(engFull)
+ if res.OrgFull == "" {
+ res.Notes = append(res.Notes, "полного наименования организации в DEPO нет — для анкеты участника уточните его у НРД")
+ }
}
}
return res, nil
diff --git a/internal/lkgateway/fsql/depodetect.go b/internal/lkgateway/fsql/depodetect.go
index 98e2023..10f4297 100644
--- a/internal/lkgateway/fsql/depodetect.go
+++ b/internal/lkgateway/fsql/depodetect.go
@@ -7,6 +7,14 @@ package fsql
var Det01 = `SELECT c.NUMBER, ISNULL(c.STATE,0), ISNULL(c.NAME,'') FROM OD_CLIENTS c JOIN OD_FACES f ON f.ID=c.FACE
WHERE f.INN='7702165310' AND c.NUMBER LIKE '%/%/%/%' ORDER BY c.STATE, c.NUMBER`
-// Det02 — карточка организации по коду участника НРД (кодер лица).
+// Det03 — карточка организации по коду участника НРД: действующая версия лица (кодер ссылается на исходную
+// запись SELF_ID, действующая — LAST_FLAG=1) и юридические наименования из OD_U_FACES. NAME в OD_FACES —
+// краткое («ООО "…"»), полное и английское полное — только в OD_U_FACES, английское краткое — OD_FACES.ENG_NAME.
+var Det03 = `SELECT TOP 1 ISNULL(f.NAME,''), ISNULL(f.INN,''), ISNULL(f.MNEM,''), ISNULL(f.ENG_NAME,''), ISNULL(u.FULL_NAME,''), ISNULL(u.ENG_FULL_NAME,'')
+ FROM OD_FACE_CODERS fc JOIN OD_FACES f ON (f.ID=fc.FACE OR f.SELF_ID=fc.FACE) LEFT JOIN OD_U_FACES u ON u.FACE=f.ID
+ WHERE fc.CODE=@code ORDER BY ISNULL(f.LAST_FLAG,0) DESC, f.B_DATE DESC, f.ID DESC`
+
+// Det02 — карточка организации по коду участника НРД (кодер лица); запасной вариант, если в DEPO нет
+// OD_U_FACES или версионных полей.
var Det02 = `SELECT TOP 1 ISNULL(f.NAME,''), ISNULL(f.INN,''), ISNULL(f.MNEM,''), ISNULL(f.ENG_NAME,'')
FROM OD_FACE_CODERS fc JOIN OD_FACES f ON f.ID=fc.FACE WHERE fc.CODE=@code ORDER BY f.E_DATE DESC, f.ID DESC`
diff --git a/internal/lkgateway/participant_form.go b/internal/lkgateway/participant_form.go
index f2a2f8e..16233de 100644
--- a/internal/lkgateway/participant_form.go
+++ b/internal/lkgateway/participant_form.go
@@ -53,12 +53,30 @@ type participantFormData struct {
// participantFormPrefill — предзаполнение из автоопределения DEPO и настроек НРД.
func participantFormPrefill(rc *RuntimeConfig) participantFormData {
var d participantFormData
- if r := depoDetectResult(); r != nil {
+ r := depoDetectResult()
+ if r == nil && rc != nil && strings.TrimSpace(rc.Snapshot().Fancy.Server) != "" {
+ // после перезапуска bj автоопределения в памяти нет — прочитать DEPO сейчас
+ ctx, cancel := context.WithTimeout(context.Background(), 20*time.Second)
+ if res, err := depoDetectRequisites(ctx, rc.Snapshot().Fancy); err == nil {
+ lastDepoDetect.mu.Lock()
+ lastDepoDetect.r = res
+ lastDepoDetect.mu.Unlock()
+ r = res
+ }
+ cancel()
+ }
+ if r != nil {
+ // DEPO: полное — OD_U_FACES, краткое — OD_FACES.NAME, отображаемое = краткое (так советует НРД);
+ // английские — только парой (полное + краткое), иначе их не указываем
d.INN = strings.TrimSpace(r.OrgINN)
- d.FullName = strings.TrimSpace(r.OrgName)
- d.ShortName = strings.TrimSpace(r.OrgShort)
- d.DisplayName = strings.TrimSpace(r.OrgShort)
- d.EngFull = strings.TrimSpace(r.OrgEng)
+ d.FullName = strings.TrimSpace(pick(r.OrgFull, r.OrgName))
+ d.ShortName = strings.TrimSpace(r.OrgName)
+ d.DisplayName = strings.TrimSpace(r.OrgName)
+ if strings.TrimSpace(r.OrgEngFull) != "" {
+ d.EngFull = strings.TrimSpace(r.OrgEngFull)
+ d.EngShort = strings.TrimSpace(r.OrgEng)
+ d.EngDisplay = d.EngShort
+ }
if d.DepoCode == "" {
d.DepoCode = strings.TrimSpace(r.DeponentCode)
}
@@ -81,18 +99,13 @@ func participantFormPrefill(rc *RuntimeConfig) participantFormData {
if ok {
// НРД сверяет наименования анкеты со своей клиентской базой (M2M37) — карточка в справочнике
// НРД главнее DEPO: в DEPO «наименование» бывает кратким (21.10.2026 краткое ушло в FullName).
- // Английские — только если их ввели: в справочнике есть лишь краткое, полного нет.
+ // Английские — из DEPO: в справочнике НРД есть лишь краткое.
if n := strings.TrimSpace(hb.FullName); n != "" {
d.FullName = n
}
if n := strings.TrimSpace(hb.Name); n != "" && hb.FullName != "" {
d.ShortName, d.DisplayName = n, n // отображаемое НРД советует как краткое
}
- if strings.TrimSpace(hb.FullName) != "" {
- d.EngFull = ""
- } else if d.EngFull == "" {
- d.EngFull = strings.TrimSpace(hb.EngName)
- }
if hb.Kind == "broker" && d.BrokerCode == "" {
d.BrokerCode = strings.ToUpper(strings.TrimSpace(hb.Code))
}
@@ -172,8 +185,8 @@ func pfNameCheck(rc *RuntimeConfig, d participantFormData) []string {
if x.FullName != d.FullName {
w = append(w, "Полное наименование отличается от карточки нашей фирмы в справочнике НРД: «"+x.FullName+"». НРД сверяет с ней — без причины не меняйте.")
}
- default:
- w = append(w, "Наименования взяты из DEPO, в справочнике НРД нашей карточки нет. НРД сверяет их со своей клиентской базой — уточните точные наименования у НРД и впишите как есть.")
+ case strings.TrimSpace(d.FullName) == "":
+ w = append(w, "Полного наименования нет ни в DEPO, ни в справочнике НРД — уточните его у НРД и впишите как есть.")
}
if pfAbbrRe.MatchString(d.FullName) || (d.FullName != "" && d.FullName == d.ShortName) {
w = append(w, "Полное наименование похоже на сокращённое — нужно полное («Общество с ограниченной ответственностью …»), как в клиентской базе НРД.")
@@ -539,7 +552,7 @@ pre{background:#f6f8fa;border:1px solid #ddd;border-radius:8px;padding:12px;over
Без регистрации сервис отбивает запросы кодом M2M14. В боевом контуре анкета подаётся через ИШ
пакетом #M2MPF (businessLine=MOST, подпись боевым контейнером на стороне ИШ); письмо на
` + participantFormRecipient + ` оставлено запасным каналом. Наименования должны точно совпадать с
-клиентской базой НРД (иначе M2M37): bj берёт их из карточки нашей фирмы в справочнике НРД, а если её нет — из DEPO.
+клиентской базой НРД (иначе M2M37): bj берёт их из карточки нашей фирмы в справочнике НРД и из DEPO (полное — карточка юрлица).
Чего нет или в чём bj не уверен — уточните у НРД. Кавычки — прямые ".