espace-paie-odentas/RESOLUTION_FINALE_TICKETS.md

4.4 KiB

🎉 RÉSOLUTION FINALE - Support Ticket Notifications

Problème résolu !

Le problème était une question de permissions Supabase.

🔍 Diagnostic

L'erreur était :

AuthApiError: User not allowed
code: 'not_admin'
status: 403

🎯 Cause racine

sb.auth.admin.getUserById() nécessite des permissions administrateur (clé service_role), mais le code utilisait createSbServer() qui utilise la clé anon (publique).

🔧 Solution appliquée

Fichiers modifiés :

  1. /app/api/tickets/[id]/recipient-info/route.ts

    // Ajout de l'import
    import { createSbServer, createSbServiceRole } from "@/lib/supabaseServer";
    
    // Utilisation du service role pour getUserById
    const sbAdmin = createSbServiceRole();
    const { data: creatorUser } = await sbAdmin.auth.admin.getUserById(ticket.created_by);
    
  2. /app/(app)/staff/tickets/[id]/page.tsx

    // Ajout de l'import
    import { createSbServer, createSbServiceRole } from "@/lib/supabaseServer";
    
    // Utilisation du service role pour getUserById
    const sbAdmin = createSbServiceRole();
    const { data: creatorUser } = await sbAdmin.auth.admin.getUserById(ticket.created_by);
    

🎬 Actions à faire maintenant

  1. Le serveur va recharger automatiquement (hot reload)
  2. Rechargez la page du ticket dans votre navigateur
  3. Vérifiez :
    • Le nom du créateur devrait s'afficher correctement
    • Le modal de confirmation devrait s'afficher quand vous cliquez sur "Envoyer"

📋 Ce qui devrait maintenant fonctionner

Sur la page /staff/tickets/[id] :

┌─────────────────────────────────────────┐
│ Organisation: Nom de l'entreprise       │
│ Ouvert par: Jean (ou email)             │  ← Maintenant correct !
└─────────────────────────────────────────┘

Dans le modal de confirmation :

┌─────────────────────────────────────────┐
│ Confirmer l'envoi de votre réponse      │
│                                          │
│ Destinataire                             │
│ 📧 jean@example.com                      │
│    Jean                                  │  ← Maintenant correct !
│                                          │
│ Message                                  │
│ [Votre message...]                       │
│                                          │
│ [Annuler]           [Envoyer ✉️]        │  ← Fonctionne !
└─────────────────────────────────────────┘

🔍 Logs attendus dans le terminal

Vous devriez maintenant voir :

📋 [ticket page] Ticket: { id: '...', created_by: '...', ... }
📋 [ticket page] Tentative getUserById pour: ...
📋 [ticket page] getUserById result: { hasData: true, hasUser: true, hasEmail: true, error: null }
📋 [ticket page] Email: user@example.com
📋 [ticket page] User metadata: { "display_name": "Jean", ... }
✅ [ticket page] Nom trouvé dans display_name: Jean

Et pour l'API :

📋 [recipient-info] Ticket ID: ...
📋 [recipient-info] Created by: ...
📋 [recipient-info] getUserById result: { hasData: true, hasUser: true, hasEmail: true, error: null }
📋 [recipient-info] User metadata: { "display_name": "Jean", ... }
✅ [recipient-info] Nom trouvé dans display_name: Jean

🎓 Leçon apprise

Important à retenir :

  1. auth.admin.getUserById() nécessite la clé service_role
  2. Utiliser createSbServer() pour les opérations normales
  3. Utiliser createSbServiceRole() pour les opérations admin
  4. Toujours vérifier les permissions AVANT d'utiliser le service role

📚 Documentation

Consultez :

  • SUPPORT_TICKET_NOTIFICATIONS_FIXES.md - Documentation complète des corrections
  • GUIDE_DEMARRAGE_TICKETS.md - Guide de démarrage et débogage

🚀 Testez maintenant !

  1. Rechargez la page du ticket
  2. Vérifiez que le nom s'affiche
  3. Essayez d'envoyer un message (sans cocher "Note interne")
  4. Le modal devrait s'afficher avec toutes les infos !

Résolution finale - 14 octobre 2025