M2M ИИС: приём «всё или ничего» (настройка AcceptIIS, по умолчанию выкл)

Правильная обработка входящих переводов на ИИС вместо прежнего сплошного отказа.
Настройка AcceptIIS (карточка «Кто отвечает на переводы M2M»):
 - выкл (по умолчанию) — поведение не меняется: перевод на ИИС отклоняется целиком (M2M06);
 - вкл — ИИС принимается ТОЛЬКО целиком: все бумаги зачисляются на ИИС-счёт клиента;
   если хоть одной бумаги нет в учёте / не проходит сверку — отказ по ВСЕМУ переводу.

Изменения:
 - iisDecisions: «всё или ничего» (при выкл — отказ всем; при вкл — либо все принять,
   либо все отклонить, сохраняя реальные коды отказа по проблемным бумагам);
 - depo_check: при вкл приёме ИИС убран искусственный отказ «Перевод не на ИИС»,
   добавлена проверка «Счёт зачисления — ИИС» (partyChecks получил флаг wantIIS);
 - настройка AcceptIIS в Settings + геттер/сеттер + обработчик /admin/setup/accept-iis
   + тумблер в part_nsd.html; тесты обновлены.
Жёсткий запрет частичного ИИС в answerIncoming (коммит dc8b785) остаётся как страховка.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
fontvielle
2026-10-14 10:43:21 +03:00
parent dc8b785a4b
commit c73f6120d3
8 changed files with 157 additions and 24 deletions
+41
View File
@@ -289,6 +289,47 @@ func m2mAutoForm16(ctx context.Context, rc *RuntimeConfig, d outgoingDeps, od *O
}
// saveM2MAuto — POST /admin/setup/m2m-auto.
// saveAcceptIIS — POST /admin/setup/accept-iis: приём входящих переводов на ИИС (всё-или-ничего).
func (h *setupHandlers) saveAcceptIIS(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodPost {
http.Error(w, "method", http.StatusMethodNotAllowed)
return
}
cur := h.rc.AcceptIIS()
on := r.FormValue("enabled") != ""
if m := r.FormValue("mode"); m != "" {
on = m == "on"
}
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, "Приём ИИС: "+msg)
}
if on == cur {
reply("без изменений")
return
}
if err := h.rc.UpdateAcceptIIS(on); err != nil {
reply("ошибка сохранения: " + err.Error())
return
}
who := ""
if u := currentUser(w); u != nil {
who = u.Login
}
if on {
log.Printf("accept-iis: приём входящих переводов на ИИС ВКЛЮЧЁН (%s)", who)
reply("включён — ИИС принимается только ЦЕЛИКОМ: все бумаги на ИИС-счёт клиента, иначе отказ по всему переводу")
return
}
log.Printf("accept-iis: приём входящих переводов на ИИС выключен (%s)", who)
reply("выключен — входящие переводы на ИИС отклоняются целиком (M2M06)")
}
func (h *setupHandlers) saveM2MAuto(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodPost {
http.Error(w, "method", http.StatusMethodNotAllowed)