# NPDTools
Ищешь инструмент для удобного декларирования доходов?
Хочешь автоматизировать выдачу чеков клиентам?
Надоело заходить в Мой налог? Надоедает проверять, что каждый приход зарегистрирован в налоговой?
Боишься ошибиться и получить безжалостный удар от ФНС кнутом без пряника?
### ВЫХОД ЕСТЬ! Для этого потребуется простая питоняшая...
Нет, не сода. Либа. README которой ты сейчас читаешь.
Да, она позволяет работать с API Федеральной налоговой службы (ФНС) в рамках возможностей
приложения "Мой налог". Больше она не умеет. Столько же не умеет. Меньше умеет.
Надеюсь, теперь все люди, что искали подобный инструмент в гугле, смогли его найти.
Можно приступить к содержательной части.
## Если ты не знаешь свой ⚠️ password ⚠️
Если входишь в lknpd.nalog.ru или "Мой налог" через Госуслуги (ЕСИА) или просто не помнишь пароль,
надо зайти на [lkfl2.nalog.ru](https://lkfl2.nalog.ru 'Личный кабинет физлица') и там по ситуации:
* Войти так же через Госуслуги и сменить (установить) пароль в настройках профиля
* Войти по электронной подписи и сменить пароль в настройках профиля
* Нажать кнопочку "Восстановить пароль" и пройти процедуру восстановления
* Не разобраться в ситуации и смириться со сложностью бытия
## Прогресс разработки
* Чеки
* [x] Создание чека
* [x] Аннулирование чека
* [x] Получение списка чеков
* Счета
* [x] Создание счёта
* [x] Отметка оплаченным
* [x] Выдача чека по счёту
* [x] Смена способа оплаты
* [x] Отмена счёта
* [x] Получение способов оплаты счёта
* Публичное
* [ ] Проверка статуса самозанятого
* [ ] Проверка чеков по токену
* [ ] Проверка налогов по токену
* [ ] Проверка оплат налогов по токену
* Другое
* [ ] Добавление способа оплаты счёта
* [ ] Удаление способа оплаты счёта
* [ ] Активация и деактивация автоплатежа
* [ ] Удаление привязанной карты для автоплатежа
* [ ] Изменение видов деятельности
* [ ] Редактирование профессии
* [ ] Редактирование текста в чеке
* [ ] Удаление партнёров
* [ ] Снятие с учёта НПД
* [ ] Отображение номера и почты в чеке
* [ ] Ключи доступа
* [ ] Справки
## Документация
Её в нормальном виде нет, но в коде описано детально, какие модели возвращает функция, можно смотреть на них.
Когда-нибудь, возможно, добавлю больше.
## Что может библиотека?
Собственно, всё сводится к выставлению, закрытию и получению счетов и чеков.
Что? Примеров хочешь? Держи примеров. Обмажься.
### Выставляем чек, как профи
```python
from decimal import Decimal
from npdtools import NPDTools
from npdtools.types import Service, ClientType, ClientInfo
client = NPDTools(default_inn="123456789012")
async def main():
await client.auth("123456789012", "~_ub&TS5RY~k9,czo(q*")
# Как добавлять позиции в чек:
# 1. Метод здорового человека
cart = [Service(name="Прокладка с крылышками", amount=180.85, quantity=2)]
cart.append(Service(name="Прокладкохолдер", amount=1234.56))
await client.declare_income(*cart)
# Вот так можно декларировать товары на развес: с ценой за грамм и указанием веса в граммах
await client.declare_income(Service(name="Изюм", amount=Decimal("0.4"), quantity=856))
# 2. Метод немного здорового человека
await client.declare_income(Service(name="Доска", amount=600, quantity=2), Service(name="Udjplb", amount=4, quantity=10))
# Как выставлять физлицам?
# Применяется автоматически, так как никакие данные не требуются
await client.declare_income(*cart)
# Если хотите выдать чек физлицу с указанием его фио, телефона, инн или иных данных
client_info = ClientInfo(
type=ClientType.individual, # это не обязательно, так как значение по умолчанию
inn="012345678912", # Как и поля ниже, можно указывать, если знаем, либо пропустить (или передать None)
name="Зотов Данил Константинович",
phone="79998887766", # Допускается любой формат
email="i@mhorny.gay", # Туда может приходить чек от ФНС, но не факт
)
await client.declare_income(*cart, client=client_info)
# ИП или ООО или прочая российская организация?
client_info = ClientInfo(
type=ClientType.legal, # это не обязательно, так как значение по умолчанию
inn="012345678912", # Для ИП и ООО надо указать ИНН. Обязательно.
name="ИП Колосов Илья Владимирович", # Краткое название, указывать не обязательно, но желательно
phone="79998887766", # Контактный номер по желанию
# email="i@mhorny.gay", # Контактный email по желанию
)
await client.declare_income(*cart, client=client_info)
# Если организация иностранная?
client_info = ClientInfo(
type=ClientType.foreign, # это не обязательно, так как значение по умолчанию
# inn="012345678912", # ИНН можно указать, если он известен
name="Rusalky Sosalky Davalky Inc.", # Краткое название, указывать не обязательно, но желательно
phone="+13053056699", # Контактный номер по желанию
# email="i@mhorny.gay", # Контактный email по желанию
)
await client.declare_income(*cart, client=client_info)
```
### Канселим чеки, как Италию на Евровидении 2021
```python
from datetime import datetime, timedelta
from npdtools import NPDTools
from npdtools.types import Service
client = NPDTools(default_inn="123456789012")
async def main():
await client.auth("123456789012", "~_ub&TS5RY~k9,czo(q*")
cart = [Service(name="Прокладка с крылышками", amount=180.85, quantity=2)]
await client.declare_income(*cart)
declare_response = await client.declare_income(*cart)
await client.cancel_income(declare_response.receipt_id)
# С комментарием:
await client.cancel_income(declare_response.receipt_id, comment="Этот мудень попросил вернуть деньги")
# Возврат за вчерашний день
await client.cancel_income(declare_response.receipt_id, comment="Не подошёл размер", cancellation_time=datetime.now() - timedelta(days=1))
```
### Счета
```python
from npdtools import NPDTools
from npdtools.types import Service, BankAccount, BankPhone, ClientInfo, ClientType
client = NPDTools(default_inn="123456789012")
async def main():
await client.auth("123456789012", "~_ub&TS5RY~k9,czo(q*")
options = await client.get_payment_options()
if len(options) == 0:
# По СБП
payment_option = BankPhone(
name="Банк Хaйс",
phone="79998887766",
)
# По реквизитам счёта
payment_option = BankAccount(
name="Точка Банк",
bik="044525104",
account="40802810201500127107",
corr="30101810745374525104",
)
else:
payment_option = options[0]
# Для физлица обязательно указать ФИО. Для ИП и ООО - ИНН. Для зарубежных - название (тоже name)
client_info = ClientInfo(
name="Карасуков Владимир Ярославович",
type=ClientType.individual, # Для ИП, ООО и зарубежных указать свой тип
phone="79998887766", # Необязательно
email="i@mhorny.gay", # На этот адрес должен будет прийти чек после его выдачи, необязательно
)
cart = [Service(name="Прокладка с крылышками", amount=180.85, quantity=2)]
invoice = await client.create_invoice(
*cart,
bank=payment_option,
client=client_info,
)
invoice = await client.invoice_paid(invoice.invoice_id)
invoice = await client.invoice_complete(invoice.invoice_id)
# or
invoice = await client.cancel_invoice(invoice.invoice_id)
```
Я буду ещё дописывать библиотеку, да. Но пока так. Она не такая простая, как кажется.
Буду рад конструктивным пул реквестам и иссуям.
Raw data
{
"_id": null,
"home_page": "https://gitlab.com/whiteapfel/npdtools",
"name": "npdtools",
"maintainer": "",
"docs_url": null,
"requires_python": "",
"maintainer_email": "",
"keywords": "FNS API wrapper nalog \u043d\u0430\u043b\u043e\u0433 \u0424\u041d\u0421 \u0441\u0430\u043c\u043e\u0437\u0430\u043d\u044f\u0442\u043e\u0441\u0442\u044c",
"author": "WhiteApfel",
"author_email": "white@pfel.ru",
"download_url": "https://files.pythonhosted.org/packages/50/c8/9959eb544574c683f4717d8c6f4bf29940a42cbef580175b160387c34ae0/npdtools-1.0.1.tar.gz",
"platform": null,
"description": "# NPDTools\n\n\u0418\u0449\u0435\u0448\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u0434\u0435\u043a\u043b\u0430\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043e\u0445\u043e\u0434\u043e\u0432? \n\u0425\u043e\u0447\u0435\u0448\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u0434\u0430\u0447\u0443 \u0447\u0435\u043a\u043e\u0432 \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c?\n\u041d\u0430\u0434\u043e\u0435\u043b\u043e \u0437\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u0432 \u041c\u043e\u0439 \u043d\u0430\u043b\u043e\u0433? \u041d\u0430\u0434\u043e\u0435\u0434\u0430\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u0438\u0445\u043e\u0434 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d \u0432 \u043d\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0439?\n\u0411\u043e\u0438\u0448\u044c\u0441\u044f \u043e\u0448\u0438\u0431\u0438\u0442\u044c\u0441\u044f \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0431\u0435\u0437\u0436\u0430\u043b\u043e\u0441\u0442\u043d\u044b\u0439 \u0443\u0434\u0430\u0440 \u043e\u0442 \u0424\u041d\u0421 \u043a\u043d\u0443\u0442\u043e\u043c \u0431\u0435\u0437 \u043f\u0440\u044f\u043d\u0438\u043a\u0430?\n\n### \u0412\u042b\u0425\u041e\u0414 \u0415\u0421\u0422\u042c! \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u043f\u0438\u0442\u043e\u043d\u044f\u0448\u0430\u044f...\n\n\u041d\u0435\u0442, \u043d\u0435 \u0441\u043e\u0434\u0430. \u041b\u0438\u0431\u0430. README \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0442\u044b \u0441\u0435\u0439\u0447\u0430\u0441 \u0447\u0438\u0442\u0430\u0435\u0448\u044c. \n\u0414\u0430, \u043e\u043d\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 API \u0424\u0435\u0434\u0435\u0440\u0430\u043b\u044c\u043d\u043e\u0439 \u043d\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0439 \u0441\u043b\u0443\u0436\u0431\u044b (\u0424\u041d\u0421) \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439\n\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \"\u041c\u043e\u0439 \u043d\u0430\u043b\u043e\u0433\". \u0411\u043e\u043b\u044c\u0448\u0435 \u043e\u043d\u0430 \u043d\u0435 \u0443\u043c\u0435\u0435\u0442. \u0421\u0442\u043e\u043b\u044c\u043a\u043e \u0436\u0435 \u043d\u0435 \u0443\u043c\u0435\u0435\u0442. \u041c\u0435\u043d\u044c\u0448\u0435 \u0443\u043c\u0435\u0435\u0442.\n\u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u0441\u0435 \u043b\u044e\u0434\u0438, \u0447\u0442\u043e \u0438\u0441\u043a\u0430\u043b\u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0432 \u0433\u0443\u0433\u043b\u0435, \u0441\u043c\u043e\u0433\u043b\u0438 \u0435\u0433\u043e \u043d\u0430\u0439\u0442\u0438.\n\u041c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u043a \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438. \n\n## \u0415\u0441\u043b\u0438 \u0442\u044b \u043d\u0435 \u0437\u043d\u0430\u0435\u0448\u044c \u0441\u0432\u043e\u0439 \u26a0\ufe0f password \u26a0\ufe0f\n\n\u0415\u0441\u043b\u0438 \u0432\u0445\u043e\u0434\u0438\u0448\u044c \u0432 lknpd.nalog.ru \u0438\u043b\u0438 \"\u041c\u043e\u0439 \u043d\u0430\u043b\u043e\u0433\" \u0447\u0435\u0440\u0435\u0437 \u0413\u043e\u0441\u0443\u0441\u043b\u0443\u0433\u0438 (\u0415\u0421\u0418\u0410) \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u043f\u043e\u043c\u043d\u0438\u0448\u044c \u043f\u0430\u0440\u043e\u043b\u044c,\n\u043d\u0430\u0434\u043e \u0437\u0430\u0439\u0442\u0438 \u043d\u0430 [lkfl2.nalog.ru](https://lkfl2.nalog.ru '\u041b\u0438\u0447\u043d\u044b\u0439 \u043a\u0430\u0431\u0438\u043d\u0435\u0442 \u0444\u0438\u0437\u043b\u0438\u0446\u0430') \u0438 \u0442\u0430\u043c \u043f\u043e \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438:\n* \u0412\u043e\u0439\u0442\u0438 \u0442\u0430\u043a \u0436\u0435 \u0447\u0435\u0440\u0435\u0437 \u0413\u043e\u0441\u0443\u0441\u043b\u0443\u0433\u0438 \u0438 \u0441\u043c\u0435\u043d\u0438\u0442\u044c (\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c) \u043f\u0430\u0440\u043e\u043b\u044c \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u043f\u0440\u043e\u0444\u0438\u043b\u044f\n* \u0412\u043e\u0439\u0442\u0438 \u043f\u043e \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u0438 \u0441\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u043f\u0440\u043e\u0444\u0438\u043b\u044f\n* \u041d\u0430\u0436\u0430\u0442\u044c \u043a\u043d\u043e\u043f\u043e\u0447\u043a\u0443 \"\u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c\" \u0438 \u043f\u0440\u043e\u0439\u0442\u0438 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f\n* \u041d\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 \u0438 \u0441\u043c\u0438\u0440\u0438\u0442\u044c\u0441\u044f \u0441\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u0431\u044b\u0442\u0438\u044f\n\n## \u041f\u0440\u043e\u0433\u0440\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438\n* \u0427\u0435\u043a\u0438\n * [x] \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0447\u0435\u043a\u0430\n * [x] \u0410\u043d\u043d\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0447\u0435\u043a\u0430\n * [x] \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0447\u0435\u043a\u043e\u0432\n* \u0421\u0447\u0435\u0442\u0430\n * [x] \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0447\u0451\u0442\u0430\n * [x] \u041e\u0442\u043c\u0435\u0442\u043a\u0430 \u043e\u043f\u043b\u0430\u0447\u0435\u043d\u043d\u044b\u043c\n * [x] \u0412\u044b\u0434\u0430\u0447\u0430 \u0447\u0435\u043a\u0430 \u043f\u043e \u0441\u0447\u0451\u0442\u0443\n * [x] \u0421\u043c\u0435\u043d\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u043e\u043f\u043b\u0430\u0442\u044b\n * [x] \u041e\u0442\u043c\u0435\u043d\u0430 \u0441\u0447\u0451\u0442\u0430\n * [x] \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u043e\u043f\u043b\u0430\u0442\u044b \u0441\u0447\u0451\u0442\u0430\n* \u041f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u0435\n * [ ] \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u0442\u0430\u0442\u0443\u0441\u0430 \u0441\u0430\u043c\u043e\u0437\u0430\u043d\u044f\u0442\u043e\u0433\u043e\n * [ ] \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0447\u0435\u043a\u043e\u0432 \u043f\u043e \u0442\u043e\u043a\u0435\u043d\u0443\n * [ ] \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u043e\u0433\u043e\u0432 \u043f\u043e \u0442\u043e\u043a\u0435\u043d\u0443\n * [ ] \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u043f\u043b\u0430\u0442 \u043d\u0430\u043b\u043e\u0433\u043e\u0432 \u043f\u043e \u0442\u043e\u043a\u0435\u043d\u0443\n* \u0414\u0440\u0443\u0433\u043e\u0435\n * [ ] \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u043e\u043f\u043b\u0430\u0442\u044b \u0441\u0447\u0451\u0442\u0430\n * [ ] \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u043e\u043f\u043b\u0430\u0442\u044b \u0441\u0447\u0451\u0442\u0430\n * [ ] \u0410\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u044f \u0438 \u0434\u0435\u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u044f \u0430\u0432\u0442\u043e\u043f\u043b\u0430\u0442\u0435\u0436\u0430\n * [ ] \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0439 \u043a\u0430\u0440\u0442\u044b \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043f\u043b\u0430\u0442\u0435\u0436\u0430\n * [ ] \u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0432\u0438\u0434\u043e\u0432 \u0434\u0435\u044f\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438\n * [ ] \u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u0438\n * [ ] \u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0430 \u0432 \u0447\u0435\u043a\u0435\n * [ ] \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u0442\u043d\u0451\u0440\u043e\u0432\n * [ ] \u0421\u043d\u044f\u0442\u0438\u0435 \u0441 \u0443\u0447\u0451\u0442\u0430 \u041d\u041f\u0414\n * [ ] \u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043d\u043e\u043c\u0435\u0440\u0430 \u0438 \u043f\u043e\u0447\u0442\u044b \u0432 \u0447\u0435\u043a\u0435\n * [ ] \u041a\u043b\u044e\u0447\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430\n * [ ] \u0421\u043f\u0440\u0430\u0432\u043a\u0438\n\n \n## \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f\n\n\u0415\u0451 \u0432 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0438\u0434\u0435 \u043d\u0435\u0442, \u043d\u043e \u0432 \u043a\u043e\u0434\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e, \u043a\u0430\u043a\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043c\u043e\u0436\u043d\u043e \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u043d\u0438\u0445.\n\u041a\u043e\u0433\u0434\u0430-\u043d\u0438\u0431\u0443\u0434\u044c, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0434\u043e\u0431\u0430\u0432\u043b\u044e \u0431\u043e\u043b\u044c\u0448\u0435.\n\n## \u0427\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430?\n\n\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0432\u0441\u0451 \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044e, \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044e \u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044e \u0441\u0447\u0435\u0442\u043e\u0432 \u0438 \u0447\u0435\u043a\u043e\u0432.\n\u0427\u0442\u043e? \u041f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0445\u043e\u0447\u0435\u0448\u044c? \u0414\u0435\u0440\u0436\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432. \u041e\u0431\u043c\u0430\u0436\u044c\u0441\u044f. \n\n### \u0412\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0447\u0435\u043a, \u043a\u0430\u043a \u043f\u0440\u043e\u0444\u0438\n\n```python\nfrom decimal import Decimal\n\nfrom npdtools import NPDTools\nfrom npdtools.types import Service, ClientType, ClientInfo\n\nclient = NPDTools(default_inn=\"123456789012\")\n\n\nasync def main():\n await client.auth(\"123456789012\", \"~_ub&TS5RY~k9,czo(q*\")\n\n # \u041a\u0430\u043a \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0432 \u0447\u0435\u043a:\n # 1. \u041c\u0435\u0442\u043e\u0434 \u0437\u0434\u043e\u0440\u043e\u0432\u043e\u0433\u043e \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430\n cart = [Service(name=\"\u041f\u0440\u043e\u043a\u043b\u0430\u0434\u043a\u0430 \u0441 \u043a\u0440\u044b\u043b\u044b\u0448\u043a\u0430\u043c\u0438\", amount=180.85, quantity=2)]\n cart.append(Service(name=\"\u041f\u0440\u043e\u043a\u043b\u0430\u0434\u043a\u043e\u0445\u043e\u043b\u0434\u0435\u0440\", amount=1234.56))\n await client.declare_income(*cart)\n\n # \u0412\u043e\u0442 \u0442\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0434\u0435\u043a\u043b\u0430\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u0432\u0430\u0440\u044b \u043d\u0430 \u0440\u0430\u0437\u0432\u0435\u0441: \u0441 \u0446\u0435\u043d\u043e\u0439 \u0437\u0430 \u0433\u0440\u0430\u043c\u043c \u0438 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435\u043c \u0432\u0435\u0441\u0430 \u0432 \u0433\u0440\u0430\u043c\u043c\u0430\u0445\n await client.declare_income(Service(name=\"\u0418\u0437\u044e\u043c\", amount=Decimal(\"0.4\"), quantity=856))\n\n # 2. \u041c\u0435\u0442\u043e\u0434 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0437\u0434\u043e\u0440\u043e\u0432\u043e\u0433\u043e \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430\n await client.declare_income(Service(name=\"\u0414\u043e\u0441\u043a\u0430\", amount=600, quantity=2), Service(name=\"Udjplb\", amount=4, quantity=10))\n\n # \u041a\u0430\u043a \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0444\u0438\u0437\u043b\u0438\u0446\u0430\u043c?\n # \u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0438\u043a\u0430\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f\n await client.declare_income(*cart)\n\n # \u0415\u0441\u043b\u0438 \u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u044b\u0434\u0430\u0442\u044c \u0447\u0435\u043a \u0444\u0438\u0437\u043b\u0438\u0446\u0443 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435\u043c \u0435\u0433\u043e \u0444\u0438\u043e, \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430, \u0438\u043d\u043d \u0438\u043b\u0438 \u0438\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445\n client_info = ClientInfo(\n type=ClientType.individual, # \u044d\u0442\u043e \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e\n inn=\"012345678912\", # \u041a\u0430\u043a \u0438 \u043f\u043e\u043b\u044f \u043d\u0438\u0436\u0435, \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c, \u0435\u0441\u043b\u0438 \u0437\u043d\u0430\u0435\u043c, \u043b\u0438\u0431\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c (\u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c None)\n name=\"\u0417\u043e\u0442\u043e\u0432 \u0414\u0430\u043d\u0438\u043b \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0438\u043d\u043e\u0432\u0438\u0447\",\n phone=\"79998887766\", # \u0414\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043b\u044e\u0431\u043e\u0439 \u0444\u043e\u0440\u043c\u0430\u0442\n email=\"i@mhorny.gay\", # \u0422\u0443\u0434\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u044c \u0447\u0435\u043a \u043e\u0442 \u0424\u041d\u0421, \u043d\u043e \u043d\u0435 \u0444\u0430\u043a\u0442\n )\n await client.declare_income(*cart, client=client_info)\n\n # \u0418\u041f \u0438\u043b\u0438 \u041e\u041e\u041e \u0438\u043b\u0438 \u043f\u0440\u043e\u0447\u0430\u044f \u0440\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u0430\u044f \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f?\n client_info = ClientInfo(\n type=ClientType.legal, # \u044d\u0442\u043e \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e\n inn=\"012345678912\", # \u0414\u043b\u044f \u0418\u041f \u0438 \u041e\u041e\u041e \u043d\u0430\u0434\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0418\u041d\u041d. \u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e.\n name=\"\u0418\u041f \u041a\u043e\u043b\u043e\u0441\u043e\u0432 \u0418\u043b\u044c\u044f \u0412\u043b\u0430\u0434\u0438\u043c\u0438\u0440\u043e\u0432\u0438\u0447\", # \u041a\u0440\u0430\u0442\u043a\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043d\u043e \u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e\n phone=\"79998887766\", # \u041a\u043e\u043d\u0442\u0430\u043a\u0442\u043d\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u043f\u043e \u0436\u0435\u043b\u0430\u043d\u0438\u044e\n # email=\"i@mhorny.gay\", # \u041a\u043e\u043d\u0442\u0430\u043a\u0442\u043d\u044b\u0439 email \u043f\u043e \u0436\u0435\u043b\u0430\u043d\u0438\u044e\n )\n await client.declare_income(*cart, client=client_info)\n\n # \u0415\u0441\u043b\u0438 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0438\u043d\u043e\u0441\u0442\u0440\u0430\u043d\u043d\u0430\u044f?\n client_info = ClientInfo(\n type=ClientType.foreign, # \u044d\u0442\u043e \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e\n # inn=\"012345678912\", # \u0418\u041d\u041d \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c, \u0435\u0441\u043b\u0438 \u043e\u043d \u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d\n name=\"Rusalky Sosalky Davalky Inc.\", # \u041a\u0440\u0430\u0442\u043a\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043d\u043e \u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e\n phone=\"+13053056699\", # \u041a\u043e\u043d\u0442\u0430\u043a\u0442\u043d\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u043f\u043e \u0436\u0435\u043b\u0430\u043d\u0438\u044e\n # email=\"i@mhorny.gay\", # \u041a\u043e\u043d\u0442\u0430\u043a\u0442\u043d\u044b\u0439 email \u043f\u043e \u0436\u0435\u043b\u0430\u043d\u0438\u044e\n )\n await client.declare_income(*cart, client=client_info)\n```\n\n### \u041a\u0430\u043d\u0441\u0435\u043b\u0438\u043c \u0447\u0435\u043a\u0438, \u043a\u0430\u043a \u0418\u0442\u0430\u043b\u0438\u044e \u043d\u0430 \u0415\u0432\u0440\u043e\u0432\u0438\u0434\u0435\u043d\u0438\u0438 2021\n\n```python\nfrom datetime import datetime, timedelta\n\nfrom npdtools import NPDTools\nfrom npdtools.types import Service\n\nclient = NPDTools(default_inn=\"123456789012\")\n\n\nasync def main():\n await client.auth(\"123456789012\", \"~_ub&TS5RY~k9,czo(q*\")\n \n cart = [Service(name=\"\u041f\u0440\u043e\u043a\u043b\u0430\u0434\u043a\u0430 \u0441 \u043a\u0440\u044b\u043b\u044b\u0448\u043a\u0430\u043c\u0438\", amount=180.85, quantity=2)]\n await client.declare_income(*cart)\n\n declare_response = await client.declare_income(*cart)\n await client.cancel_income(declare_response.receipt_id)\n\n # \u0421 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u043c:\n await client.cancel_income(declare_response.receipt_id, comment=\"\u042d\u0442\u043e\u0442 \u043c\u0443\u0434\u0435\u043d\u044c \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u043b \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0434\u0435\u043d\u044c\u0433\u0438\")\n\n # \u0412\u043e\u0437\u0432\u0440\u0430\u0442 \u0437\u0430 \u0432\u0447\u0435\u0440\u0430\u0448\u043d\u0438\u0439 \u0434\u0435\u043d\u044c\n await client.cancel_income(declare_response.receipt_id, comment=\"\u041d\u0435 \u043f\u043e\u0434\u043e\u0448\u0451\u043b \u0440\u0430\u0437\u043c\u0435\u0440\", cancellation_time=datetime.now() - timedelta(days=1))\n```\n\n### \u0421\u0447\u0435\u0442\u0430\n```python\nfrom npdtools import NPDTools\nfrom npdtools.types import Service, BankAccount, BankPhone, ClientInfo, ClientType\n\nclient = NPDTools(default_inn=\"123456789012\")\n\n\nasync def main():\n await client.auth(\"123456789012\", \"~_ub&TS5RY~k9,czo(q*\")\n options = await client.get_payment_options()\n if len(options) == 0:\n # \u041f\u043e \u0421\u0411\u041f\n payment_option = BankPhone(\n name=\"\u0411\u0430\u043d\u043a \u0425a\u0439\u0441\",\n phone=\"79998887766\",\n )\n\n # \u041f\u043e \u0440\u0435\u043a\u0432\u0438\u0437\u0438\u0442\u0430\u043c \u0441\u0447\u0451\u0442\u0430\n payment_option = BankAccount(\n name=\"\u0422\u043e\u0447\u043a\u0430 \u0411\u0430\u043d\u043a\",\n bik=\"044525104\",\n account=\"40802810201500127107\",\n corr=\"30101810745374525104\",\n )\n else:\n payment_option = options[0]\n \n # \u0414\u043b\u044f \u0444\u0438\u0437\u043b\u0438\u0446\u0430 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0424\u0418\u041e. \u0414\u043b\u044f \u0418\u041f \u0438 \u041e\u041e\u041e - \u0418\u041d\u041d. \u0414\u043b\u044f \u0437\u0430\u0440\u0443\u0431\u0435\u0436\u043d\u044b\u0445 - \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 (\u0442\u043e\u0436\u0435 name)\n client_info = ClientInfo(\n name=\"\u041a\u0430\u0440\u0430\u0441\u0443\u043a\u043e\u0432 \u0412\u043b\u0430\u0434\u0438\u043c\u0438\u0440 \u042f\u0440\u043e\u0441\u043b\u0430\u0432\u043e\u0432\u0438\u0447\",\n type=ClientType.individual, # \u0414\u043b\u044f \u0418\u041f, \u041e\u041e\u041e \u0438 \u0437\u0430\u0440\u0443\u0431\u0435\u0436\u043d\u044b\u0445 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0442\u0438\u043f\n phone=\"79998887766\", # \u041d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\n email=\"i@mhorny.gay\", # \u041d\u0430 \u044d\u0442\u043e\u0442 \u0430\u0434\u0440\u0435\u0441 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u0439\u0442\u0438 \u0447\u0435\u043a \u043f\u043e\u0441\u043b\u0435 \u0435\u0433\u043e \u0432\u044b\u0434\u0430\u0447\u0438, \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\n )\n\n cart = [Service(name=\"\u041f\u0440\u043e\u043a\u043b\u0430\u0434\u043a\u0430 \u0441 \u043a\u0440\u044b\u043b\u044b\u0448\u043a\u0430\u043c\u0438\", amount=180.85, quantity=2)]\n invoice = await client.create_invoice(\n *cart,\n bank=payment_option,\n client=client_info,\n )\n\n invoice = await client.invoice_paid(invoice.invoice_id)\n invoice = await client.invoice_complete(invoice.invoice_id)\n # or\n invoice = await client.cancel_invoice(invoice.invoice_id)\n```\n\u042f \u0431\u0443\u0434\u0443 \u0435\u0449\u0451 \u0434\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443, \u0434\u0430. \u041d\u043e \u043f\u043e\u043a\u0430 \u0442\u0430\u043a. \u041e\u043d\u0430 \u043d\u0435 \u0442\u0430\u043a\u0430\u044f \u043f\u0440\u043e\u0441\u0442\u0430\u044f, \u043a\u0430\u043a \u043a\u0430\u0436\u0435\u0442\u0441\u044f.\n\n\u0411\u0443\u0434\u0443 \u0440\u0430\u0434 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u0438\u0432\u043d\u044b\u043c \u043f\u0443\u043b \u0440\u0435\u043a\u0432\u0435\u0441\u0442\u0430\u043c \u0438 \u0438\u0441\u0441\u0443\u044f\u043c.\n",
"bugtrack_url": null,
"license": "MPL 2.0",
"summary": "tool for work with FNS API",
"version": "1.0.1",
"project_urls": {
"Homepage": "https://gitlab.com/whiteapfel/npdtools",
"\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f": "https://npd-tools.readthedocs.io/en/latest/",
"\u0418\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438": "https://gitlab.com/whiteapfel/npdtools/",
"\u041f\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u043c": "https://t.me/apfel"
},
"split_keywords": [
"fns",
"api",
"wrapper",
"nalog",
"\u043d\u0430\u043b\u043e\u0433",
"\u0444\u043d\u0441",
"\u0441\u0430\u043c\u043e\u0437\u0430\u043d\u044f\u0442\u043e\u0441\u0442\u044c"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "8a4a32326826370229c5110149901708b7eaf8ca4c31e082cd9e3dbcadb53a52",
"md5": "479eb68839302f46badc2dae3dbb998f",
"sha256": "336461bb55b33053e98289c9917a4020c39171883f30f52e2c99250b683303a9"
},
"downloads": -1,
"filename": "npdtools-1.0.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "479eb68839302f46badc2dae3dbb998f",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 28631,
"upload_time": "2024-02-07T19:30:01",
"upload_time_iso_8601": "2024-02-07T19:30:01.407983Z",
"url": "https://files.pythonhosted.org/packages/8a/4a/32326826370229c5110149901708b7eaf8ca4c31e082cd9e3dbcadb53a52/npdtools-1.0.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "50c89959eb544574c683f4717d8c6f4bf29940a42cbef580175b160387c34ae0",
"md5": "1c375f9b12a2ac562d26f3bd11ac9b13",
"sha256": "ea4cfba7318b3e8b0a8be0b2bfa4fa2efc7c9ba446f713f10dbe809f61a131e3"
},
"downloads": -1,
"filename": "npdtools-1.0.1.tar.gz",
"has_sig": false,
"md5_digest": "1c375f9b12a2ac562d26f3bd11ac9b13",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 25656,
"upload_time": "2024-02-07T19:30:03",
"upload_time_iso_8601": "2024-02-07T19:30:03.668046Z",
"url": "https://files.pythonhosted.org/packages/50/c8/9959eb544574c683f4717d8c6f4bf29940a42cbef580175b160387c34ae0/npdtools-1.0.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-02-07 19:30:03",
"github": false,
"gitlab": true,
"bitbucket": false,
"codeberg": false,
"gitlab_user": "whiteapfel",
"gitlab_project": "npdtools",
"lcname": "npdtools"
}