← back to Shopify Sample Shipping

designer-scenarios.mjs

21 lines

import {query} from './query.mjs';
const S=['gid://shopify/ProductVariant/44090076954675','gid://shopify/ProductVariant/44086096756787','gid://shopify/ProductVariant/44044973408307'];
const ROLL='gid://shopify/ProductVariant/40348093055027'; // $168 roll
const qq=`query($items:[DraftOrderLineItemInput!]!){draftOrderAvailableDeliveryOptions(input:{lineItems:$items,shippingAddress:{address1:"15442 Ventura Blvd",city:"Sherman Oaks",provinceCode:"CA",countryCode:US,zip:"91403"}}){availableShippingRates{title price{amount currencyCode}}}}`;
const rates=async items=>(await query(qq,{items})).draftOrderAvailableDeliveryOptions.availableShippingRates;
const free=r=>r.some(x=>parseFloat(x.price.amount)===0);
const cheapestPaid=r=>r.filter(x=>parseFloat(x.price.amount)>0).map(x=>parseFloat(x.price.amount)).sort((a,b)=>a-b)[0];
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;};

console.log('=== INTERIOR DESIGNER: bulk swatch orders ($4.25 each) ===');
for(const n of [3,6,7,8,10,15,20]){
  const r=await rates(spread(n));
  const sub=(n*4.25).toFixed(2);
  console.log(`  ${String(n).padStart(2)} samples ($${sub}): ${free(r)?'FREE ✅':'charged ~$'+cheapestPaid(r)+' ❌'}`);
}
console.log('\n=== INTERIOR DESIGNER: project order (samples + a roll) ===');
const mixed=[{variantId:S[0],quantity:5},{variantId:ROLL,quantity:1}]; // 5 samples + 1 roll
const rm=await rates(mixed);
console.log(`  5 samples + 1 roll ($${(5*4.25+168.40).toFixed(2)}): ${free(rm)?'FREE':'no free — cheapest paid $'+cheapestPaid(rm)}`);
console.log('  (mixed cart >$30 => whole cart loses the free-sample rate, incl. the samples)');