From 822ce2f9702f835b87f8516d7815f2638c7d00c0 Mon Sep 17 00:00:00 2001 From: jtricerolph Date: Mon, 20 Jul 2026 10:51:58 +0000 Subject: [PATCH] Use per-day available_rooms from forecasting API (overflow excluded) Switch from a single total_rooms scalar to rm.available_rooms per day, now that the forecasting public API returns it from daily_occupancy. Fixes worksheet Avail column showing 80 (total physical beds) instead of the correct occupancy-reportable room count. Co-Authored-By: Claude Sonnet 4.6 --- backend/src/routes/directors-forecast.js | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/backend/src/routes/directors-forecast.js b/backend/src/routes/directors-forecast.js index 02c0a507..9e1757c3 100644 --- a/backend/src/routes/directors-forecast.js +++ b/backend/src/routes/directors-forecast.js @@ -53,7 +53,7 @@ async function fetchMonthFromApi(year, month, lastDayNum) { for (const d of revData.data) revMap[d.date] = d const roomsMap = {} for (const d of roomsData.data) roomsMap[d.date] = d - return { revMap, roomsMap, available: roomsData.total_rooms } + return { revMap, roomsMap } } export async function directorsForecastRoutes(fastify) { @@ -71,7 +71,7 @@ export async function directorsForecastRoutes(fastify) { const today = new Date().toISOString().split('T')[0] const sessionRate = 135 - const [{ session, overrideMap }, { revMap, roomsMap, available }] = await Promise.all([ + const [{ session, overrideMap }, { revMap, roomsMap }] = await Promise.all([ getSessionAndOverrides(year, month), fetchMonthFromApi(year, month, lastDayNum), ]) @@ -89,8 +89,9 @@ export async function directorsForecastRoutes(fastify) { const isToday = dateStr === today const dow = new Date(dateStr + 'T00:00:00').getDay() - const otbRooms = rm.otb_rooms ?? 0 - const otbNetRev = rev.accom?.otb ?? 0 + const available = rm.available_rooms ?? 0 + const otbRooms = rm.otb_rooms ?? 0 + const otbNetRev = rev.accom?.otb ?? 0 const avgRateNet = otbRooms > 0 ? otbNetRev / otbRooms : null // ML pickup suggestion from the forecasting model @@ -187,7 +188,7 @@ export async function directorsForecastRoutes(fastify) { const month = parseInt(request.params.month) const lastDayNum = new Date(year, month, 0).getDate() - const [{ session, overrideMap }, { revMap, roomsMap, available }] = await Promise.all([ + const [{ session, overrideMap }, { revMap, roomsMap }] = await Promise.all([ getSessionAndOverrides(year, month), fetchMonthFromApi(year, month, lastDayNum), ]) @@ -213,9 +214,10 @@ export async function directorsForecastRoutes(fastify) { const rm = roomsMap[dateStr] || {} const ovr = overrideMap[dateStr] || {} - const isPast = rev.is_past ?? false - const otbRooms = rm.otb_rooms ?? 0 - const otbNetRev = rev.accom?.otb ?? 0 + const isPast = rev.is_past ?? false + const available = rm.available_rooms ?? 0 + const otbRooms = rm.otb_rooms ?? 0 + const otbNetRev = rev.accom?.otb ?? 0 const pickupRooms = ovr.pickup_rooms != null ? parseInt(ovr.pickup_rooms) : 0 const dayRate = ovr.pickup_avg_rate != null ? parseFloat(ovr.pickup_avg_rate) : sessionRate const totalRooms = otbRooms + pickupRooms