# Planification (Roster AI) & assignation dispatch — Handoff dev Grille hebdomadaire **ressources × jours** pour planifier les quarts, la garde, et **prendre en charge les jobs dispatch** (glisser-déposer, timeline, occupation). Aucune paie : on planifie, on approuve, on assigne. ## Surfaces | Couche | Fichier | Rôle | |---|---|---| | UI Ops | `apps/ops/src/pages/PlanificationPage.vue` | Grille, garde, panneau « jobs à assigner », timeline ressource, dialogues d'impact | | Client API | `apps/ops/src/api/roster.js` | Wrappers `fetch` vers `targo-hub /roster/*` | | Backend | `services/targo-hub/lib/roster.js` | Endpoints, accès ERPNext, moteur de créneaux, orchestration solveur | | Copilote | `services/targo-hub/lib/roster-assistant.js` | Actions d'écriture en langage naturel (réassign / SMS / escalade) | | Solveur | `services/roster-solver/` (conteneur OR-Tools, réseau `erpnext_erpnext:8090`) | Propose un horaire (ne publie jamais) | | RDV client | `apps/ops/src/pages/RendezVousPage.vue`, portail Lovable | Prise de rendez-vous (booking) roster-aware | ## Doctypes ERPNext (site facturation `erp.gigafibre.ca`) - **Dispatch Technician** — ressources. Custom fields clés (cf. `dispatch-app/frappe-setup/setup_dispatch_custom_fields.py`) : `efficiency` (cadence globale), `skills` (CSV), `skill_levels` (JSON `{compétence:1-5}` = maîtrise), `skill_eff` (JSON `{compétence:facteur}` = vitesse par compétence), `cost_salary_h`/`cost_charges_pct`/`cost_other_h`. - **Shift Template** — quarts. `on_call` (garde : capacité de réserve, **jamais** offerte au booking). - **Shift Requirement** — besoins de couverture (« dispo vs requis »). - **Shift Assignment** — assignations (statut Proposé/Publié). Le solveur propose, `/publish` écrit. - **Tech Availability** — congés/absences (Approuvé). `long_term` = à remplacer (≠ vacances ponctuelles). - **Dispatch Job** — les tickets. Champs utilisés ici : `assigned_tech`, `scheduled_date`, `start_time`, `duration_h`, `priority`, `parent_job`/`depends_on`/`step_order` (groupes), `booking_*`, `required_skill`. ## Concepts UI (PlanificationPage.vue — voir la carte des sections en tête de `