Aller au contenu principal

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 :

  1. Récupère tous les éléments existants via GET
  2. Identifie les correspondances selon les critères uniques :
    • Produits : EAN
    • Fournisseurs : codeFournisseur
    • Magasins : nom
    • Entrepôts : nom
  3. Met à jour via PATCH chaque élément correspondant

Critères d'identification

TableClé uniqueCondition 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 1234567890123 existe et n'est pas supprimé → Mise à jour
  • Si EAN 9876543210987 n'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

  1. Backend inchangé : La logique d'import native du backend reste intacte
  2. Performance : Pour de gros volumes, cela peut être plus lent car nécessite plusieurs appels API
  3. 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é