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