#!/usr/bin/env python3 """ Script de vérification de l'installation Odoo Covoit'Ouest Vérifie que tous les composants sont correctement installés et configurés """ import xmlrpc.client import sys # Configuration url = 'http://localhost:8069' db = 'covoiturage_db' username = 'admin' password = 'admin' def print_header(title): print("\n" + "="*70) print(f" {title}") print("="*70) def print_section(title): print(f"\n📋 {title}") print("-"*70) def check_connection(): """Vérifier la connexion à Odoo""" print_section("Test de Connexion") try: common = xmlrpc.client.ServerProxy('{}/xmlrpc/2/common'.format(url)) uid = common.authenticate(db, username, password, {}) if uid: print(f"✅ Connexion réussie - User ID: {uid}") return uid, xmlrpc.client.ServerProxy('{}/xmlrpc/2/object'.format(url)) else: print(f"❌ Authentification échouée") return None, None except Exception as e: print(f"❌ Erreur de connexion: {e}") return None, None def check_modules(uid, models): """Vérifier les modules installés""" print_section("Modules Installés") required_modules = ['crm', 'sale_management', 'account', 'hr', 'contacts'] for module_name in required_modules: try: module = models.execute_kw(db, uid, password, 'ir.module.module', 'search_read', [[('name', '=', module_name)]], {'fields': ['name', 'state'], 'limit': 1}) if module and module[0]['state'] == 'installed': print(f"✅ {module_name.ljust(20)} - Installé") elif module: print(f"⚠️ {module_name.ljust(20)} - État: {module[0]['state']}") else: print(f"❌ {module_name.ljust(20)} - Non trouvé") except Exception as e: print(f"❌ {module_name.ljust(20)} - Erreur: {str(e)[:30]}") def check_users(uid, models): """Vérifier les utilisateurs""" print_section("Utilisateurs Créés") try: users = models.execute_kw(db, uid, password, 'res.users', 'search_read', [[('active', '=', True)]], {'fields': ['name', 'login', 'groups_id']}) print(f"📊 Nombre total d'utilisateurs: {len(users)}") for user in users: print(f" • {user['name'].ljust(25)} ({user['login']})") except Exception as e: print(f"❌ Erreur: {e}") def check_data(uid, models): """Vérifier les données""" print_section("Données Créées") # Contacts try: nb_partners = models.execute_kw(db, uid, password, 'res.partner', 'search_count', [[('is_company', '=', False)]]) print(f"👥 Contacts (particuliers): {nb_partners}") except Exception as e: print(f"❌ Contacts: {e}") # Produits/Trajets try: categ = models.execute_kw(db, uid, password, 'product.category', 'search', [[('name', '=', 'Trajets')]], {'limit': 1}) if categ: nb_trajets = models.execute_kw(db, uid, password, 'product.template', 'search_count', [[('categ_id', '=', categ[0])]]) print(f"🚗 Trajets (produits): {nb_trajets}") else: print(f"⚠️ Trajets: Catégorie 'Trajets' non trouvée") except Exception as e: print(f"❌ Trajets: {e}") # Commandes try: nb_orders = models.execute_kw(db, uid, password, 'sale.order', 'search_count', [[]]) nb_confirmed = models.execute_kw(db, uid, password, 'sale.order', 'search_count', [[('state', 'in', ['sale', 'done'])]]) print(f"📝 Commandes: {nb_orders} (dont {nb_confirmed} confirmées)") except Exception as e: print(f"❌ Commandes: {e}") # Leads CRM try: nb_leads = models.execute_kw(db, uid, password, 'crm.lead', 'search_count', [[]]) nb_won = models.execute_kw(db, uid, password, 'crm.lead', 'search_count', [[('probability', '=', 100)]]) print(f"🎯 Leads CRM: {nb_leads} (dont {nb_won} gagnés)") except Exception as e: print(f"❌ Leads: {e}") # Factures try: nb_invoices = models.execute_kw(db, uid, password, 'account.move', 'search_count', [[('move_type', '=', 'out_invoice')]]) nb_posted = models.execute_kw(db, uid, password, 'account.move', 'search_count', [[('move_type', '=', 'out_invoice'), ('state', '=', 'posted')]]) print(f"📄 Factures: {nb_invoices} (dont {nb_posted} validées)") except Exception as e: print(f"❌ Factures: {e}") def check_revenue(uid, models): """Vérifier le chiffre d'affaires""" print_section("Chiffre d'Affaires") try: # CA depuis les commandes confirmées orders = models.execute_kw(db, uid, password, 'sale.order', 'search_read', [[('state', 'in', ['sale', 'done'])]], {'fields': ['amount_total']}) ca_commandes = sum([o['amount_total'] for o in orders]) print(f"💰 CA (Commandes confirmées): {ca_commandes:.2f} €") # CA depuis les factures validées invoices = models.execute_kw(db, uid, password, 'account.move', 'search_read', [[('move_type', '=', 'out_invoice'), ('state', '=', 'posted')]], {'fields': ['amount_total']}) ca_factures = sum([i['amount_total'] for i in invoices]) print(f"💵 CA (Factures validées): {ca_factures:.2f} €") except Exception as e: print(f"❌ Erreur: {e}") def check_config(uid, models): """Vérifier la configuration""" print_section("Configuration Système") # Vérifier la société try: company = models.execute_kw(db, uid, password, 'res.company', 'search_read', [[]], {'fields': ['name', 'currency_id'], 'limit': 1}) if company: print(f"🏢 Société: {company[0]['name']}") print(f"💱 Devise: {company[0]['currency_id'][1]}") except Exception as e: print(f"❌ Société: {e}") # Vérifier les équipes de vente try: teams = models.execute_kw(db, uid, password, 'crm.team', 'search_count', [[]]) print(f"👥 Équipes de vente: {teams}") except Exception as e: print(f"❌ Équipes: {e}") # Vérifier les journaux comptables try: journals = models.execute_kw(db, uid, password, 'account.journal', 'search_count', [[]]) print(f"📒 Journaux comptables: {journals}") except Exception as e: print(f"❌ Journaux: {e}") def check_docker(): """Vérifier les conteneurs Docker""" print_section("Conteneurs Docker") import subprocess try: result = subprocess.run(['docker', 'ps', '--filter', 'name=odoo', '--format', '{{.Names}}\t{{.Status}}'], capture_output=True, text=True) if result.returncode == 0 and result.stdout: lines = result.stdout.strip().split('\n') for line in lines: parts = line.split('\t') if len(parts) == 2: name, status = parts if 'Up' in status: print(f"✅ {name.ljust(20)} - {status}") else: print(f"⚠️ {name.ljust(20)} - {status}") else: print("⚠️ Aucun conteneur Odoo trouvé") except Exception as e: print(f"⚠️ Impossible de vérifier Docker: {e}") def generate_summary(uid, models): """Générer un résumé""" print_header("RÉSUMÉ DE L'INSTALLATION") try: # Récupérer les statistiques nb_users = models.execute_kw(db, uid, password, 'res.users', 'search_count', [[('active', '=', True)]]) nb_partners = models.execute_kw(db, uid, password, 'res.partner', 'search_count', [[]]) nb_products = models.execute_kw(db, uid, password, 'product.template', 'search_count', [[]]) nb_orders = models.execute_kw(db, uid, password, 'sale.order', 'search_count', [[]]) nb_leads = models.execute_kw(db, uid, password, 'crm.lead', 'search_count', [[]]) orders = models.execute_kw(db, uid, password, 'sale.order', 'search_read', [[('state', 'in', ['sale', 'done'])]], {'fields': ['amount_total']}) ca_total = sum([o['amount_total'] for o in orders]) print(f""" ┌─────────────────────────────────────────────────────────────────────┐ │ ODOO COVOIT'OUEST - STATUT │ ├─────────────────────────────────────────────────────────────────────┤ │ │ │ 🔌 Connexion: ✅ OK │ │ 🐳 Docker: ✅ Conteneurs actifs │ │ │ │ 📊 DONNÉES: │ │ • Utilisateurs: {str(nb_users).rjust(4)} │ │ • Contacts: {str(nb_partners).rjust(4)} │ │ • Produits/Trajets: {str(nb_products).rjust(4)} │ │ • Commandes: {str(nb_orders).rjust(4)} │ │ • Leads CRM: {str(nb_leads).rjust(4)} │ │ │ │ 💰 CHIFFRE D'AFFAIRES: {str(f"{ca_total:.2f}").rjust(8)} € │ │ │ │ ✅ Statut: OPÉRATIONNEL │ │ │ │ 🌐 URL: http://localhost:8069 │ │ 📁 Base de données: covoiturage_db │ │ 👤 Login: admin / admin │ │ │ └─────────────────────────────────────────────────────────────────────┘ """) except Exception as e: print(f"\n❌ Erreur lors de la génération du résumé: {e}") def main(): print_header("VÉRIFICATION DE L'INSTALLATION ODOO COVOIT'OUEST") # Connexion uid, models = check_connection() if not uid or not models: print("\n❌ Impossible de continuer sans connexion") sys.exit(1) # Vérifications check_docker() check_modules(uid, models) check_users(uid, models) check_data(uid, models) check_revenue(uid, models) check_config(uid, models) # Résumé generate_summary(uid, models) print("\n" + "="*70) print("✅ VÉRIFICATION TERMINÉE") print("="*70 + "\n") if __name__ == "__main__": main()