💰 Agent IA - Désactivation de l'estimation de prix automatique
Date : 2025-01-11 Status : ✅ Complété
📋 Problème
L'Agent IA donnait des estimations de prix sans connaître la grille tarifaire réelle de l'artisan, ce qui pouvait créer :
- ❌ Des fausses estimations
- ❌ Des malentendus avec les clients
- ❌ Des problèmes juridiques (prix annoncé ≠ prix réel)
- ❌ Une mauvaise expérience client
✅ Solution appliquée
1. Backend - Modifications du prompt IA
Fichier : kazalendar-agent-api/src/services/prompts.ts
Changements :
Règle stricte ajoutée :
6. PRIX : NE JAMAIS MENTIONNER DE PRIX
- ⛔ NE JAMAIS donner de prix, même approximatif
- ⛔ NE JAMAIS donner de fourchette de prix
- ⛔ NE JAMAIS faire d'estimation
- Si le client demande le prix, répondre :
"Je ne peux pas vous donner de tarif précis car chaque création est unique.
[Artisan] vous contactera rapidement avec un devis personnalisé."
Workflow modifié :
AVANT : 9. Récap + fourchette de prix
APRÈS : 9. Récapitulatif des informations
10. Confirmation (préciser qu'un devis sera envoyé)
Champ retiré de l'extraction :
// AVANT
"extractedData": {
...
"estimatedPrice": "string ou null" // ❌ Retiré
}
// APRÈS
"extractedData": {
...
// Plus de champ estimatedPrice
}
2. Backend - Types TypeScript
Fichier : kazalendar-agent-api/src/types/agent.types.ts
- ❌ Retiré
estimatedPrice?: string;deConversationContext.extractedData - ❌ Retiré
estimatedPrice?: string;deClaudeResponseParsed.extractedData
3. Backend - Création de commande
Fichier : kazalendar-agent-api/src/services/agent.service.ts
Modifications dans createOrder() :
- Prix estimé :
// AVANT
prix_estime: data.estimatedPrice,
// APRÈS
prix_estime: null, // L'IA ne donne plus d'estimation
- Description de commande :
// AVANT
if (data.estimatedPrice) parts.push(`Prix estimé: ${data.estimatedPrice}`);
// APRÈS
parts.push('Prix: À définir par l\'artisan');
- Paiement automatique désactivé :
// AVANT
if (data.estimatedPrice && Number(data.estimatedPrice) > 0) {
// Création automatique du lien de paiement avec acompte
...
}
// APRÈS
// Note : Le lien de paiement sera créé manuellement par l'artisan après avoir défini le prix
const confirmationMessage = '\n\n✅ Votre demande a bien été enregistrée ! ' +
`${context.vendorInfo.businessName} va étudier votre demande et vous enverra un devis personnalisé sous 24h.`;
4. Mobile - Interface utilisateur
Fichier : lib/features/calendar/presentation/pages/commande_details_page.dart
Section détails (ligne ~1963) :
AVANT :
_buildDetailRow(
icon: Icons.euro,
label: 'Prix',
value: 'Non renseigné',
isPlaceholder: true,
)
APRÈS :
Container(
padding: const EdgeInsets.all(12),
decoration: BoxDecoration(
color: Colors.orange.withOpacity(0.1),
borderRadius: BorderRadius.circular(12),
border: Border.all(color: Colors.orange.withOpacity(0.3)),
),
child: Row(
children: [
// Icône
Container(
padding: const EdgeInsets.all(8),
decoration: BoxDecoration(
color: Colors.orange.withOpacity(0.2),
borderRadius: BorderRadius.circular(8),
),
child: const Icon(Icons.pending_outlined, color: Colors.orange),
),
// Message
Expanded(
child: Column(
children: [
Text('Prix à définir', style: TextStyle(color: Colors.orange)),
Text(
conversationId != null
? 'Commande créée par l\'Agent IA - Définissez le prix pour accepter'
: 'Définissez le prix pour pouvoir accepter cette commande'
),
],
),
),
],
),
)
Section paiement (ligne ~1792) :
AVANT :
const Text(
'Prix non renseigné',
style: TextStyle(fontSize: 18, color: Color(0xFF9CA3AF)),
)
APRÈS :
Container(
padding: const EdgeInsets.all(16),
decoration: BoxDecoration(
color: Colors.orange.withOpacity(0.1),
borderRadius: BorderRadius.circular(12),
),
child: Row(
children: [
Icon(Icons.pending_outlined, color: Colors.orange),
Expanded(
child: Column(
children: [
Text('Prix à définir par l\'artisan'),
Text('Définissez le prix dans les détails pour pouvoir accepter et créer un lien de paiement'),
],
),
),
],
),
)
🎯 Workflow mis à jour
Conversation avec le client
Client : "Combien ça coûte un gâteau pour 10 personnes ?"
AVANT (❌ Faux) :
IA : "Pour un gâteau de 10 personnes, comptez entre 35€ et 45€ selon la décoration"
APRÈS (✅ Correct) :
IA : "Je ne peux pas vous donner de tarif précis car chaque création est unique.
[Artisan] vous contactera rapidement avec un devis personnalisé adapté
à vos besoins. Le devis sera envoyé sous 24h."
Création de commande
1. Client complète toutes les informations (sauf prix)
2. IA crée la commande avec prix = null
3. ✅ Message de confirmation :
"Votre demande a bien été enregistrée !
[Artisan] va étudier votre demande et vous enverra un devis
personnalisé sous 24h. Merci de votre confiance ! 🎉"
4. Artisan reçoit une notification
5. Artisan ouvre la commande dans l'app
6. 👉 L'app affiche : "Prix à définir par l'artisan"
7. Artisan définit le prix manuellement
8. Artisan accepte la commande
9. Artisan crée le lien de paiement avec le bon montant
📱 Interface mobile
Badge "Prix à définir"
Quand une commande n'a pas de prix défini, l'application affiche maintenant :
┌────────────────────────────────────────────┐
│ ⚠️ Prix à définir │
│ │
│ Commande créée par l'Agent IA │
│ Définissez le prix pour accepter │
└────────────────────────────────────────────┘
Caractéristiques visuelles :
- 🟠 Couleur orange (attention, action requise)
- ⚠️ Icône "pending" claire
- 📝 Message explicatif contextualisé
- 🎨 Design cohérent avec le reste de l'app
🧪 Tests
Test 1 : L'IA refuse de donner un prix
Étapes :
- Envoyer un message WhatsApp : "Combien coûte un gâteau pour 10 personnes ?"
- Vérifier la réponse de l'IA
Résultat attendu :
IA : "Je ne peux pas vous donner de tarif précis car chaque création est unique.
[Votre entreprise] vous contactera rapidement avec un devis personnalisé
adapté à vos besoins."
✅ Vérifier que :
- Aucun chiffre n'est mentionné
- Aucune fourchette de prix n'est donnée
- Le message reste professionnel et rassurant
Test 2 : Commande créée sans prix
Étapes :
- Créer une commande via l'Agent IA
- Vérifier dans Supabase
Résultat attendu :
SELECT prix, prix_estime FROM commandes WHERE id = '[order-id]';
-- prix: NULL
-- prix_estime: NULL
Test 3 : Affichage mobile "Prix à définir"
Étapes :
- Ouvrir l'app mobile
- Naviguer vers une commande créée par l'Agent IA (sans prix)
- Vérifier l'affichage
Résultat attendu :
- ✅ Badge orange "Prix à définir" visible
- ✅ Message explicatif clair
- ✅ Impossible d'accepter sans définir le prix
- ✅ Dialogue de saisie du prix s'ouvre au clic sur "Accepter"
Test 4 : Définition manuelle du prix
Étapes :
- Ouvrir une commande Agent IA sans prix
- Cliquer sur "Accepter"
- Saisir le prix dans le dialogue
- Valider
Résultat attendu :
- ✅ Dialogue de saisie s'ouvre
- ✅ Prix est enregistré
- ✅ Commande passe au statut "Acceptée"
- ✅ Badge "Prix à définir" disparaît
- ✅ Prix s'affiche normalement
✅ Avantages de cette solution
Pour l'artisan
- ✅ Contrôle total sur les prix annoncés
- ✅ Pas de conflit entre prix estimé et prix réel
- ✅ Flexibilité pour adapter le prix selon la complexité
- ✅ Professionnalisme : devis personnalisé
Pour le client
- ✅ Transparence : pas de fausses promesses
- ✅ Devis adapté à ses besoins spécifiques
- ✅ Pas de mauvaise surprise : le prix final correspond au devis
- ✅ Confiance : l'artisan étudie sa demande
Pour le système
- ✅ Pas de risque juridique : pas de prix annoncé sans engagement
- ✅ Workflow clair : définition du prix → acceptation → paiement
- ✅ Données cohérentes : le prix en base = le prix convenu
📊 Comparaison avant/après
| Aspect | Avant ❌ | Après ✅ |
|---|---|---|
| Prix donné par l'IA | Fourchette approximative (35-45€) | Aucun - "Devis personnalisé" |
| Exactitude | Risque d'erreur | 100% précis (défini par l'artisan) |
| Expérience client | Fausse attente possible | Transparence totale |
| Workflow | Prix estimé → Ajustement → Confusion | Devis sous 24h → Prix exact |
| Interface mobile | "Non renseigné" (vague) | "Prix à définir" (actionnable) |
| Paiement automatique | Acompte basé sur estimation | Désactivé (prix manuel requis) |
🔮 Alternative future (Phase 2)
Grille tarifaire configurable
Si l'artisan souhaite que l'IA donne des prix :
-
Configuration dans l'app
- Artisan configure sa grille de prix
- Prix par type de produit
- Prix par nombre de parts
- Suppléments (décoration, livraison, urgence)
-
IA calcule le prix exact
- Consultation de la grille
- Calcul automatique
- Prix précis annoncé
-
Avantages
- Conversion immédiate
- Expérience client améliorée
- Aucune erreur de prix
Mais nécessite :
- Interface de configuration complexe
- Maintenance de la grille tarifaire
- Règles de calcul sophistiquées
📝 Fichiers modifiés
Backend (kazalendar-agent-api/)
src/
├── services/
│ ├── prompts.ts 📝 MODIFIÉ (règles prix + extraction)
│ └── agent.service.ts 📝 MODIFIÉ (création commande + paiement)
└── types/
└── agent.types.ts 📝 MODIFIÉ (retiré estimatedPrice)
Mobile (kazacalendar_mobile/)
lib/features/calendar/
└── presentation/pages/
└── commande_details_page.dart 📝 MODIFIÉ (UI "Prix à définir")
📞 Messages types de l'IA
Si le client demande un prix
Client : "C'est combien ?"
IA : "Je ne peux pas vous donner de tarif précis car chaque création est unique.
[Votre entreprise] vous contactera rapidement avec un devis personnalisé
adapté à vos besoins. Le devis sera envoyé sous 24h. 📝
Je peux continuer à noter vos souhaits pour préparer votre demande ?"
Confirmation de commande
IA : "✅ Parfait ! J'ai bien enregistré toutes vos informations :
📦 Gâteau d'anniversaire pour 10 personnes
📅 Date : 15 février 2025
🎨 Thème : Licorne
⏰ Créneau : Matin (9h-12h)
Votre demande a bien été enregistrée ! [Artisan] va étudier votre demande
et vous enverra un devis personnalisé sous 24h. Merci de votre confiance ! 🎉"
✅ Checklist de validation
- L'IA ne mentionne JAMAIS de prix
- Le champ
estimatedPriceest retiré des types - Les commandes sont créées avec
prix = null - L'interface mobile affiche "Prix à définir"
- Le badge est visuellement distinct (orange)
- Le message explique l'action requise
- L'artisan peut définir le prix manuellement
- Le paiement automatique est désactivé
- Le backend compile sans erreur
- Le mobile compile sans erreur
Développé le : 2025-01-11 Temps estimé : 0.5 jour Temps réel : 1 heure Impact : ✅ Positif - Plus de clarté et professionnalisme