espace-paie-odentas/EMAIL_SUPPORT_REPLY_IMPROVEMENTS.md

6.9 KiB

📧 Email de réponse support - Template amélioré

Modifications appliquées

1. InfoCard standardisée

L'email de réponse au ticket support utilise maintenant la même structure que les autres notifications :

Première card (InfoCard) :

  • Votre structure : Nom de l'organisation
  • Votre code employeur : Code depuis organization_details.code_employeur
  • Votre gestionnaire : Renaud BREVIERE-ABRAHAM (forcé)

2. DetailsCard enrichie

Deuxième card (Message) :

  • Répondant : Prénom du staff avec majuscule automatique + "[Staff Odentas]"
  • Sujet : Sujet du ticket
  • Réponse : Message du staff

3. Formatage automatique du nom du staff

// Exemple : "renaud" devient "Renaud [Staff Odentas]"
const formattedStaffName = data.staffName.charAt(0).toUpperCase() + 
                          data.staffName.slice(1) + 
                          ' [Staff Odentas]';

📊 Structure du template

┌─────────────────────────────────────────────────────┐
│  Bonjour Jean,                                       │
│                                                      │
│  Vous avez reçu une nouvelle réponse                │
│  à votre ticket support.                            │
│                                                      │
│  ┌──────────────────────────────────────────────┐  │
│  │  Informations                                 │  │
│  │                                               │  │
│  │  Votre structure: Entreprise ABC             │  │
│  │  Votre code employeur: 12345                 │  │
│  │  Votre gestionnaire: Renaud BREVIERE-ABRAHAM │  │
│  └──────────────────────────────────────────────┘  │
│                                                      │
│  ┌──────────────────────────────────────────────┐  │
│  │  Message                                      │  │
│  │                                               │  │
│  │  Répondant: Renaud [Staff Odentas]           │  │
│  │  Sujet: Mon problème de paie                 │  │
│  │  Réponse: Bonjour, voici la solution...      │  │
│  └──────────────────────────────────────────────┘  │
│                                                      │
│           ┌──────────────────────┐                  │
│           │   Voir le ticket    │                  │
│           └──────────────────────┘                  │
└─────────────────────────────────────────────────────┘

🗂️ Sources de données

Donnée Source Champ
Nom organisation organizations name
Code employeur organization_details code_employeur
Gestionnaire Forcé "Renaud BREVIERE-ABRAHAM"
Prénom staff auth.users.user_metadata display_name ou first_name
Sujet ticket tickets subject
Message Corps du message POST body

💻 Code modifié

1. /lib/emailTemplateService.ts

infoCard: {
  title: 'Informations',
  items: [
    { label: 'Votre structure', value: 'organizationName' },
    { label: 'Votre code employeur', value: 'employerCode' },
    { label: 'Votre gestionnaire', value: 'handlerName' },
  ],
},
detailsCard: {
  title: 'Message',
  items: [
    { label: 'Répondant', value: 'staffName' },
    { label: 'Sujet', value: 'ticketSubject' },
    { label: 'Réponse', value: 'staffMessage' },
  ],
},

2. /lib/emailMigrationHelpers.ts

export async function sendSupportReplyEmail(
  toEmail: string,
  data: {
    firstName?: string;
    ticketId: string;
    ticketSubject: string;
    staffName: string;
    staffMessage: string;
    organizationName?: string;
    employerCode?: string;  // ⭐ Nouveau : code depuis organization_details
  }
) {
  // ⭐ Formatage automatique : majuscule + [Staff Odentas]
  const formattedStaffName = data.staffName.charAt(0).toUpperCase() + 
                            data.staffName.slice(1) + 
                            ' [Staff Odentas]';
  
  const emailData: EmailDataV2 = {
    firstName: data.firstName,
    ticketId: data.ticketId,
    ticketSubject: data.ticketSubject,
    staffName: formattedStaffName,
    staffMessage: data.staffMessage,
    organizationName: data.organizationName || 'Non définie',
    employerCode: data.employerCode || 'Non défini',  // ⭐ Nouveau
    handlerName: 'Renaud BREVIERE-ABRAHAM',  // ⭐ Forcé
    ctaUrl: `${process.env.NEXT_PUBLIC_BASE_URL}/support/${data.ticketId}`,
  };

  await sendUniversalEmailV2({
    type: 'support-reply',
    toEmail,
    subject: `Nouvelle réponse à votre ticket: ${data.ticketSubject}`,
    data: emailData,
  });
}

3. /app/api/tickets/[id]/messages/route.ts

// ⭐ Récupération du code employeur
const { data: orgDetails } = await sb
  .from("organization_details")
  .select("code_employeur")
  .eq("org_id", ticket.org_id)
  .maybeSingle();

// Envoi de l'email avec les nouvelles données
await sendSupportReplyEmail(creatorUser.user.email, {
  firstName,
  ticketId: ticket.id,
  ticketSubject: ticket.subject,
  staffName,
  staffMessage: text,
  organizationName: organization?.name,
  employerCode: orgDetails?.code_employeur,  // ⭐ Code employeur
});

📋 Logs de debug

Dans le terminal, vous verrez :

📧 [POST messages] Organization: { name: 'Entreprise ABC', structure_api: 'abc' }
📧 [POST messages] Org details: { code_employeur: '12345' }
📧 [POST messages] Données email: {
  firstName: 'Jean',
  staffName: 'renaud',
  ticketId: 'xxx-xxx-xxx',
  ticketSubject: 'Mon problème',
  organizationName: 'Entreprise ABC',
  employerCode: '12345'
}

Le nom du staff sera automatiquement formaté en : Renaud [Staff Odentas]

Résultat

Les emails de réponse au ticket support ont maintenant :

  • La même structure que les autres notifications
  • Le code employeur correct depuis organization_details
  • Le gestionnaire forcé à "Renaud BREVIERE-ABRAHAM"
  • Le nom du staff formaté avec majuscule + badge "[Staff Odentas]"
  • Toutes les informations importantes dans la première card
  • Les détails du message dans la deuxième card

Améliorations appliquées le 14 octobre 2025