These features are available on your Test site as of the evening of June 26th, on your Preproduction site in the evening of June 28th and on your Production site in the evening of July 3rd.



New Features in This Release



  • Ability for self-serve users to pay by credit card
  • Ability to make partial payments by credit card
  • Driver App scanning improvements
  • Improved visibility on the upload of attachments from the Driver App
  • Minor user experience improvements
  • Enhancements to security permissions
  • Auditing enhancements
  • New & improved API endpoints



TABLE OF CONTENTS



Definitions

The release notes refer to different sections of the application:

Back Office: Where Customer Service Representatives (CSR) create and edit orders, create accounts, review drivers, etc.

Dispatch Board: Where Dispatchers assign orders to drivers, get notifications for invalid orders, etc.

Auto-Dispatch: This section refers to the automated order assignment setup and its process.

Administration: This section is in the Back Office but refers to sections only an administrator will use like Settings and Pricing.

Customer Portal: Where account users log in to create orders, view their order history, enter a credit card, etc.

Tracking site: Where customers enter a tracking number like the order ID or a reference number to view the status of their order.

OData: Data fields and variables saved in OData

Account API: API provided to your accounts to create, update and get orders. For documentation, please follow this link: https://api.dispatchscience.com/
Tenant API: API provided to you to create orders for your accounts, retrieve invoices and change invoice status. For documentation, please follow this link: https://api.dispatchscience.com/  

Scripting: Custom script building abilities and functions within Dispatch Science

 

Driver App Version 1.66

Grouped Order Containing Orders With No Items

In a group when picking up or delivering Orders, if at least one Order has no items, driver was asked to confirm that all Orders were selected then asked to report Orders with no items. This has been reversed for a better flow:


1) Once items are scanned, if there are Orders in the Group that have no items, upon Complete:

Tapping on No will return to the scan window, all Orders that had no items will not be selected in the list and will remain open once the driver completes the Stop.

Tapping on Yes will return to the scan window and all Orders with no items scanned will be selected for the stop to be completed.

If not all Orders in the group were selected through the scan or by tapping Yes in the first question, a second question will be asked:

On Cancel, Driver will be returned to the scan window to complete the scans.

On Ok, Driver will be presented with the list of Orders and the Exception Codes. 

If Driver answered Yes to Report Orders with No Items Scanned, the Orders with no items will be selected for the stop to be completed and if Driver answered No, the Orders with no items will not be selected and will not be completed.

Driver can click Ok to continue to the Workflow to complete the stops.


Refresh Attachment List to Upload

On the Settings tab, when attachments are waiting to upload,  you can now open the list and pull down to refresh the list to verify that all attachments have uploaded.

Click on the Attachment to upload to display the list and you can pull to refresh the list to see them uploaded:


Validation on Grouped Stop 

On validation in grouped stop, Driver was asked to first confirm that not all orders were selected  if Orders had no items then was asked if Orders that had no items should be closed. 

Questions were inverted since it made more sense to confirm that Orders with no items should be closed as part of the group.


Continuous Checkpoint Mode

When Continuous Scan is enabled on a checkpoint (for more information please see Continuous Mode under Checkpoint ), Driver can scan without waiting for the response back about the item scanned. This speeds up the scan at checkpoint.



Back Office


Dispatch Science uses Credit card tokenization. This is a data security technique that replaces the actual credit card number with a unique identifier called a “token” during online transactions. This token acts as a stand-in for the card information, ensuring secure and seamless payment processing, without ever storing the original credit card number.


Transactions

Partial Payment Using Credit Card

A Stripe account must be setup in Dispatch Science in order to use this feature. 
Please contact Support if you have questions about Stripe.

You can now apply a partial payment through credit card to an Invoice or Debit Note. 

1) Open Accounts>Transactions.

2) In the right hand side menu of a Transaction of type Invoice or Debit Note,  you will be able to select Pay With Credit Card.

3) A dialog box will open with the balance owed in the field:

You can change the amount to be less than the balance but the amount must be larger than $0.50.

4) Click on Pay when ready. 

If amount entered is greater than the balance, the Pay button will be disabled. 
Amount less than $0.50 will result in an error message:

If no credit card was available on the Account, a warning will be displayed:

5) If you click Yes to add the card, you will be taken to the Add credit card menu item where you will be able to enter the credit card. Clicking on Cancel will return to the Transactions list.


Showing Blocked Accounts Information

On the Transactions lists, you can now see if an account has been blocked, show the reason and navigate to the account to unblock it. 

Hovering on the  will show the reason:

Clicking on the Account name link will bring you to the Account details where you can click on Unblock to unblock the account:



Self-Serve

Pay Transactions by Credit Card

