Commit Graph

126 Commits

Author SHA1 Message Date
C_Ma_For 31b764f458 fix: limit concurrent AI background removal to 2 to prevent browser crash
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-24 17:08:32 +02:00
C_Ma_For 8c9bce7aa5 feat: collection picker in product creation flow
- API /api/creation/collections liste toutes les collections Shopify
- Détection automatique depuis la colonne ID FAMILLE du Sheets
- Sélecteur avec recherche si absente ou pour modifier
- Collection affichée dans l'écran de confirmation
- collectionOverride passé à l'exécution comme fallback

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-24 16:12:54 +02:00
C_Ma_For 9e7423eee3 fix: pass tab filter to execute route so only selected family is created
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-24 15:51:47 +02:00
C_Ma_For 6d8be0645d feat: use 'Stock conditionné' for Shopify stock on carrelage tabs
Priorité à Stock conditionné (boîtes) sur Stock (en pièce) si renseigné.
Colonne exclue des métachamps spécifiques.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-24 15:42:55 +02:00
C_Ma_For 114e20c9fb feat: persist metafield resolutions across sessions
Les associations colonne→métachamp sont sauvegardées dans data/metafield-resolutions.json
et rechargées automatiquement à la prochaine création de produits.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-24 15:28:53 +02:00
C_Ma_For caef95bd55 feat: set stock and weight on Shopify product creation
- inventory_management: shopify + inventory_levels/set.json pour le stock
- weight/weight_unit sur le variant pour l'expédition

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-24 15:11:17 +02:00
C_Ma_For 34ade6beb2 feat: clear Shopify IDs from Sheets to allow product recreation
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-24 15:05:43 +02:00
C_Ma_For cdde567558 feat: placement mur/sol pour templates carrelage avec prompt adapté 2026-06-24 14:52:57 +02:00
C_Ma_For e85314eb77 feat: gestion templates mockup dans les paramètres avec familles depuis Sheets 2026-06-24 14:42:44 +02:00
C_Ma_For 5a10fd4221 feat: mockup modal avec sélection image existante, familles sheets et métachamps produit 2026-06-24 14:33:19 +02:00
C_Ma_For 93a616e997 feat: affichage images produit dans la liste avec thumbnail et compteur 2026-06-24 14:27:35 +02:00
C_Ma_For 41f5c245d4 feat: mockup modal accessible depuis la liste produits 2026-06-24 14:20:42 +02:00
C_Ma_For f6b0ba9685 feat: product picker with search in mockup page 2026-06-22 14:42:58 +02:00
C_Ma_For 4811b73c69 feat: mockup page with template library and generator UI 2026-06-22 12:27:35 +02:00
C_Ma_For 921d9d6a77 feat: MockupGenerator UI component with generate/regenerate/upload flow 2026-06-22 12:24:22 +02:00
C_Ma_For d138577a9d feat: mockup generation API route using gpt-image-1 2026-06-22 12:14:31 +02:00
C_Ma_For 1ef69dc205 feat: mockup template CRUD API routes 2026-06-22 12:10:26 +02:00
C_Ma_For 01e2fcd5e5 feat: mockup types and template storage library 2026-06-22 12:08:13 +02:00
C_Ma_For 07432bbd95 fix: conserver le type du métachamp lors de l'association manuelle
Sans le type, on envoyait toujours 'single_line_text_field' à Shopify,
causant une erreur quand le métachamp existant est de type number_decimal.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-19 13:05:31 +02:00
C_Ma_For 731d0dbde6 feat: recherche textuelle dans la sélection de métachamp existant
Remplace le <select> par un input filtrant en temps réel sur le nom,
la clé et le namespace — utile quand il y a beaucoup de métachamps.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-19 12:58:48 +02:00
C_Ma_For 42d0e2f855 feat: écriture de l'ID Shopify en col A du Sheets après création produit
Utilise un compte de service Google avec JWT pour authentifier les écritures
dans le Sheets — sans dépendance npm supplémentaire (crypto natif Node.js).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-19 12:42:17 +02:00
C_Ma_For 15f647f58a fix: vérifier le SKU exact dans la réponse Shopify (l'API ignore le filtre sur les SKUs avec tirets)
L'API variants.json ne filtre pas correctement par sku= quand le SKU contient
des tirets — elle retourne des variants aléatoires. On vérifie maintenant que
le variant retourné a bien le SKU demandé.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-19 12:01:02 +02:00
C_Ma_For cb227943f3 fix: prioritiser SKU sans suffixe numérique pour éviter faux match (ex: 26618-D-1 → 26618-D)
Un fichier nommé 26618-D-1.jpg trouvait le SKU 26618-D-1 (céramique) avant
de chercher 26618-D (la porte). On essaie maintenant d'abord le ref sans
suffixe purement numérique (-1, -2…).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-19 11:43:12 +02:00
C_Ma_For d45c9490c0 feat: curseur tolérance verre pour récupérer les zones semi-transparentes du détourage
Ajoute alphaThreshold (défaut 30) — les pixels dont l'alpha dépasse ce seuil
sont rendus opaques avant la composition sur fond blanc, évitant que le verre
ou les surfaces translucides soient supprimés par le modèle IA.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-19 11:28:42 +02:00
C_Ma_For c1fad5d0ed fix: retourner l'UGS la plus spécifique lors de la recherche par nom de fichier
Évite que "26618" matche avant "26618-D" car le tiret est un séparateur
de mot dans la regex — on collecte tous les matches et on garde le plus long.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-19 11:02:13 +02:00
C_Ma_For d8a3f26d0b 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>
2026-06-12 00:08:06 +02:00
C_Ma_For 297d47bd19 feat: détection et suppression des doublons produits Shopify
- deleteShopifyProduct() dans shopifySync (DELETE REST API)
- GET /api/products/duplicates : groupe par ref/SKU, trie par ID (ancien en premier)
- DELETE /api/products/[id] : suppression unitaire avec auth
- Page /produits/doublons : liste des groupes, radio pour choisir lequel garder,
  confirmation avant suppression, état par groupe (idle/confirm/deleting/done)
- Lien 'Vérifier les doublons' dans l'en-tête de la page Produits

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-11 23:57:53 +02:00
C_Ma_For a2c0789625 fix: ignorer les désactivations lors d'un sync filtré par famille
Quand un onglet est sélectionné, les produits Shopify absents du tab
peuvent appartenir à d'autres familles — ne pas les marquer 'deactivate'.
Les désactivations ne s'appliquent qu'en mode catalogue complet (sans filtre).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-11 23:37:29 +02:00
C_Ma_For 23aa78d3da feat: sélecteur de famille (onglet Sheets) en sync et création
- GET /api/sheets/tabs : liste les onglets Google Sheets disponibles
- readSheetProducts(tab?) et fetchPendingProducts(set, tab?) acceptent un filtre
- /api/sync/preview?tab=xxx et /api/creation/preview?tab=xxx filtrent sur un onglet
- Composant FamilySelector : grille de boutons chargeant les onglets dynamiquement
- Page Sync : étape 0 de sélection famille avant l'analyse
- Page Création : étape famille avant analyse, badge de famille sélectionnée

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-11 23:31:19 +02:00
C_Ma_For 1b07359415 feat: détection drift Sheets sur le dashboard (approche A)
- /api/dashboard/stats appelle Google Drive API pour récupérer modifiedTime du Sheets
- Compare avec createdAt de la dernière SyncRun → sheetDrift: boolean
- Dashboard affiche un bandeau amber cliquable si Sheets plus récent que la dernière sync

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-11 23:14:06 +02:00
C_Ma_For 6f4affcd66 fix: DiffTable colonnes visibles + filtrage lignes parasites dans Sheets
- table-fixed avec colgroup pour éviter que la colonne Ref écrase les autres
- overflow-x-auto pour permettre le scroll si nécessaire
- parseSheetRows : ignore les refs invalides (< 2 chars, caractères spéciaux, mots réservés)
- parseSheetRows : ignore les lignes sans prix valide (séparateurs, notes)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-11 23:09:08 +02:00
C_Ma_For 211d8c5c01 fix: supprimer variables inutilisées bloquant le build ESLint
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-11 22:49:22 +02:00
C_Ma_For d16cd1fbf5 feat: implémenter le dashboard avec KPIs, dernière sync et actions rapides
- Nouvel endpoint /api/dashboard/stats : comptes produits Shopify (actifs/brouillons/sans image) + dernière sync depuis Prisma
- Nouvel endpoint /api/dashboard/pending : nombre de produits en attente depuis Google Sheets (lazy)
- Page dashboard remplace le stub avec 4 KPIs, bloc dernière sync, et raccourcis vers les sections

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-11 22:42:57 +02:00
C_Ma_For fecf56ff09 fix: retry 429 avec backoff + sérialisation uploadAll + 409 traité comme skipped 2026-06-11 14:37:12 +02:00
C_Ma_For 85b0590d85 fix: split avant/après avec overflow-hidden et largeur dynamique 2026-06-11 13:40:14 +02:00
C_Ma_For 725a7508b0 feat: vérification image existante sur Shopify avant upload (statut 'Déjà sur Shopify') 2026-06-11 13:35:47 +02:00
C_Ma_For 4df074f02d fix: image sortie 1000x1000 centrée + affichage split avant/après corrigé 2026-06-11 13:14:41 +02:00
C_Ma_For 06cda68929 fix: match UGS comme mot entier n'importe où dans le nom de fichier 2026-06-11 12:51:27 +02:00
C_Ma_For c19510d413 fix: match UGS en début de nom de fichier exact (évite 30 de matcher 30827) 2026-06-11 12:47:26 +02:00
C_Ma_For 2de5c6670d fix: recherche produit par SKU Shopify avec fallback sans suffixe (30827-dessus → 30827) 2026-06-11 12:20:27 +02:00
C_Ma_For 6a08fccb7a fix: recherche UGS par contains dans le nom de fichier (ex: 30827-dessus contient 30827) 2026-06-10 09:38:16 +02:00
C_Ma_For da52080e3e fix: match UGS en préfixe dans search-sheets pour les images avec suffixe (dessus, -2, etc.) 2026-06-10 09:17:22 +02:00
C_Ma_For f0b6ddf145 fix: propager le type réel du métachamp Shopify pour éviter les erreurs 422 2026-06-09 21:54:41 +02:00
C_Ma_For d1e78e91e4 feat: sélection manuelle de produit Shopify quand réf. introuvable 2026-06-09 21:00:45 +02:00
C_Ma_For 071f126244 fix: re-ajouter import map onnxruntime-web pour détourage IA CDN 2026-06-09 14:54:29 +02:00
C_Ma_For 415b7db643 fix: détecter ligne d'en-têtes dynamiquement (row 1 vide sur OUTILLAGE etc, row 2 = vrais headers) 2026-06-09 14:50:23 +02:00
C_Ma_For 8ede847ba0 fix: recherche produit via Google Sheets (UGS col C → Shopify ID col A) + fallback Shopify 2026-06-09 13:41:53 +02:00
C_Ma_For 193edc80aa fix: originalUrl mis à jour avec JPEG après conversion HEIC (aperçu original noir) 2026-06-09 13:27:10 +02:00
C_Ma_For 1f8db29b15 fix: ErrorBoundary autour de ImagesPage pour capturer crash IA 2026-06-09 13:19:45 +02:00
C_Ma_For 4b9db5bebf fix: revert @imgly npm import → CDN + ErrorBoundary + next.config cleanup 2026-06-09 13:15:04 +02:00