Aller au contenu principal

💰 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; de ConversationContext.extractedData
  • ❌ Retiré estimatedPrice?: string; de ClaudeResponseParsed.extractedData

3. Backend - Création de commande

Fichier : kazalendar-agent-api/src/services/agent.service.ts

Modifications dans createOrder() :

  1. Prix estimé :
// AVANT
prix_estime: data.estimatedPrice,

// APRÈS
prix_estime: null, // L'IA ne donne plus d'estimation
  1. Description de commande :
// AVANT
if (data.estimatedPrice) parts.push(`Prix estimé: ${data.estimatedPrice}`);

// APRÈS
parts.push('Prix: À définir par l\'artisan');
  1. 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 :

  1. Envoyer un message WhatsApp : "Combien coûte un gâteau pour 10 personnes ?"
  2. 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 :

  1. Créer une commande via l'Agent IA
  2. 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 :

  1. Ouvrir l'app mobile
  2. Naviguer vers une commande créée par l'Agent IA (sans prix)
  3. 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 :

  1. Ouvrir une commande Agent IA sans prix
  2. Cliquer sur "Accepter"
  3. Saisir le prix dans le dialogue
  4. 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

AspectAvant ❌Après ✅
Prix donné par l'IAFourchette approximative (35-45€)Aucun - "Devis personnalisé"
ExactitudeRisque d'erreur100% précis (défini par l'artisan)
Expérience clientFausse attente possibleTransparence totale
WorkflowPrix estimé → Ajustement → ConfusionDevis sous 24h → Prix exact
Interface mobile"Non renseigné" (vague)"Prix à définir" (actionnable)
Paiement automatiqueAcompte basé sur estimationDésactivé (prix manuel requis)

🔮 Alternative future (Phase 2)

Grille tarifaire configurable

Si l'artisan souhaite que l'IA donne des prix :

  1. 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)
  2. IA calcule le prix exact

    • Consultation de la grille
    • Calcul automatique
    • Prix précis annoncé
  3. 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 estimatedPrice est 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