← back to Filemaker Mcp
scripts/fix-invoice-102374.mjs
76 lines
// 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));
}