npdtools-fx


Namenpdtools-fx JSON
Version 1.0.2 PyPI version JSON
download
home_pagehttps://gitlab.com/whiteapfel/npdtools
Summarytool for work with FNS API
upload_time2024-05-07 12:22:39
maintainerNone
docs_urlNone
authorWhiteApfel
requires_pythonNone
licenseMPL 2.0
keywords fns api wrapper nalog налог фнс самозанятость
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # NPDTools

Исправления:
* Исправлено название ключа `refreshToken`
* Использование стандартного `json` модуля
* Установка модуля `typing` только для python<3.5 (возможно стоит совсем убрать)
* Обновлен модуль `httpx` до 0.27.0
* Обновлен юзерагент
* Удалены print'ы

Ищешь инструмент для удобного декларирования доходов? 
Хочешь автоматизировать выдачу чеков клиентам?
Надоело заходить в Мой налог? Надоедает проверять, что каждый приход зарегистрирован в налоговой?
Боишься ошибиться и получить безжалостный удар от ФНС кнутом без пряника?

### ВЫХОД ЕСТЬ! Для этого потребуется простая питоняшая...

Нет, не сода. Либа. 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-fx",
    "maintainer": null,
    "docs_url": null,
    "requires_python": null,
    "maintainer_email": null,
    "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/e5/e8/c0f89e5c087a9ecca114a553bfc486989d9bc193a98228ac1c9916d48d25/npdtools_fx-1.0.2.tar.gz",
    "platform": null,
    "description": "# NPDTools\r\n\r\n\u0418\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f:\r\n* \u0418\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043b\u044e\u0447\u0430 `refreshToken`\r\n* \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e `json` \u043c\u043e\u0434\u0443\u043b\u044f\r\n* \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043c\u043e\u0434\u0443\u043b\u044f `typing` \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f python<3.5 (\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0441\u0442\u043e\u0438\u0442 \u0441\u043e\u0432\u0441\u0435\u043c \u0443\u0431\u0440\u0430\u0442\u044c)\r\n* \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d \u043c\u043e\u0434\u0443\u043b\u044c `httpx` \u0434\u043e 0.27.0\r\n* \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d \u044e\u0437\u0435\u0440\u0430\u0433\u0435\u043d\u0442\r\n* \u0423\u0434\u0430\u043b\u0435\u043d\u044b print'\u044b\r\n\r\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? \r\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?\r\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?\r\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?\r\n\r\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...\r\n\r\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. \r\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\r\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.\r\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.\r\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. \r\n\r\n## \u0415\u0441\u043b\u0438 \u0442\u044b \u043d\u0435 \u0437\u043d\u0430\u0435\u0448\u044c \u0441\u0432\u043e\u0439 \u26a0\ufe0f password \u26a0\ufe0f\r\n\r\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,\r\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:\r\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\r\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\r\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\r\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\r\n\r\n## \u041f\u0440\u043e\u0433\u0440\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438\r\n* \u0427\u0435\u043a\u0438\r\n  * [x] \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0447\u0435\u043a\u0430\r\n  * [x] \u0410\u043d\u043d\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0447\u0435\u043a\u0430\r\n  * [x] \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0447\u0435\u043a\u043e\u0432\r\n* \u0421\u0447\u0435\u0442\u0430\r\n  * [x] \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0447\u0451\u0442\u0430\r\n  * [x] \u041e\u0442\u043c\u0435\u0442\u043a\u0430 \u043e\u043f\u043b\u0430\u0447\u0435\u043d\u043d\u044b\u043c\r\n  * [x] \u0412\u044b\u0434\u0430\u0447\u0430 \u0447\u0435\u043a\u0430 \u043f\u043e \u0441\u0447\u0451\u0442\u0443\r\n  * [x] \u0421\u043c\u0435\u043d\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u043e\u043f\u043b\u0430\u0442\u044b\r\n  * [x] \u041e\u0442\u043c\u0435\u043d\u0430 \u0441\u0447\u0451\u0442\u0430\r\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\r\n* \u041f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u0435\r\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\r\n  * [ ] \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0447\u0435\u043a\u043e\u0432 \u043f\u043e \u0442\u043e\u043a\u0435\u043d\u0443\r\n  * [ ] \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u043e\u0433\u043e\u0432 \u043f\u043e \u0442\u043e\u043a\u0435\u043d\u0443\r\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\r\n* \u0414\u0440\u0443\u0433\u043e\u0435\r\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\r\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\r\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\r\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\r\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\r\n  * [ ] \u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u0438\r\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\r\n  * [ ] \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u0442\u043d\u0451\u0440\u043e\u0432\r\n  * [ ] \u0421\u043d\u044f\u0442\u0438\u0435 \u0441 \u0443\u0447\u0451\u0442\u0430 \u041d\u041f\u0414\r\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\r\n  * [ ] \u041a\u043b\u044e\u0447\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430\r\n  * [ ] \u0421\u043f\u0440\u0430\u0432\u043a\u0438\r\n\r\n  \r\n## \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f\r\n\r\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.\r\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.\r\n\r\n## \u0427\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430?\r\n\r\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.\r\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. \r\n\r\n### \u0412\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0447\u0435\u043a, \u043a\u0430\u043a \u043f\u0440\u043e\u0444\u0438\r\n\r\n```python\r\nfrom decimal import Decimal\r\n\r\nfrom npdtools import NPDTools\r\nfrom npdtools.types import Service, ClientType, ClientInfo\r\n\r\nclient = NPDTools(default_inn=\"123456789012\")\r\n\r\n\r\nasync def main():\r\n    await client.auth(\"123456789012\", \"~_ub&TS5RY~k9,czo(q*\")\r\n\r\n    # \u041a\u0430\u043a \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0432 \u0447\u0435\u043a:\r\n    # 1. \u041c\u0435\u0442\u043e\u0434 \u0437\u0434\u043e\u0440\u043e\u0432\u043e\u0433\u043e \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430\r\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)]\r\n    cart.append(Service(name=\"\u041f\u0440\u043e\u043a\u043b\u0430\u0434\u043a\u043e\u0445\u043e\u043b\u0434\u0435\u0440\", amount=1234.56))\r\n    await client.declare_income(*cart)\r\n\r\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\r\n    await client.declare_income(Service(name=\"\u0418\u0437\u044e\u043c\", amount=Decimal(\"0.4\"), quantity=856))\r\n\r\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\r\n    await client.declare_income(Service(name=\"\u0414\u043e\u0441\u043a\u0430\", amount=600, quantity=2), Service(name=\"Udjplb\", amount=4, quantity=10))\r\n\r\n    # \u041a\u0430\u043a \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0444\u0438\u0437\u043b\u0438\u0446\u0430\u043c?\r\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\r\n    await client.declare_income(*cart)\r\n\r\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\r\n    client_info = ClientInfo(\r\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\r\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)\r\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\",\r\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\r\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\r\n    )\r\n    await client.declare_income(*cart, client=client_info)\r\n\r\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?\r\n    client_info = ClientInfo(\r\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\r\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.\r\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\r\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\r\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\r\n    )\r\n    await client.declare_income(*cart, client=client_info)\r\n\r\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?\r\n    client_info = ClientInfo(\r\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\r\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\r\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\r\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\r\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\r\n    )\r\n    await client.declare_income(*cart, client=client_info)\r\n```\r\n\r\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\r\n\r\n```python\r\nfrom datetime import datetime, timedelta\r\n\r\nfrom npdtools import NPDTools\r\nfrom npdtools.types import Service\r\n\r\nclient = NPDTools(default_inn=\"123456789012\")\r\n\r\n\r\nasync def main():\r\n    await client.auth(\"123456789012\", \"~_ub&TS5RY~k9,czo(q*\")\r\n    \r\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)]\r\n    await client.declare_income(*cart)\r\n\r\n    declare_response = await client.declare_income(*cart)\r\n    await client.cancel_income(declare_response.receipt_id)\r\n\r\n    # \u0421 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u043c:\r\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\")\r\n\r\n    # \u0412\u043e\u0437\u0432\u0440\u0430\u0442 \u0437\u0430 \u0432\u0447\u0435\u0440\u0430\u0448\u043d\u0438\u0439 \u0434\u0435\u043d\u044c\r\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))\r\n```\r\n\r\n### \u0421\u0447\u0435\u0442\u0430\r\n```python\r\nfrom npdtools import NPDTools\r\nfrom npdtools.types import Service, BankAccount, BankPhone, ClientInfo, ClientType\r\n\r\nclient = NPDTools(default_inn=\"123456789012\")\r\n\r\n\r\nasync def main():\r\n    await client.auth(\"123456789012\", \"~_ub&TS5RY~k9,czo(q*\")\r\n    options = await client.get_payment_options()\r\n    if len(options) == 0:\r\n        # \u041f\u043e \u0421\u0411\u041f\r\n        payment_option = BankPhone(\r\n          name=\"\u0411\u0430\u043d\u043a \u0425a\u0439\u0441\",\r\n          phone=\"79998887766\",\r\n        )\r\n\r\n        # \u041f\u043e \u0440\u0435\u043a\u0432\u0438\u0437\u0438\u0442\u0430\u043c \u0441\u0447\u0451\u0442\u0430\r\n        payment_option = BankAccount(\r\n          name=\"\u0422\u043e\u0447\u043a\u0430 \u0411\u0430\u043d\u043a\",\r\n          bik=\"044525104\",\r\n          account=\"40802810201500127107\",\r\n          corr=\"30101810745374525104\",\r\n        )\r\n    else:\r\n        payment_option = options[0]\r\n    \r\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)\r\n    client_info = ClientInfo(\r\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\",\r\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\r\n      phone=\"79998887766\",  # \u041d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\r\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\r\n    )\r\n\r\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)]\r\n    invoice = await client.create_invoice(\r\n        *cart,\r\n        bank=payment_option,\r\n        client=client_info,\r\n    )\r\n\r\n    invoice = await client.invoice_paid(invoice.invoice_id)\r\n    invoice = await client.invoice_complete(invoice.invoice_id)\r\n    # or\r\n    invoice = await client.cancel_invoice(invoice.invoice_id)\r\n```\r\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.\r\n\r\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.\r\n",
    "bugtrack_url": null,
    "license": "MPL 2.0",
    "summary": "tool for work with FNS API",
    "version": "1.0.2",
    "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": "93f2397b2ec35791678d5c2091232441691c6a45637aa2b9a89fd1fc868db895",
                "md5": "426d116e2ce4191d5f0cedaf0d027b2c",
                "sha256": "45d92292e90ff8747984dc48b88aeaf7465b522784ebc404f1108ded5a068765"
            },
            "downloads": -1,
            "filename": "npdtools_fx-1.0.2-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "426d116e2ce4191d5f0cedaf0d027b2c",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": null,
            "size": 29137,
            "upload_time": "2024-05-07T12:22:35",
            "upload_time_iso_8601": "2024-05-07T12:22:35.757662Z",
            "url": "https://files.pythonhosted.org/packages/93/f2/397b2ec35791678d5c2091232441691c6a45637aa2b9a89fd1fc868db895/npdtools_fx-1.0.2-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "e5e8c0f89e5c087a9ecca114a553bfc486989d9bc193a98228ac1c9916d48d25",
                "md5": "de4cf40e2ddbf887d57ddf4b3a20299c",
                "sha256": "36423d06ddb53a1e7d93e5ca6730cac8bd4fd6008c094b611b030c689aa3d1a7"
            },
            "downloads": -1,
            "filename": "npdtools_fx-1.0.2.tar.gz",
            "has_sig": false,
            "md5_digest": "de4cf40e2ddbf887d57ddf4b3a20299c",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": null,
            "size": 26413,
            "upload_time": "2024-05-07T12:22:39",
            "upload_time_iso_8601": "2024-05-07T12:22:39.443103Z",
            "url": "https://files.pythonhosted.org/packages/e5/e8/c0f89e5c087a9ecca114a553bfc486989d9bc193a98228ac1c9916d48d25/npdtools_fx-1.0.2.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-05-07 12:22:39",
    "github": false,
    "gitlab": true,
    "bitbucket": false,
    "codeberg": false,
    "gitlab_user": "whiteapfel",
    "gitlab_project": "npdtools",
    "lcname": "npdtools-fx"
}
        
Elapsed time: 0.22451s