Feed penjual

Definisi MerchantFeed

message MerchantFeed {
  FeedMetadata metadata = 1;
  repeated Merchant merchant = 2;
}

Definisi Merchant

// Info about a merchant that is on the aggregator's platform.
// A merchant feed should be a list of this message.
message Merchant {
  // An opaque string generated by the partner that identifies a merchant.
  // Must be unique across all merchants.
  // Strongly recommended to only include URL-safe characters. (required)
  string merchant_id = 1;
  // The name, telephone, url and geo are used to support matching partner
  // inventory with merchants already present on Google Maps. This information
  // will not be displayed.
  //
  // The name of the merchant. (required)
  string name = 2;
  // The contact telephone number of the merchant including its country and area
  // codes, e.g. +14567891234. Highly recommended. (optional)
  string telephone = 3;
  // The url of the merchant's public website. Highly recommended. (optional)
  string url = 4;
  // The Geo info of the merchant, including latitude, longitude, and address.
  // (required)
  GeoCoordinates geo = 5;
  // The category of the business in aggregator's platform. (required)
  // You should categorize this business as you categorize it in your inventory.
  // We will use your provided category as a parameter in trying to determine
  // the best location match to the physical business.
  string category = 6;

  // This field is deprecated, please use tax_rate instead.
  uint32 tax_rate_basis_points = 8 [deprecated = true];

  // The merchant's tax rate. If present this field overrides the deprecated
  // tax_rate_basis_points field. An empty message (i.e. tax_rate { }) will
  // reset the applied tax rate to zero.
  //
  // This field is required for payments integration. (optional)
  TaxRate tax_rate = 9;

  // Restrictions to the payment methods this merchant accepts. We assume no
  // restrictions exist if this field is not set. (optional)
  PaymentRestrictions payment_restrictions = 10;

  // Payment options available for this merchant. Services under this merchant
  // will be able to individually limit the payment options they allow.
  // (optional)
  repeated PaymentOption payment_option = 11;


  // Configuration for a tokenized payment processor, if the merchant has
  // support for it.
  TokenizationConfig tokenization_config = 15;

  // The specific merchant's Terms and Conditions displayed to the user when a
  // service is being booked through Reserve with Google.
  // In addition to these the aggregator partner's Terms and Conditions are
  // always displayed to the user and must not be provided here. (optional)
  Terms terms = 13;

  // An opaque string that identifies the consumer-facing brand to use when
  // displaying partner attribution. This field allows partners with multiple
  // consumer-facing brands to provide merchants for all brands within the same
  // feed.
  //
  // A brand consists of consumer-facing properties like the name, logo, Terms
  // of Service, and Privacy Policy.
  //
  // If there is only one consumer-facing partner brand, this field does not
  // need to be set and can be ignored.
  //
  // If the partner...
  //
  //   Does not have multiple consumer-facing brands?
  //     --> Ignore this field
  //
  //   Has Multiple Brands that are configured?
  //
  //       If this field is set
  //         --> Associated consumer-facing brand attribution is used
  //
  //       If this field is unset or the empty string
  //         --> Default consumer-facing brand attribution is used
  //
  // Careful Note: most partners do not need to set this field. If a partner
  // wishes to use this field, they must contact us first to configure separate
  // brands, including the default brand.
  string brand_id = 14;

  // Hints to help Google match a merchant to a place on Google Maps.
  // Note: Typically, this field does not need to be set, as Google will match
  // merchants to places on Google Maps using the information provided above.
  // (optional)
  MerchantMatchingHints matching_hints = 16;

  // Definitions for any service attributes used to describe the Services for
  // this Merchant. (optional)
  repeated ServiceAttribute service_attribute = 17;


  // An action URL with associated language, list of countries restricted to,
  // type, and optional platform that indicates which platform this action
  // should be performed on. This action link is specifically for the merchant,
  // please use the ActionLink in the service feed to link to a specific
  // service.
  repeated ActionLink action_link = 20;


  // General advisements from a specific merchant for a user joining a waitlist
  // through Reserve with Google. Individual text fields in the advisement
  // should be limited to 100 bytes in length.
  Advisement waitlist_advisement = 22;

  // Economic Operator information associated to this specific merchant needed
  // for regulatory compliance.
  // (optional)
  EconomicOperator economic_operator = 23;
}

