v1-Funktion zur Vorbestellungen

Sie können bei der Auftragsausführung Nutzer bei der Abholung und bei der Essensbestellungen im Voraus zu liefern. Bevor Sie diese Unterstützung in Auftragsausführung einen Feed mit Dienstleistungsinventar erstellen, in dem die Öffnungszeiten der Nutzer angegeben sind. Vorabbestellungen, wie im Inventarfeed-Schema beschrieben, (AdvanceServiceDeliveryHoursSpecification)

Slots für Vorabbestellungen

Google schlägt Slots für Vorbestellungen im 15-Minuten-Takt mit einer Dauer von bis zu 7 Tagen vor. basierend auf den Ausführungszeiten für ein Restaurant oder eine Dienstleistung (wie in AdvanceServiceDeliveryHoursSpecification)

Um die vorgeschlagenen Slots für Vorbestellungen abzurufen, verwenden Sie die folgenden Werte aus der fulfillmentPreference des FoodCartExtension-Objekts an der Kasse:

  • PickupInfo.pickupTimeIso8601
  • DeliveryInfo.deliveryTimeIso8601

Vorabbestellungen an der Kasse implementieren

In der folgenden Tabelle sind die möglichen Methoden zur Implementierung der Reaktion an der Kasse, wenn Nutzer versuchen, Bestellungen aufzugeben.

Szenario Auftragsausführung
Eine Vorabbestellung kann für den gewünschten Slot ausgeführt werden. Akzeptieren Sie die P0M („so bald wie möglich“) oder FUTURE_SLOT-Warenkorb, indem Sie einen ProposedOrder mit dem im selben Slot aus. Ein Beispiel für eine Checkout-Antwort, die einen Zeitblock akzeptiert, finden Sie unter dieses Code-Snippet.
Vorabbestellung kann für den angeforderten Slot nicht ausgeführt werden. Die Auftragsausführung sollte folgende Voraussetzungen erfüllen: <ph type="x-smartling-placeholder">
    </ph>
  1. Angeforderte P0M oder FUTURE_SLOT ablehnen und den Grund dafür, dass die Bestellung nicht ausgeführt werden kann, FoodErrorExtension-Objekt.
    • Wenn die Bestellung aufgrund der Kapazität nicht ausgeführt werden kann, geben Sie eine FoodOrderError des Fehlertyps NO_CAPACITY.
    • Wenn die Bestellung nicht ausgeführt werden kann, weil das Restaurant geschlossen, geben Sie als Fehlertyp FoodOrderError an CLOSED.
    • Kann die Bestellung aus einem anderen Grund nicht ausgeführt werden, Fehlertyp FoodOrderError angeben UNAVAILABLE_SLOT.
  2. Wenn möglich, geben Sie eine alternative P0M oder FUTURE_SLOT-Werte in correctedProposedOrder. Diese Werte sollten alle gültigen Slots für die Auftragsausführung für die nächsten 7 Tage ab der aktuellen Uhrzeit. P0M-Slot einschließen sofern zutreffend.

Ein Beispiel für eine Checkout-Antwort, in der alternative Slots vorgeschlagen werden, finden Sie unter dieses Code-Snippet.

Alternative Slots für die Auftragsabwicklung

Wenn die von Google vorgeschlagenen Zeitfenster für Vorbestellungen nicht geeignet sind, werden Ihre Die Auftragsausführung kann mithilfe der CheckoutResponseMessage Alternativen vorschlagen -Objekt enthält.

Wenn Sie alternative Zeitfenster für Vorabbestellungen angeben möchten, antworten Sie auf die Zahlungsanforderung mit einem FoodErrorExtension und legen Sie die folgenden Werte fest:

  1. Geben Sie im Parameter foodOrderErrors den Fehlertyp an, z. B. UNAVAILABLE_SLOT, NO_CAPACITY oder CLOSED).
  2. Geben Sie im Parameter correctedProposedOrder die Alternative P0M oder FUTURE_SLOT-Werte über availableFulfillmentOptions.

Die alternativen Slots sollten für die nächsten 7 Tage ab dem Zeitpunkt der Bestellung verfügbar sein -Platzierung und schließen Sie alle Anzeigenflächen ein, in denen der angeforderte Warenkorb des Nutzers erfüllt werden kann.

