Кабинет: верная оценка валютных выпусков и читаемые числа
- prices.go: у выпуска берётся валюта номинала (FaceUnit); «замещающие» и еврооблигации котируются в процентах от валютного номинала, поэтому тело переводится в рубли по курсу, НКД экспорт отдаёт уже в рублях. Без курса оценка не выдумывается - lkfx.go: официальные курсы валют из учётной системы (OD_VALUES_RATES, MARKET=0; DEPO, затем SPECTRE — берём свежее), кэш на час; дата курса показывается под таблицей - БР-719 онлайн: было 17 млн ₽ (валютные считались рублёвыми), стало 522 млн ₽ — сходится с архивом брокерского учёта (НОВАТЭК 001Р-02: 162,65 млн против 162,32 млн на дату среза) - вёрстка: отступ между числовыми колонками (числа больше не слипаются), больше воздуха между показателями в шапке, кнопка «Новое поручение» компактнее, цены от 10 — два знака - структура портфеля: плитки с долей и суммой вместо строки в одну линию; блок денег показывается, только когда валют несколько Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
This commit is contained in:
+18
-6
@@ -94,15 +94,21 @@ func New(cfg Config) (*Server, error) {
|
||||
}
|
||||
return fmtMoney(f)
|
||||
},
|
||||
"fmtprice": func(f float64) string { // цена: до 4 знаков, без хвостовых нулей, с пробелами разрядов
|
||||
"fmtprice": func(f float64) string { // цена: крупные — 2 знака, мелкие — до 4
|
||||
if f == 0 {
|
||||
return "—"
|
||||
}
|
||||
s := strconv.FormatFloat(f, 'f', 4, 64)
|
||||
s = strings.TrimRight(strings.TrimRight(s, "0"), ".")
|
||||
whole, frac := s, ""
|
||||
if i := strings.IndexByte(s, '.'); i >= 0 {
|
||||
whole, frac = s[:i], s[i+1:]
|
||||
digits := 4
|
||||
if f >= 10 || f <= -10 {
|
||||
digits = 2
|
||||
}
|
||||
str := strconv.FormatFloat(f, 'f', digits, 64)
|
||||
if strings.Contains(str, ".") {
|
||||
str = strings.TrimRight(strings.TrimRight(str, "0"), ".")
|
||||
}
|
||||
whole, frac := str, ""
|
||||
if i := strings.IndexByte(str, '.'); i >= 0 {
|
||||
whole, frac = str[:i], str[i+1:]
|
||||
}
|
||||
neg := strings.HasPrefix(whole, "-")
|
||||
whole = strings.TrimPrefix(whole, "-")
|
||||
@@ -781,6 +787,12 @@ func (s *Server) buildHandler() http.Handler {
|
||||
}
|
||||
data["P"], data["Contract"], data["FullName"] = out.Portfolio, out.Contract, out.FullName
|
||||
data["Structure"], data["Upcoming"] = portfolioStructure(out.Portfolio), out.Upcoming
|
||||
// Рубли и так видны в шапке и структуре — отдельный блок нужен, когда валют несколько.
|
||||
showCash := len(out.Portfolio.Cash) > 1
|
||||
if len(out.Portfolio.Cash) == 1 && out.Portfolio.Cash[0].Currency != "SUR" {
|
||||
showCash = true
|
||||
}
|
||||
data["ShowCash"] = showCash
|
||||
var upTotal float64
|
||||
for _, u := range out.Upcoming {
|
||||
upTotal += u.Total
|
||||
|
||||
Reference in New Issue
Block a user