138 lines
5.0 KiB
Python
138 lines
5.0 KiB
Python
import requests
|
||
import json
|
||
import os
|
||
from dotenv import load_dotenv
|
||
|
||
load_dotenv()
|
||
|
||
def fetch_invoices(api_url, api_key=None, params=None):
|
||
"""
|
||
Запрашивает счета с API по указанному URL.
|
||
|
||
Параметры:
|
||
api_url (str): URL для получения счетов.
|
||
api_key (str, optional): API ключ для авторизации.
|
||
params (dict, optional): Параметры запроса.
|
||
|
||
Возвращает:
|
||
dict: Декодированный JSON-ответ при успешном запросе или None в случае ошибки.
|
||
"""
|
||
headers = {
|
||
"accept": "application/ld+json"
|
||
}
|
||
if api_key:
|
||
headers["X-API-Key"] = api_key
|
||
|
||
try:
|
||
response = requests.get(api_url, headers=headers, params=params)
|
||
response.raise_for_status()
|
||
return response.json()
|
||
except requests.exceptions.RequestException as e:
|
||
print(f"Ошибка при запросе счетов: {e}")
|
||
return None
|
||
|
||
def print_invoice(invoice):
|
||
"""
|
||
Выводит информацию об одном счёте.
|
||
"""
|
||
print("-" * 60)
|
||
print(f"Invoice: {invoice.get('@id', 'N/A')}")
|
||
print(f" Type: {invoice.get('@type', 'N/A')}")
|
||
print(f" Created at: {invoice.get('created_at', 'N/A')}")
|
||
print(f" Closed at: {invoice.get('closed_at', 'N/A')}")
|
||
print(f" External ID: {invoice.get('ext_id', 'N/A')}")
|
||
print(f" External Type: {invoice.get('ext_type', 'N/A')}")
|
||
|
||
# Данные клиента
|
||
client = invoice.get("client", {})
|
||
print(" Client:")
|
||
print(f" ID: {client.get('@id', 'N/A')}")
|
||
print(f" Type: {client.get('@type', 'N/A')}")
|
||
print(f" Name: {client.get('name', 'N/A')}")
|
||
print(f" Club Card Number: {client.get('club_card_num', 'N/A')}")
|
||
|
||
# Финансовые данные
|
||
print(f" Sum: {invoice.get('sum', 'N/A')}")
|
||
print(f" Company Number: {invoice.get('comp_num', 'N/A')}")
|
||
print(f" Bonus: {invoice.get('bonus', 'N/A')}")
|
||
print(f" Start Bonus: {invoice.get('start_bonus', 'N/A')}")
|
||
print(f" Deposit Sum: {invoice.get('deposit_sum', 'N/A')}")
|
||
print(f" Notes: {invoice.get('notes', 'N/A')}")
|
||
print("-" * 60)
|
||
|
||
def print_view(view):
|
||
"""
|
||
Выводит информацию о навигации (пагинация) коллекции.
|
||
"""
|
||
print("\nНавигация коллекции:")
|
||
print(f" View ID: {view.get('@id', 'N/A')}")
|
||
print(f" Type: {view.get('@type', 'N/A')}")
|
||
print(f" First page: {view.get('first', 'N/A')}")
|
||
print(f" Last page: {view.get('last', 'N/A')}")
|
||
print(f" Previous page: {view.get('previous', 'N/A')}")
|
||
print(f" Next page: {view.get('next', 'N/A')}")
|
||
|
||
def print_search(search):
|
||
"""
|
||
Выводит информацию о параметрах поиска.
|
||
"""
|
||
print("\nПараметры поиска:")
|
||
print(f" Type: {search.get('@type', 'N/A')}")
|
||
print(f" Template: {search.get('template', 'N/A')}")
|
||
print(f" Variable Representation: {search.get('variableRepresentation', 'N/A')}")
|
||
mapping = search.get('mapping', [])
|
||
if mapping:
|
||
print(" Mapping:")
|
||
for m in mapping:
|
||
print(f" Variable: {m.get('variable', 'N/A')}")
|
||
print(f" Property: {m.get('property', 'N/A')}")
|
||
print(f" Required: {m.get('required', 'N/A')}")
|
||
else:
|
||
print(" Mapping: N/A")
|
||
|
||
def print_invoices_data(data):
|
||
"""
|
||
Анализирует и выводит всю информацию, полученную от API.
|
||
"""
|
||
total_items = data.get("totalItems", 0)
|
||
print(f"\nОбщее количество счетов: {total_items}\n")
|
||
|
||
# Разбор счетов
|
||
members = data.get("member", [])
|
||
if members:
|
||
print("Счета:")
|
||
for invoice in members:
|
||
print_invoice(invoice)
|
||
else:
|
||
print("Счета не найдены.")
|
||
|
||
# Разбор навигационной информации
|
||
view = data.get("view")
|
||
if view:
|
||
print_view(view)
|
||
else:
|
||
print("\nИнформация о навигации не предоставлена.")
|
||
|
||
# Разбор параметров поиска
|
||
search = data.get("search")
|
||
if search:
|
||
print_search(search)
|
||
else:
|
||
print("\nИнформация о параметрах поиска не предоставлена.")
|
||
|
||
if __name__ == '__main__':
|
||
base_url = "http://10.8.0.4:8000/api/invoices"
|
||
params = {
|
||
"page": 1,
|
||
"created_at[before]": "2025-03-05", # можно изменить диапазон дат по необходимости
|
||
"created_at[after]": "2025-02-01"
|
||
}
|
||
api_key = os.getenv("API_KEY") # Если API-ключ не требуется, можно оставить None
|
||
|
||
data = fetch_invoices(base_url, api_key, params)
|
||
|
||
if data is not None:
|
||
print_invoices_data(data)
|
||
else:
|
||
print("Не удалось получить данные счетов с API.")
|