# 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`).
