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