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
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
OmniCRM Web UI
- Application monopage React
- Interface du personnel pour la gestion des clients, le provisionnement des services, la facturation
- Mises à jour de l'état de provisionnement en temps réel
- Contrôle d'accès basé sur les rôles
Portail d'auto-assistance
- 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 API clés :
/crm/customer/*- Gestion des clients/crm/service/*- Opérations de service/crm/product/*- Catalogue de produits/crm/provision/*- Opérations de provisionnement/crm/transaction/*- Transactions de facturation/crm/invoice/*- Gestion des factures
3. Système de Provisionnement
4. Facturation et 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 frais récurrents
- 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 et Services.
Client et 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 e-mail |
| contact_phone | String | Numéro de téléphone |
| contact_types | String | 'Principal', 'Facturation', 'Technique' |
Site - Lieux de livraison de services physiques
| Champ | Type | Description |
|---|---|---|
| site_id | Integer (PK) | Identifiant unique |
| customer_id | Integer (FK) | Client parent |
| site_name | String | Nom du lieu |
| address_line_1 | String | Adresse de la 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 ouvert |
Modèles de service et de 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 compatible avec l'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 regroupé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 provisionnement
Provision - Suivi des travaux de provisionnement
| Champ | Type | Description |
|---|---|---|
| provision_id | Integer (PK) | Identifiant unique |
| product_id | Integer (FK) | Produit en cours de provisionnement |
| 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 provisionnement individuelles
| Champ | Type | Description |
|---|---|---|
| provision_event_id | Integer (PK) | Identifiant unique |
| provision_id | Integer (FK) | Travail de provisionnement 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 d'utilisateur et de sécurité
Utilisateur - Comptes utilisateurs
| Champ | Type | Description |
|---|---|---|
| id | Integer (PK) | Identifiant unique |
| username | String | Nom d'utilisateur de connexion |
| String | Adresse e-mail | |
| email_verified | Boolean | E-mail confirmé |
| is_2fa_enabled | Boolean | Authentification à deux facteurs activée |
| totp_secret | String | Clé secrète TOTP |
Rôle - Rôles d'utilisateur
| 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 être liés à 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 de messagerie Mailjet
- E-mails transactionnels (factures, bienvenue, notifications)
- Synchronisation des contacts
- Gestion des modèles
- Suivi de livraison
Google Maps
- Autocomplétion d'adresse
- Géocodage et géocodage inverse
- Génération de code Plus
- Cartographie des emplacements des sites
OCS/CGRateS
- Provisionnement des comptes
- Tarification en temps réel
- Gestion des soldes
- Traitement des CDR
- Plans d'action et horaires
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 par e-mail
- 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
- SQLAlchemy ORM
- Migrations Alembic
- Ansible pour l'automatisation
Frontend :
- React
- Gestion de l'état
- React Router
- Axios pour les appels API
Base de données :
- Base de données relationnelle (stockage de données principal)
- Redis (cache et sessions)
Services externes :
- CGRateS (facturation/tarification)
- Stripe (paiements)
- Mailjet (e-mail)
- 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
Provisionnement à grande échelle :
- Traitement des travaux en arrière-plan
- Plusieurs travailleurs Ansible
- Gestion de la file d'attente des travaux
- Logique de réessai pour les provisions échouées
Surveillance et observabilité
Métriques clés :
- Temps de réponse de l'API
- Taux de succès/échec de provisionnement
- Utilisation du pool de connexions de la base de données
- Taux de réussite du cache
- Sessions actives
Journalisation :
- Journaux d'application (Flask)
- Journaux de provisionnement (sortie Ansible)
- Journal d'activité (piste d'audit)
- Suivi des erreurs et alertes
Documentation connexe
- Playbooks Ansible - Automatisation du provisionnement
- Système de provisionnement - Détails du flux de travail
- Produits et services - Architecture des produits
- Documentation API - Référence API
- RBAC - Sécurité et permissions