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

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.

3CX (Hébergé Externe)
↓ 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 ?

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 :

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.

12 571
Contacts synchronisés
1 139
Standards gérés
0%
Taux d'erreur
49%
Contacts avec téléphone

Développement de l'API

Stack Technique

Python 3.12 FastAPI SQLAlchemy SQL Server IIS ARR 3CX v18+

J'ai choisi FastAPI pour sa rapidité de développement, sa documentation automatique (Swagger), et ses performances exceptionnelles. L'API expose deux endpoints principaux :

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

💡 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 :

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 projet

Résultats et ROI

Métriques du Projet

Bénéfices Concrets

Pour les utilisateurs :

Pour l'entreprise :

É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é

Les Difficultés Rencontrées

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.

JC

Jean-Charles - SysLibre

Développeur freelance spécialisé en Python, Laravel et automatisation. J'accompagne les PME dans leurs projets d'intégration de systèmes et de développement d'API sur mesure. Basé à Joué-lès-Tours, intervenant dans toute la France.