← back to Tk 11331 Exec

verify_d3b_independent.mjs

32 lines

// Independent post-apply verification for OP A. Re-reads Admin API (authoritative) for all 18
// pids and asserts: pos1 is a NON-Sample sellable variant AND pos1.price == 50.61, Sample @ pos2,
// min=5, uom="Sold Per Yard". Prints a per-product PASS/FAIL. Does NOT trust the apply log.
import fs from 'fs';
import {gql} from './lib.mjs';
const SRC='data/d3b-recovered-needs-variant.jsonl';
const rows=fs.readFileSync(SRC,'utf8').trim().split('\n').filter(Boolean).map(l=>JSON.parse(l));
const isSample=s=>((s||'').toLowerCase().endsWith('sample'));
const Q=`query($id:ID!){product(id:$id){handle status
  mfmin:metafield(namespace:"global",key:"v_prods_quantity_order_min"){value}
  mfuom:metafield(namespace:"global",key:"unit_of_measure"){value}
  variants(first:20){nodes{id sku title position price}}}}`;
let pass=0,fail=0; const fails=[];
for(const r of rows){
  const gid=`gid://shopify/Product/${r.shopify_product_id}`;
  const price=Number(r.recovered_hw_price ?? r.recovered_new_price);
  const p=(await gql(Q,{id:gid})).product;
  const av=p.variants.nodes.slice().sort((a,b)=>a.position-b.position);
  const pos1=av[0], pos2=av[1];
  const okPos1 = pos1 && !isSample(pos1.sku) && Math.abs(Number(pos1.price)-price)<0.005;
  const okPos2 = pos2 && isSample(pos2.sku) && Math.abs(Number(pos2.price)-4.25)<0.005;
  const okMin = p.mfmin?.value==='5';
  const okUom = p.mfuom?.value==='Sold Per Yard';
  const ok = okPos1 && okPos2 && okMin && okUom;
  if(ok){ pass++; console.log(`PASS ${r.dw_sku} (${r.mfr_sku}) pos1=${pos1.sku}@$${pos1.price} pos2=${pos2.sku}@$${pos2.price} min=${p.mfmin.value} uom="${p.mfuom.value}"`); }
  else { fail++; const rec={dw_sku:r.dw_sku,mfr_sku:r.mfr_sku,okPos1,okPos2,okMin,okUom,pos1:pos1&&{sku:pos1.sku,price:pos1.price},pos2:pos2&&{sku:pos2.sku,price:pos2.price},min:p.mfmin?.value,uom:p.mfuom?.value}; fails.push(rec);
    console.log(`FAIL ${r.dw_sku} (${r.mfr_sku}) ${JSON.stringify(rec)}`); }
}
console.log(`\nINDEPENDENT VERIFY — pass=${pass} fail=${fail} / ${rows.length}`);
if(fails.length) fs.writeFileSync('data/d3b-independent-verify-fails.json',JSON.stringify(fails,null,1));
process.exit(fail?1:0);