23 lines
829 B
Python
23 lines
829 B
Python
"""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"
|