Синхронные бронирования определяются как бронирования, которые подтверждаются или отклоняются в режиме реального времени.
Асинхронные бронирования определяются как бронирования, которые продавец подтверждает или отклоняет позднее.
Резервирование указывается как синхронное или асинхронное на уровне доступности. Это также означает, что для данного продавца и услуги могут быть как синхронные, так и асинхронные слоты доступности.
Чтобы определить подходящую реализацию, сначала определите, к какой категории относится ваш инвентарь:
- Включение только синхронных бронирований : все продавцы и услуги подтверждаются мгновенно.
- Включение асинхронного бронирования . Некоторые или все продавцы и услуги требуют подтверждения продавца вручную.
Критерии асинхронного бронирования
- Изменение асинхронного бронирования в Центре действий не поддерживается.
- Продавцы должны иметь возможность принимать или отклонять бронирование через онлайн-систему партнера (например, хост-панель ресторана). Звонить продавцу от имени пользователя, чтобы определить, принимает или отклоняет ли продавец бронирование, запрещено .
- Предложение продавца о новом времени бронирования не поддерживается. Запрос на бронирование должен быть принят или отклонен в исходном состоянии.
Включение только синхронного бронирования
Стандартная реализация по умолчанию использует синхронное резервирование. Дополнительную информацию можно найти в документации по сквозной интеграции Reservations.
Включение асинхронного бронирования
Если некоторые или все продавцы используют асинхронный процесс бронирования, необходимо внести следующие изменения:
- Режим подтверждения: все представления слотов доступности теперь содержат поле - confirmation_mode, которое описывает, как подтверждаются бронирования этого слота доступности. Укажите режим- confirmation_modeдля каждого слота доступности для следующего:-  В фиде доступности параметр confirmation_modeуказан на уровне доступности.
-  В методах API Сервера бронирования confirmation_modeуказывается на уровне слота.
-  В методах API обновлений в реальном времени confirmation_modeуказывается на уровне доступности.
 
-  В фиде доступности параметр 
-  Статус бронирования. Все представления резервирований содержат поле status, которое отображает состояние бронирования. Введены три новых асинхронных значения статуса:PENDING_CONFIRMATION,DECLINED_BY_MERCHANTиFAILED. Используйте эти новые значения статуса при обработке создания, отклонения и сбоев асинхронных бронирований.
- Обновления бронирования. Обо всех асинхронных обновлениях статуса бронирований следует сообщать с помощью метода bookings.patch API уведомлений о бронировании.
На диаграмме ниже показано, как режим подтверждения и статус бронирования используются в типичном взаимодействии асинхронного бронирования.

- Фиды доступности были обновлены, и теперь указан режим подтверждения каждого слота доступности. Важно иметь эту информацию в ленте, чтобы мы могли объяснить пользователю асинхронный характер бронирования на ранних этапах процесса.
-  При вызове BatchAvailabilityLookupилиCheckAvailabilityмы передаем режим подтверждения и, в идеале, тот же режим подтверждения, который будет возвращен. Это гарантирует, что пользователю будут показаны соответствующие сообщения.
-  При вызове CreateBookingмы передаем режим подтверждения, чтобы указать ожидаемый режим подтверждения. При отправке запроса на асинхронное бронирование бронирование возвращается со статусомPENDING_MERCHANT_CONFIRMATION.
- Когда продавец принимает или отклоняет запрос на бронирование, статус бронирования обновляется с помощью метода bookings.patch API уведомления о бронировании в режиме реального времени. Если вы хотите автоматически отклонять заказы, на которые не ответили своевременно, сделайте это с помощью того же метода обновления в реальном времени.
Фиды доступности
 В канале доступности укажите, является ли каждый слот синхронным или асинхронным. Для этого установите новое поле confirmation_mode .
// Mode by which bookings for an availability slot are confirmed. enum ConfirmationMode { // The confirmation mode was not specified. // Synchronous confirmation will be assumed. CONFIRMATION_MODE_UNSPECIFIED = 0; // Bookings for this availability will be confirmed synchronously. CONFIRMATION_MODE_SYNCHRONOUS = 1; // Bookings for this availability will be confirmed asynchronously. CONFIRMATION_MODE_ASYNCHRONOUS = 2; }
Хотя режим подтверждения считается синхронным, если режим не указан, настоятельно рекомендуется явно указывать режим, поскольку это устраняет любую путаницу, связанную со случайными упущениями.
Асинхронный
{
  "availability": [
    {
      "merchant_id": "10001",
      "service_id": "1000",
      "spots_open": 3,
      "spots_total": 3,
      "duration_sec": 3600,
      "start_sec": 1535806800,
      "resources": {
        "party_size": 4
      },
      "confirmation_mode": "CONFIRMATION_MODE_ASYNCHRONOUS"
    }
  ]
}Синхронизировать
{
  "availability": [
    {
      "merchant_id": "10001",
      "service_id": "1000",
      "spots_open": 3,
      "spots_total": 3,
      "duration_sec": 3600,
      "start_sec": 1535806800,
      "resources": {
        "party_size": 4
      },
      "confirmation_mode": "CONFIRMATION_MODE_SYNCHRONOUS"
    }
  ]
}Асинхронность и синхронизация
{
  "availability": [
    {
      "merchant_id": "10001",
      "service_id": "1000",
      "spots_open": 3,
      "spots_total": 3,
      "duration_sec": 3600,
      "start_sec": 1535806800,
      "resources": {
        "party_size": 4
      },
      "confirmation_mode": "CONFIRMATION_MODE_SYNCHRONOUS"
    },
    {
      "merchant_id": "10002",
      "service_id": "1000",
      "spots_open": 4,
      "spots_total": 4,
      "duration_sec": 3600,
      "start_sec": 1535806800,
      "resources": {
        "party_size": 2
      },
      "confirmation_mode": "CONFIRMATION_MODE_ASYNCHRONOUS"
    }
  ]
}Сервер бронирования
BatchAvailabilityLookup или CheckAvailability
 В BatchAvailabilityLookupResponse (BAL) или CheckAvailabilityResponse (CA) верните тот же confirmation_mode , который указан в канале доступности и передан через BatchAvailabilityLookupRequest или CheckAvailabilityRequest . 
