fix: vérifier l'existence Shopify avant création pour éviter les doublons

- Chargement du catalogue Shopify au début de l'exécution (fetchAllShopifyProducts)
- Vérification par SKU (ref) : si déjà présent dans Shopify → skipped, pas de création
- Nouveau type d'événement 'skipped' dans CreationStreamEvent
- CreationProgress affiche les produits ignorés en amber avec le SKU concerné
- Résumé final inclut le compte de produits ignorés

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-12 00:08:06 +02:00
parent 297d47bd19
commit d8a3f26d0b
3 changed files with 34 additions and 7 deletions
@@ -10,6 +10,7 @@ export function CreationProgress({ events, done }: Props) {
const lastProgress = [...events].reverse().find(e => e.type === 'progress') as Extract<CreationStreamEvent, { type: 'progress' }> | undefined
const doneEvent = events.find(e => e.type === 'done') as Extract<CreationStreamEvent, { type: 'done' }> | undefined
const errors = events.filter(e => e.type === 'error') as Array<Extract<CreationStreamEvent, { type: 'error' }>>
const skipped = events.filter(e => e.type === 'skipped') as Array<Extract<CreationStreamEvent, { type: 'skipped' }>>
return (
<div className="space-y-4">
@@ -26,6 +27,17 @@ export function CreationProgress({ events, done }: Props) {
<p className="text-xs text-gray-400 mt-1 truncate">{lastProgress.tab} {lastProgress.title}</p>
</div>
)}
{skipped.length > 0 && (
<div className="space-y-1">
{skipped.map((e, i) => (
<div key={i} className="flex gap-2 p-2 bg-amber-900/20 border border-amber-800/40 rounded text-xs text-amber-300">
<span></span>
<span className="font-medium">{e.title}</span>
<span className="text-amber-500"> SKU {e.sku} déjà présent dans Shopify, ignoré</span>
</div>
))}
</div>
)}
{errors.length > 0 && (
<div className="space-y-1">
{errors.map((e, i) => (
@@ -43,6 +55,7 @@ export function CreationProgress({ events, done }: Props) {
</p>
<p className="text-sm text-gray-300 mt-1">
{doneEvent.summary.created} créé{doneEvent.summary.created > 1 ? 's' : ''}
{doneEvent.summary.skipped > 0 && `${doneEvent.summary.skipped} déjà existant${doneEvent.summary.skipped > 1 ? 's' : ''} (ignorés)`}
{doneEvent.summary.errors > 0 && `${doneEvent.summary.errors} erreur${doneEvent.summary.errors > 1 ? 's' : ''}`}
</p>
</div>