This commit is contained in:
user_3d 2025-10-23 14:45:22 +05:00
parent d229c2be8e
commit 6e9d750f60
4 changed files with 570 additions and 52 deletions

View file

@ -3,7 +3,7 @@
<component name="Black">
<option name="sdkName" value="Python 3.11" />
</component>
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.11" project-jdk-type="Python SDK" />
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.11 (rim_project) (2)" project-jdk-type="Python SDK" />
<component name="PyCharmProfessionalAdvertiser">
<option name="shown" value="true" />
</component>

View file

@ -2,7 +2,7 @@
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="jdk" jdkName="Python 3.11" jdkType="Python SDK" />
<orderEntry type="jdk" jdkName="Python 3.11 (rim_project) (2)" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

618
main.py
View file

@ -2,6 +2,7 @@ import sqlite3
import pandas as pd
import os
import sys
from datetime import datetime, timedelta
def create_tables(db_connection):
@ -92,7 +93,8 @@ def get_partners(db_path='partners.db', sort_by='rating', ascending=False):
p.inn AS "ИНН",
p.rating AS "Рейтинг",
p.created_at AS "Дата создания",
COALESCE(SUM(s.quantity), 0) as total_quantity
COALESCE(SUM(s.quantity), 0) as total_quantity,
COALESCE(SUM(s.quantity * s.sale_price), 0) as total_sales
FROM Partner p
JOIN PartnerType pt ON p.partner_type_id = pt.id
LEFT JOIN Sale s ON p.id = s.partner_id
@ -108,6 +110,8 @@ def get_partners(db_path='partners.db', sort_by='rating', ascending=False):
query += " ORDER BY p.name"
elif sort_by == 'type':
query += " ORDER BY pt.type_name, p.name"
elif sort_by == 'sales':
query += " ORDER BY total_sales"
else:
query += " ORDER BY p.rating"
@ -118,7 +122,6 @@ def get_partners(db_path='partners.db', sort_by='rating', ascending=False):
# Добавляем колонки со скидкой
if not df.empty:
df['Скидка'] = df['total_quantity'].apply(lambda x: calculate_discount(x)[0])
df['Текст_скидки'] = df['total_quantity'].apply(lambda x: calculate_discount(x)[1])
@ -173,6 +176,262 @@ def get_sales_history(db_path='partners.db', limit=50, sort_by='date_desc'):
print(f"❌ Ошибка при получении истории продаж: {e}")
return None
def get_sales_statistics(db_path='partners.db', period='all'):
"""Получает статистику продаж за различные периоды"""
try:
conn = sqlite3.connect(db_path)
# Определяем условия для периода
if period == 'month':
date_condition = "WHERE s.sale_date >= date('now', 'start of month')"
elif period == 'quarter':
date_condition = "WHERE s.sale_date >= date('now', 'start of month', '-2 months')"
elif period == 'year':
date_condition = "WHERE s.sale_date >= date('now', 'start of year')"
else:
date_condition = ""
query = f"""
SELECT
COUNT(*) as total_sales,
SUM(s.quantity) as total_quantity,
SUM(s.quantity * s.sale_price) as total_amount,
AVG(s.quantity) as avg_quantity,
AVG(s.sale_price) as avg_price,
COUNT(DISTINCT s.partner_id) as unique_partners,
COUNT(DISTINCT s.product_id) as unique_products
FROM Sale s
{date_condition}
"""
stats = conn.execute(query).fetchone()
# Статистика по типам продукции
type_query = f"""
SELECT
pt.type_name,
SUM(s.quantity) as quantity,
SUM(s.quantity * s.sale_price) as amount,
COUNT(*) as sales_count
FROM Sale s
JOIN Product pr ON s.product_id = pr.id
JOIN ProductType pt ON pr.product_type_id = pt.id
{date_condition}
GROUP BY pt.type_name
ORDER BY amount DESC
"""
type_stats = conn.execute(type_query).fetchall()
conn.close()
return dict(stats), type_stats
except Exception as e:
print(f"❌ Ошибка при получении статистики: {e}")
return None, None
def export_partners_to_excel(db_path='partners.db', filename='partners_export.xlsx'):
"""Экспортирует данные о партнерах в Excel файл"""
try:
partners_df = get_partners(db_path, sort_by='name', ascending=True)
if partners_df is not None and not partners_df.empty:
# Убираем служебные колонки
export_df = partners_df.drop(['total_quantity', 'Текст_скидки'], axis=1, errors='ignore')
with pd.ExcelWriter(filename, engine='openpyxl') as writer:
export_df.to_excel(writer, sheet_name='Партнеры', index=False)
# Добавляем лист со статистикой
stats_df = pd.DataFrame([{
'Всего партнеров': len(export_df),
'Средний рейтинг': export_df['Рейтинг'].mean(),
'Максимальная скидка': export_df['Скидка'].max(),
'Минимальная скидка': export_df['Скидка'].min()
}])
stats_df.to_excel(writer, sheet_name='Статистика', index=False)
print(f"✅ Данные экспортированы в файл: {filename}")
return True
else:
print("❌ Нет данных для экспорта")
return False
except Exception as e:
print(f"❌ Ошибка при экспорте: {e}")
return False
def export_sales_to_excel(db_path='partners.db', filename='sales_export.xlsx'):
"""Экспортирует историю продаж в Excel файл"""
try:
sales_df = get_sales_history(db_path, limit=1000, sort_by='date_desc')
if sales_df is not None and not sales_df.empty:
with pd.ExcelWriter(filename, engine='openpyxl') as writer:
sales_df.to_excel(writer, sheet_name='История продаж', index=False)
# Сводная таблица по партнерам
pivot_df = sales_df.groupby('Партнер').agg({
'Количество': 'sum',
'Общая сумма': 'sum'
}).reset_index()
pivot_df.to_excel(writer, sheet_name='По партнерам', index=False)
print(f"✅ Данные экспортированы в файл: {filename}")
return True
else:
print("❌ Нет данных для экспорта")
return False
except Exception as e:
print(f"❌ Ошибка при экспорте: {e}")
return False
def export_statistics_to_excel(db_path='partners.db', filename='statistics_export.xlsx'):
"""Экспортирует статистику в Excel файл"""
try:
with pd.ExcelWriter(filename, engine='openpyxl') as writer:
# Статистика за разные периоды
periods = ['all', 'month', 'quarter', 'year']
period_names = ['Весь период', 'Текущий месяц', 'Текущий квартал', 'Текущий год']
all_stats = []
for period, period_name in zip(periods, period_names):
stats, type_stats = get_sales_statistics(db_path, period=period)
if stats:
stats['Период'] = period_name
all_stats.append(stats)
if all_stats:
stats_df = pd.DataFrame(all_stats)
stats_df.to_excel(writer, sheet_name='Статистика', index=False)
print(f"✅ Данные экспортированы в файл: {filename}")
return True
except Exception as e:
print(f"❌ Ошибка при экспорте: {e}")
return False
def search_partners(db_path='partners.db', search_term=''):
"""Поиск партнеров по различным критериям"""
try:
conn = sqlite3.connect(db_path)
query = """
SELECT
pt.type_name AS "Тип партнера",
p.name AS "Наименование партнера",
p.director AS "Директор",
p.email AS "Электронная почта",
p.phone AS "Телефон",
p.legal_address AS "Юридический адрес",
p.inn AS "ИНН",
p.rating AS "Рейтинг",
COALESCE(SUM(s.quantity), 0) as total_quantity
FROM Partner p
JOIN PartnerType pt ON p.partner_type_id = pt.id
LEFT JOIN Sale s ON p.id = s.partner_id
WHERE p.name LIKE ? OR p.director LIKE ? OR p.email LIKE ? OR p.inn LIKE ?
GROUP BY p.id
ORDER BY p.name
"""
search_pattern = f'%{search_term}%'
df = pd.read_sql_query(query, conn, params=(search_pattern, search_pattern, search_pattern, search_pattern))
conn.close()
if not df.empty:
df['Скидка'] = df['total_quantity'].apply(lambda x: calculate_discount(x)[0])
df['Текст_скидки'] = df['total_quantity'].apply(lambda x: calculate_discount(x)[1])
return df
except Exception as e:
print(f"❌ Ошибка при поиске: {e}")
return None
def get_top_products(db_path='partners.db', limit=10):
"""Получает топ продуктов по продажам"""
try:
conn = sqlite3.connect(db_path)
query = """
SELECT
pr.product_name AS "Продукция",
pr.article AS "Артикул",
pt.type_name AS "Тип продукции",
SUM(s.quantity) AS "Общее количество",
SUM(s.quantity * s.sale_price) AS "Общая сумма",
COUNT(*) AS "Количество продаж",
AVG(s.sale_price) AS "Средняя цена"
FROM Sale s
JOIN Product pr ON s.product_id = pr.id
JOIN ProductType pt ON pr.product_type_id = pt.id
GROUP BY pr.id
ORDER BY "Общее количество" DESC
LIMIT ?
"""
df = pd.read_sql_query(query, conn, params=(limit,))
conn.close()
return df
except Exception as e:
print(f"❌ Ошибка при получении топ продуктов: {e}")
return None
def get_product_type_analysis(db_path='partners.db'):
"""Анализ по типам продукции"""
try:
conn = sqlite3.connect(db_path)
query = """
SELECT
pt.type_name AS "Тип продукции",
COUNT(DISTINCT pr.id) AS "Количество продуктов",
SUM(s.quantity) AS "Общее количество",
SUM(s.quantity * s.sale_price) AS "Общая сумма",
AVG(s.quantity) AS "Среднее количество за продажу",
AVG(s.sale_price) AS "Средняя цена"
FROM ProductType pt
LEFT JOIN Product pr ON pt.id = pr.product_type_id
LEFT JOIN Sale s ON pr.id = s.product_id
GROUP BY pt.id
ORDER BY "Общая сумма" DESC
"""
df = pd.read_sql_query(query, conn)
conn.close()
return df
except Exception as e:
print(f"❌ Ошибка при анализе типов продукции: {e}")
return None
def get_sales_seasonality(db_path='partners.db'):
"""Анализ сезонности продаж"""
try:
conn = sqlite3.connect(db_path)
query = """
SELECT
strftime('%Y', s.sale_date) AS "Год",
strftime('%m', s.sale_date) AS "Месяц",
SUM(s.quantity) AS "Количество",
SUM(s.quantity * s.sale_price) AS "Сумма",
COUNT(*) AS "Продаж"
FROM Sale s
GROUP BY "Год", "Месяц"
ORDER BY "Год", "Месяц"
"""
df = pd.read_sql_query(query, conn)
conn.close()
return df
except Exception as e:
print(f"❌ Ошибка при анализе сезонности: {e}")
return None
def print_partner_cards(partners_df):
"""Выводит карточки партнеров в красивом формате"""
if partners_df is None or partners_df.empty:
@ -242,7 +501,8 @@ def print_sales_cards(sales_df):
price = f"{row['Цена за единицу']:,.2f}"
total = f"{row['Общая сумма']:,.2f}"
print(f"║ {date} ║ {partner.ljust(16)} ║ {product.ljust(57)} ║ {article.ljust(8)} ║ {quantity.ljust(8)} ║ {price.ljust(10)} ║ {total.ljust(18)} ║")
print(
f"║ {date} ║ {partner.ljust(16)} ║ {product.ljust(57)} ║ {article.ljust(8)} ║ {quantity.ljust(8)} ║ {price.ljust(10)} ║ {total.ljust(18)} ║")
print("╚" + "═" * 147 + "╝")
@ -250,6 +510,120 @@ def print_sales_cards(sales_df):
total_quantity = sales_df['Количество'].sum()
total_amount = sales_df['Общая сумма'].sum()
print(f"📊 ИТОГО: {len(sales_df)} продаж, {total_quantity:,} единиц, общая сумма: {total_amount:,.2f} руб.")
def print_statistics(stats, type_stats):
"""Выводит статистику продаж"""
if not stats:
print("📭 Нет данных для статистики")
return
print("╔" + "═" * 50 + "╗")
print(f"║ {'СТАТИСТИКА ПРОДАЖ':^48} ║")
print("╠" + "═" * 50 + "╣")
print(f"║ {'Всего продаж:':<30} {stats['total_sales']:>18} ║")
print(f"║ {'Общее количество:':<30} {stats['total_quantity']:>18,} ║")
print(f"║ {'Общая сумма:':<30} {stats['total_amount']:>18,.2f} ║")
print(f"║ {'Среднее количество:':<30} {stats['avg_quantity']:>18.1f} ║")
print(f"║ {'Средняя цена:':<30} {stats['avg_price']:>18.2f} ║")
print(f"║ {'Уникальных партнеров:':<30} {stats['unique_partners']:>18} ║")
print(f"║ {'Уникальных продуктов:':<30} {stats['unique_products']:>18} ║")
print("╚" + "═" * 50 + "╝")
if type_stats:
print(f"\n📊 СТАТИСТИКА ПО ТИПАМ ПРОДУКЦИИ:")
print("╔" + "═" * 60 + "╗")
print(f"║ {'Тип продукции':<25} {'Количество':>12} {'Сумма':>15} {'Продаж':>8} ║")
print("╠" + "═" * 60 + "╣")
for row in type_stats:
print(f"║ {row['type_name']:<25} {row['quantity']:>12,} {row['amount']:>15,.2f} {row['sales_count']:>8} ║")
print("╚" + "═" * 60 + "╝")
def print_top_products(top_products):
"""Выводит топ продуктов"""
if top_products is None or top_products.empty:
print("📭 Нет данных о продуктах")
return
print("╔" + "═" * 120 + "╗")
print(f"║ {'ТОП ПРОДУКТОВ ПО ПРОДАЖАМ':^118} ║")
print("╠" + "═" * 120 + "╣")
headers = ["Продукция", "Тип", "Количество", "Сумма", "Продаж", "Ср. цена"]
print(f"║ {headers[0]:<40} {headers[1]:<15} {headers[2]:>12} {headers[3]:>15} {headers[4]:>8} {headers[5]:>10} ║")
print("╠" + "═" * 120 + "╣")
for index, row in top_products.iterrows():
product = row['Продукция'][:38] + "..." if len(row['Продукция']) > 38 else row['Продукция']
product_type = row['Тип продукции']
quantity = f"{row['Общее количество']:,}"
amount = f"{row['Общая сумма']:,.2f}"
sales_count = f"{row['Количество продаж']}"
avg_price = f"{row['Средняя цена']:,.2f}"
print(f"║ {product:<40} {product_type:<15} {quantity:>12} {amount:>15} {sales_count:>8} {avg_price:>10} ║")
print("╚" + "═" * 120 + "╝")
def print_product_type_analysis(type_analysis):
"""Выводит анализ по типам продукции"""
if type_analysis is None or type_analysis.empty:
print("📭 Нет данных для анализа")
return
print("╔" + "═" * 90 + "╗")
print(f"║ {'АНАЛИЗ ПО ТИПАМ ПРОДУКЦИИ':^88} ║")
print("╠" + "═" * 90 + "╣")
headers = ["Тип продукции", "Продуктов", "Количество", "Сумма", "Ср.кол-во", "Ср.цена"]
print(f"║ {headers[0]:<20} {headers[1]:>10} {headers[2]:>12} {headers[3]:>15} {headers[4]:>10} {headers[5]:>10} ║")
print("╠" + "═" * 90 + "╣")
for index, row in type_analysis.iterrows():
product_type = str(row['Тип продукции'])[:18] + ".." if len(str(row['Тип продукции'])) > 18 else str(
row['Тип продукции'])
products_count = f"{int(row['Количество продуктов'])}"
quantity = f"{int(row['Общее количество']):,}" if pd.notna(row['Общее количество']) else "0"
amount = f"{float(row['Общая сумма']):,.2f}" if pd.notna(row['Общая сумма']) else "0.00"
avg_quantity = f"{float(row['Среднее количество за продажу']):.1f}" if pd.notna(
row['Среднее количество за продажу']) else "0.0"
avg_price = f"{float(row['Средняя цена']):,.2f}" if pd.notna(row['Средняя цена']) else "0.00"
print(
f"║ {product_type:<20} {products_count:>10} {quantity:>12} {amount:>15} {avg_quantity:>10} {avg_price:>10} ║")
print("╚" + "═" * 90 + "╝")
def print_sales_seasonality(seasonality):
"""Выводит анализ сезонности"""
if seasonality is None or seasonality.empty:
print("📭 Нет данных для анализа сезонности")
return
print("╔" + "═" * 60 + "╗")
print(f"║ {'СЕЗОННОСТЬ ПРОДАЖ':^58} ║")
print("╠" + "═" * 60 + "╣")
headers = ["Год", "Месяц", "Количество", "Сумма", "Продаж"]
print(f"║ {headers[0]:<6} {headers[1]:<6} {headers[2]:>12} {headers[3]:>15} {headers[4]:>8} ║")
print("╠" + "═" * 60 + "╣")
for index, row in seasonality.iterrows():
year = row['Год']
month = row['Месяц']
quantity = f"{row['Количество']:,}"
amount = f"{row['Сумма']:,.2f}"
sales_count = f"{row['Продаж']}"
print(f"║ {year:<6} {month:<6} {quantity:>12} {amount:>15} {sales_count:>8} ║")
print("╚" + "═" * 60 + "╝")
def simple_choice(options):
"""Упрощенная функция выбора"""
print("\n" + "=" * 50)
@ -294,12 +668,17 @@ def load_data_from_files():
cursor = conn.cursor()
try:
# Запрос имен файлов
print("\n📁 Введите имена файлов:")
partners_file = input("Файл с партнерами: ")
product_type_file = input("Файл с типами продукции: ")
products_file = input("Файл с продуктами: ")
sales_file = input("Файл с продажами: ")
# Используем файлы по умолчанию
partners_file = 'Partners_import.xlsx'
product_type_file = 'Product_type_import.xlsx'
products_file = 'Products_import.xlsx'
sales_file = 'Partner_products_import.xlsx'
print(f"📁 Используемые файлы:")
print(f" Партнеры: {partners_file}")
print(f" Типы продукции: {product_type_file}")
print(f" Продукты: {products_file}")
print(f" Продажи: {sales_file}")
# 1. Загрузка типов партнеров
print("\n1. 📊 Загрузка типов партнеров...")
@ -400,56 +779,195 @@ def load_data_from_files():
conn.close()
def display_menu():
"""Главное меню программы"""
menu_options = [
'КАРТОЧКИ ПАРТНЕРОВ (сортировка по рейтингу)',
'КАРТОЧКИ ПАРТНЕРОВ (сортировка по скидкам)',
'ИСТОРИЯ РЕАЛИЗАЦИИ',
'ЗАПОЛНЕНИЕ БД из файлов',
'ВЫХОД'
]
"""Главное меню программы"""
menu_options = [
'КАРТОЧКИ ПАРТНЕРОВ (сортировка по рейтингу)',
'КАРТОЧКИ ПАРТНЕРОВ (сортировка по скидкам)',
'ИСТОРИЯ РЕАЛИЗАЦИИ',
'СТАТИСТИКА ПРОДАЖ',
'ПОИСК ПАРТНЕРОВ',
'ЭКСПОРТ ДАННЫХ В EXCEL',
'АНАЛИЗ ПРОДУКЦИИ',
'ЗАПОЛНЕНИЕ БД из файлов',
'ВЫХОД'
]
while True:
choice = simple_choice(menu_options)
while True:
choice = simple_choice(menu_options)
if choice == 'КАРТОЧКИ ПАРТНЕРОВ (сортировка по рейтингу)':
print("\n🎯 КАРТОЧКИ ПАРТНЕРОВ (сортировка по рейтингу)")
print("═" * 70)
partners = get_partners(sort_by='rating', ascending=False)
print_partner_cards(partners)
if choice == 'КАРТОЧКИ ПАРТНЕРОВ (сортировка по рейтингу)':
print("\n🎯 КАРТОЧКИ ПАРТНЕРОВ (сортировка по рейтингу)")
print("═" * 70)
partners = get_partners(sort_by='rating', ascending=False)
print_partner_cards(partners)
elif choice == 'КАРТОЧКИ ПАРТНЕРОВ (сортировка по скидкам)':
print("\n📊 КАРТОЧКИ ПАРТНЕРОВ (сортировка по скидкам)")
print("═" * 70)
partners = get_partners(sort_by='discount', ascending=False)
print_partner_cards(partners)
elif choice == 'КАРТОЧКИ ПАРТНЕРОВ (сортировка по скидкам)':
print("\n📊 КАРТОЧКИ ПАРТНЕРОВ (сортировка по скидкам)")
print("═" * 70)
partners = get_partners(sort_by='discount', ascending=False)
print_partner_cards(partners)
elif choice == 'ИСТОРИЯ РЕАЛИЗАЦИИ':
print("\n📈 ИСТОРИЯ РЕАЛИЗАЦИИ ПРОДУКЦИИ")
print("═" * 70)
sales = get_sales_history(limit=50)
print_sales_cards(sales)
elif choice == 'ИСТОРИЯ РЕАЛИЗАЦИИ':
print("\n📈 ИСТОРИЯ РЕАЛИЗАЦИИ ПРОДУКЦИИ")
print("═" * 70)
elif choice == 'ЗАПОЛНЕНИЕ БД из файлов':
if os.path.exists('partners.db'):
os.remove('partners.db')
print("🗑️ База данных partners.db удалена")
else:
print("ℹ️ База данных partners.db не найдена, создаем новую")
# Выбор сортировки для истории продаж
sort_options = [
'По дате (новые сначала)',
'По дате (старые сначала)',
'По количеству (по убыванию)',
'По сумме (по убыванию)'
]
sort_choice = simple_choice(sort_options)
conn = sqlite3.connect('partners.db')
create_tables(conn)
conn.close()
load_data_from_files()
sort_mapping = {
'По дате (новые сначала)': 'date_desc',
'По дате (старые сначала)': 'date_asc',
'По количеству (по убыванию)': 'quantity_desc',
'По сумме (по убыванию)': 'amount_desc'
}
elif choice == 'ВЫХОД':
print("\n👋 До свидания!")
break
sales = get_sales_history(limit=50, sort_by=sort_mapping[sort_choice])
print_sales_cards(sales)
elif choice == 'СТАТИСТИКА ПРОДАЖ':
print("\n📊 СТАТИСТИКА ПРОДАЖ")
print("═" * 70)
period_options = [
'За весь период',
'За текущий месяц',
'За текущий квартал',
'За текущий год'
]
period_choice = simple_choice(period_options)
period_mapping = {
'За весь период': 'all',
'За текущий месяц': 'month',
'За текущий квартал': 'quarter',
'За текущий год': 'year'
}
stats, type_stats = get_sales_statistics(period=period_mapping[period_choice])
print_statistics(stats, type_stats)
elif choice == 'ПОИСК ПАРТНЕРОВ':
print("\n🔍 ПОИСК ПАРТНЕРОВ")
print("═" * 70)
search_term = input("Введите поисковый запрос (название, директор, email или ИНН): ").strip()
if search_term:
partners = search_partners(search_term=search_term)
if partners is not None and not partners.empty:
print(f"\n🎯 Найдено партнеров: {len(partners)}")
print_partner_cards(partners)
else:
print("📭 Партнеры по вашему запросу не найдены")
else:
print("❌ Введите поисковый запрос")
elif choice == 'ЭКСПОРТ ДАННЫХ В EXCEL':
print("\n💾 ЭКСПОРТ ДАННЫХ В EXCEL")
print("═" * 70)
export_options = [
'Экспорт партнеров',
'Экспорт истории продаж',
'Экспорт статистики'
]
export_choice = simple_choice(export_options)
if export_choice == 'Экспорт партнеров':
filename = input("Введите имя файла (по умолчанию: partners_export.xlsx): ").strip()
if not filename:
filename = 'partners_export.xlsx'
success = export_partners_to_excel(filename=filename)
if success:
print(f"✅ Данные успешно экспортированы в {filename}")
else:
print("❌ Ошибка при экспорте данных")
elif export_choice == 'Экспорт истории продаж':
filename = input("Введите имя файла (по умолчанию: sales_export.xlsx): ").strip()
if not filename:
filename = 'sales_export.xlsx'
success = export_sales_to_excel(filename=filename)
if success:
print(f"✅ Данные успешно экспортированы в {filename}")
else:
print("❌ Ошибка при экспорте данных")
elif export_choice == 'Экспорт статистики':
filename = input("Введите имя файла (по умолчанию: statistics_export.xlsx): ").strip()
if not filename:
filename = 'statistics_export.xlsx'
success = export_statistics_to_excel(filename=filename)
if success:
print(f"✅ Данные успешно экспортированы в {filename}")
else:
print("❌ Ошибка при экспорте данных")
elif choice == 'АНАЛИЗ ПРОДУКЦИИ':
print("\n📈 АНАЛИЗ ПРОДУКЦИИ")
print("═" * 70)
analysis_options = [
'Топ продуктов по продажам',
'Анализ по типам продукции',
'Сезонность продаж'
]
analysis_choice = simple_choice(analysis_options)
if analysis_choice == 'Топ продуктов по продажам':
top_products = get_top_products(limit=10)
print_top_products(top_products)
elif analysis_choice == 'Анализ по типам продукции':
type_analysis = get_product_type_analysis()
print_product_type_analysis(type_analysis)
elif analysis_choice == 'Сезонность продаж':
seasonality = get_sales_seasonality()
print_sales_seasonality(seasonality)
elif choice == 'ЗАПОЛНЕНИЕ БД из файлов':
if os.path.exists('partners.db'):
confirm = input("🗑️ База данных partners.db будет удалена. Продолжить? (y/n): ").strip().lower()
if confirm != 'y':
print("❌ Операция отменена")
continue
os.remove('partners.db')
print("🗑️ База данных partners.db удалена")
else:
print("ℹ️ База данных partners.db не найдена, создаем новую")
conn = sqlite3.connect('partners.db')
create_tables(conn)
conn.close()
load_data_from_files()
elif choice == 'ВЫХОД':
print("\n👋 До свидания!")
break
if __name__ == "__main__":
print("🚀 СИСТЕМА УПРАВЛЕНИЯ ПАРТНЕРАМИ И ПРОДАЖАМИ")
print("=" * 50)
# Проверяем существование базы данных
if not os.path.exists('partners.db'):
print("ℹ️ База данных не найдена. Создаем новую...")
conn = sqlite3.connect('partners.db')
create_tables(conn)
conn.close()
print("✅ База данных создана. Для работы необходимо загрузить данные через меню 'ЗАПОЛНЕНИЕ БД из файлов'")
else:
print("✅ База данных найдена")
check_database()
display_menu()
#20102025
#23102025
#sfsffsfsfssf
#hfkjshfks

Binary file not shown.