"""Order number generation and business logic.""" from datetime import datetime from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy import select, func from app.models.order import Order async def generate_order_number(db: AsyncSession) -> str: """Generate next sequential order number: SA-2026-XXXXX.""" year = datetime.utcnow().year prefix = f"SA-{year}-" # Use MAX to find the highest existing sequence number this year. # COUNT-based approach breaks when orders are deleted (produces duplicates). result = await db.execute( select(func.max(Order.order_number)).where(Order.order_number.like(f"{prefix}%")) ) max_num = result.scalar() if max_num: last_seq = int(max_num.split("-")[-1]) return f"{prefix}{last_seq + 1:05d}" return f"{prefix}00001"