Files
zuevav 9737c787f9 feat: живой цикл M2M с НРД + мастер установки ключа на флешку
Инфраструктура M2M (живой обмен с НРД через ИШ):
- обработка M2MTransferResponse: ERROR(M2Mxx) → заявка Отклонена, сохранение
  ответа; INFO → ждём Decision; идемпотентность поллера
- fallback-корреляция ответов с нулевым GUID (M2M14/M2M17) по FIFO
- сырой XML ответа НРД в карточке заявки (для пересылки в ТП)
- тестовый пакет роботу приведён к эталону m2m_robot_samples (CostInfo=Yes,
  4 бумаги, IsolationStatus, DocumentSeries=сценарий); override паспорта
- редирект из теста сразу в карточку заявки

Мастер установки ключа Валидаты на флешку (admin/setup/keywizard):
- пошаговый: загрузка .7z+пароль → выбор флешки → запись → справочник
  сертификатов (CRL) → перезапуск+проверка ИШ → готово
- привилегированный воркер (bj-keymedia) в host-namespace через файл-обмен,
  bj-server остаётся в песочнице
- сохранение структуры профиля архива (spr<N>), перечисление съёмных USB

Прочее:
- пакет-доказательство для ТП НРД + форма регистрации участника M2M
- эталонные образцы робота (DOC/m2m_robot_samples)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 00:03:21 +03:00
..

internal/m2m — доменные модели сообщений M2M

Go-модели, выровненные по XSD из DOC/M2MSchemas_260408/ (namespace http://nsd.ru/schemas/m2m/..., version 2026-04-08).

Что реализовано

  • Все 6 типов сообщений M2M (messages.go):
    • M2MTransferRequest — запрос на перевод.
    • M2MTransferDecision — решение принимающей стороны.
    • M2MTransferResponse — тех. ответ НРД (StatusCode ∈ {INFO, ERROR}).
    • M2MTransferHandbook + M2MTransferHandbookRequest — справочник участников.
    • M2MTransferParticipantForm — карточка участника.
  • Simple-типы и enum'ы из XSD (types.go): DeponentCode, ReferenceID, ISIN, OrganizationINN, UUID, AccountID, SecurityCode, IdentityDocSerial, StatusCode, IIAContractType, SecurityClassification, SecurityCategory, IdentityDocumentCode, IsolationStatus.
  • Метод Validate() error на всех типах (validators.go).
  • Choice-типы реализованы как структуры с указателями на взаимоисключающие поля: CostInfo, Quantity, SecurityDetails, IdentificationDetails, DecisionTransfer. Метод Validate проверяет «ровно одно поле задано» (ошибка ErrChoice).
  • IsM2M=true проставляется автоматически в RequestData.MarshalXML и не выносится в структуру.

Точные ограничения валидаторов

  • ReferenceID — длина 16, ^M2M[A-Z0-9]{13}$.
  • DeponentCode — 1..12 символов, ^[A-Z0-9]+$.
  • ISIN — длина 12, ^[A-Z]{2}[A-Z0-9]{9}[0-9]$.
  • OrganizationINN — ровно 10 цифр.
  • UUID — 8-4-4-4-12 hex-символов с дефисами (XSD НРД не требует битов версии/варианта по RFC).
  • SecurityCode — длина 12, ^[0-9A-Z_/-]+$.
  • IdentityDocSerial^\S+$ (от 1 символа, без пробельных).
  • AccountID — 1..50 символов.
  • Перечисления валидируются как принадлежность к множеству значений из XSD.

Тесты

  • Round-trip на всех XML из DOC/Примеры/ и DOC/Эталонные сообщения/ (messages_test.go).
  • Юнит-тесты валидаторов на позитив и негатив (TestValidatorsPositive, TestValidatorsNegative, TestChoiceValidators).
  • Покрытие — 73.9%.

Сериализация и парсинг — пакет internal/nsdxml (XML windows-1251 и NSDDateTime).