Commit Graph

59 Commits

Author SHA1 Message Date
C_Ma_For ac58289bb7 feat: auto-fill mockup dimensions and family from Google Sheets
- Extend Sheets read range from A1:Z to A1:AZ (52 columns)
- Parse longueur, largeur, marque, famille, sousFamille, prixRemise, specificFields
- Add /api/products/sheet-info endpoint to fetch product data by ref
- Auto-fill family and dimensions on product selection in all 3 mockup entry points
- Strengthen carrelage mockup prompt with strict tile-size consistency rules

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-26 13:35:39 +02:00
C_Ma_For d276f6224c fix: log errors in writeShopifyIdToSheet and skip 404s in sync-stock
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-26 11:40:12 +02:00
C_Ma_For a9850c8efd feat: add bulk stock sync from Sheets to Shopify
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-26 10:35:52 +02:00
C_Ma_For 747f8a47b8 fix: handle 'Stock (pièce)' header variant in addition to 'Stock (en pièce)'
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-26 09:47:14 +02:00
C_Ma_For a334987b7c fix: connect inventory item to location before setting stock on product creation
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-26 09:35:09 +02:00
C_Ma_For 06587c1ccd fix: include Surface (m2) in specificFields for metafield resolution
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-26 09:27:46 +02:00
C_Ma_For 3ec0b9fa3c feat: add background image upload to banner builder
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-25 10:46:45 +02:00
C_Ma_For 4ce62c1473 feat: add banner builder with product search and canvas rendering
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-25 09:53:58 +02:00
C_Ma_For 0a3f5042fc feat: add bannières page to manage Shopify homepage slideshow
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-25 09:12:52 +02:00
C_Ma_For eec9bd5dce feat: make AI background removal optional with resize-only upload and batch detour selection
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-25 08:21:46 +02:00
C_Ma_For 03770d1a76 fix: propagate Shopify 404 through upload route so client retry triggers correctly
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-24 20:40:50 +02:00
C_Ma_For 36447a5c8c fix: improve product search robustness
- search-sheets: ne bloque plus sur l'absence d'ID Shopify en col A
- Shopify GraphQL: first:10 + match exact insensible à la casse au lieu de first:1

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-24 17:54:56 +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 93a616e997 feat: affichage images produit dans la liste avec thumbnail et compteur 2026-06-24 14:27:35 +02:00
C_Ma_For 01e2fcd5e5 feat: mockup types and template storage library 2026-06-22 12:08:13 +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 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 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 fecf56ff09 fix: retry 429 avec backoff + sérialisation uploadAll + 409 traité comme skipped 2026-06-11 14:37:12 +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 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 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 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 4b9db5bebf fix: revert @imgly npm import → CDN + ErrorBoundary + next.config cleanup 2026-06-09 13:15:04 +02:00
C_Ma_For a77f44b800 fix: @imgly/background-removal via npm + publicPath CDN + asyncWebAssembly webpack 2026-06-09 12:27:18 +02:00
C_Ma_For c4edcb568c feat: conversion HEIC serveur via sharp (fallback fiable Chrome/Firefox) 2026-06-09 11:24:24 +02:00
C_Ma_For e3246d022e fix: conversion HEIC — ajout fallback img+canvas pour Chrome macOS 2026-06-09 11:11:17 +02:00
C_Ma_For 9ab8b3ef60 fix: conversion HEIC native d'abord (Safari/macOS), heic2any fallback 30s 2026-06-09 11:07:04 +02:00
C_Ma_For 8d591bb769 fix: fetchMetafieldDefinitions + ensureMetafieldDefinition via GraphQL (REST n'expose pas cet endpoint) 2026-06-09 10:46:34 +02:00
C_Ma_For bb596c7e32 feat(plan5): page /creation stepper 4 étapes + lien nav + fix TS shopifyMetafields
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-09 10:20:36 +02:00
C_Ma_For 072110e655 feat(plan5): shopifyCollections — ajout produit à collection 2026-06-09 09:55:57 +02:00
C_Ma_For 421c275d48 feat(plan5): shopifyMetafields — matching + gestion définitions (TDD)
Implémente Task 4 du Plan 5:
- normalizeMetafieldKey: minuscules, accents retirés, espaces/parenth→_, max 30 chars
- matchMetafields: compare clé normalisée d'une colonne avec les clés existantes
- fetchMetafieldDefinitions: récupère les définitions Shopify existantes
- ensureMetafieldDefinition: crée une définition si manquante
- setProductMetafield: définit un métachamp sur un produit

7 tests passants (4 normalizeMetafieldKey + 3 matchMetafields).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-09 09:52:23 +02:00
C_Ma_For ed091711c8 feat(plan5): openaiClient — génération descriptions GPT-4o (TDD) 2026-06-09 09:42:26 +02:00
C_Ma_For 3aa770321c feat(plan5): creationSheets — lecture lignes en attente (TDD) 2026-06-09 09:40:23 +02:00
C_Ma_For 1e48ca142f fix: remplacer status=any par deux appels active+draft (API REST Shopify) 2026-06-09 00:05:53 +02:00
C_Ma_For c89ab1c818 feat: lire tous les onglets Google Sheets (un onglet par famille de produits) 2026-06-08 23:56:22 +02:00
C_Ma_For 4263b8afd0 fix: onglet Google Sheets par défaut MATRICE au lieu de Produits 2026-06-08 23:52:09 +02:00
C_Ma_For dc88e56f49 fix: supprimer API_VERSION inutilisé + eslint-disable _req 2026-06-08 22:59:30 +02:00
C_Ma_For e04e286111 fix: API Key Google Sheets (remplace service account) + signatures routes GET 2026-06-08 22:52:40 +02:00
C_Ma_For 2988ecab0b feat: logique diff Sheets/Shopify (TDD)
Implémentation de la fonction pure computeDiff pour calculer les changements
entre les produits Google Sheets et Shopify, avec distinction des opérations
(create, update, deactivate, unchanged) et traçabilité des champs modifiés.

- Matching par handle (ref normalisée)
- Comparaison des champs: title, description, price, status
- Draft products Shopify non synchronisés ne sont pas déactivés
- Tests TDD: 9 cas couverts (empty, create, unchanged, update, deactivate)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-08 20:51:21 +02:00
C_Ma_For f415138103 feat: client Shopify sync (fetch all products + CRUD) 2026-06-08 20:47:35 +02:00