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"> <component name="Black">
<option name="sdkName" value="Python 3.11" /> <option name="sdkName" value="Python 3.11" />
</component> </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"> <component name="PyCharmProfessionalAdvertiser">
<option name="shown" value="true" /> <option name="shown" value="true" />
</component> </component>

View file

@ -2,7 +2,7 @@
<module type="PYTHON_MODULE" version="4"> <module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager"> <component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" /> <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" /> <orderEntry type="sourceFolder" forTests="false" />
</component> </component>
</module> </module>

618
main.py
View file

@ -2,6 +2,7 @@ import sqlite3
import pandas as pd import pandas as pd
import os import os
import sys import sys
from datetime import datetime, timedelta
def create_tables(db_connection): 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.inn AS "ИНН",
p.rating AS "Рейтинг", p.rating AS "Рейтинг",
p.created_at 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 FROM Partner p
JOIN PartnerType pt ON p.partner_type_id = pt.id JOIN PartnerType pt ON p.partner_type_id = pt.id
LEFT JOIN Sale s ON p.id = s.partner_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" query += " ORDER BY p.name"
elif sort_by == 'type': elif sort_by == 'type':
query += " ORDER BY pt.type_name, p.name" query += " ORDER BY pt.type_name, p.name"
elif sort_by == 'sales':
query += " ORDER BY total_sales"
else: else:
query += " ORDER BY p.rating" 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: 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)[0])
df['Текст_скидки'] = df['total_quantity'].apply(lambda x: calculate_discount(x)[1]) 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}") print(f"❌ Ошибка при получении истории продаж: {e}")
return None 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): def print_partner_cards(partners_df):
"""Выводит карточки партнеров в красивом формате""" """Выводит карточки партнеров в красивом формате"""
if partners_df is None or partners_df.empty: if partners_df is None or partners_df.empty:
@ -242,7 +501,8 @@ def print_sales_cards(sales_df):
price = f"{row['Цена за единицу']:,.2f}" price = f"{row['Цена за единицу']:,.2f}"
total = 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 + "╝") print("╚" + "═" * 147 + "╝")
@ -250,6 +510,120 @@ def print_sales_cards(sales_df):
total_quantity = sales_df['Количество'].sum() total_quantity = sales_df['Количество'].sum()
total_amount = sales_df['Общая сумма'].sum() total_amount = sales_df['Общая сумма'].sum()
print(f"📊 ИТОГО: {len(sales_df)} продаж, {total_quantity:,} единиц, общая сумма: {total_amount:,.2f} руб.") 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): def simple_choice(options):
"""Упрощенная функция выбора""" """Упрощенная функция выбора"""
print("\n" + "=" * 50) print("\n" + "=" * 50)
@ -294,12 +668,17 @@ def load_data_from_files():
cursor = conn.cursor() cursor = conn.cursor()
try: try:
# Запрос имен файлов # Используем файлы по умолчанию
print("\n📁 Введите имена файлов:") partners_file = 'Partners_import.xlsx'
partners_file = input("Файл с партнерами: ") product_type_file = 'Product_type_import.xlsx'
product_type_file = input("Файл с типами продукции: ") products_file = 'Products_import.xlsx'
products_file = input("Файл с продуктами: ") sales_file = 'Partner_products_import.xlsx'
sales_file = input("Файл с продажами: ")
print(f"📁 Используемые файлы:")
print(f" Партнеры: {partners_file}")
print(f" Типы продукции: {product_type_file}")
print(f" Продукты: {products_file}")
print(f" Продажи: {sales_file}")
# 1. Загрузка типов партнеров # 1. Загрузка типов партнеров
print("\n1. 📊 Загрузка типов партнеров...") print("\n1. 📊 Загрузка типов партнеров...")
@ -400,56 +779,195 @@ def load_data_from_files():
conn.close() conn.close()
def display_menu(): def display_menu():
"""Главное меню программы""" """Главное меню программы"""
menu_options = [ menu_options = [
'КАРТОЧКИ ПАРТНЕРОВ (сортировка по рейтингу)', 'КАРТОЧКИ ПАРТНЕРОВ (сортировка по рейтингу)',
'КАРТОЧКИ ПАРТНЕРОВ (сортировка по скидкам)', 'КАРТОЧКИ ПАРТНЕРОВ (сортировка по скидкам)',
'ИСТОРИЯ РЕАЛИЗАЦИИ', 'ИСТОРИЯ РЕАЛИЗАЦИИ',
'ЗАПОЛНЕНИЕ БД из файлов', 'СТАТИСТИКА ПРОДАЖ',
'ВЫХОД' 'ПОИСК ПАРТНЕРОВ',
] 'ЭКСПОРТ ДАННЫХ В EXCEL',
'АНАЛИЗ ПРОДУКЦИИ',
'ЗАПОЛНЕНИЕ БД из файлов',
'ВЫХОД'
]
while True: while True:
choice = simple_choice(menu_options) choice = simple_choice(menu_options)
if choice == 'КАРТОЧКИ ПАРТНЕРОВ (сортировка по рейтингу)': if choice == 'КАРТОЧКИ ПАРТНЕРОВ (сортировка по рейтингу)':
print("\n🎯 КАРТОЧКИ ПАРТНЕРОВ (сортировка по рейтингу)") print("\n🎯 КАРТОЧКИ ПАРТНЕРОВ (сортировка по рейтингу)")
print("═" * 70) print("═" * 70)
partners = get_partners(sort_by='rating', ascending=False) partners = get_partners(sort_by='rating', ascending=False)
print_partner_cards(partners) print_partner_cards(partners)
elif choice == 'КАРТОЧКИ ПАРТНЕРОВ (сортировка по скидкам)': elif choice == 'КАРТОЧКИ ПАРТНЕРОВ (сортировка по скидкам)':
print("\n📊 КАРТОЧКИ ПАРТНЕРОВ (сортировка по скидкам)") print("\n📊 КАРТОЧКИ ПАРТНЕРОВ (сортировка по скидкам)")
print("═" * 70) print("═" * 70)
partners = get_partners(sort_by='discount', ascending=False) partners = get_partners(sort_by='discount', ascending=False)
print_partner_cards(partners) print_partner_cards(partners)
elif choice == 'ИСТОРИЯ РЕАЛИЗАЦИИ': elif choice == 'ИСТОРИЯ РЕАЛИЗАЦИИ':
print("\n📈 ИСТОРИЯ РЕАЛИЗАЦИИ ПРОДУКЦИИ") print("\n📈 ИСТОРИЯ РЕАЛИЗАЦИИ ПРОДУКЦИИ")
print("═" * 70) print("═" * 70)
sales = get_sales_history(limit=50)
print_sales_cards(sales)
elif choice == 'ЗАПОЛНЕНИЕ БД из файлов': # Выбор сортировки для истории продаж
if os.path.exists('partners.db'): sort_options = [
os.remove('partners.db') 'По дате (новые сначала)',
print("🗑️ База данных partners.db удалена") 'По дате (старые сначала)',
else: 'По количеству (по убыванию)',
print("ℹ️ База данных partners.db не найдена, создаем новую") 'По сумме (по убыванию)'
]
sort_choice = simple_choice(sort_options)
conn = sqlite3.connect('partners.db') sort_mapping = {
create_tables(conn) 'По дате (новые сначала)': 'date_desc',
conn.close() 'По дате (старые сначала)': 'date_asc',
load_data_from_files() 'По количеству (по убыванию)': 'quantity_desc',
'По сумме (по убыванию)': 'amount_desc'
}
elif choice == 'ВЫХОД': sales = get_sales_history(limit=50, sort_by=sort_mapping[sort_choice])
print("\n👋 До свидания!") print_sales_cards(sales)
break
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__": 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() display_menu()
#20102025
#23102025 #hfkjshfks
#sfsffsfsfssf

Binary file not shown.