Angenommen, Mittagsangebote sind nur von Montag bis Freitag erhältlich. von 11:00 bis 13:00 Uhr. Die Nutzenden versuchen dann, Mittagsangebote in den Warenkorb zu legen, der ausgewählte Slot nicht verfügbar ist. In diesem Fall sollte die Auftragsausführung Bewahren Sie die Mittagsangebote im Warenkorb auf und geben Sie nur die Zeitblöcke von 11:00 bis 13:00 Uhr zurück für die nächsten 7 Tage

Lassen Sie das Objekt correctedProposedOrder.Cart.fulfillmentPreference weg. in Ihrer Antwort.

Wenn keine freien Termine verfügbar sind oder das Restaurant oder der Service Vorbestellungen unterstützt, müssen Sie keine correctedProposedOrder

In den folgenden Beispielen sehen Sie die JSON-Nachrichten zwischen Ihrer Auftragsausführung und Google während der Bestell- und Antwortabwicklung bei Vorabbestellungen, wenn der Restaurant oder Service für Vorbestellungen zur Verfügung.

Beispiel: CheckoutRequest mit Lieferslot

Das folgende Snippet zeigt ein Beispiel für eine Direktkauf-Anfrage mit einer Vorabbestellung die für den Auslieferungs-Slot verwendet werden.

{
  "inputs": [
    {
      "intent": "actions.foodordering.intent.CHECKOUT",
      "arguments": [
        {
          "extension": {
            "@type": "type.googleapis.com/google.actions.v2.orders.Cart",
            "merchant": {
              "id": "https://www.exampleprovider.com/merchant/id1",
              "name": "Cucina Venti"
            },
            "lineItems": [
              {
                "name": "Sizzling Prawns Dinner",
                "type": "REGULAR",
                "id": "sample_item_offer_id_1",
                "offerId": "https://www.exampleprovider.com/menu/item/offer/id1",
                "quantity": 1,
                "price": {
                  "type": "ESTIMATE",
                  "amount": {
                    "currencyCode": "USD",
                    "units": "16",
                    "nanos": 750000000
                  }
                },
              }
            ],
            "extension": {
              "@type": "type.googleapis.com/google.actions.v2.orders.FoodCartExtension",
              "fulfillmentPreference": {
                "fulfillmentInfo": {
                  "delivery": {
                    // Deliver at 6:30PM.
                    "deliveryTimeIso8601": "2017-12-14T18:30:00-07:00"
                  }
                }
              },
              "location": {
                ...
              }
            }
          }
        }
      ]
    }
  ]
}

Beispiel: CheckoutResponse, die den Slot akzeptiert

Das folgende Snippet zeigt ein Beispiel für eine Checkout-Antwort, bei der Ihre Auftragsausführung die vorgeschlagenen Slots für Vorabbestellungen akzeptiert.

{
  "expectUserResponse": false,
  "finalResponse": {
    "richResponse": {
      "items": [
        {
          "structuredResponse": {
            "checkoutResponse": {
              "proposedOrder": {
                "id": "sample_proposed_order_id_1",
                "cart": {
                  "merchant": {
                    "id": "https://www.exampleprovider.com/merchant/id1",
                    "name": "Falafel Bite"
                  },
                  "lineItems": [
                    {
                      "name": "Sizzling Prawns Dinner",
                      "type": "REGULAR",
                      "id": "sample_item_offer_id_1",
                      "offerId": "https://www.exampleprovider.com/menu/item/offer/id1",
                      "quantity": 1,
                      "price": {
                        "type": "ESTIMATE",
                        "amount": {
                          "currencyCode": "USD",
                          "units": "16",
                          "nanos": 750000000
                        }
                      },
                    }
                  ],
                  "extension": {
                    "@type": "type.googleapis.com/google.actions.v2.orders.FoodCartExtension",
                    "fulfillmentPreference": {
                      "fulfillmentInfo": {
                        "delivery": {
                          // Same as the time in the request.
                          "deliveryTimeIso8601": "2017-12-14T18:30:00-07:00"
                        }
                      }
                    },
                    "location": {
                      ...
                     }
                   }
                },
                "totalPrice": {
                  "type": "ESTIMATE",
                  "amount": {
                    // Represents $16.75
                    "currencyCode": "USD",
                    "units": "16",
                    "nanos": 750000000
                  }
                },
                "extension": {
                  "@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderExtension",
                  // Send whole proposed order back.
                  "availableFulfillmentOptions": [
                    "fulfillmentInfo": {
                      "delivery": {
                        // Same as the time in the request.
                        "deliveryTimeIso8601": "2017-12-14T18:30:00-07:00"
                      }
                    }
                  ]
                }
              },
              "paymentOptions": {
                ...
              }
            }
          }
        }
      ]
    }
  }
}