BAL-асинхронный
{
  "slot_time_availability": [
    {
      "slot_time": {
        "duration_sec": "3600",
        "resource_ids": {
          "party_size": 3
        },
        "service_id": "1000",
        "start_sec": "1546458300",
        "confirmation_mode": "CONFIRMATION_MODE_ASYNCHRONOUS"
      },
      "available": true
    }
  ]
}BAL-Синхронизация
{
  "slot_time_availability": [
    {
      "slot_time": {
        "duration_sec": "3600",
        "resource_ids": {
          "party_size": 3
        },
        "service_id": "1000",
        "start_sec": "1546458300",
        "confirmation_mode": "CONFIRMATION_MODE_SYNCHRONOUS"
      },
      "available": true
    }
  ]
}CA-асинхронный
{
  "slot": {
    "duration_sec": "3600",
    "merchant_id": "317652",
    "resources": {
      "party_size": 3
    },
    "service_id": "1000",
    "start_sec": "1546458300",
    "confirmation_mode": "CONFIRMATION_MODE_ASYNCHRONOUS"
  },
  "count_available": 1,
  "duration_requirement": "DO_NOT_SHOW_DURATION"
}CA-Синхронизация
{
  "slot": {
    "duration_sec": "3600",
    "merchant_id": "317652",
    "resources": {
      "party_size": 3
    },
    "service_id": "1000",
    "start_sec": "1546458300",
    "confirmation_mode": "CONFIRMATION_MODE_SYNCHRONOUS"
  },
  "count_available": 1,
  "duration_requirement": "DO_NOT_SHOW_DURATION"
}Создать бронирование
Обязательно верните правильный статус бронирования, используя доступные варианты ниже:
// Status of a booking. // // Updating booking status does not change the status of the associated payment. // Prepayment status updates should be done using the PrepaymentStatus enum. enum BookingStatus { // Not specified. BOOKING_STATUS_UNSPECIFIED = 0; // Booking has been confirmed CONFIRMED = 1; // Booking is awaiting confirmation by the merchant before it can transition // into CONFIRMED status. Only applicable to non-payments Dining or // Beauty verticals. PENDING_MERCHANT_CONFIRMATION = 2; // Booking has been canceled on behalf of the user. // The merchant can still trigger a manual refund. CANCELED = 3; // User did not show for the appointment NO_SHOW = 4; // User did not show for the appointment in violation of the cancellation // policy. NO_SHOW_PENALIZED = 5; // Booking could not be completed by the async backend due to a failure. FAILED = 6; // Booking was asynchronously declined by the merchant. Only applicable to // non-payments Dining or Beauty verticals. DECLINED_BY_MERCHANT = 7; }
 В CreateBookingResponse верните текущий confirmation_mode для агрегированного слота бронирования, указанного в CreateBookingRequest. Кроме того, если бронирование асинхронное, установите status PENDING_MERCHANT_CONFIRMATION . Убедитесь, что параметр confirmation_mode соответствует ожиданиям пользователя и параметра «Зарезервировать через Google», чтобы не запутать пользователя. 
