Хабрахабр

[Из песочницы] Автоматизация для самозанятых: как интегрировать налог с IT проектом

С 1 января 2019 года для четырёх субъектов Российской Федерации (Москвы, Московской и Калужской областей, а также республики Татарстан) был принят закон, внедряющий пилотным проектом новый Налог на Профессиональную Деятельность (НПД). Если вкратце, его главная задача — избавить профессиональных деятелей от всех трудностей малого бизнеса: налога 6% (в случае с ИП), обязательных пенсионных взносов, сумма которых с каждым годом лишь за одного себя приближается к отметке 50 тысяч рублей, налоговой декларации. Тем самым государство поддерживает малый бизнес, предоставляя начинающим предпринимателям невысокий налог (4% за доход от физических лиц и 6% — от юридических). Если желаете больше подробностей — можете посмотреть детальную информацию в интернете.

Как это может помочь? НПД вправе пользоваться даже физические лица, которые работают в сфере IT. Вам не придётся ради такой предпринимательской деятельности регистрировать юрлицо и с самого старта решать кучу вопросов. Например, вы разработали сервис, который работает в интернете, вы хотите принимать платежи. В тот же миг разработчик сервиса задумывается: «А можно ли этот процесс автоматизировать?». Достаточно лишь зарегистрироваться как самозанятый и на честном слове вручную забивать каждую услугу или товар. Статья, собственно, и заключается в том, чтобы рассказать вам, как это делается. И ответ здесь — «Разумеется, можно!».

Таких же мотивов он желает и вам. Важное замечание: автор статьи использует знания, полученные в результате исследования приложения, только для добра — автоматизации рутины.

Шаг 1. Определение HTTP трафика

Здесь потребуется официальное приложения налогоплательщика «Мой налог». Скачать его можно через Google Play.

Чтобы его определить — нужно получить HTTPS запросы смартфона. Для данной статьи будет достаточно определить sourceDeviceId (подозреваю, что это то же самое, что и android id) и refreshToken, однако исследовать можно абсолютно все методы API, предложенные приложением к изучению. Чтобы разобраться в работе программы, я воспользовался не совсем актуальным руководством, однако и его было достаточно, чтобы перехватить https трафик смартфона и отобразить работу приложения на экран компьютера. Для стокового устройства без root прав можно воспользоваться компьютером, бесплатной программой Fiddler.

Затем активизировать работу программы Fiddler, наладить прокси соединение на смартфоне и запустить приложение заново. После установки всего необходимого надо зарегистрироваться как налогоплательщик и закрыть приложение. Приложение сделает запрос авторизации с refresh token'ом, который на момент этой статьи создаётся с бессрочным сроком действия:

image

Авторизация для методов используется Bearer, токен для него генерируется через метод /auth/token. Как можно заметить на скриншоте, приложение имеет базовый домен lknpd.nalog.ru (субдомен сайта налоговой службы РФ) и версию API 1. Я проверял работу refreshToken'a через 3 дня после эксперимента — он работает, следовательно, token на 1 час можно спокойно брать, заведомо имея один актуальный refreshToken. Данные из полей запроса sourceDeviceId и refreshToken вам крайне необходимы.

Сам метод отправки прихода выглядит так и имеет все необходимые поля:

image

Поле services может вызвать у вас желание отправлять несколько услуг в массиве, однако на чеке отобразится лишь первая услуга, хотя и конечная стоимость будет полной. Учтите, что все поля обязательны к заполнению. Всё-таки сервис достаточно сыроват, да и запущен лишь недавно, зацикливаться на этом не будем (хотя обидно на самом деле, несколько позиций порой необходимы).

Стоит также обратить внимание на ответ: approvedReceiptUuid: поле содержит уникальный код чека, который безо всяких трудностей можно получить по вашему ИНН и UUID чека.

Шаг 2. Разработка скрипта

Чтобы быстро продемонстрировать концепт автоматизации используется Python 3.7.2 с библиотекой requests:

import requests
import datetime
import shutil TIME_OFFSET = '+03:00'
DEVICE_ID = ''
REFRESH_TOKEN = ''
API_PROVIDER = 'https://lknpd.nalog.ru/api/v1/'
TOKEN = ''
INN = '' def DO(method, params): headers = if TOKEN != '' else {} r = requests.post(API_PROVIDER+method, json=params, headers=headers) print(r.text) return r.json() def get_token(): reqparam = { "deviceInfo": { "appVersion": "1.0.0", "metaDetails": { "browser": "", "browserVersion": "", "os": "android" }, "sourceDeviceId": DEVICE_ID, "sourceType": "android" }, "refreshToken": REFRESH_TOKEN } res = DO('auth/token', reqparam) # TODO: сохранять tokenExpireIn и не вызывать авторизацию каждый раз return res['token'] # TODO: научиться нормально программировать
TOKEN = get_token() def new_transaction(service, amount): trans_time = datetime.datetime.now().isoformat()[:-3]+TIME_OFFSET reqparam = { "ignoreMaxTotalIncomeRestriction": False, "operationTime": trans_time, "paymentType": "CASH", "requestTime": trans_time, "services": [ { "amount": amount, "name": service, "quantity": 1 } ], "totalAmount": amount } res = DO('income', reqparam) return res['approvedReceiptUuid'] def get_receipt(receipt_uuid): headers = {"Authorization":"Bearer "+TOKEN} r = requests.get( 'https://lknpd.nalog.ru/api/v1/receipt/'+INN+"/"+receipt_uuid+"/print", stream=True, headers=headers ) with open('receipt.png', 'wb') as f: r.raw.decode_content = True shutil.copyfileobj(r.raw, f) if __name__ == '__main__': rec = new_transaction('Тестовая услуга', '1.00') get_receipt(rec)

Подставьте необходимые значения — скрипт сработает, как надо. Можете добавлять обработчики ошибок и улучшать доставку — изложенный выше скрипт лишь показывает принцип работы с API НПД налоговой.

Следовательно, это дело отложено на потом. Замечание Возможно, в дальнейшем налоговая опубликует API, а сейчас этого не делает лишь потому, что это мало кому требуется. Однако спешу заметить, что если официальное руководство и будет опубликовано — в нём будет либо аналогичная информация, либо слегка усовершенствованная, в плане авторизации уж точно.

Заключение

В заключение хочется отметить: не повторяйте это дома нет ничего невозможного. Даже такую рутинную вещь можно спокойно автоматизировать. Копируйте код, дорабатываете на свой лад. Возможно, потом реализую библиотеку, чтобы автоматизация была намного доступнее всем желающим. Жду вашей объективной критики и продолжаю копать в сторону API. Моя следующая цель — идеализировать принцип авторизации и создать библиотеку для Python.

Показать больше

Похожие публикации

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»