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