From dc8b785a4bf12da6a4423972405763e4cbc233b3 Mon Sep 17 00:00:00 2001 From: fontvielle Date: Wed, 14 Oct 2026 10:02:51 +0300 Subject: [PATCH] =?UTF-8?q?M2M=20incoming:=20=D0=B6=D1=91=D1=81=D1=82?= =?UTF-8?q?=D0=BA=D0=B8=D0=B9=20=D0=B7=D0=B0=D0=BF=D1=80=D0=B5=D1=82=20?= =?UTF-8?q?=D1=87=D0=B0=D1=81=D1=82=D0=B8=D1=87=D0=BD=D0=BE=D0=B3=D0=BE=20?= =?UTF-8?q?=D1=80=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BF=D0=BE=20?= =?UTF-8?q?=D0=98=D0=98=D0=A1-=D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=BE=D0=B4?= =?UTF-8?q?=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Перевод по договору ИИС принимается только целиком: если в одном решении есть и подтверждённые, и отклонённые бумаги — answerIncoming отказывается отправлять такое решение. Частичный приём ИИС привёл бы к неполному переводу и двум ИИС у клиента с потерей льгот. Запрет не обойти ручным решением оператора и переживёт смягчение политики приёма ИИС (iisDecisions). Co-Authored-By: Claude Opus 4.8 --- internal/lkgateway/incoming_answer.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/internal/lkgateway/incoming_answer.go b/internal/lkgateway/incoming_answer.go index 46368b4..3137211 100644 --- a/internal/lkgateway/incoming_answer.go +++ b/internal/lkgateway/incoming_answer.go @@ -105,6 +105,14 @@ func answerIncoming(ctx context.Context, deps incomingDeps, id string, decisions markMap[sec.ReferenceID] = mark } + // Защита ИИС: перевод по договору ИИС принимается только ЦЕЛИКОМ — все бумаги + // или ни одной. Частичное решение (часть принять, часть отклонить) дало бы + // неполный перевод ИИС и два ИИС у клиента с потерей льгот. Этот запрет не + // обойти ни ручным решением оператора, ни будущим смягчением политики приёма. + if incomingIsIIS(it) && confirmed > 0 && rejected > 0 { + return fmt.Errorf("перевод на ИИС принимается только целиком: нельзя принять часть бумаг (%d) и отклонить часть (%d) — примите все бумаги или отклоните весь перевод", confirmed, rejected) + } + dec := &m2m.M2MTransferDecision{ Header: m2m.DecisionHeader{ GUID: m2m.UUID(it.GUID), // GUID из запроса робота!