Перейти к содержанию

Синхронизация расписания

Полная синхронизация статических данных бизнеса (работников, услуг), полная синхронизация расписания всех работников, загрузка всех актуальных записей. Каждый из этих запросов выполняется по расписанию раз в несколько минут. Может быть использован для восстановления актуальности расписания для 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
            }
        }
    }
}