diff --git a/.idea/misc.xml b/.idea/misc.xml index b2d336e..7fbf52e 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,7 +3,7 @@ - + diff --git a/.idea/rim_project.iml b/.idea/rim_project.iml index 909438d..4c2504f 100644 --- a/.idea/rim_project.iml +++ b/.idea/rim_project.iml @@ -2,7 +2,7 @@ - + \ No newline at end of file diff --git a/main.py b/main.py index f075a5e..e017aca 100644 --- a/main.py +++ b/main.py @@ -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 \ No newline at end of file + +#hfkjshfks \ No newline at end of file diff --git a/partners.db b/partners.db index 2fc2dd3..06b4e3d 100644 Binary files a/partners.db and b/partners.db differ