Файл с партнерами: Partners_import.xlsx
Файл с типами продукции: Product_type_import.xlsx
Файл с продуктами: Products_import.xlsx
Файл с продажами: Partner_products_import.xlsx
###
###1 def calculate_discount(total_quantity):
"""Ра""Рассчитываетссчитывает скидку на основе общего количества проданной продукции

    Args:
        total_quantity (int): общее количество проданной продукции

    Returns:
        tuple: кортеж содержащий:
            - discount_percent (int): процент скидки
            - discount_description (str): текстовое описание скидки

    Discount tiers:
        - 15%: при объеме продаж от 300000 единиц
        - 10%: при объеме продаж от 50000 до 300000 единиц
        - 5%: при объеме продаж от 10000 до 50000 единиц
        - 0%: при объеме продаж менее 10000 единиц
    """
###2 def get_partners(db_path='partners.db', sort_by='rating', ascending=False):
"""Получает данные о партнерах из базы данных с возможностью сортировки и расчета скидок

    Args:
        db_path (str): путь к файлу базы данных SQLite. По умолчанию 'partners.db'
        sort_by (str): поле для сортировки. Допустимые значения:
            - 'rating': по рейтингу (по умолчанию)
            - 'discount': по общему количеству продаж (для расчета скидки)
            - 'name': по наименованию партнера
            - 'type': по типу партнера и наименованию
        ascending (bool): направление сортировки.
            - False: по убыванию (по умолчанию)
            - True: по возрастанию

    Returns:
        pandas.DataFrame или None: DataFrame с данными партнеров или None в случае ошибки

    Структура возвращаемого DataFrame:
        - Тип партнера
        - Наименование партнера
        - Директор
        - Электронная почта
        - Телефон
        - Юридический адрес
        - ИНН
        - Рейтинг
        - Дата создания
        - total_quantity: общее количество продаж (скрытое поле)
        - Скидка: процент скидки на основе total_quantity
        - Текст_скидки: текстовое описание скидки

    Raises:
        sqlite3.Error: ошибки работы с базой данных
        Exception: другие возможные ошибки

    Example:
        >>> df = get_partners(sort_by='discount', ascending=True)
        >>> df = get_partners('my_database.db', sort_by='name')
    """
### 3  def get_sales_history(db_path='partners.db', limit=50, sort_by='date_desc'):
    """Получает историю реализации продукции с разными вариантами сортировки

    Args:
        db_path (str): путь к файлу базы данных SQLite. По умолчанию 'partners.db'
        limit (int): ограничение количества возвращаемых записей. По умолчанию 50
        sort_by (str): критерий сортировки данных. Допустимые значения:
            - 'date_desc': по дате продажи (новые сверху, по умолчанию)
            - 'date_asc': по дате продажи (старые сверху)
            - 'quantity_desc': по количеству (по убыванию)
            - 'amount_desc': по общей сумме (по убыванию)

    Returns:
        pandas.DataFrame или None: DataFrame с историей продаж или None в случае ошибки

    Структура возвращаемого DataFrame:
        - Дата продажи: дата осуществления продажи
        - Партнер: наименование партнера
        - Продукция: название продукции
        - Артикул: артикул продукции
        - Количество: количество проданных единиц
        - Цена за единицу: цена за одну единицу продукции
        - Общая сумма: общая сумма продажи (рассчитывается как количество × цена)
        - Тип продукции: категория продукции

    Raises:
        Exception: ошибки при выполнении запроса к базе данных

    Example:
        >>> # Получить последние 50 продаж
        >>> df = get_sales_history()

        >>> # Получить 100 самых крупных продаж по сумме
        >>> df = get_sales_history(limit=100, sort_by='amount_desc')

        >>> # Получить историю продаж в хронологическом порядке
        >>> df = get_sales_history(sort_by='date_asc', limit=200)
    """
