diff --git a/.idea/misc.xml b/.idea/misc.xml
index 99d4a7e..201c7bd 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -3,5 +3,5 @@
-
+
\ No newline at end of file
diff --git a/.idea/mmmm.iml b/.idea/mmmm.iml
index 351d51a..d7cf3a2 100644
--- a/.idea/mmmm.iml
+++ b/.idea/mmmm.iml
@@ -2,7 +2,7 @@
-
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
index 35eb1dd..8306744 100644
--- a/.idea/vcs.xml
+++ b/.idea/vcs.xml
@@ -2,5 +2,6 @@
+
\ No newline at end of file
diff --git a/main.py b/main.py
index 4b6c465..27b3942 100644
--- a/main.py
+++ b/main.py
@@ -2,71 +2,72 @@ import sqlite3
import pandas as pd
import os
import sys
-
-
+import openpyxl
+"potapov andrey"
def create_tables(db_connection):
- """Создает все необходимые таблицы в базе данных"""
+ # Функция создает структуру таблиц в базе данных
cursor = db_connection.cursor()
+ # Создание таблиц и индексов
cursor.executescript('''
- CREATE TABLE IF NOT EXISTS PartnerType (
- id INTEGER PRIMARY KEY AUTOINCREMENT,
- type_name VARCHAR(100) NOT NULL UNIQUE
- );
+ CREATE TABLE IF NOT EXISTS PartnerType (
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
+ type_name VARCHAR(100) NOT NULL UNIQUE
+ );
- CREATE TABLE IF NOT EXISTS Partner (
- id INTEGER PRIMARY KEY AUTOINCREMENT,
- partner_type_id INTEGER REFERENCES PartnerType(id),
- name VARCHAR(255) NOT NULL,
- director VARCHAR(255),
- email VARCHAR(255),
- phone VARCHAR(50),
- legal_address TEXT,
- inn VARCHAR(20) UNIQUE,
- rating DECIMAL(3,2) DEFAULT 0.0,
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
- );
+ CREATE TABLE IF NOT EXISTS Partner (
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
+ partner_type_id INTEGER REFERENCES PartnerType(id),
+ name VARCHAR(255) NOT NULL,
+ director VARCHAR(255),
+ email VARCHAR(255),
+ phone VARCHAR(50),
+ legal_address TEXT,
+ inn VARCHAR(20) UNIQUE,
+ rating DECIMAL(3,2) DEFAULT 0.0,
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
+ );
- CREATE TABLE IF NOT EXISTS ProductType (
- id INTEGER PRIMARY KEY AUTOINCREMENT,
- type_name VARCHAR(100) NOT NULL UNIQUE,
- coefficient DECIMAL(5,2) NOT NULL DEFAULT 1.0
- );
+ CREATE TABLE IF NOT EXISTS ProductType (
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
+ type_name VARCHAR(100) NOT NULL UNIQUE,
+ coefficient DECIMAL(5,2) NOT NULL DEFAULT 1.0
+ );
- CREATE TABLE IF NOT EXISTS Product (
- id INTEGER PRIMARY KEY AUTOINCREMENT,
- product_type_id INTEGER REFERENCES ProductType(id),
- product_name VARCHAR(255) NOT NULL,
- article VARCHAR(100) UNIQUE NOT NULL,
- min_partner_price DECIMAL(15,2) NOT NULL,
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
- );
+ CREATE TABLE IF NOT EXISTS Product (
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
+ product_type_id INTEGER REFERENCES ProductType(id),
+ product_name VARCHAR(255) NOT NULL,
+ article VARCHAR(100) UNIQUE NOT NULL,
+ min_partner_price DECIMAL(15,2) NOT NULL,
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
+ );
- CREATE TABLE IF NOT EXISTS Sale (
- id INTEGER PRIMARY KEY AUTOINCREMENT,
- product_id INTEGER REFERENCES Product(id),
- partner_id INTEGER REFERENCES Partner(id),
- quantity INTEGER NOT NULL CHECK (quantity > 0),
- sale_date DATE NOT NULL,
- sale_price DECIMAL(15,2) NOT NULL,
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
- );
-
- CREATE INDEX IF NOT EXISTS idx_partner_type ON Partner(partner_type_id);
- CREATE INDEX IF NOT EXISTS idx_partner_inn ON Partner(inn);
- CREATE INDEX IF NOT EXISTS idx_product_type ON Product(product_type_id);
- CREATE INDEX IF NOT EXISTS idx_product_article ON Product(article);
- CREATE INDEX IF NOT EXISTS idx_sale_product ON Sale(product_id);
- CREATE INDEX IF NOT EXISTS idx_sale_partner ON Sale(partner_id);
- CREATE INDEX IF NOT EXISTS idx_sale_date ON Sale(sale_date);
- ''')
+ CREATE TABLE IF NOT EXISTS Sale (
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
+ product_id INTEGER REFERENCES Product(id),
+ partner_id INTEGER REFERENCES Partner(id),
+ quantity INTEGER NOT NULL CHECK (quantity > 0),
+ sale_date DATE NOT NULL,
+ sale_price DECIMAL(15,2) NOT NULL,
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
+ );
+ CREATE INDEX IF NOT EXISTS idx_partner_type ON Partner(partner_type_id);
+ CREATE INDEX IF NOT EXISTS idx_partner_inn ON Partner(inn);
+ CREATE INDEX IF NOT EXISTS idx_product_type ON Product(product_type_id);
+ CREATE INDEX IF NOT EXISTS idx_product_article ON Product(article);
+ CREATE INDEX IF NOT EXISTS idx_sale_product ON Sale(product_id);
+ CREATE INDEX IF NOT EXISTS idx_sale_partner ON Sale(partner_id);
+ CREATE INDEX IF NOT EXISTS idx_sale_date ON Sale(sale_date);
+ ''')
+ # Создание таблиц и индексов
db_connection.commit()
print("✅ Таблицы успешно созданы")
def calculate_discount(total_quantity):
- """Рассчитывает скидку на основе общего количества проданной продукции"""
+ # Функция рассчитывает скидку на основе объема продаж
if total_quantity >= 300000:
return 15, '15% (более 300000 ед.)'
elif total_quantity >= 50000:
@@ -78,28 +79,29 @@ def calculate_discount(total_quantity):
def get_partners(db_path='partners.db', sort_by='rating', ascending=False):
- """Получает данные о партнерах с возможностью сортировки"""
+ # Функция получает данные о партнерах из базы данных
try:
conn = sqlite3.connect(db_path)
+ # Здесь прописан SQL-запрос для выборки данных о партнерах
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 "Рейтинг",
- p.created_at 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
- GROUP BY p.id
- """
+ 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 "Рейтинг",
+ p.created_at 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
+ GROUP BY p.id
+ """
- # Добавляем сортировку
+ # Применяем нужную сортировку и лимитируем количество записей
if sort_by == 'discount':
query += " ORDER BY total_quantity"
elif sort_by == 'rating':
@@ -132,26 +134,27 @@ def get_partners(db_path='partners.db', sort_by='rating', ascending=False):
def get_sales_history(db_path='partners.db', limit=50, sort_by='date_desc'):
- """Получает историю реализации продукции с разными вариантами сортировки"""
+ # Функция получает историю продаж
try:
conn = sqlite3.connect(db_path)
+ # Здесь прописан SQL-запрос для выборки истории продаж
query = """
- SELECT
- s.sale_date AS "Дата продажи",
- p.name AS "Партнер",
- pr.product_name AS "Продукция",
- pr.article AS "Артикул",
- s.quantity AS "Количество",
- s.sale_price AS "Цена за единицу",
- (s.quantity * s.sale_price) AS "Общая сумма",
- pt.type_name AS "Тип продукции"
- FROM Sale s
- JOIN Partner p ON s.partner_id = p.id
- JOIN Product pr ON s.product_id = pr.id
- JOIN ProductType pt ON pr.product_type_id = pt.id
- """
+ SELECT
+ s.sale_date AS "Дата продажи",
+ p.name AS "Партнер",
+ pr.product_name AS "Продукция",
+ pr.article AS "Артикул",
+ s.quantity AS "Количество",
+ s.sale_price AS "Цена за единицу",
+ (s.quantity * s.sale_price) AS "Общая сумма",
+ pt.type_name AS "Тип продукции"
+ FROM Sale s
+ JOIN Partner p ON s.partner_id = p.id
+ JOIN Product pr ON s.product_id = pr.id
+ JOIN ProductType pt ON pr.product_type_id = pt.id
+ """
- # Добавляем сортировку по дате
+ # Применяем сортировку и ограничение числа записей
if sort_by == 'date_desc':
query += " ORDER BY s.sale_date DESC, s.created_at DESC"
elif sort_by == 'date_asc':
@@ -172,12 +175,13 @@ def get_sales_history(db_path='partners.db', limit=50, sort_by='date_desc'):
print(f"❌ Ошибка при получении истории продаж: {e}")
return None
+
def print_partner_cards(partners_df):
- """Выводит карточки партнеров в красивом формате"""
+ # Функция выводит информацию о партнерах в красивой форме
if partners_df is None or partners_df.empty:
print("📭 Нет данных о партнерах")
return
-
+ # Красивый вывод карточек партнеров
for index, row in partners_df.iterrows():
print("╔" + "═" * 69 + "╗")
print(f"║ {'КАРТОЧКА ПАРТНЕРА':^67} ║")
@@ -198,6 +202,7 @@ def print_partner_cards(partners_df):
address = address[:57] + "..."
address_text = f"Адрес: {address}"
+ # Информация о партнере
print(f"║ {type_text:<67} ║")
print(f"║ {name_text:<67} ║")
print(f"║ {director_text:<67} ║")
@@ -215,11 +220,11 @@ def print_partner_cards(partners_df):
def print_sales_cards(sales_df):
- """Выводит карточки истории реализации в виде таблицы"""
+ # Функция выводит историю продаж в табличном представлении
if sales_df is None or sales_df.empty:
print("📭 Нет данных о продажах")
return
-
+ # Рамка таблицы
print("╔" + "═" * 147 + "╗")
print(f"║ {'ИСТОРИЯ РЕАЛИЗАЦИИ ПРОДУКЦИИ':^145} ║")
print("╠" + "═" * 147 + "╣")
@@ -231,7 +236,7 @@ def print_sales_cards(sales_df):
))
print("╠" + "═" * 147 + "╣")
- # Данные таблицы
+ # Вывод данных о продажах
for index, row in sales_df.iterrows():
date = str(row['Дата продажи'])[:10]
partner = row['Партнер']
@@ -241,16 +246,20 @@ 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 + "╝")
+ # Закрывающая рамка таблицы
# Итоги
total_quantity = sales_df['Количество'].sum()
total_amount = sales_df['Общая сумма'].sum()
print(f"📊 ИТОГО: {len(sales_df)} продаж, {total_quantity:,} единиц, общая сумма: {total_amount:,.2f} руб.")
+
+
def simple_choice(options):
- """Упрощенная функция выбора"""
+ # Простая функция выбора пункта меню
print("\n" + "=" * 50)
print("ВЫБЕРИТЕ ОПЦИЮ:")
print("=" * 50)
@@ -273,7 +282,7 @@ def simple_choice(options):
def check_database():
- """Проверяет загруженные данные в базе"""
+ # Проверяет наличие данных в базе
conn = sqlite3.connect('partners.db')
try:
cursor = conn.cursor()
@@ -288,7 +297,7 @@ def check_database():
def load_data_from_files():
- """Загружает данные из Excel файлов в базу данных"""
+ # Загружает данные из Excel-файлов в базу данных
conn = sqlite3.connect('partners.db')
cursor = conn.cursor()
@@ -314,8 +323,8 @@ def load_data_from_files():
partner_type_id = cursor.fetchone()[0]
cursor.execute("""INSERT OR IGNORE INTO Partner
- (partner_type_id, name, director, email, phone, legal_address, inn, rating)
- VALUES (?, ?, ?, ?, ?, ?, ?, ?)""",
+ (partner_type_id, name, director, email, phone, legal_address, inn, rating)
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)""",
(partner_type_id, row['Наименование партнера'], row['Директор'],
row['Электронная почта партнера'], row['Телефон партнера'],
row['Юридический адрес партнера'], row['ИНН'], row['Рейтинг'])
@@ -337,8 +346,8 @@ def load_data_from_files():
product_type_id = cursor.fetchone()[0]
cursor.execute("""INSERT OR IGNORE INTO Product
- (product_type_id, product_name, article, min_partner_price)
- VALUES (?, ?, ?, ?)""",
+ (product_type_id, product_name, article, min_partner_price)
+ VALUES (?, ?, ?, ?)""",
(product_type_id, row['Наименование продукции'],
row['Артикул'], row['Минимальная стоимость для партнера'])
)
@@ -375,8 +384,8 @@ def load_data_from_files():
# Вставляем продажу
cursor.execute("""INSERT INTO Sale
- (product_id, partner_id, quantity, sale_date, sale_price)
- VALUES (?, ?, ?, ?, ?)""",
+ (product_id, partner_id, quantity, sale_date, sale_price)
+ VALUES (?, ?, ?, ?, ?)""",
(product_id, partner_id, row['Количество продукции'], sale_date, sale_price)
)
loaded_sales += 1
@@ -393,7 +402,7 @@ def load_data_from_files():
def display_menu():
- """Главное меню программы"""
+ # Основное меню программы
menu_options = [
'КАРТОЧКИ ПАРТНЕРОВ (сортировка по рейтингу)',
'КАРТОЧКИ ПАРТНЕРОВ (сортировка по скидкам)',
@@ -440,5 +449,7 @@ def display_menu():
break
+# Главная точка запуска программы
if __name__ == "__main__":
- display_menu()
\ No newline at end of file
+ display_menu()
+
diff --git a/partners.db b/partners.db
index 234f129..0f6e882 100644
Binary files a/partners.db and b/partners.db differ
diff --git a/venv/bin/activate b/venv/bin/activate
index 75e6e71..dec0451 100644
--- a/venv/bin/activate
+++ b/venv/bin/activate
@@ -35,7 +35,7 @@ deactivate () {
# unset irrelevant variables
deactivate nondestructive
-VIRTUAL_ENV=/home/user_3d/PycharmProjects/mmmm/venv
+VIRTUAL_ENV=/home/user_3d/mmmm/venv
export VIRTUAL_ENV
_OLD_VIRTUAL_PATH="$PATH"
diff --git a/venv/bin/activate.csh b/venv/bin/activate.csh
index f074464..87fc072 100644
--- a/venv/bin/activate.csh
+++ b/venv/bin/activate.csh
@@ -8,7 +8,7 @@ alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PA
# Unset irrelevant variables.
deactivate nondestructive
-setenv VIRTUAL_ENV /home/user_3d/PycharmProjects/mmmm/venv
+setenv VIRTUAL_ENV /home/user_3d/mmmm/venv
set _OLD_VIRTUAL_PATH="$PATH"
setenv PATH "$VIRTUAL_ENV/"bin":$PATH"
diff --git a/venv/bin/activate.fish b/venv/bin/activate.fish
index cdc6679..ea55ca0 100644
--- a/venv/bin/activate.fish
+++ b/venv/bin/activate.fish
@@ -33,7 +33,7 @@ end
# Unset irrelevant variables.
deactivate nondestructive
-set -gx VIRTUAL_ENV /home/user_3d/PycharmProjects/mmmm/venv
+set -gx VIRTUAL_ENV /home/user_3d/mmmm/venv
set -gx _OLD_VIRTUAL_PATH $PATH
set -gx PATH "$VIRTUAL_ENV/"bin $PATH
diff --git a/venv/pyvenv.cfg b/venv/pyvenv.cfg
index 37ecfc2..a8e9c26 100644
--- a/venv/pyvenv.cfg
+++ b/venv/pyvenv.cfg
@@ -2,4 +2,4 @@ home = /usr/bin
include-system-site-packages = false
version = 3.11.13
executable = /usr/bin/python3.11
-command = /usr/bin/python -m venv /home/user_3d/PycharmProjects/mmmm/venv
+command = /usr/bin/python -m venv /home/user_3d/mmmm/venv