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
+3 -3
View File
@@ -5,17 +5,17 @@ import "testing"
func TestPartyChecksFIO(t *testing.T) {
p := depoParty{faceOK: true, faceName: "Сёмин Пётр Ильич", accAny: "ВТНКЦ00000001"}
p.fioMatch = normFIO(p.faceName) == normFIO("СЕМИН петр ильич")
if c := partyChecks(p, "4500", "123456", "СЕМИН петр ильич")[0]; !c.OK {
if c := partyChecks(p, "4500", "123456", "СЕМИН петр ильич", false)[0]; !c.OK {
t.Errorf("регистр, пробелы и ё не должны давать расхождение: %+v", c)
}
p.fioMatch = normFIO(p.faceName) == normFIO("Сёмин Павел Ильич")
c := partyChecks(p, "4500", "123456", "Сёмин Павел Ильич")[0]
c := partyChecks(p, "4500", "123456", "Сёмин Павел Ильич", false)[0]
if c.OK || c.Code != "M2M04" {
t.Errorf("паспорт совпал, ФИО нет — ожидали отказ M2M04: %+v", c)
}
// Физлицо в картотеке без торгового счёта — не наш клиент: M2M04 первой проверкой.
noAcc := depoParty{faceOK: true, faceName: "Баранкин Сергей Сергеевич", fioMatch: true}
checks := partyChecks(noAcc, "3763", "290089", "Баранкин Сергей Сергеевич")
checks := partyChecks(noAcc, "3763", "290089", "Баранкин Сергей Сергеевич", false)
if c := checks[0]; c.OK || c.Code != "M2M04" {
t.Errorf("лицо без счёта — ожидали отказ M2M04: %+v", c)
}