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, ", ") + ") — впишите нужный вручную") } }