// New method in unified.ts
async processReturn(params: ProcessReturnParams): Promise<any> {
try {
if (!params.order_id || !params.return_info) {
throw new ValidationError('order_id and return_info are required');
}
// Get the original order
const originalOrder = await veeqoMethods.getOrder({ order_id: params.order_id });
// Create a return shipment in EasyPost
const returnShipment = await easypostMethods.createShipment({
to_address: params.return_info.return_address,
from_address: convertVeeqoToEasyPostAddress(originalOrder.deliver_to),
parcel: params.return_info.parcel || {
length: 10,
width: 8,
height: 4,
weight: 2
},
options: {
label_format: 'PDF',
label_size: '4x6'
},
idempotency_key: params.idempotency_key
});
// Get rates for return shipment
const rates = await easypostMethods.getRates({ shipment_id: returnShipment.id });
// Select the cheapest rate or a preferred one
let selectedRate = rates[0];
if (params.return_info.preferred_carrier) {
const preferredRate = rates.find(
rate => rate.carrier === params.return_info.preferred_carrier
);
if (preferredRate) {
selectedRate = preferredRate;
}
}
// Buy the return label
const label = await easypostMethods.buyLabel({
shipment_id: returnShipment.id,
rate_id: selectedRate.id,
idempotency_key: params.idempotency_key
? `${params.idempotency_key}-return-label`
: undefined
});
// Update the original order status to 'return_requested'
const updatedOrder = await veeqoMethods.updateOrder({
order_id: params.order_id,
order: {
status: 'return_requested',
additional_options: {
return_tracking_code: label.tracking_code
}
}
});
// Create a return record in Veeqo (this would require a specific API call)
// For now, we'll simulate this
const returnRecord = {
id: `ret_${Date.now()}`,
order_id: params.order_id,
status: 'label_created',
tracking_code: label.tracking_code,
label_url: label.label_url,
carrier: label.rate.carrier,
service: label.rate.service,
created_at: new Date().toISOString()
};
return {
order: updatedOrder,
return_shipment: {
id: returnShipment.id,
tracking_code: label.tracking_code,
label_url: label.label_url,
carrier: label.rate.carrier,
service: label.rate.service
},
return_record: returnRecord
};
} catch (error) {
logger.error('Error in unified.processReturn', { error });
if (error instanceof RpcBaseError) throw error;
throw new RpcBaseError('UNIFIED_PROCESS_RETURN_ERROR', 'Failed to process return', error);
}
}