Aller au contenu principal

🔍 Problème : Les notifications WhatsApp ne sont plus envoyées lors de l'acceptation

📋 Diagnostic du système actuel

Comment fonctionne le système de notification

  1. Acceptation d'une commande créée par l'Agent IA :

    • L'utilisateur accepte la commande dans commande_details_page.dart
    • La fonction _updateCommandeStatus() met à jour le statut
    • Si la commande a un conversationId (créée par l'IA), _sendStatusChangeMessage() est appelé
    • Un message est inséré dans la table agent_messages avec ces métadonnées :
      metadata: {
      'type': 'system',
      'sent_from': 'mobile_app',
      }
  2. Le trigger Supabase détecte le message :

    • Le trigger send_whatsapp_message_trigger (fichier: supabase/migrations/create_whatsapp_message_trigger.sql)
    • Détecte les messages système provenant de l'app mobile
    • Récupère la configuration WhatsApp de l'utilisateur depuis vendor_whatsapp_config
    • Utilise l'extension pg_net de Supabase pour envoyer une requête HTTP à l'API WhatsApp

⚠️ Problèmes potentiels

1. Extension pg_net non activée ✅ VÉRIFIER EN PREMIER

Le trigger utilise net.http_post() qui nécessite l'extension pg_net de Supabase.

Comment vérifier et activer :

  1. Aller sur Supabase Dashboard → Votre projet
  2. DatabaseExtensions
  3. Chercher pg_net ou net
  4. Si elle n'est pas activée, cliquer sur Enable

Alternative : Activer via SQL

CREATE EXTENSION IF NOT EXISTS pg_net;

2. Configuration WhatsApp non valide

Vérifier que la configuration WhatsApp est correcte :

-- Vérifier la configuration WhatsApp de l'utilisateur
SELECT
user_id,
wa_phone_id,
wa_access_token,
is_active,
updated_at
FROM vendor_whatsapp_config
WHERE user_id = 'VOTRE_USER_ID'
AND is_active = true;

3. Le trigger n'est pas activé

Vérifier que le trigger existe :

-- Vérifier si le trigger existe
SELECT * FROM pg_trigger
WHERE tgname = 'trigger_send_whatsapp_message';

-- Vérifier si la fonction existe
SELECT * FROM pg_proc
WHERE proname = 'send_whatsapp_message_trigger';

Si le trigger n'existe pas, le recréer :

-- Exécuter le fichier de migration
\i supabase/migrations/create_whatsapp_message_trigger.sql

4. La conversation n'a pas de external_sender_id

Le trigger envoie le message au numéro stocké dans agent_conversations.external_sender_id :

-- Vérifier qu'une conversation a bien un external_sender_id
SELECT
id,
external_sender_id,
platform,
status,
client_name
FROM agent_conversations
WHERE id = 'CONVERSATION_ID';

🧪 Comment tester le système

Test 1 : Vérifier les logs du trigger

Après avoir accepté une commande, vérifier les logs dans Supabase :

  1. Supabase DashboardDatabaseLogs
  2. Chercher les logs avec [WHATSAPP_TRIGGER]
  3. Vérifier qu'il n'y a pas d'erreurs

Test 2 : Insérer manuellement un message test

-- Trouver une conversation active
SELECT id, external_sender_id FROM agent_conversations
WHERE status = 'active'
LIMIT 1;

-- Insérer un message test (remplacer CONVERSATION_ID)
INSERT INTO agent_messages (conversation_id, role, content, metadata)
VALUES (
'CONVERSATION_ID',
'assistant',
'🧪 Ceci est un message de test depuis Supabase',
'{"type": "system", "sent_from": "mobile_app"}'::jsonb
);

Si tout fonctionne, le client devrait recevoir ce message sur WhatsApp.

Test 3 : Vérifier les messages insérés

-- Voir les derniers messages système envoyés
SELECT
m.id,
m.conversation_id,
m.content,
m.metadata,
m.created_at,
c.external_sender_id,
c.client_name
FROM agent_messages m
JOIN agent_conversations c ON c.id = m.conversation_id
WHERE m.metadata->>'type' = 'system'
AND m.metadata->>'sent_from' = 'mobile_app'
ORDER BY m.created_at DESC
LIMIT 10;

✅ Solution recommandée

Option 1 : Activer pg_net (RECOMMANDÉ)

C'est la solution la plus simple si le trigger fonctionne déjà pour d'autres notifications.

  1. Activer l'extension pg_net dans Supabase Dashboard
  2. Tester en acceptant une commande

Option 2 : Utiliser une Edge Function

Si pg_net pose problème, créer une Edge Function Supabase :

// supabase/functions/send-whatsapp-notification/index.ts
import { serve } from "https://deno.land/std@0.168.0/http/server.ts"

serve(async (req) => {
try {
const { conversationId, message, userId } = await req.json()

// Récupérer la config WhatsApp
const { data: config } = await supabaseClient
.from('vendor_whatsapp_config')
.select('*')
.eq('user_id', userId)
.eq('is_active', true)
.single()

// Récupérer la conversation
const { data: conversation } = await supabaseClient
.from('agent_conversations')
.select('external_sender_id')
.eq('id', conversationId)
.single()

// Envoyer sur WhatsApp
const response = await fetch(
`https://graph.facebook.com/v18.0/${config.wa_phone_id}/messages`,
{
method: 'POST',
headers: {
'Authorization': `Bearer ${config.wa_access_token}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
messaging_product: 'whatsapp',
to: conversation.external_sender_id,
type: 'text',
text: { body: message }
})
}
)

return new Response(JSON.stringify({ success: true }), {
headers: { 'Content-Type': 'application/json' }
})
} catch (error) {
return new Response(JSON.stringify({ error: error.message }), {
status: 500,
headers: { 'Content-Type': 'application/json' }
})
}
})

Puis modifier le trigger pour appeler cette fonction :

-- Modifier le trigger pour utiliser une Edge Function
CREATE OR REPLACE FUNCTION send_whatsapp_message_trigger()
RETURNS TRIGGER AS $$
BEGIN
IF (NEW.metadata->>'type' = 'system' AND NEW.metadata->>'sent_from' = 'mobile_app') THEN
PERFORM net.http_post(
url := 'https://YOUR_PROJECT.supabase.co/functions/v1/send-whatsapp-notification',
headers := jsonb_build_object(
'Authorization', 'Bearer YOUR_ANON_KEY',
'Content-Type', 'application/json'
),
body := jsonb_build_object(
'conversationId', NEW.conversation_id::text,
'message', NEW.content,
'userId', (SELECT user_id FROM agent_conversations WHERE id = NEW.conversation_id)::text
)
);
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;

📝 Checklist de vérification

  • Extension pg_net activée dans Supabase
  • Trigger send_whatsapp_message_trigger existe et est actif
  • Configuration WhatsApp valide dans vendor_whatsapp_config
  • Les commandes créées par l'IA ont bien un conversationId
  • Les conversations ont un external_sender_id valide
  • Tester l'insertion manuelle d'un message test
  • Vérifier les logs Supabase pour les erreurs
  • Le token WhatsApp n'a pas expiré

🔗 Fichiers concernés

  • Trigger SQL : supabase/migrations/create_whatsapp_message_trigger.sql
  • Code Flutter : lib/features/calendar/presentation/pages/commande_details_page.dart (ligne 562-616)
  • Repository : lib/features/agent_ia/data/repositories/agent_repository_impl.dart (ligne 199-234)