Definisi GeoCoordinates

// The Geo data of a location, including latitude, longitude, and address.
// At least one of [lat/lng or address] should be provided (or both).
message GeoCoordinates {
  double latitude = 1;   // In degrees. (optional)
  double longitude = 2;  // In degrees. (optional)

  // Address for a location, could either be structured or unstructured.
  oneof addresses {
    // Postal address of the location, preferred.
    PostalAddress address = 3;
    // An unstructured address could also be provided as a fallback.
    // E.g. "1600 amphitheatre parkway mountain view, ca 94043"
    string unstructured_address = 4;
  }
}

Definisi PostalAddress

// The postal address for a merchant.
message PostalAddress {
  // The country, using ISO 3166-1 alpha-2 country code, e.g. "US" (required)
  string country = 1;
  // The locality/city, e.g. "Mountain View". (required)
  string locality = 2;
  // The region/state/province, e.g. "CA". This field is only required in
  // countries where region is commonly a part of the address. (optional)
  string region = 3;
  // The postal code, e.g. "94043". (required)
  string postal_code = 4;
  // The street address, e.g. "1600 Amphitheatre Pkwy". (required)
  string street_address = 5;
}

Definisi TaxRate

// A tax rate applied when charging the user for a service, and which can be set
// on either a per merchant, or per service basis.
message TaxRate {
  // A tax rate in millionths of one percent, effectively giving 6 decimals of
  // precision. For example, if the tax rate is 7.253%, this field should be set
  // to 7253000.
  //
  // If this field is left unset or set to 0, the total price charged to a user
  // for any service provided by this merchant is the exact price specified by
  // Service.price. The service price is assumed to be exempt from or already
  // inclusive of applicable taxes. Taxes will not be shown to the user as a
  // separate line item.
  //
  // If this field is set to any nonzero value, the total price charged to a
  // user for any service provided by this merchant will include the service
  // price plus the tax assessed using the tax rate provided here. Fractions of
  // the smallest currency unit (for example, fractions of one cent) will be
  // rounded using nearest even rounding. Taxes will be shown to the user as a
  // separate line item. (required)
  int32 micro_percent = 1;
}

Definisi PaymentRestrictions

// Restrictions to the payment methods this merchant accepts.
message PaymentRestrictions {
  // Restrictions to the credit cards this merchant accepts. We assume all
  // credit cards are accepted if this field is not set.
  // Note that the list of cards supported by CreditCardType will grow over
  // time, meaning that leaving this empty subjects a configuration to future
  // changes. (optional)
  CreditCardRestrictions credit_card_restrictions = 1;
}

Definisi CreditCardRestrictions

// Restrictions to the credit card types this merchant accepts.
message CreditCardRestrictions {
  // A credit card type.
  enum CreditCardType {
    // Unused.
    CREDIT_CARD_TYPE_UNSPECIFIED = 0;

    // A Visa credit card.
    VISA = 1;

    // A Mastercard credit card.
    MASTERCARD = 2;

    // An American Express credit card.
    AMERICAN_EXPRESS = 3;

    // A Discover credit card.
    DISCOVER = 4;

    // A JCB credit card.
    JCB = 5;
  }
  // A list of supported credit cards. No credit cards are supported if empty.
  // (optional)
  repeated CreditCardType credit_card_type = 1;
}

Definisi PaymentOption

