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>
34 lines
1.7 KiB
JavaScript
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 }
|