###4 def print_partner_cards(partners_df):
    """Выводит карточки партнеров в красивом формате с рамкой

    Args:
        partners_df (pandas.DataFrame): DataFrame с данными партнеров, полученный из функции get_partners()

    Returns:
        None: функция выполняет только вывод в консоль

    Формат вывода:
        Каждая карточка партнера оформлена в виде рамки с следующими полями:
        - Тип партнера
        - Наименование партнера
        - Директор
        - Рейтинг
        - Общее количество проданных единиц (форматированное с разделителями тысяч)
        - Размер и описание скидки
        - Электронная почта
        - Телефон
        - ИНН
        - Юридический адрес (обрезается до 60 символов если слишком длинный)

    Особенности:
        - Если передан пустой DataFrame или None, выводится сообщение об отсутствии данных
        - Адрес автоматически обрезается если превышает 60 символов
        - Числовые значения количества форматируются с разделителями тысяч
        - Между карточками добавляются пустые строки для лучшей читаемости

    Example:
        >>> partners_data = get_partners()
        >>> print_partner_cards(partners_data)

        ╔═══════════════════════════════════════════════════════════════════════╗
        ║                          КАРТОЧКА ПАРТНЕРА                           ║
        ╠═══════════════════════════════════════════════════════════════════════╣
        ║ Тип: Поставщик                                                       ║
        ║ Наименование: ООО "Ромашка"                                          ║
        ║ Директор: Иванов Иван Иванович                                       ║
        ║ Рейтинг: 4.8                                                         ║
        ║ Продано единиц: 150,000                                              ║
        ║ Скидка: 10% (50000-300000 ед.)                                       ║
        ║                                                                       ║
        ║ Контакты: info@romashka.ru                                           ║
        ║ Телефон: +7 (495) 123-45-67                                          ║
        ║                                                                       ║
        ║ ИНН: 7712345678                                                      ║
        ║ Адрес: г. Москва, ул. Ленина, д. 1, офис 25                          ║
        ╚═══════════════════════════════════════════════════════════════════════╝
    """
###5 def print_sales_cards(sales_df):
    """Выводит историю реализации продукции в виде форматированной таблицы с рамкой

    Args:
        sales_df (pandas.DataFrame): DataFrame с данными о продажах, полученный из функции get_sales_history()

    Returns:
        None: функция выполняет только вывод в консоль

    Формат вывода:
        Таблица с рамкой содержит следующие колонки:
        - Дата: дата продажи (обрезается до 10 символов)
        - Партнер: наименование партнера (максимум 16 символов)
        - Продукция: название продукции (максимум 57 символов)
        - Артикул: артикул продукции (максимум 8 символов)
        - Кол-во: количество проданных единиц (форматируется с разделителями тысяч)
        - Цена: цена за единицу (форматируется с двумя decimal places)
        - Сумма: общая сумма продажи (форматируется с двумя decimal places)

    Особенности:
        - Если передан пустой DataFrame или None, выводится сообщение об отсутствии данных
        - Все числовые значения форматируются с разделителями тысяч и двумя знаками после запятой
        - В конце таблицы выводятся итоговые показатели:
            * Количество продаж
            * Общее количество проданных единиц
            * Общая сумма всех продаж
        - Ширина таблицы фиксирована (147 символов) для сохранения форматирования

    Example:
        >>> sales_data = get_sales_history(limit=10)
        >>> print_sales_cards(sales_data)

        ╔═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
        ║                                                          ИСТОРИЯ РЕАЛИЗАЦИИ ПРОДУКЦИИ                                                               ║
        ╠═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╣
        ║ Дата         Партнер           Продукция                                                  Арт   Кол-во      Цена           Сумма                      ║
        ╠═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╣
        ║ 2024-01-15 ║ ООО "Ромашка"   ║ Процессор Intel Core i7-13700K                           ║ A123  ║    150 ║ 25,000.00 ║     3,750,000.00 ║
        ║ 2024-01-14 ║ ИП Петров       ║ Монитор Samsung Odyssey G7 27"                          ║ B456  ║     50 ║ 35,000.00 ║     1,750,000.00 ║
        ╚═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
        📊 ИТОГО: 2 продаж, 200 единиц, общая сумма: 5,500,000.00 руб.
    """
