diff --git a/apps/ops/src/pages/PlanificationPage.vue b/apps/ops/src/pages/PlanificationPage.vue
index dc32b68..bf18eb1 100644
--- a/apps/ops/src/pages/PlanificationPage.vue
+++ b/apps/ops/src/pages/PlanificationPage.vue
@@ -290,14 +290,18 @@
-
+
-
Ordre de rotation :
-
-
{{ i + 1 }}.
-
{{ techName(id) }}
-
-
+
Séquence de rotation ({{ newGardeRule.techs.length }} positions — doublons permis pour des tours inégaux) :
+
+ {{ i + 1 }}.
+
+ Monter
+ Descendre
+ Retirer
@@ -603,8 +607,8 @@ function loadLS () { try { demand.value = JSON.parse(localStorage.getItem(LS_DEM
const GARDE_EPOCH = '2026-01-05' // lundi de référence pour l'index de semaine
const gardeTemplateOptions = computed(() => templates.value.slice().sort((a, b) => (b.on_call ? 1 : 0) - (a.on_call ? 1 : 0)).map(t => ({ label: t.template_name + (t.on_call ? ' 🛡️' : ''), value: t.name })))
const groupNames = computed(() => [...new Set(techs.value.map(t => t.group).filter(Boolean))].sort())
-const editingGardeId = ref(null)
-function techName (id) { const t = techs.value.find(x => x.id === id); return t ? t.name : id }
+const editingGardeId = ref(null); const gardePick = ref(null)
+function addTechToSeq () { if (gardePick.value) { newGardeRule.techs.push(gardePick.value); gardePick.value = null } } // doublons permis (tours inégaux)
function moveTech (i, dir) { const a = newGardeRule.techs; const j = i + dir; if (j < 0 || j >= a.length) return; const x = a[i]; a.splice(i, 1); a.splice(j, 0, x) }
function editGardeRule (r) { Object.assign(newGardeRule, { dept: r.dept || '', shift: r.shift, weekdays: [...r.weekdays], periodWeeks: r.periodWeeks || 1, techs: [...r.techs] }); editingGardeId.value = r.id }
function d2ms (iso) { const a = iso.split('-').map(Number); return Date.UTC(a[0], a[1] - 1, a[2]) }