Кабинет: оценка портфеля по ценам QUIK и карточка бумаги из справочника депозитария

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
zuevav
2026-09-17 23:03:31 +03:00
parent f057b89d2e
commit 26785ff3ba
8 changed files with 614 additions and 21 deletions
+53 -5
View File
@@ -236,15 +236,63 @@ func registerLKAPI(mux *http.ServeMux, rc *RuntimeConfig, svc *Service) {
}
pos = p2
}
total, priced := lkApplyPrices(r.Context(), rc, pos)
lkJSON(w, http.StatusOK, map[string]any{
"contract": u.Contract,
"full_name": u.FullName,
"positions": pos,
"source": source,
"read_only": readOnly,
"contract": u.Contract,
"full_name": u.FullName,
"positions": pos,
"source": source,
"read_only": readOnly,
"total_value": total, // оценка портфеля, 0 — цен нет
"priced": priced, // по скольким бумагам есть цена
})
})
// Карточка бумаги: реквизиты выпуска, цена, позиция клиента, график выплат.
mux.HandleFunc("/api/lk/security", func(w http.ResponseWriter, r *http.Request) {
if !auth(w, r) {
return
}
u, ok := current(w, r)
if !ok {
return
}
isin := strings.ToUpper(strings.TrimSpace(r.URL.Query().Get("isin")))
if isin == "" {
lkJSON(w, http.StatusBadRequest, map[string]string{"error": "не указана бумага"})
return
}
var pos *ClientPosition
if dp, err := depoClientPositions(r.Context(), rc.Snapshot().Fancy, u.Contract); err == nil && len(dp) > 0 {
for _, p := range depoPositionsAsClient(dp) {
if strings.EqualFold(p.ISIN, isin) {
cp := p
pos = &cp
break
}
}
} else if p2, err2 := lkClientPositions(r.Context(), rc, u.Contract); err2 == nil {
for _, p := range markTransferable(p2) {
if strings.EqualFold(p.ISIN, isin) {
cp := p
pos = &cp
break
}
}
}
if pos != nil {
one := []ClientPosition{*pos}
lkApplyPrices(r.Context(), rc, one)
pos = &one[0]
}
card, err := securityCard(r.Context(), rc, isin, pos)
if err != nil {
lkJSON(w, http.StatusBadRequest, map[string]string{"error": err.Error()})
return
}
lkJSON(w, http.StatusOK, map[string]any{"security": card})
})
mux.HandleFunc("/api/lk/claims", func(w http.ResponseWriter, r *http.Request) {
if !auth(w, r) {
return