Синхронизация расписания¶
Полная синхронизация статических данных бизнеса (работников, услуг), полная синхронизация расписания всех работников, загрузка всех актуальных записей. Каждый из этих запросов выполняется по расписанию раз в несколько минут. Может быть использован для восстановления актуальности расписания для failover сценария и при первом запуске синхронизации.
Предназначен для поддержания стабильной работы интеграции, например, в случае потери соединения при передаче частичных данных на событие в МИСе через Callback механизм.
Обновление данных бизнеса¶
Запрос mis.update_business
.
Обновление списка работников, списка услуг, а также привязки работника к услуге. Запрос либо создает соответствующие сущности, либо обновляет, найдя предварительно их по идентификатору, указанном в запросе.
Рекомендация по частоте вызова запроса - 6-24 часа.
Формат запроса:
Название | Required | Тип | Описание |
---|---|---|---|
provider | обязательно | string | Обработчик данных запроса. Передавайте ident, если нет явного указания передавать другое. |
queue | string | произвольное имя очереди (не заполнять, передается по согласованию) | |
business.id | обязательно | string | идентификатор бизнеса |
taxonomies | Taxonomy[] | массив таксономий (услуг, категорий), преобразуемый в древовидную структуру (см. parentId) | |
resources | Resource[] | массив работников |
Тип Taxonomy:
Название | Required | Тип | Описание |
---|---|---|---|
id | обязательно | string | идентификатор МИС услуги |
isDefaultService | boolean | дочерняя услуга, выбираемая по умолчанию, если запись необходимо вести на корневую (по умолчанию false) | |
name | обязательно | string | название услуги |
description | string | описание (по умолчанию пустая строка) | |
parentId | string | идентификатор МИС родительской услуги (по умолчанию корневая таксономия) | |
order | number | положение услуги в списке (по умолчанию добавляется в конец списка, при изменении не меняется) | |
duration | обязательно | number | продолжительность услуги в минутах |
priceAmount | обязательно | number | стоимость полного времени услуги |
priceCurrency | Currency | валюта (по умолчанию RUB) | |
stockAmount | number | цена со скидкой | |
priceType | PriceType | тип цены (по умолчанию "equal") | |
additionalDurations | AdditionalDuration[] | массив с набором альтернативных длительностей услуги для различных работников |
Тип AdditionalDuration:
Название | Required | Тип | Описание |
---|---|---|---|
level | обязательно | number | условный уровень работника. Должен быть указан у работника в resources.taxonomyLevels |
duration | обязательно | number | длительность, минут |
Тип Currency:
- "RUB"
- "USD"
- "ILS"
- "EUR"
- "GBP"
- "HUF"
- "KZT"
- "CHY"
- "UZS"
- "UAH"
Тип PriceType:
- "equal" — точная
- "begin_with" — "от"
- "average" — средняя
Тип Resource:
Название | Required | Тип | Описание |
---|---|---|---|
id | обязательно | string | идентификатор МИС врача |
fname | обязательно | string | имя врача |
mname | string | отчество (по умолчанию пустая строка) | |
lname | обязательно | string | фамилия |
description | string | описание (по умолчанию пустая строка) | |
order | number | положение врача в списке (по умолчанию добавляется в конец списка, при изменении не меняется) | |
taxonomies | обязательно | string[] | список идентификаторов МИС услуг, которые выполняет врач |
taxonomyChildren | TaxonomyChildren[] | является ли для врача данная услуга детской (возможно указать 2 элемента с одинаковым taxonomyID) | |
taxonomyLevels | TaxonomyLevel[] | массив установки альтернативной длительности услуги для работника |
Тип TaxonomyChildren:
Название | Required | Тип | Описание |
---|---|---|---|
taxonomyID | обязательно | string | идентификатор МИС услуги |
children | обязательно | boolean | выполняет ли врач указанную услугу как детский врач |
Тип TaxonomyLevel:
Название | Required | Тип | Описание |
---|---|---|---|
id | обязательно | string | идентификатор МИС услуги |
level | обязательно | number | условный уровень работника |
Пример запроса:
{
"jsonrpc":"2.0",
"id":1,
"cred":{
"token":"[Token]",
"user":"[UserID]"
},
"method":"mis.update_business",
"params":{
"provider":"ident",
"queue":"[QueueName]",
"business":{
"id":"[BusinessID]"
},
"taxonomies":[
{
"isDefaultService":false,
"id":"extra_test_tax1",
"name":"Тестовая услуга",
"description":"Описание тестовой услуги",
"parentId":null,
"order":null,
"duration":45,
"priceAmount":1200.0,
"priceCurrency":"RUB",
"stockAmount":900,
"priceType":"equal",
"additionalDurations":[
{
"level":5,
"duration":45
}
]
}
],
"resources":[
{
"id":"extra_res_id",
"fname":"Иван",
"mname":"Иванович",
"lname":"Иванов",
"description":"Отличный врач!",
"order":null,
"taxonomies":[
"extra_test_tax1"
],
"taxonomyChildren":[
{
"taxonomyID":"mis_tax_id",
"children":false
}
],
"taxonomyLevels":[
{
"level":5,
"id":"1"
}
]
}
]
}
}
Формат ответа:
{
"jsonrpc":"2.0",
"id":1,
"result":{
"queued":true,
"jobID":"5805e88a4f292d520da38b52"
}
}
Обновление расписания¶
Запрос mis.update_schedule
.
Расписание работников обновляется целиком для всех указанных работников. Если работник до этого имел свободное время на день, не указанный в запросе, то он будет стерт. Другими словами, в этом запросе расписание каждого работника нужно передавать целиком за тот период, за который вы хотите предоставить онлайн запись. Обратите внимание, что зачастую нет необходимости включать расписание больше, чем на месяц, поскольку клиент спустя месяц может даже не вспомнить, что он записывался.
Работники, не указанные в запросе не изменят своего расписания.
При передаче OFF интервалов они имеют больший приоритет, чем ON, что можно использовать для учета занятого времени (существующих записей, обедов, перерывов в работе). При этом такие интервалы можно передавать как есть как OFF интервалы.
Время в resources.timetable выгружается в формате UTC. Есть возможность выгружать время во временной зоне бизнеса. Для этого укажите параметр запроса isLocalTime: true.
При указании временных интервалов значение времени начала временного интервала, указанное в поле start, должно быть строго меньше времени конца — поле end.
Рекомендация по частоте вызова запроса — 1-20 минут.
Формат запроса:
Название | Required | Тип | Описание |
---|---|---|---|
provider | обязательно | string | Обработчик данных запроса. Передавайте ident, если нет явного указания передавать другое. |
queue | string | произвольное имя очереди (не заполнять, передается по согласованию) | |
business.id | обязательно | string | идентификатор бизнеса |
skipNotPassedDays | boolean | оставить ли свободное расписание для тех дней, которые не были указаны в запросе (необязательно, по умолчанию false) | |
isLocalTime | boolean | если передано true, то время считается локальным временем | |
resources | ResourceTimetable | массив расписаний работников |
Тип ResourceTimetable:
Название | Required | Тип | Описание |
---|---|---|---|
id | обязательно | string | идентификатор МИС врача |
timetable | обязательно | Timetable | список слотов врача |
Тип Timetable:
Название | Required | Тип | Описание |
---|---|---|---|
start | обязательно | string (Date ISO8601) | |
end | обязательно | string (Date ISO8601) | |
type | string ("ON"|"OFF") | включить/выключить время расписания (по умолчанию ON) | |
appointmentId | string | ид записи, которой соответствует интервал |
Пример запроса:
{
"jsonrpc":"2.0",
"id":1,
"cred":{
"token":"[Token]",
"user":"[UserID]"
},
"method":"mis.update_schedule",
"params":{
"provider":"ident",
"queue":"custom_queue_name",
"business":{
"id":"[BusinessID]"
},
"skipNotPassedDays":true,
"isLocalTime":true,
"resources":[
{
"id":"extra_res_id",
"timetable":[
{
"start":"2016-10-21 09:00:00.000Z",
"end":"2016-10-21 10:00:00.000Z",
"type":"ON",
"appointmentId":"mis_id"
}
]
}
]
}
}
Формат ответа:
{
"jsonrpc":"2.0",
"id":1,
"result":{
"queued":true,
"jobID":"5805e88a4f292d520da38b52"
}
}
“Ленивая” загрузка записей¶
При обновлении расписания во временном интервале есть возможность передать идентификатор записи - поле appointmentId. В случае, если передан идентификатор записи, которой еще нет в системе, она будет зарегистрирована для загрузки и предоставлена в списке при следующем вызове mis.get_lazy_appointments
.
Таким образом, вызывая последовательно методы mis.get_lazy_appointments
и mis.load_appointments
мы загружаем новые записи.
Механизм “ленивой” загрузки будет корректно выполняться в случае восстановления после отказа одного или нескольких из компонентов, участвующих в процессе синхронизации либо канала передачи данных. Таким образом, он гарантирует отказоустойчивость процесса синхронизации. Также данный механизм будет применяться и при инициализации данных (при первом запуске синхронизации).
Рекомендация по частоте вызовов - 1-20 минут.
Получение списка идентификаторов “ленивых” записей¶
Запрос mis.get_lazy_appointments
.
Возвращает список идентификаторов записей, которые были указаны для загрузки в запросе формирование расписания, но еще не были загружены.
Формат запроса:
Название | Required | Тип | Описание |
---|---|---|---|
provider | обязательно | string | Обработчик данных запроса. Передавайте ident, если нет явного указания передавать другое. |
business.id | обязательно | string | идентификатор бизнеса |
network.id | обязательно | string | идентификатор сети |
Пример запроса:
{
"jsonrpc":"2.0",
"id":1,
"cred":{
"token":"[Token]",
"user":"[UserID]"
},
"method":"mis.get_lazy_appointments",
"params":{
"provider":"[Provider]",
"business":{
"id":"[BusinessID]"
},
"network":{
"id":"[NetworkID]"
}
}
}
Формат ответа:
Название | Required | Тип | Описание |
---|---|---|---|
appointments | обязательно | string[] | массив идентификаторов МИС записей |
Пример ответа:
{
"jsonrpc":"2.0",
"id":1,
"result":{
"appointments":[
"mis_id1",
"mis_id2",
"mis_idN"
]
}
}
Загрузка записей (создание, изменение)¶
Запрос mis.load_appointments
.
Загружает данные по новым записям.
Количество элементов в массиве appointments не должно превышать 500.
В случае, если данные по записи есть в системе GBooking они обновятся входящими.
Формат запроса:
Название | Required | Тип | Описание |
---|---|---|---|
provider | обязательно | string | Обработчик данных запроса. Передавайте ident, если нет явного указания передавать другое. |
business.id | обязательно | string | идентификатор бизнеса |
appointments | обязательно | Appointment[] | список записей |
Тип Appointment:
Название | Required | Тип | Описание |
---|---|---|---|
active | обязательно | boolean | является эта запись активной или отмененной |
id | обязательно | string | идентификатор МИС записи |
start | обязательно | string (Date ISO8601) | время начала записи |
duration | обязательно | number | продолжительность записи |
price | обязательно | Price | цена записи |
client | обязательно | Client | данные клиента |
source | обязательно | string | источник записи (MIS_SCHEDULE_SYNC) |
taxonomy.id | обязательно | string | идентификатор МИС услуги, отделения |
resource.id | обязательно | string | идентификатор МИС врача |
Тип Price:
Название | Required | Тип | Описание |
---|---|---|---|
amount | обязательно | number | Значение цены с учетом скидки |
currency | обязательно | Currency | |
originalAmount | обязательно | number | Значение цены без учета скидки |
Тип Client:
Название | Required | Тип | Описание |
---|---|---|---|
id | обязательно | string | идентификатор клиента. Нужен для поддержания ссылочной целостности клиентской базы |
name | string | Имя пользователя | |
surname | string | Фамилия пользователя | |
middlename | string | Отчество пользователя | |
phone | обязательно | Phone | телефон пользователя |
Тип Phone:
Название | Required | Тип | Описание |
---|---|---|---|
country_code | обязательно | string | код страны |
area_code | обязательно | string | код области |
number | обязательно | string | номер |
Пример запроса:
{
"jsonrpc":"2.0",
"id":1,
"cred":{
"token":"[Token]",
"user":"[UserID]"
},
"method":"mis.load_appointments",
"params":{
"provider":"ident",
"business":{
"id":"[BusinessID]"
},
"appointments":[
{
"active":true,
"id":"mis_appointment_id",
"start":"2017-01-26T15:45:00.000Z",
"duration":135,
"price":{
"amount":1500,
"currency":"RUB",
"originalAmount":1500
},
"client":{
"id":"mis_client_id",
"name":"Василий",
"surname":"Пупкин",
"phone":[
{
"country_code":"7",
"area_code":"000",
"number":"0300000"
}
]
},
"source":"MIS_SCHEDULE_SYNC",
"taxonomy":{
"id":"mis_extra_id"
},
"resource":{
"id":"mis_extra_id"
}
}
]
}
}
Формат успешного ответа:
{
"jsonrpc":"2.0",
"result":true
}
Формат ответа с ошибкой:
{
"jsonrpc":"2.0",
"id":7,
"error":{
"code":-10000,
"message":"Unknown error occurred"
}
}
Получение статуса обработки запроса¶
Запрос business.get_bg_job_info
.
Запрос на обновление статических данных бизнеса и расписания делегируется на сервера тяжелых задач. Поэтому статус выполнения запроса не может быть получен сразу. Для получения статуса такого запроса создается задача, идентификатор которой должен быть получен в ответе. Для получения информации по этой задаче используется этот запрос.
Пример запроса:
{
"cred":{
"token":"[Token]",
"user":"[UserID]"
},
"jsonrpc":"2.0",
"method":"business.get_bg_job_info",
"params":{
"jobID":"5805e88a4f292d520da38b52"
}
}
Формат ответа:
Название | Required | Тип | Описание |
---|---|---|---|
job.created | обязательно | string (Date ISO8601) | дата создания задачи |
job.state | обязательно | string ("initial", "pending", "done", "error") | статус выполнения задачи |
Пример ответа:
{
"jsonrpc":"2.0",
"result":{
"job":{
"created":"2016-10-18T09:16:58.298Z",
"state":"pending",
"jobID":"5805e88a4f292d520da38b52"
}
}
}
В случае, когда задача завершилась с ошибкой появляется дополнительный атрибут “error”:
Пример ответа с ошибкой:
{
"jsonrpc":"2.0",
"result":{
"job":{
"created":"2016-10-18T00:03:11.359Z",
"state":"error",
"jobID":"580566bf3253100519408b22",
"error":{
"data":{
"code":"ETIMEDOUT"
},
"message":"Failed to update business integration data",
"code":-10600
}
}
}
}