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,