Beispiel: CheckoutResponse mit alternativen Slots

Das folgende Snippet zeigt ein Beispiel für eine Checkout-Antwort, bei der Ihre Auftragsausführung schlägt alternative Zeitfenster für Vorbestellungen vor. Das Feld Das correctedProposedOrder.Cart.fulfillmentPreference-Objekt sollte in weggelassen werden. Ihre Antwort.

{
  "expectUserResponse": false,
  "finalResponse": {
    "richResponse": {
      "items": [
        {
          "structuredResponse": {
            "error": {
              "@type": "type.googleapis.com/google.actions.v2.orders.FoodErrorExtension",
              "foodOrderErrors": [
                {
                  "error": "UNAVAILABLE_SLOT", // Cart level error
                  "description": "The restaurant is closed."
                }
              ],
              "correctedProposedOrder": {
                // Send whole original cart back,
                // without the fulfillmentPreference.
                "cart": {
                  ...
                },
                "otherItems": {
                  ...
                },
                "totalPrice": {
                  ...
                },
                "extension": {
                  "@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderExtension",
                  "availableFulfillmentOptions": [
                    "fulfillmentInfo": {
                      "delivery": {
                        "deliveryTimeIso8601": "2017-12-14T19:00:00-07:00"
                      }
                    },
                    "fulfillmentInfo": {
                      "delivery": {
                        "deliveryTimeIso8601": "2017-12-14T19:30:00-07:00"
                      }
                    },
                    "fulfillmentInfo": {
                      "delivery": {
                        "deliveryTimeIso8601": "2017-12-14T20:00:00-07:00"
                      }
                    }
                  ]
                }
              },
              "paymentOptions": {
                ...
              }
            }
          }
        }
      ]
    }
  }
}

Vorabbestellungen beim Aufgeben der Bestellung implementieren

Wenn bei der Einreichung der Bestellung ein Problem mit den Slots für Vorausbestellungen auftritt, SubmitOrderResponseMessage sollte den Grund angeben (z. B. UNAVAILABLE_SLOT oder UNKNOWN) im RejectionInfo-Objekt.

Aktualisieren Sie den Status der Bestellung von CREATED auf CONFIRMED in der Das Objekt OrderState, wenn die Bestellung vom Anbieter angenommen wird. Fügen Sie die Zeitraum in der Bestätigungs-E-Mail an den Nutzer.

Wenn die Bestellung später an das Restaurant gesendet wird, senden Sie Google eine mit der asynchronen Auftragsaktualisierungsaktion aktualisieren.

Im Objekt OrderUpdate der Antwort auf die Aufgabe Ihrer Auftragsausführung oder nachfolgende asynchrone Bestellaktualisierungen enthalten, fügen Sie estimatedFulfillmentTimeIso8601 mit folgendem Wert:

  • Wenn der Bestellstatus CREATED oder CONFIRMED ist, setze den Wert auf den Liefer- oder Abholzeit, die der Nutzer für seine Vorbestellung festgelegt hat.
  • Wenn eine genauere voraussichtliche Lieferdauer vom Restaurant vorliegt oder einen Service anbieten, legen Sie den Wert auf die voraussichtliche Liefer- oder Abholzeit fest.

Beispiel: „SubmitOrderRequest“ mit Lieferslot

Das folgende Snippet zeigt ein Beispiel für eine Bestellanforderung, bei der das die den Nutzer ausgewählt haben.

