Epic Events CRM est un systeme de gestion de la relation client (Customer Relationship Management) developpe pour Epic Events, une entreprise de conseil et de gestion dans l'evenementiel. L'application permet de collecter et de gerer les informations relatives aux clients, contrats et evenements de maniere securisee.
- Authentification securisee avec JWT (JSON Web Token)
- Trois departements avec permissions differenciees :
- Commercial : Gestion des clients et creation d'evenements
- Support : Gestion des evenements assignes
- Management : Administration complete du systeme
- Creation et mise a jour des profils clients
- Association automatique au commercial responsable
- Suivi des contacts et informations de l'entreprise
- Creation et modification des contrats
- Suivi des montants (total et restant a payer)
- Signature des contrats
- Filtrage par statut (signes/non signes, payes/non payes)
- Creation d'evenements pour les contrats signes
- Attribution du personnel support
- Suivi des details (lieu, nombre de participants, dates)
- Filtrage des evenements sans support assigne
- Mots de passe haches avec PBKDF2-SHA256
- Tokens JWT pour l'authentification persistante
- Principe du moindre privilege pour l'acces aux donnees
- Protection contre les injections SQL via ORM
- Journalisation des actions sensibles avec Sentry
- Python 3.9 ou superieur
- PostgreSQL 12 ou superieur
- pip (gestionnaire de paquets Python)
git clone <url_du_repository>
cd epic_crmpython -m venv venvWindows :
venv\Scripts\activatemacOS/Linux :
source venv/bin/activatepip install -r requirements.txt- Installer PostgreSQL sur votre machine
- Creer un utilisateur et une base de donnees :
CREATE USER epic_user WITH PASSWORD 'your_password';
CREATE DATABASE epic;
GRANT ALL PRIVILEGES ON DATABASE epic TO epic_user;- Copier le fichier
.env.examplevers.env:
cp .env.example .env- Modifier le fichier
.envavec vos informations :
DB_USERNAME=epic_user
DB_PASSWORD=your_password
DB_NAME=epic
DB_PORT=5432
DB_HOST=localhost
JWT_SECRET_KEY=votre-cle-secrete-generee-aleatoirement
SENTRY_DSN=votre-dsn-sentry
ENVIRONMENT=development
APP_VERSION=1.0.0
Important : Pour generer une cle JWT securisee :
python -c "import secrets; print(secrets.token_hex(32))"python db_operations.pypython cli.pyUne fois dans l'interface :
=== Epic Events CRM ===
Commandes disponibles :
login - Se connecter au systeme
logout - Se deconnecter
whoami - Afficher les informations de l'utilisateur actuel
clients - Gestion des clients
contracts - Gestion des contrats
events - Gestion des evenements
users - Gestion des utilisateurs (Management uniquement)
help - Afficher l'aide
exit/quit - Quitter l'application
list - Lister tous les clients
create - Creer un nouveau client
update <id> - Mettre a jour un client
back - Retour au menu principal
list - Lister tous les contrats
unsigned - Lister les contrats non signes
unpaid - Lister les contrats non payes
create - Creer un nouveau contrat
update <id> - Mettre a jour un contrat
sign <id> - Signer un contrat
back - Retour au menu principal
list - Lister tous les evenements
no-support - Lister les evenements sans support
my-events - Lister mes evenements (Support uniquement)
create - Creer un nouvel evenement
update <id> - Mettre a jour un evenement
assign <id> - Assigner un support a un evenement
back - Retour au menu principal
list - Lister tous les utilisateurs
create - Creer un nouvel utilisateur
update <id> - Mettre a jour un utilisateur
delete <id> - Supprimer un utilisateur
back - Retour au menu principal
Apres l'initialisation, les utilisateurs suivants sont disponibles :
| Mot de passe | Departement | |
|---|---|---|
| bill.boquet@epic.com | password123 | Commercial |
| kate.hastroff@epic.com | password123 | Support |
| alice.manager@epic.com | admin123 | Management |
pytestpytest --cov=. --cov-report=htmlLe rapport de couverture sera genere dans le dossier htmlcov/.
epic_crm/
|-- auth.py # Gestion de l'authentification JWT
|-- cli.py # Interface en ligne de commande
|-- db_operations.py # Operations de base de donnees et modeles
|-- main.py # Point d'entree principal
|-- epicevents.py # Script executable
|-- sentry_logging.py # Configuration Sentry
|-- models.py # Modeles de donnees (legacy)
|-- requirements.txt # Dependances Python
|-- pytest.ini # Configuration pytest
|-- .env.example # Exemple de configuration
|-- .gitignore # Fichiers ignores par Git
|-- tests/ # Tests unitaires et d'integration
|-- __init__.py
|-- test_models.py
|-- test_auth.py
|-- test_db_operations.py
+----------------+ +----------------+ +----------------+
| departments | | users | | clients |
+----------------+ +----------------+ +----------------+
| id (PK) |<------| id (PK) |<------| id (PK) |
| name | | employee_id | | full_name |
| description | | name | | email |
+----------------+ | email | | phone |
| password_hash | | company_name |
| department_id | | creation_date |
| creation_date | | last_update |
+----------------+ | commercial_id |
| +----------------+
| |
v v
+----------------+ +----------------+
| contracts | | events |
+----------------+ +----------------+
| id (PK) |<------| id (PK) |
| client_id (FK) | | contract_id |
| commercial_id | | name |
| total_amount | | start_date |
| remaining_amt | | end_date |
| creation_date | | support_id |
| is_signed | | location |
+----------------+ | attendees |
| notes |
+----------------+
- Stockage des mots de passe : Hachage avec PBKDF2-SHA256 et salage automatique
- Authentification : Tokens JWT avec expiration (24h par defaut)
- Autorisation : Verification des permissions par departement
- Base de donnees : Utilisation d'un ORM (SQLAlchemy) pour prevenir les injections SQL
- Configuration : Variables sensibles dans fichier .env (non commite)
- Journalisation : Suivi des actions sensibles avec Sentry
Ne jamais commiter les fichiers suivants :
.env(contient les credentials).epic_events_token(token d'authentification)
Les evenements suivants sont journalises :
- Toutes les exceptions non gerees
- Creation/modification/suppression d'utilisateurs
- Signature de contrats
Pour configurer Sentry :
- Creer un compte sur sentry.io
- Creer un nouveau projet Python
- Copier le DSN dans le fichier
.env
- Forker le projet
- Creer une branche pour votre fonctionnalite (
git checkout -b feature/ma-fonctionnalite) - Commiter vos changements (
git commit -m 'Ajout de ma fonctionnalite') - Pousser vers la branche (
git push origin feature/ma-fonctionnalite) - Ouvrir une Pull Request
Ce projet est developpe dans le cadre d'un projet de formation OpenClassrooms.