diff --git a/internal/lkgateway/admin.go b/internal/lkgateway/admin.go index e0b654b..937efd4 100644 --- a/internal/lkgateway/admin.go +++ b/internal/lkgateway/admin.go @@ -93,6 +93,7 @@ var templateFuncs = template.FuncMap{ } return "?" }, + "quikModeCustom": quikModeCustom, "adDraft": adDraftForView, // неудачная попытка подключить домен — форма открывается заполненной "withRet": func(d any, ret string) map[string]any { return map[string]any{"D": d, "Ret": ret} }, "whForm": func(w WorkHoursSettings, ret string) map[string]any { return map[string]any{"W": w, "Ret": ret} }, diff --git a/internal/lkgateway/m2mauto.go b/internal/lkgateway/m2mauto.go index cedcc96..761d874 100644 --- a/internal/lkgateway/m2mauto.go +++ b/internal/lkgateway/m2mauto.go @@ -285,8 +285,20 @@ func (h *setupHandlers) saveM2MAuto(w http.ResponseWriter, r *http.Request) { } cur := h.rc.Snapshot().M2MAuto on := r.FormValue("enabled") != "" + if m := r.FormValue("mode"); m != "" { // карточка «Кто отвечает на переводы M2M»: выбор плиткой + on = m == "auto" + } + ajax := r.Header.Get("X-BJ-Ajax") != "" + reply := func(msg string) { + if ajax { + w.Header().Set("Content-Type", "text/plain; charset=utf-8") + _, _ = w.Write([]byte(msg)) + return + } + setupFlash(w, r, "Автоматический режим M2M: "+msg) + } if on == cur.Enabled { - setupFlash(w, r, "Автоматический режим M2M: без изменений") + reply("без изменений") return } s := M2MAutoSettings{Enabled: on, ChangedAt: time.Now()} @@ -294,14 +306,14 @@ func (h *setupHandlers) saveM2MAuto(w http.ResponseWriter, r *http.Request) { s.ChangedBy = u.Login } if err := h.rc.UpdateM2MAuto(s); err != nil { - setupFlash(w, r, "Автоматический режим M2M: ошибка сохранения: "+err.Error()) + reply("ошибка сохранения: " + err.Error()) return } if on { log.Printf("m2m-auto: автоматический режим ВКЛЮЧЁН (%s)", s.ChangedBy) - setupFlash(w, r, "Автоматический режим M2M включён: решения по входящим, поручения 16/1 и 16 bj отправляет сам (первый проход — в течение 30 секунд).") + reply("включён — решения по входящим, поручения 16/1 и 16 bj отправляет сам (первый проход — в течение 30 секунд)") return } log.Printf("m2m-auto: автоматический режим выключен (%s)", s.ChangedBy) - setupFlash(w, r, "Автоматический режим M2M выключен — решения и поручения снова отправляет оператор.") + reply("выключен — решения и поручения отправляет оператор") } diff --git a/internal/lkgateway/quikdb_handlers.go b/internal/lkgateway/quikdb_handlers.go index 1b08363..e5fec95 100644 --- a/internal/lkgateway/quikdb_handlers.go +++ b/internal/lkgateway/quikdb_handlers.go @@ -92,8 +92,12 @@ func (h *setupHandlers) saveQuikCycle(w http.ResponseWriter, r *http.Request) { } s.AutoOut = r.FormValue("auto_out") != "" s.AutoIn = r.FormValue("auto_in") != "" - s.PollTerminal = r.FormValue("poll_terminal") != "" - s.Account = strings.TrimSpace(r.FormValue("account")) + if r.PostForm.Has("poll_terminal_set") { // галочка теперь в простой карточке режима; здесь — только если форма её прислала + s.PollTerminal = r.FormValue("poll_terminal") != "" + } + if r.PostForm.Has("account") { // счёт задаётся в карточке режима; здесь — только если форма его прислала + s.Account = strings.TrimSpace(r.FormValue("account")) + } s.SecOut = strings.TrimSpace(r.FormValue("sec_out")) s.SecIn = strings.TrimSpace(r.FormValue("sec_in")) m := map[string]string{} @@ -142,6 +146,9 @@ func (h *setupHandlers) saveQuikMode(w http.ResponseWriter, r *http.Request) { if r.PostForm.Has("account") { s.Account = strings.TrimSpace(r.FormValue("account")) } + if r.PostForm.Has("terminal_set") { // галочка «клиенты подают поручения из QUIK» — в той же карточке + s.PollTerminal = r.FormValue("terminal") != "" + } msg := "только чтение — bj ничего в QUIK не меняет" if auto { msg = "чтение и запись — боевая работа: bj сам блокирует, списывает и зачисляет в QUIK" @@ -149,6 +156,9 @@ func (h *setupHandlers) saveQuikMode(w http.ResponseWriter, r *http.Request) { msg += "; укажите торговый счёт" } } + if s.PollTerminal { + msg += "; поручения клиентов из QUIK (терминал и мобильное приложение) bj замечает и сообщает оператору" + } if err := h.rc.UpdateQuik(s); err != nil { msg = "не сохранилось: " + err.Error() } @@ -314,3 +324,19 @@ func dfltDB(db string) string { } return db } + +// quikModeCustom — режим отличается от двух простых вариантов (записи включены, но исходящие или входящие +// выключены; или наоборот): карточка режима говорит об этом, а «Расширенные настройки» открыты. +func quikModeCustom(q QuikMNPSettings) string { + switch { + case q.WritesEnabled && !q.AutoOut && !q.AutoIn: + return "Запись в QUIK разрешена, но исходящие и входящие ведутся вручную" + case q.WritesEnabled && !q.AutoOut: + return "Исходящие переводы ведутся вручную" + case q.WritesEnabled && !q.AutoIn: + return "Входящие переводы зачисляются вручную" + case !q.WritesEnabled && (q.AutoOut || q.AutoIn): + return "Автоматика включена, но запись в QUIK запрещена главным выключателем" + } + return "" +} diff --git a/internal/lkgateway/web/templates/admin_setup.html b/internal/lkgateway/web/templates/admin_setup.html index 259da17..858b6f2 100644 --- a/internal/lkgateway/web/templates/admin_setup.html +++ b/internal/lkgateway/web/templates/admin_setup.html @@ -335,20 +335,19 @@
Без участия оператора, чтобы соблюдать сроки: ответ на входящие переводы по свежей сверке с DEPO (решение по каждой бумаге отдельно — возможен частичный приём; переводы на ИИС — отказ M2M06; бумага для квалифицированных инвесторов при неполной или непрочитанной квалификации клиента — отказ M2M08), подача поручения 16/1, как только НРД пришлёт черновик после нашего согласия, и подача поручения 16 по исходящим после согласия контрагента. Если DEPO или ИШ недоступны — bj повторяет каждые 3 минуты и шлёт оповещение; без сверки ничего не принимается. Обрабатывается только то, что пришло не раньше чем за сутки до включения. Кнопки в карточках остаются для ручной работы.
- - {{if not .Settings.M2MAuto.ChangedAt.IsZero}}{{if .Settings.M2MAuto.Enabled}}Включён{{else}}Выключен{{end}} {{msk .Settings.M2MAuto.ChangedAt}}{{with .Settings.M2MAuto.ChangedBy}} · {{.}}{{end}}.{{if .Settings.Quik.Emulate}}{{if devOn}} Шаги QUIK МНП — в режиме имитации.{{else}} Записи в QUIK МНП сейчас не выполняются.{{end}}{{end}}
{{end}} + {{template "nsdRequisites" .}} + {{template "m2mAutoCard" (withRet . "")}} +bj сам ставит и настраивает интеграционный шлюз НРД на этом сервере: контуры TEST3 и боевой, переключение между ними, доступ к папкам шлюза по сети.
+ {{template "igateInstall" .}}{{if not .Settings.NSD.IGWBaseURL}}{{if devOn}}mock-режим — без реального ИШ.{{else}}ИШ не настроен — обмен с НРД не выполняется.{{end}}{{else}}Профиль {{.Settings.NSD.Profile}}, ИШ {{.Settings.NSD.IGWBaseURL}}.{{end}} Стенды и установка — справка.
{{if not .Settings.NSD.IGWBaseURL}}{{if devOn}}mock-режим — без реального ИШ.{{else}}ИШ не настроен — обмен с НРД не выполняется.{{end}}{{else}}Профиль {{.Settings.NSD.Profile}}, ИШ {{.Settings.NSD.IGWBaseURL}}.{{end}}
От имени вашей организации bj отправляет и принимает переводы. {{if .DepoLicensed}}Реквизиты bj берёт из DEPO — проверьте и сохраните.{{else}}Найдите себя в справочнике участников НРД.{{end}}
{{if .Suggest}}{{if .Suggest.OrgName}}{{if not .Done.Org}}Где в НРД учитываются бумаги организации — из договора с НРД{{if .Settings.Fancy.Server}} или кнопкой «Определить из DEPO»{{end}}.
- {{if .Suggest}}{{if .Suggest.AccountID}}Где в НРД учитываются бумаги организации — из договора с НРД{{if .Settings.Fancy.Server}} или кнопкой «Определить из DEPO»{{end}}.
+ {{if .Suggest}}{{if .Suggest.AccountID}}Что делает bj в Модуле неторговых поручений по ходу перевода: исходящий — при отправке в НРД регистрирует «Вывод ЦБ (M2M)» (QUIK блокирует бумаги), по подтверждению подписывает (списание), по отказу снимает с причиной; входящий — после приёма нашего поручения НРД регистрирует «Ввод ЦБ (M2M)» (зачисление сразу). Каждый шаг виден в карточке перевода и на странице QUIK МНП.
+Обычно всё задаёт выбор «Только чтение / Чтение и запись» выше. Здесь — если нужно иначе: например, исходящие вести автоматически, а входящие зачислять вручную; или инструменты МНП в QUIK названы не по умолчанию.
{{.}} — изменено в «Расширенных настройках» ниже.
{{end}}Выбор сохраняется сразу.{{if .Ret}} Тонкая настройка — инструменты МНП, коды клиентов, поручения из терминала — в «Настройка → QUIK».{{end}}