From 4abce6fd66db0f16910d74a0846c21af6602db52 Mon Sep 17 00:00:00 2001 From: louispaulb Date: Sun, 7 Jun 2026 22:32:00 -0400 Subject: [PATCH] =?UTF-8?q?feat(dispatch):=20pont=20d'=C3=A9criture=20lega?= =?UTF-8?q?cy=20+=20adresses/coords/carte/UX=20Planification?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pont d'écriture Ops → legacy osTicket via endpoint PHP token-gated (hérite des droits write de l'app facturation.targo.ca → AUCUN grant DB). Fidèle à ticket_view.php : réassignation (assign_to + participant[assistants] + followed_by + ticket_msg + lock respecté) + fermeture (status=closed + date_closed + closed_by + réouverture des enfants). Auteur du log = utilisateur Authentik réel (email → staff legacy par email/nom). Hub (legacy-dispatch-sync.js): - adresse de SERVICE importée (champ address) + reimportAddresses + fillMissingCoords - garde TERRITOIRE (rejette les homonymes hors-zone Gaspésie/Outaouais/Estrie) + centroïde CP/ville - purgeStaleOrphans (anciens imports TT- périmés), # ticket legacy dans titre + description - legacyWrite (POST form + X-Ops-Token lu d'un fichier), pushAssignments (reassign), closeTicketLegacy roster.js: occupancy + unassigned-jobs exposent address/latitude/longitude. Ops (PlanificationPage.vue): - carte des jobs à assigner (pins couleur=compétence + lettre repère liste↔carte), chips filtre par type, panneau ouvert par défaut - clics cellule: bande quart/garde + blocs jobs → tournée ; fond → menu horaire (fini le clic droit) - éditeur de tournée: itinéraire routier réel + adresse + fil ticket (expand), refresh occupation à l'assignation - bouton « Publier au legacy » (aperçu + ✕ désassigner) + « Fermer le ticket » - fix dates (lundi calculé en local — plus de décalage UTC) + nav ±1 jour services/legacy-bridge/ops_reassign.php: endpoint (placeholders; secrets injectés au déploiement, hors repo). scripts/migration: backfill_dispatch_address.sql + diagnostics. Co-Authored-By: Claude Opus 4.8 (1M context) --- apps/ops/src/api/roster.js | 7 + apps/ops/src/pages/PlanificationPage.vue | 295 +++++++++++++--- .../migration/backfill_dispatch_address.sql | 51 +++ scripts/migration/diag_dispatch_addr.sql | 25 ++ scripts/migration/diag_dispatch_addr2.sql | 22 ++ services/legacy-bridge/ops_reassign.php | 91 +++++ .../targo-hub/lib/legacy-dispatch-sync.js | 316 +++++++++++++++++- services/targo-hub/lib/roster.js | 6 +- 8 files changed, 765 insertions(+), 48 deletions(-) create mode 100644 scripts/migration/backfill_dispatch_address.sql create mode 100644 scripts/migration/diag_dispatch_addr.sql create mode 100644 scripts/migration/diag_dispatch_addr2.sql create mode 100644 services/legacy-bridge/ops_reassign.php diff --git a/apps/ops/src/api/roster.js b/apps/ops/src/api/roster.js index 519ee67..d35effb 100644 --- a/apps/ops/src/api/roster.js +++ b/apps/ops/src/api/roster.js @@ -91,6 +91,13 @@ export const jobCandidates = (job, exclude) => jget('/roster/job-candidates?job= export const redistributePlan = (plan) => jpost('/roster/skill-impact/redistribute', { plan }) // Jobs non assignés (+ groupe/dépendances) pour le panneau glisser-déposer export const unassignedJobs = () => jget('/roster/unassigned-jobs') +// Write-back legacy : aperçu (0 écriture) puis application (réassigne ticket.assign_to au tech dans osTicket) +export const pushLegacyPreview = () => jget('/dispatch/legacy-sync/push-assignments') +export const pushLegacyApply = () => jpost('/dispatch/legacy-sync/push-assignments', {}) +// Fil complet d'un ticket legacy (osTicket) : messages + réponses, pour l'expand au clic +export const ticketThread = (id) => jget('/dispatch/legacy-sync/ticket-thread?id=' + encodeURIComponent(id)) +// Fermer un ticket dans le legacy (status=closed + date_closed + closed_by=acteur + réouverture enfants) +export const closeLegacyTicket = (ticket) => jpost('/dispatch/legacy-sync/close-ticket?ticket=' + encodeURIComponent(ticket), {}) // Assigner un job à un tech (date = case déposée) export const assignJob = (job, tech, date) => jpost('/roster/assign-job', { job, tech, date }) // Fil complet d'un ticket legacy (description + commentaires/réponses des collaborateurs) — read-only diff --git a/apps/ops/src/pages/PlanificationPage.vue b/apps/ops/src/pages/PlanificationPage.vue index 30e4327..f6fc74c 100644 --- a/apps/ops/src/pages/PlanificationPage.vue +++ b/apps/ops/src/pages/PlanificationPage.vue @@ -7,9 +7,11 @@ {{ offShiftWeekCount }} hors quart{{ offShiftWeekCount }} job(s) assigné(s) cette période un jour où la ressource n'a AUCUN quart publié. Repère le ⚠ dans la grille → publier un quart ou réassigner. - Semaine précédente + Semaine précédente + Jour précédent - Semaine suivante + Jour suivant + Semaine suivante @@ -55,6 +57,7 @@ Notifier les techs par SMS à la publication + Réassigne les tickets aux techniciens DANS le système legacy (osTicket) selon l'assignation Ops — aperçu avant d'écrire. @@ -152,7 +155,6 @@
Ressource{{ hiddenCount }}{{ showHidden ? 'Cacher les ressources masquées' : (hiddenCount + ' masquée(s) — afficher en grisé') }}
{{ d.dow }}
{{ d.dnum }}
- {{ gapByDay[d.iso] }}
Marquer fériéF
@@ -177,18 +179,19 @@ {{ isHidden(t.id) ? 'Réafficher / considérer cette ressource' : 'Masquer & ignorer (hors front-line)' }} - +