from fastapi import Depends, HTTPException, APIRouter from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy import select, desc, func from database import get_db from models import Delivery_Delivery, Customer_Customer from routes.auth.current_user import get_current_user from models import Account_User router = APIRouter() STATUS_MAPPING = { 0: "Waiting", 1: "Cancelled", 2: "Today", 3: "Tomorrow_Delivery", 4: "Partial_Delivery", 5: "Issue_Delivery", 9: "Pending", 10: "Finalized" } PAYMENT_MAPPING = { 0: "Cash", 1: "Credit", 2: "Credit/Cash", 3: "Check", 4: "Other" } @router.get("/deliveries") async def get_user_deliveries( current_user: Account_User = Depends(get_current_user), db: AsyncSession = Depends(get_db) ): if not current_user.user_id: raise HTTPException(status_code=404, detail="Customer not found") # Get customer from user_id customer = await db.execute( select(Customer_Customer).where(Customer_Customer.id == current_user.user_id) ) customer = customer.scalar_one_or_none() if not customer: raise HTTPException(status_code=404, detail="Customer not found") # Get last 20 deliveries ordered by delivery date (when_delivered or when_ordered) desc deliveries_query = await db.execute( select(Delivery_Delivery) .where(Delivery_Delivery.customer_id == customer.id) .order_by(desc(func.coalesce(Delivery_Delivery.when_delivered, Delivery_Delivery.when_ordered))) .limit(20) ) deliveries = deliveries_query.scalars().all() # Format deliveries result = [] for delivery in deliveries: # Use when_delivered if available, otherwise when_ordered delivery_date = delivery.when_delivered or delivery.when_ordered # Use gallons_delivered if available, otherwise gallons_ordered gallons = delivery.gallons_delivered if delivery.gallons_delivered is not None else delivery.gallons_ordered result.append({ "id": delivery.id, "when_ordered": delivery.when_ordered.isoformat() if delivery.when_ordered else None, "when_delivered": delivery.when_delivered.isoformat() if delivery.when_delivered else None, "delivery_date": delivery_date.isoformat() if delivery_date else None, "gallons_ordered": delivery.gallons_ordered, "gallons_delivered": float(delivery.gallons_delivered) if delivery.gallons_delivered else None, "gallons": float(gallons) if gallons is not None else None, "customer_price": float(delivery.customer_price) if delivery.customer_price else None, "delivery_status": STATUS_MAPPING.get(delivery.delivery_status, f"Unknown ({delivery.delivery_status})"), "payment_type": PAYMENT_MAPPING.get(delivery.payment_type, f"Unknown ({delivery.payment_type})"), "dispatcher_notes": delivery.dispatcher_notes }) return result