A Self-Serve user can now pay their invoices or debit notes, using the credit card on file. If no credit card is on file, the user will be redirected to the credit card section, if given access through the user role, to add a new credit card. For more information about giving access to the Self-Serve Admin/User, please see https://support.dispatchscience.com/a/solutions/articles/36000498753#Self-Serve-Roles.


1) Click on My Account and the Transactions list will be displayed according to setting in the Account Self-Serve Profile.

Admin/User must be given View access to the Transactions as part of their role to see the Transaction List.

2) If admin/user was also given access to Pay by Credit Card, the Pay With Credit Card link will show beside the invoices and debit notes that are still open:

A Stripe account must be setup in Dispatch Science in order to use this feature. 
Please contact Support if you have questions about Stripe.


3) Clicking on the Pay With Credit Card link will open the dialog box where you can enter the amount you wish to pay, and if an email should be sent on successful or unsuccessful payment:


By default, the open balance will be used as payment however, this can be changed for a lesser amount.


A minimum payment of $0.50 is required. Payment less than $0.50 will not be processed.
An amount greater than the balance of the Order cannot be used and will show with the Pay button disabled:


4) Click on Pay to pay the amount.

If there is a problem with the payment, an error message will be displayed:

The payment will show in the list and will be marked as cancelled if admin/user has access to view it.


5) Once the payment is processed, the dialog box will show the transaction number:

The invoice will be set as Paid if the entire balance was paid, or will show the balance to pay. If Payments are visible to the user, the payment will be displayed in the list and will be set as Closed.


Pay with Credit Card with no Credit Card on File

If no credit cards are on file for the Account, Self-Serve admin/user could enter a credit card if they have Edit Access to Credit Card as part of their Role. 

1) In the Transactions List, click on Pay With Credit Card.

2) If the Self-Serve admin/user does not have the permission to edit the credit card and there is no credit car on file, the following message will be displayed:

If the Self-Serve admin/user does have the permission to edit the credit card, the following message will be displayed:

On Cancel, user is returned to the Transaction List and no payment is made.

On Yes, page refreshes to the Credit Card page where user can enter a new credit card.

Enter the cardholder name, the credit card number, expiry date and CVC then click on Add Credit Card.

Once the credit card is saved, user can return to the Transaction List and perform the payment.



Administration

Internal Roles

Changes to Actions

It is no longer required for an internal user to have edit access to the Orders for the following actions, as long as they have the permission for the action.

1. Dispatch an Order to a driver only requires Orders>Dispatch action.This is available in the Grid Board, Grid Board Order details, Back Office Order details, Dispatch Board.

2. Set at Checkpoint only requires Orders>Scan / Set At Checkpoint action.This is available in the Grid Board, Grid Board Order details but requires edit access to the Order in Dispatch Board Order details.

3. Release a held Order only requires Orders>Release action.This is available in the Grid Board Order details.

4. Add or remove Exception code only requires Orders>Exception Codes Edit.This is available in the Grid Board, Grid Board Order details, Back Office Order details.

5. Update internal notes only requires Orders>Internal Notes Edit.This is available in the Grid Board, Grid Board Order details, Back Office Order details, Dispatch Board Order details (on the Dispatch Board Order details, an internal note cannot be added but current note can be edited).

6. Unassign an Order from a Driver only requires Orders>Unassign.This is available in the Grid Board, Grid Board Order details, Dispatch Board, Dispatch Board Order details.

7. Convert an Order to On Demand only requires Route>Convert to On-Demand.This is available in the Grid Board, Grid Board Order details, Dispatch Board Order details.



These permissions were already available but they are now disconnected from the Orders Edit permission. No changes are required to keep the version 1.65 behaviour. Changes are needed if you want to remove edit access to the Order while keeping access to these options.


Additional Permissions

There are 3 additional action permissions that were added to the Internal Roles. These permissions do not require to have edit access to the Orders to be used on the Grid Board, Dispatch Grid Order details, Dispatch Board Order details.

  1. Orders>Set as Picked Up: this allows to add or remove the right for a user to set an Order as picked up regardless if user has Edit access to the Order.
  2. Orders>Set as Delivered: this allows to add or remove the permission for a user to set an Order as delivered regardless if user has Edit access to the Order.
  3. Route>Convert to On-Demand: this allows to add or remove the right to convert a Routed Order to On Demand regardless if user has Edit access to the Order.
By default, these will be checked for all users with Edit access to Orders to ensure there are no changes to the version 1.65 behaviour.


Self-Serve Roles

New Permissions

New permissions were added to the Self-Serve role to better control the features that Self-Serve users will have in Dispatch Science.

Two new Transactions permissions were added to allow a user to be allowed to pay their transactions by credit card.

  1. Transactions > View
  2. Transactions > Pay By Credit Card (action)
  3. Reports


