Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 19 Next »

For milestones to be calculated for an order, orchestration must take the delivery promise into account, to do so, orders must be orchestrated using a ruleset chaining instead of a ruleset.

Vocabulary

  • Milestone: it represents a specific step in the order execution and the corresponding time when it should be executed. For example: fraud check validation on the 05/05 at 10:00, start of preparation on the 05/05 at 12:00, carrier pick-up on the 05/05 at 16:00…

  • Cutoff: it is a consistent group of the different milestones to execute an order. For example: (fraud check validation: 05/05 10:00 ; preparation start: 05/05 12:00 ; carrier pick-up: 05/05 16:00)

  • Cutoffs set: all the cutoffs that allow a delivery on time (eventually taking into account the tolerance) for a given delivery route (for a given carrier-service).

In the example below, for a promised delivery date on the 08/05, there are 2 cutoffs sets:

  • 1 for UPS-standard with 2 cutoffs possible

  • 1 for DHL-express with 3 cutoffs possible

Carrier-service

Fraud check validation

Start preparation

Carrier pick-up

Delivery

UPS-standard

05/05 10:00

05/05 12:00

05/05 16:00

07/05 10:00-18:00

06/05 10:00

06/05 12:00

06/05 16:00

08/05 10:00-18:00

DHL-express

05/05 12:00

05/05 14:00

05/05 18:00

06/05 08:00-13:00

06/05 12:00

06/05 14:00

06/05 18:00

07/05 08:00-13:00

07/05 12:00

07/05 14:00

07/05 18:00

08/05 08:00-13:00

Milestones depend on delivery promise configuration

Milestones are calculated based on delivery configuration operations.
Operations taken into account are always_at_start, before_shipping and from_destination. Operations of type after_shipping are not taken into account, as when received, the current delivery promise eta end is the milestone of interest.

Milestones are precalculated and stored in Endpoint Delivery Promises under the object cutoffs.

Milestone names are auto-generated and match delivery configuration’s operation names. 

Delivery configuration’s operations duration depends on operations set in the stock locations. If an operation is not set in the stock location, a duration of 0 seconds will be considered for it.

Endpoint Delivery Promise (EDP) Cutoff Example

{
    "_id" : ObjectId("618225724bbd51a42c47ce10"),
    "cutoffs" : {
        "prep_time_sfs" : 1636030800,
        "carrier_pickup" : 1636030800,
        "without_always_at_start" : 1636027200,
        "purchase_cutoff" : 1636027200
    },
    "delivery_method" : "STD",
    "delivery_route_id" : "GB_GB_DPD_Standard",
    "eta_end" : 1636232400,
    "eta_start" : 1636117201,
    "expired" : false,
    "pickup_day" : 1635984000,
    "sales_channel_id" : "web",
    "version" : 0,
    "endpoint_ids" : [ 
        "190", 
        "157"
    ],
    "public_id" : "5279a9cc-3c6b-11ec-bf59-02420a0001f3",
    "unavailable_endpoint_ids" : []
}

Using milestones

To exploit milestones during order's treatment, milestones must be used in the workflow. This allows to set milestones - considered that it has been reached - and set alerts if not reached in time.

Workflow

All information regarding workflow actions can be found at Orders & workflows

  1. set_milestone : set the achieved milestone. If empty, without_always_at_start milestone is set (generally de case when initiating milestones in the graph).
    For the set_milestone action to work, the line item group must have stock location ID assigned. As a result, when placing a set_milestone in the workflow it must be placed after assign origin actions.

    1. To make use of milestones, they must be stored for the order at each of its line_item_groups claimed transition. To do so, the action set_milestone has to be set in the claim transition of the line_item_groups, if any..

    2. When recomputing, solutions with non-achieved milestones dates in the future (greater than now) will be considered as valid options. Those with dates in the past, will not be considered.

  2. set_milestone_alert : Schedule alerts to be triggered at milestones cutoffs (plus a delay)

    1. Notifications can be scheduled to be triggerd at the time of milestones cutoffs (plus a certain delay). When triggered, a validity check will be performed to ensure the specified milestone has not yet been reached/acheived. If already reached, notifications won't be triggered.

      1. (info) The time at which the notification will be triggered is the milestone cutoff of the first milestone stored in order_delivery_promises. Cutoffs are sorted based on the sort criteria configured for the site.

    2. A special notification named recompute_cutoffs_sets can be called to recompute the cutoffs for each milestone.

