diff --git a/internal/lkgateway/quikdetect.go b/internal/lkgateway/quikdetect.go index 5e95192..11d77db 100644 --- a/internal/lkgateway/quikdetect.go +++ b/internal/lkgateway/quikdetect.go @@ -4,6 +4,7 @@ import ( "context" "database/sql" "net/http" + "sort" "strings" "time" ) @@ -13,7 +14,9 @@ import ( // коду нашей фирмы (QuikFirm/FirmID = код участника). Если счёт один — подставляем; // несколько — показываем на выбор; нет истории — просим ввести вручную. -// quikDetectAccounts — торговые счета фирмы firm из БД МНП (только чтение). +// quikDetectAccounts — торговые счета фирмы firm из БД МНП (только чтение). Разные версии +// модуля отличаются колонками (у Export нет QuikFirm и т. п.), поэтому пробуем несколько +// источников по отдельности и пропускаем те, где колонки нет (Invalid column name). func quikDetectAccounts(ctx context.Context, s QuikMNPSettings, firm string) ([]string, error) { db, err := quikOpen(s) if err != nil { @@ -22,29 +25,38 @@ func quikDetectAccounts(ctx context.Context, s QuikMNPSettings, firm string) ([] 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 + queries := []string{ + `SELECT DISTINCT LTRIM(RTRIM(Account)) FROM dbo.Actions WHERE Account IS NOT NULL AND LTRIM(RTRIM(Account)) <> '' AND (@firm = '' OR FirmID = @firm)`, + `SELECT DISTINCT LTRIM(RTRIM(Account)) FROM dbo.Actions WHERE Account IS NOT NULL AND LTRIM(RTRIM(Account)) <> '' AND (@firm = '' OR QuikFirm = @firm)`, + `SELECT DISTINCT LTRIM(RTRIM(Account)) FROM dbo.Export WHERE Account IS NOT NULL AND LTRIM(RTRIM(Account)) <> '' AND (@firm = '' OR FirmID = @firm)`, } - defer rows.Close() + seen := map[string]bool{} 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) + okAny := false + var lastErr error + for _, q := range queries { + rows, err := db.QueryContext(cctx, q, sql.Named("firm", firm)) + if err != nil { + lastErr = err // чаще всего «Invalid column name» — этот источник пропускаем + continue + } + okAny = true + for rows.Next() { + var a string + if rows.Scan(&a) == nil { + if a = strings.TrimSpace(a); a != "" && !seen[a] { + seen[a] = true + out = append(out, a) + } } } + rows.Close() } - return out, rows.Err() + if !okAny && lastErr != nil { + return nil, lastErr + } + sort.Strings(out) + return out, nil } // detectQuikAccount — POST /admin/setup/quik/detect-account: подобрать торговый счёт из QUIK. diff --git a/internal/lkgateway/web/templates/part_quik.html b/internal/lkgateway/web/templates/part_quik.html index f713f28..5d2d377 100644 --- a/internal/lkgateway/web/templates/part_quik.html +++ b/internal/lkgateway/web/templates/part_quik.html @@ -77,13 +77,14 @@ {{if .Settings.Quik.LastReport}}
Можно выделить и скопировать целиком — для отправки коллегам/аутсорсеру QUIK. - {{if not .Settings.Quik.LastAt.IsZero}}Проверка от {{.Settings.Quik.LastAt.Format "02.01.2006 15:04:05"}} UTC.{{end}}
+Можно выделить и скопировать целиком — для отправки коллегам/аутсорсеру QUIK.
{{.Settings.Quik.LastReport}}
+