diff --git a/src/components/bookings/BookingModal.tsx b/src/components/bookings/BookingModal.tsx index 4d7aaf8..aa650e5 100644 --- a/src/components/bookings/BookingModal.tsx +++ b/src/components/bookings/BookingModal.tsx @@ -337,13 +337,14 @@ export function BookingModal({ open, draft, rooms, bookings = [], onClose, onSav if (!room || !form.checkIn || nightCount <= 0) return 0 const catId = room.categoryId const catOverrides = catId ? priceOverrides?.[catId] : undefined - const fallback = room.baseRate ?? 0 + // room.baseRate is NUMERIC in DB — pg returns it as a string; always coerce + const fallback = Number(room.baseRate) || 0 if (!catOverrides) return fallback * nightCount let sum = 0 for (let i = 0; i < nightCount; i++) { const d = format(addDays(parseISO(form.checkIn), i), 'yyyy-MM-dd') - const p = catOverrides[d] - sum += (typeof p === 'number' && isFinite(p)) ? p : fallback + const p = Number(catOverrides[d]) + sum += (isFinite(p) && p > 0) ? p : fallback } return sum })() diff --git a/src/lib/api.ts b/src/lib/api.ts index fd47307..c2d245d 100644 --- a/src/lib/api.ts +++ b/src/lib/api.ts @@ -119,6 +119,15 @@ const CHANNEL_DISPLAY_NAMES: Record = { onetwotrip: 'OneTwoTrip', } +function normalizeRoom(r: Room): Room { + return { + ...r, + baseRate: Number(r.baseRate) || 0, + hourlyRate: r.hourlyRate != null ? Number(r.hourlyRate) : undefined, + floor: Number(r.floor) || 0, + } +} + function normalizeChannel(raw: Record): Channel { const name = raw.name as ChannelName return { @@ -171,13 +180,13 @@ export const api = { // ── Rooms ───────────────────────────────────────────────────────────────── rooms: { list: (slug: string) => - req('GET', `/api/hotels/${slug}/rooms`), + req('GET', `/api/hotels/${slug}/rooms`).then(rooms => rooms.map(normalizeRoom)), create: (slug: string, data: RoomPayload) => - req('POST', `/api/hotels/${slug}/rooms`, toRoomPayload(data)), + req('POST', `/api/hotels/${slug}/rooms`, toRoomPayload(data)).then(normalizeRoom), update: (slug: string, id: string, data: Partial) => - req('PATCH', `/api/hotels/${slug}/rooms/${id}`, toRoomPayload(data)), + req('PATCH', `/api/hotels/${slug}/rooms/${id}`, toRoomPayload(data)).then(normalizeRoom), delete: (slug: string, id: string) => req('DELETE', `/api/hotels/${slug}/rooms/${id}`),