[object Object]

← back to Filemaker Mcp

Add Greenland cork disco script: stamps Date Discontinued on 15 WALLPAPER masters (recId 536960-536974) 2026-07-14

22d9eff6b22ea96de02adb885b1396281318059d · 2026-07-14 08:55:43 -0700 · Steve

Files touched

Diff

commit 22d9eff6b22ea96de02adb885b1396281318059d
Author: Steve <steve@designerwallcoverings.com>
Date:   Tue Jul 14 08:55:43 2026 -0700

    Add Greenland cork disco script: stamps Date Discontinued on 15 WALLPAPER masters (recId 536960-536974) 2026-07-14
---
 scripts/greenland-disco-2026-07-14.mjs | 88 ++++++++++++++++++++++++++++++++++
 1 file changed, 88 insertions(+)

diff --git a/scripts/greenland-disco-2026-07-14.mjs b/scripts/greenland-disco-2026-07-14.mjs
new file mode 100644
index 0000000..309548d
--- /dev/null
+++ b/scripts/greenland-disco-2026-07-14.mjs
@@ -0,0 +1,88 @@
+import fs from 'fs';
+import * as fm from '/Users/macstudio3/Projects/filemaker-mcp/src/fm-client.js';
+import { execFileSync } from 'child_process';
+
+const env = fs.readFileSync('/Users/macstudio3/Projects/secrets-manager/.env','utf8');
+const get = k => (env.match(new RegExp('^'+k+'=(.*)$','m'))||[])[1]?.trim();
+const TOKEN = get('SHOPIFY_ADMIN_TOKEN');
+const STORE = get('SHOPIFY_STORE') || 'designer-laboratory-sandbox.myshopify.com';
+const API = `https://${STORE}/admin/api/2024-10`;
+const H = { 'X-Shopify-Access-Token': TOKEN, 'Content-Type':'application/json' };
+const FULL = '*List Wallpapers - Full View';
+const ENTRY = 'Add wallcovering';
+const TODAY = '07/14/2026';       // FileMaker date format MM/DD/DD
+const TODAY_ISO = '2026-07-14';
+const sleep = ms=>new Promise(r=>setTimeout(r,ms));
+
+// [dw_sku, color, mfr, city, product_id, fm_recId, series]
+const items = [
+  ['Cork-500210','Sharkskin','G0154NQ8290','Southampton','7880972369971','536960'],
+  ['Cork-500220','Eden','G0154NQ8291','Southampton','7880972402739','536961'],
+  ['Cork-500230','Deep Taupe','G0154NQ8292','Southampton','7880972533811','536962'],
+  ['Cork-500240','Coffee Bean','G0154NQ8293','Southampton','7880972468275','536963'],
+  ['Cork-500250','Argan Oil','G0154NQ8294','Southampton','7880972435507','536964'],
+  ['Cork-500260','Winter Bloom','G0154NQ8295','Southampton','7880972501043','536965'],
+  ['Cork-500270','White','G0155NQ8296','Palm Beach','7880972140595','536966'],
+  ['Cork-500280','Eiffel Tower','G0155NQ8297','Palm Beach','7880972075059','536967'],
+  ['Cork-500290','Amphora','G0155NQ8298','Palm Beach','7880972173363','536968'],
+  ['Cork-500300','Rhododendron','G0155NQ8299','Palm Beach','7880972206131','536969'],
+  ['Cork-500310','Picante','G0155NQ8300','Palm Beach','7880972238899','536970'],
+  ['Cork-500320','Taupe Gray','G0155NQ8301','Palm Beach','7880972271667','536971'],
+  ['Cork-500330','Java','G0155NQ8302','Palm Beach','7880972337203','536972'],
+  ['Cork-500340','Blue Nights','G0155NQ8303','Palm Beach','7880972304435','536973'],
+  ['Cork-500350','Turkish Tile','G0155NQ8304','Palm Beach','7880972107827','536974'],
+];
+
+const ONLY = process.env.ONLY; // canary: only this dw_sku
+const work = ONLY ? items.filter(i=>i[0]===ONLY) : items;
+
+function psql(sql){
+  return execFileSync('psql', ['host=/tmp dbname=dw_unified','-tAc',sql], {encoding:'utf8'}).trim();
+}
+
+async function shopifyArchive(pid){
+  const gid = `gid://shopify/Product/${pid}`;
+  const q = `mutation($id:ID!){ productUpdate(input:{id:$id, status:ARCHIVED}){ product{ id status } userErrors{ field message } } }`;
+  const r = await fetch(`${API}/graphql.json`, {method:'POST',headers:H,body:JSON.stringify({query:q,variables:{id:gid}})});
+  const j = await r.json();
+  if (j.errors) throw new Error('GQL:'+JSON.stringify(j.errors));
+  const ue = j.data.productUpdate.userErrors;
+  if (ue && ue.length) throw new Error('userErrors:'+JSON.stringify(ue));
+  return j.data.productUpdate.product.status;
+}
+
+const report = [];
+for (const [sku,color,mfr,city,pid,recId] of work){
+  const row = { sku, color, mfr, pid, recId, shopify:null, fm:null, disco:null, err:[] };
+  // 1. Shopify archive
+  try { row.shopify = await shopifyArchive(pid); }
+  catch(e){ row.err.push('shopify:'+e.message); }
+
+  // 2. FileMaker Date Discontinued
+  try {
+    await fm.updateRecord('WALLPAPER', ENTRY, recId, { 'Date Discontinued': TODAY }, { dryRun:false });
+    row.fm = 'set';
+  } catch(e){
+    // fall back to FULL layout if the field isn't on ENTRY
+    try { await fm.updateRecord('WALLPAPER', FULL, recId, { 'Date Discontinued': TODAY }, { dryRun:false }); row.fm='set(full)'; }
+    catch(e2){ row.err.push('fm:'+(e2.fmCode||e2.message)); }
+  }
+
+  // 3. dw_unified disco_items + mirror status=archived
+  try {
+    const name = `${city}-${color} Cork Wallcovering`;
+    const combo = sku; // Cork-#####
+    const esc = s => s.replace(/'/g,"''");
+    psql(`INSERT INTO disco_items (combo_sku,date_discontinued,on_shopify,shopify_handle,name,mfr_name,color,series,js_pattern,mfr_pattern,supplier,shopify_status,source)
+      VALUES ('${combo}','${TODAY_ISO}','archived',NULL,'${esc(name)}','Phillipe Romano','${esc(color)}','Cork','${sku.replace('Cork-','')}','${mfr}','GREEN','archived','greenland-disco-2026-07-14')
+      ON CONFLICT DO NOTHING;`);
+    // update mirror: authoritative live rows keyed by gid, sku Cork-#####-Sample
+    const n = psql(`UPDATE shopify_products SET status='archived' WHERE shopify_id='gid://shopify/Product/${pid}' RETURNING 1;`);
+    row.disco = `disco+mirror(${(n.match(/1/g)||[]).length} rows)`;
+  } catch(e){ row.err.push('disco:'+e.message); }
+
+  report.push(row);
+  console.log(`${sku} | ${city}-${color} | shopify=${row.shopify||'ERR'} | fm=${row.fm||'ERR'} | ${row.disco||'ERR'} ${row.err.length?('| ERRORS: '+row.err.join(' ;; ')):''}`);
+  await sleep(150);
+}
+fs.writeFileSync('/tmp/gl-disco-apply-'+(ONLY||'all')+'.json', JSON.stringify(report,null,2));

← 9f680a3 auto-save: 2026-07-12T19:19:48 (1 files) — scripts/bulk-crea  ·  back to Filemaker Mcp  ·  fix: resolve George basic-auth from live fleet cred (was emp aa0cddd →