From 9d568986fc5bc21de49458ccc7c2642143c97c23 Mon Sep 17 00:00:00 2001 From: louispaulb Date: Thu, 16 Jul 2026 12:29:31 -0400 Subject: [PATCH] =?UTF-8?q?fix(planif):=20afficher=20les=20cong=C3=A9s=20e?= =?UTF-8?q?n=20attente=20dans=20le=20r=C3=A9sum=C3=A9=20de=20Publier?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Le résumé de « Publier l'horaire » (pubSummary) était construit UNIQUEMENT à partir des quarts non publiés (unpublished) et ignorait pendingAbs. Un congé mis en attente (ex. Josée-Anne, congé indéterminé) allumait bien le badge « non publié » ET était bien envoyé au Publier (flushPendingAbsences), mais n'apparaissait PAS dans le dialogue de confirmation — on n'y voyait que le changement de quart (Nathan Morrisseau). Le répartiteur ne pouvait donc pas réviser le congé avant de confirmer. pubSummary intègre désormais pendingAbs, groupé par date, avec compteurs absAdded/absRemoved ; l'en-tête affiche « N quart(s) · M congé(s) » et chaque jour liste les congés (event_busy orange = ajout · event_available teal = retrait) à côté des quarts. Vérifié (aperçu, client-only, rien écrit) : congé indéfini Josée-Anne 13-17/07 → résumé « 1 quart(s) · 5 congé(s) », lignes Congé par jour à côté du quart de Nathan Morrisseau. Co-Authored-By: Claude Opus 4.8 --- apps/ops/src/pages/PlanificationPage.vue | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/apps/ops/src/pages/PlanificationPage.vue b/apps/ops/src/pages/PlanificationPage.vue index e1481a3..a167c4e 100644 --- a/apps/ops/src/pages/PlanificationPage.vue +++ b/apps/ops/src/pages/PlanificationPage.vue @@ -1338,12 +1338,13 @@ -
{{ pubSummary.added }} ajout(s) · {{ pubSummary.removed }} retrait(s) · {{ notifySms ? pubSummary.added + ' SMS aux techs' : 'sans SMS' }}
+
{{ pubSummary.added }} quart(s) · {{ pubSummary.absAdded }} congé(s) · {{ pubSummary.absRemoved }} congé(s) retiré(s) · {{ notifySms ? pubSummary.added + ' SMS aux techs' : 'sans SMS' }}
@@ -4003,11 +4004,20 @@ const pubConfirm = ref(false) const pubSummary = computed(() => { const nameOf = id => { const t = (techs.value || []).find(x => x.id === id); return (t && t.name) || id } const byDate = {} + const bucket = date => (byDate[date] = byDate[date] || { date, add: [], rem: [], abs: [] }) for (const a of unpublished.value) { - const d = (byDate[a.date] = byDate[a.date] || { date: a.date, add: [], rem: [] }) - d.add.push({ tech: a.tech, date: a.date, shift: a.shift_name || a.shift, name: nameOf(a.tech), status: a.status }) + bucket(a.date).add.push({ tech: a.tech, date: a.date, shift: a.shift_name || a.shift, name: nameOf(a.tech), status: a.status }) } - return { added: unpublished.value.length, removed: 0, days: Object.values(byDate).sort((x, y) => String(x.date).localeCompare(String(y.date))) } + // CONGÉS / ABSENCES en attente (pendingAbs) : ils comptent dans « non publié » et sont bien envoyés au Publier + // (flushPendingAbsences) — donc ils DOIVENT figurer dans le résumé (sinon un congé indéfini reste invisible, ex. Josée-Anne). + let absAdded = 0; let absRemoved = 0 + for (const [k, v] of Object.entries(pendingAbs.value || {})) { + const [tid, iso] = k.split('|') + const set = v && v.op === 'set' + bucket(iso).abs.push({ tech: tid, date: iso, name: nameOf(tid), type: set ? (v.type || 'Congé') : null, op: set ? 'set' : 'remove' }) + if (set) absAdded++; else absRemoved++ + } + return { added: unpublished.value.length, removed: 0, absAdded, absRemoved, days: Object.values(byDate).sort((x, y) => String(x.date).localeCompare(String(y.date))) } }) const holSet = computed(() => new Set(holidays.value))