###6  def check_database():
 """Упрощенная функция выбора опции из списка с валидацией ввода

    Args:
        options (list): список строк с доступными опциями для выбора

    Returns:
        str: выбранная опция из списка options

    Особенности:
        - Выводит пронумерованный список опций в красивом формате
        - Запрашивает ввод пользователя с валидацией
        - Обрабатывает некорректный ввод и повторяет запрос
        - Обрабатывает прерывание программы (Ctrl+C) с graceful shutdown
        - Поддерживает ввод только цифровых значений в допустимом диапазоне

    Raises:
        SystemExit: при прерывании программы пользователем (KeyboardInterrupt)

    Example:
        >>> options = ["Показать всех партнеров", "История продаж", "Выход"]
        >>> choice = simple_choice(options)

        ==================================================
        ВЫБЕРИТЕ ОПЦИЮ:
        ==================================================
        1. Показать всех партнеров
        2. История продаж
        3. Выход

        Введите номер (1-3): 2
        >>> print(choice)
        "История продаж"

    Обработка ошибок:
        - Некорректный ввод (не цифры): повторный запрос
        - Число вне диапазона: повторный запрос
        - Прерывание (Ctrl+C): graceful exit программы
        - EOF (Ctrl+D в Unix): обрабатывается как некорректный ввод
    """
"""Проверяет загруженные данные в базе данных и выводит статистику по таблицам

    Функция подключается к SQLite базе данных и подсчитывает количество записей
    в каждой из основных таблиц системы для проверки целостности данных.

    Args:
        None: использует фиксированный путь к базе данных 'partners.db'

    Returns:
        None: функция выполняет только вывод статистики в консоль

    Проверяемые таблицы:
        - PartnerType: типы партнеров (поставщики, клиенты и т.д.)
        - Partner: основные данные о партнерах
        - ProductType: категории продукции
        - Product: данные о продукции
        - Sale: история продаж

    Особенности:
        - Автоматически закрывает соединение с базой данных используя try-finally
        - Выводит результаты в читаемом формате с эмодзи для наглядности
        - Не обрабатывает ошибки явно - предполагается что база данных существует
          и доступна для чтения

    Example:
        >>> check_database()

        🔍 Проверка загруженных данных:
           PartnerType: 3 записей
           Partner: 15 записей
           ProductType: 5 записей
           Product: 25 записей
           Sale: 150 записей

    Note:
        Для работы функции требуется существование файла 'partners.db' и всех
        указанных таблиц в базе данных. В случае отсутствия таблиц может
        возникнуть исключение sqlite3.OperationalError.
    """
