Planification: application de modèle consciente des absences (permanent vs vacances)

applyTemplate respecte maintenant les absences : on n'assigne pas un tech absent ce jour-là.
- Absent toute la semaine (≈ congé permanent: maternité/blessure) → signalé « à remplacer » (warning).
- Absent quelques jours (≈ vacances) → ces jours sautés, le reste du patron tient.
Le toast résume: N assignations, absences partielles ignorées, et qui est à remplacer (avec le type).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
louispaulb 2026-06-04 20:16:05 -04:00
parent 9261692c7f
commit cdd72856a4

View File

@ -572,11 +572,32 @@ function saveTemplate () {
})
}
function deleteTemplate (i) { weekTemplates.value = weekTemplates.value.filter((_, j) => j !== i); localStorage.setItem(LS_TPL, JSON.stringify(weekTemplates.value)) }
function countPatternDays (tm, techId) { let n = 0; for (const d of dayList.value) { const map = tm.byDow[dowOf(d.iso)]; if (map && map[techId]) n++ } return n }
// Application « consciente des absences » : on n'assigne pas un tech absent ce jour-là.
// Absent toute la semaine ( congé permanent: maternité/blessure) flag « à remplacer ».
// Absent quelques jours ( vacances) on saute juste ces jours, le reste du patron tient.
function applyTemplate (tm) {
pushHistory()
for (const d of dayList.value) { const map = tm.byDow[dowOf(d.iso)]; if (!map) continue
for (const techId in map) { const tpl = tplByName.value[map[techId]]; if (!tpl) continue; const t = techs.value.find(x => x.id === techId); setCellReplace(techId, t ? t.name : techId, d.iso, tpl) } }
$q.notify({ type: 'info', message: 'Modèle « ' + tm.name + ' » appliqué — Publier pour confirmer' })
const skipped = {}; let applied = 0
for (const d of dayList.value) {
const map = tm.byDow[dowOf(d.iso)]; if (!map) continue
for (const techId in map) {
if (isAbsent(techId, d.iso)) { skipped[techId] = (skipped[techId] || 0) + 1; continue }
const tpl = tplByName.value[map[techId]]; if (!tpl) continue
const t = techs.value.find(x => x.id === techId); setCellReplace(techId, t ? t.name : techId, d.iso, tpl); applied++
}
}
const fullOut = []; const partial = []
for (const techId in skipped) {
const t = techs.value.find(x => x.id === techId); const name = (t ? t.name : techId)
const type = absByTechDay.value[techId + '|' + (dayList.value.find(d => isAbsent(techId, d.iso)) || {}).iso] || ''
const lbl = name + (type ? ' (' + type + ')' : '')
if (skipped[techId] >= countPatternDays(tm, techId)) fullOut.push(lbl); else partial.push(lbl)
}
let msg = 'Modèle « ' + tm.name + ' » appliqué (' + applied + ' assignations)'
if (partial.length) msg += ' · absence partielle ignorée : ' + partial.join(', ')
if (fullOut.length) msg += ' · ABSENT toute la semaine — à remplacer : ' + fullOut.join(', ')
$q.notify({ type: fullOut.length ? 'warning' : 'positive', message: msg, timeout: fullOut.length ? 9000 : 4500, multiLine: true })
}
// édition + sélection