// A payment option, which can be used to pay for services provided by a
// merchant. Payment options can be shared among multiple merchants
// (e.g. merchants belonging to the same chain).
message PaymentOption {
  // An opaque string from an aggregator partner to identify a payment option.
  //
  // This id is global to the whole aggregator, and re-using a value across
  // multiple merchants will allow a user to pay with the corresponding payment
  // option across those merchants.
  //
  // When re-using an id across multiple merchants, updating any value for a
  // payment option under one merchant will also update any other payment option
  // with the same id, under a different merchant. As such, it's a best practice
  // to have all payment options sharing the same id, always be updated to
  // identical values, to avoid any possibility of nondeterministic behavior.
  //
  // Do NOT confuse it with the internal payment option id. (required)
  string payment_option_id = 1;
  // The name of the payment option. This can be user visible. (required)
  string name = 2;
  // A description of the payment option. This can be user visible. (optional)
  string description = 3;
  // The price of the payment option. (required)
  Price price = 4;
  // The tax rate for this payment option. If present this field overrides the
  // tax_rate field present in the Merchant or Service. An empty message
  // (i.e. tax_rate { }) will reset the applied tax rate to zero. (optional)
  TaxRate tax_rate = 5;

  // A payment option type.
  enum PaymentOptionType {
    // Unused.
    PAYMENT_OPTION_TYPE_UNSPECIFIED = 0;
    // Payment option can only be used once.
    PAYMENT_OPTION_SINGLE_USE = 1;
    // Payment option can be used if its session count > 0.
    PAYMENT_OPTION_MULTI_USE = 2;
    // Payment option can be used within its valid time range - session count
    // is inapplicable.
    PAYMENT_OPTION_UNLIMITED = 3;
  }
  // The type of this payment option. Single-use for drop-ins, multi-use for
  // packs, and unlimited for memberships. (required)
  PaymentOptionType payment_option_type = 6;
  // How many sessions this payment option can be used for. Valid only for
  // multi-session / packs, where the value should be > 1.
  // (required if payment_option_type is PAYMENT_OPTION_MULTI_USE)
  int64 session_count = 7;
  // The payment option can be purchased within this interval. (optional)
  TimeRange purchase_interval = 8;
  // The payment option can be used within this interval (e.g. special price
  // for January 2017).
  // If present, this overrides valid_duration_sec and activation_type.
  // (optional)
  TimeRange valid_interval = 9;
  // Duration of the payment option validity (e.g. 30 day membership).
  // (optional)
  int64 valid_duration_sec = 10;

  // Defines how the validity start date is determined.
  enum ActivationType {
    // Unused.
    ACTIVATION_TYPE_UNSPECIFIED = 0;
    // Validity starts at the time of purchase.
    ACTIVATION_ON_PURCHASE = 1;
    // Validity starts when the payment option is used for the first time.
    ACTIVATION_ON_FIRST_USE = 2;
  }
  // Defines how the validity start date is determined for this payment option.
  // (required)
  ActivationType activation_type = 11;

  // Restricts the users eligible to purchase this payment option. Can be used
  // to restrict a promotional payment option to a subset of users. If not set,
  // all users are eligible. (optional)
  UserPurchaseRestriction user_restriction = 12;
}

Definisi UserPurchaseRestriction

message UserPurchaseRestriction {
  // A payment option that can only be purchased by users who have never
  // purchased from the same merchant before. (required if new_to_payment_option
  // is not set)
  bool new_to_merchant = 1;

  // A payment option that can only be purchased by users who have never
  // purchased the same payment option before. (required if new_to_payment is
  // not set)
  bool new_to_payment_option = 2;
}

Definisi TimeRange

// A closed-open time range, i.e. [begin_sec, end_sec)
message TimeRange {
  // Seconds of UTC time since Unix epoch (required)
  int64 begin_sec = 1;
  // Seconds of UTC time since Unix epoch (required)
  int64 end_sec = 2;
}

Definisi TokenizationConfig

