# ✅ Import .md avec détection de doublons - COMPLÉTÉ ## Modifications apportées La fonctionnalité d'import de fichiers .md a été améliorée avec une **vérification automatique des doublons**. ### Backend modifié **[backend/app/api/endpoints/peripherals.py](backend/app/api/endpoints/peripherals.py)** Ajout de la vérification de doublon dans l'endpoint `/api/peripherals/import/markdown` : ```python # Check for existing peripheral with same vendor_id and product_id existing_peripheral = None vendor_id = suggested.get("caracteristiques_specifiques", {}).get("vendor_id") product_id = suggested.get("caracteristiques_specifiques", {}).get("product_id") if vendor_id and product_id: # Search for peripheral with matching vendor_id and product_id all_peripherals = db.query(Peripheral).all() for periph in all_peripherals: if periph.caracteristiques_specifiques: p_vendor = periph.caracteristiques_specifiques.get("vendor_id") p_product = periph.caracteristiques_specifiques.get("product_id") if p_vendor == vendor_id and p_product == product_id: existing_peripheral = periph break ``` **Retour API :** - Si **nouveau** : `already_exists: false` + `suggested_peripheral` - Si **existe** : `already_exists: true` + `existing_peripheral` ### Frontend modifié **[frontend/js/peripherals.js](frontend/js/peripherals.js)** La fonction `importMarkdown()` gère maintenant deux cas : #### Cas 1 : Périphérique nouveau ```javascript if (result.already_exists) { // Doublon détecté... } else if (result.suggested_peripheral) { // Nouveau périphérique closeModal('modal-import-md'); showAddModal(); // Pré-remplir tous les champs du formulaire if (suggested.nom) document.getElementById('nom').value = suggested.nom; if (suggested.type_principal) { ... } // etc. showSuccess(`Fichier ${result.filename} importé avec succès. Vérifiez et complétez les informations.`); } ``` #### Cas 2 : Périphérique existant (doublon) ```javascript if (result.already_exists) { closeModal('modal-import-md'); const existing = result.existing_peripheral; const message = `Ce périphérique existe déjà dans la base de données:\n\n` + `Nom: ${existing.nom}\n` + `Marque: ${existing.marque || 'N/A'}\n` + `Modèle: ${existing.modele || 'N/A'}\n` + `Quantité: ${existing.quantite_totale}\n\n` + `Voulez-vous voir ce périphérique?`; if (confirm(message)) { // Redirige vers la page de détail window.location.href = `peripheral-detail.html?id=${existing.id}`; } else { showInfo(`Import annulé - le périphérique "${existing.nom}" existe déjà.`); } } ``` ### Documentation mise à jour **[FEATURE_IMPORT_MD.md](FEATURE_IMPORT_MD.md)** Ajout de deux workflows détaillés : - Workflow Cas 1 : Périphérique nouveau (18 étapes) - Workflow Cas 2 : Périphérique existant avec doublon (13 étapes) ## Fonctionnement ### Détection des doublons La vérification se fait sur **vendor_id + product_id** : 1. Le fichier .md est parsé 2. On extrait `vendor_id` et `product_id` (depuis le contenu ou le nom de fichier) 3. On recherche dans la base tous les périphériques existants 4. On compare les `vendor_id` et `product_id` de chaque périphérique 5. Si match trouvé → **Doublon détecté** **Exemple :** ```markdown Fichier : ID_0781_55ab.md → vendor_id = 0x0781 → product_id = 0x55ab Recherche dans la base : → Périphérique #42 : vendor_id=0x0781, product_id=0x55ab → MATCH ! → Doublon détecté ``` ### Expérience utilisateur **Si nouveau périphérique :** 1. Modal import se ferme 2. Modal ajout s'ouvre 3. Formulaire pré-rempli avec toutes les données du fichier .md 4. L'utilisateur complète (prix, localisation, photos) 5. Enregistre → Périphérique créé **Si périphérique existe déjà :** 1. Modal import se ferme 2. Dialog de confirmation s'affiche : ``` Ce périphérique existe déjà dans la base de données: Nom: SanDisk USB Flash Drive Marque: SanDisk Modèle: 3.2Gen1 Quantité: 2 Voulez-vous voir ce périphérique? ``` 3. Si **OUI** → Redirige vers la page de détail du périphérique existant 4. Si **NON** → Message "Import annulé - le périphérique existe déjà" ## Test rapide ```bash # 1. Redémarrer le backend docker compose restart backend # 2. Importer un nouveau fichier (ex: ID_0b05_17cb.md) # Via interface : http://localhost:8087/peripherals.html # Bouton "Importer .md" → Sélectionner fichier → Importer # Résultat : Formulaire pré-rempli # 3. Réimporter le MÊME fichier # Résultat : Message "Ce périphérique existe déjà..." avec option de voir # 4. Test API direct curl -X POST http://localhost:8007/api/peripherals/import/markdown \ -F "file=@fichier_usb/ID_0b05_17cb.md" | jq # Premier import : already_exists = false # Second import : already_exists = true ``` ## Avantages ✅ **Évite les doublons** - Impossible d'importer deux fois le même périphérique (vendor_id + product_id) ✅ **Navigation rapide** - Si doublon, option de voir directement le périphérique existant ✅ **Informé** - L'utilisateur sait immédiatement si le périphérique existe déjà ✅ **Transparence** - Affiche les infos du périphérique existant (nom, marque, modèle, quantité) ✅ **Workflow fluide** - Modal se ferme automatiquement, pas de confusion ## Fichiers modifiés | Fichier | Modifications | |---------|---------------| | [backend/app/api/endpoints/peripherals.py](backend/app/api/endpoints/peripherals.py) | +40 lignes - Vérification doublon | | [frontend/js/peripherals.js](frontend/js/peripherals.js) | +35 lignes - Gestion cas doublon | | [FEATURE_IMPORT_MD.md](FEATURE_IMPORT_MD.md) | +50 lignes - Documentation workflows | **Total :** ~125 lignes ajoutées --- **Développé avec Claude Code** - 2025-12-30