refactor(bookings): simplify capacity tracking to use seats

Replace 'pax' booking mode with 'seat'
Consolidate inventory summary to track only seat counts
Update database schema and UI for seat-centric capacity
This commit is contained in:
2026-04-13 08:49:54 +08:00
parent c47d0d287e
commit faa998c7e1
12 changed files with 136 additions and 139 deletions

View File

@@ -2,7 +2,6 @@ import type { BookingCapacitySettings, BookingMode, PublicBooking, TicketType }
import {
formatBookingCurrency,
getBookingModeLabel,
getTicketCatalogItem,
isBookingMode,
isTicketType
@@ -14,14 +13,14 @@ import { assertBadRequest } from './http'
export function parseCreateBookingInput(body: {
customerName?: string
customerPhone?: string
bookingMode?: BookingMode
bookingMode?: BookingMode | string | null
quantity?: number
ticketType?: TicketType
personInChargeId?: string
}) {
const customerName = normalizeFullName(body.customerName || '')
const customerPhone = normalizePhoneNumber(body.customerPhone || '')
const bookingMode = body.bookingMode
const bookingMode = typeof body.bookingMode === 'string' ? body.bookingMode.trim().toLowerCase() : body.bookingMode
const ticketType = body.ticketType
const quantity = Number(body.quantity)
const personInChargeId = (body.personInChargeId || '').trim()
@@ -52,10 +51,8 @@ export function buildBookingMessage(booking: PublicBooking, confirmationUrl: str
'',
`Name: ${booking.customerName}`,
`Phone Number: ${booking.customerPhone}`,
`Booking Mode: ${getBookingModeLabel(booking.bookingMode)}`,
`Quantity: ${booking.quantity}`,
`Seats: ${booking.seatCount}`,
`Ticket Category: ${ticketLabel}`,
`Seats Covered: ${booking.seatCount}`,
`Total Price: ${formatBookingCurrency(booking.totalPrice)}`,
'',
'PIC confirmation link:',
@@ -87,14 +84,14 @@ export function parseSeatShareInput(body: {
}
export function parseBookingCapacityInput(body: {
totalTables?: number | string | null
}): Pick<BookingCapacitySettings, 'totalTables'> {
const totalTables = parseOptionalInteger(body.totalTables)
totalSeats?: number | string | null
}): Pick<BookingCapacitySettings, 'totalSeats'> {
const totalSeats = parseOptionalInteger(body.totalSeats)
assertBadRequest(totalTables === null || totalTables >= 0, 'Total tables must be 0 or greater')
assertBadRequest(totalSeats === null || totalSeats >= 0, 'Total seats must be 0 or greater')
return {
totalTables
totalSeats
}
}