75 lines
2.2 KiB
Python
75 lines
2.2 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_dict = order_data.model_dump() if hasattr(order_data, 'model_dump') else order_data.dict()
|
|
order = Order(
|
|
user_id=user_id,
|
|
order_number=order_number,
|
|
status="pending",
|
|
total_amount=total_amount,
|
|
**order_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
|