From d1c50c77d09c4bda7047380464203b1dcdd0e200 Mon Sep 17 00:00:00 2001 From: jtricerolph Date: Thu, 30 Jul 2026 10:32:22 +0000 Subject: [PATCH] Fix NewBook reports using invented bookings_list params and field names MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Arrivals, departures, stayovers, and bookings-by-source were sending request params (arrival_date_from, departure_date_from, stayover_date_from) and reading response fields (arrival_date, booking_ref, no_nights) that don't exist in NewBook's API — causing API errors. Switched to the real bookings_list contract (period_from/period_to/list_type) and field names (booking_arrival, booking_departure, reference, booking_length, etc.) already proven working in room-planner, hvac, and kitchen's integrations. Co-Authored-By: Claude Sonnet 5 --- backend/src/reports/newbook/arrivals.js | 30 +++++++++++-------- .../src/reports/newbook/bookings-by-source.js | 14 +++++---- backend/src/reports/newbook/departures.js | 26 +++++++++------- backend/src/reports/newbook/stayovers.js | 28 ++++++++++------- 4 files changed, 61 insertions(+), 37 deletions(-) diff --git a/backend/src/reports/newbook/arrivals.js b/backend/src/reports/newbook/arrivals.js index d6d5c81c..bbc5a0ef 100644 --- a/backend/src/reports/newbook/arrivals.js +++ b/backend/src/reports/newbook/arrivals.js @@ -8,22 +8,28 @@ export default { async run({ dateFrom, dateTo }, { newbook }) { const data = await newbook.callApi('bookings_list', { - arrival_date_from: dateFrom, - arrival_date_to: dateTo, + period_from: `${dateFrom} 00:00:00`, + period_to: `${dateTo} 23:59:59`, + list_type: 'staying', }) - const rows = (data?.data ?? []).map(b => ({ - ref: b.booking_ref ?? b.id, + const bookings = (data?.data ?? []).filter(b => { + const arrival = (b.booking_arrival ?? '').slice(0, 10) + return arrival >= dateFrom && arrival <= dateTo + }) + + const rows = bookings.map(b => ({ + ref: b.reference ?? b.booking_reference ?? b.id, guest: b.guest_name ?? `${b.first_name ?? ''} ${b.last_name ?? ''}`.trim(), - arrival: b.arrival_date, - departure: b.departure_date, - nights: b.nights ?? b.no_nights, - room: b.site_name ?? b.room_name ?? b.site_id, - adults: b.adults ?? b.no_adults, - children: b.children ?? b.no_children ?? 0, + arrival: b.booking_arrival, + departure: b.booking_departure, + nights: b.booking_length ?? b.nights, + room: b.site_name ?? b.site_id, + adults: b.booking_adults ?? b.adults, + children: b.booking_children ?? b.children ?? 0, source: b.booking_source ?? b.channel, - status: b.booking_status ?? b.status, - total: b.booking_total ?? b.total_price, + status: b.status, + total: b.total, })) return { diff --git a/backend/src/reports/newbook/bookings-by-source.js b/backend/src/reports/newbook/bookings-by-source.js index d2a559bd..1614c5b8 100644 --- a/backend/src/reports/newbook/bookings-by-source.js +++ b/backend/src/reports/newbook/bookings-by-source.js @@ -8,19 +8,23 @@ export default { async run({ dateFrom, dateTo }, { newbook }) { const data = await newbook.callApi('bookings_list', { - arrival_date_from: dateFrom, - arrival_date_to: dateTo, + period_from: `${dateFrom} 00:00:00`, + period_to: `${dateTo} 23:59:59`, + list_type: 'staying', }) - const bookings = data?.data ?? [] + const bookings = (data?.data ?? []).filter(b => { + const arrival = (b.booking_arrival ?? '').slice(0, 10) + return arrival >= dateFrom && arrival <= dateTo + }) const grouped = {} for (const b of bookings) { const source = b.booking_source ?? b.channel ?? 'Unknown' if (!grouped[source]) grouped[source] = { bookings: 0, nights: 0, revenue: 0 } grouped[source].bookings++ - grouped[source].nights += parseInt(b.nights ?? b.no_nights ?? 0) || 0 - grouped[source].revenue += parseFloat(b.booking_total ?? b.total_price ?? 0) || 0 + grouped[source].nights += parseInt(b.booking_length ?? b.nights ?? 0) || 0 + grouped[source].revenue += parseFloat(b.total ?? 0) || 0 } const rows = Object.entries(grouped) diff --git a/backend/src/reports/newbook/departures.js b/backend/src/reports/newbook/departures.js index f917d6db..fd4bf8c7 100644 --- a/backend/src/reports/newbook/departures.js +++ b/backend/src/reports/newbook/departures.js @@ -8,20 +8,26 @@ export default { async run({ dateFrom, dateTo }, { newbook }) { const data = await newbook.callApi('bookings_list', { - departure_date_from: dateFrom, - departure_date_to: dateTo, + period_from: `${dateFrom} 00:00:00`, + period_to: `${dateTo} 23:59:59`, + list_type: 'staying', }) - const rows = (data?.data ?? []).map(b => ({ - ref: b.booking_ref ?? b.id, + const bookings = (data?.data ?? []).filter(b => { + const departure = (b.booking_departure ?? '').slice(0, 10) + return departure >= dateFrom && departure <= dateTo + }) + + const rows = bookings.map(b => ({ + ref: b.reference ?? b.booking_reference ?? b.id, guest: b.guest_name ?? `${b.first_name ?? ''} ${b.last_name ?? ''}`.trim(), - arrival: b.arrival_date, - departure: b.departure_date, - nights: b.nights ?? b.no_nights, - room: b.site_name ?? b.room_name ?? b.site_id, + arrival: b.booking_arrival, + departure: b.booking_departure, + nights: b.booking_length ?? b.nights, + room: b.site_name ?? b.site_id, source: b.booking_source ?? b.channel, - status: b.booking_status ?? b.status, - total: b.booking_total ?? b.total_price, + status: b.status, + total: b.total, })) return { diff --git a/backend/src/reports/newbook/stayovers.js b/backend/src/reports/newbook/stayovers.js index 4b33706a..736ec42d 100644 --- a/backend/src/reports/newbook/stayovers.js +++ b/backend/src/reports/newbook/stayovers.js @@ -8,19 +8,27 @@ export default { async run({ dateFrom, dateTo }, { newbook }) { const data = await newbook.callApi('bookings_list', { - stayover_date_from: dateFrom, - stayover_date_to: dateTo, + period_from: `${dateFrom} 00:00:00`, + period_to: `${dateTo} 23:59:59`, + list_type: 'staying', }) - const rows = (data?.data ?? []).map(b => ({ - ref: b.booking_ref ?? b.id, + // In-house for the whole window — arrived before it started, still there after it ends. + const bookings = (data?.data ?? []).filter(b => { + const arrival = (b.booking_arrival ?? '').slice(0, 10) + const departure = (b.booking_departure ?? '').slice(0, 10) + return arrival < dateFrom && departure > dateTo + }) + + const rows = bookings.map(b => ({ + ref: b.reference ?? b.booking_reference ?? b.id, guest: b.guest_name ?? `${b.first_name ?? ''} ${b.last_name ?? ''}`.trim(), - arrival: b.arrival_date, - departure: b.departure_date, - nights: b.nights ?? b.no_nights, - room: b.site_name ?? b.room_name ?? b.site_id, - adults: b.adults ?? b.no_adults, - status: b.booking_status ?? b.status, + arrival: b.booking_arrival, + departure: b.booking_departure, + nights: b.booking_length ?? b.nights, + room: b.site_name ?? b.site_id, + adults: b.booking_adults ?? b.adults, + status: b.status, })) return {