← back to Filemaker Mcp

scripts/create-dwtt-baxter-73433-35-36.mjs

85 lines

// One-off: create 3 missing WALLPAPER master records for Thibaut Baxter colorways
// (DWTT-73433 Navy, DWTT-73435 Beige, DWTT-73436 Silver). Specs verified against
// dw_unified.thibaut_catalog. Sibling DWTT73434 = recordId 536611 (mirrored style).
// CALC FIELDS (FM error 201 if written): combo sku, Dw Retail Price, comboskuwithdash,
// comboskuplussample — all omitted from the write; combo sku derives from Series+JS Pattern
// and Dw Retail Price from its pricing inputs. All verified post-create instead.
// Usage: node scripts/create-dwtt-baxter-73433-35-36.mjs [--commit]
// Default (no flags) = dry-run showing the exact fieldData; --commit creates + verifies.

import { readFileSync } from 'node:fs';
import { fileURLToPath } from 'node:url';
import { dirname, join } from 'node:path';

const __dir = dirname(fileURLToPath(import.meta.url));
for (const line of readFileSync(join(__dir, '..', '.env'), 'utf8').split('\n')) {
  const m = line.match(/^([A-Z_]+)=(.*)$/);
  if (m && !process.env[m[1]]) process.env[m[1]] = m[2];
}

const { findRecords, createRecord } = await import('../src/fm-client.js');

const DB = 'WALLPAPER';
const LAYOUT = '*List Wallpapers - Shopify Detail Database';
const commit = process.argv.includes('--commit');

const COMMON = {
  'Series': 'DWTT',
  'vid': 'Thib',
  'Width': '20.5"',
  'Repeat': '5.5"',
  'Record Type': 'Master',
  'Date Line Put Up:': '7/1/2026',
  'MFR MAP PRICE': '',
  'Net Price': 56.70,
  'Content': 'Non Woven',
  'Mfr Name of Pattern': 'Baxter',
  'Collection': 'SMALL SCALE',
};

// sku = expected value of the calc field "combo sku" (Series+JS Pattern) — guard/verify only.
const ROWS = [
  { sku: 'DWTT73433', 'JS Pattern': '73433', 'Mfr Pattern': 'AT79124', 'mfr pattern number': 'AT79124',
    'Name of Pattern': 'Baxter, Navy Wallcoverings | Thibaut', 'Color of Pattern': 'Navy', 'Mfr Color of Pattern': 'Navy' },
  { sku: 'DWTT73435', 'JS Pattern': '73435', 'Mfr Pattern': 'AT79127', 'mfr pattern number': 'AT79127',
    'Name of Pattern': 'Baxter, Beige Wallcoverings | Thibaut', 'Color of Pattern': 'Beige', 'Mfr Color of Pattern': 'Beige' },
  { sku: 'DWTT73436', 'JS Pattern': '73436', 'Mfr Pattern': 'AT79129', 'mfr pattern number': 'AT79129',
    'Name of Pattern': 'Baxter, Silver Wallcoverings | Thibaut', 'Color of Pattern': 'Silver', 'Mfr Color of Pattern': 'Silver' },
];

for (const { sku, ...row } of ROWS) {
  // fail-closed duplicate guard
  let exists = false;
  try {
    const { records } = await findRecords(DB, LAYOUT, { 'combo sku': `==${sku}` }, { limit: 1 });
    exists = records.length > 0;
    if (exists) console.log(`SKIP ${sku}: already exists as recordId ${records[0].recordId}`);
  } catch (e) {
    if (e.fmCode !== '401') throw e; // 401 = no records match = safe to create
  }
  if (exists) continue;

  const fieldData = { ...COMMON, ...row };
  const res = await createRecord(DB, LAYOUT, fieldData, { dryRun: !commit });
  console.log(commit ? `CREATED ${sku}:` : `DRY RUN ${sku}:`, JSON.stringify(res, null, 1));

  if (commit) {
    const { records } = await findRecords(DB, LAYOUT, { 'combo sku': `==${sku}` }, { limit: 2 });
    const f = records[0]?.fieldData || {};
    console.log(`VERIFY ${sku}:`, JSON.stringify({
      recordId: records[0]?.recordId,
      'combo sku': f['combo sku'],
      'comboskuwithdash': f['comboskuwithdash'],
      'comboskuplussample': f['comboskuplussample'],
      'Mfr Pattern': f['Mfr Pattern'],
      'mfr pattern number': f['mfr pattern number'],
      'Name of Pattern': f['Name of Pattern'],
      'Color of Pattern': f['Color of Pattern'],
      'Dw Retail Price': f['Dw Retail Price'],
      'Net Price': f['Net Price'],
      'Width': f['Width'], 'Repeat': f['Repeat'],
      'Record Type': f['Record Type'], 'Collection': f['Collection'], 'Content': f['Content'],
    }, null, 1));
  }
}