Кабинет: номер договора без ФИО, шапка — отдельные поля «клиент / договор / данные на»

В учётной системе номер договора хранится вместе с ФИО («БР-719 Аминов Вячеслав Маркович»),
из-за чего имя показывалось дважды. В кабинет отдаём номер отдельно от имени; в шапке
портфеля вместо строки через точки — подписанные поля.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
This commit is contained in:
zuevav
2026-09-18 18:18:58 +03:00
parent 1136a1c46f
commit 20f05f924b
3 changed files with 28 additions and 7 deletions
+6 -6
View File
@@ -116,8 +116,8 @@ func registerLKAPI(mux *http.ServeMux, rc *RuntimeConfig, svc *Service) {
}
lkJSON(w, http.StatusOK, map[string]any{
"session": tok,
"full_name": u.FullName,
"contract": u.Contract,
"full_name": lkClientName(*u),
"contract": lkContractNumber(u.Contract),
"is_admin": u.IsAdmin,
"ttl_sec": int(lkSessionTTL.Seconds()),
})
@@ -199,8 +199,8 @@ func registerLKAPI(mux *http.ServeMux, rc *RuntimeConfig, svc *Service) {
}
total, priced := lkApplyPrices(r.Context(), rc, pos)
lkJSON(w, http.StatusOK, map[string]any{
"contract": u.Contract,
"full_name": u.FullName,
"contract": lkContractNumber(u.Contract),
"full_name": lkClientName(u),
"positions": pos,
"source": source,
"read_only": readOnly,
@@ -310,7 +310,7 @@ func registerLKAPI(mux *http.ServeMux, rc *RuntimeConfig, svc *Service) {
return
}
pf.Note = strings.TrimSpace(pf.Note)
resp := map[string]any{"portfolio": pf, "contract": u.Contract, "full_name": u.FullName}
resp := map[string]any{"portfolio": pf, "contract": lkContractNumber(u.Contract), "full_name": lkClientName(u)}
if q.Get("view") != "archive" {
resp["upcoming"] = lkUpcoming(r.Context(), fancy, pf.Positions, 90) // ближайшие выплаты за 90 дней
}
@@ -529,7 +529,7 @@ func registerLKAPI(mux *http.ServeMux, rc *RuntimeConfig, svc *Service) {
lkAuditImpersonate(r.Context(), rc, u.Login, "depo:"+full, full, lkClientAddr(r))
lkJSON(w, http.StatusOK, map[string]any{
"session": tok, "full_name": name,
"contract": full, "as_client": full, "by_admin": u.Login,
"contract": full, "as_client": lkContractNumber(full), "by_admin": u.Login,
})
return
}
+13
View File
@@ -100,3 +100,16 @@ func spectreContractFor(ctx context.Context, s FancyMSSQLSettings, contract stri
spectreContractCache.mu.Unlock()
return c, err == nil && c.DOC != 0
}
// lkClientName — ФИО клиента для показа: из учётной записи, иначе из номера договора,
// где учётная система хранит номер вместе с ФИО («БР-719 Аминов Вячеслав Маркович»).
func lkClientName(u LKUser) string {
if n := strings.TrimSpace(u.FullName); n != "" {
return n
}
c := strings.TrimSpace(u.Contract)
if i := strings.IndexByte(c, ' '); i > 0 {
return strings.TrimSpace(c[i:])
}
return ""
}
+9 -1
View File
@@ -57,6 +57,10 @@ a{color:var(--acc)}a:hover{color:#1e3395}
.stats{display:flex;gap:14px 46px;flex-wrap:wrap}
.stat{display:flex;flex-direction:column;gap:3px}
.stat .v{font-family:var(--mono);font-variant-numeric:tabular-nums;font-size:22px}
.meta{display:flex;gap:6px 30px;flex-wrap:wrap;margin-top:12px}
.meta .m{display:flex;flex-direction:column;gap:1px}
.meta .k{font-family:var(--mono);font-size:9.5px;letter-spacing:.1em;text-transform:uppercase;color:#8e8879}
.meta .v{font-size:13px;color:#d9d3c6}
.imp{background:var(--board);color:#f3f0e7;padding:10px 20px;font-size:13px;display:flex;gap:10px;align-items:center;flex-wrap:wrap}
main{max-width:1180px;margin:0 auto;padding:22px 20px 34px}
h1{font-size:23px;margin:0 0 6px;letter-spacing:-.01em}h2{font-size:15px;margin:0 0 12px;letter-spacing:-.005em}
@@ -159,7 +163,11 @@ input[type=checkbox]{width:20px;min-height:20px;height:20px}
<div>
<span class="lbl" style="color:var(--dim)">Стоимость портфеля{{if eq .View "archive"}} на {{$p.AsOf}}{{end}}</span>
<div class="big" style="margin-top:8px">{{fmtmoney $p.Total}} ₽</div>
<div class="n" style="font-size:13px;color:var(--dim);margin-top:6px">{{with .FullName}}{{.}} · {{end}}договор {{.Contract}}{{if and (ne .View "archive") $p.AsOf}} · данные на {{$p.AsOf}}{{end}}</div>
<div class="meta">
{{with .FullName}}<span class="m"><span class="k">Клиент</span><span class="v">{{.}}</span></span>{{end}}
{{with .Contract}}<span class="m"><span class="k">Договор</span><span class="v n">{{.}}</span></span>{{end}}
{{with $p.AsOf}}<span class="m"><span class="k">{{if eq $.View "archive"}}На дату{{else}}Данные на{{end}}</span><span class="v n">{{.}}</span></span>{{end}}
</div>
</div>
<div class="stats">
<span class="stat"><span class="lbl" style="color:var(--dim)">Бумаги</span><span class="v">{{fmtmoney $p.Securities}} ₽</span></span>