Кабинет: курсы ЦБ, история стоимости портфеля, быстрые операции, контакты в профиле
Курсы валют. Оценивать замещающие и еврооблигации по курсу из копии учётной системы было нельзя: в DEPO он от 31.05.2026, в SPECTRE — от 18.07.2026. Берём официальный курс Банка России (открытый XML, без ключа — тем же каналом пользуется Инвест-хаб) и складываем по дням в lk.fx_rates: без интернета кабинет считает по последнему известному курсу, а не отказывается оценивать. Источник переключается в настройках («Данные кабинета»), там же кнопка «Обновить курсы сейчас». Портфель БР-719: 560,3 млн ₽ против 522 млн по старому курсу. История стоимости. Ни QUIK, ни SPECTRE её не хранят, поэтому раз в день после закрытия торгов считаем стоимость каждого портфеля по экспорту QUIK и пишем строку в lk.portfolio_daily (257 портфелей за 14 секунд). Кабинет рисует по ним график на странице портфеля — SVG собирается на сервере, скриптов в кабинете по-прежнему нет. Режим по умолчанию — «автоматически»: ведём, если настроен экспорт QUIK, потому что задним числом историю не восстановить. Операции. Связка «JOIN OD_RESTS ON sr.ID = CASE WHEN w.D_REST IN (…)» заставляла SQL Server разбирать список счетов на каждой строке журнала проводок: год данных читался 6–7 секунд. Обе стороны проводки выбираются заранее двумя ветвями UNION ALL, индексы IX_WIRING_D_REST_WIRDATE и IX_WIRING_K_REST_WIRDATE отрабатывают поиском — 89 мс на тех же 64 строках. Период по умолчанию вернули к году, ответ кэшируется на пять минут. Профиль: почта, телефон и прошлый вход из анкеты — клиент видит, куда с ним свяжется депозитарий, и заметит устаревшие данные. Правка только через менеджера. Заказ документов из кабинета убран совсем (форма была убрана раньше, теперь нет и обработчика). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
This commit is contained in:
@@ -85,6 +85,13 @@ input,select,textarea{width:100%;min-height:44px;padding:10px 12px;border:1px so
|
||||
input:focus,select:focus,textarea:focus{outline:2px solid var(--acc);outline-offset:1px}
|
||||
input[type=checkbox]{width:20px;min-height:20px;height:20px}
|
||||
/* поиск клиентов: поле с подсказками браузера (datalist) + кнопки в строку */
|
||||
.chart svg{width:100%;height:190px;display:block}
|
||||
.chart .g{stroke:var(--line);stroke-width:1}
|
||||
.chart .a{fill:var(--amber-bg);opacity:.55}
|
||||
.chart .l{fill:none;stroke:var(--amber);stroke-width:2;vector-effect:non-scaling-stroke}
|
||||
.chart .axis{position:relative;height:16px;margin-top:2px;font-size:11px;color:var(--mut)}
|
||||
.chart .axis span{position:absolute;transform:translateX(-50%);white-space:nowrap}
|
||||
.chart .scale{display:flex;justify-content:space-between;font-size:11px;color:var(--mut);margin-top:2px}
|
||||
.cfind{display:flex;gap:10px;align-items:flex-end;flex-wrap:wrap;max-width:720px}
|
||||
.cfind .btn{flex:none}
|
||||
.btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;min-height:46px;padding:0 18px;border:1px solid var(--line-2);border-radius:3px;background:#fff;color:var(--ink);font:inherit;font-size:14px;font-weight:600;cursor:pointer;text-decoration:none}
|
||||
@@ -185,6 +192,19 @@ input[type=checkbox]{width:20px;min-height:20px;height:20px}
|
||||
<span class="mut" style="margin-left:auto;font-size:12.5px">{{if eq .View "archive"}}Портфель по брокерскому учёту на выбранную дату{{else if eq $p.Source "quik"}}Позиции и деньги в торговой системе, цены биржи{{else}}Портфель по брокерскому учёту{{end}}</span>
|
||||
</div>
|
||||
|
||||
{{with .Chart}}<section class="sec chart" style="margin-bottom:18px">
|
||||
<div class="sec-h"><h2 class="lbl" style="font-size:12px;letter-spacing:.14em">Стоимость портфеля</h2>
|
||||
<span class="mut" style="font-size:12.5px">{{.FromDay}} — {{.ToDay}} · <span class="{{if lt .Change 0.0}}neg{{else if gt .Change 0.0}}pos{{end}}">{{fmtsigned .Change}} ₽ · {{fmtpct .ChangePct}}</span></span></div>
|
||||
<svg viewBox="0 0 {{printf "%.0f" .W}} {{printf "%.0f" .H}}" preserveAspectRatio="none" role="img" aria-label="График стоимости портфеля">
|
||||
{{range .GridY}}<line x1="0" y1="{{printf "%.1f" .}}" x2="{{printf "%.0f" $.Chart.W}}" y2="{{printf "%.1f" .}}" class="g"></line>{{end}}
|
||||
<path d="{{.Area}}" class="a"></path>
|
||||
<path d="{{.Line}}" class="l"></path>
|
||||
</svg>
|
||||
<div class="axis n">{{range .Marks}}<span style="left:{{printf "%.2f" (pctOf .X $.Chart.W)}}%">{{.Text}}</span>{{end}}</div>
|
||||
<div class="scale n"><span>шкала {{fmtmoney .Min}} — {{fmtmoney .Max}} ₽</span><span>срезов: {{.Points}}</span></div>
|
||||
</section>
|
||||
{{else}}{{if and (ne .View "archive") .ChartOn}}<p class="mut" style="margin:-4px 0 16px;font-size:12.5px">График стоимости появится, когда накопятся ежедневные срезы: сейчас их {{.ChartPoints}}.</p>{{end}}{{end}}
|
||||
|
||||
{{if .Structure}}<section class="sec" style="margin-bottom:18px">
|
||||
<div class="sec-h"><h2 class="lbl" style="font-size:12px;letter-spacing:.14em">Структура портфеля</h2></div>
|
||||
<div class="sbar">{{range .Structure}}<span style="width:{{printf "%.2f" .Share}}%;background:{{.Color}}" title="{{.Kind}}: {{fmtmoney .Value}} ₽"></span>{{end}}</div>
|
||||
@@ -434,6 +454,15 @@ input[type=checkbox]{width:20px;min-height:20px;height:20px}
|
||||
</div>
|
||||
<p class="mut" style="margin-top:14px">Контакты, паспортные данные и реквизиты для выплат меняет депозитарий: обратитесь к своему менеджеру, изменения появятся в кабинете после внесения в анкету.</p>
|
||||
</section>
|
||||
<section class="sec">
|
||||
<h2 class="lbl" style="font-size:12px;letter-spacing:.14em">Контакты в анкете</h2>
|
||||
<div class="rows">
|
||||
<div class="row"><span>Электронная почта</span><span class="n">{{if .Email}}{{.Email}}{{else}}не указана{{end}}</span></div>
|
||||
<div class="row"><span>Телефон</span><span class="n">{{if .Phone}}{{.Phone}}{{else}}не указан{{end}}</span></div>
|
||||
{{if .LastLogin}}<div class="row"><span>Прошлый вход</span><span class="n">{{.LastLogin}}</span></div>{{end}}
|
||||
</div>
|
||||
<p class="mut" style="margin-top:14px">Так с вами свяжется депозитарий. Если данные устарели — сообщите менеджеру: из кабинета мы их не меняем.</p>
|
||||
</section>
|
||||
</div>
|
||||
</main></body></html>{{end}}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user