Transaction > View
This permission lets you determine if the Self-Serve Role will have access to My Account>Transactions:

This is set to checked automatically for all Self-Serve admin roles. 

In order to see Transactions in the Transaction list, the Self-Serve Profile associated to the Account should also have checked the transaction types that will be visible for the Account.


Transactions > Pay By Credit Card

This permission will allow a Self-Serve user (user or admin) associated to the Role, to pay a transaction using a credit card associated to the Account.

Since this is a new feature, it is not checked in any of the Self-Serve Roles.



Reports

This permission gives access to the report section in the Self-Serve Portal which contains the Signatures Report. 

This is set to checked automatically for all Self-Serve user roles.



Give Access to Self-Serve Users to Transaction Types

1) Open the Account from the Account list by clicking on the Account then in the Profiles Options section, click on the Self-Serve Profile link:

2) In the Self-Serve Profile, click Edit in the Web Options section:

3) Check the transactions that the Self-Serve Users should see under Account, Transactions in the Self-Serve Portal then click Save.


Checkpoints

A new feature is available on the Checkpoints where Overages are automatically taken in charge by an integration:

When Has Overage Support Through Integration is checked and Automatically add unknown scanned item to overage is checked and Integration Webhook URL is filled in, the Enable Continuous Scan can also be checked. 

This allows scanning of items without having to wait for a response thus, allowing to scan continuously.



Application Logs

In the Application Logs, you can now search by Order Id or by the name of a script to get the logs that were created during its execution. 

1) In Application Log, in the search, you can search:

by Order Id by typing the following:  OrderId:ORDERID

by ScriptId by typing the following: ScriptId:SCRIPTID

or by both by typing the following: ORDERId:ORDERID ScriptId: SCRIPTID

ScriptId can be found in the URL when editing the script.



Dynamic Views

In the Dynamic Views, the following sections were added:

  • Settlements
  • Transactions
  • Routes
  • Route Plans
  • Recurrences
  • Settings
  • System

Once a view is added to a section, the section becomes visible. 




OData

ServiceLevelDiscounts Table

The following fields were removed from the table since they were not used:

  • ServiceLevelScheduleId
  • ServiceLevelScheduleName
If this table is used in any of your requests in OData, please make sure you remove these two fields.



API

Integration-Tenant API

GET /api/v1/recurring-orders

On the GET /api/v1/recurring-orders/{recurringOrderId} end point, the skipDaysOfWeek parameter is now returned in the list of order templates. 


GET /api/v1/recurring-routes

On the  GET /api/v1/recurring-routes/{recurringRouteId} end point, the skipDaysOfWeek parameter is now returned in the list of order templates. 


Subscription

4 new actions were added as part of the subscription:

  • items_added
  • items_removed
  • items_updated
  • route_optimized


items_added

Adding this to the subscription will send back a response with information about the added items and a summary for all items on the Order.

Response:

{

  "OrderId": "CC56552",

   "Metadata": null,

  "Status": 4,

   "Timestamp": "2024-06-26T16:52:19.3662353+00:00",

   "Language": "en",

   "EventType": "items_added",

   "AccountId": "309",

   "FulfillmentType": 0,

  "RouteId": null,

   "ItemsAdded": [

    {

       "ItemId": "31ae6ecc-ce84-4455-aba5-a570791acc46",

       "ItemNumber": 2,

       "BarcodeTemplate": "2",

       "Description": null,

       "Weight": 0,

       "Length": 0,

       "Width": 0,

       "Height": 0,

       "AddedByDriverId": null,

       "BarcodeManuallyUpdated": false,

       "ParcelType": {

         "Id": "Small",

         "NamePrimary": "Small",

         "NameSecondary": null,

         "SystemOfMeasurement": "Metric",

         "UnitOfLength": "Centimeters",

         "TotalUnitFactor": 0

      }

    },

    {

       "ItemId": "a86efea3-58f9-460b-a660-92c6441656ec",

       "ItemNumber": 3,

       "BarcodeTemplate": "3",

       "Description": null,

       "Weight": 0,

       "Length": 0,

       "Width": 0,

       "Height": 0,

       "AddedByDriverId": null,

       "BarcodeManuallyUpdated": false,

       "ParcelType": {

         "Id": "Small",

         "NamePrimary": "Small",

         "NameSecondary": null,

         "SystemOfMeasurement": "Metric",

         "UnitOfLength": "Centimeters",

         "TotalUnitFactor": 0

      }

    }

  ],

   "TotalNumberOfPieces": 3,

   "TotalWeight": 45,

   "TotalVolume": 0,

   "FactorizedNumberOfPieces": 1

}


items_removed

Adding this to the subscription will send back a response with information about the removed items and a summary for all remaining items on the Order.

Response:

