Работа со счетами¶
Счета позволяют выставлять счёта для оплаты услуг. После оплаты счёта можно автоматически создать чек.
Создание счёта¶
Базовый счёт для физического лица¶
Простой пример создания счёта с оплатой через СБП:
from nalogovich.lknpd import NpdClient
from nalogovich.enums import InvoicePaymentType, InvoiceClientType
async def create_simple_invoice():
async with NpdClient(inn="123456789012", password="your_password") as client:
await client.auth()
invoice = await client.create_bill(
name="Консультация по веб-разработке",
amount=10000.00,
client_name="Иван Петров",
client_phone="+79001234567",
client_email="ivan@example.com",
client_type=InvoiceClientType.FROM_INDIVIDUAL,
payment_type=InvoicePaymentType.PHONE, # Оплата через СБП
phone="+79009876543", # Ваш номер для получения оплаты
bank_name="Сбербанк"
)
print(f"✅ Счёт создан!")
print(f"ID: {invoice.invoice_id}")
Счёт с несколькими позициями¶
from nalogovich.models.operations import ServiceCheck
async def create_multi_item_invoice():
async with NpdClient(inn="123456789012", password="your_password") as client:
await client.auth()
services = [
ServiceCheck(name="Дизайн главной страницы", amount=15000.00, quantity=1),
ServiceCheck(name="Вёрстка", amount=20000.00, quantity=1),
ServiceCheck(name="Интеграция с backend", amount=25000.00, quantity=1),
]
invoice = await client.create_bill(
services=services,
client_name="ООО Технологии",
client_inn="7743013902", # Обязательно для юр. лиц
client_type=InvoiceClientType.FROM_LEGAL_ENTITY,
payment_type=InvoicePaymentType.PHONE,
phone="+79009876543",
bank_name="Тинькофф"
)
total = sum(s.amount * s.quantity for s in services)
print(f"✅ Счёт на {total:,.0f} ₽ создан")
Юридические лица
Для юридических лиц (InvoiceClientType.FROM_LEGAL_ENTITY) обязательно указывайте client_inn.
Счёт с оплатой на банковский счёт¶
Вместо СБП можно указать банковский счёт:
async def create_invoice_with_bank_account():
async with NpdClient(inn="123456789012", password="your_password") as client:
await client.auth()
invoice = await client.create_bill(
name="Разработка мобильного приложения",
amount=150000.00,
client_name="ООО Инновации",
client_inn="7743013902",
client_type=InvoiceClientType.FROM_LEGAL_ENTITY,
payment_type=InvoicePaymentType.ACCOUNT, # Оплата на счёт
bank_name="Тинькофф Банк",
bank_bik="044525974",
corr_account="30101810145250000974",
current_account="40817810099910004312"
)
print(f"✅ Счёт создан с реквизитами для оплаты на счёт")
Обязательные поля
При payment_type=InvoicePaymentType.ACCOUNT необходимо указать:
bank_name— название банкаbank_bik— БИК банкаcorr_account— корреспондентский счётcurrent_account— расчётный счёт
Счёт для иностранной организации¶
async def create_invoice_for_foreign():
async with NpdClient(inn="123456789012", password="your_password") as client:
await client.auth()
invoice = await client.create_bill(
name="Software development services",
amount=50000.00,
client_name="Foreign Company Ltd",
client_type=InvoiceClientType.FROM_FOREIGN_AGENCY, # Иностранная организация
payment_type=InvoicePaymentType.PHONE,
phone="+79009876543",
bank_name="Сбербанк"
)
print(f"✅ Счёт для иностранной организации создан")
Получение списка счетов¶
Все счета¶
async def get_all_invoices():
async with NpdClient(inn="123456789012", password="your_password") as client:
await client.auth()
response = await client.get_bills()
print(f"Всего счетов: {len(response.items)}")
for invoice in response.items:
print(f" Счёт №{invoice.invoice_id}")
print(f" Статус: {invoice.status}")
print(f" Сумма: {invoice.total_amount} ₽")
print(f" Клиент: {invoice.client_name}")
print(f" Создан: {invoice.created_at}")
Фильтрация по статусу¶
from nalogovich.enums import InvoiceStatus
async def get_paid_invoices():
async with NpdClient(inn="123456789012", password="your_password") as client:
await client.auth()
# Только оплаченные счета
response = await client.get_bills(
status=InvoiceStatus.PAID
)
print(f"Оплаченных счетов: {len(response.items)}")
Доступные статусы:
| Статус | Описание |
|---|---|
InvoiceStatus.CREATED |
Создан |
InvoiceStatus.TO_PAYMENT |
К оплате |
InvoiceStatus.PAID |
Оплачен |
InvoiceStatus.FUND_RECEIVED |
Средства получены |
InvoiceStatus.PAID_WITH_RECEIPT |
Оплачен с чеком |
InvoiceStatus.PAID_WITHOUT_RECEIPT |
Оплачен без чека |
InvoiceStatus.CANCELLED |
Аннулирован |
InvoiceStatus.ERROR |
Ошибка |
InvoiceStatus.ALL |
Все статусы (по умолчанию) |
Поиск счёта¶
async def search_invoices():
async with NpdClient(inn="123456789012", password="your_password") as client:
await client.auth()
# Поиск по ИНН или имени клиента
response = await client.get_bills(
search="7743013902" # ИНН или имя клиента
)
print(f"Найдено счетов: {len(response.items)}")
Фильтрация по дате¶
from datetime import datetime, timedelta
async def get_invoices_by_date():
async with NpdClient(inn="123456789012", password="your_password") as client:
await client.auth()
# Счета за последнюю неделю
week_ago = datetime.now() - timedelta(days=7)
response = await client.get_bills(
date_from=week_ago,
date_to=datetime.now()
)
print(f"Счетов за неделю: {len(response.items)}")
Пагинация¶
async def get_all_invoices_paginated():
async with NpdClient(inn="123456789012", password="your_password") as client:
await client.auth()
offset = 0
limit = 20
all_invoices = []
while True:
response = await client.get_bills(
offset=offset,
limit=limit
)
all_invoices.extend(response.items)
if not response.has_more:
break
offset += limit
print(f"Всего загружено счетов: {len(all_invoices)}")
Управление счётом¶
Отметить как оплаченный¶
После того как клиент оплатил счёт, отметьте его как оплаченный:
async def approve_invoice():
async with NpdClient(inn="123456789012", password="your_password") as client:
await client.auth()
invoice_id = 12345 # ID счёта
invoice = await client.approve_bill(invoice_id)
print(f"✅ Счёт №{invoice_id} отмечен как оплаченный")
print(f"Статус: {invoice.status}")
Создать чек на основе оплаченного счёта¶
После оплаты счёта можно автоматически создать чек:
from datetime import datetime
async def create_receipt_from_invoice():
async with NpdClient(inn="123456789012", password="your_password") as client:
await client.auth()
invoice_id = 12345
# Указываем дату получения средств (если не указать - текущее время)
invoice = await client.create_check_from_bill(
invoice_id=invoice_id,
operation_time=datetime.now()
)
print(f"✅ Чек создан для счёта №{invoice_id}")
print(f"UUID чека: {invoice.receipt_id}")
Изменить способ оплаты¶
Если нужно изменить реквизиты для оплаты:
async def update_payment_method():
async with NpdClient(inn="123456789012", password="your_password") as client:
await client.auth()
invoice_id = 12345
# Меняем на другой номер СБП
invoice = await client.update_bill_payment_info(
invoice_id=invoice_id,
payment_type=InvoicePaymentType.PHONE,
phone="+79991234567",
bank_name="Альфа-Банк"
)
print(f"✅ Способ оплаты для счёта №{invoice_id} обновлён")
Аннулировать счёт¶
Если счёт больше не нужен:
async def cancel_invoice():
async with NpdClient(inn="123456789012", password="your_password") as client:
await client.auth()
invoice_id = 12345
invoice = await client.cancel_bill(invoice_id)
print(f"✅ Счёт №{invoice_id} аннулирован")
print(f"Статус: {invoice.status}")
Важно
Аннулировать можно только счета в статусе "Создан" или "К оплате". Оплаченные счета аннулировать нельзя.
Получение реквизитов¶
Получите сохранённые реквизиты для выставления счетов:
Реквизиты СБП¶
async def get_sbp_details():
async with NpdClient(inn="123456789012", password="your_password") as client:
await client.auth()
payment_types = await client.get_payment_types(
payment_type=InvoicePaymentType.PHONE
)
print("Доступные номера для СБП:")
for pt in payment_types:
default = "⭐" if pt.is_default else ""
print(f" {pt.phone} ({pt.bank_name}) {default}")
Банковские счета¶
async def get_bank_accounts():
async with NpdClient(inn="123456789012", password="your_password") as client:
await client.auth()
payment_types = await client.get_payment_types(
payment_type=InvoicePaymentType.ACCOUNT
)
print("Доступные банковские счета:")
for pt in payment_types:
print(f"\n{pt.bank_name}")
print(f" Расчётный счёт: {pt.current_account}")
print(f" БИК: {pt.bank_bik}")
print(f" Корр. счёт: {pt.corr_account}")