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