When recomputing cutoff sets, solutions with non-achieved milestones dates in the future (greater than now) will be considered as valid options. Those with dates in the past, will not be considered.

When are milestones recalculated ?

All this scenarios impact the current delivery promise of the order.

  1. Reservation change.
    🤓 eta_end in the reservation changes or the reservation changes from one stock key to another. 

  2. When a line item group gets claimed if set_milestone is set in the graph worfklow.
    🤓 The current eta_end will be the one determined by the orchestration. The tolerance set in the ruleset chaining impacts the current eta_end.

  3. When an item is put or removed from a parcel. The current eta_end that's calculated is the one for the parcel as a whole.

  4. When the recompute_cutoffs_sets notification is sent by a set_milestone_alert action.

Notifications

Milestones notifications are sent using a special rabbit queue. The project must have the following notification configured for notifications to work.

lig_milestone_reached:
  media:
    rabbit:
    - order_dp:lig_milestone_reached
  time_type: duration
  time_value: 0s

Notification message example

 Expand 🔽
{
    "_id": "6728df89-08fb-11ee-b2dc-02420a000151",
    "params_id": "9975646481091038063",
    "notification_name": "lig_milestone_reached",
    "params": {
        "delay": 120,
        "endpoint_id": "1302",
        "exchange_name": "order_dp:lig_milestone_reached",
        "index_ranges": [
            {
                "from": 0,
                "to": 4
            }
        ],
        "message": {
            "notification_name": "alert_cancel_order",
            "order_id": "CKC021",
            "endpoint_id": "1302",
            "milestone": "prep_milestone",
            "index_ranges": [
                {
                    "from": 0,
                    "to": 4
                }
            ],
            "site_id": "",
            "cutoff": 1686558935,
            "notification_key": "6db3b287-8199-40eb-b52a-0f7ac1b046b8",
            "notification_params": {
                "delay": 120,
                "endpoint_id": "1302",
                "index_ranges": [
                    {
                        "from": 0,
                        "to": 4
                    }
                ],
                "milestone": "prep_milestone",
                "notification_key": "6db3b287-8199-40eb-b52a-0f7ac1b046b8",
                "order_id": "CKC021"
            }
        },
        "milestone": "prep_milestone",
        "notification_key": "6db3b287-8199-40eb-b52a-0f7ac1b046b8",
        "order_id": "CKC021"
    },
    "deadline": "2023-06-12T08:37:35.000Z",
    "notification": {
        "aggregate": false,
        "aggregate_batch_size": 0,
        "aggregate_max_size": 0,
        "aggregation_interval": "",
        "conditions": {},
        "media": {
            "rabbit": [
                "order_dp:lig_milestone_reached"
            ]
        },
        "time_type": "absolute",
        "time_value": "1686559055",
        "location": "",
        "skip_days": null
    }
}

Configuration example

For the set_milestone action to work, the line item group must have stock location ID assigned. As a result, when placing a set_milestone in the workflow it must be placed after assign origin actions, if any.

Workflow

placed:
  transitions:
    claimed: # De placed à claimed (VI)
      conditions:
      actions_after:
      - type: set_milestone
      - type: set_milestone_alert
        parameters:
          milestone: packed
          notifications:
          - name: send_mail
            delay: -300
            params:
              to: "tbaudon@onestock-retail.com"
claimed:
  transitions:
    packed: # De claimed à packed (VI)
      conditions:
      actions_after:
      - type: set_milestone
        parameters:
          milestone : preparation #name depends on DP config
packed:
  transitions:
    dispatched: # De packed à dispatched (VI)
      conditions:
      actions_after:
      - type: set_milestone
        parameters:
          milestone : carrier_pickup

Notifications

lig_milestone_reached:
  media:
    rabbit:
    - order_dp:lig_milestone_reached
  time_type: duration
  time_value: 0s

