demo_diana/read.txt

385 lines
26 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Файл с партнерами: Partners_import.xlsx
Файл с типами продукции: Product_type_import.xlsx
Файл с продуктами: Products_import.xlsx
Файл с продажами: Partner_products_import.xlsx
###
###1 def calculate_discount(total_quantity):
"""Ра""Рассчитываетссчитывает скидку на основе общего количества проданной продукции
Args:
total_quantity (int): общее количество проданной продукции
Returns:
tuple: кортеж содержащий:
- discount_percent (int): процент скидки
- discount_description (str): текстовое описание скидки
Discount tiers:
- 15%: при объеме продаж от 300000 единиц
- 10%: при объеме продаж от 50000 до 300000 единиц
- 5%: при объеме продаж от 10000 до 50000 единиц
- 0%: при объеме продаж менее 10000 единиц
"""
###2 def get_partners(db_path='partners.db', sort_by='rating', ascending=False):
"""Получает данные о партнерах из базы данных с возможностью сортировки и расчета скидок
Args:
db_path (str): путь к файлу базы данных SQLite. По умолчанию 'partners.db'
sort_by (str): поле для сортировки. Допустимые значения:
- 'rating': по рейтингу (по умолчанию)
- 'discount': по общему количеству продаж (для расчета скидки)
- 'name': по наименованию партнера
- 'type': по типу партнера и наименованию
ascending (bool): направление сортировки.
- False: по убыванию (по умолчанию)
- True: по возрастанию
Returns:
pandas.DataFrame или None: DataFrame с данными партнеров или None в случае ошибки
Структура возвращаемого DataFrame:
- Тип партнера
- Наименование партнера
- Директор
- Электронная почта
- Телефон
- Юридический адрес
- ИНН
- Рейтинг
- Дата создания
- total_quantity: общее количество продаж (скрытое поле)
- Скидка: процент скидки на основе total_quantity
- Текст_скидки: текстовое описание скидки
Raises:
sqlite3.Error: ошибки работы с базой данных
Exception: другие возможные ошибки
Example:
>>> df = get_partners(sort_by='discount', ascending=True)
>>> df = get_partners('my_database.db', sort_by='name')
"""
### 3 def get_sales_history(db_path='partners.db', limit=50, sort_by='date_desc'):
"""Получает историю реализации продукции с разными вариантами сортировки
Args:
db_path (str): путь к файлу базы данных SQLite. По умолчанию 'partners.db'
limit (int): ограничение количества возвращаемых записей. По умолчанию 50
sort_by (str): критерий сортировки данных. Допустимые значения:
- 'date_desc': по дате продажи (новые сверху, по умолчанию)
- 'date_asc': по дате продажи (старые сверху)
- 'quantity_desc': по количеству (по убыванию)
- 'amount_desc': по общей сумме (по убыванию)
Returns:
pandas.DataFrame или None: DataFrame с историей продаж или None в случае ошибки
Структура возвращаемого DataFrame:
- Дата продажи: дата осуществления продажи
- Партнер: наименование партнера
- Продукция: название продукции
- Артикул: артикул продукции
- Количество: количество проданных единиц
- Цена за единицу: цена за одну единицу продукции
- Общая сумма: общая сумма продажи (рассчитывается как количество × цена)
- Тип продукции: категория продукции
Raises:
Exception: ошибки при выполнении запроса к базе данных
Example:
>>> # Получить последние 50 продаж
>>> df = get_sales_history()
>>> # Получить 100 самых крупных продаж по сумме
>>> df = get_sales_history(limit=100, sort_by='amount_desc')
>>> # Получить историю продаж в хронологическом порядке
>>> df = get_sales_history(sort_by='date_asc', limit=200)
"""
###4 def print_partner_cards(partners_df):
"""Выводит карточки партнеров в красивом формате с рамкой
Args:
partners_df (pandas.DataFrame): DataFrame с данными партнеров, полученный из функции get_partners()
Returns:
None: функция выполняет только вывод в консоль
Формат вывода:
Каждая карточка партнера оформлена в виде рамки с следующими полями:
- Тип партнера
- Наименование партнера
- Директор
- Рейтинг
- Общее количество проданных единиц (форматированное с разделителями тысяч)
- Размер и описание скидки
- Электронная почта
- Телефон
- ИНН
- Юридический адрес (обрезается до 60 символов если слишком длинный)
Особенности:
- Если передан пустой DataFrame или None, выводится сообщение об отсутствии данных
- Адрес автоматически обрезается если превышает 60 символов
- Числовые значения количества форматируются с разделителями тысяч
- Между карточками добавляются пустые строки для лучшей читаемости
Example:
>>> partners_data = get_partners()
>>> print_partner_cards(partners_data)
╔═══════════════════════════════════════════════════════════════════════╗
║ КАРТОЧКА ПАРТНЕРА ║
╠═══════════════════════════════════════════════════════════════════════╣
║ Тип: Поставщик ║
║ Наименование: ООО "Ромашка" ║
║ Директор: Иванов Иван Иванович ║
║ Рейтинг: 4.8 ║
║ Продано единиц: 150,000 ║
║ Скидка: 10% (50000-300000 ед.) ║
║ ║
║ Контакты: info@romashka.ru ║
║ Телефон: +7 (495) 123-45-67 ║
║ ║
║ ИНН: 7712345678 ║
║ Адрес: г. Москва, ул. Ленина, д. 1, офис 25 ║
╚═══════════════════════════════════════════════════════════════════════╝
"""
###5 def print_sales_cards(sales_df):
"""Выводит историю реализации продукции в виде форматированной таблицы с рамкой
Args:
sales_df (pandas.DataFrame): DataFrame с данными о продажах, полученный из функции get_sales_history()
Returns:
None: функция выполняет только вывод в консоль
Формат вывода:
Таблица с рамкой содержит следующие колонки:
- Дата: дата продажи (обрезается до 10 символов)
- Партнер: наименование партнера (максимум 16 символов)
- Продукция: название продукции (максимум 57 символов)
- Артикул: артикул продукции (максимум 8 символов)
- Кол-во: количество проданных единиц (форматируется с разделителями тысяч)
- Цена: цена за единицу (форматируется с двумя decimal places)
- Сумма: общая сумма продажи (форматируется с двумя decimal places)
Особенности:
- Если передан пустой DataFrame или None, выводится сообщение об отсутствии данных
- Все числовые значения форматируются с разделителями тысяч и двумя знаками после запятой
- В конце таблицы выводятся итоговые показатели:
* Количество продаж
* Общее количество проданных единиц
* Общая сумма всех продаж
- Ширина таблицы фиксирована (147 символов) для сохранения форматирования
Example:
>>> sales_data = get_sales_history(limit=10)
>>> print_sales_cards(sales_data)
╔═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
║ ИСТОРИЯ РЕАЛИЗАЦИИ ПРОДУКЦИИ ║
╠═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╣
║ Дата Партнер Продукция Арт Кол-во Цена Сумма ║
╠═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╣
║ 2024-01-15 ║ ООО "Ромашка" ║ Процессор Intel Core i7-13700K ║ A123 ║ 150 ║ 25,000.00 ║ 3,750,000.00 ║
║ 2024-01-14 ║ ИП Петров ║ Монитор Samsung Odyssey G7 27" ║ B456 ║ 50 ║ 35,000.00 ║ 1,750,000.00 ║
╚═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
📊 ИТОГО: 2 продаж, 200 единиц, общая сумма: 5,500,000.00 руб.
"""
###6 def check_database():
"""Упрощенная функция выбора опции из списка с валидацией ввода
Args:
options (list): список строк с доступными опциями для выбора
Returns:
str: выбранная опция из списка options
Особенности:
- Выводит пронумерованный список опций в красивом формате
- Запрашивает ввод пользователя с валидацией
- Обрабатывает некорректный ввод и повторяет запрос
- Обрабатывает прерывание программы (Ctrl+C) с graceful shutdown
- Поддерживает ввод только цифровых значений в допустимом диапазоне
Raises:
SystemExit: при прерывании программы пользователем (KeyboardInterrupt)
Example:
>>> options = ["Показать всех партнеров", "История продаж", "Выход"]
>>> choice = simple_choice(options)
==================================================
ВЫБЕРИТЕ ОПЦИЮ:
==================================================
1. Показать всех партнеров
2. История продаж
3. Выход
Введите номер (1-3): 2
>>> print(choice)
"История продаж"
Обработка ошибок:
- Некорректный ввод (не цифры): повторный запрос
- Число вне диапазона: повторный запрос
- Прерывание (Ctrl+C): graceful exit программы
- EOF (Ctrl+D в Unix): обрабатывается как некорректный ввод
"""
"""Проверяет загруженные данные в базе данных и выводит статистику по таблицам
Функция подключается к SQLite базе данных и подсчитывает количество записей
в каждой из основных таблиц системы для проверки целостности данных.
Args:
None: использует фиксированный путь к базе данных 'partners.db'
Returns:
None: функция выполняет только вывод статистики в консоль
Проверяемые таблицы:
- PartnerType: типы партнеров (поставщики, клиенты и т.д.)
- Partner: основные данные о партнерах
- ProductType: категории продукции
- Product: данные о продукции
- Sale: история продаж
Особенности:
- Автоматически закрывает соединение с базой данных используя try-finally
- Выводит результаты в читаемом формате с эмодзи для наглядности
- Не обрабатывает ошибки явно - предполагается что база данных существует
и доступна для чтения
Example:
>>> check_database()
🔍 Проверка загруженных данных:
PartnerType: 3 записей
Partner: 15 записей
ProductType: 5 записей
Product: 25 записей
Sale: 150 записей
Note:
Для работы функции требуется существование файла 'partners.db' и всех
указанных таблиц в базе данных. В случае отсутствия таблиц может
возникнуть исключение sqlite3.OperationalError.
"""
###7 def load_data_from_files():
"""Загружает данные из Excel файлов в базу данных SQLite
Функция выполняет полную загрузку данных из четырех Excel файлов в соответствующие таблицы базы данных.
Процесс загрузки состоит из пяти этапов, выполняемых последовательно с проверкой целостности данных.
Args:
None: имена файлов запрашиваются у пользователя через интерактивный ввод
Returns:
None: функция выполняет операции с базой данных и выводит результаты в консоль
Процесс загрузки:
1. 📊 Типы партнеров - из файла партнеров извлекаются уникальные типы
2. 👥 Партнеры - загрузка основных данных о партнерах с привязкой к типам
3. 📦 Типы продукции - загрузка категорий продукции с коэффициентами
4. 🏷️ Продукты - загрузка данных о продукции с привязкой к типам
5. 💰 Продажи - загрузка истории продаж с валидацией связей и преобразованием дат
Требуемые файлы:
- Файл с партнерами: содержит данные о партнерах и их типах
- Файл с типами продукции: содержит категории продукции и коэффициенты
- Файл с продуктами: содержит данные о продукции с привязкой к типам
- Файл с продажами: содержит историю продаж с ссылками на партнеров и продукты
Особенности:
- Использует INSERT OR IGNORE для избежания дублирования записей
- Выполняет проверку существования связанных записей перед вставкой продаж
- Преобразует даты в стандартный SQL формат (YYYY-MM-DD)
- Автоматически рассчитывает цену продажи на основе минимальной партнерской цены
- В случае ошибки выполняет откат транзакции (rollback)
- После успешной загрузки вызывает check_database() для отображения статистики
Обработка ошибок:
- Отлавливает и выводит подробные сообщения об ошибках
- Продолжает загрузку при отсутствии некоторых продуктов/партнеров с предупреждениями
- Подсчитывает и выводит количество успешно загруженных продаж
Example:
>>> load_data_from_files()
📁 Введите имена файлов:
Файл с партнерами: partners.xlsx
Файл с типами продукции: product_types.xlsx
Файл с продуктами: products.xlsx
Файл с продажами: sales.xlsx
1. 📊 Загрузка типов партнеров...
2. 👥 Загрузка партнеров...
3. 📦 Загрузка типов продукции...
4. 🏷️ Загрузка продуктов...
5. 💰 Загрузка продаж...
✅ Данные успешно загружены! Загружено 150 продаж
Note:
Для работы функции требуются файлы в формате Excel (.xlsx) с определенной структурой колонок,
соответствующих ожидаемым названиям в коде.
"""
###8 def display_menu():
"""Главное меню программы для управления базой данных партнеров и продаж
Функция предоставляет интерактивный интерфейс для работы с системой управления партнерами.
Реализует основной цикл программы с возможностью выбора различных операций.
Args:
None: все параметры задаются внутри функции или запрашиваются у пользователя
Returns:
None: функция выполняется до выбора опции выхода
Основные функции меню:
1. КАРТОЧКИ ПАРТНЕРОВ (сортировка по рейтингу) - отображение партнеров, отсортированных по рейтингу
2. КАРТОЧКИ ПАРТНЕРОВ (сортировка по скидкам) - отображение партнеров, отсортированных по уровню скидки
3. ИСТОРИЯ РЕАЛИЗАЦИИ - просмотр последних 50 записей о продажах
4. ЗАПОЛНЕНИЕ БД из файлов - полная переинициализация базы данных с загрузкой из Excel файлов
5. ВЫХОД - завершение работы программы
Особенности работы:
- Использует simple_choice() для интерактивного выбора опций
- Бесконечный цикл до выбора опции выхода
- При выборе загрузки данных удаляет существующую базу и создает новую
- Автоматически создает необходимые таблицы при инициализации базы
- Обеспечивает единообразное форматирование вывода для всех опций
Flow программы:
while True:
Показать меню опций
Получить выбор пользователя
Выполнить соответствующую функцию
Если выбран ВЫХОД - прервать цикл
Example:
==================================================
ВЫБЕРИТЕ ОПЦИЮ:
==================================================
1. КАРТОЧКИ ПАРТНЕРОВ (сортировка по рейтингу)
2. КАРТОЧКИ ПАРТНЕРОВ (сортировка по скидкам)
3. ИСТОРИЯ РЕАЛИЗАЦИИ
4. ЗАПОЛНЕНИЕ БД из файлов
5. ВЫХОД
Введите номер (1-5): 1
🎯 КАРТОЧКИ ПАРТНЕРОВ (сортировка по рейтингу)
══════════════════════════════════════════════════════════════════════
[вывод карточек партнеров...]
Dependencies:
- simple_choice(): для выбора опций меню
- get_partners(): для получения данных партнеров
- print_partner_cards(): для форматированного вывода партнеров
- get_sales_history(): для получения истории продаж
- print_sales_cards(): для форматированного вывода продаж
- create_tables(): для создания структуры базы данных
- load_data_from_files(): для загрузки данных из файлов
"""