feat: add launch readiness features for OMS
- Implement VAT tax calculation on order creation based on EU country rates - Add post-order hooks: customer stats update, cart clear, email confirmation - Create shop order history page with pagination and status badges - Create shop order detail page with order items and addresses - Add order_confirmation email templates in 4 languages (en, fr, de, lb) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -12,6 +12,7 @@ Customer Context: get_current_customer_api returns Customer directly
|
||||
"""
|
||||
|
||||
import logging
|
||||
from datetime import UTC, datetime
|
||||
|
||||
from fastapi import APIRouter, Depends, Path, Query, Request
|
||||
from sqlalchemy.orm import Session
|
||||
@@ -19,7 +20,10 @@ from sqlalchemy.orm import Session
|
||||
from app.api.deps import get_current_customer_api
|
||||
from app.core.database import get_db
|
||||
from app.exceptions import VendorNotFoundException
|
||||
from app.services.cart_service import cart_service
|
||||
from app.services.email_service import EmailService
|
||||
from app.services.order_service import order_service
|
||||
from app.utils.money import cents_to_euros
|
||||
from models.database.customer import Customer
|
||||
from models.schema.order import (
|
||||
OrderCreate,
|
||||
@@ -81,9 +85,53 @@ def place_order(
|
||||
},
|
||||
)
|
||||
|
||||
# TODO: Update customer stats
|
||||
# TODO: Clear cart
|
||||
# TODO: Send order confirmation email
|
||||
# Update customer stats
|
||||
customer.total_orders = (customer.total_orders or 0) + 1
|
||||
customer.total_spent = (customer.total_spent or 0) + order.total_amount
|
||||
customer.last_order_date = datetime.now(UTC)
|
||||
db.flush()
|
||||
|
||||
logger.debug(
|
||||
f"Updated customer stats: total_orders={customer.total_orders}, "
|
||||
f"total_spent={customer.total_spent}"
|
||||
)
|
||||
|
||||
# Clear cart (get session_id from request cookies or headers)
|
||||
session_id = request.cookies.get("cart_session_id") or request.headers.get(
|
||||
"X-Cart-Session-Id"
|
||||
)
|
||||
if session_id:
|
||||
try:
|
||||
cart_service.clear_cart(db, vendor.id, session_id)
|
||||
logger.debug(f"Cleared cart for session {session_id}")
|
||||
except Exception as e:
|
||||
logger.warning(f"Failed to clear cart: {e}")
|
||||
|
||||
# Send order confirmation email
|
||||
try:
|
||||
email_service = EmailService(db)
|
||||
email_service.send_template(
|
||||
template_code="order_confirmation",
|
||||
to_email=customer.email,
|
||||
to_name=customer.full_name,
|
||||
language=customer.preferred_language or "en",
|
||||
variables={
|
||||
"customer_name": customer.first_name or customer.full_name,
|
||||
"order_number": order.order_number,
|
||||
"order_total": f"€{order.total_amount:.2f}",
|
||||
"order_items_count": len(order.items),
|
||||
"order_date": order.order_date.strftime("%d.%m.%Y")
|
||||
if order.order_date
|
||||
else "",
|
||||
"shipping_address": f"{order.ship_address_line_1}, {order.ship_postal_code} {order.ship_city}",
|
||||
},
|
||||
vendor_id=vendor.id,
|
||||
related_type="order",
|
||||
related_id=order.id,
|
||||
)
|
||||
logger.info(f"Sent order confirmation email to {customer.email}")
|
||||
except Exception as e:
|
||||
logger.warning(f"Failed to send order confirmation email: {e}")
|
||||
|
||||
return OrderResponse.model_validate(order)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user