137 lines
5.0 KiB
Python
137 lines
5.0 KiB
Python
import os
|
||
|
||
# 1. Загрузка заказов из файла
|
||
def load_orders(filepath: str) -> list[dict]:
|
||
"""
|
||
Читает файл с заказами.
|
||
Формат строки: user_id, item_name, quantity, price_per_item
|
||
"""
|
||
orders = []
|
||
with open(filepath, 'r', encoding='utf-8') as file:
|
||
for line in file:
|
||
line = line.strip()
|
||
if not line:
|
||
continue
|
||
parts = line.split(',')
|
||
if len(parts) != 4:
|
||
continue
|
||
|
||
user_id = int(parts[0].strip())
|
||
item_name = parts[1].strip()
|
||
quantity = int(parts[2].strip())
|
||
price = float(parts[3].strip())
|
||
total = quantity * price
|
||
|
||
orders.append({
|
||
'user_id': user_id,
|
||
'item_name': item_name,
|
||
'quantity': quantity,
|
||
'price': price,
|
||
'total': total
|
||
})
|
||
return orders
|
||
|
||
|
||
# 2. Валидация заказов (удаление некорректных)
|
||
def validate_orders(orders: list[dict]) -> list[dict]:
|
||
"""
|
||
Отбрасывает заказы с quantity <= 0, price <= 0 или пустым item_name.
|
||
"""
|
||
valid_orders = []
|
||
for order in orders:
|
||
if (order['quantity'] > 0 and
|
||
order['price'] > 0 and
|
||
order['item_name'].strip() != ''):
|
||
valid_orders.append(order)
|
||
return valid_orders
|
||
|
||
|
||
# 3. Группировка заказов по пользователям
|
||
def group_by_user(orders: list[dict]) -> dict[int, list[dict]]:
|
||
"""
|
||
Группирует заказы по user_id.
|
||
"""
|
||
grouped = {}
|
||
for order in orders:
|
||
uid = order['user_id']
|
||
if uid not in grouped:
|
||
grouped[uid] = []
|
||
grouped[uid].append(order)
|
||
return grouped
|
||
|
||
|
||
# 4. Расчет общей суммы трат пользователя
|
||
def calculate_user_total(user_orders: list[dict]) -> float:
|
||
"""
|
||
Суммирует все значения 'total' для одного пользователя.
|
||
"""
|
||
return sum(order['total'] for order in user_orders)
|
||
|
||
|
||
# 5. Поиск самого дорогого товара (по цене за единицу)
|
||
def find_most_expensive_item(orders: list[dict]) -> tuple[str, float]:
|
||
"""
|
||
Возвращает (название, цена) товара с максимальной price.
|
||
"""
|
||
if not orders:
|
||
return ('', 0.0)
|
||
most_expensive = max(orders, key=lambda x: x['price'])
|
||
return (most_expensive['item_name'], most_expensive['price'])
|
||
|
||
|
||
# 6. Применение скидки ко всем заказам (возвращает новый список)
|
||
def apply_discount(orders: list[dict], discount_percent: float) -> list[dict]:
|
||
"""
|
||
Уменьшает поле 'total' на discount_percent.
|
||
Возвращает новый список заказов, не изменяя исходный.
|
||
"""
|
||
discounted_orders = []
|
||
for order in orders:
|
||
new_order = order.copy()
|
||
new_order['total'] = order['total'] * (1 - discount_percent / 100.0)
|
||
discounted_orders.append(new_order)
|
||
return discounted_orders
|
||
|
||
|
||
# 7. Фильтрация товаров по минимальной цене за единицу
|
||
def filter_by_price_threshold(orders: list[dict], min_price: float) -> list[dict]:
|
||
"""
|
||
Возвращает заказы, у которых price >= min_price.
|
||
"""
|
||
return [order for order in orders if order['price'] >= min_price]
|
||
|
||
|
||
# 8. Получение уникальных названий товаров
|
||
def get_unique_items(orders: list[dict]) -> set[str]:
|
||
"""
|
||
Возвращает множество уникальных item_name.
|
||
"""
|
||
return {order['item_name'] for order in orders}
|
||
|
||
|
||
# 9. Генерация текстового отчета
|
||
def generate_report(stats: dict) -> str:
|
||
"""
|
||
stats ожидается с ключами:
|
||
- unique_users (int)
|
||
- total_revenue (float)
|
||
- most_expensive_item (tuple (name, price))
|
||
- unique_items (set или list)
|
||
"""
|
||
report_lines = []
|
||
report_lines.append("=" * 50)
|
||
report_lines.append("ОТЧЕТ ПО ЗАКАЗАМ ИНТЕРНЕТ-МАГАЗИНА")
|
||
report_lines.append("=" * 50)
|
||
report_lines.append(f"Всего уникальных пользователей: {stats['unique_users']}")
|
||
report_lines.append(f"Общая выручка (без скидок): {stats['total_revenue']:.2f} руб.")
|
||
|
||
item_name, item_price = stats['most_expensive_item']
|
||
report_lines.append(f"Самый дорогой товар: {item_name} (цена за ед.: {item_price:.2f} руб.)")
|
||
|
||
report_lines.append(f"Уникальных товаров в ассортименте: {len(stats['unique_items'])}")
|
||
report_lines.append("Список товаров:")
|
||
for item in sorted(stats['unique_items']):
|
||
report_lines.append(f" - {item}")
|
||
|
||
report_lines.append("=" * 50)
|
||
return "\n".join(report_lines) |