Comportement d'Upsert dans l'Import JSON
Le frontend a été modifié pour implémenter un comportement d'upsert (création ou mise à jour) lors de l'import de fichiers JSON, sans modifier le backend.
Fonctionnement
1. Tentative de création initiale
- Tous les éléments du JSON sont envoyés au backend via POST
- Le backend traite selon sa logique normale :
- ✅ Nouveaux éléments : créés
- ⏭️ Éléments existants : ignorés (status: 'skipped') ou erreur "déjà existant"
- ❌ Éléments invalides : erreur
2. Mise à jour des éléments ignorés
Si des éléments ont été ignorés (skipped) ou retournent une erreur de duplication, le frontend :
- Récupère tous les éléments existants via GET
- Identifie les correspondances selon les critères uniques :
- Produits : EAN
- Fournisseurs : codeFournisseur
- Magasins : nom
- Entrepôts : nom
- Met à jour via PATCH chaque élément correspondant
Critères d'identification
| Table | Clé unique | Condition d'update |
|---|
Détection des erreurs de duplication
Le système détecte automatiquement les erreurs de duplication en analysant les messages d'erreur du backend :
"SKU déjà existant""EAN déjà existant""already exists""duplicate"
Ces erreurs sont traitées comme des éléments à mettre à jour plutôt que des vraies erreurs.
Exemple de flux
Import de produits
[
{
"ean": "1234567890123",
"nom": "TV Samsung Updated",
"prixDeVenteCents": 79900
},
{
"ean": "9876543210987",
"nom": "TV LG New",
"prixDeVenteCents": 69900
}
]
Résultat :
- Si EAN
1234567890123existe et n'est pas supprimé → Mise à jour - Si EAN
9876543210987n'existe pas → Création
Messages de retour
Le système affiche un message détaillé :
X élément(s) créé(s), Y élément(s) mis à jour, Z erreur(s)- Couleur du toast :
- 🟢 Succès : si aucune erreur
- 🔴 Erreur : si des erreurs sont survenues
Logs de debug
Ouvrez la console du navigateur (F12) pour voir les logs détaillés :
- 🚀 Début de l'upsert
- 📡 URL d'API utilisée
- 🔨 Tentative de création
- 📊 Résultat de création
- 🔄 Tentative de mise à jour
- 🔧 Détails de chaque mise à jour
- 🎯 Résultat final
Formats de réponse backend supportés
Format import (endpoints /import)
{
"success": true,
"summary": {
"total": 2,
"created": 1,
"skipped": 1,
"errors": 0
}
}
Format création bulk (endpoints normaux)
{
"succes": true,
"crees": 1,
"resultats": [
{
"index": 0,
"statut": "success"
},
{
"index": 1,
"statut": "erreur",
"message": "SKU déjà existant"
}
]
}
Limitations
- Backend inchangé : La logique d'import native du backend reste intacte
- Performance : Pour de gros volumes, cela peut être plus lent car nécessite plusieurs appels API
- Atomicité : L'opération n'est pas atomique - certains éléments peuvent être créés/mis à jour même si d'autres échouent
Cas d'usage
✅ Adapté pour :
- Synchronisation de catalogues
- Mise à jour de prix/informations produits
- Import de corrections/améliorations
❌ Non adapté pour :
- Import initial de très gros volumes
- Opérations nécessitant une atomicité stricte
Implémentation technique
Fichier modifié
frontend/src/pages/ReferentielPage.tsx
Fonction principale
async function handleUpsertFromJson(parsedData: any[]);
Points clés
- Détection automatique du format de réponse backend
- Gestion des erreurs de duplication comme éléments à mettre à jour
- Matching par clé unique selon le type d'entité