// tables
tables: defineTable({
name: v.string(), // "A1", "VIP-1"
zone: v.union(v.literal("VIP"), v.literal("PREMIUM"), v.literal("STANDARD")),
capacity: v.number(),
status: v.union(v.literal("ACTIVE"), v.literal("INACTIVE")),
floorPlanX: v.number(),
floorPlanY: v.number(),
})
.index("by_zone", ["zone"])
.index("by_status", ["status"]);
// menuItems
menuItems: defineTable({
name: v.string(),
description: v.string(),
price: v.number(),
category: v.union(...),
station: v.union(v.literal("KITCHEN"), v.literal("BAR")),
available: v.boolean(),
})
.index("by_category", ["category"])
.index("by_available", ["available"]);
// orders
orders: defineTable({
tableId: v.id("tables"),
reservationId: v.optional(v.id("reservations")),
status: v.union(
v.literal("OPEN"),
v.literal("SUBMITTED"),
v.literal("COMPLETED"),
v.literal("CANCELLED"),
),
totalAmount: v.number(),
})
.index("by_table", ["tableId"])
.index("by_status", ["status"]);
// orderItems
orderItems: defineTable({
orderId: v.id("orders"),
menuItemId: v.id("menuItems"),
quantity: v.number(),
unitPrice: v.number(),
status: v.union(
v.literal("PENDING"),
v.literal("SUBMITTED"),
v.literal("PREPARING"),
v.literal("READY"),
v.literal("SERVED"),
v.literal("CANCELLED"),
),
station: v.union(v.literal("KITCHEN"), v.literal("BAR")),
isComp: v.boolean(),
compSource: v.optional(
v.union(v.literal("SPIN"), v.literal("PHOTO_WIN"), v.literal("GOOGLE_REVIEW")),
),
})
.index("by_order", ["orderId"])
.index("by_station_status", ["station", "status"]);