// A configuration for payment-processor tokenization, set up on a per-Merchant
// basis.
message TokenizationConfig {
  // A tokenization configuration will typically have one
  // tokenization_parameter whose key is "gateway" and whose value is the
  // name of the processor.
  //
  // The rest of the parameters are dependent on the processor.  See
  // documentation from Google Pay and your processor for further information.
  // https://developers.google.com/pay/api/web/object-reference# \
  //   PaymentMethodTokenizationSpecification
  // https://developers.google.com/pay/api/#participating-google-pay-processors
  //
  // Braintree example:
  // tokenization_parameter { key: "gateway" value: "braintree" }
  // tokenization_parameter { key: "braintree:apiVersion" value: "v1" }
  // tokenization_parameter { key: "braintree:sdkVersion" value: "2.30.0" }
  // tokenization_parameter { key: "braintree:merchantId" value: "abcdef" }
  // tokenization_parameter { key: "braintree:clientKey"
  //                          value: "production_xxx_yyy" }
  //
  // Stripe example:
  // tokenization_parameter { key: "gateway" value: "stripe" }
  // tokenization_parameter { key: "stripe:version" value: "2018-02-28" }
  // tokenization_parameter { key: "stripe:publishableKey" value: "pk_1234" }
  //
  // Adyen example:
  // tokenization_parameter { key: "gateway" value: "adyen" }
  // tokenization_parameter { key: "gatewayMerchantId" value: "yourId" }
  map<string, string> tokenization_parameter = 1;

  // The following field controls how much billing information to include in the
  // payment token. Verification of billing information is the responsibility of
  // Google Pay upon entry of Form Of Payment (FOP). If the FOP is currently in
  // Google Pay without the requested level of billing information, the user
  // will not see their FOP as a choice, and they will have to enter the FOP and
  // required information according to the current Google Pay UI.
  //
  // Some merchants like to keep the requested information minimal because
  // requesting more information can lead to lower conversion rates.
  //
  // Note that they can also go to payments.google.com to enhance an FOP but
  // most users will not know to do so.

  // How much of the Billing Address to require of the user and include in the
  // token. The enum values correspond to parameters in the Google Pay API (see
  // https://developers.google.com/pay/api/web/reference/object\
  //  #BillingAddressParameters).
  enum BillingInformationFormat {
    BILLING_INFORMATION_FORMAT_UNSPECIFIED = 0;
    // name, country code, and postal code (GPay default setting).
    MIN = 1;
    // name, street address, locality, region, country code, and postal code
    FULL = 2;
  }

  // Include in the payment token the user's billing information as entered into
  // Google Pay with their FOP (see above).
  BillingInformationFormat billing_information_format = 2;

  // Name of the Merchant Of Record (MOR).  This user-visible name will be shown
  // in 3DS2 challenges.  In some cases, this is the Merchant, in others this is
  // the Aggregator.
  string merchant_of_record_name = 3;

  // Country where transaction will be processed, in ISO 3166-1 alpha-2 form.
  string payment_country_code = 4;

  // Per CardNetwork Processing information.
  message CardNetworkParameters {
    // The Card Network that these parameters are about
    CreditCardRestrictions.CreditCardType card_network = 1;
    // The Bank Identification Number of the acquiring bank used for processing
    // of the card.
    //
    // If this value is not known to you, you should ask your acquirer or
    // merchant processor representative.
    string acquirer_bin = 2;
    // The merchant identifier assigned by the acquirer to the merchant for use
    // in transaction authorization (for Visa and American Express
    // transactions).
    //
    // If this value is not known to you, you should ask the acquirer or
    // merchant processor representative.
    string acquirer_merchant_id = 3;
  }

  // Per-Card Network processing parameters.
  //
  // These are currently only required for PSD2
  // (https://en.wikipedia.org/wiki/Payment_Services_Directive)
  // processing when payment_country_code is a European country where PSD2 is in
  // effect.  They are also only currently required for VISA and
  // AMERICAN_EXPRESS.
  repeated CardNetworkParameters card_network_parameters = 5;

  // Fields supported to authorize a card transaction.
  //
  // See the GPay documentation at
  // https://developers.google.com/pay/api/web/reference/object#CardParameters
  enum AuthMethod {
    AUTH_METHOD_UNSPECIFIED = 0;
    // This authentication method is associated with payment cards stored on
    // file with the user's Google Account. Returned payment data includes
    // personal account number (PAN) with the expiration month and the
    // expiration year.
    PAN_ONLY = 1;
    // This authentication method is associated with cards stored as Android
    // device tokens. Returned payment data includes a 3-D Secure (3DS)
    // cryptogram generated on the device.
    CRYPTOGRAM_3DS = 2;
  }

  // Defines types of cardholder data that are accepted by the gateway.
  // If not specified, no restrictions are applied.
  //
  // Note that partners who use commercial gateways should leave this
  // empty unless their gateway provider has specified otherwise.  Restricting
  // allowed_auth_methods is most useful in the scenario that a partner
  // integrates with GPay as a gateway themselves.
  repeated AuthMethod allowed_auth_methods = 6;
}

Definisi Terms

// A set of rules and guidelines that are displayed to the
// user in order to make a booking through Reserve with Google.
message Terms {
  // The URL to the Terms and Conditions. (optional)
  string url = 1;

  // The text to be displayed to the user.
  // Use localized_text below for new integrations.
  string text = 2;

  // The localized text to be displayed to the user. (required)
  Text localized_text = 3;
}

Definisi Text

