gigafibre-fsm/services/targo-hub/lib/categories.js
louispaulb 19d31025a6 feat(inbox+historique): sender-identity fix, single-source taxonomy, dispatch history & leaderboards
Inbox identity/grouping (fixes mislabeled threads):
- customerName = real From display name, then a customer matched BY EMAIL,
  then the raw address — never the AI's content-guessed name (a gilles@ relay
  showed as "Sylvie Juteau").
- never group a thread by one of our own domains (support@targo.ca,
  *@targointernet.com): re-ingested outbound was collapsing unrelated threads
  into one mislabeled "Guylaine Gagnon" thread.

Refactor: queues/TYPES/QUEUE_OF/CAT centralized in lib/categories.js (were
drifting across conversation.js + inbox-triage.js; telephonie/television had
no matching triage type). Removed dead export findConversationByEmail.

Feat: addMessage stamps msg.agent on outbound replies -> per-agent stats.

Historique (/historique, HistoriquePage.vue): tournées par technicien (ALL
statuses incl. Completed/Cancelled — the board hid them), tech leaderboard,
inbox leaderboard. Hub: /dispatch/history, /dispatch/leaderboard,
/conversations/leaderboard.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-15 06:11:47 -04:00

34 lines
1.7 KiB
JavaScript

// ── Taxonomie des conversations — SOURCE UNIQUE ───────────────────────────────
// Avant : le « type » d'une conversation vivait dans 4 endroits désynchronisables
// - TYPES + l'énumération du prompt IA → inbox-triage.js
// - QUEUE_OF (type→file) + QUEUES → conversation.js
// Conséquence réelle : `telephonie`/`television` existaient dans QUEUE_OF mais PAS
// dans TYPES → jamais produits par le triage (clés inertes). On centralise ici pour
// que toute évolution de catégorie se fasse à UN seul endroit.
//
// ⚠️ CONTRAT : le prompt système de `classifyEmail` (inbox-triage.js) énumère les
// valeurs de TYPES À LA MAIN (contrainte du modèle). Si tu ajoutes un type ici,
// ajoute-le AUSSI dans cette énumération du prompt, sinon le triage ne le produira pas.
// Les 4 FILES de l'inbox partagé (= labels F fiables, vs 30 départements).
const QUEUES = ['Facturations', 'Service à la clientèle', 'Supports', 'Technicien']
// Types de demande que le triage peut produire (doivent matcher l'énumération du prompt IA).
const TYPES = ['support', 'facturation', 'vente', 'installation', 'autre']
// type → FILE de routage. (telephonie/television : réservés — routent vers Technicien si un jour produits.)
const QUEUE_OF = {
facturation: 'Facturations',
vente: 'Service à la clientèle',
support: 'Supports',
installation: 'Technicien',
telephonie: 'Technicien',
television: 'Technicien',
autre: '',
}
// type → catégorie de TICKET (ERPNext Issue).
const CAT = { facturation: 'Facturation', vente: 'Commercial', installation: 'Installation', support: 'Support', autre: 'Autre' }
module.exports = { QUEUES, TYPES, QUEUE_OF, CAT }