Раздел «Ручной ввод M2M» по бумажным поручениям; тестовые тексты и имитации убраны из клиентского интерфейса

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
zuevav
2026-09-17 18:26:59 +03:00
parent 627dbca6af
commit e4de1ab4d8
38 changed files with 2014 additions and 132 deletions
+21 -16
View File
@@ -138,6 +138,7 @@ func (h *setupHandlers) renderNews(w http.ResponseWriter, r *http.Request) {
return
}
s := h.rc.Snapshot()
s.News.Items = visibleNews(h.rc, s.News.Items)
data := struct {
page
Settings Settings
@@ -271,7 +272,7 @@ func (h *setupHandlers) testSignCrypto(w http.ResponseWriter, r *http.Request) {
payload := []byte("<bj-test ts=\"" + time.Now().UTC().Format(time.RFC3339) + "\">Bridge-and-Join-s sign smoke test</bj-test>")
sig, err := cli.SignXMLDSig(r.Context(), payload, "", s.Crypto.Profile)
if err != nil {
setupFlash(w, r, "Тестовая подпись не удалась: "+err.Error())
setupFlash(w, r, "Пробная подпись не удалась: "+err.Error())
return
}
outPath := "/var/lib/bj/.bj/test-sign.p7s"
@@ -282,7 +283,7 @@ func (h *setupHandlers) testSignCrypto(w http.ResponseWriter, r *http.Request) {
if len(b64Preview) > 80 {
b64Preview = b64Preview[:80] + "..."
}
setupFlash(w, r, fmt.Sprintf("Тестовая подпись OK: CMS detached, %d байт. Сохранена в %s. Префикс base64: %s",
setupFlash(w, r, fmt.Sprintf("Пробная подпись OK: CMS detached, %d байт. Сохранена в %s. Префикс base64: %s",
len(sig), outPath, b64Preview))
}
@@ -388,7 +389,7 @@ func (h *setupHandlers) savePostgres(w http.ResponseWriter, r *http.Request) {
// Лёгкая проверка: попытка sql.Open и Ping (без драйвера дальше
// просто ошибка — это нормально, важно показать что DSN сохранён).
if err := tryPingPostgres(dsn); err != nil {
setupFlash(w, r, "postgres: тест соединения упал: "+err.Error())
setupFlash(w, r, "postgres: проверка соединения не прошла: "+err.Error())
return
}
}
@@ -758,7 +759,11 @@ func (h *setupHandlers) lkPull(w http.ResponseWriter, r *http.Request) {
msg := fmt.Sprintf("Забор заявок из ЛК: получено %d, отправлено в НРД %d, отклонено %d", res.Fetched, res.Sent, res.Rejected)
if res.Emulated {
_, why := lkEmulateNSD(h.rc)
msg = fmt.Sprintf("Забор заявок из ЛК (имитация НРД — %s): получено %d, прошли сверку и переданы имитатору %d, отклонены сверкой %d", why, res.Fetched, res.Sent, res.Rejected)
if devMode(h.rc) {
msg = fmt.Sprintf("Забор заявок из ЛК (имитация НРД — %s): получено %d, прошли сверку и переданы имитатору %d, отклонены сверкой %d", why, res.Fetched, res.Sent, res.Rejected)
} else {
msg = fmt.Sprintf("Забор заявок из ЛК (без отправки в НРД — %s): получено %d, прошли сверку %d, отклонены сверкой %d", why, res.Fetched, res.Sent, res.Rejected)
}
}
if len(res.Errors) > 0 {
msg += " · ошибки: " + strings.Join(res.Errors, "; ")
@@ -800,17 +805,17 @@ func (h *setupHandlers) testAlertsSMTP(w http.ResponseWriter, r *http.Request) {
return
}
a := h.rc.Snapshot().Alerts
err := sendSMTP(a.SMTP, "[bj] Проверка уведомлений", "Это тестовое письмо от bj-server. Если вы его получили — SMTP-канал оповещений работает.")
err := sendSMTP(a.SMTP, "[bj] Проверка уведомлений", "Это проверочное письмо от bj-server. Если вы его получили — SMTP-канал оповещений работает.")
a.SMTP.LastAt = time.Now()
if err != nil {
a.SMTP.LastMsg = "ошибка: " + err.Error()
_ = h.rc.UpdateAlerts(a)
setupFlash(w, r, "Тест SMTP: "+err.Error())
setupFlash(w, r, "Проверка SMTP: "+err.Error())
return
}
a.SMTP.LastMsg = "тестовое письмо отправлено"
a.SMTP.LastMsg = "проверочное письмо отправлено"
_ = h.rc.UpdateAlerts(a)
setupFlash(w, r, "Тест SMTP: письмо отправлено на "+a.SMTP.To)
setupFlash(w, r, "Проверка SMTP: письмо отправлено на "+a.SMTP.To)
}
// saveAlertsZabbix сохраняет настройки Zabbix-хука.
@@ -848,12 +853,12 @@ func (h *setupHandlers) testAlertsZabbix(w http.ResponseWriter, r *http.Request)
if err != nil {
a.Zabbix.LastMsg = "ошибка: " + err.Error()
_ = h.rc.UpdateAlerts(a)
setupFlash(w, r, "Тест Zabbix: "+err.Error())
setupFlash(w, r, "Проверка Zabbix: "+err.Error())
return
}
a.Zabbix.LastMsg = "принято: " + info
_ = h.rc.UpdateAlerts(a)
setupFlash(w, r, "Тест Zabbix: сервер принял значение ("+info+")")
setupFlash(w, r, "Проверка Zabbix: сервер принял значение ("+info+")")
}
// saveIncomingNotify сохраняет настройки уведомлений депозитарию о входящих.
@@ -894,26 +899,26 @@ func (h *setupHandlers) testIncomingNotify(w http.ResponseWriter, r *http.Reques
}
cfg := h.rc.Snapshot()
if strings.TrimSpace(cfg.Incoming.Recipients("incoming")) == "" {
setupFlash(w, r, "Тест: сначала укажите почту депозитария")
setupFlash(w, r, "Проверка: сначала укажите почту депозитария")
return
}
smtp := cfg.Alerts.SMTP
if !smtp.Enabled || strings.TrimSpace(smtp.Host) == "" {
setupFlash(w, r, "Тест: сначала настройте и включите SMTP (раздел «Почта»)")
setupFlash(w, r, "Проверка: сначала настройте и включите SMTP (раздел «Почта»)")
return
}
sample := &IncomingTransfer{
GUID: "00000000-0000-0000-0000-000000000000",
SenderCode: "MC0012500000", SenderINN: "7722061076",
SenderCode: "MC0000000000", SenderINN: "0000000000", // обезличенный образец
ReceivedAt: time.Now(),
Securities: []IncomingSecurity{{SecurityCode: "RU0009029540", ISIN: "RU0009029540", Quantity: "10"}},
}
smtp.To = cfg.Incoming.Recipients("incoming")
if err := sendSMTP(smtp, "[ТЕСТ] MOEX МОСТ (M2M): к вам переведены ценные бумаги — требуется учёт", buildIncomingEmailBody(sample)); err != nil {
setupFlash(w, r, "Тест уведомления депозитарию: "+err.Error())
if err := sendSMTP(smtp, "[ПРОВЕРКА] MOEX МОСТ (M2M): к вам переведены ценные бумаги — требуется учёт", buildIncomingEmailBody(sample)); err != nil {
setupFlash(w, r, "Проверка уведомления депозитарию: "+err.Error())
return
}
setupFlash(w, r, "Тест: письмо-уведомление отправлено на "+cfg.Incoming.Recipients("incoming"))
setupFlash(w, r, "Проверка: письмо-уведомление отправлено на "+cfg.Incoming.Recipients("incoming"))
}
// lkPostJSON — POST JSON к API ЛК с Basic; возвращает (код, тело).