/**
* Customer-facing Order Tools
* Track orders by order number + email
*/
import { shopifyRequest } from './shopify-client.js';
interface OrderLookupParams {
order_number: string;
email: string;
}
interface TrackingInfo {
status: string;
tracking_company: string | null;
tracking_number: string | null;
tracking_url: string | null;
created_at: string;
}
function extractTrackingInfo(fulfillments: any[] | undefined): TrackingInfo[] {
if (!fulfillments) {
return [];
}
return fulfillments.map((f) => ({
status: f.status,
tracking_company: f.tracking_company ?? null,
tracking_number: f.tracking_number ?? null,
tracking_url: f.tracking_url ?? null,
created_at: f.created_at,
}));
}
function getCustomerName(order: any): string {
if (order.customer) {
const firstName = order.customer.first_name || '';
const lastName = order.customer.last_name || '';
const fullName = `${firstName} ${lastName}`.trim();
if (fullName) {
return fullName;
}
}
return order.shipping_address?.name || 'Customer';
}
export async function trackOrder(params: OrderLookupParams) {
const { order_number, email } = params;
const response = await shopifyRequest('orders.json', {
params: {
name: order_number,
status: 'any',
limit: 1,
},
});
if (!response.orders || response.orders.length === 0) {
return {
success: false,
message: `Order #${order_number} not found. Please check the order number and try again.`,
};
}
const order = response.orders[0];
if (order.email?.toLowerCase() !== email.toLowerCase()) {
return {
success: false,
message: 'Email does not match the order. Please verify your email address.',
};
}
const trackingInfo = extractTrackingInfo(order.fulfillments);
return {
success: true,
order: {
order_number: order.order_number,
created_at: order.created_at,
customer: {
name: getCustomerName(order),
email: order.email,
},
financial_status: order.financial_status,
fulfillment_status: order.fulfillment_status || 'processing',
total_price: order.total_price,
currency: order.currency,
items: order.line_items.map((item: any) => ({
product_id: item.product_id,
name: item.name,
quantity: item.quantity,
price: item.price,
image_url: item.image?.src || null,
url: item.product_id
? `https://${process.env.SHOPIFY_STORE_URL}/products/${item.handle || item.product_id}`
: null,
})),
shipping_address: order.shipping_address ? {
name: order.shipping_address.name,
city: order.shipping_address.city,
province: order.shipping_address.province,
country: order.shipping_address.country,
zip: order.shipping_address.zip,
} : null,
tracking: trackingInfo,
},
};
}
export async function getOrderStatus(params: OrderLookupParams) {
const result = await trackOrder(params);
if (!result.success) {
return result;
}
const order = result.order;
let statusMessage = '';
switch (order.fulfillment_status) {
case 'fulfilled':
statusMessage = 'Your order has been shipped!';
if (order.tracking && order.tracking.length > 0) {
const tracking = order.tracking[0];
if (tracking.tracking_url) {
statusMessage += ` Track it here: ${tracking.tracking_url}`;
} else if (tracking.tracking_number) {
statusMessage += ` Tracking number: ${tracking.tracking_number}`;
}
}
break;
case 'partial':
statusMessage = 'Part of your order has been shipped. The rest is being prepared.';
break;
default:
if (order.financial_status === 'paid') {
statusMessage = 'Your order is confirmed and being prepared for shipping.';
} else if (order.financial_status === 'pending') {
statusMessage = 'Your order is pending payment confirmation.';
} else {
statusMessage = 'Your order is being processed.';
}
}
return {
success: true,
order_number: order.order_number,
status: order.fulfillment_status || 'processing',
status_message: statusMessage,
tracking: order.tracking,
};
}