From 2c2ab4e9154e634771d8abe0b6858ca8fc73c01d Mon Sep 17 00:00:00 2001 From: zuevav Date: Tue, 29 Sep 2026 15:01:29 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9A=D0=BE=D0=B4=20=D0=BF=D0=BE=D0=BB=D1=83?= =?UTF-8?q?=D1=87=D0=B0=D1=82=D0=B5=D0=BB=D1=8F=20=D0=B2=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D1=81=D0=B5=20=D0=9D=D0=A0=D0=94=20=E2=80=94?= =?UTF-8?q?=20=D0=BF=D0=BE=20=D0=98=D0=9D=D0=9D=20=D0=B7=D0=B0=D1=87=D0=B8?= =?UTF-8?q?=D1=81=D0=BB=D1=8F=D1=8E=D1=89=D0=B5=D0=B3=D0=BE=20=D0=B4=D0=B5?= =?UTF-8?q?=D0=BF=D0=BE=D0=B7=D0=B8=D1=82=D0=B0=D1=80=D0=B8=D1=8F=20=D0=B8?= =?UTF-8?q?=D0=B7=20=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BE=D1=87=D0=BD=D0=B8?= =?UTF-8?q?=D0=BA=D0=B0=20M2M=20(=D0=B7=D0=B0=D1=8F=D0=B2=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=9B=D0=9A=20=D1=83=D1=85=D0=BE=D0=B4=D0=B8=D0=BB=D0=B8=20?= =?UTF-8?q?=D1=81=20=D0=BA=D0=BE=D0=B4=D0=BE=D0=BC=20=D0=B8=D0=B7=20=D0=BD?= =?UTF-8?q?=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B5=D0=BA=20=E2=86=92=20M2M15)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi --- internal/lkgateway/receiver_test.go | 17 +++++++++++++++++ internal/lkgateway/service.go | 23 +++++++++++++++-------- 2 files changed, 32 insertions(+), 8 deletions(-) create mode 100644 internal/lkgateway/receiver_test.go diff --git a/internal/lkgateway/receiver_test.go b/internal/lkgateway/receiver_test.go new file mode 100644 index 0000000..0ae9f1a --- /dev/null +++ b/internal/lkgateway/receiver_test.go @@ -0,0 +1,17 @@ +package lkgateway + +import "testing" + +// Код получателя — по ИНН зачисляющего депозитария из справочника M2M, а не из настроек (M2M15 29.09.2026). +func TestReceiverForByINN(t *testing.T) { + svc := NewService(Config{DefaultReceiver: "MC0010300000"}) + if got := svc.receiverFor(CreateClaimRequest{ReceivingDepositoryINN: "7702015515"}); got != "MC00314000TR" { + t.Fatalf("Атон: %s", got) + } + if got := svc.receiverFor(CreateClaimRequest{ReceivingDepositoryINN: "0000000000"}); got != "MC0010300000" { + t.Fatalf("нет в справочнике — из настроек: %s", got) + } + if got := svc.receiverFor(CreateClaimRequest{ReceivingDepositoryINN: "7702015515", ReceiverCodeOverride: "MC0012500000"}); got != "MC0012500000" { + t.Fatalf("явный код: %s", got) + } +} diff --git a/internal/lkgateway/service.go b/internal/lkgateway/service.go index 051bf6d..c0d2234 100644 --- a/internal/lkgateway/service.go +++ b/internal/lkgateway/service.go @@ -86,10 +86,7 @@ func (s *Service) BuildRequest(ctx context.Context, in CreateClaimRequest) (*m2m if err != nil { return nil, fmt.Errorf("lkgateway: dtoToClaim: %w", err) } - receiver := s.defaultReceiver - if in.ReceiverCodeOverride != "" { - receiver = m2m.DeponentCode(in.ReceiverCodeOverride) - } + receiver := s.receiverFor(in) req, err := m2mcore.EnrichRequest(ctx, s.store, domainClaim, m2mcore.SenderReceiver{ SenderCode: s.defaultSender, ReceiverCode: receiver, @@ -100,6 +97,19 @@ func (s *Service) BuildRequest(ctx context.Context, in CreateClaimRequest) (*m2m return req, nil } +// receiverFor — код получателя (зачисляющего депозитария) в заголовке запроса: явный (робот НРД, +// тест-кейсы) → по ИНН зачисляющего депозитария из справочника участников M2M → из настроек. +// Без справочника заявки ЛК уходили с кодом из настроек, и НРД отвечал M2M15 (29.09.2026). +func (s *Service) receiverFor(in CreateClaimRequest) m2m.DeponentCode { + if in.ReceiverCodeOverride != "" { + return m2m.DeponentCode(in.ReceiverCodeOverride) + } + if code := handbookCodeByINN(in.ReceivingDepositoryINN); code != "" { + return m2m.DeponentCode(code) + } + return s.defaultReceiver +} + // BuildRequestUnchecked — BuildRequest без финальной проверки формата НРД: пакет нужен // для журнала и отказа через Fancy даже при некорректных данных заявки (lkemulate.go). func (s *Service) BuildRequestUnchecked(ctx context.Context, in CreateClaimRequest) (*m2m.M2MTransferRequest, error) { @@ -107,10 +117,7 @@ func (s *Service) BuildRequestUnchecked(ctx context.Context, in CreateClaimReque if err != nil { return nil, fmt.Errorf("lkgateway: dtoToClaim: %w", err) } - receiver := s.defaultReceiver - if in.ReceiverCodeOverride != "" { - receiver = m2m.DeponentCode(in.ReceiverCodeOverride) - } + receiver := s.receiverFor(in) req, err := m2mcore.EnrichRequestUnchecked(ctx, s.store, domainClaim, m2mcore.SenderReceiver{ SenderCode: s.defaultSender, ReceiverCode: receiver,