- 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>
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>
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>
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>
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>
- 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>
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>
- 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>
- 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>
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>
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>
Implémente la lecture depuis Google Sheets avec la fonction de parsing en TDD.
- parseSheetRows(): parseur pur, testé avec 7 cas (tests unitaires)
- readSheetProducts(): client async qui utilise l'API v4 de Google Sheets
- Normalisation des handles (minuscules, tirets, trim)
- Gestion des prix français (virgule → point), status inactif → draft
- Valeurs par défaut pour colonnes manquantes
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Porte les 4 utilitaires de traitement d'images en TypeScript pour utilisation côté client :
- heicConverter.ts : convertit HEIC/HEIF en JPEG via heic2any
- bgRemover.ts : supprime les fonds d'images avec @imgly/background-removal + composite sur blanc
- imageRotator.ts : pivote les images JPEG via Canvas
- zipImporter.ts : extrait les images d'un fichier ZIP avec structure dossier-ref/image.ext
Tous les modules utilisent des APIs du navigateur et doivent être importés dynamiquement depuis du code 'use client'.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Sets up Prisma 7 with SQLite (better-sqlite3 adapter), User and SyncRun models, migration, and admin seed account for mathieu.fort@gmail.com.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>