From b654c70d4929fabee05f4d988119c3cdec575057 Mon Sep 17 00:00:00 2001 From: fontvielle Date: Tue, 20 Oct 2026 15:47:35 +0300 Subject: [PATCH] =?UTF-8?q?QUIK:=20=D0=B0=D0=B2=D1=82=D0=BE=D0=BF=D0=BE?= =?UTF-8?q?=D0=B4=D0=B1=D0=BE=D1=80=20=D1=82=D0=BE=D1=80=D0=B3=D0=BE=D0=B2?= =?UTF-8?q?=D0=BE=D0=B3=D0=BE=20=D1=81=D1=87=D1=91=D1=82=D0=B0=20=D1=84?= =?UTF-8?q?=D0=B8=D1=80=D0=BC=D1=8B=20=D0=B8=D0=B7=20=D0=91=D0=94=20=D0=9C?= =?UTF-8?q?=D0=9D=D0=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Кнопка «Определить из QUIK» у поля «Торговый счёт для поручений» (режим чтение+запись). bj читает distinct Account из Actions/Export по коду фирмы (QuikFirm/FirmID = код участника): один счёт — подставляет, несколько — показывает на выбор, нет истории — просит ввести вручную. Только чтение. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn --- internal/lkgateway/quikdb_handlers.go | 1 + internal/lkgateway/quikdetect.go | 83 +++++++++++++++++++ .../lkgateway/web/templates/part_quik.html | 2 + 3 files changed, 86 insertions(+) create mode 100644 internal/lkgateway/quikdetect.go diff --git a/internal/lkgateway/quikdb_handlers.go b/internal/lkgateway/quikdb_handlers.go index f0471f9..6761f96 100644 --- a/internal/lkgateway/quikdb_handlers.go +++ b/internal/lkgateway/quikdb_handlers.go @@ -18,6 +18,7 @@ func (h *setupHandlers) registerQuik(mux *http.ServeMux) { mux.HandleFunc("/admin/quik", h.quikInstructions) mux.HandleFunc("/admin/setup/quik/cycle", h.saveQuikCycle) mux.HandleFunc("/admin/setup/quik/mode", h.saveQuikMode) + mux.HandleFunc("/admin/setup/quik/detect-account", h.detectQuikAccount) } // quikInstructions — GET /admin/quik. Поручения M2M из БД МНП QUIK. diff --git a/internal/lkgateway/quikdetect.go b/internal/lkgateway/quikdetect.go new file mode 100644 index 0000000..a0ac52f --- /dev/null +++ b/internal/lkgateway/quikdetect.go @@ -0,0 +1,83 @@ +package lkgateway + +import ( + "context" + "database/sql" + "net/http" + "strings" + "time" +) + +// quikdetect.go — автоподбор торгового счёта фирмы для неторговых поручений. +// Источник — сама БД модуля QUIK: различные Account из таблиц Actions/Export по +// коду нашей фирмы (QuikFirm/FirmID = код участника). Если счёт один — подставляем; +// несколько — показываем на выбор; нет истории — просим ввести вручную. + +// quikDetectAccounts — торговые счета фирмы firm из БД МНП (только чтение). +func quikDetectAccounts(ctx context.Context, s QuikMNPSettings, firm string) ([]string, error) { + db, err := quikOpen(s) + if err != nil { + return nil, err + } + defer db.Close() + cctx, cancel := context.WithTimeout(ctx, 20*time.Second) + defer cancel() + const q = `SELECT DISTINCT LTRIM(RTRIM(Account)) AS acc FROM ( + SELECT Account, QuikFirm, FirmID FROM dbo.Actions + UNION ALL + SELECT Account, QuikFirm, FirmID FROM dbo.Export + ) t + WHERE Account IS NOT NULL AND LTRIM(RTRIM(Account)) <> '' + AND (@firm = '' OR QuikFirm = @firm OR FirmID = @firm) + ORDER BY acc` + rows, err := db.QueryContext(cctx, q, sql.Named("firm", firm)) + if err != nil { + return nil, err + } + defer rows.Close() + var out []string + for rows.Next() { + var a string + if err := rows.Scan(&a); err == nil { + if a = strings.TrimSpace(a); a != "" { + out = append(out, a) + } + } + } + return out, rows.Err() +} + +// detectQuikAccount — POST /admin/setup/quik/detect-account: подобрать торговый счёт из QUIK. +func (h *setupHandlers) detectQuikAccount(w http.ResponseWriter, r *http.Request) { + if !requireAdvanced(w, r) { + return + } + if r.Method != http.MethodPost { + http.Error(w, "method", http.StatusMethodNotAllowed) + return + } + s := h.rc.Snapshot().Quik + if s.Server == "" || !s.Verified { + setupFlash(w, r, "QUIK: сначала подключитесь к БД МНП (Настройка → QUIK, «Проверить подключение»)") + return + } + firm := quikFirmID() + accs, err := quikDetectAccounts(r.Context(), s, firm) + if err != nil { + setupFlash(w, r, "QUIK: определить счёт не удалось — "+quikErrorDetail(err)) + return + } + switch len(accs) { + case 0: + setupFlash(w, r, "QUIK: торговых счетов фирмы "+firm+" в истории поручений (Actions/Export) не найдено — введите счёт вручную") + case 1: + s.Account = accs[0] + if err := h.rc.UpdateQuik(s); err != nil { + setupFlash(w, r, "QUIK: не сохранилось — "+err.Error()) + return + } + setupFlash(w, r, "QUIK: торговый счёт подставлен из QUIK — "+accs[0]) + default: + setupFlash(w, r, "QUIK: у фирмы "+firm+" несколько торговых счетов ("+strings.Join(accs, ", ")+") — впишите нужный вручную") + } +} diff --git a/internal/lkgateway/web/templates/part_quik.html b/internal/lkgateway/web/templates/part_quik.html index 7b1dc3c..352c477 100644 --- a/internal/lkgateway/web/templates/part_quik.html +++ b/internal/lkgateway/web/templates/part_quik.html @@ -138,6 +138,8 @@
+ +

bj возьмёт торговый счёт фирмы из истории поручений в БД QUIK (таблицы Actions/Export). Если счёт один — подставит сам.