📋 MODULE D'IMPORT - DOCUMENTATION COMPLÈTE¶
🎯 Vue d'ensemble¶
Le module d'import permet d'importer des données depuis des fichiers Excel avec une gestion d'erreurs robuste, un suivi détaillé et une architecture extensible.
✅ IMPLÉMENTATION COMPLÈTE¶
📦 Structure créée¶
apps/imports/
├── __init__.py
├── admin.py # Interface admin Django
├── apps.py # Configuration de l'app
├── forms.py # Formulaires d'import
├── models.py # Modèles Import & ImportRow
├── urls.py # Routes URL
├── views.py # Vues (List, Detail, Import)
├── utils.py # Génération de templates Excel
├── importers/
│ ├── __init__.py
│ ├── base.py # AbstractImporter (classe de base)
│ └── dentist.py # DentistImporter
├── migrations/
│ ├── __init__.py
│ └── 0001_initial.py # Migration créée et appliquée ✓
└── templates/imports/
├── import_list.html # Liste globale des imports
├── import_detail.html # Statistiques détaillées
└── dentist_import.html # Formulaire d'import dentistes
🚀 FONCTIONNALITÉS¶
1. Architecture Robuste¶
Modèle Import (Historique complet)¶
- Tracking complet : Date, durée, utilisateur, fichier source
- Statistiques détaillées :
- Total lignes
- Lignes traitées
- Créées / Mises à jour / Ignorées / Échouées
- Taux de réussite calculé automatiquement
- 3 Modes de traitement :
dry_run: Test sans créer de données (prévisualisation)real: Import réel en base de données- 3 Stratégies d'import :
create_update: Créer & Mettre à jourcreate_only: Créer uniquementupdate_only: Mettre à jour uniquement
Modèle ImportRow (Détails ligne par ligne)¶
- Données brutes et nettoyées
- Liste des erreurs et avertissements par champ
- Statut individuel : pending, created, updated, skipped, failed
- Temps de traitement par ligne
- ID de l'objet créé/mis à jour
2. Gestion d'Erreurs Avancée¶
Point critique respecté : L'import ne s'arrête JAMAIS - Chaque ligne est traitée indépendamment - Les erreurs sont capturées et enregistrées - L'import continue même en cas d'erreurs multiples - Rapport détaillé à la fin avec toutes les erreurs
3. Import de Dentistes (Premier cas implémenté)¶
Structure du fichier Excel¶
Colonnes obligatoires (2) : - Prénom ✓ - Nom ✓
Colonnes optionnelles (19) : - Date de naissance (format: JJ/MM/AAAA) - Ville de naissance, Pays de naissance - Nationalité - Adresse (ligne 1 & 2, Code postal, Ville, Pays) - Téléphone, Email - Spécialité - Numéro RPPS (11 chiffres) - URL de réservation - Description, Commentaire - IDs externes : PMS ID, Logosw ID, Doctolib Agenda ID
Validation intelligente¶
- ✅ Email : Format valide
- ✅ Date de naissance : Formats multiples acceptés (JJ/MM/AAAA, AAAA-MM-JJ, etc.)
- ✅ RPPS : Exactement 11 chiffres
- ✅ URLs : Doivent commencer par http:// ou https://
Détection des doublons (recherche multi-critères)¶
Ordre de priorité : 1. Numéro RPPS (si présent) 2. IDs externes (PMS, Logosw, Doctolib) liés au cabinet 3. Nom + Prénom + Date de naissance
Création automatique des contrats¶
- Crée ou met à jour automatiquement un
DentistContract - Lie le dentiste au cabinet spécifié
- Stocke les IDs externes (PMS, Logosw, Doctolib)
🎨 INTERFACE UTILISATEUR¶
Pages créées¶
1. Liste globale des imports (/imports/)¶
- Tableau avec historique complet
- Filtres par statut, type, cabinet
- Statistiques en un coup d'œil
- Accès rapide aux détails
2. Formulaire d'import dentistes (/imports/dentists/)¶
- Sélection du cabinet
- Upload du fichier Excel
- Choix du mode (Test / Réel)
- Choix de la stratégie (Créer & MAJ / Créer seul / MAJ seul)
- Carte d'aide :
- Bouton de téléchargement du template
- Liste des champs requis
- Critères de correspondance
- Points d'attention
- Structure attendue : Tableau avec toutes les colonnes
3. Statistiques détaillées (/imports/<id>/)¶
- Bannière de statut (succès/échec/partiel)
- Taux de réussite en gros
- Cartes récapitulatives (type, cabinet, mode, stratégie)
- Statistiques complètes (total, traitées, créées, MAJ, ignorées, échouées)
- Informations de traçabilité (fichier, utilisateur, dates, durée)
- Détails ligne par ligne :
- Filtrage par statut (toutes, créées, MAJ, ignorées, échecs)
- Affichage des erreurs et avertissements
- Pagination (50 lignes par page)
Menu¶
✅ Lien "Imports" ajouté dans le menu ADMINISTRATION (sidebar)
- Icône : bi-upload
- Visible uniquement pour les admins (staff)
🛠️ UTILISATION¶
Télécharger le template Excel¶
- Aller sur
/imports/dentists/ - Cliquer sur "Télécharger le template" dans la carte d'aide
- Le fichier
template_import_dentistes.xlsxest téléchargé avec : - Onglet "Template" : Colonnes pré-configurées + exemple
- Onglet "Instructions" : Guide complet d'utilisation
Importer des dentistes¶
- Remplir le fichier Excel téléchargé
- Aller sur
/imports/dentists/ - Sélectionner le cabinet
- Uploader le fichier
- Choisir le mode :
- Test : Voir ce qui se passerait sans créer de données
- Réel : Créer/mettre à jour en base
- Choisir la stratégie :
- Créer & Mettre à jour : Mode complet (recommandé)
- Créer uniquement : Ignorer les existants
- Mettre à jour uniquement : Ignorer les nouveaux
- Cliquer sur "Lancer l'import"
- Voir les statistiques détaillées
Consulter l'historique¶
/imports/: Liste de tous les imports- Cliquer sur l'icône œil pour voir les détails
- Filtrer les lignes par statut pour analyser les erreurs
🔧 CONFIGURATION TECHNIQUE¶
Dépendances installées¶
Settings¶
URLs¶
Base de données¶
✅ Tables créées :
- import : Historique des imports
- import_row : Détails ligne par ligne
- 10 index pour optimisation des requêtes
📊 INTERFACE ADMIN DJANGO¶
Accès via /admin/
Import Admin¶
- Liste avec codes couleur (statut)
- Statistiques en un coup d'œil
- Taux de réussite calculé
- Filtres : type, statut, mode, stratégie, cabinet, date
- Recherche : fichier, cabinet, utilisateur
- Inline : Aperçu des 20 premières lignes
ImportRow Admin¶
- Liste des lignes avec statut coloré
- Indicateurs d'erreurs/avertissements
- Filtres : statut, type d'import, cabinet
- Affichage JSON des données brutes et nettoyées
🎯 EXTENSIBILITɶ
Pour ajouter un nouveau type d'import (ex: Patients, Traitements)¶
-
Créer l'importer dans
apps/imports/importers/patients.py:from .base import AbstractImporter class PatientImporter(AbstractImporter): import_type = Import.IMPORT_TYPE_PATIENT required_columns = ['Prénom', 'Nom'] column_mapping = { 'Prénom': 'first_name', 'Nom': 'last_name', # ... } def _validate_row_data(self, data): # Validation spécifique pass def _save_object(self, data): # Logique de création/MAJ pass @classmethod def get_template_columns(cls): # Définition des colonnes pass -
Créer la vue dans
views.py: -
Ajouter les URLs dans
urls.py: -
Créer le template
patient_import.html -
Ajouter le type dans
models.py:
🔮 AMÉLIORATIONS FUTURES (Optionnelles)¶
Support asynchrone avec Celery¶
Pour les imports volumineux (>1000 lignes) :
# tasks.py
from celery import shared_task
@shared_task
def process_import_async(import_id):
import_record = Import.objects.get(id=import_id)
importer = DentistImporter(import_record)
return importer.process()
Notifications par email¶
- Envoyer un email quand l'import est terminé
- Inclure les statistiques
- Joindre un rapport d'erreurs
Export des erreurs¶
- Bouton "Télécharger les erreurs en Excel"
- Fichier avec les lignes en erreur + messages
Planification d'imports¶
- Imports récurrents (ex: tous les lundis à 9h)
- Détection automatique de nouveaux fichiers dans un dossier
📖 EXEMPLE D'UTILISATION COMPLET¶
Scénario : Import de 10 dentistes¶
Fichier Excel :
Prénom | Nom | Email | RPPS | Spécialité
--------|---------|----------------------|-------------|-------------
Jean | Dupont | j.dupont@example.com | 12345678901 | Orthodontiste
Marie | Martin | m.martin@example.com | 98765432109 | Généraliste
Pierre | | p.durant@example.com | 11111111111 | Endodontiste <-- ERREUR: Nom manquant
Résultat de l'import : - Total lignes : 3 - Traitées : 2 - Créées : 2 - Échouées : 1 - Taux de réussite : 66.7%
Détails : - Ligne 2 (Jean Dupont) : ✓ Créé - Ligne 3 (Marie Martin) : ✓ Créé - Ligne 4 (Pierre) : ✗ Échec - "Le nom est requis"
🎉 SYSTÈME COMPLET ET OPÉRATIONNEL !¶
Le module d'import est entièrement fonctionnel et prêt à l'emploi : - ✅ Infrastructure globale extensible - ✅ Import de dentistes implémenté - ✅ Interface utilisateur complète - ✅ Gestion d'erreurs robuste - ✅ Statistiques détaillées - ✅ Documentation complète
URL principale : http://localhost:8000/imports/