diff --git a/apps/ops/src/api/roster.js b/apps/ops/src/api/roster.js index 4cc3dc3..82a5f74 100644 --- a/apps/ops/src/api/roster.js +++ b/apps/ops/src/api/roster.js @@ -66,6 +66,8 @@ export const groupJobs = (parent, children) => jpost('/roster/job-group', { pare export const postJobComment = ({ job, lid, text, isPublic, agentName }) => jpost('/roster/job-comment', { job, lid, text, public: !!isPublic, agentName: agentName || '' }) // #5 — Réserver le temps d'un tech (bloc « Réservation » priorité moyenne) → dé-priorise au dispatch auto + soustrait des créneaux. export const reserveTech = ({ tech, date, start_time, duration_h, reason }) => jpost('/roster/reserve', { tech, date, start_time, duration_h, reason }) +// Job « bouche-trou » : job générique standard assigné → retire le tech du dispatch (option : génère un ticket). +export const createFillerJob = (body) => jpost('/roster/filler-job', body || {}) export async function deleteShiftTemplate (name) { const r = await fetch(HUB + '/roster/template/' + encodeURIComponent(name), { method: 'DELETE' }) if (!r.ok) throw new Error('Suppression modèle: ' + r.status) diff --git a/apps/ops/src/components/planif/PlanifCellMenu.vue b/apps/ops/src/components/planif/PlanifCellMenu.vue index e0158d1..01283e1 100644 --- a/apps/ops/src/components/planif/PlanifCellMenu.vue +++ b/apps/ops/src/components/planif/PlanifCellMenu.vue @@ -31,6 +31,12 @@ + + + + Bloquer / job générique…Occupe la journée (durée éditable) · retire du dispatch · ticket + + {{ a.shift_name || a.shift }} {{ a.hours }}h @@ -58,7 +64,7 @@ const props = defineProps({ cellKey: { type: String, default: '' }, // change à chaque (ré)ouverture → réinitialise saisie/slider showCopy: { type: Boolean, default: true }, }) -const emit = defineEmits(['window', 'toggle-garde', 'toggle-absent', 'remove-shift', 'clear', 'copy', 'paste']) +const emit = defineEmits(['window', 'toggle-garde', 'toggle-absent', 'remove-shift', 'clear', 'copy', 'paste', 'filler']) const quickEntry = ref('') const range = ref({ min: props.initialRange.min, max: props.initialRange.max }) // Réinitialise à chaque ouverture sur une nouvelle cellule (le composant reste monté, seul le q-menu parent s'affiche/masque). diff --git a/apps/ops/src/pages/PlanificationPage.vue b/apps/ops/src/pages/PlanificationPage.vue index fbd63dd..07a9472 100644 --- a/apps/ops/src/pages/PlanificationPage.vue +++ b/apps/ops/src/pages/PlanificationPage.vue @@ -254,38 +254,7 @@
-
À assigner {{ poolJobs.length }}prio
-
- - -
-
- - -
Rien à assigner 🎉
-
+
@@ -501,6 +470,8 @@ Envoyer à chaque tech (SMS/courriel) le lien de sa tournée + les infos clés (adresse · AM/PM · urgent). Aperçu avant envoi. Positions GPS des techs (Traccar), rafraîchies ~25 s. Cliquer pour {{ showLivePos ? 'masquer' : 'afficher' }}. + + Parcours GPS réel (Traccar) de {{ soloRouteTech.name }} ce jour — trait orange superposé à la tournée prévue. S'affiche quand une seule tournée est isolée. {{ dayRoutes.length }} tournée(s) · clic tech = zoom · clic arrêt = détail
@@ -537,7 +508,7 @@ - +
{{ r.name }} @@ -550,19 +521,7 @@
-
 À assigner {{ kanbanPoolView.length }}
-
- - -
-
-
-
 {{ j.subject || j.service_type || j.name }}
-
{{ j.est_min ? fmtMin(j.est_min) : ((j.duration_h || 1) + 'h') }}
- {{ j.subject || j.service_type }} -
-
— rien à assigner —
-
+
@@ -899,36 +858,13 @@
- Jobs à assigner ({{ assignTypeFilter.length ? assignJobsFiltered.length + '/' + assignPanel.jobs.length : assignPanel.jobs.length }}) + Jobs à assigner ({{ floatingPool.skillFilter.length ? floatingPool.filteredJobs.length + '/' + assignPanel.jobs.length : assignPanel.jobs.length }}) Localiser les {{ assignNoCoord }} job(s) sans coordonnées : adresse → base RQA + GPS (ils apparaissent ensuite sur la carte) Proposer une répartition optimisée (proximité · charge · compétence){{ suggestFiltered ? ' — ' + suggestJobCount + ' job(s) ' + suggestScope : '' }} — tu revois et ajustes avant d'appliquer Carte des jobs (regrouper par région)
-
- Trier : - - {{ assignSortDir === 'asc' ? 'Croissant (ancien → récent)' : 'Décroissant (récent → ancien)' }} - {{ allCollapsed ? 'Tout déplier' : 'Tout replier (voir un seul groupe)' }} - - Tout désélectionner -
-
- {{ t.k }} {{ t.n }} - Tout afficher -
-
- - {{ d.label }} {{ d.n }} - Toutes les dates -
@@ -936,60 +872,8 @@ {{ assignLasso ? 'Lasso ACTIF — trace une zone à main levée pour sélectionner les jobs dedans (reclique pour quitter)' : 'Lasso : encercler un groupe de jobs (tracé libre)' }}
📍 Pins par compétence · amas = total de jobs (clic = zoom) · lasso = sélectionner une zone · ⚠ {{ assignNoCoord }} sans coords
-
-
Chargement…
-
Aucun job à assigner 🎉
-
-
{{ grp.label }} ({{ grp.jobs.length }})Sélectionner / désélectionner tout ce groupe
- -
-
+
Chargement…
+