Shop and Collect

This article is for the internal API. For external applications see Schiphol Shop & Collect

Shop and Collect is currently used at Schiphol, and will be build for airport Brussels and Charleroi. At Schiphol the old name was Pickup On Return (PUOR).

On Schiphol Airport the warehouse system is provided by a 3rd party, the lockers are provided by ByBox.

On Brussel and Charleroi the warehouse system will be ours, the lockers are provided by locktec (Germany).

Codebase

Resolut POS 2 project

POS Plugin TFS /$Resolut/Plugins/PluginsGeneric

Server parts:

Functional

When customers are flying with hand luggage only, you cannot buy liquids like perfume or alcohol and take it back on your return flight.

The solution is that you buy the product on the airport, leave it at the airport, and pickup your purchase when you return.

The purchase (parcel) is sent to the warehouse, and the day before you return the warehouse places the purchase in a locker using a specific barcode printed on the parcel.

On the customer receipt another barcode can be used to open the door and collect your purchase.

Technical​​

The POS calls a webservice at our shop & collect service and sends two barcodes, and optional a mobile phone number. If a mobile number is provided, the customer receives an SMS with the order number. The locker receives two barcodes, one to deliver the parcel, one to pick up the parcel.

History

  • Release 2: Implemented cloud server (services1.bovertis.nl) to send SMS reminders
  • Release 3: Implemented logibag lockers though the cloud service

In release 3 (logibag) method ConfirmOrderValuebleLocker is used to register the barcodes to open the lockers door.

Functionality

At the POS the return date and optional the mobile phone number is entered. When this is finished, the POS request a ClaimOrder to get the order id. The order id is further used for the confirm or cancel method.

If the claim fails the POS will retry (queued), in fact as long the POS is not restarted the following claim or cancel will succeed.

Detected issue

The parameter ShopCollectLockers controls if barcodes should be set on the Shop & Collect receipts, this will tell ’the purchase is registered at logibag’. So even if the claim fails (and probably the confirm), this is printed, and in that case the locker will not open (since it is never announced at lockers).

Confirm valuable locker barcodes

In the ConfirmOrderValuableLocker method there are 3 parameters added for lockers:

  • Reference - this is the bag barcode
  • Barcode1 - same as reference (bag barcode)
  • Barcode2 - customer receipt barcode

The bag barcode is used to put the purchase in the locker, barcode2 is used to open the door again and take it out.

Webservice methods

​/// <summary>

/// Register the order and claims the order id and send SMS immediately to the mobile number with order id and return date of the customer, If sendNotificationSms is set to true, so if a mobile number is provided customer receives SMS day before, if valuable is set to true, package is marked as valuable and warehouse will be notified by email or sms in the morning of the pickup date
</summary>

/// <param name="securityToken">Client token used for authorization</param>

/// <param name="companyId">The company id.</param>

/// <param name="shopId">The shop id.</param>

/// <param name="posId">The pos id.</param>

/// <param name="mobileNumber">The customer's mobile number. If set, after the order is created, customer receives an register order information sms</param>

/// <param name="customerPickupDate">The date when customer picks upa the package</param>

/// <param name="sendNotificationSms">If set to true, customer receives a notification sms one day before pick up at 12:00</param>

/// <param name="valuable">if set to true, package is marked as valuable and notification email or sms is sent to warehouse on the pickup day approx at 7:00 in the morning</param>

/// <param name="reference">Barcode of the package/order (can be set later in confirm method)</param>

/// <param name="barcode1">Barcode of the package/order (can be set later in confirm method)</param>

/// <param name="barcode2">Customer barcode (can be set later in confirm method)</param>

/// <returns></returns>​

ClaimOrderServiceResult RegisterOrderId(string securityToken, int companyId, int shopId, int posId, string mobileNumber, DateTime customerPickupDate, bool sendNotificationSms, bool valuable, string reference, string barcode1, string barcode2);

/// <summary>

/// Confirms the order valuable, locker information.

/// </summary>

/// <param name="securityToken">Client token used for authorization</param>

/// <param name="orderId">The order id</param>

/// <param name="ticketTransactionId">Ticket transacation id (unique id)</param>

/// <param name="ticketDate">Transaction datetime</param>

/// <param name="ticketNumber">Ticket number</param>

/// <param name="ticketData">The ticket data (serialized ticket data or receipt text converted to byte array).</param>

/// <param name="valuable">if set to true, package is marked as valuable and notification email or sms is sent to warehouse on the pickup day approx at 7:00 in the morning​</param>

/// <param name="reference">Barcode of the package/order</param>

/// <param name="barcode1">Barcode of the package/order</param>

/// <param name="barcode2">Customer barcode</param>

/// <returns></returns>

ServiceResult ConfirmOrder(string securityToken, int orderId, int ticketTransactionId, DateTime ticketDate, int ticketNumber, byte[] ticketData, bool valuable, string reference, string barcode1, string barcode2);

/// <summary>

/// Cancels the order.

/// </summary>

/// <param name="securityToken">Client token used for authorization</param>

/// <param name="orderId">The order id.</param>

/// <returns></returns>

​ServiceResult CancelOrder(string securityToken, int orderId);

Contract objects returned by the webservice

ClaimOrderServiceResult

​Field name ​Type ​Description
​​Success ​Boolean ​Indicates if operation was successful​
​ErrorCode ​Integer ​Error code number (see error codes table)
​ErrorMessage ​String ​Error message in English
ClaimedOrderId ​Integer ​Id of the order created in the system, later used in confirm or cancel methods
SmsSent​ ​Boolean ​Indicates if customer sms was sent

ServiceResult

​Field name ​Type ​Description
​Success ​Boolean Indicates if operation was successful​
​ErrorCode ​Integer ​Error code number (see error codes table)
​ErrorMessage String ​Error message in English

Error Codes

​0 ​No error
​1 ​Error, more details in the Error Message
​91 ​Not all messages could be delivered
​92 ​Password does not match
​93 ​Given date is incorrect
​94 ​Message is larger than 160 characters
​95 ​Senderid is incorrect
​96 ​There are empty parameters or fields
​97 ​Onvoldoende sms-tegoed
​98 ​Domain from which the message is sent does not match with ‘beveiliging domein’
​99 ​​Text message could not be delivered​
​100 ​Order is received correctly and will be processed
​101 ​Order is not accepted​