// A possibly-localized text payload. Some Text fields may contain marked-up
// content.
message Text {
  // Required. Text value in an unknown locale, which will be displayed if
  // `localized_value` for the user locale is empty or missing. The locale for
  // this value may depend on the partner or service provider, and it should not
  // be assumed to be any specific language.
  string value = 1;

  // Per-locale text values. Required.
  repeated LocalizedString localized_value = 2;
}

Definisi LocalizedString

// Instance of a string in one locale.
message LocalizedString {
  // IETF BCP 47 language code, such as "en", "mas", "zh-Hant", "de-CH-1901".
  // See http://www.w3.org/International/articles/language-tags/.
  string locale = 1;

  // Message in the locale above (UTF-8).
  string value = 2;
}

Definisi Saran

// Advisements that are displayed to the user when booking through Reserve with
// Google.
message Advisement {
  // Custom message to be displayed to the user when booking through
  // Reserve with Google.
  Text text = 1;
}

Definisi MerchantMatchingHints

// Hints used to help Google match a merchant to a place on Google Maps.
message MerchantMatchingHints {
  // The Place ID for a place in the Google Places database and on Google Maps.
  // See https://developers.google.com/places/place-id for more about Place IDs.
  // If this is provided, Google will use it as a hint when matching, and
  // prioritize the hint over other candidates.
  string place_id = 1;

}

Definisi ServiceAttribute

// Service attributes are partner-defined categories that describe the Services
// for a Merchant. For example, a bank may define an "Account Type"
// service attribute with possible values of "Personal" and "Business", while a
// hair salon may define a "Service Type" service attribute with possible
// values of "Haircut", "Color", and "Style".
message ServiceAttribute {
  // An identifier that uniquely identifies this service attribute among others
  // for the same merchant, e.g. "account-type".
  string attribute_id = 1;

  // A user-visible name for this attribute, e.g. "Account Type".
  string attribute_name = 2;

  // Represents a possible value for a particular service attribute.
  message Value {
    // An identifier that uniquely identifies this value among others for
    // this service attribute, e.g. "personal".
    string value_id = 1;

    // A user-visible name for the value, e.g. "Personal".
    string value_name = 2;
  }

  // All possible values for this service attribute.
  repeated Value value = 3;
}
// An action URL with associated language, list of countries restricted to, and
// optional platform that indicates which platform this action should be
// performed on.
message ActionLink {
  // The entry point URL for this action link.
  string url = 1;

  // The BCP-47 language tag identifying the language in which the content
  // from this URI is available.
  string language = 2;

  // An unordered list of ISO 3166-1 alpha-2 country codes. Leave empty for
  // unrestricted visibility.
  repeated string restricted_country = 3;

  // The platform that this action should be performed on. If this field is
  // unset, ACTION_PLATFORM_WEB_APPLICATION will be used as fallback.
  ActionPlatform platform = 4;

  // Predetermined type of action associated with an action link.
  enum ActionLinkType {
    // The action link type is unspecified.
    ACTION_LINK_TYPE_UNSPECIFIED = 0;
    // The action link type is booking an appointment.
    ACTION_LINK_TYPE_BOOK_APPOINTMENT = 1;
    // The action link type is booking an online appointment.
    ACTION_LINK_TYPE_BOOK_ONLINE_APPOINTMENT = 2;
    // The action link type is ordering food for delivery or takeout or both.
    ACTION_LINK_TYPE_ORDER_FOOD = 3;
    // The action link type is ordering food for delivery.
    ACTION_LINK_TYPE_ORDER_FOOD_DELIVERY = 4;
    // The action link type is ordering food for takeout.
    ACTION_LINK_TYPE_ORDER_FOOD_TAKEOUT = 5;
    // The action link type is making a dining reservation.
    ACTION_LINK_TYPE_MAKE_DINING_RESERVATION = 6;
    // The action link type allows users to shop from the given merchant. It
    // could either be delivery or pickup.
    ACTION_LINK_TYPE_SHOP_ONLINE = 7;
  }

  // Predetermined type of action associated with an action link.
  ActionLinkType action_link_type = 5;

  // Metadata for the order online link.
  // Supports action with ActionLinkType of ACTION_LINK_TYPE_SHOP_ONLINE.
  OrderOnlineMetadata order_online_metadata = 6;

  // Metadata for Food Ordering links.
  // Supports action type:
  //   *  `ACTION_LINK_TYPE_ORDER_FOOD_DELIVERY`
  //   *  `ACTION_LINK_TYPE_ORDER_FOOD_TAKEOUT`
  // Does NOT support `ACTION_LINK_TYPE_ORDER_FOOD`
  FoodOrderingMetadata food_ordering_metadata = 7
      ;
}