{
  "inputs": [
    {
      "intent": "actions.intent.TRANSACTION_DECISION",
      "arguments": [
        {
          "transactionDecisionValue": {
            "order": {
              "finalOrder": {
                "cart": {
                  "notes": "Guest prefers their food to be hot when it is delivered.",
                  "merchant": {
                    "id": "https://www.exampleprovider.com/merchant/id1",
                    "name": "Cucina Venti"
                  },
                  "lineItems": [
                    {
                      "name": "Sizzling Prawns Dinner",
                      "type": "REGULAR",
                      "id": "sample_item_offer_id_1",
                      "offerId": "https://www.exampleprovider.com/menu/item/offer/id1",
                      "quantity": 1,
                      "price": {
                        "type": "ESTIMATE",
                        "amount": {
                          "currencyCode": "USD",
                          "units": "16",
                          "nanos": 750000000
                        }
                      }
                    }
                  ],
                  "extension": {
                    "@type": "type.googleapis.com/google.actions.v2.orders.FoodCartExtension",
                    "fulfillmentPreference": {
                      "fulfillmentInfo": {
                        "delivery": {
                          "deliveryTimeIso8601": "2017-12-14T18:30:00-07:00"
                        }
                      }
                    }
                    "contact": {
                      ...
                    }
                  }
                },
                "totalPrice": {
                  "type": "ESTIMATE",
                  "amount": {
                    "currencyCode": "USD",
                    "units": "16",
                    "nanos": 750000000
                  }
                },
                "id": "sample_final_order_id",
                "extension": {
                  // Send whole proposed order back.
                  "availableFulfillmentOptions": [
                    "fulfillmentInfo": {
                      "delivery": {
                        "deliveryTimeIso8601": "2017-12-14T18:30:00-07:00"
                      }
                   ]
                }
              },
              "googleOrderId": "sample_google_order_id",
              "orderDate": "2017-07-17T12:00:00Z",
              "paymentInfo": {
                ...
              }
            }
          }
        }
      ]
    }
  ]
}

Beispiel: „SubmitOrderResponse“ zum Annehmen der Bestellung

Das folgende Snippet zeigt ein Beispiel für eine Antwort auf eine Bestellung, bei der Ihre Die Auftragsausführung bestätigt, dass die Vorbestellung des Nutzers angenommen wurde.

{
  "expectUserResponse": false,
  "finalResponse": {
    "richResponse": {
      "items": [
        {
          "structuredResponse": {
            "orderUpdate": {
              "actionOrderId": "sample_action_order_id",
              "orderState": {
                "state": "CREATED",
                "label": "Order placed"
              },
              "receipt": {
                "userVisibleOrderId": "userVisibleId1234"
              },
              "updateTime": "2017-07-17T12:00:00Z",
              "orderManagementActions": [
                ...
              ],
              "infoExtension": {
                 "@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderUpdateExtension",
                 // Same as the user selected time.
                 "estimatedFulfillmentTimeIso8601": "2017-12-14T18:30:00-07:00"
              }
            }
          }
        }
      ]
    }
  }
}

Beispiel: „SubmitOrderResponse“, mit der die Bestellung abgelehnt wird, weil der Slot nicht verfügbar ist

Das folgende Snippet zeigt ein Beispiel für eine Antwort auf eine Bestellung, bei der Ihre Die Auftragsausführung lehnt die Vorbestellung eines Nutzers aufgrund eines nicht verfügbaren Slots ab.

{
  "expectUserResponse": false,
  "finalResponse": {
    "richResponse": {
      "items": [
        {
          "structuredResponse": {
            "orderUpdate": {
              "actionOrderId": "sample_action_order_id",
              "orderState": {
                "state": "REJECTED",
                "label": "Unavailable slot"
              },
              "rejectionInfo": {
                // Note that this UNAVAILABLE_SLOT is different from the enum
                // with the same name proposed for FoodOrderError.
                "state": "UNAVAILABLE_SLOT",
                "label": "Unavailable slot"
              },
              "updateTime": "2017-07-17T12:00:00Z",
              "orderManagementActions": [
                ...
              ]
            }
          }
        }
      ]
    }
  }
}

Beispiele für Vorabbestellungen

Mit dem Typ AdvanceServiceDeliveryHoursSpecification können Sie die Liefer- oder Abholzeiten, damit Nutzer ihre Bestellung im Voraus planen können.

Hinweis : Es gibt zwei separate Zeitfenster, die Sie angeben müssen. für die Auftragsausführung: das Bestellfenster, das angibt, wann Nutzer ein Produkt platzieren können Bestellung und das Zeitfenster für die Auftragsausführung, das angibt, wann die Bestellung ausgeführt wird. Die Das OpeningHoursSpecification-Objekt definiert, wann der Nutzer die Bestellung aufgeben kann. Die Dauer der untergeordneten Auftragsausführung (ServiceDeliveryHoursSpecification) oder AdvanceServiceDeliveryHoursSpecification) definieren, wann die Reihenfolge erfüllt sind.

Im folgenden Beispiel werden die Öffnungszeiten eines Dienstes für die Annahme von Vorbestellungen mit 15-minütigen Betriebsintervallen.

