الإصدار 1 من ميزة الطلب المسبق

يمكنك إضافة ميزة تتيح للمستخدمين تحديد موعد لاستلام طلبات الطعام ونقلها مسبقًا. قبل تنفيذ هذه الميزة في عملية التسليم، أنشئ خلاصة مستودع خدمات تحدّد ساعات إتاحة طلبات مسبقة للمستخدمين، كما هو موضّح في مخطّط خلاصة المستودع (AdvanceServiceDeliveryHoursSpecification).

خانات الطلبات المُسبَقة

تقترح Google خانات طلبات مسبقة بفواصل زمنية تبلغ 15 دقيقة، وذلك لمدة تصل إلى 7 أيام مسبَقًا، استنادًا إلى أوقات تسليم الطعام في المطعم أو الخدمة (على النحو المحدّد في AdvanceServiceDeliveryHoursSpecification).

لاسترداد الفترات المقترَحة للطلب مسبقًا، استخدِم القيم التالية من حقل fulfillmentPreference لعنصر FoodCartExtension عند الدفع:

  • PickupInfo.pickupTimeIso8601
  • DeliveryInfo.deliveryTimeIso8601

تنفيذ الطلبات المسبقة عند الدفع

يسرد الجدول التالي الطرق المحتملة التي يمكنك من خلالها تنفيذ استجابة فريق المعالجة في وقت الدفع عندما يحاول المستخدمون تقديم الطلبات.

السيناريو سلوك توصيل الطلبات
يمكن تنفيذ الطلب المُسبَق في الوقت المحدَّد. قبول P0M ("في أقرب وقت ممكن") أو FUTURE_SLOT سلة التسوق من خلال إنشاء ProposedOrder باستخدام المساحة نفسها للحصول على مثال على استجابة الدفع التي تقبل خانة، اطّلِع على هذا مقتطف الرمز.
لا يمكن تنفيذ الطلب المُسبَق في الوقت المطلوب. يجب أن تؤدي عملية التسليم ما يلي:
  1. ارفض سلة التسوّق المطلوبة من النوع P0M أو FUTURE_SLOT ، وأدخِل سبب تعذّر تنفيذ الطلب في العنصر FoodErrorExtension.
    • إذا تعذّر تنفيذ الطلب بسبب السعة، حدِّد FoodOrderError من نوع الخطأ NO_CAPACITY.
    • إذا تعذّر تنفيذ الطلب لأنّ المطعم مغلق، حدِّد FoodOrderError لنوع الخطأ CLOSED.
    • إذا تعذّر تنفيذ الطلب لسبب آخر، حدِّد FoodOrderError لنوع الخطأ UNAVAILABLE_SLOT.
  2. إذا أمكن، قدِّم قيمًا بديلة لسمة P0M أو FUTURE_SLOT في correctedProposedOrder. يجب أن تكون هذه القيم هي جميع الفترات الصالحة للتسليم خلال الـ 7 أيام القادمة اعتبارًا من الوقت الحالي. أدرِج خانة P0M كلما أمكن.

للحصول على مثال على استجابة الدفع التي تقترح خانات بديلة، يُرجى الاطّلاع على هذا مقتطف الرمز.

خانات بديلة لتسليم الطلبات

عند الدفع، إذا كانت الفترات المقترَحة من Google لطلب الطعام مسبقًا غير مناسبة، يمكن لقسم التنفيذ اقتراح بدائل باستخدام العنصر CheckoutResponseMessage.

لتحديد خانات بديلة لطلب الشراء المُسبَق، يجب الردّ على طلب الدفع باستخدام الرمز FoodErrorExtension وضبط القيم التالية:

  1. في المَعلمة foodOrderErrors، حدِّد نوع الخطأ (مثل UNAVAILABLE_SLOT أو NO_CAPACITY أو CLOSED).
  2. في المَعلمة correctedProposedOrder، قدِّم قيم P0M أو FUTURE_SLOT بديلة من خلال availableFulfillmentOptions.

يجب أن تكون الفتحات البديلة خلال الأيام السبعة المقبلة من وقت وضع الطلبات، وأن تتضمّن جميع الفتحات التي يمكن فيها تلبية سلة التسوّق المطلوبة من المستخدِم.

