[object Object]

← back to Hollywood Mfr Trim

Add recover24: write recovered Momentum SKUs->manufacturer_sku + mint HWC-61320..61343 for Goat Rock(Seto)+Hearst Castle(Layout); dry-run 144/24 clean, gated

651e394fd46f065cfc09bebf98899f511c45adaa · 2026-08-18 10:27:53 -0700 · steve

Files touched

Diff

commit 651e394fd46f065cfc09bebf98899f511c45adaa
Author: steve <steve@designerwallcoverings.com>
Date:   Tue Aug 18 10:27:53 2026 -0700

    Add recover24: write recovered Momentum SKUs->manufacturer_sku + mint HWC-61320..61343 for Goat Rock(Seto)+Hearst Castle(Layout); dry-run 144/24 clean, gated
---
 remediate.mjs | 36 ++++++++++++++++++++++++++++++++++--
 1 file changed, 34 insertions(+), 2 deletions(-)

diff --git a/remediate.mjs b/remediate.mjs
index 056beb8..c02b9fc 100644
--- a/remediate.mjs
+++ b/remediate.mjs
@@ -56,7 +56,39 @@ if(PART==='archived'){
     UNION ALL SELECT pid,'global',code FROM r WHERE g
   )
   SELECT COALESCE(json_agg(json_build_object('ownerId','gid://shopify/Product/'||pid,'namespace',ns,'key','dw_sku','type','single_line_text_field','value',code) ORDER BY pid,ns),'[]') FROM w;`;
-} else { console.error('Pass --part archived | mint75'); process.exit(1); }
+} else if(PART==='recover24'){
+  // 24 no-mfr (Goat Rock=Seto, Hearst Castle=Layout): recover per-color Momentum sku into manufacturer_sku
+  // AND mint HWC-61320+ into dw_sku. mint75 consumed HWC-61245..61319, so this continues at 61320.
+  SQL = `WITH b AS (
+    SELECT DISTINCT regexp_replace(shopify_id,'\\D','','g') AS pid, title,
+      regexp_replace(title,'^(Goat Rock|Hearst Castle) - ([A-Za-z]+).*','\\2') AS color,
+      CASE WHEN title LIKE 'Goat Rock%' THEN 'Seto' WHEN title LIKE 'Hearst Castle%' THEN 'Layout' END AS mpat,
+      (metafields->'custom'->'dw_sku'->>'value' ~ '^DWH[DW]') c,
+      (metafields->'dwc'->'dw_sku'->>'value' ~ '^DWH[DW]') d,
+      (metafields->'global'->'dw_sku'->>'value' ~ '^DWH[DW]') g
+    FROM shopify_products
+    WHERE (vendor='Hollywood Wallcoverings' OR dw_sku LIKE 'HWC-%')
+      AND status='ACTIVE' AND dw_sku IS NULL AND ${FAB}
+      AND (mfr_sku IS NULL OR TRIM(mfr_sku)='')
+  ), r AS (
+    SELECT b.pid, b.c, b.d, b.g, m.momentum_sku AS msku,
+      'HWC-'||(61319 + row_number() OVER (ORDER BY b.pid))::text AS hwc
+    FROM b JOIN LATERAL (
+      SELECT momentum_sku FROM momentum_colorways m
+      WHERE m.pattern_name=b.mpat AND TRIM(m.color_name)=b.color LIMIT 1
+    ) m ON true
+  ), w AS (
+    -- mint HWC into all 3 line-standard dw_sku namespaces (matches mint75; clears the fabricated code + populates the mirror)
+    SELECT pid,'custom' ns,'dw_sku' k,hwc v FROM r
+    UNION ALL SELECT pid,'dwc','dw_sku',hwc FROM r
+    UNION ALL SELECT pid,'global','dw_sku',hwc FROM r
+    -- write recovered Momentum sku into manufacturer_sku across the same 3 namespaces
+    UNION ALL SELECT pid,'custom','manufacturer_sku',msku FROM r
+    UNION ALL SELECT pid,'dwc','manufacturer_sku',msku FROM r
+    UNION ALL SELECT pid,'global','manufacturer_sku',msku FROM r
+  )
+  SELECT COALESCE(json_agg(json_build_object('ownerId','gid://shopify/Product/'||pid,'namespace',ns,'key',k,'type','single_line_text_field','value',v) ORDER BY pid,k,ns),'[]') FROM w;`;
+} else { console.error('Pass --part archived | mint75 | recover24'); process.exit(1); }
 
 const payload = psql(SQL);   // json_agg -> a single JSON array, parsed by the psql() helper
 
@@ -65,7 +97,7 @@ console.log(`Part: ${PART}  |  ${payload.length} dw_sku metafield writes across
 console.log(APPLY ? '>>> APPLY MODE — writing to LIVE Shopify' : '>>> DRY RUN (no writes). Pass --apply to execute.');
 
 if(!APPLY){
-  const byProd={}; for(const p of payload){ (byProd[p.ownerId] ||= []).push(`${p.namespace}=${p.value}`); }
+  const byProd={}; for(const p of payload){ (byProd[p.ownerId] ||= []).push(`${p.namespace}.${p.key}=${p.value}`); }
   for(const [gid,sets] of Object.entries(byProd)) console.log(`  ${gid.split('/').pop()}  ${sets.join('  ')}`);
   console.log(`\nDry run complete. ${payload.length} writes staged across ${prods.size} products.`);
   process.exit(0);

← 92f7fd7 Fan-out resolves deferred Group-B: 12/14 collides safe, 24 n  ·  back to Hollywood Mfr Trim  ·  recover24 APPLIED (144/144, verified live); add mint14 for t 71a981d →