#!/usr/bin/env python3 """ Exercice 4: CRM et suivi - Simuler un prospect conducteur → passage en client actif - Créer un ticket de support "retard de trajet" """ import xmlrpc.client from datetime import datetime # Configuration url = 'http://localhost:8069' db = 'covoiturage_db' username = 'admin' password = 'admin' # Connexion à Odoo common = xmlrpc.client.ServerProxy('{}/xmlrpc/2/common'.format(url)) uid = common.authenticate(db, username, password, {}) if not uid: print("Erreur: Impossible de se connecter à Odoo") exit(1) print(f"Connecté en tant qu'utilisateur ID: {uid}") models = xmlrpc.client.ServerProxy('{}/xmlrpc/2/object'.format(url)) print("\n" + "="*60) print("EXERCICE 4: CRM ET SUIVI") print("="*60) # ===== PARTIE 1: Pipeline prospect conducteur ===== print("\n### PARTIE 1: Pipeline Prospect Conducteur ###") print("\n1. Création d'un prospect conducteur...") try: # Rechercher l'équipe de vente par défaut team_ids = models.execute_kw(db, uid, password, 'crm.team', 'search', [[]], {'limit': 1}) team_id = team_ids[0] if team_ids else False # Créer un prospect (lead) lead_id = models.execute_kw(db, uid, password, 'crm.lead', 'create', [{ 'name': 'Nouveau conducteur potentiel - Pierre Durand', 'type': 'lead', 'team_id': team_id, 'user_id': uid, 'partner_name': 'Pierre Durand', 'email_from': 'pierre.durand@email.fr', 'phone': '+33 6 11 22 33 44', 'street': '42 Rue de la République', 'city': 'Nantes', 'zip': '44000', 'country_id': 75, # France 'description': ''' Prospect conducteur intéressé pour rejoindre Covoit'Ouest. Profil: - Âge: 35 ans - Véhicule: Renault Mégane (5 places) - Trajet régulier: Nantes ↔ La Rochelle - Fréquence: 3 fois par semaine - Motivations: Réduire les coûts de transport, aspect écologique Points à valider: - Vérification permis de conduire - Contrôle technique du véhicule - Assurance covoiturage ''', 'priority': '2', # Medium }]) print(f" ✓ Prospect créé (ID: {lead_id})") # Lire les informations du lead lead_info = models.execute_kw(db, uid, password, 'crm.lead', 'read', [[lead_id]], {'fields': ['name', 'stage_id', 'type']}) print(f" ✓ Nom: {lead_info[0]['name']}") print(f" ✓ Étape: {lead_info[0]['stage_id'][1] if lead_info[0]['stage_id'] else 'Aucune'}") except Exception as e: print(f" ✗ Erreur: {e}") exit(1) print("\n2. Progression du prospect dans le pipeline...") try: # Récupérer les étapes du pipeline stages = models.execute_kw(db, uid, password, 'crm.stage', 'search_read', [[]], {'fields': ['name', 'sequence'], 'order': 'sequence'}) print(f" Étapes disponibles:") for stage in stages[:3]: # Afficher les 3 premières print(f" - {stage['name']}") # Avancer le lead à l'étape "Qualified" si elle existe qualified_stage = models.execute_kw(db, uid, password, 'crm.stage', 'search', [[('name', 'ilike', 'qualified')]], {'limit': 1}) if qualified_stage: models.execute_kw(db, uid, password, 'crm.lead', 'write', [[lead_id], {'stage_id': qualified_stage[0]}]) print(f" ✓ Prospect qualifié et avancé dans le pipeline") except Exception as e: print(f" ⚠ Info: {e}") print("\n3. Conversion du prospect en client actif...") try: # Convertir le lead en opportunité et créer un contact models.execute_kw(db, uid, password, 'crm.lead', 'convert_opportunity', [[lead_id], lead_id]) print(f" ✓ Lead converti en opportunité") # Créer le contact partenaire partner_id = models.execute_kw(db, uid, password, 'res.partner', 'create', [{ 'name': 'Pierre Durand', 'email': 'pierre.durand@email.fr', 'phone': '+33 6 11 22 33 44', 'street': '42 Rue de la République', 'city': 'Nantes', 'zip': '44000', 'country_id': 75, 'is_company': False, 'comment': 'Conducteur actif - Covoit\'Ouest\nInscrit le: ' + datetime.now().strftime('%Y-%m-%d'), }]) print(f" ✓ Contact partenaire créé (ID: {partner_id})") # Lier le partenaire à l'opportunité models.execute_kw(db, uid, password, 'crm.lead', 'write', [[lead_id], {'partner_id': partner_id, 'type': 'opportunity'}]) print(f" ✓ Prospect → Client actif: Pierre Durand est maintenant conducteur Covoit'Ouest") except Exception as e: print(f" ⚠ Erreur lors de la conversion: {e}") print("\n4. Marquage de l'opportunité comme gagnée...") try: # Marquer l'opportunité comme won models.execute_kw(db, uid, password, 'crm.lead', 'action_set_won', [[lead_id]]) print(f" ✓ Opportunité gagnée!") except Exception as e: print(f" ⚠ Info: {e}") # ===== PARTIE 2: Ticket de support ===== print("\n### PARTIE 2: Ticket de Support ###") print("\n5. Création d'un ticket de support 'Retard de trajet'...") try: # Récupérer un passager existant (Marie Martin créée dans l'exercice 3) passenger_ids = models.execute_kw(db, uid, password, 'res.partner', 'search', [[('email', '=', 'marie.martin@email.fr')]], {'limit': 1}) if passenger_ids: passenger_id = passenger_ids[0] else: # Créer un passager par défaut passenger_id = models.execute_kw(db, uid, password, 'res.partner', 'create', [{ 'name': 'Marie Martin', 'email': 'marie.martin@email.fr', 'phone': '+33 6 98 76 54 32', }]) # Créer une activité de type "To Do" pour représenter le ticket activity_type_ids = models.execute_kw(db, uid, password, 'mail.activity.type', 'search', [[('name', '=', 'To Do')]], {'limit': 1}) if not activity_type_ids: # Créer un type d'activité "Support Client" si nécessaire activity_type_id = models.execute_kw(db, uid, password, 'mail.activity.type', 'create', [{ 'name': 'Support Client', 'icon': 'fa-life-ring', 'decoration_type': 'warning', }]) else: activity_type_id = activity_type_ids[0] # Créer l'activité (ticket) activity_id = models.execute_kw(db, uid, password, 'mail.activity', 'create', [{ 'res_model': 'res.partner', 'res_id': passenger_id, 'activity_type_id': activity_type_id, 'summary': 'Ticket Support: Retard de trajet', 'note': ''' **Type de demande**: Réclamation **Priorité**: Haute **Trajet concerné**: La Rochelle → Nantes du 15/10/2025 **Description du problème**: Le conducteur Jean Dupont a eu 30 minutes de retard au point de rendez-vous prévu à La Rochelle. La passagère Marie Martin a raté sa correspondance de train à Nantes. **Demande du client**: - Remboursement partiel du trajet - Compensation pour le train raté - Vérification du profil du conducteur **Actions à entreprendre**: 1. Contacter le conducteur pour vérifier la cause du retard 2. Proposer une compensation à la passagère 3. Mettre à jour le système de notification pour prévenir en cas de retard **Statut**: En cours de traitement **Assigné à**: Équipe Support ''', 'user_id': uid, 'date_deadline': datetime.now().strftime('%Y-%m-%d'), }]) print(f" ✓ Ticket de support créé (ID: {activity_id})") print(f" ✓ Client: Marie Martin") print(f" ✓ Sujet: Retard de trajet") print(f" ✓ Priorité: Haute") except Exception as e: print(f" ✗ Erreur: {e}") print("\n6. Ajout d'une note de suivi au ticket...") try: # Ajouter un message/note sur le partner pour le suivi message_id = models.execute_kw(db, uid, password, 'mail.message', 'create', [{ 'model': 'res.partner', 'res_id': passenger_id, 'message_type': 'comment', 'body': '''
Mise à jour du ticket
Date: ''' + datetime.now().strftime('%Y-%m-%d %H:%M') + '''
Statut: Résolu - Client satisfait
''', 'author_id': 2, # OdooBot ou Admin }]) print(f" ✓ Note de suivi ajoutée au dossier client") except Exception as e: print(f" ⚠ Info: {e}") print("\n" + "="*60) print("EXERCICE 4: TERMINÉ AVEC SUCCÈS") print("="*60) print("\n### RÉSUMÉ ###") print("✓ Prospect conducteur créé: Pierre Durand") print("✓ Prospect qualifié et avancé dans le pipeline CRM") print("✓ Prospect converti en client actif (conducteur)") print("✓ Opportunité marquée comme gagnée") print("✓ Ticket de support créé: 'Retard de trajet'") print("✓ Note de suivi ajoutée avec résolution") print("\n### PROCHAINE ÉTAPE ###") print("Connectez-vous à Odoo pour vérifier:") print("1. CRM: CRM > Pipeline") print("2. Clients: Contacts > Clients") print("3. Activités: Rechercher 'Activités' dans la barre de recherche") print("4. Tableau de bord CRM: CRM > Reporting")