From 8ee4c834f82e41ea05d56a5f67a49cb5f43cf1ba Mon Sep 17 00:00:00 2001 From: louispaulb Date: Tue, 7 Jul 2026 12:04:15 -0400 Subject: [PATCH] =?UTF-8?q?planif:=20retirer=20les=20jobs=20faits/annul?= =?UTF-8?q?=C3=A9s=20dat=C3=A9s=20dans=20le=20FUTUR=20(artefacts=20legacy)?= =?UTF-8?q?=20de=20l'occupation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit occupancyByTechDay incluait Completed/Cancelled (trace du tech). Un ticket F fermé mais à due_date FUTURE → le pont crée un Dispatch Job 'Completed' daté au futur (ex. LEG-250851, Completed, 2026-07-08) → il apparaissait comme travail à venir (surtout visible sur mobile, où le desktop l'estompe). Fix : on écarte les jobs faits/annulés dont scheduled_date > aujourd'hui (Est) ; la trace passée/du jour reste. Vérifié : 250851 absent de l'occupation après fix. Co-Authored-By: Claude Opus 4.8 --- services/targo-hub/lib/roster.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/services/targo-hub/lib/roster.js b/services/targo-hub/lib/roster.js index 64bdb80..6db3f03 100644 --- a/services/targo-hub/lib/roster.js +++ b/services/targo-hub/lib/roster.js @@ -1052,6 +1052,7 @@ async function statsByDay (start, days) { // → la grille Planification affiche la fenêtre du shift ET les blocs pris (donc les trous offrables). async function occupancyByTechDay (start, days) { const dates = rangeDates(start, days) + const TODAY_ET = new Date().toLocaleDateString('en-CA', { timeZone: 'America/Toronto' }) // aujourd'hui (Est) const jobs = await erp.list('Dispatch Job', { // Inclut Completed/Cancelled : la grille montre AUSSI le travail fait/annulé de la journée (trace du tech), // pas seulement le planifiable. (Filtrés par assigned_tech ci-dessous : les annulés « non assigné » n'apparaissent pas.) @@ -1069,6 +1070,9 @@ async function occupancyByTechDay (start, days) { const dur = estMin ? estMin / 60 : (Number(j.duration_h) || 0) // estimation additive (sinon duration_h) const done = j.status === 'Completed' const cancelled = j.status === 'Cancelled' + // Job FAIT/ANNULÉ daté dans le FUTUR = artefact (ticket F fermé mais due_date future via le pont legacy) → JAMAIS du travail à venir. + // On le retire du tableau (les 2 plateformes) ; la trace du travail passé/du jour (fait/annulé) reste affichée. + if ((done || cancelled) && j.scheduled_date && j.scheduled_date > TODAY_ET) continue if (!cancelled) o.h += dur // les annulés n'ont pas consommé de temps → hors capacité const skill = skillForJob(j) || deptToSkill(j.legacy_dept || j.job_type || j.subject) // compétence → couleur du bloc (palette skills) const s = j.start_time ? timeToH(j.start_time) : null