← 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));
}