Device API предназначено для прямой интеграции Server-Server или Application-Server, с доступом к данным на уровне устройства и торговой точки, к которой прикреплено это устройство.
API поддерживает JRPC 2.0-протокол вызова методов.
Для работы необходимо знать ключ <AccessKey&>
«устройства» с которым можно обращаться по URL: https://api.giftoman.ru/s/<accesskey>
Протокол обмена данными
Запрос представляет собой JSON-сериализованный объект отправляемый с помощью POST-метода в виде RAW_POST_DATA
{ "jsonrpc": "2.0", "id": "[Свободно-генерируемый идентификатор запроса]", "method": "[Название вызываемого метода]", "params": "[объект или массив аргументов вызываемого метода]" }
Ответ так же является JSON-сериализованным объектом
{ "jsonrpc": "2.0", "id": "[Идентификатор запроса на который дан ответ]", "result": "[Любой тип данных - объект, массив, значение]" }
или отрицательный
{ "jsonrpc": "2.0", "id": "[Идентификатор запроса на который дан ответ]", "error": { "code": "[Код ошибки]", "message": "Неправильная операция" } }
Код ошибки | Пояснение |
---|---|
-32000 | Неизвестный идентификатор сотрудника |
-32500 | Ошибка клиента |
-32600 | Неправильный формат запроса |
-32601 | Неправильная операция |
-32602 | Неправильные параметры операции |
-32605 | Операция не удалась |
-32606 | Слишком частое выполнение операции |
-32610 | Ошибка БД |
-32700 | Неправильный формат сообщения |
-32800 | Неизвестный терминал |
-32801 | Терминал заблокирован |
-32802 | Невалидный секретный ключ |
-32803 | Терминал с таким идентификатором уже существует |
-33000 | Неизвестный пользователь |
-33001 | Владелец POS не найден |
-33100 | Отказ в авторизации |
Запрос позволяет как оформить продажу, так и возврат
purchaseRegister( token, amount, cart [, poskey ] );
Параметры.
name | type | description |
---|---|---|
token | string(32) | Локальный идентификатор покупателя, если таковой отсутствует передавать ‘guest’ |
amount | decimal(10,4) | Если >0, то сумма чека, если <0, то сумма возврата |
cart | object | Объект расширяемых (опциональных) параметров чека: — discount (decimal(10,4)) : Скидка по чеку — ts ( ISO 8601 : YYYY-MM-DDThh:mm:ss±hh:mm) : Точное время чека. Необходимо обязательно передавать метку времени с корректным смещением ±hh от UTC, соответствующим временному поясу торговой точки. — cashier (string(200)) : Имя продавца — extId (string(40)): Идентификатор чека в ТС — positions (array) : [ Товарные позиции в чеке { — name (string(200)) : Название товара — count (decimal(10,4)) : Кол-во товара — total (decimal(10,4)) : Общая сумма по позиции — seller (string(200)) : Продавец для конкретной позиции — category (string(200)) : Название категории товара (Можно передать несколько категорий в строке, разделяя ‘&&’) — extId (string(40)) : Внешний идентификатор товара (Артикул) },.. ] — attributes (array) : [ Массив свободных атрибутов чека (карты лояльности, платёжные системы и т.п.) { — name (string(10)) : Название атрибута (английские мнемоники), — value (decimal(10,4)) : Значение атрибута },.. ] |
poskey (опциональный) | string(130) | Ключ маппинга к устройству или торговой точке. Общий формат: @store_ext_id/cashbox_ext_id — store_ext_id — Внешний идентификатор торговой точки, передаваемый в методе setCashbox() в аргументе метода extid — Пример: @111/123 |
Пример
{ "jsonrpc": "2.0", "id": "7241520367540836", "method": "purchaseRegister", "params": { "token": "guest@giftoman.ru", "amount": 100, "cart": { "discount": 0, "ts": "2018-03-14T16:39:51.000Z", "cashier": "Марина Ивановна", "extId": "bb802ad3-d268-4946-b80c-b963aaf66b21", "positions": [ { "name": "Пирожок с повидлом", "count": 10, "total": 100, "seller": "Марина Ивановна", "category": "Вкусное" } ] } } }
Успешный ответ
{ "jsonrpc": "2.0", "id": "3061520885622532", "result": { "amount": Зарегистрированная сумма /* Decmial(10,4) */, "id": Идентификатор чека /* Unsigned Int64 */, "ts": Время регистрации /* Y-m-d H:i:sT.000Z ISO 8601 формат */ } }
Запрос позволяет за раз загрузить пакет чеков (максимум = 100)
purchaseRegisterBatch( receipts );
Параметры.
name | type | description |
---|---|---|
receipts | Array of Objects | Объект массива: — amount (decimal(10,4)) : Итоговая сумма по чеку (скидки вычтены) — discount (decimal(10,4)) : Итоговая скидка по чеку — ts ( ISO 8601: YYYY-MM-DDThh:mm:ss±hh:mm) : Точное время чека. Необходимо обязательно передавать метку времени с корректным смещением ±hh от UTC, соответствующим временному поясу торговой точки. — cashier (string(200)) : Имя продавца — extId (string(40)): Идентификатор чека в ТС — positions (array) : [ Товарные позиции в чеке { — name (string(200)) : Название товара — count (decimal(10,4)) : Кол-во товара — total (decimal(10,4)) : Общая сумма по позиции — seller (string(200)) : Продавец для конкретной позиции — category (string(200)) : Название категории товара (Можно передать несколько категорий в строке, разделяя ‘&&’) — extId (string(40)) : Внешний идентификатор товара (Артикул) },.. ] — attributes (array) : [ Массив свободных атрибутов чека (карты лояльности, платёжные системы и т.п.) { — name (string(10)) : Название атрибута (английские мнемоники), — value (decimal(10,4)) : Значение атрибута },.. ] — poskey (string(130) Ключ маппинга к устройству или торговой точке. — Общий формат: @store_ext_id/cashbox_ext_id — store_ext_id — Внешний идентификатор торговой точки, передаваемый в методе setCashbox() в аргументе метода extid — Пример: @111/123 |
agent | name: agent STRING , //наименование ПОversion : agent Version , //версия ПО |
Пример
{ "jsonrpc": "2.0", "id": "7241520367540836", "method": "purchaseRegisterBatch", "params": { "receipts": [ { "amount": 100, "discount": 0, "ts": "2018-03-14T16:39:51.000Z", "cashier": "Марина Ивановна", "extId": "bb802ad3-d268-4946-b80c-b963aaf66b21", "positions": [ { "name": "Пирожок с повидлом", "count": 10, "total": 100, "seller": "Марина Ивановна", "category": "Вкусное", "extId": "10002346" } ] }, { "amount": 250, "discount": 0, "ts": "2018-03-14T16:55:01.000Z", "cashier": "Илона Давыдовна", "extId": "34c39902-5554-4be3-a3b2-042c3e2a6262", "positions": [ { "name": "Пирожок с повидлом", "count": 15, "total": 150, "seller": "Илона Давыдовна", "category": "Вкусное", "extId": "1066" } ], "poskey": "@111/123" } ], "agent": { "name": "Centrum", "version": "10.2.60.0" } } }
Успешный ответ
{ "jsonrpc": "2.0", "id": "3061520885622532", "result": { "count" : Кол-во зарегистрированных чеков /* Unsigned INT */ } }
Ошибка обработки чека
{ "jsonrpc": "2.0", "id": "3061520885622532", "error": { "message": "Текст ошибки", "code" : "Код ошибки", "receipt": { "amount":100, "discount":0, "ts": "2018-03-14T16:39:51.000Z", "cashier": "Марина Ивановна", "extId": "bb802ad3-d268-4946-b80c-b963aaf66b21", "positions": [ { "name": "Пирожок с повидлом", "count" : 10, "total" : 100, "seller": "Марина Ивановна", "category": "Вкусное" } ] } } }
С помощью этого запроса можно как установить, так и удалить плановое значение на нужный период.
Планы устанавливаются на ту Торговую точку, где зарегистрировано данное устройство.
planSet( metric, plan, year [, month, day, day_corr_plan ] );
Параметры.
name | type | description |
---|---|---|
metric | string(40) | Мнемоника, либо прямой идентификатор правила: — income : Выручка — average : Средний чек — count : Кол-во продаж — category : Выручка по СТМ — complexity : Комлексность чека по кол-ву товаров — p/ <идентификатор показателя> — прямой идентификатор показателя |
plan | DECIMAL(13,4) | Если >=0, то установка планового значения = plan, если <0, то удаление |
year | int | Год |
month (необязательный) | int | Месяц, если не указан или = -1, то выставляется план на год |
day (необязательный) | int | День, если не указан или = -1, то выставляется план на месяц, иначе — на день |
day_corr_plan (необязательный) | DECIMAL(13,4) | Коррекционное значение плана на день (если указан день) |
Параметры ответа
result: { "addressId" : ИД торговой точки, "metric": Идентификатор показателя, "plan": Установленный план, "year": Год, "month" : Месяц, "day": День}
После установки всех плановых значений на период необходимо вызвать метод публикации плана для актуализации значений
planPublish( auto );
Параметры.
name | type | description |
---|---|---|
auto | boolean | — true — Использовать сервисную аналитику распределения по периодам. — false — Не использовать аналитику (равномерное распределение по нижним периодам) |
Параметры ответа
result: { "addressId" : ИД торговой точки, "auto": Автоматическое распределение}
Для получения планов по Торговой точке используется команда reports(id [,params])
reports(id [, params ] );
Параметры.
name | type | description |
---|---|---|
id | string(20) | — ‘metrics’ — Получение общего отчёта «Показатели» — ‘bysellers’ — Получение отчёта «Продавцы» — ‘bytradepoints’ — Получение отчёта «Рейтинг торговых точек» |
params | object | { «filter»: { } , «range» : [ { «type»: <id периода>, «from»: «Y-m-d H:i», «to»:»Y-m-d H:i»},.. ] |
Пример запроса metrics
{ "id":"1251506945251332", "method":"reports", "params":{ "id":"metrics", "params": { "range" : [{"type":"month","from":"2018-04-01", "to":"2018-04-31 23:59"},{"type":"day","from":"2018-04-17","to":"2018-04-17 23:59:59"}]} }, "jsonrpc":"2.0" }
Пример ответа
{ "jsonrpc": "2.0", "id": "1251506945251332", "result": { "data": { "month": { // Отчёт по запросу params.range.type == 'month' "metrics": { // Список метрик "id": "3656",//string "store_ext_id": "0",//string "name": "Тюмень, 50 лет ВЛКСМ, 63 Шаурма",//string "metrics": [ { "id": "1437627895975735595", // Уникальный идентификатор метрики : string "name": "Выручка", //Название правила : string "order": 0, // Порядок сортировки, рекомендуемой настройками аккаунта : short "type": 1, // Клиенсткий тип данных 1 = Числовой, 2 = денежный, 3 = процентный : short "fact": 401628, // Фактическое значение : double "plan": 19999.9980, // Плановое значение на конец дня : double "planhour": 0, //План на текущий час : double "predict": 0, // Прогноз на конец дя double "qty": 2287.0000 //Кол-во продаж : float }, { "id": "1437627895975735596", "name": "Средний чек", "order": 1, "type": 2, "fact": 175.61, "plan": 0, "planhour": 0, "predict": 0, "qty": 2287.0000 }, { "id": "1437627895975735664", "name": "Наполняемость", "order": 2, "type": 3, "fact": 2, "plan": 0, "planhour": 0, "predict": 0, "qty": 2269.0000 } ] } }, "day": { // Отчёт по запросу params.range.type == 'day' "metrics": { "id": "3656", "store_ext_id": "0", "name": "Тюмень, 50 лет ВЛКСМ, 63 Шаурма", "metrics": [ { "id": "1437627895975735595", "name": "Выручка", "order": 0, "type": 7, "fact": 24672, "plan": 19999.9980, "planhour": 0, "predict": 0, "ratio": 1.2336, "qty": 141.0000 }, { "id": "1437627895975735596", "name": "Средний чек", "order": 1, "type": 2, "fact": 174.98, "plan": 0, "planhour": 0, "predict": 0, "ratio": 1, "qty": 141.0000 }, { "id": "1437627895975735664", "name": "Наполняемость", "order": 2, "type": 3, "fact": 2.32, "plan": 0, "planhour": 0, "predict": 0, "ratio": 1, "qty": 140.0000 } ] } } } } }
Пример запроса bysellers
{ "id":"1251506945251332", "method":"reports", "params":{ "id":"bysellers", "params": { "range" : [{"type":"month","from":"2018-04-01", "to":"2018-04-31 23:59"},{"type":"day","from":"2018-04-17","to":"2018-04-17 23:59:59"}]} }, "jsonrpc":"2.0" }
Пример ответа
{ "jsonrpc": "2.0", "id": "1251506945251332", "result": { "data": { "month": { "bysellers": { "common": [ // Суммарные (общие) показатели { "id": "1437627895975735595", // Идентификатор показателя : string "idx": "1", // Связующий идентификатор показателя общей статистики и по продавцу : string "order": 1, // Рекомендуемая аккаунтом сортировка : short "label": "Выручка", // Название показателя : string "type": 2, // Клиенсткий тип данных 1 = Числовой, 2 = денежный, 3 = процентный : short "fact": 1509878, // Общее фактическое значение : double "plan": 1269999.847, // Общее плановое значение : double "qty": 8604, // Кол-во продаж }, { "idx": "2", "order": 2, "label": "Средний чек", "type": 2, "id": "1437627895975735596", "fact": 175.48617001395, "plan": 0, "qty": 8604 }, { "idx": "3", "order": 3, "label": "Наполняемость", "type": 1, "id": "1437627895975735664", "fact": 1.948460758605, "plan": 0, "qty": 8542 } ], "sellers": [ // Показатели по продавцам { "name": "Конищева Мария Андреевна", "id": "1514522702289725696", "metrics": [ { "idx": "1", "order": 1, "label": "Выручка", "type": 2, "fact": 435286, "plan": 0, "qty": 3893 }, { "idx": "2", "order": 2, "label": "Средний чек", "type": 2, "fact": 180.6921384807, "plan": 0, "qty": 2409 }, { "idx": "3", "order": 3, "label": "Наполняемость", "type": 1, "fact": 2.03098048983, "plan": 0, "qty": 2409 } ] }, { "name": "Поступинских Анна Владимировна", "id": "1517977472394792448", "metrics": [ { "idx": "1", "order": 1, "label": "Выручка", "fact": 320182, "plan": 0, "qty": 2785 }, { "idx": "2", "order": 2, "label": "Средний чек", "fact": 171.95656831364, "plan": 0, "qty": 1862 }, { "idx": "3", "order": 3, "label": "Наполняемость", "fact": 1.841699194415, "plan": 0, "qty": 1862 } ] } ] } }, "day": { "bysellers": { "common": [ { "idx": "1", "order": 1, "label": "Выручка", "id": "1437627895975735595", "fact": 24672, "plan": 19999.998, "qty": 141 }, { "idx": "2", "order": 2, "label": "Средний чек", "id": "1437627895975735596", "fact": 174.9786, "plan": 0, "qty": 141 }, { "idx": "3", "order": 3, "label": "Наполняемость", "id": "1437627895975735664", "fact": 2.3224, "plan": 0, "qty": 140 } ], "sellers": [ { "name": "Конищева Мария Андреевна", "id": "1514522702289725696", "metrics": [ { "idx": "1", "order": 1, "label": "Выручка", "fact": 24704, "plan": 0, "qty": 255 }, { "idx": "2", "order": 2, "label": "Средний чек", "fact": 176.4569, "plan": 0, "qty": 140 }, { "idx": "3", "order": 3, "label": "Наполняемость", "fact": 2.3224, "plan": 0, "qty": 140 } ] } ] } } } } }
Данный метод позволяет сформировать запрос о времени открытии и закрытии торговой точки
regısterEvent (name,ts [,params])
Параметры.
name | type | description |
---|---|---|
name | string(32) |
‘shift/start’ начало смены ‘shift/stop’ конец смены |
ts | decimal(10,4) |
‘shift/start’, ‘Y-m-d H:i:s’ /*Локальное время начала смены*/ ‘shift/stop, ‘Y-m-d H:i:s’ /*Локальное время конца*/ |
params | decimal(10,4) |
в params можно передавать массив метаданных: — seller : string ФИО — localtimezone: offset +/- hours |
Пример запроса regısterEvent
Успешный ответ