v5.0.13 — Cache + retry

This commit is contained in:
Quentin Rouiller
2026-04-21 16:04:00 +02:00
parent 909ddb8301
commit d6ab8d59e0
3 changed files with 36 additions and 9 deletions
+26 -1
View File
@@ -4188,6 +4188,12 @@ function compareTechs(a, b, targetDate) {
return aLast.localeCompare(bLast, "fr");
}
// v5.0.13 : un tech est considéré "absent toute la journée" uniquement si une
// absence couvre RÉELLEMENT du matin au soir (ou quasi), pas juste s'il a des
// absences (éventuellement partielles). Avant, une absence matin 08-12 seule
// faisait passer le tech en "absent toute la journée" car il n'avait QUE des
// absences. Maintenant on check explicitement que l'absence couvre ≥ 90% de
// la plage 08:00-18:00.
function isTechAbsent(tech, isoDate) {
const recurring = RECURRING_ABSENCES[tech.id];
if (recurring) {
@@ -4195,7 +4201,26 @@ function isTechAbsent(tech, isoDate) {
if (recurring.includes(day)) return true;
}
if (tech.interventions.length === 0) return false;
return tech.interventions.every(iv => iv.type === "AL-Absence" && !iv.isPompier);
// Parmi les absences (hors pompier), est-ce qu'une seule couvre la journée ?
const fullDayAbsences = tech.interventions.filter(iv => {
if (iv.type !== "AL-Absence" || iv.isPompier) return false;
const startMin = timeToMinutes(iv.startTime);
const endMin = timeToMinutes(iv.endTime);
if (startMin == null || endMin == null) {
// Si on n'a pas d'horaires, on considère que c'est toute la journée
// (cas des absences multi-jours sans horaires précis)
return true;
}
// Absence couvre toute la journée si son créneau déborde largement
// la plage affichée (≥ 90%). Une demi-journée (4h) sur 10h = 40% → ne
// passera pas, donc on ne marquera pas le tech comme absent toute la journée.
const DAY_LEN_MIN = 10 * 60; // 08:00 → 18:00 = 10h
const clampedStart = Math.max(startMin, 8 * 60);
const clampedEnd = Math.min(endMin, 18 * 60);
const coveredMin = Math.max(0, clampedEnd - clampedStart);
return coveredMin >= 0.9 * DAY_LEN_MIN;
});
return fullDayAbsences.length > 0;
}
// ============================================================================