{"slug":"filemaker-mcp","total":64,"limit":100,"offset":0,"since":null,"commits":[{"hash":"d91bd91","date":"2026-07-16 10:54:33 -0700","author":"steve","subject":"add scripts/fetch-clients.js — page entire Clients file to MCC staged dataset","body":""},{"hash":"7210236","date":"2026-07-16 09:56:29 -0700","author":"steve@designerwallcoverings.com","subject":"chore: lint, refactor, v0.2.3 (session close)","body":"- findDuplicates: rename inner accumulator e→entry (was shadowing catch(e))\n- annotate best-effort client-refresh catch\nAuthor: steve@designerwallcoverings.com"},{"hash":"8e0d01f","date":"2026-07-16 09:42:40 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-16T09:42:29 (1 files) — scripts/audit-clients.mjs","body":""},{"hash":"96da496","date":"2026-07-16 09:35:30 -0700","author":"Steve Abrams","subject":"Harden client dedup + add read-only single-order test","body":"- findDuplicates now only swallows FileMaker 401 (no-records) as an empty\n  result; any other find error is surfaced (per-order handler logs it) instead\n  of silently returning no-match, which would double-enter the client\n- scripts/test-one.mjs: read-only (commit:false) single-order test proving the\n  Company/Name split and live dedup without writing to FileMaker\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>"},{"hash":"de6eb81","date":"2026-07-16 09:24:31 -0700","author":"Steve Abrams","subject":"Fix client double-entry + Company/Name field swap in Shopify→FileMaker sync","body":"- Company field now holds the business name, Name holds the contact person\n  (was reversed: put e.g. 'Denny Wilson' in Company, 'Wilson Construction' in Name)\n- Dedup rewritten as priority waterfall: email → company → client name,\n  searching the correct fields (old code searched Company against the person's\n  name, silently missing real dupes and creating second records)\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>"},{"hash":"65eb72c","date":"2026-07-14 10:28:35 -0700","author":"Steve Abrams","subject":"fix: idempotency guard — skip invoice creation when FileMaker already has one for this Cust PO (order#)","body":"Prevents the systemic double-billing (e.g. #32609). Dedup was local-only (state.processed[]); any re-process minted a duplicate invoice. Now checks FileMaker truth by Cust PO before creating.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>"},{"hash":"aa0cddd","date":"2026-07-14 10:24:40 -0700","author":"Steve Abrams","subject":"fix: resolve George basic-auth from live fleet cred (was empty 'admin:', 401'd since 2026-07-13 rotation → froze Shopify→FileMaker sync at order #32600)","body":"Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>"},{"hash":"22d9eff","date":"2026-07-14 08:55:43 -0700","author":"Steve","subject":"Add Greenland cork disco script: stamps Date Discontinued on 15 WALLPAPER masters (recId 536960-536974) 2026-07-14","body":""},{"hash":"9f680a3","date":"2026-07-12 19:19:51 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-12T19:19:48 (1 files) — scripts/bulk-create-greenland-full.mjs","body":""},{"hash":"c542aa6","date":"2026-07-12 08:47:18 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-12T08:47:12 (2 files) — scripts/bulk-series-dwgl-to-dwlg.mjs scripts/bulk-series-dwlg-to-cork.mjs","body":""},{"hash":"c23bb05","date":"2026-07-12 08:17:08 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-12T08:17:05 (1 files) — scripts/bulk-set-dwnumber-fm.mjs","body":""},{"hash":"b7ae2b7","date":"2026-07-12 07:47:02 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-12T07:46:59 (5 files) — scripts/_gl_recon.mjs scripts/_gl_recon2.mjs scripts/_gl_recon3.mjs scripts/bulk-create-greenland-cork.mjs scripts/bulk-series-cork-to-dwgl.mjs","body":""},{"hash":"81207d4","date":"2026-07-10 17:03:51 -0700","author":"Steve Abrams","subject":"chore: v0.2.2 (session close — invoice mfr backfill + flag-on-unresolved)","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"478c8b2","date":"2026-07-10 12:08:17 -0700","author":"Steve Abrams","subject":"invoice: backfill vid+mfr onto 158 pre-hook blank-mfr Otto invoice lines","body":"Steve-approved backfill of the pre-hook backlog (orders Otto invoiced before\nensureWallpaper was wired at e138cce). scripts/backfill-blank-mfr.mjs finds all\nOtto-imported invoice lines with a blank Detail 1 Mfr Number, groups by distinct\nSKU, ensureWallpaper() once per SKU, then direct-writes VID + Detail 1 Mfr\nNumber onto every matching line. --dry-run does a read-only resolve (no FileMaker\nwrites) via the new exported resolveWallpaperSource().\n\nResult: 167 blank-mfr lines -> 146 SKUs resolved, 158 lines updated, 3 SKUs\nFLAGGED and left blank (DWAT65011, XP5, a custom framed-art order — no findable\nmfr, per Steve's flag-don't-guess rule). Remaining blank: 9 (4 flagged-SKU lines\n+ 5 blank-SKU money records) — the correct residue.\n\nlib/wallpaper.js: extract read-only resolveWallpaperSource() out of\nensureWallpaper() so dry-run/preview callers get zero-write resolution.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"f8ad188","date":"2026-07-10 11:37:54 -0700","author":"Steve Abrams","subject":"invoice: flag+notify (not swallow) SKUs with no findable mfr number","body":"createInvoiceForOrder still creates the invoice line when ensureWallpaper\nreturns {ok:false} FLAGGED or throws (money must never be blocked by a catalog\ndata gap), but the outer catch{} no longer silently swallows it. New else/catch\nbranch calls lib/notify.js flagSku():\n  1. console.warn a loud single line (order/invoice/sku/reason).\n  2. idempotent append to data/flagged-skus.jsonl (key=orderId:invoice:sku;\n     stores ts,orderId,orderName,custPO,invoice,sku,dwSku,reason,resolved:false).\n  3. internal Slack (#general) + George email to steve-office — INTERNAL ops\n     signal only, never customer-facing.\nGraft from DTD verdict C: scripts/drain-flagged-skus.mjs reads the queue, groups\nunresolved rows by Cust PO, re-runs ensureWallpaper, writes VID+mfr onto matching\ninvoice lines (same copy-lookup write as ensure-wallpaper-for-order.mjs), and\nmarks rows resolved:true. --dry-run supported.\n\nFixes the silent-swallow that let 102660/102662 (Cust PO 32580) ship blank\nvid/mfr unnoticed. Money/tax/shipping logic untouched.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"4d2ed04","date":"2026-07-10 11:17:40 -0700","author":"Steve Abrams","subject":"wallpaper: resolve mfr# from flat metafields + vendor_catalog/registry tiers","body":"Invoices 102660 (DWBR170698) and 102662 (DWDX220241) had blank vid+mfr#\nbecause their WALLPAPER master records were never created — ensureWallpaper's\nsourceFor() couldn't find a mfr number:\n- DWDX (Designtex): mfr lived in a FLAT metafield (custom.manufacturer_sku\n  = '8405252'), but SP_FIELDS only read the nested {value} shape.\n- DWBR (Malibu private-label): absent from shopify_products entirely\n  (dw_sku null); real mfr 2999-39028 lives in vendor_catalog + dw_sku_registry.\n\nFixes:\n- SP_FIELDS now COALESCEs nested (->'k'->>'value') AND flat (->>'k') metafields\n  for mfr/supplier/pattern/color/width.\n- sourceFor() adds two universal fallback tiers: vendor_catalog (all scraped\n  vendors, joined to dw_sku_registry for a clean supplier name) and\n  dw_sku_registry (mfr+vendor backstop).\n\nRan ensure-wallpaper-for-order.mjs 32580: all 10 lines now carry vid+mfr#."},{"hash":"e138cce","date":"2026-07-10 09:03:11 -0700","author":"Steve Abrams","subject":"invoice: wire WALLPAPER auto-complete into the live daemon path","body":"createInvoiceForOrder now calls ensureWallpaper(sku) per line — auto-creates/\ncompletes the FileMaker WALLPAPER master from dw_unified and direct-writes VID +\nDetail 1 Mfr Number onto each line, so every NEW order's width/name/vid/supplier/\nmfr lookups resolve at creation (no manual redo). Best-effort: wrapped so a\nWALLPAPER-completion failure never breaks invoicing. Verified end-to-end on a\n2-sample order (DWTT70647 + DWKK134979 both fully resolve).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"0c0536f","date":"2026-07-10 08:24:03 -0700","author":"Steve Abrams","subject":"wallpaper: resolve legacy DWLK sku -> canonical DWSW via shopify sku mapping","body":"DWLK is a legacy Schumacher prefix; shopify_products maps old sku\n(DWLK-830880-Sample) -> canonical dw_sku (DWSW-5003662) + real mfr (5003662).\nensureWallpaper sourceFor now tries dw_sku, then legacy sku/variant_sku\n(base-normalized), then connie. Also backfilled connie_our_catalog.mfr_sku for\n912 DWLK rows from this mapping (backup: _bak_connie_dwlk_mfr_20260710; rollback\nlist: _filled_connie_dwlk_mfr_20260710; 50 orphans remain). Refactored\nensure-wallpaper-for-order.mjs to import lib/wallpaper.js. #32574 DWLK830880 now\nresolves mfr 5003662.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"ea6b092","date":"2026-07-10 08:12:20 -0700","author":"Steve Abrams","subject":"add lib/wallpaper.js — importable ensureWallpaper() for pipeline integration (wiring pending)","body":""},{"hash":"01d9bff","date":"2026-07-10 08:07:50 -0700","author":"Steve Abrams","subject":"add ensure-wallpaper-for-order: auto-complete FileMaker WALLPAPER master from dw_unified","body":"When invoicing (esp. samples), a SKU with no width/name/vid/supplier means the\nFileMaker WALLPAPER master record is missing/incomplete → this creates/completes\nit from dw_unified (shopify_products.metafields rich source, connie fallback):\ncreate stored fields on 'Add wallcovering' (Mfr Pattern/JS Pattern/Series/\nSupplier/Width; combo sku is a calc), then Name/Color of Pattern + vid (series-mode\ncode) + JPG Name on '*List Wallpapers - Full View'. Direct-writes invoice VID +\nDetail 1 Mfr Number (copy-lookups) so a redo shows them. SKUs with no mfr number\nare flagged, not created. Redid #32575 (Lee Jofa Taplow x4) + #32574 (DWTT70647;\nDWLK830880 flagged).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"5703973","date":"2026-07-09 23:34:40 -0700","author":"Steve Abrams","subject":"invoice: all money on FIRST invoice, just the SKU on each subsequent","body":"Steve's refined rule (2026-07-09): the money record carries the WHOLE order\ntotal on ONE line = total units x per-unit price (GRAND TOTAL = merch subtotal);\nDETAIL='Samples' for an all-samples order so Q=2 reads '2 Samples @ $4.25 =\n$8.50'. Every subsequent record shows JUST its SKU at $0. Reverts the\nline-2-on-first-record approach. PAID ON ACCOUNT computed exactly (merch+tax+\nshipping) so money is right even when a summarized per-unit line rounds a cent.\nAlso updated live invoice 102622 (order #32571) to the new format.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"f7c8106","date":"2026-07-09 22:08:19 -0700","author":"Steve Abrams","subject":"add watch-real-units-order.mjs — live watcher for next real order's per-line breakdown","body":""},{"hash":"d9b2cbf","date":"2026-07-09 20:29:26 -0700","author":"Steve Abrams","subject":"invoice: show real units + real per-unit price (not lumped Q1=1)","body":"- money record now lists each order line in its own physical row (line 1 =\n  '… 1' fields, line 2 = distinct 'DETAIL 2'/'Q2'/'NET 2' fields) with the\n  REAL quantity + REAL per-unit price; GRAND TOTAL/PAID sum correctly.\n- single-SKU (the common case): line 1 = real qty x real unit price, identical\n  GRAND/PAID/GRAND TOTAL 2 to before -> zero risk. 2-SKU shows both lines;\n  >2-SKU lumps the overflow into line 2 (layout caps at 2 rows).\n- per-SKU stub records stay $0 (real units shown for reference) so dollars are\n  counted once and the monitor posts one card per order.\n- monitor: card total now reads PAID ON ACCOUNT when booked (sums both lines;\n  GRAND TOTAL 2 is a line-1-only calc that undercounts a 2-line order).\n- verified live: single-SKU 2x$44.18=$88.36 and 2-SKU (2x$12.50 + 3x$4.25)=$37.75.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"fb3670b","date":"2026-07-08 06:20:26 -0700","author":"Steve Abrams","subject":"chore: v-bump (session close — per-SKU invoicing fix + dup audit tooling)","body":""},{"hash":"1b0bc8f","date":"2026-07-07 13:00:41 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-07T13:00:27 (1 files) — scripts/watch-next-multisku.mjs","body":""},{"hash":"f705ac9","date":"2026-07-07 09:29:49 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-07T09:29:44 (1 files) — scripts/watch-next-order.mjs","body":""},{"hash":"4dd914e","date":"2026-07-07 09:07:27 -0700","author":"Steve Abrams","subject":"invoicing: fix double-increment so per-SKU invoice numbers are consecutive (no gaps); verified live 3-invoice write test PASS","body":""},{"hash":"bd4cd95","date":"2026-07-07 09:02:29 -0700","author":"Steve Abrams","subject":"invoicing: one record per SKU, only the FIRST carries the dollars (NET/RETAIL=order total, PAID=grand total); remaining SKU records $0 (Steve 2026-07-07). Tax+shipping ride the money record only; $0 records stay off #new-order via GRAND TOTAL 2=0 filter","body":""},{"hash":"f903c3b","date":"2026-07-07 08:57:18 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-07T08:57:11 (2 files) — scripts/tmp-probe-net.mjs scripts/tmp-probe-net2.mjs","body":""},{"hash":"f3f4718","date":"2026-07-07 08:56:39 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-07T08:56:34 (2 files) — scripts/tmp-probe-net.mjs scripts/tmp-probe-net2.mjs","body":""},{"hash":"7b8fa26","date":"2026-07-07 07:22:09 -0700","author":"Steve Abrams","subject":"add read-only dry-run pipeline test: proves 1-invoice-per-order + zero per-SKU dups on latest Shopify orders","body":""},{"hash":"4b94f5f","date":"2026-07-07 07:19:03 -0700","author":"Steve Abrams","subject":"audit: add --csv export (both categories, per-invoice rows)","body":""},{"hash":"6a8406b","date":"2026-07-07 07:15:26 -0700","author":"Steve Abrams","subject":"add read-only dup-invoice audit: group by Cust PO, split double-billing (money) vs $0 tracking clutter","body":""},{"hash":"a19a17d","date":"2026-07-03 08:57:14 -0700","author":"Steve","subject":"invoicing: require client account number before any invoice (client-account-first) + stop creating the duplicate per-SKU 'second invoice'","body":""},{"hash":"83d8494","date":"2026-07-03 08:08:02 -0700","author":"Steve","subject":"chore: macstudio3 migration — reconcile from mac2 + repoint paths (stevestudio2→macstudio3, node/npm/npx→/opt/homebrew)","body":""},{"hash":"1de6266","date":"2026-07-03 04:08:55 -0700","author":"Steve Abrams","subject":"sales summary: report trailing 24h window via seen-ledger diff (Steve 2026-07-03)","body":""},{"hash":"70f934b","date":"2026-07-02 18:33:01 -0700","author":"Steve Abrams","subject":"daily sales summary: move fire time 23:55 -> 16:30 (4:30 PM EOD report to #new-order)","body":"Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>"},{"hash":"a4db9ca","date":"2026-07-02 08:08:54 -0700","author":"Steve","subject":"chore: lint, refactor (shared fm-script-helpers), v0.2.0 (session close)","body":""},{"hash":"fec4102","date":"2026-07-02 08:07:28 -0700","author":"Steve Abrams","subject":"add DWTA baxter dedup: archive+delete script for FM dup record 536613","body":""},{"hash":"700b05c","date":"2026-07-02 07:54:09 -0700","author":"Steve","subject":"new-invoice-monitor: label booked sale vs unpaid quote (payment-received gate)","body":""},{"hash":"7bf6a1d","date":"2026-07-02 07:53:32 -0700","author":"Steve","subject":"sales-summary: count BOOKED orders only (payment received); add today's quotes (no payment) line — fixes $92k unpaid-quote inflating MTD","body":""},{"hash":"4255ec9","date":"2026-07-02 07:41:40 -0700","author":"Steve","subject":"sales-to-Slack via FileMaker: EOD daily+MTD summary + per-invoice monitor + launchd timers (reuses fm-client; posts to #new-order)","body":""},{"hash":"5a0d50e","date":"2026-07-02 07:11:48 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-02T07:11:42 (1 files) — scripts/relookup-invoice-102387.mjs","body":""},{"hash":"a231cf0","date":"2026-07-02 07:08:11 -0700","author":"Steve","subject":"add DWKK-120156 master (order 32513/inv 102387) + invoice probes; codify fuzzy-SKU rule","body":""},{"hash":"bcf5e67","date":"2026-07-02 06:21:33 -0700","author":"Steve","subject":"chore: v0.1.1 (session close — Baxter records, invoice 102374 repair, fuzzy-sku-check)","body":""},{"hash":"941cf7a","date":"2026-07-01 15:54:01 -0700","author":"Steve Abrams","subject":"add fuzzy-sku-check.mjs: reusable WALLPAPER SKU existence probe (strips -Sample; combo sku/comboskuwithdash/mfr pattern number/Mfr Pattern; exit 0/1 + JSON)","body":"Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>"},{"hash":"10f7a19","date":"2026-07-01 15:51:23 -0700","author":"Steve Abrams","subject":"invoice 102374 repair script: split Otto's collapsed 4-sample line into 4 proper lines (Fracchia / Shopify #32508); totals preserved 17+22=39","body":"Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>"},{"hash":"94f5487","date":"2026-07-01 15:45:46 -0700","author":"Steve Abrams","subject":"fix DWTT73434 (recordId 536611) Mfr Pattern AT79129->AT79126 + fill mfr pattern number (AT79129 belongs to 73436 Silver)","body":"Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>"},{"hash":"9bad19a","date":"2026-07-01 15:44:05 -0700","author":"Steve Abrams","subject":"create 3 missing DWTT Baxter WALLPAPER masters (73433 Navy/73435 Beige/73436 Silver) — recordIds 536615-17; combo sku + Dw Retail Price are calcs, omitted from write","body":"Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>"},{"hash":"2412a37","date":"2026-07-01 14:35:54 -0700","author":"Steve Abrams","subject":"test: dummy client+invoice demo scripts (999999/Testy McTestface); fix script gains RETAIL cols via HDR layout; probe scripts for line-2/tax calc behavior","body":""},{"hash":"7b9b08c","date":"2026-07-01 14:19:17 -0700","author":"Steve Abrams","subject":"fix: fm_find/sort JSON-string coercion (harness stringifies z.any); invoice file live w/ Order Detail default; add invoice-102332 repair script","body":""},{"hash":"1f3eaf8","date":"2026-06-29 13:42:45 -0700","author":"Steve","subject":"remove dead lib/invoice-core.js (orphaned from refactor; lib/invoice.js is the single source of truth)","body":""},{"hash":"f9e757d","date":"2026-06-29 13:38:07 -0700","author":"Steve","subject":"invoice: strip dashes in WC Pattern Number AKA DW SKU; write 'Resale card lookup' (the resale field shown on invoice) so it's no longer blank","body":""},{"hash":"ea51d97","date":"2026-06-29 13:27:12 -0700","author":"Steve","subject":"sync: every order also creates one no-$ per-SKU tracking record with the DW SKU in 'WC Pattern Number AKA DW SKU'; verified 8/8 on order 32476","body":""},{"hash":"707cde7","date":"2026-06-29 13:16:37 -0700","author":"Steve","subject":"invoice: populate 'WC Pattern Number AKA DW SKU' from primary line base SKU","body":"Discovered exact field name (Text[4], repeating, writable) and wired it into\ncreateInvoiceForOrder via the '1-order detail 1 Copy3' layout (shares the\nheader base table). Proven on invoice 102262 -> DWCC-112200."},{"hash":"7525e58","date":"2026-06-29 12:50:45 -0700","author":"Steve","subject":"fix: consolidate multi-item orders to single line (exact total), round cents, WC PATTERN=base pattern, delete API, Slack→#new-order, error-resilient runner; recovered 32476 ($34)","body":""},{"hash":"1894d57","date":"2026-06-29 12:49:14 -0700","author":"Steve Abrams","subject":"auto-save: 2026-06-29T12:49:09 (2 files) — lib/invoice.js src/fm-client.js","body":""},{"hash":"c4dc440","date":"2026-06-29 12:23:21 -0700","author":"Steve","subject":"sync: refresh existing client's contact info from the order before invoicing (update client first, then invoice)","body":""},{"hash":"e2e050f","date":"2026-06-29 12:20:19 -0700","author":"Steve","subject":"sync: every new order now auto-creates client + full invoice (UOM/Otto/FedEx/tax/resale/SKU/WC PATTERN/sold-ship blocks) + posts to Slack #general","body":""},{"hash":"b60dfd5","date":"2026-06-29 12:19:22 -0700","author":"Steve","subject":"sync: every order now auto-creates client + full invoice (Otto/FedEx/tax/resale/SKU/WC-PATTERN/paid) + Slack #general alert; invoice 102262 fully built per Steve specs","body":""},{"hash":"8f367cd","date":"2026-06-29 12:19:06 -0700","author":"Steve Abrams","subject":"auto-save: 2026-06-29T12:19:02 (5 files) — bin/shopify-sync.js lib/sync-core.js lib/invoice-core.js lib/invoice.js lib/notify.js","body":""},{"hash":"cecc780","date":"2026-06-29 11:07:41 -0700","author":"Steve","subject":"shopify->filemaker client sync: info@ trigger, 3-way dedup (email/phone/name), auto-create; created acct 1061931 live; launchd staged (not loaded)","body":""},{"hash":"6470923","date":"2026-06-29 10:39:57 -0700","author":"Steve","subject":"live: connected to FileMaker Cloud — Clients + WALLPAPER reading; invoice pending fmrest; MCP registered","body":""},{"hash":"2719a89","date":"2026-06-29 09:26:02 -0700","author":"Steve","subject":"initial scaffold: FileMaker Cloud MCP server + CLI (read + dry-run-gated writes)","body":""}]}