Мастер, «Организация»: одна кнопка «Сохранить»; в строке справочника — своя запись

- Организация и депозитарные реквизиты в НРД сохраняются одной кнопкой внизу шага
  (поля реквизитов — в общей форме org-form; saveOrg сохраняет и их, если они
  пришли; в настройках формы прежние). Повтор «Из DEPO: … подставлено» в мастере
  убран — то же в зелёной плашке.
- «Найти себя в справочнике участников M2M» не пустая: по коду и ИНН из полей
  показывается своя запись и «✓ Есть в справочнике участников M2M»; нет в
  справочнике — предупреждение.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
This commit is contained in:
zuevav
2026-10-06 16:27:44 +03:00
parent db0c2fc048
commit c1f77df340
4 changed files with 103 additions and 33 deletions
+45 -21
View File
@@ -75,13 +75,39 @@ func orgName(s Settings) string {
return ""
}
// saveOrg — POST /admin/setup/org: организация выбрана из справочника (hb=код) или введена вручную.
// saveOrg — POST /admin/setup/org: организация выбрана из справочника (hb=код) или введена вручную. В мастере
// та же форма несёт и депозитарные реквизиты в НРД (deponent_code…): на шаге одна кнопка «Сохранить».
func (h *setupHandlers) saveOrg(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodPost {
http.Error(w, "method", http.StatusMethodNotAllowed)
return
}
s := h.rc.Snapshot().NSD
changedCode, bad := orgFromForm(r, &s)
if bad == "" && r.PostForm.Has("deponent_code") {
bad = nsdReqFromForm(r, &s)
}
if bad != "" {
setupFlash(w, r, bad)
return
}
if err := h.rc.UpdateNSD(s); err != nil {
setupFlash(w, r, "Организация: ошибка сохранения: "+err.Error())
return
}
msg := "Организация сохранена: " + pick(s.OrgName, "—") + ", ИНН " + pick(s.OrgINN, "—") + ", код " + pick(s.OrgCode, "—")
if r.PostForm.Has("deponent_code") {
msg += ". Реквизиты в НРД: код " + pick(s.DeponentCode, "—") + ", счёт " + pick(s.AccountID, "—") + ", раздел " + pick(s.SectionID, "—")
}
if changedCode {
msg += ". Код отправителя применится после перезапуска bj-server."
}
setupFlash(w, r, msg)
}
// orgFromForm — код, ИНН и наименование организации из формы (выбор из справочника или вручную).
// Возвращает, сменился ли код, и текст ошибки.
func orgFromForm(r *http.Request, s *NSDSettings) (bool, string) {
code := strings.ToUpper(strings.TrimSpace(r.FormValue("org_code")))
inn := strings.TrimSpace(r.FormValue("org_inn"))
name := strings.TrimSpace(r.FormValue("org_name"))
@@ -91,27 +117,17 @@ func (h *setupHandlers) saveOrg(w http.ResponseWriter, r *http.Request) {
}
}
if inn != "" && !manualINNRe.MatchString(inn) {
setupFlash(w, r, "Организация: ИНН юридического лица — 10 цифр")
return
return false, "Организация: ИНН юридического лица — 10 цифр"
}
if code != "" && !regexpMCCode.MatchString(code) {
setupFlash(w, r, "Организация: код участника — вида MC0000000000")
return
return false, "Организация: код участника — вида MC0000000000"
}
changedCode := code != s.OrgCode
s.OrgCode, s.OrgINN, s.OrgName = code, inn, name
if s.DeponentCode == "" {
s.DeponentCode = code
}
if err := h.rc.UpdateNSD(s); err != nil {
setupFlash(w, r, "Организация: ошибка сохранения: "+err.Error())
return
}
msg := "Организация сохранена: " + pick(name, "—") + ", ИНН " + pick(inn, "—") + ", код " + pick(code, "—")
if changedCode {
msg += ". Код отправителя применится после перезапуска bj-server."
}
setupFlash(w, r, msg)
return changedCode, ""
}
var nsdReqRe = regexp.MustCompile(`^[A-Z0-9]{4,30}$`)
@@ -124,19 +140,27 @@ func (h *setupHandlers) saveNSDRequisites(w http.ResponseWriter, r *http.Request
return
}
s := h.rc.Snapshot().NSD
if bad := nsdReqFromForm(r, &s); bad != "" {
setupFlash(w, r, bad)
return
}
if err := h.rc.UpdateNSD(s); err != nil {
setupFlash(w, r, "Реквизиты НРД: ошибка сохранения: "+err.Error())
return
}
setupFlash(w, r, "Реквизиты НРД сохранены: код "+pick(s.DeponentCode, "—")+", счёт "+pick(s.AccountID, "—")+", раздел "+pick(s.SectionID, "—"))
}
// nsdReqFromForm — депозитарный код, счёт и раздел организации в НРД из формы; текст ошибки.
func nsdReqFromForm(r *http.Request, s *NSDSettings) string {
dep := strings.ToUpper(strings.TrimSpace(r.FormValue("deponent_code")))
acc := strings.ToUpper(strings.TrimSpace(r.FormValue("account_id")))
sec := strings.ToUpper(strings.TrimSpace(r.FormValue("section_id")))
for _, v := range []struct{ name, val string }{{"депозитарный код", dep}, {"депозитарный счёт", acc}, {"раздел счёта", sec}} {
if v.val != "" && !nsdReqRe.MatchString(v.val) {
setupFlash(w, r, "Реквизиты НРД: "+v.name+" — латинские буквы и цифры, без пробелов")
return
return "Реквизиты НРД: " + v.name + " — латинские буквы и цифры, без пробелов"
}
}
s.DeponentCode, s.AccountID, s.SectionID = dep, acc, sec
if err := h.rc.UpdateNSD(s); err != nil {
setupFlash(w, r, "Реквизиты НРД: ошибка сохранения: "+err.Error())
return
}
setupFlash(w, r, "Реквизиты НРД сохранены: код "+pick(dep, "—")+", счёт "+pick(acc, "—")+", раздел "+pick(sec, "—"))
return ""
}