Architecture du Système OmniCRM
Ce document fournit un aperçu de l'architecture du système OmniCRM, y compris les relations entre les composants et le flux de données.
Vue d'ensemble du système à un haut niveau
OmniCRM est une plateforme BSS/OSS complète qui intègre plusieurs composants clés pour fournir une gestion complète des services pour les fournisseurs de télécommunications.
Composants Principaux
1. Applications Frontend
Interface Web OmniCRM
- Application monopage React
- Interface pour le personnel pour la gestion des clients, le provisioning de services, la facturation
- Mises à jour du statut de provisioning en temps réel
- Contrôle d'accès basé sur les rôles
Portail de Self-Care
- Portail orienté client
- Gestion des services et suivi de l'utilisation
- Consultation et paiement des factures
- Base de code partagée avec l'interface du personnel, vues différentes
2. Couche API
API OmniCRM (Flask/Python)
- API RESTful pour toutes les opérations
- Documentation OpenAPI/Swagger
- Authentification basée sur JWT
- Limitation de débit et mise en cache
- Support WebSocket pour les mises à jour en temps réel
Routes Clés de l'API :
/crm/customer/*- Gestion des clients/crm/service/*- Opérations de service/crm/product/*- Catalogue de produits/crm/provision/*- Opérations de provisioning/crm/transaction/*- Transactions de facturation/crm/invoice/*- Gestion des factures
3. Système de Provisioning
4. Facturation & Tarification
Intégration OCS/CGRateS
- Tarification et facturation en temps réel
- Gestion des comptes
- Suivi des soldes (monétaire, données, voix, SMS)
- Plans d'action pour les charges récurrentes
- Notifications basées sur des seuils
Flux de Travail de Facturation :
5. Modèle de Données
OmniCRM utilise une base de données relationnelle avec les modèles principaux suivants. Pour des diagrammes de relation d'entité visuels, voir Clients, Contacts, Sites & Services.
Client & Entités Associées
Client - Entité centrale représentant une entreprise ou un individu
| Champ | Type | Description |
|---|---|---|
| customer_id | Integer (PK) | Identifiant unique |
| customer_name | String | Nom de l'entreprise ou de l'individu |
| customer_account_type | Enum | 'Individuel' ou 'Entreprise' |
| customer_status | Enum | 'Ouvert', 'Fermé', 'Suspendu', 'Archivé' |
| customer_payment_type | String | 'prépayé' ou 'postpayé' |
| customer_enabled | Boolean | Le compte est-il actif |
| tax_identifier | String | Numéro de TVA/GST |
| contract_start_date | DateTime | Début du contrat |
| contract_end_date | DateTime | Fin du contrat |
Contact - Personnes associées à un client
| Champ | Type | Description |
|---|---|---|
| contact_id | Integer (PK) | Identifiant unique |
| customer_id | Integer (FK) | Client parent |
| contact_firstname | String | Prénom |
| contact_lastname | String | Nom de famille |
| contact_email | String | Adresse email |
| contact_phone | String | Numéro de téléphone |
| contact_types | String | 'Principal', 'Facturation', 'Technique' |
Site - Lieux physiques de livraison de services
| Champ | Type | Description |
|---|---|---|
| site_id | Integer (PK) | Identifiant unique |
| customer_id | Integer (FK) | Client parent |
| site_name | String | Nom de l'emplacement |
| address_line_1 | String | Adresse de rue |
| city, state, zip_code | String | Détails de l'emplacement |
| latitude, longitude | Float | Coordonnées GPS |
| google_maps_place_id | String | Référence Google Maps |
| plus_code | String | Code de Localisation Ouverte |
Modèles de Service & Produit
Service - Instances de service actives
| Champ | Type | Description |
|---|---|---|
| service_id | Integer (PK) | Identifiant unique |
| customer_id | Integer (FK) | Client parent |
| product_id | Integer (FK) | Modèle de produit |
| site_id | Integer (FK) | Lieu de service |
| service_name | String | Nom d'affichage |
| service_uuid | String | Identifiant du système de facturation |
| service_status | Enum | Statut actuel |
| service_billed | Boolean | Générer des transactions |
| wholesale_cost | Float | Coût fournisseur |
| retail_cost | Float | Prix client |
| bundled_parent | Integer (FK) | Service parent pour les bundles |
Produit - Modèles d'offres de service
| Champ | Type | Description |
|---|---|---|
| product_id | Integer (PK) | Identifiant unique |
| product_name | String | Nom d'affichage |
| product_slug | String | Nom adapté aux URL |
| category | Enum | 'autonome', 'bundle', 'addon', 'promo' |
| provisioning_play | String | Nom du playbook Ansible |
| provisioning_json_vars | JSON | Variables du playbook |
| inventory_items_list | String | Inventaire requis |
| retail_cost | Float | Prix mensuel |
| retail_setup_cost | Float | Frais uniques |
| enabled | Boolean | Disponible à la vente |
Modèles de Facturation
Transaction - Charges/crédits individuels
| Champ | Type | Description |
|---|---|---|
| transaction_id | Integer (PK) | Identifiant unique |
| customer_id | Integer (FK) | Client parent |
| invoice_id | Integer (FK) | Facture parent (optionnel) |
| service_id | Integer (FK) | Service associé |
| title | String | Description de la transaction |
| retail_cost | Float | Montant |
| tax_percentage | Float | Taux de taxe |
| tax_amount | Float | Taxe calculée |
| void | Boolean | Transaction annulée |
Facture - Transactions groupées pour la facturation
| Champ | Type | Description |
|---|---|---|
| invoice_id | Integer (PK) | Identifiant unique |
| customer_id | Integer (FK) | Client parent |
| paid | Boolean | Paiement reçu |
| void | Boolean | Facture annulée |
| payment_reference | String | ID de transaction Stripe |
| start_date, end_date | Date | Période de facturation |
| due_date | Date | Date limite de paiement |
| retail_cost | Float | Montant total |
Modèles d'Inventaire
Inventaire - Actifs physiques et virtuels
| Champ | Type | Description |
|---|---|---|
| inventory_id | Integer (PK) | Identifiant unique |
| customer_id | Integer (FK) | Client assigné |
| service_id | Integer (FK) | Service lié |
| inventory_template_id | Integer (FK) | Modèle de type d'élément |
| item | String | Type d'élément (Carte SIM, Routeur, etc.) |
| item_state | Enum | 'Nouveau', 'Assigné', 'Utilisé', etc. |
| itemtext1-20 | String | Champs flexibles |
| management_url | String | URL d'administration de l'équipement |
| config_content | Text | Fichier de configuration |
Inventory_Template - Définit la structure des éléments d'inventaire
| Champ | Type | Description |
|---|---|---|
| inventory_template_id | Integer (PK) | Identifiant unique |
| item | String | Nom du modèle |
| itemtext1_label | String | Étiquette pour le champ itemtext1 |
| itemtext2_label | String | Étiquette pour le champ itemtext2 |
Modèles de Provisioning
Provision - Suivi des travaux de provisioning
| Champ | Type | Description |
|---|---|---|
| provision_id | Integer (PK) | Identifiant unique |
| product_id | Integer (FK) | Produit en cours de provisioning |
| customer_id | Integer (FK) | Client cible |
| service_id | Integer (FK) | Service créé/modifié |
| provisioning_play | String | Nom du playbook Ansible |
| provisioning_status | Integer | 0=Succès, 1=En Cours, 2=Échoué |
Provision_Event - Étapes de provisioning individuelles
| Champ | Type | Description |
|---|---|---|
| provision_event_id | Integer (PK) | Identifiant unique |
| provision_id | Integer (FK) | Tâche de provisioning parent |
| event_name | String | Nom de la tâche |
| event_number | Integer | Numéro de séquence |
| provisioning_status | Integer | 0=Succès, 1=En Cours, 2=Échoué |
| provisioning_result_json | JSON | Sortie complète de la tâche |
Modèles Utilisateur & Sécurité
Utilisateur - Comptes utilisateurs
| Champ | Type | Description |
|---|---|---|
| id | Integer (PK) | Identifiant unique |
| username | String | Nom d'utilisateur de connexion |
| String | Adresse email | |
| email_verified | Boolean | Email confirmé |
| is_2fa_enabled | Boolean | Authentification à deux facteurs activée |
| totp_secret | String | Clé secrète TOTP |
Rôle - Rôles utilisateurs
| Champ | Type | Description |
|---|---|---|
| id | Integer (PK) | Identifiant unique |
| name | String | Nom du rôle |
| description | String | Description du rôle |
Permission - Permissions granulaires
| Champ | Type | Description |
|---|---|---|
| id | Integer (PK) | Identifiant unique |
| name | String | Nom de la permission (ressource.action) |
| description | String | Description de la permission |
Relations :
- Les utilisateurs ont plusieurs rôles (plusieurs à plusieurs)
- Les rôles ont plusieurs permissions (plusieurs à plusieurs)
- Les utilisateurs peuvent se lier à un contact (pour l'accès au portail client)
Points d'Intégration
Passerelle de Paiement Stripe
- Méthodes de paiement tokenisées
- Stockage de cartes conforme PCI
- Paiement automatisé des factures
- Traitement des remboursements
- Notifications de cartes expirantes
Service Email Mailjet
- Emails transactionnels (factures, bienvenue, notifications)
- Synchronisation des contacts
- Gestion des modèles
- Suivi des livraisons
Google Maps
- Autocomplétion d'adresse
- Géocodage et géocodage inverse
- Génération de Plus Code
- Cartographie des emplacements des sites
OCS/CGRateS
- Provisioning de comptes
- Tarification en temps réel
- Gestion des soldes
- Traitement des CDR
- Plans d'action et calendriers
Architecture de Sécurité
Fonctionnalités de Sécurité :
- Authentification basée sur JWT
- Authentification à deux facteurs (TOTP)
- Contrôle d'accès basé sur les rôles (RBAC)
- Accès aux ressources basé sur les permissions
- Gestion des sessions avec Redis
- Hachage des mots de passe (bcrypt)
- Vérification des emails
- Journalisation des audits via le Journal d'Activité
Architecture de Déploiement
Configuration de Production Recommandée :
Pile Technologique
Backend :
- Python 3.x
- Framework web Flask
- ORM SQLAlchemy
- Migrations Alembic
- Ansible pour l'automatisation
Frontend :
- React
- Gestion d'état
- React Router
- Axios pour les appels API
Base de Données :
- Base de données relationnelle (stockage de données principal)
- Redis (cache & sessions)
Services Externes :
- CGRateS (facturation/tarification)
- Stripe (paiements)
- Mailjet (email)
- Google Maps (géocodage)
Considérations de Scalabilité
Scalabilité Horizontale :
- Conception d'API sans état permettant plusieurs instances
- L'équilibreur de charge distribue les demandes
- Redis pour l'état de session partagé
Scalabilité de la Base de Données :
- Répliques de lecture pour les requêtes de reporting
- Pooling de connexions
- Optimisation des requêtes et indexation
Provisioning à Grande Échelle :
- Traitement des tâches en arrière-plan
- Plusieurs travailleurs Ansible
- Gestion de la file d'attente des tâches
- Logique de réessai pour les provisions échouées
Surveillance & Observabilité
OmniCRM fournit des métriques complètes basées sur Prometheus pour surveiller tous les aspects du système. Pour des détails complets, voir Surveillance & Métriques.
Métriques Clés :
- Temps de réponse de l'API et taux de demandes
- Taux de succès/échec de provisioning et durée des tâches
- Performance des requêtes de base de données et utilisation du pool de connexions
- Santé des intégrations externes (OCS, Stripe, Mailjet)
- Exécution des tâches en arrière-plan et erreurs
Journalisation :
- Journaux d'application (Flask)
- Journaux de provisioning (sortie Ansible)
- Journal d'activité (trace d'audit)
- Suivi des erreurs et alertes
Point de Terminaison des Métriques :
Toutes les métriques sont exposées à /crm/metrics au format Prometheus. Voir Surveillance & Métriques pour la configuration de récupération, les règles d'alerte et des exemples de tableau de bord.
Documentation Connexe
- Playbooks Ansible - Automatisation du provisioning
- Système de Provisioning - Détails du flux de travail
- Produits et Services - Architecture des produits
- Documentation de l'API - Référence API
- RBAC - Sécurité et permissions