{
  "hoursAvailable": [
    {
      "@type": "OpeningHoursSpecification",
      "opens": "T00:00:00", // Ordering available 24 hours
      "closes": "T23:59:59",
      "deliveryHours": [
        {
          "@type": "ServiceDeliveryHoursSpecification",
          "opens": "T09:00:00", // ASAP orders b/w 9am and 8:59:59pm
          "closes": "T21:00:00",
          "deliveryLeadTime": {
            "value": "60",
            "unitCode": "MIN"
          }
        },
        {
          "@type": "AdvanceServiceDeliveryHoursSpecification",
          "opens": "T10:00:00",  // Delivery between 10AM and 7:59:59PM
          "closes": "T20:00:00",
          "serviceTimeInterval": "PT15M", // in slots spaced 15 minutes apart (ISO8601)
          "advanceBookingRequirement": {
            "minValue": 60,   // The slot should be at least 60 mins away
            "maxValue": 8640, // but not more than 6 days away
            "unitCode": "MIN"
          }
        }
      ]
    }
  ]
}

Das folgende Beispiel zeigt, wie Sie angeben können, dass der Dienst Bestellungen am selben Tag am 1. Weihnachtstag, jedoch geschlossen an diesem Tag. In diesem Beispiel werden folgende Szenarien unterstützt:

  • Nutzer können am 25. Dezember eine Bestellung aufgeben, die am selben Tag geliefert wird.
  • Nutzer können bis zum 25. Dezember eine Bestellung im Voraus aufgeben und eine Lieferung planen für den 27. Dezember.
  • Nutzer können am 22. Dezember keine Vorbestellung aufgeben, deren Lieferung geplant ist am 25. Dezember.
{
  "specialOpeningHoursSpecification": {
    "@type": "AdvanceServiceDeliveryHoursSpecification",
    "validFrom": "2018-12-25T00:00:00-07:00",
    "validThrough": "2018-12-26T00:00:00-07:00",
    "opens": "T00:00:00", // No advance ordering
    "closes": "T00:00:00"
  }
}

Das folgende Beispiel zeigt, wie Sie angeben können, dass der Dienst für Bestellungen am selben Tag oder Vorbestellungen, die für Weihnachten geplant sind, aber offen für erweiterte Bestellungen, die für einen späteren Tag geplant sind. In diesem Beispiel wird Folgendes unterstützt: Szenarien:

  • Nutzer können bis zum 25. Dezember keine Bestellung mit Lieferung am selben Tag aufgeben.
  • Nutzer können bis zum 25. Dezember eine Bestellung im Voraus aufgeben und eine Lieferung planen für den 27. Dezember.
  • Nutzer können am 22. Dezember keine Vorbestellung aufgeben, deren Lieferung geplant ist am 25. Dezember.
{
  "specialOpeningHoursSpecification": [
    {
      "@type": "ServiceDeliveryHoursSpecification",
      "validFrom": "2018-12-25T00:00:00-07:00",
      "validThrough": "2018-12-26T00:00:00-07:00",
      "opens": "T00:00:00", // No ASAP ordering on Christmas
      "closes": "T00:00:00"
    },
    {
      "@type": "AdvanceServiceDeliveryHoursSpecification",
      "validFrom": "2018-12-25T00:00:00-07:00",
      "validThrough": "2018-12-26T00:00:00-07:00",
      "opens": "T00:00:00", // Orders cannot be scheduled for Christmas
      "closes": "T00:00:00"
    }
  ]
}

Der folgende Beispieldienst nimmt Bestellungen rund um die Uhr an und liefert An Wochentagen von 10:00 bis 14:59:59 Uhr:

...
{
  "@type": "OpeningHoursSpecification",
  "opens": "T00:00:00",
  "closes": "T23:59:59",
  "deliveryHours": {
    "@type": "AdvanceServiceDeliveryHoursSpecification",
    "opens": "T10:00:00", // Delivery starts at 10:00AM
    "closes": "T15:00:00", // Delivery ends at 3:00PM. Delivery from 10AM-2:59:59PM.
    "dayOfWeek": [
      "Monday",
      "Tuesday",
      "Wednesday",
      "Thursday",
      "Friday"
    ],
    "serviceTimeInterval": "PT15M", // in slots spaced 15 minutes apart
    "advanceBookingRequirement": {
      "minValue": 60,   // The slot should be at least 60 mins away
      "maxValue": 8640, // but not more than 6 days away
      "unitCode": "MIN"
    }
  }
}
...

