feat: map prix marché as compare_at_price (barré) on Shopify
When Prix remisé is set: price = remisé, compare_at_price = marché When no remise: price = marché, compare_at_price = null Diff now detects compareAtPrice changes to trigger updates Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -59,7 +59,9 @@ export function parseSheetRows(rows: string[][]): SyncProduct[] {
|
|||||||
const publie = get(row, idx.publie).toLowerCase()
|
const publie = get(row, idx.publie).toLowerCase()
|
||||||
const status = publie.includes('inac') || publie === 'non' || publie === 'false' ? 'draft' : 'active'
|
const status = publie.includes('inac') || publie === 'non' || publie === 'false' ? 'draft' : 'active'
|
||||||
|
|
||||||
const prixRemise = get(row, idx.prixRemise).replace(',', '.')
|
const rawRemise = get(row, idx.prixRemise).replace(',', '.')
|
||||||
|
const prixRemise = parseFloat(rawRemise || '0')
|
||||||
|
const hasRemise = !isNaN(prixRemise) && prixRemise > 0
|
||||||
const longueur = get(row, idx.longueur)
|
const longueur = get(row, idx.longueur)
|
||||||
const largeur = get(row, idx.largeur)
|
const largeur = get(row, idx.largeur)
|
||||||
const specificFields = extractSpecificFields(headers, row)
|
const specificFields = extractSpecificFields(headers, row)
|
||||||
@@ -69,11 +71,12 @@ export function parseSheetRows(rows: string[][]): SyncProduct[] {
|
|||||||
handle: normalizeHandle(ref),
|
handle: normalizeHandle(ref),
|
||||||
title: get(row, idx.nom) || ref,
|
title: get(row, idx.nom) || ref,
|
||||||
description: '',
|
description: '',
|
||||||
price: price.toFixed(2),
|
price: hasRemise ? prixRemise.toFixed(2) : price.toFixed(2),
|
||||||
|
compareAtPrice: hasRemise ? price.toFixed(2) : undefined,
|
||||||
stock: parseInt(get(row, idx.stock) || '0', 10) || 0,
|
stock: parseInt(get(row, idx.stock) || '0', 10) || 0,
|
||||||
weightKg: parseFloat(get(row, idx.poids).replace(',', '.') || '0') || undefined,
|
weightKg: parseFloat(get(row, idx.poids).replace(',', '.') || '0') || undefined,
|
||||||
status,
|
status,
|
||||||
prixRemise: prixRemise || undefined,
|
prixRemise: hasRemise ? prixRemise.toFixed(2) : undefined,
|
||||||
marque: get(row, idx.marque) || undefined,
|
marque: get(row, idx.marque) || undefined,
|
||||||
famille: get(row, idx.famille) || undefined,
|
famille: get(row, idx.famille) || undefined,
|
||||||
sousFamille: get(row, idx.sousFamille) || undefined,
|
sousFamille: get(row, idx.sousFamille) || undefined,
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ export function getConfig() {
|
|||||||
interface ShopifyVariant {
|
interface ShopifyVariant {
|
||||||
id: number
|
id: number
|
||||||
price: string
|
price: string
|
||||||
|
compare_at_price: string | null
|
||||||
sku: string
|
sku: string
|
||||||
inventory_quantity: number
|
inventory_quantity: number
|
||||||
}
|
}
|
||||||
@@ -42,6 +43,7 @@ function toSyncProduct(p: ShopifyAPIProduct): ShopifyProductFull {
|
|||||||
title: p.title,
|
title: p.title,
|
||||||
description: p.body_html ?? '',
|
description: p.body_html ?? '',
|
||||||
price: p.variants[0]?.price ?? '0.00',
|
price: p.variants[0]?.price ?? '0.00',
|
||||||
|
compareAtPrice: p.variants[0]?.compare_at_price ?? undefined,
|
||||||
stock: p.variants[0]?.inventory_quantity ?? 0,
|
stock: p.variants[0]?.inventory_quantity ?? 0,
|
||||||
status: p.status === 'active' ? 'active' : 'draft',
|
status: p.status === 'active' ? 'active' : 'draft',
|
||||||
images: (p.images ?? []).map(i => i.src),
|
images: (p.images ?? []).map(i => i.src),
|
||||||
@@ -93,6 +95,7 @@ export async function createShopifyProduct(product: SyncProduct): Promise<string
|
|||||||
|
|
||||||
const variant: Record<string, unknown> = {
|
const variant: Record<string, unknown> = {
|
||||||
price: product.price,
|
price: product.price,
|
||||||
|
compare_at_price: product.compareAtPrice ?? null,
|
||||||
sku: product.ref,
|
sku: product.ref,
|
||||||
inventory_management: 'shopify',
|
inventory_management: 'shopify',
|
||||||
}
|
}
|
||||||
@@ -179,7 +182,7 @@ export async function updateShopifyProduct(
|
|||||||
title: product.title,
|
title: product.title,
|
||||||
body_html: product.description,
|
body_html: product.description,
|
||||||
status: product.status,
|
status: product.status,
|
||||||
variants: [{ id: variantId, price: product.price }],
|
variants: [{ id: variantId, price: product.price, compare_at_price: product.compareAtPrice ?? null }],
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
import type { SyncProduct, ShopifyProductFull, SyncChange, DiffResult } from '@/types/sync'
|
import type { SyncProduct, ShopifyProductFull, SyncChange, DiffResult } from '@/types/sync'
|
||||||
|
|
||||||
const COMPARABLE_FIELDS = ['title', 'description', 'price', 'status'] as const
|
const COMPARABLE_FIELDS = ['title', 'description', 'price', 'compareAtPrice', 'status'] as const
|
||||||
|
|
||||||
function getChangedFields(
|
function getChangedFields(
|
||||||
sheet: SyncProduct,
|
sheet: SyncProduct,
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ export interface SyncProduct {
|
|||||||
stock: number // colonne E
|
stock: number // colonne E
|
||||||
weightKg?: number // poids en kg pour l'expédition
|
weightKg?: number // poids en kg pour l'expédition
|
||||||
status: 'active' | 'draft' // colonne F : "inactif"/"inactif" → draft, tout autre → active
|
status: 'active' | 'draft' // colonne F : "inactif"/"inactif" → draft, tout autre → active
|
||||||
|
compareAtPrice?: string
|
||||||
// Champs enrichis
|
// Champs enrichis
|
||||||
prixRemise?: string
|
prixRemise?: string
|
||||||
marque?: string
|
marque?: string
|
||||||
|
|||||||
Reference in New Issue
Block a user