← back to Filemaker Mcp
invoice 102374 repair script: split Otto's collapsed 4-sample line into 4 proper lines (Fracchia / Shopify #32508); totals preserved 17+22=39
10f7a193afa4dbf5be88bef71e577acfff2f64db · 2026-07-01 15:51:23 -0700 · Steve Abrams
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Files touched
A scripts/fix-invoice-102374.mjs
Diff
commit 10f7a193afa4dbf5be88bef71e577acfff2f64db
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Wed Jul 1 15:51:23 2026 -0700
invoice 102374 repair script: split Otto's collapsed 4-sample line into 4 proper lines (Fracchia / Shopify #32508); totals preserved 17+22=39
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
---
scripts/fix-invoice-102374.mjs | 75 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 75 insertions(+)
diff --git a/scripts/fix-invoice-102374.mjs b/scripts/fix-invoice-102374.mjs
new file mode 100644
index 0000000..1360dde
--- /dev/null
+++ b/scripts/fix-invoice-102374.mjs
@@ -0,0 +1,75 @@
+// One-off: redo invoice #102374 (recordId 64906, Shopify order #32508, Michelle Fracchia).
+// Otto imported the 4 sample line items COLLAPSED into line 1
+// ("4 items: DWTT-73434, DWTT-73433, DWTT-73435, DWTT-73436", Q=4, NET=4.25).
+// This splits them into 4 proper lines — one per sample, qty 1, $4.25 (DW standard
+// sample price; math already reconciles: 4x4.25=17 merch + 22 ship = 39 PAID, NET DUE 0).
+// Repetition-field syntax "Q1(2)" etc. per scripts/fix-invoice-102332.mjs / probe-line2.mjs.
+// TOTAL 1(n) + "mfr detail 1 yn Copy(n)" are calc/auto-enter — not written, verified after.
+// Detail 1 Mfr Number(n) carries the Thibaut mfr code (style mirrored from invoice 102332).
+// Invoices 102375-78 (recordIds 64907-64910) are EMPTY duplicates — deliberately untouched.
+// Usage: node scripts/fix-invoice-102374.mjs [--commit] (default = dry-run diff)
+
+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 { getRecord, updateRecord } = await import('../src/fm-client.js');
+
+const DB = 'invoice';
+const LAYOUT = 'Order Detail';
+const RECORD_ID = '64906';
+const SAMPLE_PRICE = 4.25;
+const commit = process.argv.includes('--commit');
+
+// Shopify #32508 line order
+const LINES = [
+ { sku: 'DWTT-73434-Sample', name: 'Baxter, Aqua and Taupe Wallcoverings | Thibaut', mfr: 'AT79126' },
+ { sku: 'DWTT-73433-Sample', name: 'Baxter, Navy Wallcoverings | Thibaut', mfr: 'AT79124' },
+ { sku: 'DWTT-73435-Sample', name: 'Baxter, Beige Wallcoverings | Thibaut', mfr: 'AT79127' },
+ { sku: 'DWTT-73436-Sample', name: 'Baxter, Silver Wallcoverings | Thibaut', mfr: 'AT79129' },
+];
+
+// hard guard: right record, right invoice, right buyer
+const rec = await getRecord(DB, LAYOUT, RECORD_ID);
+const f0 = rec.fieldData;
+if (String(f0['Invoice']) !== '102374' || !/Fracchia/i.test(f0['BUYER'] || '')) {
+ console.error(`ABORT: record ${RECORD_ID} is Invoice ${f0['Invoice']} / BUYER ${f0['BUYER']} — expected 102374 / Fracchia`);
+ process.exit(2);
+}
+console.log('BEFORE:', JSON.stringify(Object.fromEntries(
+ ['Q1(1)','Q1(2)','Q1(3)','Q1(4)','DETAIL 1(1)','DETAIL 1(2)','DETAIL 1(3)','DETAIL 1(4)',
+ 'NET 1(1)','NET 1(2)','NET 1(3)','NET 1(4)','Unit 1(1)','Unit 1(2)','Unit 1(3)','Unit 1(4)',
+ 'TOTAL 1(1)','TOTAL 1(2)','TOTAL 1(3)','TOTAL 1(4)',
+ 'MERCHANDISE TOTAL(1)','SHIPPING HANDLING','PAID ON ACCOUNT','NET DUE 2']
+ .map((k) => [k, f0[k]])), null, 1));
+
+const fieldData = {};
+LINES.forEach((l, i) => {
+ const n = i + 1;
+ fieldData[`Q1(${n})`] = 1;
+ fieldData[`Unit 1(${n})`] = 'each';
+ fieldData[`DETAIL 1(${n})`] = `${l.sku} - ${l.name}`;
+ fieldData[`NET 1(${n})`] = SAMPLE_PRICE;
+ fieldData[`Detail 1 Mfr Number(${n})`] = l.mfr;
+});
+
+const res = await updateRecord(DB, LAYOUT, RECORD_ID, fieldData, { dryRun: !commit });
+console.log(commit ? 'COMMITTED:' : 'DRY RUN DIFF:', JSON.stringify(res, null, 1));
+
+if (commit) {
+ const after = await getRecord(DB, LAYOUT, RECORD_ID);
+ const f = after.fieldData;
+ console.log('VERIFY:', JSON.stringify(Object.fromEntries(
+ ['Q1(1)','Q1(2)','Q1(3)','Q1(4)','DETAIL 1(1)','DETAIL 1(2)','DETAIL 1(3)','DETAIL 1(4)',
+ 'NET 1(1)','NET 1(2)','NET 1(3)','NET 1(4)','TOTAL 1(1)','TOTAL 1(2)','TOTAL 1(3)','TOTAL 1(4)',
+ 'Detail 1 Mfr Number(1)','Detail 1 Mfr Number(2)','Detail 1 Mfr Number(3)','Detail 1 Mfr Number(4)',
+ 'mfr detail 1 yn Copy(1)','mfr detail 1 yn Copy(2)','mfr detail 1 yn Copy(3)','mfr detail 1 yn Copy(4)',
+ 'MERCHANDISE TOTAL(1)','merch tot2','SHIPPING HANDLING','PAID ON ACCOUNT','NET DUE 2','line 2 used']
+ .map((k) => [k, f[k]])), null, 1));
+}
← 94f5487 fix DWTT73434 (recordId 536611) Mfr Pattern AT79129->AT79126
·
back to Filemaker Mcp
·
add fuzzy-sku-check.mjs: reusable WALLPAPER SKU existence pr 941cf7a →