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.")