###7 def load_data_from_files():
    """Загружает данные из Excel файлов в базу данных SQLite

    Функция выполняет полную загрузку данных из четырех Excel файлов в соответствующие таблицы базы данных.
    Процесс загрузки состоит из пяти этапов, выполняемых последовательно с проверкой целостности данных.

    Args:
        None: имена файлов запрашиваются у пользователя через интерактивный ввод

    Returns:
        None: функция выполняет операции с базой данных и выводит результаты в консоль

    Процесс загрузки:
        1. 📊 Типы партнеров - из файла партнеров извлекаются уникальные типы
        2. 👥 Партнеры - загрузка основных данных о партнерах с привязкой к типам
        3. 📦 Типы продукции - загрузка категорий продукции с коэффициентами
        4. 🏷️ Продукты - загрузка данных о продукции с привязкой к типам
        5. 💰 Продажи - загрузка истории продаж с валидацией связей и преобразованием дат

    Требуемые файлы:
        - Файл с партнерами: содержит данные о партнерах и их типах
        - Файл с типами продукции: содержит категории продукции и коэффициенты
        - Файл с продуктами: содержит данные о продукции с привязкой к типам
        - Файл с продажами: содержит историю продаж с ссылками на партнеров и продукты

    Особенности:
        - Использует INSERT OR IGNORE для избежания дублирования записей
        - Выполняет проверку существования связанных записей перед вставкой продаж
        - Преобразует даты в стандартный SQL формат (YYYY-MM-DD)
        - Автоматически рассчитывает цену продажи на основе минимальной партнерской цены
        - В случае ошибки выполняет откат транзакции (rollback)
        - После успешной загрузки вызывает check_database() для отображения статистики

    Обработка ошибок:
        - Отлавливает и выводит подробные сообщения об ошибках
        - Продолжает загрузку при отсутствии некоторых продуктов/партнеров с предупреждениями
        - Подсчитывает и выводит количество успешно загруженных продаж

    Example:
        >>> load_data_from_files()

        📁 Введите имена файлов:
        Файл с партнерами: partners.xlsx
        Файл с типами продукции: product_types.xlsx
        Файл с продуктами: products.xlsx
        Файл с продажами: sales.xlsx

        1. 📊 Загрузка типов партнеров...
        2. 👥 Загрузка партнеров...
        3. 📦 Загрузка типов продукции...
        4. 🏷️ Загрузка продуктов...
        5. 💰 Загрузка продаж...
        ✅ Данные успешно загружены! Загружено 150 продаж

    Note:
        Для работы функции требуются файлы в формате Excel (.xlsx) с определенной структурой колонок,
        соответствующих ожидаемым названиям в коде.
    """
###8 def display_menu():
    """Главное меню программы для управления базой данных партнеров и продаж

    Функция предоставляет интерактивный интерфейс для работы с системой управления партнерами.
    Реализует основной цикл программы с возможностью выбора различных операций.

    Args:
        None: все параметры задаются внутри функции или запрашиваются у пользователя

    Returns:
        None: функция выполняется до выбора опции выхода

    Основные функции меню:
        1. КАРТОЧКИ ПАРТНЕРОВ (сортировка по рейтингу) - отображение партнеров, отсортированных по рейтингу
        2. КАРТОЧКИ ПАРТНЕРОВ (сортировка по скидкам) - отображение партнеров, отсортированных по уровню скидки
        3. ИСТОРИЯ РЕАЛИЗАЦИИ - просмотр последних 50 записей о продажах
        4. ЗАПОЛНЕНИЕ БД из файлов - полная переинициализация базы данных с загрузкой из Excel файлов
        5. ВЫХОД - завершение работы программы

    Особенности работы:
        - Использует simple_choice() для интерактивного выбора опций
        - Бесконечный цикл до выбора опции выхода
        - При выборе загрузки данных удаляет существующую базу и создает новую
        - Автоматически создает необходимые таблицы при инициализации базы
        - Обеспечивает единообразное форматирование вывода для всех опций

    Flow программы:
        while True:
            Показать меню опций
            Получить выбор пользователя
            Выполнить соответствующую функцию
            Если выбран ВЫХОД - прервать цикл

    Example:
        ==================================================
        ВЫБЕРИТЕ ОПЦИЮ:
        ==================================================
        1. КАРТОЧКИ ПАРТНЕРОВ (сортировка по рейтингу)
        2. КАРТОЧКИ ПАРТНЕРОВ (сортировка по скидкам)
        3. ИСТОРИЯ РЕАЛИЗАЦИИ
        4. ЗАПОЛНЕНИЕ БД из файлов
        5. ВЫХОД

        Введите номер (1-5): 1

        🎯 КАРТОЧКИ ПАРТНЕРОВ (сортировка по рейтингу)
        ══════════════════════════════════════════════════════════════════════
        [вывод карточек партнеров...]

    Dependencies:
        - simple_choice(): для выбора опций меню
        - get_partners(): для получения данных партнеров
        - print_partner_cards(): для форматированного вывода партнеров
        - get_sales_history(): для получения истории продаж
        - print_sales_cards(): для форматированного вывода продаж
        - create_tables(): для создания структуры базы данных
        - load_data_from_files(): для загрузки данных из файлов
    """