Problem

When the user to search a restaurant on Whitelabel in Delivery mode, the system gives a restaurant available for delivery.

But in case of this restaurant is closed, the system show error for restaurant is unavailable, the same message in case not have delivery in this address.

This cause problems for users, because show de wrong message, the correct message is the restaurant is closed at this moment but have a delivery in this address.

Proposal of Solution

Show a message informing the user that restaurant is closed, but open at X hours.

Currently, the system check if the restaurant is open, but this verification is bad, because only validate if it is open, case restaurant is open show information and set the restaurant to make orders, but in case of restaurant closed, so don’t send information for system and the show wrong message.

Technical Problem

intl-whitelabel-app

The front-end get this information in this file: src/components/address-modal/index.tsx

And user this function useEffect for get results of delivery:

The const deliveryRestaurantData in line 529 have the data about the restaurant, and this information comes in a delivery query of GraphQl useDeliveryRestaurantLazyQuery:

Use this query of GraphQl:

intl-whitelabel-graphql

On repository of intl-whitelabel-graphql has this query:

File: src/functions/graphql/resolvers/restaurant.ts

In this file, have this function deliveryRestaurant

We need to pass some information for work in studio apollo or postman, this is an example for use in this query, this example work in PLK ES DEV.

{
  "dropoff": {
    "addressLine1": "Vía Hispanidad 12",
    "city": "Zaragoza",
    "state": "AR",
    "streetNumber": "12",
    "route": "Vía Hispanidad",
    "zip": "50009",
    "country": "ESP",
    "latitude": 41.63374590000001,
    "longitude": -0.9082201,
    "phoneNumber": "02398565666"
  },
  "searchRadius": 9656.04,
  "platform": "web",
}

Response of success is a big data, for this response we need to call the query with result valid and between hours work valid.

P.S. this doesn’t return the additional time:

{
  "data": {
    "deliveryRestaurant": {
      "deliverySurchargeFeeCents": 0,
      "nextEarliestOpen": null,
      "quote": "QUOTE_SUCCESSFUL",
      "quoteId": "d9227070-a23e-46e9-9d82-6a3f535e29ec",
      "restaurant": {
        "drinkStationType": null,
        "id": "cbf4d9b3-35cf-402e-9a7b-6ffdbeff1c3c",
        "_id": "cbf4d9b3-35cf-402e-9a7b-6ffdbeff1c3c",
        "storeId": "1111",
        "isAvailable": true,
        "posVendor": "PARTNER",
        "chaseMerchantId": null,
        "curbsideHours": {
          "monOpen": "00:01:00",
          "monClose": "23:59:00",
          "tueOpen": "00:01:00",
          "tueClose": "23:59:00",
          "wedOpen": "00:01:00",
          "wedClose": "23:59:00",
          "thrOpen": "00:01:00",
          "thrClose": "23:59:00",
          "friOpen": "00:01:00",
          "friClose": "23:59:00",
          "satOpen": "00:01:00",
          "satClose": "23:59:00",
          "sunOpen": "00:01:00",
          "sunClose": "23:59:00"
        },
        "deliveryHours": {
          "monOpen": "00:01:00",
          "monClose": "23:59:00",
          "tueOpen": "00:01:00",
          "tueClose": "23:59:00",
          "wedOpen": "00:01:00",
          "wedClose": "23:59:00",
          "thrOpen": "00:01:00",
          "thrClose": "23:59:00",
          "friOpen": "10:01:00",
          "friClose": "23:59:00",
          "satOpen": "00:01:00",
          "satClose": "23:59:00",
          "sunOpen": "00:01:00",
          "sunClose": "23:59:00"
        },
        "diningRoomHours": {
          "monOpen": "00:01:00",
          "monClose": "23:59:00",
          "tueOpen": "00:01:00",
          "tueClose": "23:59:00",
          "wedOpen": "00:01:00",
          "wedClose": "23:59:00",
          "thrOpen": "00:02:00",
          "thrClose": "23:59:00",
          "friOpen": "00:01:00",
          "friClose": "23:59:00",
          "satOpen": "00:01:00",
          "satClose": "23:59:00",
          "sunOpen": "00:01:00",
          "sunClose": "23:59:00"
        },
        "distanceInMiles": null,
        "driveThruHours": {
          "monOpen": "00:01:00",
          "monClose": "23:59:00",
          "tueOpen": "00:01:00",
          "tueClose": "23:59:00",
          "wedOpen": "00:01:00",
          "wedClose": "23:59:00",
          "thrOpen": "00:01:00",
          "thrClose": "23:59:00",
          "friOpen": "00:01:00",
          "friClose": "23:59:00",
          "satOpen": "00:01:00",
          "satClose": "23:59:00",
          "sunOpen": "00:01:00",
          "sunClose": "23:59:00"
        },
        "driveThruLaneType": null,
        "email": null,
        "environment": null,
        "franchiseGroupId": null,
        "franchiseGroupName": "Burger King ES",
        "frontCounterClosed": null,
        "hasBreakfast": null,
        "hasBurgersForBreakfast": null,
        "hasCatering": null,
        "hasCurbside": true,
        "hasDelivery": true,
        "hasDineIn": true,
        "hasDriveThru": true,
        "hasTableService": true,
        "hasLateNightMenu": false,
        "hasMobileOrdering": true,
        "hasParking": null,
        "hasPlayground": null,
        "hasTakeOut": true,
        "hasWifi": null,
        "hasLoyalty": null,
        "isDarkKitchen": null,
        "isFavorite": false,
        "isHalal": null,
        "isRecent": false,
        "latitude": 41.6333797,
        "longitude": -0.9109282,
        "mobileOrderingStatus": "dev",
        "name": "ES Lab Restaurant Partner API",
        "number": "1111",
        "parkingType": null,
        "phoneNumber": "918-319-5008",
        "physicalAddress": {
          "address1": "Vía de la Hispanidad 15",
          "address2": null,
          "city": "Zaragoza",
          "country": "Spain",
          "postalCode": "50009",
          "stateProvince": "Zaragoza",
          "stateProvinceShort": null
        },
        "playgroundType": null,
        "pos": {
          "vendor": "PARTNER"
        },
        "posRestaurantId": null,
        "restaurantImage": null,
        "status": "Open",
        "restaurantPosData": {
          "_id": "e1f87ccb-0293-428f-8080-423e943d4a4c"
        },
        "vatNumber": null
      },
      "storeStatus": "OPEN"
    }
  }
}

