v5.0.13 — Cache + retry
This commit is contained in:
+9
-7
@@ -684,7 +684,11 @@ async function deletePlanningItem(origin, phpsessid, actionId, kind) {
|
||||
console.log(`[bg] deletePlanningItem → tente function_name=${fn}`, url.substring(0, 180));
|
||||
|
||||
try {
|
||||
const r = await fetch(url, { method: "GET", credentials: "include" });
|
||||
// v5.0.13 : utiliser evFetch() au lieu de fetch() brut pour que les
|
||||
// headers Referer + X-Requested-With soient envoyés — sinon EV renvoie
|
||||
// un <script> de redirection CSRF qui ne ressemble pas à une erreur et
|
||||
// notre heuristique le prenait à tort pour un succès.
|
||||
const r = await evFetch(url, origin, { method: "GET" });
|
||||
const body = await r.text();
|
||||
console.log(`[bg] status=${r.status} | body (200 premiers chars) : ${(body || "").substring(0, 200)}`);
|
||||
|
||||
@@ -700,17 +704,15 @@ async function deletePlanningItem(origin, phpsessid, actionId, kind) {
|
||||
}
|
||||
|
||||
// v5.0.1 : heuristique pour détecter si la suppression a marché.
|
||||
// EasyVista renvoie typiquement :
|
||||
// - une chaine vide ou "ok" ou "1" si succès
|
||||
// - un message d'erreur / html d'erreur si function_name inconnu
|
||||
// On considère que tout ce qui n'est pas un message d'erreur évident
|
||||
// est un succès. Si plusieurs fn renvoient 200, on prend le premier.
|
||||
// v5.0.13 : élargie pour détecter aussi le script de redirection CSRF
|
||||
// (si evFetch n'a pas suffi) et les réponses vides.
|
||||
const trimmed = (body || "").trim().toLowerCase();
|
||||
const looksLikeError = trimmed.includes("error")
|
||||
|| trimmed.includes("erreur")
|
||||
|| trimmed.includes("unknown function")
|
||||
|| trimmed.includes("fonction inconnue")
|
||||
|| trimmed.includes("<html");
|
||||
|| trimmed.includes("<html")
|
||||
|| trimmed.includes("window.location.href"); // CSRF
|
||||
if (!looksLikeError) {
|
||||
console.log(`[bg] → suppression OK avec function_name=${fn}`);
|
||||
return { status: r.status, functionName: fn, body: body.substring(0, 200) };
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"manifest_version": 3,
|
||||
"name": "Planification",
|
||||
"version": "5.0.12",
|
||||
"version": "5.0.13",
|
||||
"description": "Vue claire et rapide du planning des techniciens EasyVista. Regroupe interventions et réservations par tech, affiche horaires, contact, lieu, catégorie et statut en un coup d'œil.",
|
||||
"permissions": ["activeTab", "scripting", "storage", "tabs", "alarms"],
|
||||
"host_permissions": [
|
||||
|
||||
@@ -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