← back to Shopify Sample Shipping
order-designer-bulk.mjs
38 lines
import {query} from './query.mjs';
import fs from 'node:fs';
const S=['gid://shopify/ProductVariant/44090076954675','gid://shopify/ProductVariant/44086096756787','gid://shopify/ProductVariant/44044973408307'];
// 12 samples = $51.00 (> $30 free band -> shipping fees incur)
const lineItems=[{variantId:S[0],quantity:4},{variantId:S[1],quantity:4},{variantId:S[2],quantity:4}];
const addr={address1:'15442 Ventura Blvd',city:'Sherman Oaks',provinceCode:'CA',countryCode:'US',zip:'91403',firstName:'Interior',lastName:'Designer'};
// 1) Confirm free is NOT offered and grab the real cheapest paid rate
const rq=`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=(await query(rq,{items:lineItems})).draftOrderAvailableDeliveryOptions.availableShippingRates;
const free=rates.some(x=>parseFloat(x.price.amount)===0);
const cheapest=rates.filter(x=>parseFloat(x.price.amount)>0).sort((a,b)=>parseFloat(a.price.amount)-parseFloat(b.price.amount))[0];
console.log(`free offered? ${free} | cheapest paid = ${cheapest.title} $${cheapest.price.amount}`);
if(free){console.log('ABORT: free shipping IS offered — would not demonstrate fees incurring.');process.exit(1);}
// 2) Create draft with the real paid shipping line + note
const input={
email:'steve@designerwallcoverings.com',
tags:['TK-11333-TEST'],
note:'Interior designer order — 12 samples ($51.00) is above the free-shipping threshold ($30), so shipping fees incur (per TK-11333 policy).',
shippingAddress:addr,
lineItems,
shippingLine:{title:cheapest.title,price:cheapest.price.amount}
};
const c=`mutation($input:DraftOrderInput!){draftOrderCreate(input:$input){draftOrder{id name subtotalPrice totalShippingPrice totalPrice note2 shippingLine{title price}} userErrors{field message}}}`;
const cr=await query(c,{input});
if(cr.draftOrderCreate.userErrors.length){console.log('CREATE ERR',JSON.stringify(cr.draftOrderCreate.userErrors));process.exit(1);}
const d=cr.draftOrderCreate.draftOrder;
console.log('\n=== DRAFT ===',d.name,'| subtotal $'+d.subtotalPrice,'| shipping $'+d.totalShippingPrice,'| total $'+d.totalPrice,'| ship:',d.shippingLine?.title,'$'+d.shippingLine?.price);
console.log('note:',d.note2);
// 3) Complete unpaid
const cm=`mutation($id:ID!){draftOrderComplete(id:$id,paymentPending:true){draftOrder{order{id name displayFinancialStatus note totalShippingPriceSet{shopMoney{amount}} totalPriceSet{shopMoney{amount}} shippingLine{title price}}} userErrors{field message}}}`;
const cmr=await query(cm,{id:d.id});
if(cmr.draftOrderComplete.userErrors.length){console.log('COMPLETE ERR',JSON.stringify(cmr.draftOrderComplete.userErrors));process.exit(1);}
const o=cmr.draftOrderComplete.draftOrder.order;
console.log('\n=== ORDER (unpaid) ===',o.name,'|',o.displayFinancialStatus,'| shipping $'+o.totalShippingPriceSet.shopMoney.amount,'| total $'+o.totalPriceSet.shopMoney.amount,'| ship:',o.shippingLine?.title,'$'+o.shippingLine?.price);
console.log('order id:',o.id);
console.log('note:',o.note);
fs.writeFileSync(new URL('./verification/order-designer-bulk-result.json',import.meta.url),JSON.stringify({rates,draft:d,order:o,createdAt:new Date().toISOString()},null,2)+'\n');