Портфель ЛК: под карточкой только последняя ручная заливка

Каждая «Залить сейчас» оставляла строку навсегда (до перезапуска). Теперь
ручная заливка заменяет прежнюю ручную; клиенты постоянного заполнения
остаются. Пропущенные бумаги — свёрнутым списком «пропущено бумаг: N».

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
This commit is contained in:
fontvielle
2026-10-22 12:27:37 +03:00
parent 5c4a12fb0b
commit c6f83e212e
2 changed files with 34 additions and 3 deletions
+33 -2
View File
@@ -20,6 +20,7 @@ import (
"io"
"log"
"net/http"
"sort"
"strings"
"sync"
"time"
@@ -216,6 +217,7 @@ type LKPortfolioSyncState struct {
Skipped []string
Err string
hash string
manual bool // ручная заливка («Залить сейчас»), не постоянное заполнение
}
var lkPortfolioState = struct {
@@ -246,7 +248,7 @@ func lkPortfolioSyncTick(ctx context.Context, rc *RuntimeConfig, force bool) {
s = &LKPortfolioSyncState{LK: pr.LK, Depo: pr.Depo}
lkPortfolioState.m[pr.LK] = s
}
s.Depo, s.CheckedAt = pr.Depo, time.Now()
s.Depo, s.CheckedAt, s.manual = pr.Depo, time.Now(), false
if err != nil {
if s.Err != err.Error() {
log.Printf("lk-portfolio: %s ← %s: %v", pr.LK, pr.Depo, err)
@@ -290,7 +292,8 @@ func lkPortfolioSyncTick(ctx context.Context, rc *RuntimeConfig, force bool) {
}
}
// lkPortfolioStates — состояние синхронизации для страницы настроек.
// lkPortfolioStates — состояние для страницы настроек: последняя ручная заливка сверху, затем клиенты
// постоянного заполнения.
func lkPortfolioStates() []LKPortfolioSyncState {
lkPortfolioState.Lock()
defer lkPortfolioState.Unlock()
@@ -298,9 +301,29 @@ func lkPortfolioStates() []LKPortfolioSyncState {
for _, s := range lkPortfolioState.m {
out = append(out, *s)
}
sort.Slice(out, func(i, j int) bool {
if out[i].manual != out[j].manual {
return out[i].manual
}
return out[i].LK < out[j].LK
})
return out
}
// lkPortfolioInSync — договор в постоянном заполнении (по списку или «для всех»).
func lkPortfolioInSync(rc *RuntimeConfig, lk string) bool {
ps := rc.Snapshot().LK.PortfolioSync
if ps.Enabled && ps.AllClients {
return true
}
for _, p := range ps.pairs() {
if p.LK == lk {
return true
}
}
return false
}
// registerLKPortfolioSync — POST /admin/setup/lk-portfolio: настройки и «синхронизировать сейчас».
func registerLKPortfolioSync(mux *http.ServeMux, rc *RuntimeConfig) {
// GET /admin/setup/lk-portfolio/clients?q= — поиск клиента DEPO для заливки портфеля.
@@ -502,6 +525,14 @@ func lkPortfolioPushPair(ctx context.Context, rc *RuntimeConfig, pr lkPortfolioP
lkPortfolioState.m[pr.LK] = s
}
s.Depo, s.CheckedAt, s.Skipped = pr.Depo, time.Now(), skipped
if !lkPortfolioInSync(rc, pr.LK) {
s.manual = true
for k, o := range lkPortfolioState.m { // от прежних ручных заливок — только последняя
if o.manual && k != pr.LK {
delete(lkPortfolioState.m, k)
}
}
}
lkPortfolioState.Unlock()
msg := ""
if err != nil {