#!/usr/bin/env python3 """ Exercice 3: Configuration métier - Créer un trajet "La Rochelle → Nantes" - Simuler la réservation d'un passager (devis → commande) - Générer la facture et marquer le paiement """ 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 3: CONFIGURATION MÉTIER") print("="*60) # ===== ÉTAPE 1: Créer les contacts (conducteur et passager) ===== print("\n### ÉTAPE 1: Création des contacts ###") # Créer le conducteur print("\n1. Création du conducteur...") try: existing_conductor = models.execute_kw(db, uid, password, 'res.partner', 'search', [[('email', '=', 'jean.dupont@email.fr')]]) if existing_conductor: conductor_id = existing_conductor[0] print(f" ✓ Conducteur existant trouvé (ID: {conductor_id})") else: conductor_id = models.execute_kw(db, uid, password, 'res.partner', 'create', [{ 'name': 'Jean Dupont', 'email': 'jean.dupont@email.fr', 'phone': '+33 6 12 34 56 78', 'street': '15 Rue du Port', 'city': 'La Rochelle', 'zip': '17000', 'country_id': 75, # France 'is_company': False, 'comment': 'Conducteur - Covoit\'Ouest', }]) print(f" ✓ Conducteur créé: Jean Dupont (ID: {conductor_id})") except Exception as e: print(f" ✗ Erreur: {e}") exit(1) # Créer le passager print("\n2. Création du passager...") try: existing_passenger = models.execute_kw(db, uid, password, 'res.partner', 'search', [[('email', '=', 'marie.martin@email.fr')]]) if existing_passenger: passenger_id = existing_passenger[0] print(f" ✓ Passager existant trouvé (ID: {passenger_id})") else: 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', 'street': '23 Avenue des Minimes', 'city': 'La Rochelle', 'zip': '17000', 'country_id': 75, # France 'is_company': False, 'comment': 'Passager - Covoit\'Ouest', }]) print(f" ✓ Passager créé: Marie Martin (ID: {passenger_id})") except Exception as e: print(f" ✗ Erreur: {e}") exit(1) # ===== ÉTAPE 2: Créer le trajet "La Rochelle → Nantes" ===== print("\n### ÉTAPE 2: Création du trajet ###") print("\n3. Création du produit/service 'Trajet La Rochelle → Nantes'...") try: # Chercher la catégorie "All" ou créer une catégorie "Trajets" categ_id = models.execute_kw(db, uid, password, 'product.category', 'search', [[('name', '=', 'Trajets')]]) if not categ_id: categ_id = [models.execute_kw(db, uid, password, 'product.category', 'create', [{ 'name': 'Trajets', }])] # Vérifier si le trajet existe déjà existing_product = models.execute_kw(db, uid, password, 'product.template', 'search', [[('name', '=', 'Trajet La Rochelle → Nantes')]]) if existing_product: product_template_id = existing_product[0] print(f" ✓ Trajet existant trouvé (ID: {product_template_id})") else: product_template_id = models.execute_kw(db, uid, password, 'product.template', 'create', [{ 'name': 'Trajet La Rochelle → Nantes', 'type': 'service', 'categ_id': categ_id[0], 'list_price': 15.00, # Prix de vente 'standard_price': 3.00, # Coût (commission plateforme) 'description_sale': 'Trajet en covoiturage de La Rochelle à Nantes\nDurée: environ 1h30\nDistance: 125 km', 'sale_ok': True, 'purchase_ok': False, }]) print(f" ✓ Trajet créé: La Rochelle → Nantes (ID: {product_template_id})") print(f" - Prix: 15,00 €") print(f" - Commission plateforme: 3,00 €") # Récupérer l'ID du product.product (variant) product_id = models.execute_kw(db, uid, password, 'product.product', 'search', [[('product_tmpl_id', '=', product_template_id)]])[0] except Exception as e: print(f" ✗ Erreur: {e}") exit(1) # ===== ÉTAPE 3: Créer une réservation (devis → commande) ===== print("\n### ÉTAPE 3: Simulation de réservation ###") print("\n4. Création du devis (quotation)...") try: sale_order_id = models.execute_kw(db, uid, password, 'sale.order', 'create', [{ 'partner_id': passenger_id, 'date_order': datetime.now().strftime('%Y-%m-%d %H:%M:%S'), 'validity_date': '2025-10-15', 'note': f'Réservation pour le trajet La Rochelle → Nantes\nConducteur: Jean Dupont\nDate prévue: 15 octobre 2025', }]) print(f" ✓ Devis créé (ID: {sale_order_id})") # Ajouter la ligne de commande (le trajet) order_line_id = models.execute_kw(db, uid, password, 'sale.order.line', 'create', [{ 'order_id': sale_order_id, 'product_id': product_id, 'product_uom_qty': 1, # 1 place 'price_unit': 15.00, }]) print(f" ✓ Ligne de commande ajoutée (1 place à 15,00 €)") except Exception as e: print(f" ✗ Erreur: {e}") exit(1) print("\n5. Confirmation du devis (transformation en commande)...") try: # Confirmer la commande models.execute_kw(db, uid, password, 'sale.order', 'action_confirm', [[sale_order_id]]) print(f" ✓ Commande confirmée") # Lire les informations de la commande order_info = models.execute_kw(db, uid, password, 'sale.order', 'read', [[sale_order_id]], {'fields': ['name', 'state', 'amount_total']}) print(f" ✓ Numéro de commande: {order_info[0]['name']}") print(f" ✓ État: {order_info[0]['state']}") print(f" ✓ Montant total: {order_info[0]['amount_total']} €") except Exception as e: print(f" ✗ Erreur: {e}") exit(1) # ===== ÉTAPE 4: Générer la facture ===== print("\n### ÉTAPE 4: Facturation ###") print("\n6. Génération de la facture...") try: # Créer la facture depuis la commande invoice_ids = models.execute_kw(db, uid, password, 'sale.order', 'action_invoice_create', [[sale_order_id]]) if invoice_ids: invoice_id = invoice_ids[0] print(f" ✓ Facture créée (ID: {invoice_id})") # Lire les informations de la facture invoice_info = models.execute_kw(db, uid, password, 'account.move', 'read', [[invoice_id]], {'fields': ['name', 'state', 'amount_total']}) print(f" ✓ Numéro de facture: {invoice_info[0]['name']}") print(f" ✓ État: {invoice_info[0]['state']}") print(f" ✓ Montant: {invoice_info[0]['amount_total']} €") # Valider la facture (poster) print("\n7. Validation de la facture...") models.execute_kw(db, uid, password, 'account.move', 'action_post', [[invoice_id]]) print(f" ✓ Facture validée et comptabilisée") else: print(f" ✗ Erreur: Impossible de créer la facture") exit(1) except Exception as e: print(f" ✗ Erreur lors de la facturation: {e}") # Continuer même en cas d'erreur # ===== ÉTAPE 5: Enregistrer le paiement ===== print("\n### ÉTAPE 5: Paiement ###") print("\n8. Enregistrement du paiement...") try: # Rechercher le journal de paiement (Bank ou Cash) journal_ids = models.execute_kw(db, uid, password, 'account.journal', 'search', [[('type', 'in', ['bank', 'cash'])]], {'limit': 1}) if not journal_ids: print(" ⚠ Aucun journal de paiement trouvé. Création d'un journal 'Banque'...") journal_id = models.execute_kw(db, uid, password, 'account.journal', 'create', [{ 'name': 'Banque', 'type': 'bank', 'code': 'BNK1', }]) else: journal_id = journal_ids[0] # Créer le paiement payment_id = models.execute_kw(db, uid, password, 'account.payment', 'create', [{ 'payment_type': 'inbound', 'partner_type': 'customer', 'partner_id': passenger_id, 'amount': 15.00, 'journal_id': journal_id, 'date': datetime.now().strftime('%Y-%m-%d'), 'ref': f'Paiement trajet La Rochelle-Nantes', }]) print(f" ✓ Paiement enregistré (ID: {payment_id})") print(f" ✓ Montant: 15,00 €") print(f" ✓ Méthode: Virement bancaire") # Poster le paiement models.execute_kw(db, uid, password, 'account.payment', 'action_post', [[payment_id]]) print(f" ✓ Paiement validé") except Exception as e: print(f" ⚠ Erreur lors du paiement: {e}") print("\n" + "="*60) print("EXERCICE 3: TERMINÉ AVEC SUCCÈS") print("="*60) print("\n### RÉSUMÉ ###") print(f"✓ Conducteur créé: Jean Dupont") print(f"✓ Passager créé: Marie Martin") print(f"✓ Trajet créé: La Rochelle → Nantes (15,00 €)") print(f"✓ Réservation effectuée (Devis → Commande)") print(f"✓ Facture générée et validée") print(f"✓ Paiement enregistré (15,00 €)") print("\n### PROCHAINE ÉTAPE ###") print("Connectez-vous à Odoo pour vérifier:") print("1. Contacts: Ventes > Commandes > Clients") print("2. Produits: Ventes > Produits > Produits") print("3. Commandes: Ventes > Commandes > Commandes") print("4. Factures: Facturation > Clients > Factures") print("5. Paiements: Facturation > Clients > Paiements")