b654c70d49
Кнопка «Определить из QUIK» у поля «Торговый счёт для поручений» (режим чтение+запись). bj читает distinct Account из Actions/Export по коду фирмы (QuikFirm/FirmID = код участника): один счёт — подставляет, несколько — показывает на выбор, нет истории — просит ввести вручную. Только чтение. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
84 lines
3.0 KiB
Go
84 lines
3.0 KiB
Go
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, ", ")+") — впишите нужный вручную")
|
||
}
|
||
}
|