Definisi ActionPlatform

// The platform that the action is performed on. Web application is the general
// fallback. It is recommended to have at least one ActionLink with
// ACTION_PLATFORM_WEB_APPLICATION. Links with Android and iOS as platform are
// only used on the respective system.
enum ActionPlatform {
  // The platform is unspecified.
  ACTION_PLATFORM_UNSPECIFIED = 0;

  // The action platform is web in general.
  ACTION_PLATFORM_WEB_APPLICATION = 1;

  // The action platform is web on mobile devices.
  ACTION_PLATFORM_MOBILE_WEB = 2;

  // The action platform is Android OS.
  ACTION_PLATFORM_ANDROID = 3;

  // The action platform is iOS.
  ACTION_PLATFORM_IOS = 4;
}

Definisi OrderOnlineMetadata

// Metadata for an order online action link.
message OrderOnlineMetadata {
  // Available fulfillment options for an order online action link.
  repeated FulfillmentOption fulfillment_option = 1;
}

Definisi FulfillmentOption

// The fulfillment option for an order online action link.
message FulfillmentOption {
  // The fulfillment type associated with an action link.
  enum FulfillmentType {
    // The fulfillment type is unspecified.
    FULFILLMENT_TYPE_UNSPECIFIED = 0;
    // The fulfillment type is delivery.
    FULFILLMENT_TYPE_DELIVERY = 1;
    // The fulfillment type is pickup.
    FULFILLMENT_TYPE_PICKUP = 2;
  }
  // Required. The fulfillment type.
  FulfillmentType fulfillment_type = 1;

  // Day level availability.
  message AvailableDay {
    // Required. An available date for a fulfillment method. Assumed to be in
    // merchant's timezone.
    google.type.Date fulfillment_date = 1;
    // Required. Unix timestamp. The last time a user could order, and receive
    // items by `fulfillment_date`. In other words, after last_ordering_time,
    // fulfillment_date will no longer be shown as available.
    //
    // For example, if the fulfillment_date is 2020-08-10:
    // - a last_ordering_time value of 2020-08-10 18:00 means that, in order to
    // receive their order on 2020-08-10, a customer must make that order by 6pm
    // that same day.
    // - a last_ordering_time value of 2020-08-08 20:00 means that, in order to
    // receive their order on 2020-08-10, a customer must make that order by 8pm
    // two days prior.
    google.protobuf.Timestamp last_ordering_time = 2;
  }
  // Required. A list of days on which there is availability for this
  // fulfillment method (preferably at least 2).
  repeated AvailableDay available_day = 2;

  // No fee required for the fulfillment method associated with the action link.
  message NoFee {}

  // The minimum fee required for the fulfillment method associated with the
  // action link.
  message MinimumFee {
    // Required. The base fee amount for the fulfillment method.
    Price base_fee_amount = 1;
  }

  // The fixed fee required for the fulfillment method associated with the
  // action link.
  message FixedFee {
    // Required. The amount of the fixed fee for the fulfillment method.
    Price amount = 1;
  }

  // Fee details for the fulfillment method associated with the action link.
  message FeeDetails {
    // Fee model for the fulfillment method.
    oneof fee_details {
      // No fee for the fulfillment method.
      NoFee no_fee = 1;
      // The base fee associated with the fulfillment method.
      MinimumFee base_fee = 2;
      // The fixed fee associated with the fulfillment method.
      FixedFee fixed_fee = 3;
    }
  }
  // Required. Fee details for the fulfillment method.
  FeeDetails fee_details = 3;

  // Required. Minimum order for the fulfillment method associated with the
  // action link.
  Price minimum_order = 4;
}

Definisi FoodOrderingMetadata