على سبيل المثال، لنفترض أنّ وجبات الغداء الخاصة متاحة من الاثنين إلى الجمعة فقط، من الساعة 11 صباحًا إلى الساعة 1 بعد الظهر. يحاول المستخدم بعد ذلك إضافة وجبات غداء خاصة إلى سلة التسوّق، ولكن لم تكن الفترة المحدّدة متاحة. في هذه الحالة، من المفترض أن يحتفظ فريق التنفيذ بعروض الغداء في سلة التسوّق، وأن يعرض الفترات الزمنية من الساعة 11 صباحًا إلى الساعة 1 بعد الظهر فقط خلال الأيام السبعة المقبلة.

يجب حذف العنصر correctedProposedOrder.Cart.fulfillmentPreference في ردّك.

إذا لم تكن هناك خانات متاحة أو إذا كان المطعم أو الخدمة لا يقبلان الطلبات المُسبَقة، لن تحتاج إلى تقديم correctedProposedOrder.

اطّلِع على الأمثلة أدناه على رسائل JSON بين فريق التنفيذ وGoogle أثناء عملية طلب الدفع والاستجابة لطلب مسبق، عندما يكون المطعم أو الخدمة متاحَين لتلقّي الطلبات المسبقة.

مثال: CheckoutRequest مع خانة تسليم

يعرض المقتطف أدناه مثالاً على طلب دفع يتضمّن خانة تسليم لخدمة الشراء المُسبَق.

{
  "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": {
                ...
              }
            }
          }
        }
      ]
    }
  ]
}

مثال: CheckoutResponse يقبل الوقت المتاح

يعرض المقتطف أدناه مثالاً على استجابة الدفع التي يقبل فيها فريق المعالجة المواعيد المقترَحة للطلب المُسبَق.

{
  "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": {
                ...
              }
            }
          }
        }
      ]
    }
  }
}

مثال: CheckoutResponse مع خانات بديلة

يعرض المقتطف أدناه مثالاً على ردّ على عملية الدفع يقترح فيه فريق المعالجة خيارات بديلة لطلب مسبق. يُرجى العلم أنّه يجب حذف العنصر correctedProposedOrder.Cart.fulfillmentPreference في ردّك.

{
  "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": {
                ...
              }
            }
          }
        }
      ]
    }
  }
}

تنفيذ الطلبات المسبقة عند إرسال الطلب

عند إرسال الطلب، إذا كانت هناك مشكلة في خانات الطلبات المُسبَقة، يجب أن يتضمّن SubmitOrderResponseMessage السبب (مثل UNAVAILABLE_SLOT أو UNKNOWN) في عنصر RejectionInfo.

عدِّل حالة الطلب من CREATED إلى CONFIRMED في عنصر OrderState عندما يقبل مقدّم الخدمة الطلب. أدرِج الخانة الزمنية المحدّدة في رسالة التأكيد الإلكترونية المُرسَلة إلى المستخدم.

إذا أرسل فريقك المسؤول عن توصيل الطلبات الطلب إلى المطعم لاحقًا، أرسِل إلى Google تعديلًا باستخدام إجراء تعديل الطلب غير المتزامن.

في عنصر OrderUpdate لردّ إرسال الطلب من فريق الإنجاز أو تعديلات الطلبات غير المتزامنة اللاحقة، أدرِج estimatedFulfillmentTimeIso8601 مع ضبط القيمة على النحو التالي:

  • عندما تكون حالة الطلب CREATED أو CONFIRMED، اضبط القيمة على وقت التسليم أو الاستلام الذي حدّده المستخدم لطلبه المُسبَق.
  • عندما يتوفّر وقت مقدَّر أكثر دقة للتسليم من المطعم أو الخدمة، اضبط القيمة على الوقت المقدَّر للتسليم أو وقت الاستلام.

مثال: طلب إرسال الطلب مع خانة التسليم

يعرض المقتطف أدناه مثالاً على طلب إرسال طلب يشير إلى موعد الطلب المُسبَق الذي اختاره المستخدم.

{
  "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": {
                ...
              }
            }
          }
        }
      ]
    }
  ]
}

مثال: قبول الطلب في SubmitOrderResponse

يعرض المقتطف أدناه مثالاً على استجابة لإرسال طلب يؤكد فيه فريق المعالجة قبوله لطلب المستخدم المدفوع مسبقًا.

{
  "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"
              }
            }
          }
        }
      ]
    }
  }
}