Der folgende Beispieldienst nimmt Bestellungen täglich von 8:00 bis 16:59:59 Uhr an und können Kunden sich entweder für eine Lieferung innerhalb einer Stunde entscheiden oder eine der Slots:

...
{
  "@type": "OpeningHoursSpecification",
  "opens": "T08:00:00",  // Ordering opens at 8:00AM
  "closes": "T17:00:00",  // Ordering closes at 5:00PM, last order at 4:59:59PM
  "deliveryHours": [
    {
      "@type": "ServiceDeliveryHoursSpecification",
      "opens": "T08:00:00",
      "closes": "T17:00:00",
      "deliveryLeadTime": {
        "@type": "QuantitativeValue",
        "value": "60", // If no exact deliveryLeadTime, put a maximum time
        "unitCode": "MIN"
      }
    },
    {
      "@type": "AdvanceServiceDeliveryHoursSpecification",
      "opens": "T08:00:00",
      "closes": "T17:00:00",
      "serviceTimeInterval": "PT15M", // in slots spaced 15 minutes apart
      "advanceBookingRequirement": {
        "minValue": 90,   // The slot should be at least 90 mins away
        "maxValue": 8640, // but not more than 6 days away
        "unitCode": "MIN"
      }
    }
  ]
}
...

Im folgenden Beispiel ist der Laden von 8:00 bis 16:59:59 Uhr am wochentags, an Wochenenden jedoch von 8:00 bis 18:59 Uhr. Bestellungen werden nicht rund um die Uhr angenommen.

...
{
  // On weekdays, ordering open from 8AM-4:59:59PM.
  "@type": "OpeningHoursSpecification",
  "opens": "T08:00:00",
  "closes": "T17:00:00",
  "dayOfWeek": [
    "Monday",
    "Tuesday",
    "Wednesday",
    "Thursday",
    "Friday"
  ],
  "deliveryHours": [
    {
      // Fulfillment between 8AM-4:59:59PM on weekdays.
      "@type": "AdvanceServiceDeliveryHoursSpecification",
      "opens": "T08:00:00",
      "closes": "T17:00:00",
      "dayOfWeek": [
        "Monday",
        "Tuesday",
        "Wednesday",
        "Thursday",
        "Friday"
      ],
      "serviceTimeInterval": "PT15M",
      "advanceBookingRequirement": {
        "minValue": 60,
        "maxValue": 8640,
        "unitCode": "MIN"
      }
    },
    {
      // Fulfillment between 8AM-6:59:59PM on weekends (even for orders placed on a
      // weekday).
      "@type": "AdvanceServiceDeliveryHoursSpecification",
      "opens": "T08:00:00",
      "closes": "T19:00:00",
      "dayOfWeek": [
        "Saturday",
        "Sunday"
      ],
      "serviceTimeInterval": "PT15M",
      "advanceBookingRequirement": {
        "minValue": 60,
        "maxValue": 8640,
        "unitCode": "MIN"
      }
    }
  ]
},
{
  // On weekends, one can place orders upto 6:59:59PM.
  "@type": "OpeningHoursSpecification",
  "opens": "T08:00:00",
  "closes": "T19:00:00",
  "dayOfWeek": [
    "Saturday",
    "Sunday"
  ],
  "deliveryHours": [
    {
      // But fulfillment on weekdays is only till 4:59:59PM.
      "@type": "AdvanceServiceDeliveryHoursSpecification",
      "opens": "T08:00:00",
      "closes": "T17:00:00",
      "dayOfWeek": [
        "Monday",
        "Tuesday",
        "Wednesday",
        "Thursday",
        "Friday"
      ],
      "serviceTimeInterval": "PT15M",
      "advanceBookingRequirement": {
        "minValue": 60,
        "maxValue": 8640,
        "unitCode": "MIN"
      }
    },
    {
      // Fulfillment on weekends is till 6:59:59PM.
      "@type": "AdvanceServiceDeliveryHoursSpecification",
      "opens": "T08:00:00",
      "closes": "T19:00:00",
      "dayOfWeek": [
        "Saturday",
        "Sunday"
      ],
      "serviceTimeInterval": "PT15M",
      "advanceBookingRequirement": {
        "minValue": 60,
        "maxValue": 8640,
        "unitCode": "MIN"
      }
    }
  ]
}
...