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
+8 -5
View File
@@ -41,10 +41,13 @@ func TestAutoDecisionsPartialAndIIS(t *testing.T) {
}
it.IIS = true
d, _ = autoDecisions(it, r)
for _, x := range d {
if x.Confirm || x.RejectCode != "M2M06" {
t.Fatalf("ИИС не принимаем: %+v", d)
}
// Приём ИИС по умолчанию ВЫКЛ → отказ по всему переводу (всё-или-ничего).
// Бумага A (была к приёму) получает код ИИС M2M06, бумага B сохраняет свою причину M2M05.
if d[0].Confirm || d[1].Confirm {
t.Fatalf("ИИС выключен — принимать нельзя: %+v", d)
}
if d[0].RejectCode != "M2M06" || d[1].RejectCode != "M2M05" {
t.Fatalf("коды отказа ИИС: A=M2M06, B сохраняет M2M05: %+v", d)
}
legacy := &IncomingTransfer{RawXML: "<x><IIAAgreementDetails/></x>"}
if !incomingIsIIS(legacy) {
@@ -88,7 +91,7 @@ func TestOutQualCheck(t *testing.T) {
if c := outQualCheck(true, false, "ограничений по обращению нет (опция DEPO)", notQual); !c.OK || c.Warn {
t.Fatalf("бумага без ограничений — зелёный: %+v", c)
}
for _, c := range partyChecks(notQual, "1", "2", "x") {
for _, c := range partyChecks(notQual, "1", "2", "x", false) {
if strings.HasPrefix(c.Name, "Квал") {
t.Fatalf("общая жёлтая строка квалификации больше не нужна: %+v", c)
}