|
| 1 | +# ACFC - Documentation Technique Complète (au 21/08/2025) |
| 2 | + |
| 3 | +## 📋 Vue d'ensemble |
| 4 | + |
| 5 | +**ACFC** (Accounting, Customer Relationship Management, Billing & Stock Management) est une application web d'entreprise intégrée développée en Python Flask. Elle fournit une solution complète pour la gestion d'entreprise incluant la comptabilité, la gestion client (CRM), la facturation et la gestion des stocks pour l'entreprise ACFC. |
| 6 | + |
| 7 | +### 🎯 Modules Métiers |
| 8 | + |
| 9 | +- **👥 CRM (Clients)** : Gestion de la relation client, contacts, historique |
| 10 | +- **📦 Catalogue** : Gestion des produits et services |
| 11 | +- **💼 Commercial** : Devis, commandes, suivi commercial |
| 12 | +- **💰 Comptabilité** : Facturation, plan comptable, écritures |
| 13 | +- **📊 Stocks** : Inventaire, mouvements, valorisation |
| 14 | + |
| 15 | +## 🏗️ Architecture Technique |
| 16 | + |
| 17 | +### Stack Technologique |
| 18 | + |
| 19 | +```ini |
| 20 | +Frontend: HTML5 + CSS3 + JavaScript + Jinja2 |
| 21 | +Backend: Python 3.12 + Flask + SQLAlchemy |
| 22 | +Database: MariaDB (données) + MongoDB (logs) |
| 23 | +Server: Waitress WSGI + Nginx (reverse proxy) |
| 24 | +Deploy: Docker + Docker Compose |
| 25 | +``` |
| 26 | + |
| 27 | +### Architecture en Couches |
| 28 | + |
| 29 | +```ini |
| 30 | +┌─────────────────────────────────────────┐ |
| 31 | +│ Nginx (Reverse Proxy) │ |
| 32 | +├─────────────────────────────────────────┤ |
| 33 | +│ Flask Application (Port 5000) │ |
| 34 | +│ ┌─────────────────────────────────────┐ │ |
| 35 | +│ │ Blueprints (Modules) │ │ |
| 36 | +│ │ ┌─────┬─────┬─────┬─────┬─────┐ │ │ |
| 37 | +│ │ │ CRM │Cat. │Com. │Comp.│Stock│ │ │ |
| 38 | +│ │ └─────┴─────┴─────┴─────┴─────┘ │ │ |
| 39 | +│ └─────────────────────────────────────┘ │ |
| 40 | +│ ┌─────────────────────────────────────┐ │ |
| 41 | +│ │ Services (Security, etc.) │ │ |
| 42 | +│ └─────────────────────────────────────┘ │ |
| 43 | +│ ┌─────────────────────────────────────┐ │ |
| 44 | +│ │ Models (SQLAlchemy) │ │ |
| 45 | +│ └─────────────────────────────────────┘ │ |
| 46 | +├─────────────────────────────────────────┤ |
| 47 | +│ MariaDB (Port 3306) │ MongoDB │ |
| 48 | +│ Données métiers │ (Port 27017) │ |
| 49 | +│ │ Logs système │ |
| 50 | +└─────────────────────────────────────────┘ |
| 51 | +``` |
| 52 | + |
| 53 | +## 📁 Structure du Projet |
| 54 | + |
| 55 | +```ini |
| 56 | +acfc_base/ |
| 57 | +├── app_acfc/ # Application principale |
| 58 | +│ ├── application.py # Point d'entrée Flask |
| 59 | +│ ├── modeles.py # Modèles SQLAlchemy |
| 60 | +│ ├── services.py # Services (sécurité, etc.) |
| 61 | +│ ├── contextes_bp/ # Modules métiers (Blueprints) |
| 62 | +│ │ ├── clients.py # Module CRM |
| 63 | +│ │ ├── catalogue.py # Module Catalogue |
| 64 | +│ │ ├── commercial.py # Module Commercial |
| 65 | +│ │ ├── comptabilite.py # Module Comptabilité |
| 66 | +│ │ └── stocks.py # Module Stocks |
| 67 | +│ ├── templates/ # Templates HTML |
| 68 | +│ └── statics/ # Ressources statiques (CSS/JS) |
| 69 | +├── mariadb/ # Configuration base de données |
| 70 | +│ ├── dockerfile.mariadb # Dockerfile MariaDB |
| 71 | +│ └── init_db.sql # Script d'initialisation |
| 72 | +├── nginx/ # Configuration reverse proxy |
| 73 | +├── mongo/ # Configuration MongoDB |
| 74 | +├── docker-compose.yml # Orchestration des services |
| 75 | +└── requirements-app.txt # Dépendances Python |
| 76 | +``` |
| 77 | + |
| 78 | +## 🔐 Sécurité Implémentée |
| 79 | + |
| 80 | +### Authentification |
| 81 | + |
| 82 | +- **Hachage Argon2** : Protection des mots de passe (résistant GPU) |
| 83 | +- **Sessions sécurisées** : Stockage filesystem + chiffrement |
| 84 | +- **Protection force brute** : Compteur d'erreurs + verrouillage |
| 85 | +- **Expiration automatique** : Timeout 30 minutes |
| 86 | + |
| 87 | +### Configuration Sécurisée |
| 88 | + |
| 89 | +```python |
| 90 | +# services.py - Configuration Argon2 |
| 91 | +PasswordHasher( |
| 92 | + time_cost=4, # 4 itérations |
| 93 | + memory_cost=2**16, # 64KB mémoire (anti-GPU) |
| 94 | + parallelism=3, # 3 threads parallèles |
| 95 | + hash_len=32, # Hash 256 bits |
| 96 | + salt_len=16 # Sel 128 bits |
| 97 | +) |
| 98 | +``` |
| 99 | + |
| 100 | +### Sessions |
| 101 | + |
| 102 | +- **HTTPOnly cookies** : Protection XSS |
| 103 | +- **Signature cryptographique** : Intégrité des données |
| 104 | +- **Stockage filesystem** : Plus sécurisé que les cookies |
| 105 | +- **Clé secrète** : Via variables d'environnement |
| 106 | + |
| 107 | +## 🗄️ Modèle de Données |
| 108 | + |
| 109 | +### Entités Principales |
| 110 | + |
| 111 | +```sql |
| 112 | +-- Utilisateurs et sécurité |
| 113 | +99_users (id, pseudo, sha_mdp, email, role, is_active...) |
| 114 | + |
| 115 | +-- CRM - Gestion clients |
| 116 | +01_clients (id, type_client, id_part, id_pro, created_at...) |
| 117 | +011_part (id, prenom, nom, date_naissance...) |
| 118 | +012_pro (id, raison_sociale, siren, rna...) |
| 119 | + |
| 120 | +-- Contacts |
| 121 | +02_mail (id, id_client, type_mail, mail, is_principal...) |
| 122 | +03_telephone (id, id_client, type_telephone, indicatif, telephone...) |
| 123 | +04_adresse (id, id_client, type_adresse, adresse_complete...) |
| 124 | + |
| 125 | +-- Commercial |
| 126 | +11_commandes (id, id_client, montant_ht, tva, statut...) |
| 127 | +12_lignes_commande (id, id_commande, id_produit, quantite, prix...) |
| 128 | + |
| 129 | +-- Comptabilité |
| 130 | +30_pcg (compte, libelle, type_compte...) |
| 131 | +31_operations (id, date_operation, libelle, montant...) |
| 132 | + |
| 133 | +-- Stocks |
| 134 | +20_produits (id, reference, designation, prix_unitaire...) |
| 135 | +21_mouvements_stock (id, id_produit, type_mouvement, quantite...) |
| 136 | +``` |
| 137 | + |
| 138 | +### Relations Clés |
| 139 | + |
| 140 | +- **Client polymorphe** : Part OU Pro selon type_client |
| 141 | +- **Contacts multiples** : N emails/téléphones par client |
| 142 | +- **Traçabilité complète** : created_at, updated_at sur toutes les entités |
| 143 | +- **Soft delete** : is_active pour conservation historique |
| 144 | + |
| 145 | +## 🐳 Déploiement Docker |
| 146 | + |
| 147 | +### Services Déployés |
| 148 | + |
| 149 | +```yaml |
| 150 | +# docker-compose.yml |
| 151 | +services: |
| 152 | + acfc-app: # Application Flask (port 5000) |
| 153 | + acfc-nginx: # Reverse proxy (port 80/443) |
| 154 | + acfc-db: # MariaDB (port 3306) |
| 155 | + acfc-logs: # MongoDB (port 27017) |
| 156 | +``` |
| 157 | +
|
| 158 | +### Variables d'Environnement (.env) |
| 159 | +
|
| 160 | +```bash |
| 161 | +# Base de données |
| 162 | +DB_HOST=localhost |
| 163 | +DB_PORT=3306 |
| 164 | +DB_NAME=****** |
| 165 | +DB_USER=****** |
| 166 | +DB_PASSWORD=mot_de_passe_securise |
| 167 | +DB_ROOT_PASSWORD=mot_de_passe_root_securise |
| 168 | + |
| 169 | +# Sessions |
| 170 | +SESSION_PASSKEY=cle_secrete_tres_longue_et_aleatoire |
| 171 | + |
| 172 | +# MongoDB |
| 173 | +MONGO_INITDB_ROOT_USERNAME=admin |
| 174 | +MONGO_INITDB_ROOT_PASSWORD=mot_de_passe_mongo |
| 175 | +MONGO_INITDB_DATABASE=****** |
| 176 | +``` |
| 177 | + |
| 178 | +### Commandes de Déploiement |
| 179 | + |
| 180 | +```bash |
| 181 | +# Développement |
| 182 | +docker-compose up -d |
| 183 | + |
| 184 | +# Production (avec rebuild) |
| 185 | +docker-compose up -d --build |
| 186 | + |
| 187 | +# Logs en temps réel |
| 188 | +docker-compose logs -f |
| 189 | + |
| 190 | +# Arrêt propre |
| 191 | +docker-compose down |
| 192 | + |
| 193 | +# Nettoyage complet (ATTENTION: perte de données) |
| 194 | +docker-compose down -v |
| 195 | +``` |
| 196 | + |
| 197 | +## 📊 Monitoring et Logs |
| 198 | + |
| 199 | +### Health Checks |
| 200 | + |
| 201 | +- **MariaDB** : Vérification connexion SQL |
| 202 | +- **MongoDB** : Test ping base de données |
| 203 | +- **Application** : Endpoint de santé (à implémenter) |
| 204 | + |
| 205 | +### Logging |
| 206 | + |
| 207 | +```python |
| 208 | +# Configuration recommandée |
| 209 | +import logging |
| 210 | +logging.basicConfig( |
| 211 | + level=logging.INFO, |
| 212 | + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', |
| 213 | + handlers=[ |
| 214 | + logging.FileHandler('/app/logs/acfc.log'), |
| 215 | + logging.StreamHandler() |
| 216 | + ] |
| 217 | +) |
| 218 | +``` |
| 219 | + |
| 220 | +## 🔧 Configuration de Développement |
| 221 | + |
| 222 | +### Prérequis |
| 223 | + |
| 224 | +- Python 3.12+ |
| 225 | +- Docker & Docker Compose |
| 226 | +- Git |
| 227 | + |
| 228 | +### Installation Locale |
| 229 | + |
| 230 | +```bash |
| 231 | +# Clone du projet |
| 232 | +git clone <repository> |
| 233 | +cd acfc_base |
| 234 | + |
| 235 | +# Environnement virtuel Python |
| 236 | +python -m venv venv |
| 237 | +source venv/bin/activate # Linux/Mac |
| 238 | +# ou |
| 239 | +venv\Scripts\activate # Windows |
| 240 | + |
| 241 | +# Installation des dépendances |
| 242 | +pip install -r requirements-app.txt |
| 243 | + |
| 244 | +# Configuration environnement |
| 245 | +cp .env.example .env |
| 246 | +# Éditer .env avec vos paramètres |
| 247 | + |
| 248 | +# Démarrage des services |
| 249 | +docker-compose up -d |
| 250 | + |
| 251 | +# Test de l'application |
| 252 | +curl http://localhost:5000 |
| 253 | +``` |
| 254 | + |
| 255 | +### Debug Mode |
| 256 | + |
| 257 | +```python |
| 258 | +# application.py - Mode développement |
| 259 | +if __name__ == '__main__': |
| 260 | + app.run( |
| 261 | + host="0.0.0.0", |
| 262 | + port=5000, |
| 263 | + debug=True, # Rechargement automatique |
| 264 | + use_reloader=True # Surveillance des fichiers |
| 265 | + ) |
| 266 | +``` |
| 267 | + |
| 268 | +## 📈 Évolutions Futures |
| 269 | + |
| 270 | +### Fonctionnalités Prévues |
| 271 | + |
| 272 | +- [ ] **API REST complète** : Documentation OpenAPI/Swagger |
| 273 | +- [ ] **Authentification OAuth2** : SSO entreprise |
| 274 | +- [ ] **Tableau de bord** : Métriques temps réel |
| 275 | +- [ ] **Export avancé** : PDF, Excel, CSV |
| 276 | +- [ ] **Notifications** : Email, SMS, push |
| 277 | +- [ ] **Audit trail** : Traçabilité complète des actions |
| 278 | +- [ ] **Multi-tenant** : Support plusieurs entreprises |
| 279 | + |
| 280 | +### Optimisations Techniques |
| 281 | + |
| 282 | +- [ ] **Cache Redis** : Performance requêtes fréquentes |
| 283 | +- [ ] **Migrations Alembic** : Évolution schéma base |
| 284 | +- [ ] **Tests automatisés** : Coverage >80% |
| 285 | +- [ ] **CI/CD Pipeline** : GitLab/GitHub Actions |
| 286 | +- [ ] **Monitoring APM** : New Relic, DataDog |
| 287 | +- [ ] **Load balancing** : Haute disponibilité |
| 288 | + |
| 289 | +## 🤝 Contribution |
| 290 | + |
| 291 | +### Standards de Code |
| 292 | + |
| 293 | +- **PEP 8** : Style Python |
| 294 | +- **Type hints** : Annotations obligatoires |
| 295 | +- **Docstrings** : Documentation des fonctions |
| 296 | +- **Tests unitaires** : Pytest |
| 297 | + |
| 298 | +### Git Workflow |
| 299 | + |
| 300 | +```bash |
| 301 | +# Branche de feature |
| 302 | +git checkout -b feature/nouvelle-fonctionnalite |
| 303 | + |
| 304 | +# Commits atomiques et explicites |
| 305 | +git commit -m "feat(clients): ajout recherche avancée clients" |
| 306 | + |
| 307 | +# Pull request avec review |
| 308 | +git push origin feature/nouvelle-fonctionnalite |
| 309 | +``` |
| 310 | + |
| 311 | +## 📞 Support |
| 312 | + |
| 313 | +### Contacts |
| 314 | + |
| 315 | +- **Équipe de développement** : Rémi Verschuur |
| 316 | +- **Documentation** : Ce fichier + commentaires code |
| 317 | +- **Issues** : Tracker Git du projet |
| 318 | + |
| 319 | +### Ressources |
| 320 | + |
| 321 | +- [Documentation Flask](https://flask.palletsprojects.com/) |
| 322 | +- [SQLAlchemy ORM](https://docs.sqlalchemy.org/) |
| 323 | +- [Docker Compose](https://docs.docker.com/compose/) |
| 324 | +- [MariaDB](https://mariadb.org/documentation/) |
| 325 | + |
| 326 | +--- |
| 327 | + |
| 328 | +*Documentation mise à jour : Août 2025* |
| 329 | +*Version ACFC : 1.0* |
0 commit comments