2026-05-01 11:12:13 +03:00

74 lines
2.1 KiB
Python

from sqlalchemy.orm import Session
from app.models import Order, OrderItem, Cart, CartItem, Product
from app.schemas.order import OrderCreate, OrderItemCreate
from typing import Optional
import uuid
from datetime import datetime
def create_order(db: Session, user_id: int, order_data: OrderCreate) -> Optional[Order]:
cart = db.query(Cart).filter(Cart.user_id == user_id).first()
if not cart or not cart.items:
return None
total_amount = 0
order_items_data = []
for cart_item in cart.items:
product = cart_item.product
price = product.discount_price if product.discount_price else product.price
total_amount += price * cart_item.quantity
order_items_data.append({
"product_id": product.id,
"quantity": cart_item.quantity,
"price": price,
"size": cart_item.size,
"color": cart_item.color,
})
order_number = f"ORD-{datetime.utcnow().strftime('%Y%m%d%H%M%S')}-{uuid.uuid4().hex[:6].upper()}"
order = Order(
user_id=user_id,
order_number=order_number,
status="pending",
total_amount=total_amount,
**order_data.dict(),
)
db.add(order)
db.flush()
for item_data in order_items_data:
order_item = OrderItem(order_id=order.id, **item_data)
db.add(order_item)
product = db.query(Product).filter(Product.id == item_data["product_id"]).first()
product.stock -= item_data["quantity"]
# Clear cart
db.query(CartItem).filter(CartItem.cart_id == cart.id).delete()
db.commit()
db.refresh(order)
return order
def get_order_by_id(db: Session, order_id: int) -> Optional[Order]:
return db.query(Order).filter(Order.id == order_id).first()
def get_user_orders(db: Session, user_id: int) -> list:
return db.query(Order).filter(Order.user_id == user_id).all()
def update_order_status(db: Session, order_id: int, status: str) -> Optional[Order]:
order = get_order_by_id(db, order_id)
if not order:
return None
order.status = status
db.commit()
db.refresh(order)
return order