Files
Bridge-and-Join-s/internal/lkgateway/quikdetect.go
T
fontvielle 571a7d0e67 QUIK: кнопка «Определить из QUIK» — обычная кнопка + fetch (submit форма перехватывала)
Кнопка была submit внутри формы режима, у которой обработчик submit делает
preventDefault — клик ничего не отправлял. Теперь type=button + fetch на
/admin/setup/quik/detect-account (X-BJ-Ajax), результат в строке статуса,
найденный счёт подставляется в поле.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
2026-10-20 15:54:56 +03:00

93 lines
3.3 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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
}
// ответ: для fetch (кнопка в форме режима) — текстом; иначе — флеш.
reply := func(msg string) {
if r.Header.Get("X-BJ-Ajax") != "" {
w.Header().Set("Content-Type", "text/plain; charset=utf-8")
_, _ = w.Write([]byte(msg))
return
}
setupFlash(w, r, "QUIK: "+msg)
}
s := h.rc.Snapshot().Quik
if s.Server == "" || !s.Verified {
reply("сначала подключитесь к БД МНП (Настройка → QUIK, «Проверить подключение»)")
return
}
firm := quikFirmID()
accs, err := quikDetectAccounts(r.Context(), s, firm)
if err != nil {
reply("определить счёт не удалось — " + quikErrorDetail(err))
return
}
switch len(accs) {
case 0:
reply("торговых счетов фирмы " + firm + " в истории поручений (Actions/Export) не найдено — введите счёт вручную")
case 1:
s.Account = accs[0]
if err := h.rc.UpdateQuik(s); err != nil {
reply("не сохранилось — " + err.Error())
return
}
reply("торговый счёт подставлен из QUIK — " + accs[0])
default:
reply("у фирмы " + firm + " несколько торговых счетов (" + strings.Join(accs, ", ") + ") — впишите нужный вручную")
}
}