But in case the restaurant is closed, the information is every null and the status is NO_DELIVERY, and this is WRONG, because the restaurant has closed and no unavailable, the status should be CLOSED:

{
  "data": {
    "deliveryRestaurant": {
      "deliverySurchargeFeeCents": 0,
      "nextEarliestOpen": null,
      "quote": "QUOTE_UNAVAILABLE",
      "quoteId": null,
      "restaurant": {
        "drinkStationType": null,
        "id": null,
        "_id": null,
        "storeId": null,
        "isAvailable": false,
        "posVendor": null,
        "chaseMerchantId": null,
        "curbsideHours": null,
        "deliveryHours": null,
        "diningRoomHours": null,
        "distanceInMiles": null,
        "driveThruHours": null,
        "driveThruLaneType": null,
        "email": null,
        "environment": null,
        "franchiseGroupId": null,
        "franchiseGroupName": null,
        "frontCounterClosed": null,
        "hasBreakfast": null,
        "hasBurgersForBreakfast": null,
        "hasCatering": null,
        "hasCurbside": null,
        "hasDelivery": null,
        "hasDineIn": null,
        "hasDriveThru": null,
        "hasTableService": null,
        "hasLateNightMenu": null,
        "hasMobileOrdering": null,
        "hasParking": null,
        "hasPlayground": null,
        "hasTakeOut": null,
        "hasWifi": null,
        "hasLoyalty": null,
        "isDarkKitchen": null,
        "isFavorite": false,
        "isHalal": null,
        "isRecent": false,
        "latitude": null,
        "longitude": null,
        "mobileOrderingStatus": "temporary_unavailable",
        "name": null,
        "number": null,
        "parkingType": null,
        "phoneNumber": null,
        "physicalAddress": null,
        "playgroundType": null,
        "pos": null,
        "posRestaurantId": null,
        "restaurantImage": null,
        "status": null,
        "restaurantPosData": null,
        "vatNumber": null
      },
      "storeStatus": "NO_DELIVERY"
    }
  }
}

In this function deliveryRestaurant it checks if the feature flag is active, because we use different way.

The flag is enable-dropoff-only-quote-from-delivery-service and use some information for active:

PLK ES DEV has this flag active, so use the first way:

It uses the function createQuoteWhitelabelDeliveryService of delivery providers:

