78 lines
2.9 KiB
Python
78 lines
2.9 KiB
Python
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
|