Файл с партнерами: Partners_import.xlsx Файл с типами продукции: Product_type_import.xlsx Файл с продуктами: Products_import.xlsx Файл с продажами: Partner_products_import.xlsx def calculate_discount(total_quantity): """ Рассчитывает размер скидки на основе общего объема продаж. Скидка определяется по следующим пороговым значениям: - 15% при объеме от 300000 единиц - 10% при объеме от 50000 до 300000 единиц - 5% при объеме от 10000 до 50000 единиц - 0% при объеме менее 10000 единиц Args: total_quantity (int): Общее количество проданных единиц товара Returns: tuple: Кортеж содержащий: - int: Процент скидки (0-15) - str: Текстовое описание скидки с диапазоном """ def get_partners(db_path='partners.db', sort_by='rating', ascending=False): """ Получает список партнеров из базы данных с возможностью сортировки и расчетом скидок. Функция подключается к SQLite базе данных, извлекает информацию о партнерах, рассчитывает скидки на основе общего объема продаж и предоставляет возможность сортировки по различным критериям. Args: db_path (str, optional): Путь к файлу базы данных. По умолчанию 'partners.db' sort_by (str, optional): Поле для сортировки. По умолчанию 'rating'. Допустимые значения: 'rating', 'name', 'type', 'discount' ascending (bool, optional): Направление сортировки. По умолчанию False (убывание). True - возрастание, False - убывание Returns: pandas.DataFrame or None: DataFrame с данными партнеров, включая рассчитанные скидки, или None в случае ошибки Raises: sqlite3.Error: В случае ошибок при работе с базой данных Exception: При других непредвиденных ошибках Example: >>> df = get_partners(sort_by='discount', ascending=True) >>> print(df[['Наименование партнера', 'Рейтинг', 'Скидка']]) """ def get_sales_history(db_path='partners.db', limit=50, sort_by='date_desc'): """ Получает историю продаж из базы данных с возможностью сортировки и ограничения количества записей. Функция извлекает детальную информацию о продажах, включая даты, партнеров, продукцию, количества и суммы. Поддерживает различные варианты сортировки и ограничение количества возвращаемых записей. Args: db_path (str, optional): Путь к файлу базы данных. По умолчанию 'partners.db' limit (int, optional): Максимальное количество возвращаемых записей. По умолчанию 50 sort_by (str, optional): Критерий сортировки результатов. По умолчанию 'date_desc'. Допустимые значения: - 'date_desc': по дате продажи (новые сначала) - 'date_asc': по дате продажи (старые сначала) - 'quantity_desc': по количеству (по убыванию) - 'amount_desc': по общей сумме (по убыванию) Returns: pandas.DataFrame or None: DataFrame с историей продаж, содержащий колонки: - Дата продажи - Партнер - Продукция - Артикул - Количество - Цена за единицу - Общая сумма - Тип продукции или None в случае ошибки Raises: sqlite3.Error: В случае ошибок при работе с базой данных Exception: При других непредвиденных ошибках Example: >>> # Получить последние 100 продаж, отсортированных по сумме >>> sales_df = get_sales_history(limit=100, sort_by='amount_desc') >>> print(sales_df[['Партнер', 'Продукция', 'Общая сумма']].head()) """ def print_partner_cards(partners_df): """ Выводит в консоль красиво оформленные карточки партнеров. Функция принимает DataFrame с данными партнеров и отображает их в виде структурированных карточек с рамкой. Каждая карточка содержит основную информацию о партнере: тип, наименование, директор, рейтинг, объем продаж, размер скидки, контактные данные и юридическую информацию. Args: partners_df (pandas.DataFrame): DataFrame с данными партнеров, должен содержать колонки: - 'Тип партнера' - 'Наименование партнера' - 'Директор' - 'Рейтинг' - 'total_quantity' - 'Текст_скидки' - 'Электронная почта' - 'Телефон' - 'ИНН' - 'Юридический адрес' Returns: None: Функция только выводит данные в консоль Example: >>> partners = get_partners() >>> print_partner_cards(partners) Note: - Если передан пустой DataFrame или None, выводится сообщение об отсутствии данных - Длинные адреса обрезаются до 60 символов с добавлением многоточия - Форматирование чисел: разделители тысяч для объема продаж - Между карточками добавляются пустые строки для лучшей читаемости """ def print_sales_cards(sales_df): """ Выводит в консоль таблицу с историей продаж в структурированном формате. Функция принимает DataFrame с данными о продажах и отображает их в виде таблицы с рамкой. Включает заголовки, детальную информацию по каждой продаже и итоговую статистику в нижней части. Args: sales_df (pandas.DataFrame): DataFrame с данными о продажах, должен содержать колонки: - 'Дата продажи' - 'Партнер' - 'Продукция' - 'Артикул' - 'Количество' - 'Цена за единицу' - 'Общая сумма' Returns: None: Функция только выводит данные в консоль Example: >>> sales = get_sales_history(limit=10) >>> print_sales_cards(sales) Note: - Если передан пустой DataFrame или None, выводится сообщение об отсутствии данных - Дата обрезается до 10 символов (формат ГГГГ-ММ-ДД) - Числовые значения форматируются с разделителями тысяч и двумя знаками после запятой - В конце выводится сводная статистика по всем отображенным продажам - Ширина таблицы фиксирована для обеспечения читаемости """ def simple_choice(options): """ Предоставляет пользователю интерактивный выбор из списка опций. Функция отображает пронумерованный список доступных опций и запрашивает у пользователя ввод номера выбранной опции. Обрабатывает различные сценарии некорректного ввода и обеспечивает надежный выбор. Args: options (list): Список строк с доступными опциями для выбора Returns: str: Выбранная опция из переданного списка Raises: SystemExit: При прерывании программы пользователем (Ctrl+C) Example: >>> menu_options = ["Показать партнеров", "История продаж", "Выход"] >>> choice = simple_choice(menu_options) >>> print(f"Выбрано: {choice}") Note: - Опции нумеруются начиная с 1 - Функция обрабатывает нечисловой ввод и числа вне диапазона - Поддерживает обработку прерывания программы (KeyboardInterrupt) - Цикл продолжается до получения корректного ввода """ def check_database(): """ Функция подключается к базе данных и выводит количество записей в каждой из основных таблиц для проверки корректности загрузки данных. Таблицы для проверки: - PartnerType: типы партнеров - Partner: информация о партнерах - ProductType: типы продуктов - Product: информация о продуктах - Sale: данные о продажах """ def load_data_from_files(): """ Загружает данные из Excel-файлов в базу данных SQLite. Функция выполняет пошаговую загрузку данных из четырех Excel-файлов: - Файл с партнерами - Файл с типами продукции - Файл с продуктами - Файл с продажами Процесс загрузки включает: 1. Загрузку типов партнеров 2. Загрузку данных партнеров 3. Загрузку типов продукции с коэффициентами 4. Загрузку информации о продуктах 5. Загрузку истории продаж с валидацией связей Returns: None: Функция выполняет операции с базой данных и выводит результаты в консоль Raises: Exception: При ошибках чтения файлов или операций с базой данных Example: >>> load_data_from_files() 📁 Введите имена файлов: Файл с партнерами: partners.xlsx Файл с типами продукции: product_types.xlsx Файл с продуктами: products.xlsx Файл с продажами: sales.xlsx Note: - Использует INSERT OR IGNORE для избежания дубликатов - Проверяет существование связей перед вставкой продаж - Выводит прогресс загрузки и информационные сообщения - В случае ошибки выполняет откат транзакции - В конце вызывает проверку целостности данных """ def display_menu(): """ Главное меню приложения для управления партнерами и продажами. Функция предоставляет интерактивный интерфейс для работы с системой: - Просмотр карточек партнеров с различной сортировкой - Просмотр истории продаж - Загрузка данных из файлов - Выход из приложения Returns: None: Функция управляет основным потоком выполнения приложения Example: >>> display_menu() ================================================== ВЫБЕРИТЕ ОПЦИЮ: ================================================== 1. КАРТОЧКИ ПАРТНЕРОВ (сортировка по рейтингу) 2. КАРТОЧКИ ПАРТНЕРОВ (сортировка по скидкам) 3. ИСТОРИЯ РЕАЛИЗАЦИИ 4. ЗАПОЛНЕНИЕ БД из файлов 5. ВЫХОД Note: - При выборе загрузки данных существующая БД удаляется и создается заново - Использует циклическое меню до выбора опции выхода - Каждая опция сопровождается визуальным разделителем для лучшей читаемости """