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.
Variables with informations
{
"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:
Response with restaurant available
{
"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:
Response with restaurant unavailable
{
"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.

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.
Technical Solution
intl-delivery-service
In the file src/modules/restaurant/restaurant.service.ts have a function called findEligible
and in these functions have another function deriveEligibility
and in this function return errors of restaurant and return the next time that the restaurant open again, but now don’t use this, so we need to add this information.
Before:

After:

Just add nextOpenDate
in lines 174 and 175.
And the returned this function need to change too, because need pass the parameter nextOpenDate
and adjusted of logic to return the data in case of eligible
equals the false, in this validation we can validate if not have none eligible, so we use ineligible.
Before:

After:

In the file src/modules/quote/quote.service.ts in retrieveFirstQuote
function, we can get these informations in the getEligibleDeliveryRestaurantData
function, because now return the errors and the nextOpenDate.
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:

And in this catch we can get the error of restaurant closed and manipulate this error, and change for return the status correct and the nextOpenDate.
The return after this changes:

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