20251106
This commit is contained in:
parent
264a3c4960
commit
caf93819f9
112
main.py
112
main.py
|
|
@ -88,44 +88,7 @@ def calculate_discount(total_quantity):
|
||||||
else:
|
else:
|
||||||
return 0, '0% (до 10000 ед.)'
|
return 0, '0% (до 10000 ед.)'
|
||||||
def get_partners(db_path='partners.db', sort_by='rating', ascending=False):
|
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')
|
|
||||||
"""
|
|
||||||
try:
|
try:
|
||||||
conn = sqlite3.connect(db_path)
|
conn = sqlite3.connect(db_path)
|
||||||
query = """
|
query = """
|
||||||
|
|
@ -176,43 +139,7 @@ def get_partners(db_path='partners.db', sort_by='rating', ascending=False):
|
||||||
print(f"❌ Общая ошибка: {e}")
|
print(f"❌ Общая ошибка: {e}")
|
||||||
return None
|
return None
|
||||||
def get_sales_history(db_path='partners.db', limit=50, sort_by='date_desc'):
|
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)
|
|
||||||
"""
|
|
||||||
try:
|
try:
|
||||||
conn = sqlite3.connect(db_path)
|
conn = sqlite3.connect(db_path)
|
||||||
query = """
|
query = """
|
||||||
|
|
@ -366,45 +293,8 @@ def simple_choice(options):
|
||||||
print("\n👋 Программа прервана пользователем.")
|
print("\n👋 Программа прервана пользователем.")
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
def check_database():
|
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): обрабатывается как некорректный ввод
|
|
||||||
"""
|
|
||||||
conn = sqlite3.connect('partners.db')
|
conn = sqlite3.connect('partners.db')
|
||||||
try:
|
try:
|
||||||
cursor = conn.cursor()
|
cursor = conn.cursor()
|
||||||
|
|
|
||||||
2
read.txt
2
read.txt
|
|
@ -2,7 +2,7 @@
|
||||||
Файл с типами продукции: Product_type_import.xlsx
|
Файл с типами продукции: Product_type_import.xlsx
|
||||||
Файл с продуктами: Products_import.xlsx
|
Файл с продуктами: Products_import.xlsx
|
||||||
Файл с продажами: Partner_products_import.xlsx
|
Файл с продажами: Partner_products_import.xlsx
|
||||||
|
###
|
||||||
###1 def calculate_discount(total_quantity):
|
###1 def calculate_discount(total_quantity):
|
||||||
"""Ра""Рассчитываетссчитывает скидку на основе общего количества проданной продукции
|
"""Ра""Рассчитываетссчитывает скидку на основе общего количества проданной продукции
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue