Package: npdtools
NPDToolsИщешь инструмент для удобного декларирования доходов?
Хочешь автоматизировать выдачу чеков клиентам?
Надоело заходить в Мой налог? Надоедает проверять, что каждый приход зарегистрирован в налоговой?
Боишься ошибиться и получить безжалостный удар от ФНС кнутом без пряника?ВЫХОД ЕСТЬ! Для этого потребуется простая питоняшая...Нет, не сода. Либа. README которой ты сейчас читаешь.
Да, она позволяет работать с API Федеральной налоговой службы (ФНС) в рамках возможностей
приложения "Мой налог". Больше она не умеет. Столько же не умеет. Меньше умеет.
Надеюсь, теперь все люди, что искали подобный инструмент в гугле, смогли его найти.
Можно приступить к содержательной части.Если ты не знаешь свой ⚠️ password ⚠️Если входишь в lknpd.nalog.ru или "Мой налог" через Госуслуги (ЕСИА) или просто не помнишь пароль,
надо зайти наlkfl2.nalog.ruи там по ситуации:Войти так же через Госуслуги и сменить (установить) пароль в настройках профиляВойти по электронной подписи и сменить пароль в настройках профиляНажать кнопочку "Восстановить пароль" и пройти процедуру восстановленияНе разобраться в ситуации и смириться со сложностью бытияПрогресс разработкиЧекиСоздание чекаАннулирование чекаПолучение списка чековСчетаСоздание счётаОтметка оплаченнымВыдача чека по счётуСмена способа оплатыОтмена счётаПолучение способов оплаты счётаПубличноеПроверка статуса самозанятогоПроверка чеков по токенуПроверка налогов по токенуПроверка оплат налогов по токенуДругоеДобавление способа оплаты счётаУдаление способа оплаты счётаАктивация и деактивация автоплатежаУдаление привязанной карты для автоплатежаИзменение видов деятельностиРедактирование профессииРедактирование текста в чекеУдаление партнёровСнятие с учёта НПДОтображение номера и почты в чекеКлючи доступаСправкиДокументацияЕё в нормальном виде нет, но в коде описано детально, какие модели возвращает функция, можно смотреть на них.
Когда-нибудь, возможно, добавлю больше.Что может библиотека?Собственно, всё сводится к выставлению, закрытию и получению счетов и чеков.
Что? Примеров хочешь? Держи примеров. Обмажься.Выставляем чек, как профиfromdecimalimportDecimalfromnpdtoolsimportNPDToolsfromnpdtools.typesimportService,ClientType,ClientInfoclient=NPDTools(default_inn="123456789012")asyncdefmain():awaitclient.auth("123456789012","~_ub&TS5RY~k9,czo(q*")# Как добавлять позиции в чек:# 1. Метод здорового человекаcart=[Service(name="Прокладка с крылышками",amount=180.85,quantity=2)]cart.append(Service(name="Прокладкохолдер",amount=1234.56))awaitclient.declare_income(*cart)# Вот так можно декларировать товары на развес: с ценой за грамм и указанием веса в граммахawaitclient.declare_income(Service(name="Изюм",amount=Decimal("0.4"),quantity=856))# 2. Метод немного здорового человекаawaitclient.declare_income(Service(name="Доска",amount=600,quantity=2),Service(name="Udjplb",amount=4,quantity=10))# Как выставлять физлицам?# Применяется автоматически, так как никакие данные не требуютсяawaitclient.declare_income(*cart)# Если хотите выдать чек физлицу с указанием его фио, телефона, инн или иных данныхclient_info=ClientInfo(type=ClientType.individual,# это не обязательно, так как значение по умолчаниюinn="012345678912",# Как и поля ниже, можно указывать, если знаем, либо пропустить (или передать None)name="Зотов Данил Константинович",phone="79998887766",# Допускается любой форматemail="i@mhorny.gay",# Туда может приходить чек от ФНС, но не факт)awaitclient.declare_income(*cart,client=client_info)# ИП или ООО или прочая российская организация?client_info=ClientInfo(type=ClientType.legal,# это не обязательно, так как значение по умолчаниюinn="012345678912",# Для ИП и ООО надо указать ИНН. Обязательно.name="ИП Колосов Илья Владимирович",# Краткое название, указывать не обязательно, но желательноphone="79998887766",# Контактный номер по желанию# email="i@mhorny.gay",  # Контактный email по желанию)awaitclient.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 по желанию)awaitclient.declare_income(*cart,client=client_info)Канселим чеки, как Италию на Евровидении 2021fromdatetimeimportdatetime,timedeltafromnpdtoolsimportNPDToolsfromnpdtools.typesimportServiceclient=NPDTools(default_inn="123456789012")asyncdefmain():awaitclient.auth("123456789012","~_ub&TS5RY~k9,czo(q*")cart=[Service(name="Прокладка с крылышками",amount=180.85,quantity=2)]awaitclient.declare_income(*cart)declare_response=awaitclient.declare_income(*cart)awaitclient.cancel_income(declare_response.receipt_id)# С комментарием:awaitclient.cancel_income(declare_response.receipt_id,comment="Этот мудень попросил вернуть деньги")# Возврат за вчерашний деньawaitclient.cancel_income(declare_response.receipt_id,comment="Не подошёл размер",cancellation_time=datetime.now()-timedelta(days=1))СчетаfromnpdtoolsimportNPDToolsfromnpdtools.typesimportService,BankAccount,BankPhone,ClientInfo,ClientTypeclient=NPDTools(default_inn="123456789012")asyncdefmain():awaitclient.auth("123456789012","~_ub&TS5RY~k9,czo(q*")options=awaitclient.get_payment_options()iflen(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=awaitclient.create_invoice(*cart,bank=payment_option,client=client_info,)invoice=awaitclient.invoice_paid(invoice.invoice_id)invoice=awaitclient.invoice_complete(invoice.invoice_id)# orinvoice=awaitclient.cancel_invoice(invoice.invoice_id)Я буду ещё дописывать библиотеку, да. Но пока так. Она не такая простая, как кажется.Буду рад конструктивным пул реквестам и иссуям.