Асинхронный
{ "booking": { "slot": { "duration_sec": "3600", "merchant_id": "100001", "resources": { "party_size": 2 }, "service_id": "1000", "start_sec": "1546647234", "confirmation_mode": "CONFIRMATION_MODE_ASYNCHRONOUS" }, "user_information": { "email": "johnsmith@gmail.com", "family_name": "John", "given_name": "Smith", "telephone": "+1 800-123-4567", "user_id": "2017492857928759285" }, "payment_information": { "prepayment_status": "PREPAYMENT_NOT_PROVIDED" }, "status": "PENDING_MERCHANT_CONFIRMATION" } }
Синхронизировать
{ "booking": { "slot": { "duration_sec": "3600", "merchant_id": "100001", "resources": { "party_size": 2 }, "service_id": "1000", "start_sec": "1546647234", "confirmation_mode": "CONFIRMATION_MODE_SYNCHRONOUS" }, "user_information": { "email": "johnsmith@gmail.com", "family_name": "John", "given_name": "Smith", "telephone": "+1 800-123-4567", "user_id": "2017492857928759285" }, "payment_information": { "prepayment_status": "PREPAYMENT_NOT_PROVIDED" }, "status": "CONFIRMED" } }
ОбновлениеБронирование
В первоначальной версии async пользовательские изменения существующего бронирования не поддерживаются. Вместо этого пользователю следует отменить бронирование и создать новое бронирование.
Обновления в реальном времени
 Для обновлений доступности в режиме реального времени следует указать confirmation_mode . Это касается следующих методов:
RTU инвентаризации (ReplaceServiceAvailability или BatchReplaceServiceAvailability)
 Используя метод availability.replace (пакетный) или метод services.availability.replace , установите для confirmation_mode значение CONFIRMATION_MODE_ASYNCHRONOUS в разделе Availability 
Асинхронный
{
  "extendedServiceAvailability": [
    {
      "merchantId": "1001",
      "serviceId": "12310",
      "startTimeRestrict": "2014-10-02T15:01:23.045123456Z",
      "endTimeRestrict": "2014-10-02T19:01:23.045123456Z",
      "availability": [
        {
          "startTime": "2014-10-02T15:30:00.00Z",
          "duration": "3600s",
          "spotsOpen": "0",
          "spotsTotal": "2",
          "availabilityTag": "1000001",
          "confirmation_mode": "CONFIRMATION_MODE_ASYNCHRONOUS"
        }
      ]
    }
  ]
}Синхронизировать
{
  "extendedServiceAvailability": [
    {
      "merchantId": "1001",
      "serviceId": "12310",
      "startTimeRestrict": "2014-10-02T15:01:23.045123456Z",
      "endTimeRestrict": "2014-10-02T19:01:23.045123456Z",
      "availability": [
        {
          "startTime": "2014-10-02T15:30:00.00Z",
          "duration": "3600s",
          "spotsOpen": "0",
          "spotsTotal": "2",
          "availabilityTag": "1000001",
          "confirmation_mode": "CONFIRMATION_MODE_SYNCHRONOUS"
        }
      ]
    }
  ]
}Асинхронность и синхронизация
{
  "extendedServiceAvailability": [
    {
      "merchantId": "1001",
      "serviceId": "12310",
      "startTimeRestrict": "2014-10-02T15:01:23.045123456Z",
      "endTimeRestrict": "2014-10-02T19:01:23.045123456Z",
      "availability": [
        {
          "startTime": "2014-10-02T15:30:00.00Z",
          "duration": "3600s",
          "spotsOpen": "0",
          "spotsTotal": "2",
          "availabilityTag": "1000001",
          "confirmation_mode": "CONFIRMATION_MODE_ASYNCHRONOUS"
        },
        {
          "startTime": "2014-10-03T11:00:00.00Z",
          "duration": "5400s",
          "spotsOpen": "1",
          "spotsTotal": "1",
          "availabilityTag": "1000002",
          "confirmation_mode": "CONFIRMATION_MODE_SYNCHRONOUS"
        }
      ]
    }
  ]
}API уведомлений о бронировании
Асинхронные обновления статуса бронирования следует выполнять с помощью метода bookings.patch API уведомлений о бронировании.
 При обновлении статуса обязательно включите имя поля status в updateMask .
| Статус | Описание | 
|---|---|
| ПОДТВЕРЖДЕННЫЙ | продавец подтвердил бронирование | 
| НЕУСПЕШНЫЙ | партнер не смог подтвердить или отклонить бронирование у продавца | 
| DECLINED_BY_MERCHANT | продавец отклонил бронирование | 
Request: PATCH https://mapsbooking.googleapis.com/v1alpha/notification/partners/<PARTNER_ID>/bookings/<BOOKING_ID>?updateMask=status Body: {"name":"partners/<PARTNER_ID>/bookings/<BOOKING_ID>", "status":"DECLINED_BY_MERCHANT"}
В случае сбоя бронирования установите статус бронирования FAILED и укажите booking_failure. Если для статуса установлено любое другое значение, booking_failure игнорируется.
Request: PATCH https://mapsbooking.googleapis.com/v1alpha/notification/partners/<PARTNER_ID>/bookings/<BOOKING_ID>?updateMask=status&booking_failure.cause="SLOT_UNAVAILABLE" Body: {"name":"partners/<PARTNER_ID>/bookings/<BOOKING_ID>", "status":"FAILED"}
Уведомления по электронной почте
При асинхронном бронировании пользователям отправляется пять потенциальных электронных писем, связанных со статусом бронирования.
-  PENDING_MERCHANT_CONFIRMATION
-  CONFIRMED
-  DECLINED_BY_MERCHANT
-  FAILED
-  CANCELED