fix: tolerate same-day pickup profile check

Allow configured stores to ignore a visible same-day profile pickup when booking
a future pickup slot, starting with store 33875. Keep the default profile check
behavior unchanged for all other stores.
This commit is contained in:
2026-07-16 13:39:31 +02:00
parent 02dfea8562
commit 8931418bf7
4 changed files with 135 additions and 13 deletions

View File

@@ -14,6 +14,7 @@ const { ensureSession, withSessionRetry } = require('./sessionRefresh');
const maintenanceMode = require('./maintenanceMode');
const { computeReminderSchedule } = require('./journalReminderUtils');
const { startStoreMessageWatcher } = require('./storeMessageWatcher');
const { getBlockingProfilePickup } = require('./profileCheckTolerance');
function wait(ms) {
if (!ms || ms <= 0) {
@@ -959,7 +960,7 @@ async function checkEntry(sessionId, entry, settings) {
() => foodsharingClient.fetchPickups(entry.id, session.cookieHeader, session),
{ label: 'fetchPickups' }
);
let hasProfileId = false;
const profilePickups = [];
let availablePickup = null;
const desiredWeekday = entry.desiredWeekday ? weekdayMap[entry.desiredWeekday] || entry.desiredWeekday : null;
@@ -970,7 +971,7 @@ async function checkEntry(sessionId, entry, settings) {
entry.checkProfileId &&
pickup.occupiedSlots?.some((slot) => String(slot.profile?.id) === String(session.profile.id))
) {
hasProfileId = true;
profilePickups.push(pickup);
}
if (!matchesDesiredDate(pickupDate, entry.desiredDate, entry.desiredDateRange)) {
return;
@@ -983,20 +984,35 @@ async function checkEntry(sessionId, entry, settings) {
}
});
if (entry.checkProfileId && hasProfileId) {
if (!availablePickup) {
console.log(
`[INFO] Kein freier Slot für ${entry.label || entry.id} in dieser Runde gefunden. Profil bereits eingetragen: ${
profilePickups.length > 0 ? 'ja' : 'nein'
}`
);
return;
}
const blockingProfilePickup = entry.checkProfileId
? getBlockingProfilePickup({
storeId: entry.id,
profilePickups,
targetPickup: availablePickup
})
: null;
if (entry.checkProfileId && blockingProfilePickup) {
console.log(
`[INFO] Profil bereits in einem Slot für ${entry.label || entry.id} eingetragen überspringe Buchung.`
);
return;
}
if (!availablePickup) {
if (entry.checkProfileId && profilePickups.length > 0 && !blockingProfilePickup) {
console.log(
`[INFO] Kein freier Slot für ${entry.label || entry.id} in dieser Runde gefunden. Profil bereits eingetragen: ${
hasProfileId ? 'ja' : 'nein'
}`
`[INFO] Heutige Profileintragung für ${entry.label || entry.id} wird toleriert; ` +
`Zieltermin: ${new Date(availablePickup.date).toLocaleString('de-DE')}.`
);
return;
}
if (shouldIgnoreSlot(entry, availablePickup, settings)) {
@@ -1004,7 +1020,7 @@ async function checkEntry(sessionId, entry, settings) {
return;
}
if (!entry.checkProfileId || !hasProfileId) {
if (!entry.checkProfileId || !blockingProfilePickup) {
await processBooking(session, entry, availablePickup);
}
} catch (error) {

View File

@@ -0,0 +1,39 @@
const TIME_ZONE = 'Europe/Berlin';
const TODAY_PROFILE_CHECK_TOLERANCE_STORE_IDS = new Set(['33875']);
function getDateKeyInTimeZone(date, timeZone = TIME_ZONE) {
const parsed = date instanceof Date ? date : new Date(date);
if (Number.isNaN(parsed.getTime())) {
return null;
}
const formatter = new Intl.DateTimeFormat('en-CA', {
timeZone,
year: 'numeric',
month: '2-digit',
day: '2-digit'
});
return formatter.format(parsed);
}
function getBlockingProfilePickup({ storeId, profilePickups = [], targetPickup, now = new Date() }) {
const pickUpsWithDate = profilePickups.filter((pickup) => pickup?.date);
if (pickUpsWithDate.length === 0) {
return null;
}
if (!TODAY_PROFILE_CHECK_TOLERANCE_STORE_IDS.has(String(storeId))) {
return pickUpsWithDate[0];
}
const todayKey = getDateKeyInTimeZone(now);
const targetKey = getDateKeyInTimeZone(targetPickup?.date);
if (!todayKey || !targetKey || targetKey === todayKey) {
return pickUpsWithDate[0];
}
return pickUpsWithDate.find((pickup) => getDateKeyInTimeZone(pickup.date) !== todayKey) || null;
}
module.exports = {
TODAY_PROFILE_CHECK_TOLERANCE_STORE_IDS,
getBlockingProfilePickup
};