// Metadata for food ordering action links.
message FoodOrderingMetadata {
  // Details of fees charged to the user on top of the item total.
  // Repeated for different types of fees like service fee, delivery fee etc.
  repeated FeeDetails fee_details = 1;

  // Order fulfillment time duration from order confirmation.
  // For delivery orders, time duration until the food is delivered.
  // For pickup orders, time duration until the food is ready for pickup.
  oneof fulfillment_duration_options {
    // Fixed duration. For example: 30 mins.
    google.protobuf.Duration fulfillment_lead_time_duration = 2
        ;

    // A range of duration.
    // Examples:
    // * 30 mins to 45 mins
    // * Greater than 30 mins
    // * Less than 50 mins
    DurationRange fulfillment_lead_time_duration_range = 4
        ;
  }

  // Details on advanced ordering support also known as order ahead where user
  // can place an order for fulfillment at a later time than right now.
  AdvanceOrderDetails advance_order_details = 3;

  // Fee details.
  message FeeDetails {
    // Fee type.
    enum FeeType {
      // Fee type unspecified.
      FEE_TYPE_UNSPECIFIED = 0;
      // For delivery fees.
      DELIVERY = 1;
      // For service fees.
      SERVICE = 2;
    }
    // Fee type. (required)

    FeeType type = 1
        ;

    // Fee amount either in unit currency, a percentage of the cart value, or a
    // combination of both. (required)
    FeeAmount fee_amount = 2
        ;

    // `FeeAmount` examples:
    //   * Fixed fee: USD 0 (no fee), USD 1.5
    //   * Range of fixed fee: USD 1.0 (minimum), USD 3.0 (maximum), USD 5.0-6.0
    //   * Percentage of cart size: 15.5%, 10%-20%, 10% (minimum), 15% (maximum)
    //   * Compound of range and percentage:
    //       25.5% & USD 2.5 (minimum), 25.5% & USD 4.5 (maximum),
    //       10% & USD 1.5-2.5, 10.5%-20% & USD 2.5-3.5
    message FeeAmount {
      // Options to specify monetary amount.
      oneof amount_options {
        // Fixed amount. For example USD 3.5.
        google.type.Money amount = 1;
        // Range of amount.
        // Upper and/or Lower bounds of fee range must be positive.
        // Examples:
        //  * USD 3.5 to USD 5.5
        //  * At least USD 3.5
        //  * At most USD 5.5
        MoneyRange amount_range = 2
            ;
        // Unknown amount.
        bool amount_unknown = 4;
      }

      // Fee in terms of a percentage of the cart value.
      // Supports a range (bounded and unbounded) or a fixed percentage.
      // Value should be between 0 (exclusive) and 100 (inclusive).
      // Examples:
      //  * Fixed 5.5%
      //  * At least 5.5%
      //  * At most 5.5%
      //  * 4.5% to 5.5%
      QuantitativeValue cart_percentage = 3
          ;
    }
  }

  // For order ahead support.
  message AdvanceOrderDetails {
    // True if Advance Orders, also known as Order Ahead, is supported.
    // (required)
    bool is_supported = 1;
  }
}

Definisi DurationRange

// Wrapper for a range of duration that can be bounded or unbounded.
// At least one of min_duration and max_duration duration is required.
message DurationRange {
  // Minimum duration.
  google.protobuf.Duration min_duration = 1
      ;
  // Maximum duration.
  google.protobuf.Duration max_duration = 2
      ;
}

Definisi MoneyRange

// Wrapper for a range of monetary amount that could be bounded or unbounded.
// At least one of min_amount and max_amount is required.
message MoneyRange {
  // Minimum amount.
  google.type.Money min_amount = 1
      ;
  // Maximum amount.
  google.type.Money max_amount = 2;
}

Definisi QuantitativeValue

// Wrapper for a numerical value that could be a range or a fixed value.
// `QuantitativeValue` examples:
//   *  Singular value: `value: 10.5`
//   *  Bounded range: `value_range {min_value: 5.5, max_value 10.5}`
//   *  Lower bound: `value_range {min_value: 5.5}`
//   *  Upper bound: `value_range {max_value: 10.5}`
message QuantitativeValue {
  // Range of values such that `min_value` < `max_value`.
  // Requires at least one of `min_value` and `max_value`.
  message RangeValue {
    // Minimum value.
    optional double min_value = 1
        ;
    // Maximum value.
    optional double max_value = 2
        ;
  }

  // (required)
  oneof value_options {

    // A singular value. For example: 5.6
    double value = 1;
    // A range of values that could also be open ended or bounded.
    // Examples:
    // * At least 5.5
    // * At most 5.5
    // * 5.5 to 6.5
    RangeValue value_range = 2
        ;
  }
}