Fix 3-month availability by raising Beds24 chunk limit and balancing chunks.
The /inventory/rooms/offers endpoint allows up to 99 nights, but the chunking threshold was set to 90. This caused 90-99 night stays to be split unnecessarily, often leaving a 1- or 2-night final chunk that fell below the room's minimum stay and produced a false "unavailable" result. Now the limit is 99 and chunks are split into equal-sized pieces, so stays around 3 months (and longer) avoid tiny trailing chunks. Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
co-authored by
Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
parent
74592a9e14
commit
48b44f6ccd
+11
-5
@@ -184,7 +184,7 @@ async function fetchOffer(
|
|||||||
// is long-term stays (1–12+ months), we work around it by splitting longer
|
// is long-term stays (1–12+ months), we work around it by splitting longer
|
||||||
// stays into consecutive chunks of at most this many nights each, querying
|
// stays into consecutive chunks of at most this many nights each, querying
|
||||||
// each separately, and summing the results.
|
// each separately, and summing the results.
|
||||||
const MAX_NIGHTS_PER_OFFER_REQUEST = 90;
|
const MAX_NIGHTS_PER_OFFER_REQUEST = 99;
|
||||||
|
|
||||||
export async function getAvailability(
|
export async function getAvailability(
|
||||||
params: Beds24AvailabilityParams
|
params: Beds24AvailabilityParams
|
||||||
@@ -242,13 +242,20 @@ async function getAvailabilityInChunks(
|
|||||||
params: Beds24AvailabilityParams,
|
params: Beds24AvailabilityParams,
|
||||||
totalNights: number
|
totalNights: number
|
||||||
): Promise<Beds24AvailabilityResponse> {
|
): Promise<Beds24AvailabilityResponse> {
|
||||||
|
// Split into as few chunks as possible, each ≤ 99 nights, and keep the
|
||||||
|
// chunk sizes as equal as possible. This avoids tiny final chunks that
|
||||||
|
// would fall below a room's minimum-stay rule and return no offer.
|
||||||
|
const numChunks = Math.ceil(totalNights / MAX_NIGHTS_PER_OFFER_REQUEST);
|
||||||
|
let baseChunkSize = Math.floor(totalNights / numChunks);
|
||||||
|
let remainder = totalNights % numChunks;
|
||||||
|
|
||||||
let cursor = params.start;
|
let cursor = params.start;
|
||||||
let remaining = totalNights;
|
|
||||||
let totalPrice = 0;
|
let totalPrice = 0;
|
||||||
let currency = "EUR";
|
let currency = "EUR";
|
||||||
|
|
||||||
while (remaining > 0) {
|
for (let i = 0; i < numChunks; i++) {
|
||||||
const chunkNights = Math.min(remaining, MAX_NIGHTS_PER_OFFER_REQUEST);
|
const chunkNights = baseChunkSize + (remainder > 0 ? 1 : 0);
|
||||||
|
remainder--;
|
||||||
const chunkEnd = addDaysToDateString(cursor, chunkNights);
|
const chunkEnd = addDaysToDateString(cursor, chunkNights);
|
||||||
|
|
||||||
const offer = await fetchOffer(
|
const offer = await fetchOffer(
|
||||||
@@ -273,7 +280,6 @@ async function getAvailabilityInChunks(
|
|||||||
totalPrice += offer.price;
|
totalPrice += offer.price;
|
||||||
currency = offer.currency;
|
currency = offer.currency;
|
||||||
cursor = chunkEnd;
|
cursor = chunkEnd;
|
||||||
remaining -= chunkNights;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|||||||
Reference in New Issue
Block a user