Sorting cutoff sets

Multiple cutoff sets are calculated and consist of all the possible delivery options that can serve the order on time (promised delivery date + tolerance allowed by the orchestration ruleset chaining). See Vocabulary

Sorting criteria are defined to select the best options. The sorting is done in two steps:

  • among the cutoffs: sort all the cutoffs a given delivery route (so, for the same cost)

  • among the cutoffs sets: sort the best cutoffs of each delivery route.

This configuration is set on the configuration of the site (file or API):

delivery_promise:
  cutoffs_sets: # from v 10.1
    use_sort_orders: true # if true: sorts cutoff sets using the delivery config's sort criteria. Cutoffs are sorted based on the below configuration default_sort_criteria>..>cutoffs.
    sort_critera: # sort criteria to use (overrides use_sort_orders:true, but does not override criteria when specified in GET /cutoffs request)
      eta_fulfilled: #in case there is no tolerance defined or tolerance is finite
        cutoffs_sets: [ +cost_by_parcel, -carrier_pickup, +eta_end ] #cheapest, latest carrier pickup, fastest eta_end
        cutoffs: [ -carrier_pickup, +eta_end ] #latest carrier pickup, fastest eta_end
      eta_exceeded: #in case there is an infinite tolerance defined
        cutoffs_sets: [ +cost_by_parcel, +eta_end ]
        cutoffs: [ +eta_end, +carrier_pickup ]
    default_sort_criteria: # default criteria to use when no sort orders
      eta_fulfilled:
        cutoffs_sets: [ +cost_by_parcel, -carrier_pickup, +eta_end ] #not used if use_sort_orders is true
        cutoffs: [ -carrier_pickup, +eta_end ] #1st by latests carrier pickup, 2nd by fastests eta_end
      eta_exceeded: #juste pour tolérance infinie
        cutoffs_sets: [ +eta_end, +cost_by_parcel ] #not used if use_sort_orders is true
        cutoffs: [ +eta_end, +carrier_pickup ] #1st by fastest eta_end, 2nd by latests carrier pickup.

+ means ascending sorting (0, 1, 2, 3) — the smallest number or the earliest date will be selected

- means descending sorting (3, 2, 1, 0) — the biggest number or the latest date will be selected

use_sort_orders set to true

In this case, the cutoffs of a given delivery route will be sorted using the default_sort_criteria for cutoffs. After that, only the first cutoff of each delivery route will be considered. Then, the cutoff sets will be sorted following the sort option defined on the delivery configurations, in the Delivery screen in the backoffice.

use_sort_orders set to false

In this case, the cutoffs of a given delivery route will be sorted using the sort_criteria for cutoffs. After that, only the first cutoff of each delivery route will be considered. Then, the cutoff sets will be sorted following the sort option defined on sort_criteria for cutoffs_sets.

Display the milestones on the store app

Select the pages and milestones to display

In the store app config, you need to add a delivery_promise key, with the list of pages where to display the milestones.

  • Pages supported: pack, bag, reserve, pack_scan, bag_scan

delivery_promise:
  pack:
    milestone: carrier_pickup
    warning:
      from: 600
      to: 1800
  bag:
    milestone: carrier_pickup
    warning:
      from: 600
      to: 1800
  reserve:
    milestone: carrier_pickup
    warning:
      from: 600
      to: 1800

The warning indicates the period of time, in seconds, before the milestone, during which the remaining time will be showed as a warning, in orange. Before, the milestone is shown with no warning, and after it is shown in alert, in red.

 Click here to expand...

If the milestone is today at 17:00, and the configuration is:

    warning:
      from: 600
      to: 1800

It means that the order will be displayed:

  • in black until 16:30,

  • in orange between 16:30 and 16:50 and

  • in red starting from 16:50.

Turn on the display of milestone on the stock location

Your stock location must have a configuration to indicate that the milestones can be displayed.

You must configure this on the stock location (endpoint), by API (it is currently not available in the backoffice):

"configurations": {
    "delivery_promise": {
        "milestone": true,
    }
}
  • No labels