← back to Shopify Sample Shipping

designer-discount.mjs

25 lines

import {query} from './query.mjs';
const S=['gid://shopify/ProductVariant/44090076954675','gid://shopify/ProductVariant/44086096756787','gid://shopify/ProductVariant/44044973408307'];
const spread=n=>{const it=[];let l=n;for(let i=0;i<S.length;i++){const q=Math.ceil(l/(S.length-i));if(q>0)it.push({variantId:S[i],quantity:q});l-=q;}return it;};
// draftOrderCalculate = READ-ONLY (creates no draft). Tests whether a trade discount re-qualifies free shipping.
const q=`mutation($input:DraftOrderInput!){draftOrderCalculate(input:$input){calculatedDraftOrder{
  subtotalPriceSet{shopMoney{amount}} totalPriceSet{shopMoney{amount}}
  availableShippingRates{title price{amount currencyCode}}} userErrors{field message}}}`;
const addr={address1:'15442 Ventura Blvd',city:'Sherman Oaks',provinceCode:'CA',countryCode:'US',zip:'91403'};
async function run(label,n,discount){
  const input={lineItems:spread(n),shippingAddress:addr};
  if(discount) input.appliedDiscount={value:discount,valueType:'PERCENTAGE',title:`Trade ${discount}%`};
  const d=(await query(q,{input})).draftOrderCalculate;
  if(d.userErrors?.length){console.log(label,'ERR',JSON.stringify(d.userErrors));return;}
  const c=d.calculatedDraftOrder;
  const sub=c.subtotalPriceSet.shopMoney.amount;
  const rates=c.availableShippingRates||[];
  const free=rates.some(x=>parseFloat(x.price.amount)===0);
  console.log(`${label}: subtotal $${sub} -> ${free?'FREE ✅':'no free ❌'}  [rates: ${rates.map(r=>r.title+' $'+r.price.amount).join(' | ')||'none'}]`);
}
console.log('=== TRADE-DISCOUNT interaction (8 samples, list $34) ===');
await run('8 samples, no discount ', 8, null);
await run('8 samples, 25% trade   ', 8, 25);   // 34 -> 25.50
await run('10 samples, 30% trade  ', 10, 30);  // 42.50 -> 29.75
await run('15 samples, 50% trade  ', 15, 50);  // 63.75 -> 31.88 (still >30)