File size: 7,316 Bytes
80feb1b |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 |
from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session
from typing import List
from datetime import datetime, timezone
from ..database import get_db, Table as TableModel, Order
from ..models.table import Table, TableCreate, TableUpdate, TableStatus
router = APIRouter(
prefix="/tables",
tags=["tables"],
responses={404: {"description": "Not found"}},
)
# Get all tables
@router.get("/", response_model=List[Table])
def get_all_tables(db: Session = Depends(get_db)):
return db.query(TableModel).order_by(TableModel.table_number).all()
# Get table by ID
@router.get("/{table_id}", response_model=Table)
def get_table(table_id: int, db: Session = Depends(get_db)):
db_table = db.query(TableModel).filter(TableModel.id == table_id).first()
if not db_table:
raise HTTPException(status_code=404, detail="Table not found")
return db_table
# Get table by table number
@router.get("/number/{table_number}", response_model=Table)
def get_table_by_number(table_number: int, db: Session = Depends(get_db)):
db_table = (
db.query(TableModel).filter(TableModel.table_number == table_number).first()
)
if not db_table:
raise HTTPException(status_code=404, detail="Table not found")
return db_table
# Create new table
@router.post("/", response_model=Table)
def create_table(table: TableCreate, db: Session = Depends(get_db)):
# Check if a table with this number already exists
existing_table = (
db.query(TableModel)
.filter(TableModel.table_number == table.table_number)
.first()
)
if existing_table:
raise HTTPException(
status_code=400,
detail=f"Table with number {table.table_number} already exists",
)
# Create new table
db_table = TableModel(
table_number=table.table_number,
is_occupied=table.is_occupied,
current_order_id=table.current_order_id,
last_occupied_at=table.last_occupied_at,
created_at=datetime.now(timezone.utc),
updated_at=datetime.now(timezone.utc),
)
db.add(db_table)
db.commit()
db.refresh(db_table)
return db_table
# Update table
@router.put("/{table_id}", response_model=Table)
def update_table(
table_id: int, table_update: TableUpdate, db: Session = Depends(get_db)
):
db_table = db.query(TableModel).filter(TableModel.id == table_id).first()
if not db_table:
raise HTTPException(status_code=404, detail="Table not found")
# Update fields if provided
if table_update.is_occupied is not None:
db_table.is_occupied = table_update.is_occupied
if table_update.current_order_id is not None:
db_table.current_order_id = table_update.current_order_id
db_table.updated_at = datetime.now(timezone.utc)
db.commit()
db.refresh(db_table)
return db_table
# Delete table
@router.delete("/{table_id}")
def delete_table(table_id: int, db: Session = Depends(get_db)):
db_table = db.query(TableModel).filter(TableModel.id == table_id).first()
if not db_table:
raise HTTPException(status_code=404, detail="Table not found")
# Check if table is currently occupied
if db_table.is_occupied:
raise HTTPException(
status_code=400, detail="Cannot delete a table that is currently occupied"
)
db.delete(db_table)
db.commit()
return {"message": "Table deleted successfully"}
# Get table status (total, occupied, free)
@router.get("/status/summary", response_model=TableStatus)
def get_table_status(db: Session = Depends(get_db)):
total_tables = db.query(TableModel).count()
occupied_tables = (
db.query(TableModel).filter(TableModel.is_occupied == True).count()
)
free_tables = total_tables - occupied_tables
return {
"total_tables": total_tables,
"occupied_tables": occupied_tables,
"free_tables": free_tables,
}
# Set table as occupied
@router.put("/{table_id}/occupy", response_model=Table)
def set_table_occupied(
table_id: int, order_id: int = None, db: Session = Depends(get_db)
):
db_table = db.query(TableModel).filter(TableModel.id == table_id).first()
if not db_table:
raise HTTPException(status_code=404, detail="Table not found")
# Check if table is already occupied
if db_table.is_occupied:
raise HTTPException(status_code=400, detail="Table is already occupied")
# Update table status
db_table.is_occupied = True
# Link to order if provided
if order_id:
# Verify order exists
order = db.query(Order).filter(Order.id == order_id).first()
if not order:
raise HTTPException(status_code=404, detail="Order not found")
db_table.current_order_id = order_id
db_table.updated_at = datetime.now(timezone.utc)
db.commit()
db.refresh(db_table)
return db_table
# Set table as free
@router.put("/{table_id}/free", response_model=Table)
def set_table_free(table_id: int, db: Session = Depends(get_db)):
db_table = db.query(TableModel).filter(TableModel.id == table_id).first()
if not db_table:
raise HTTPException(status_code=404, detail="Table not found")
# Check if table is already free
if not db_table.is_occupied:
raise HTTPException(status_code=400, detail="Table is already free")
# Update table status
db_table.is_occupied = False
db_table.current_order_id = None
db_table.updated_at = datetime.now(timezone.utc)
db.commit()
db.refresh(db_table)
return db_table
# Set table as occupied by table number
@router.put("/number/{table_number}/occupy", response_model=Table)
def set_table_occupied_by_number(table_number: int, db: Session = Depends(get_db)):
db_table = (
db.query(TableModel).filter(TableModel.table_number == table_number).first()
)
if not db_table:
raise HTTPException(status_code=404, detail="Table not found")
# Update table status (even if already occupied, just update the timestamp)
db_table.is_occupied = True
db_table.last_occupied_at = datetime.now(timezone.utc)
db_table.updated_at = datetime.now(timezone.utc)
db.commit()
db.refresh(db_table)
return db_table
# Create multiple tables at once
@router.post("/batch", response_model=List[Table])
def create_tables_batch(num_tables: int, db: Session = Depends(get_db)):
if num_tables <= 0:
raise HTTPException(
status_code=400, detail="Number of tables must be greater than 0"
)
# Get the highest existing table number
highest_table = (
db.query(TableModel).order_by(TableModel.table_number.desc()).first()
)
start_number = 1
if highest_table:
start_number = highest_table.table_number + 1
# Create tables
new_tables = []
for i in range(start_number, start_number + num_tables):
db_table = TableModel(
table_number=i,
is_occupied=False,
created_at=datetime.now(timezone.utc),
updated_at=datetime.now(timezone.utc),
)
db.add(db_table)
new_tables.append(db_table)
db.commit()
# Refresh all tables
for table in new_tables:
db.refresh(table)
return new_tables
|