279 lines
15 KiB
Plaintext
279 lines
15 KiB
Plaintext
Файл с партнерами: 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:
|
||
- При выборе загрузки данных существующая БД удаляется и создается заново
|
||
- Использует циклическое меню до выбора опции выхода
|
||
- Каждая опция сопровождается визуальным разделителем для лучшей читаемости
|
||
"""
|
||
|
||
|