file: src/functions/graphql/providers/delivery.ts

And in this file use the service.retrieveFirstQuote

This service is from repository intl-delivery-service.

intl-delivery-service

In the file src/modules/quote/quote.service.ts. We have the retrieveFirstQuote function, and in this function it to do some validations and query for get restaurant.

Called getEligibleDeliveryRestaurantData function and in this function get the restaurants validate for use.

After in this function the code have other called, the getWinningQuote:

And this Function call other function getQuotes, and this function return correct errors, inform that restaurant has errors, and the error is “The restaurant is closed”.

But after this the code, ignore this error and give an error forced, in return in case errors in retrieveFirstQuote is:

Because these are the errors ever are same thing, not has a treatment for the other flows.

Other problem that occur is the additional time for delivery, and the back-end does not return this information, just the normal time, so we need to add this as well.

Technical Solution

Here is an illustration that resume what we need to implement to adjust this.

intl-delivery-service

The code solution proposed here isn’t a final solution, is only a idea for the new flow!!!!!

Task 1 - create a feature flag

Task 2 - return nextOpenDate in findEligible function

Before:

After:

Just add nextOpenDate in lines 174 and 175.

Before:

After: this is just an example for works anything restaurant, this is NOT a final solution

Task 3 - Validate if restaurant is closed and fire a throw exception

After this changes, we can validate if a restaurant has closed and create a new throw for closed restaurant QuoteRestaurantClosedError with this we can to go for catch of retrieveFirstQuote function.

Just an example to fire throw: ATTENTION this is an example, is not a final solution, because we need to validate if we have restaurant validated too, in case have one restaurant validate we don’t fire an exception

Task 4 - Change of return in catch for return correct status

The return after this changes:

Task 5 - Validate and update Bump for project

Validate if we need to make something for update, bump this repository in whitelabel-graphql

POC intl-delivery

We made a POC for this in this link: https://github.com/rbilabs/intl-delivery-service/pull/470

PR - We have started development and left the PR in draft, we are awaiting validation Opala, Maciej (Deactivated) to continue.
https://github.com/rbilabs/intl-delivery-service/pull/486

intl-whitelabel-app

Now with back-end returning the status correct and the field nextEarliestOpen we can to do correct logic in the front-end.

Task 1 - Create a feature flag

Task 2 - Add the additional hours in graphQL

We need to create a new fragment for add in Additional hour for use in operating hour fragment - src/queries/rbi/fragments/operating-hours-fragment.graphql

We need to run the command “yarn apollo:generate"

Task 3 - Adjusted front-end for get the status closed restaurant

Task 4 - Create the component for show message of the restaurant closed

Task 5 - Create a validation for enable/disable “Order Pickup” button

POC - intl-whitelabel-app

The POC of this solution:
https://github.com/rbilabs/intl-whitelabel-app/pull/2422

intl-packages

Task 1 - adjust packages for return additional hours

We have a problem for return the additional hours of delivery mode, currently the back-end don’t return this, the repository intl-delivery-service use the intl-packages of restaurant packages, in the file packages/restaurant/src/rbi-restaurant/operating-hours.ts have the formatOperatingHours function, and in this function have just normal hours, so we need to add additional hours in this function.

Before:

After:

Remember to create a new scenario in unit tests.

Task 2 - Validate additional hours

In the file packages/restaurant/src/rbi-restaurant/operating-hours.ts, we need to change the isRestaurantOpen, getNextEarliestOpen and getHoursOfOperationForDay functions, because this function to validate is restaurants is open and day work, but just validate the hours work normal, but now we need to validate the additional hours work too.

Add unit test for this new scenarios too.

Task 3 - Validate and update Bump for project

Validate if we need to make something for update, bump this package in delivery-service.

intl-whitelabel-graphql

In the repository whitelabel-graphql we don’t have the additional hours, so we need to add this information in the queries for GraphQL.

Task 1 - Create the interface for additional hours on GraphQL

In the file src/functions/graphql/schemas/restaurant.gql we need to add a new interface for additional time and add this additional times in the OperatingHours interface.

Example:

After add all new fields, we need to run the command “yarn graphql:types” to generate the types for GraphQL.

How to integrate the environments localy

intl-packages, you need to remove some lines of node_modules/pino/lib/proto.js file:

run:

intl-delivery-service

intl-whitelabel-graphql

intl-whitelabel-app

This is a simple way for connect these environments, maybe you need to do more things.