תכונה 'הזמנה מראש' מגרסה 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.

המועדים החלופיים צריכים להיות ל-7 הימים הבאים ממועד ההזמנה מיקום מודעה בדף, ולכלול את כל מיקומי המודעות שבהם אפשר להוסיף את העגלה לבקשת המשתמש. על השגת המטרות.

לדוגמה, נניח שמבצעי ארוחת צהריים זמינים רק בימים שני עד שישי מ-11:00 עד 13:00. לאחר מכן המשתמש מנסה להוסיף לעגלת הקניות מבצעים לארוחת צהריים, אבל המשבצת שבחרו לא זמינה. במקרה כזה, מילוי ההזמנה לשמור את המנות המיוחדות לארוחת צהריים בעגלת הקניות, ולהחזיר רק את המשבצות של 11:00 עד 13:00 למשך 7 הימים הבאים

צריך להשמיט את האובייקט 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": {
                ...
              }
            }
          }
        }
      ]
    }
  }
}

דוגמה: תגובת תשלום עם מיקומי מודעות חלופיים

בקטע הקוד הבא מוצגת דוגמה לתגובת קופה שבה בוצע מילוי ההזמנה מציע משבצות חלופיות להזמנה מראש. שימו לב יש להשמיט אובייקט 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, מגדירים את הערך כ- את שעת המשלוח או את מועד האיסוף שהמשתמש תזמן להזמנה מראש.
  • כשיש זמן אספקה משוער מדויק יותר מהמסעדה או שירות, מגדירים את הערך כזמן האספקה המשוער של זמן האספקה או האיסוף.

דוגמה: SubmitOrderRequest עם משבצת משלוח

בקטע הקוד הבא מוצגת דוגמה לבקשת הזמנה שליחה, שבה מצוין משבצת הזמנה מראש שהמשתמש בחר.

{
  "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 דוחה את ההזמנה עקב חוסר זמינות של יחידת קיבולת (Slot)

קטע הקוד הבא מציג דוגמה לתגובת שליחה של הזמנה, שבה מילוי ההזמנה דוחה את ההזמנה מראש של המשתמש בגלל שמשבצת הזמן לא זמינה.

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

בדוגמה הבאה של שירות מקבלים הזמנות מסביב לשעון ומשלוחים מ- 10:00 עד 14: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:00 עד 16: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:00-16:59:59 בימי חול, אבל בין 08:00 ל-18: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"
      }
    }
  ]
}
...