{

  "OrderId": "CC56552",

   "Metadata": null,

  "Status": 4,

   "Timestamp": "2024-06-26T18:15:31.1431113+00:00",

   "Language": "en",

   "EventType": "items_removed",

   "AccountId": "309",

   "FulfillmentType": 0,

  "RouteId": null,

   "ItemsRemoved": [

     "8225ebdc-db77-4c40-bee6-f93a91fe7ac3"

  ],

   "TotalNumberOfPieces": 3,

   "TotalWeight": 28.122726940000003,

   "TotalVolume": 0.02777609355053856,

   "FactorizedNumberOfPieces": 3

}


items_updated

Adding this to the subscription will send back a response with information about the updated items and a summary for all items on the Order.

Response:

{

  "OrderId": "CC56552",

   "Metadata": null,

  "Status": 4,

   "Timestamp": "2024-06-26T18:17:46.1080073+00:00",

   "Language": "en",

   "EventType": "items_updated",

   "AccountId": "309",

   "FulfillmentType": 0,

  "RouteId": null,

   "ItemsUpdated": [

    {

       "ItemId": "652ebc4a-74c1-4c6f-bc44-745bb1faf70b",

       "ItemNumber": 1,

       "BarcodeTemplate": "1",

       "Description": "this contains fragile components",

       "Weight": 50,

       "Length": 17,

       "Width": 17,

       "Height": 5,

       "AddedByDriverId": null,

       "BarcodeManuallyUpdated": false,

       "ParcelType": {

         "Id": "Large",

         "NamePrimary": "Large",

         "NameSecondary": null,

         "SystemOfMeasurement": "Imperial",

         "UnitOfLength": "Inches",

         "TotalUnitFactor": 1

      }

    }

  ],

   "TotalWeight": 28.12272694,

   "TotalVolume": 0.02777609355053856,

   "FactorizedNumberOfPieces": 3

}


route_optimized

This can be associated to the company or to a specific Route Plan. When associating to a Route Plan, only the routes within the Route Plan will be returned when optimization is done. 

To use with a Route Plan, in the Subscribe to system update end point (POST/api /v1 /subscriptions), the body should include the following:

{

  "EntityType": "RoutePlan",

  "EntityId": "RoutePlanId",

  "Url": "Webhook URL",

  "EventTypes": [

    "route_optimized"

  ]

}

Where:

EntityId: Route Plan Id - this can be found at the end of the URL when editing the Route Plan.

EventTypes: route_optimized


Response:

{

   "EventType": "route_optimized",

   "Timestamp": "2024-06-27T18:31:15.3355513+00:00",

  "RouteId": "266_20240628T1100Z_East",

   "RoutePlanId": 266,

   "TravelTime": 2053.9,

   "TotalTime": 1999,

   "Distance": 19.76,

   "DistanceUnits": "mi"

}


TravelTime is in seconds.

TotalTime is in seconds

Distance is in the DistanceUnits.


POST/api /v1 /recurring-orders /{recurringOrderId} /add-order-templates

This endpoint adds one or more Order Template to a Recurring Order. With the addition, the pickup and delivery window can be updated, a driver can be setup on the template if the Recurring Order does not have a Route, skip dates can be added: as dates, as days, as a calendar

Body

[

  {

     "templateId": 0,

     "overridePickupAndDeliveryWindow": true,

     "defaultDriverId": "string",

     "pickupFromDayOffset": 0,

     "pickupToDayOffset": 0,

     "pickupFromTime": "string",

     "pickupToTime": "string",

     "deliveryFromDayOffset": 0,

     "deliveryToDayOffset": 0,

     "deliveryFromTime": "string",

     "deliveryToTime": "string",

     "skipDates": [

       "2024-06-27T12:49:40.124Z"

    ],

     "skipDatesCalendarIds": [

      0

    ],

     "skipDaysOfWeek": [

      0

    ]

  }

]



POST/api /v1 /recurring-routes /{recurringRouteId} /add-order-templates

This endpoint adds one or more Order Template to a Recurring Route. With the addition, the pickup and delivery window can be updated, a driver can be setup on the template if the Recurring Order does not have a Route, skip dates can be added: as dates, as days, as a calendar

Body

[

  {

     "templateId": 0,

     "overridePickupAndDeliveryWindow": true,

     "defaultDriverId": "string",

    "pickupFromDayOffset": 0,

    "pickupToDayOffset": 0,

    "pickupFromTime": "string",

    "pickupToTime": "string",

    "deliveryFromDayOffset": 0,

    "deliveryToDayOffset": 0,

    "deliveryFromTime": "string",

    "deliveryToTime": "string",

    "skipDates": [

      "2024-06-27T12:49:40.124Z"

    ],

    "skipDatesCalendarIds": [

      0

    ],

    "skipDaysOfWeek": [

      0

    ]

  }

]