forked from FroSteel/Planification
v5.0.13 — Cache + retry
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
|
||||
Reference in New Issue
Block a user