مثال: رفض SubmitOrderResponse للطلب بسبب عدم توفّر خانة

يعرض المقتطف أدناه مثالاً على ردّ على طلب إرسال يرفض فيه فريق التنفيذ طلبًا مُسبَقًا من أحد المستخدمين بسبب عدم توفّر خانة.

{
  "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": [
                ...
              ]
            }
          }
        }
      ]
    }
  }
}

أمثلة على الطلبات المُسبقة

يمكن استخدام النوع AdvanceServiceDeliveryHoursSpecification لتحديد ساعات التسليم أو الاستلام كي يتمكّن المستخدمون من تحديد موعد طلبهم مسبقًا.

ملاحظة: هناك نافذتان زمنيتان منفصلتان يجب تحديدهما لإتمام الخدمة: نافذة الطلب التي تحدّد الوقت الذي يمكن للمستخدمين فيه تقديم طلب، ونافذة التسليم التي تحدّد وقت تسليم الطلب. يحدِّد عنصر OpeningHoursSpecification الحالات التي يمكن فيها للمستخدم تقديم الطلب. وتحدِّد أوقات توصيل السلع الفرعية (ServiceDeliveryHoursSpecification أو AdvanceServiceDeliveryHoursSpecification) وقت تنفيذ الطلب.

يحدِّد المثال التالي ساعات العمل لقبول الطلبات المُسبَقة، مع فواصل خدمة تبلغ 15 دقيقة.

{
  "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"
          }
        }
      ]
    }
  ]
}

يوضّح المثال التالي كيفية تحديد أنّ الخدمة مفتوحة لتلقّي سفارشات التسليم في اليوم نفسه في يوم عيد الميلاد، ولكنّها مغلقة لتلقّي الطلبات المُسبَقة المُجدوَلة في ذلك اليوم. يتيح هذا المثال السيناريوهات التالية:

  • يمكن للمستخدمين تقديم طلب في 25 كانون الأول (ديسمبر) للتوصيل في اليوم نفسه.
  • يمكن للمستخدمين تقديم طلب مُسبَق في 25 كانون الأول (ديسمبر) لتسليمه في 27 كانون الأول (ديسمبر).
  • لا يمكن للمستخدمين تقديم طلب مسبق في 22 كانون الأول (ديسمبر) لتسليمه في 25 كانون الأول (ديسمبر).
{
  "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"
  }
}

يوضّح المثال التالي كيفية تحديد أنّ الخدمة مغلقة لطلبات العميل في اليوم نفسه أو الطلبات المُسبَقة المُجدوَلة ليوم عيد الميلاد، ولكن تكون مفتوحة لطلبات العميل المُسبَقة المُجدوَلة ليوم لاحق. يتيح هذا المثال السيناريوهات التالية:

  • لا يمكن للمستخدمين تقديم طلب في 25 كانون الأول (ديسمبر) للتوصيل في اليوم نفسه.
  • يمكن للمستخدمين تقديم طلب مُسبَق في 25 كانون الأول (ديسمبر) لتسليمه في 27 كانون الأول (ديسمبر).
  • لا يمكن للمستخدمين تقديم طلب مُسبَق في 22 كانون الأول (ديسمبر) لتسليمه في 25 كانون الأول (ديسمبر).
{
  "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"
    }
  ]
}

يقبل نموذج الخدمة التالي الطلبات على مدار 24 ساعة طوال أيام الأسبوع، ويتم تسليم الطلبات من الساعة 10 صباحًا حتى الساعة 2:59:59 مساءً في أيام الأسبوع:

...
{
  "@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"
    }
  }
}
...

تقبل الخدمة التالية الطلبات يوميًا من الساعة 8 صباحًا حتى الساعة 4:59:59 مساءً، ويمكن للعملاء اختيار التسليم خلال ساعة أو اختيار أحد المواعيد التالية:

...
{
  "@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"
      }
    }
  ]
}
...

يعرض العيّنة التالية حالة يفتح فيها المتجر أبوابه من الساعة 8 صباحًا إلى الساعة 4:59:59 مساءً في أيام الأسبوع، ولكن من الساعة 8 صباحًا إلى الساعة 6:59 مساءً في عطلات نهاية الأسبوع. لا يتم قبول الطلبات على مدار الساعة طوال أيام الأسبوع.

...
{
  // 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"
      }
    }
  ]
}
...