2024-04-12: Propagate partners quote error to front end

Participants

  • @Caes, Guilherme

Reviewers

@Raphael Ferreira Gomes
@Franca, Helio
@Busana, Marcelo (Deactivated)
@Krajewski, Piotr (Deactivated)
@Fernandez Pranno, Marco Manuel
@Souza, Rafael
@Nunes de Oliveira, Henrique (Deactivated)

Context

Please check Include new error codes in delivery quote error ADR to see the defined list of codes.

In the effort to display customized messages for different errors when quoting an order fails (Service paused and Reduced Area ), it is necessary to propagate this information from partners server where it is received to front end, where the customer can be redirected to the appropriate page. Given there are many different possibilities to achieve this goal, this ADR is intended to document the chosen reason.

There are two pages where Whitelabel App (directly or indirectly) creates new quotes: The store locator page and the checkout page.

Store locator page

The app triggers a DeliveryRestaurant query that directly generates an empty quote to check the restaurant availability, as displayed in the sequence diagram below.

Page

image-20240412-180656.png
Store-locator page

Checkout page

In the checkout page, a new quote is created indirectly after the priceOrder mutation is triggered in the front. Through a series of asynchronous steps, the on-apply lambda is triggered after the order is priced, and then the deliveryServiceApplyQuote lambda updates the delivery in the RBI order. The full processes are described in the sequence diagram below.

Sequence diagram

Page

image-20240412-180548.png
Checkout page

 

Decision

Include an optional unavailabilityReason field in the following interfaces:

interface

where

why?

triggered by

interface

where

why?

triggered by

delivery-restaurant.dto.ts

delivery-service

Rest API requested for wl-gql when processing DeliveryRestaurant query

store-locator page

schema.graphql

delivery-service

Graphql type for DeliveryRestaurant query when using the gateway

store-locator page

restaurant.gql

intl-whitelabel-graphql

Graphql type for DeliveryRestaurant query when not using the gateway

store-locator page

delivery.ts

intl-packages

wl-app use a getOrder pooling to validate the quote success. Including unavailabilityReason here will enable the app to display the right message

checkout page

Consequences

Little impact on platform existing quote logic and validations

Scales well with new reasons for restaurant unavailability

Doesn’t require the creation of new queries in front end

Includes a new field for delivery that will only be used for partners orders

Modifies more interfaces than some of the alternatives

Disregarded alternatives

Disregarded solution 1

Add new values to DeliveryStatus enum to represent possible unavailability reasons. This would require the inclusion of the following values in DeliveryStatus enum definition:

export enum DeliveryStatus { // Current values DRIVER_ASSIGNED = 'DRIVER_ASSIGNED', DRIVER_AT_CUSTOMER = 'DRIVER_AT_CUSTOMER', DRIVER_AT_STORE = 'DRIVER_AT_STORE', DRIVER_STARTING = 'DRIVER_STARTING', DRIVER_UNASSIGNED = 'DRIVER_UNASSIGNED', ORDER_ABANDONED = 'ORDER_ABANDONED', ORDER_CANCELLED = 'ORDER_CANCELLED', ORDER_CREATED = 'ORDER_CREATED', ORDER_DROPPED_OFF = 'ORDER_DROPPED_OFF', ORDER_ERROR = 'ORDER_ERROR', ORDER_PICKED_UP = 'ORDER_PICKED_UP', ORDER_TIMEOUT = 'ORDER_TIMEOUT', QUOTE_ERROR = 'QUOTE_ERROR', QUOTE_NOT_REQUIRED = 'QUOTE_NOT_REQUIRED', QUOTE_REQUESTED = 'QUOTE_REQUESTED', QUOTE_SUCCESSFUL = 'QUOTE_SUCCESSFUL', QUOTE_UNAVAILABLE = 'QUOTE_UNAVAILABLE' // New values QUOTE_UNAVAILABLE_RESTAURANT_CLOSED QUOTE_UNAVAILABLE_NUMBER_OF_ORDERS QUOTE_UNAVAILABLE_TECHNICAL_ISSUES QUOTE_UNAVAILABLE_RESTAURANT_NEAR_TO_CLOSE QUOTE_UNAVAILABLE_WEATHER QUOTE_UNAVAILABLE_NO_DRIVERS_AVAILABLE QUOTE_UNAVAILABLE_REDUCED_CAPACITY }

Consequences

Doesn’t require changes in multiple interfaces, only a single enum

Bad semantics, since the new values are quote error reasons and not really a delivery status

Will impact the quote validation logic in many areas of the platform (e.g. isPriceOrderRequestComplete in fulfillment)

Doesn’t scale with new quote errors

Disregarded solution 2

This solution proposes the same as the chosen solution for the store-locator page, but for the checkout page, instead of saving the unavailability reason in the order it will save it in the quote dynamo table and poll for it in WL App. This would require the inclusion of the unavailabilityReason field in the following interfaces:

interface

where

why?

triggered by

interface

where

why?

triggered by

delivery-restaurant.dto.ts

delivery-service

Rest API requested for wl-gql when processing DeliveryRestaurant query

store-locator page

schema.graphql

delivery-service

Graphql type for DeliveryRestaurant query when using the gateway

store-locator page

restaurant.gql

intl-whitelabel-graphql

Graphql type for DeliveryRestaurant query when not using the gateway

store-locator page

Currently, if any of the quote validations in the create quote fail and throw an error, the quote is not saved in the delivery table. This solution would require the create quote logic to also save quotes with errors. With this information stored, WL App can pool for it using the getQuote endpoint.

Consequences

Scales well with new reasons for restaurant unavailability

Doesn’t modify RBI Order interface

Adds a new pooling in the checkout, which is a critical page that already has poor performance

Saves failed quotes in dynamo, which increase storage cost in AWS