Lorsqu'un client m'a contacté pour connecter son ERP Cegid Manufacturing PMI à son système téléphonique 3CX hébergé en externe, j'ai tout de suite compris que le défi serait intéressant. L'objectif ? Afficher automatiquement les informations du contact lors des appels entrants et sortants pour améliorer l'efficacité des équipes commerciales et support.
Spoiler : aucune intégration native n'existe entre ces deux systèmes. Il a donc fallu développer une solution complète, de l'API à la sécurisation de l'accès externe, en passant par la gestion de cas limites techniques. Voici le retour d'expérience détaillé de ce projet.
Le Contexte : Deux Systèmes Incompatibles
La Situation de Départ
L'entreprise utilisait Cegid Manufacturing PMI (un ERP industriel avec base SQL Server) et 3CX (un IPBX hébergé chez un prestataire externe). Le problème ? Quand un client appelait, les agents devaient manuellement chercher son dossier dans Cegid. Perte de temps, risque d'erreur, et expérience client dégradée.
Les Objectifs Fixés
- Afficher les informations du contact automatiquement lors d'un appel
- Rechercher par numéro de téléphone ET par email
- Filtrer uniquement les sociétés 100 et 200 (multi-société PMI)
- Gérer les numéros de standards partagés par plusieurs contacts
- Sécuriser l'accès depuis l'extérieur (3CX hébergé hors du réseau)
L'Architecture Développée
Face à l'absence d'intégration native, j'ai conçu une architecture en couches avec un principe clé : ne jamais exposer directement la base de production.
↓ HTTPS (port 28443)
Internet
↓
Pare-feu (NAT)
↓
IIS Reverse Proxy (SSL/TLS)
↓ HTTP (réseau interne)
API FastAPI (Python 3.12)
↓
Cache Local (SQL Server)
↓ Synchronisation quotidienne
Cegid PMI (Base Production)
Pourquoi Cette Architecture ?
- Cache local : Évite de charger la base production et accélère les réponses
- API Python : Flexibilité et rapidité de développement avec FastAPI
- Reverse Proxy IIS : Terminaison SSL/TLS et isolation de l'API
- Port exotique : Réduction des scans automatisés (28443 au lieu de 443)
- Synchronisation nocturne : Données à jour sans impact sur les heures de travail
Les Défis Techniques (Et Comment Je Les Ai Résolus)
Défi #1 : L'Unicité des Contacts
Premier obstacle majeur : lors de la première synchronisation, 1 906 erreurs de doublons. Mon modèle utilisait uniquement l'ID du contact comme clé unique, mais dans Cegid PMI, l'unicité repose sur le couple (Société, ID).
🔍 Problème Identifié
Le même ID de contact (ex: 12345) peut exister dans la société 100 ET dans la société 200. En ne conservant que l'ID, je perdais des contacts et créais des collisions.
Solution : Mise en place d'une clé composite.
-- Index unique sur le couple (société, ID)
CREATE UNIQUE INDEX ix_contacts_society_cegid
ON contacts(society_code, cegid_id);
Résultat :
- ❌ Avant : 10 665 contacts, 1 906 erreurs
- ✅ Après : 12 571 contacts, 0 erreur
Défi #2 : Les Numéros de Standards Partagés
Second problème : 1 139 numéros de téléphone étaient partagés par plusieurs contacts. Certains standards avaient jusqu'à 14 contacts différents !
Si je renvoyais le premier contact trouvé, l'affichage serait aléatoire. Imaginez appeler le standard de l'entreprise STEPHANIX et voir s'afficher "Jean Dupont" au lieu de "Standard STEPHANIX".
Solution : Détection intelligente et priorisation.
# Si plusieurs contacts partagent le numéro
if len(contacts) > 1:
# Prioriser : Client > Fournisseur
# Afficher "Standard [NOM ENTREPRISE]"
return ContactLookupResponse(
FirstName="Standard",
LastName=company_name,
CompanyName=company_name,
...
)
Résultat : Affichage cohérent de "Standard STEPHANIX" pour tous les appels sur le numéro principal.
Développement de l'API
Stack Technique
J'ai choisi FastAPI pour sa rapidité de développement, sa documentation automatique (Swagger), et ses performances exceptionnelles. L'API expose deux endpoints principaux :
/api/v1/contacts/lookup/phone/{phone}- Recherche par téléphone/api/v1/contacts/lookup/email/{email}- Recherche par email
Exemple de Réponse Enrichie
{
"ContactID": "STD-100-195830",
"FirstName": "Standard",
"LastName": "STEPHANIX",
"CompanyName": "STEPHANIX",
"Email": null,
"BusinessPhone": "0241447384",
"BusinessPhone2": "0241447385",
"MobilePhone": null,
"MobilePhone2": null,
"ContactURL": "http://serveur:8080/client/195830",
"SocietyCode": "100",
"CompanyCode": "195830",
"CompanyType": "Client"
}
L'API renvoie non seulement les informations du contact, mais aussi un lien direct vers la fiche Cegid, le type d'entité (Client/Fournisseur), et gère intelligemment les cas de numéros partagés.
Sécurisation : Le Vrai Challenge
Le plus grand défi de ce projet ? Exposer l'API sur Internet de manière sécurisée. Le 3CX étant hébergé en externe, il devait pouvoir interroger notre API, mais sans créer de faille de sécurité.
Mesures de Sécurité Mises en Place
- HTTPS obligatoire : Communication chiffrée avec certificat SSL/TLS
- Port non-standard : 28443 au lieu de 443 (réduit les scans automatisés)
- Reverse Proxy IIS : Isolation complète de l'API Python
- Authentification API Key : Header X-API-Key pour chaque requête
- Rate Limiting : Limitation du nombre de requêtes par IP
- Cache isolé : Pas d'accès direct à la base de production
💡 Pourquoi un Port Exotique ?
Utiliser le port 28443 au lieu du 443 standard réduit drastiquement les tentatives d'intrusion automatisées. Les bots scannent les ports standards, pas les ports exotiques. C'est une couche de sécurité supplémentaire, certes par l'obscurité, mais efficace.
Automatisation et Déploiement
Pour faciliter le déploiement et la maintenance, j'ai développé un script PowerShell complet qui automatise toute l'installation :
- Installation et configuration d'IIS avec ARR
- Génération du certificat SSL
- Configuration du binding HTTPS sur port exotique
- Paramétrage du pare-feu Windows
- Génération du template 3CX prêt à l'emploi
- Tests de validation automatiques
Résultat : déploiement complet en moins de 2 heures au lieu de plusieurs jours de configuration manuelle.
La synchronisation quotidienne des contacts est planifiée via une tâche Windows qui s'exécute chaque nuit à 2h du matin, pendant les heures creuses.
Besoin d'une Intégration ERP Sur Mesure ?
Je développe des solutions d'intégration entre vos systèmes métier (ERP, CRM, téléphonie, etc.) pour automatiser vos processus et améliorer l'efficacité de vos équipes.
Discuter de votre projetRésultats et ROI
Métriques du Projet
- Temps de développement : 5 jours
- Temps de déploiement : 2 heures (avec le script automatisé)
- Contacts synchronisés : 12 571
- Taux de succès : 100% (0 erreur)
- Temps de réponse API : < 100ms
Bénéfices Concrets
Pour les utilisateurs :
- ✅ Gain de temps : Informations affichées instantanément, plus besoin de chercher
- ✅ Meilleure qualité de service : Connaissance du client avant de décrocher
- ✅ Productivité : Économie de 5 minutes par agent et par appel
- ✅ Professionnalisme : Accueil personnalisé ("Bonjour M. Dupont")
Pour l'entreprise :
- 💰 ROI : Moins de 1 mois (20 agents × 5 min/jour = 100 min économisées/jour)
- 📊 Traçabilité : Base pour futures évolutions (journalisation des appels)
- 🔒 Sécurité : Architecture robuste et évolutive
- 🚀 Scalabilité : Prêt pour de nouvelles fonctionnalités
Évolutions Futures (Phase 2)
L'intégration actuelle est une base solide pour de futures fonctionnalités :
1. Journalisation des Appels dans Cegid
Créer automatiquement une fiche d'appel dans Cegid PMI avec la date, la durée, l'agent, et le type d'appel (entrant/sortant/manqué).
2. Création de Contacts depuis 3CX
Permettre de créer un nouveau contact directement depuis l'interface 3CX quand un numéro inconnu appelle.
3. Dashboard de Monitoring
Interface web (NiceGUI) pour visualiser les statistiques de synchronisation, les logs en temps réel, et tester l'intégration.
Leçons Apprises
Ce Qui a Bien Fonctionné
- Architecture en couches : Séparation claire (Cache → API → Proxy) facilite la maintenance
- Python + FastAPI : Développement rapide avec documentation automatique
- Tests itératifs : Découverte progressive des cas limites (doublons, standards)
- Automatisation : Le script PowerShell a fait gagner un temps fou en déploiement
Les Difficultés Rencontrées
- Documentation Cegid PMI : Très limitée, il a fallu analyser les tables SQL manuellement
- Format template 3CX : Rejeté plusieurs fois avant de trouver le bon format XML
- Gestion des numéros partagés : Cas non anticipé, découvert en phase de test
- Clé composite : Erreur de conception initiale corrigée rapidement
Conclusion
Ce projet démontre qu'il est tout à fait possible de connecter des systèmes qui ne disposent d'aucune intégration native, en développant une couche d'API intermédiaire intelligente.
Les clés du succès ? Une architecture bien pensée (sécurité, isolation, cache), une gestion rigoureuse des cas limites (doublons, numéros partagés), et une automatisation poussée pour faciliter le déploiement et la maintenance.
Si vous avez un projet similaire (intégration ERP-CRM, ERP-téléphonie, automatisation de processus métier), n'hésitez pas à me contacter. Chaque entreprise a ses spécificités, et c'est justement ce qui rend ces projets passionnants.