Aller au contenu

📋 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 à jour
  • create_only : Créer uniquement
  • update_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)

✅ 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

  1. Aller sur /imports/dentists/
  2. Cliquer sur "Télécharger le template" dans la carte d'aide
  3. Le fichier template_import_dentistes.xlsx est téléchargé avec :
  4. Onglet "Template" : Colonnes pré-configurées + exemple
  5. Onglet "Instructions" : Guide complet d'utilisation

Importer des dentistes

  1. Remplir le fichier Excel téléchargé
  2. Aller sur /imports/dentists/
  3. Sélectionner le cabinet
  4. Uploader le fichier
  5. Choisir le mode :
  6. Test : Voir ce qui se passerait sans créer de données
  7. Réel : Créer/mettre à jour en base
  8. Choisir la stratégie :
  9. Créer & Mettre à jour : Mode complet (recommandé)
  10. Créer uniquement : Ignorer les existants
  11. Mettre à jour uniquement : Ignorer les nouveaux
  12. Cliquer sur "Lancer l'import"
  13. 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

pandas==2.3.3
openpyxl==3.1.5
numpy==2.3.5

Settings

INSTALLED_APPS = [
    ...
    'apps.imports',  # ✓ Ajouté
]

URLs

path('imports/', include('apps.imports.urls', namespace='imports'))  # ✓ Ajouté

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)

  1. 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
    

  2. Créer la vue dans views.py :

    class PatientImportView(AdminRequiredMixin, CreateView):
        model = Import
        form_class = PatientImportForm
        template_name = 'imports/patient_import.html'
        # ...
    

  3. Ajouter les URLs dans urls.py :

    path('patients/', views.PatientImportView.as_view(), name='patient_import'),
    

  4. Créer le template patient_import.html

  5. Ajouter le type dans models.py :

    IMPORT_TYPE_PATIENT = 'patient'
    IMPORT_TYPE_CHOICES = [
        ...
        (IMPORT_TYPE_PATIENT, _('Patients')),
    ]
    


🔮 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/