Ready to Ship Time Scripts
Updated by Colin
This script type is executed when an Order is created and when an Order changes from not-"Ready to Ship" to "Ready to Ship". The script may not modify any Order attributes, it can only return a timestamp object that will be used in place of the default current timestamp. If no value is returned the current timestamp is assumed.
The variables defined in the context of these scripts are:
order
- provides all of the order informationShipStream
- provides methods for creating new timestamp objects
Other methods available are:
print
- add a message to the order history
order object
Here is an example of the order
object expressed in JSON format.
let order = {
"merchant": "acme",
"store": "acme",
"items":
[
{
"sku": "73-323-6248",
"qty": null,
"unit_declared_value": null,
"unit_customs_value": null,
"product":
{
"sku": "73-323-6248",
"name": "ThinkPad X1 Yoga 1st Generation, Intel Core i5-6200U",
"barcode": "029465090326",
"external_id": null,
"vendor_sku": null,
"goods_type": "ORM_D",
"regulation_id": null,
"status": "1",
"availability": "1",
"visibility": "2",
"weight": 7.248,
"length": null,
"width": null,
"height": null,
"export_description": null,
"country_of_manufacture": null,
"customs_value_usd": null,
"customs_value": null,
"customs_value_currency": "USD",
"hts_base_code": null,
"hts_country_code": null,
"requires_packaging": 0,
"requires_infill": null,
"require_weight_check": 0,
"confirmation_per_item": 0,
"allowed_container_styles":
[],
"valid_containers":
[],
"disallowed_containers":
[],
"special_supplies":
[],
"special_other":
[],
"unit_qty": 1,
"bulk_qty": null,
"max_per_package": null,
"is_ship_separate": 0,
"ship_separate_tag": null,
"can_tip": 1,
"can_contain_other_items": 0,
"freight_class": null,
"freight_category": null,
"weight_lb": 7.248,
"weight_oz": 115.968,
"weight_kg": 3.2876375,
"weight_g": 3287.637500,
"length_in": null,
"length_cm": null,
"length_mm": null,
"width_in": null,
"width_cm": null,
"width_mm": null,
"height_in": null,
"height_cm": null,
"height_mm": null
}
}
],
"address":
{
"region_id": "56",
"region": "Tennessee",
"postcode": "37919",
"street": "123 Big Walk Way",
"city": "Knoxville",
"country_id": "US",
"company": "ACME Inc",
"classification": "com",
"is_valid": null
},
"options":
{
"signature_required": "none",
"saturday_delivery": "0",
"overbox": "0",
"requested_ship_date": null,
"desired_delivery_date": null,
"declared_value_service": "0",
"declared_value": null,
"customs_value": null,
"reason_for_export": null,
"priority": "50",
"backorder_policy": "default",
"tpb_group_id": null,
"shipping_method": "ups_03",
"order_ref": null,
"unique_id": "100000316",
"note": null,
"custom_greeting": null,
"other_shipping_options":
{},
"automation_data":
{}
},
"created_at":
{
"date": "2023-09-07 14:48:01.000000",
"timezone_type": 3,
"timezone": "America/New_York"
},
"submitted_by": "api",
"old_status": "backordered"
}
ShipStream object
This object provides the following methods which may be used to obtain and manipulate timestamps. It is recommended to not use Javascript's built-in Date functions.
ShipStream.date(string dateTime, string timeZone)
Returns a PHP DateTime object initialized with the given string representing a date and time (supporting all of PHP's date and time formats) and time zone name (supporting all of PHP's standard timezones).
Example 1
return ShipStream.date('tomorrow', 'America/New_York')
Example 2
if (ShipStream.date('now', 'America/New_York').format('G') > 20) {
return ShipStream.date('tomorrow', 'America/New_York')
}
ShipStream.now()
Returns a PHP DateTime object initialized with the current time in the UTC timezone.
Example
return ShipStream.now().modify('+2 hours')
Script Priority
If there are multiple Ready to Ship Time scripts defined for the same Merchant, the first one to return a valid timestamp will be used and further scripts will not be executed. Use the Sort Order to ensure that the most important scripts are run first and do not return a value if you want to allow later scripts to run.
Example
This script causes the Ready To Ship time for "crossdock" orders to always be the next day, or for orders that were previously backordered to be delayed by two hours, and otherwise uses the default behavior.
if (order.options.shipping_method === 'external_crossdock') {
return ShipStream.date('tomorrow', 'America/New_York')
} else if (order.old_status === 'backordered') {
return ShipStream.now().modify('+2 hours')
} else {
return ShipStream.now()
}
Here is an example where the Ready to Ship time is set as 3 hours earlier than the actual time to help ensure they are fulfilled the same day.
if ((order.options.order_ref||'').match(/-VIP$/)) {
print('VIP order given 3 hours grace period for cut-off.')
return ShipStream.now().modify('-3 hours')
}