Releases: shoman4eg/go-moy-nalog
Release list
v0.1.0 — порт PHP-клиента «Мой налог» на Go
Первый тегированный релиз Go-клиента для lknpd.nalog.ru («Мой налог») — полный порт PHP-библиотеки shoman4eg/moy-nalog.
Структура клиента повторяет google/go-github: один общий service-тип, NewRequest / Do / BareDo, обёртка Response, сигнатура методов (*T, *Response, error).
Установка
go get github.com/shoman4eg/go-moy-nalog@v0.1.0Требуется Go 1.25 или новее.
Возможности
Реализованы все семь групп API PHP-версии:
| Сервис | Методы |
|---|---|
Auth |
CreateAccessToken, CreatePhoneChallenge, CreateAccessTokenByPhone, Refresh |
Income |
Create, CreateItem, List, Cancel |
Invoice |
Create, CreateItem |
Receipt |
JSON, PrintURL, Print |
Users |
Get |
PaymentType |
Table, Favorite |
Tax |
Get, History, Payments |
Taxpayer |
Debts, Bonus |
Аутентификация
Поддержаны оба способа: по ИНН и паролю и по номеру телефона через SMS (эндпоинты challenge живут на API v2, клиент переключает версию сам). Протухший access-токен обновляется автоматически: при ответе 401 клиент вызывает Auth.Refresh и повторяет запрос, не более двух раз. Актуальный токен доступен через Token().
Ошибки
Неуспешные ответы оборачиваются в *ErrorResponse и разворачиваются в sentinel-значения, поэтому работают оба способа:
errors.Is(err, moynalog.ErrUnauthorized) // 400/401/403/404/406/422/500 и прочее
var errResp *moynalog.ErrorResponse
errors.As(err, &errResp) // StatusCode, Code, Message, AdditionalInfo, BodyDevice ID
deviceId вычисляется один раз при создании клиента и дальше не меняется — API привязывает чеки и refresh-токен к устройству. Стратегия настраивается: NewPlatformDeviceIDGenerator (по умолчанию, стабилен для машины), NewStaticDeviceIDGenerator (свой ID на каждого самозанятого), NewRandomDeviceIDGenerator, либо своя реализация через DeviceIDFunc / IDStrategyFunc.
Деньги и время
Все денежные поля — decimal.Decimal из shopspring/decimal, без потерь на float. Тип Time разбирает все форматы, которые смешивает API: полные RFC 3339, метки без зоны, голые даты (2022-11-12) и null.
Замечания
- Клиент проверялся только на
httptestс фикстурами из PHP-проекта и слепками реальных ответов; на живом API не гонялся. Поэтому версияv0.x— API библиотеки ещё может измениться. Invoice.CancelиInvoice.UpdatePaymentInfoвозвращаютErrNotImplemented: соответствующих эндпоинтов в API нет. Это повторяет поведение PHP-версии.- Валидация строже PHP в одном месте: ИНН проверяется через
strconv.ParseUint, тогда какis_numericв PHP пропускает значения вроде1234.56789. Limit: 0вIncomeListOptionsозначает «не задано» и даёт 100; PHP при явномlimit: 0зажимает до 1.
Разработка
make check # формат, линтеры, тесты и go.mod — ничего не изменяяПокрытие пакета — 87.6%.