Jupiter.JPOS API

Формат заказа ORDER_JSON


Примеры


 

{
    "uid":"e52e8d81-631e-4615-b35f-c16cf7cc29ca",        // Уникальный ID заказа
    "num":"4",                                           // Внутренний или порядковый номер заказа
    "date":"2019-09-02 15:19:30",                        // Дата рабочего дня
    "hour":"15",                                         // Час, когда заказ открыт. Нужно только для ЛК
    "day_week":"Пон",                                    // День недели, по дате рабочего дня.  Нужно только для ЛК
    "open_date":"2019-09-02 15:19:30",                   // Дата/время открытия заказа
    "close_date":"",                                     // Дата/время закрытия заказа (только если заказ закрыт)
    "vid":"Обычный заказ",                               // Вид заказа: "Доставка", "На вынос", "Обычный заказ".
    "type":"Заказ",                                      // Тип заказа. "Заказ" или "Возврат"
    "name":"5",                                          // Имя заказа. Например номер стола.
    "source":"Телефон",                                  // Имя источника заказа
    "waiter":"Трофимова В.А.",                           // Имя официанта
    "cashier":"Пикаров Б.К.",                            // Имя кассира
    "sum_rozn":"300",                                    // Розничная сумма заказа. Подитог. Сумма ДО всех скидок\наценок
    "sum_fakt":"270",                                    // Фактическая сумма заказа. Итог. Сумма ПОСЛЕ всех скидок\наценок
    "sum_skidki":"30",                                   // Сумма всех скидок\наценок
    "bonus_nach": "0.00",                                // Сумма "Сколько начислено бонусов". Нужно только для ЛК
    "bonus_trat": "0.00",                                // Сумма "Сколько потрачено бонусов". Нужно только для ЛК
    "address": "Дмитров, мкр.Маркова, д.19, кв.1",       // Адрес клиента
    "coordinates": "37.527624 56.34734",                 // Координаты дома
    "block_change": "0",                                 // Признак "Товарная часть документа, закрыта для изменений". 1 - да, 0 - нет
    "client": {
        "client_uid": "4:1:0:10221",                     // Уникальный UID клиента внутри Юпитера  
        "id": "8765456",                                 // ID (код) клиента
        "name": "Святослав",                             // Имя клиента
        "card": "1234",                                  // Номер карты клиента
        "bonus": "100"                                   // Кол-во бонусов на счете клиента
    },
    "order_line":[                                       
        {
            "uid":"183",                                 // Уникальный ID строки
            "date":"2019-09-02 15:19:30",                // Дата рабочего дня. Нужно только для ЛК
            "product_uid":"3:77:0:6286",                 // UID товара
            "product_code":"3233",                       // Код товара
            "product_tax":"0",                           // Ставка НДС (20,10,0)
            "product":"ПИЦЦА 4 СЫРА",                    // Имя товара. Нужно только для ЛК
            "group":"",                                  // Имя группы товара. Нужно только для ЛК
            "subgroup":"",                               // Имя подгруппы товара. Нужно только для ЛК
            "price_rozn":"250",                          // Розничная цена товара. Цена ДО всех скидок\наценок. Без учета стоимости модификаторов.
            "price_fakt":"225",                          // Фактическая цена товара. Цена ПОСЛЕ всех скидок\наценок. Без учета стоимости модификаторов.
            "quantity":"1",                              // Количество по строке
            "sum_rozn":"250",                            // Розничная сумма по строке. Сумма ДО всех скидок\наценок. Без учета суммы модификаторов.
            "sum_fakt":"225",                            // Фактическая сумма по строке. Сумма ДО всех скидок\наценок. Без учета суммы модификаторов.
            "block_change": "1",                         // Признак "Строка отправлена в производство". 1 - да, 0 - нет
            "selected_modifiers": [                      // Если у строки есть модификаторы, то в массиве перечислены все строки модификаторов. 
                {                                        // Формат строки модификаторов идентичен формату строки заказа.
                    "uid":"184",                         
                    "date":"2019-09-02 15:19:30",        
                    "product_uid":"3:77:0:9999",         
                    "product":"ДОП СЫР",                 
                    "group":"",                          
                    "subgroup":"",                       
                    "price_rozn":"50",                   
                    "price_fakt":"45",                   
                    "quantity":"1",                      // Количество по строке модификатора. Указывается без учета кол-ва в базовой строке.
                    "sum_rozn":"50",                     
                    "sum_fakt":"45"                      
                }
            ] 
        }
    ],
    "order_discounts": [                                 // Скидки\наценки по заказу
        {
            "date": "2019-09-02 15:19:30",               // Дата рабочего дня. Нужно только для ЛК
            "name": "Скидка 10%",                        // Наименование скидки\наценки
            "sum": "30.00"                               // Сумма скидки\наценки. Если наценка, то со знаком -
        }
    ],
    "order_payment": [                                   // Оплаты по заказу
        {
            "uid": "5:62:0:99650",                       // Уникальный UID документа оплаты. Нужно только для ЛК
            "id": "1",                                   // Номер оплаты в чеке
            "date": "2019-09-02 15:19:30",               // Дата рабочего дня. Нужно только для ЛК
            "name": "РУБЛИ ЗАЛ",                         // Имя вида оплаты
            "pay_type_uid": "2:1:0:24",                  // UID вида оплаты
            "cash": "1",                                 // Признак нал\безнал. 0 - безна, 1 - нал. Нужно только для ЛК
            "sum": "270.00",                             // Сумма оплаты (без сдачи)
            "change": "30.00"                            // Сумма сдачи
        }
    ]
}

 

Добавить клиента в заказ add_client_to_order


Описание

  • JPOS запрашивает у пользователя идентификатор клиента. На данный момент это может быть только специальный код для внешнего приложения.
  • Далее JPOS отправляет в Юпитер запрос add_client_to_order, где передает этот идентификатор клиента.
  • Юпитер, получает запрос. Выполняет поиск клиента. Добавляет клиента в заказ, применят все его скидки\бонусы.
  • Юпитер возвращает в JPOS обновленный заказ

Примеры

Запрос

{
    "command": "add_client_to_order",
    "user_id": "4:1:0:14",                                 // ID сотрудника в Юпитере. Получается командой get_user_id.
    "serverId": "25162093",                                // SERVER_ID с которого отправляется запрос.
    "client_id": "1234",                                   // Идентификатор клиента, который вводится пользователем в JPOS.
    "order_uid": "ac09d9d8-c206-4291-bd3f-e59c46f71b42"    // ID заказа, в который нужно добавить клиента
}

Ответ успех

{
    "status": "ok",
    "order": {Заказ в формате ORDER_JSON}
}

Ответ ошибка

{
    "status": "error",
    "message": "Клиент не найден"
}

 

Создать новый заказ add_new_order


Описание

  • JPOS отправляет в Юпитер все заказы.
  • Юпитер принимает данные, определяет это новый заказ или нет.
  • Если заказ не новый, то Юпитер обновляет данные заказа. Добавляет в заказ, те строки, которых у него нет. Проверка какие строки есть выполняется по id строк.
  • Если заказ новый, то Юпитер создает его и применяет к нему все возможные автоматические скидки.
  • Печатает заказ на кухню.
  • 2019-10-17 Добавил загрузку закрытого заказа. Если в запросе add_new_order в поле close_date стоит дата, то заказ считается закрытым и Юпитер выполняет у себя необходимые действия по закрытию заказа. ВАЖНО перед тем как присылать в Юпитер закрытый заказ, JPOS должен хотя бы 1 раз отправить запрос add_new_order пока заказ открыт. Это нужно, чтобы к заказу применились скидки и он распечатался на кухню.

Примеры

Запрос

{
    "command":"add_new_order",
    "serverId":"25162093",                               // SERVER_ID с которого отправляется запрос
    "user_id":"4:1:0:14",                                // ID сотрудника в Юпитере.
    "order": {Заказ в формате ORDER_JSON}
}

Ответ успех

{
    "status": "ok",
    "order": {Заказ в формате ORDER_JSON}
}

Ответ ошибка

{
    "status" : "error",
    "message" : "Не найден открытый рабочий день"
}

 

Получить список закрытых заказов get_closed_orders


Описание

  • На вход получает массив id всех заказов, которые есть в JPOS.
  • Находит серди них те заказы, которые были закрыты в Юпитере и возвращает массив с их id.
  • 2019-11-26 Теперь возвращает еще и список всех открытых заказов (open_orders), которые есть в Юпитере, для сотрудника указанного в запросе (user_id)

Примеры

Запрос

{
    "command": "get_closed_orders",
    "serverId": "25162093",
    "user_id": "4:1:0:14",
    "orders": ["ac09d9d8-c206-4291-bd3f-e59c46f71b4c", "ac09d9d8-c206-AS291-bd3f-e59c46f71b4c"]
}

Ответ успех

{
    "status": "ok",
    "closed_orders": ["ac09d9d8-c206-4291-bd3f-e59c46f71b4c", "ac09d9d8-c206-AS291-bd3f-e59c46f71b4c"],
    "open_orders": [{
        "uid": "11111-22222-aaaaaa-3333-asdas1",
        "open_time": "15:19",
        "name": "5",
        "sum_fakt": "270"
    }, {
        "uid": "ggggg-22222-33333-4444-5555555",
        "open_time": "15:49",
        "name": "6",
        "sum_fakt": "1000"
    }]
}

 

Получение настроек (меню)


Описание

JPOS получает настройки торговой точки (меню) с облачного сервера. Для этого:

  • JPOS периодически обращается к серверу, для проверки необходимости обновить настройки.
  • Если сервер сообщает, что есть данные для обновления, то JPOS посылает запрос на получение настроек
  • В настройках есть "дата настроек", которую JPOS сохраняет и использует в запросах проверки обновлений
  • POST запросы на адрес https://jupiter.report/jpos/index.php
  • В меню передается иерархическое дерево раскладок, как в Юпитере. В раскладке может быть два вида кнопок, кнопка с товаром и кнопка для перехода на другую раскладку

Проверка обновления checkUpdate

Примеры

Запрос

    {
    "command":"checkUpdate",                    // Константа 
    "server_id":"12345678",                     // server_id JPOS
    "date_from_request":"date_from_request",    // Дата настроек в JPOS
    }

Ответ успех. Есть данные для обновления:

    {
    "status": "ok",                             // Признак успешного выполнения запроса
    "update": "yes"                             // Признак, что есть данные для обновления
    }

Ответ успех. Обновление не требуется.

    {
    "status": "ok",                             // Признак успешного выполнения запроса
    "update": "no"                              // Признак, что обновление не требуется
    }

Ответ ошибка

    {
    "status": "error",                          // Признак, что при выполнении запроса была ошибка
    "message": "SERVER_ID не зарегистрирован"   // Описание ошибки
    }

Запрос настроек getTT


Примеры

Запрос

    {
    "command":"getTT",                          // Константа
    "serverId":"12345678",                      // server_id JPOS
    }

Ответ успех

    {
      "status": "ok",                             // Признак успешного выполнения запроса
      "data": {                                   // Блок с данными торговой точки
        "id": "1",                                // id торговой точки в облаке
        "name": "Торговая точка",                 // Название торговой точки
        "print_header": ""                        // Строка (заголовок) для печати в чеке\счете
      },
      "menu": {                                   // Блок с меню
        "settingsDate": "2020-10-09 15:37:59",    // Дата настроек
        "menuSections": [                         // Массив всех разделов меню (раскладок)
          {
            "name": "ОСНОВНОЕ МЕНЮ",              // Название раскладки
            "uid": "5:99:0:59541",                // Уникальный id раскладки
            "type": "",                           // ???
            "is_button": 0,                       // Признак, что это кнопка с товаром
            "is_main": 1,                         // Признак, что это главная (начальная) раскладка
            "is_modifier": 0,                     // Признак, что это группа модификаторов
            "buttons": [                          // Массив кнопок раскладки
              {
                "is_button": 0,                   // Признак, что это кнопка с товаром
                "is_main": 0,                     // Признак, что это главная (начальная)
                "is_modifier": 0,                 // Признак, что это группа модификаторов
                "name": "СЕТЫ",                   // Название кнопки
                "type": "",
                "uid": "5:1:0:247"                // id объекта кнопки, в данном случае другой раскладки
              },
              {
                "is_button": 0,
                "is_main": 0,
                "is_modifier": 0,
                "name": "ГРАНД СЕТЫ",
                "type": "",
                "uid": "5:98:0:1328445"
              },
              {
                "name": "ПЛАТНЫЕ ПАЛОЧКИ БАМБУКОВЫЕ ШТ",    // Название кнопки
                "uid": "3:98:0:355541",                     // id объекта кнопки, в данном случае id товара
                "type": "product",
                "is_button": 1,                             // Признак, что это кнопка с товаром
                "is_main": 0,                               // Признак, что это главная (начальная)
                "options": {                                // Блок с параметрами товара
                  "code": "940",                            // Код товара 
                  "price": 5,                               // Цена товара
                  "tax": "no_tax",                          // Ставка НДС (10,20,no_tax)
                  "modifiers": [],                          // Массив с модификаторами
                  "show_modifiers_always": 0,               // Признак, что нужно всегда предлагать выбор модификаторов
                  "max_weight_summ": null,                  // Максимальный общий вес модификаторов
                  "action": "",
                  "group_name": "13.ТОВАРЫ франшиза",       // Название товарной группы
                  "subgroup_name": "РАЗНОЕ",                // Название товарной подгруппы
                  "image": "",                              // Ссылка на картинку с товаром
"description": "Столовый прибор в Азии" // Описание для меню из карточки ТМЦ } } ] }, { "name": "СЕТЫ", "uid": "5:1:0:247", "type": "", "is_button": 0, "is_main": 0, "is_modifier": 0, "buttons": [ { "name": "СЕТ 1 КГ РОЛЛОВ", "uid": "3:98:0:1182438", "type": "product", "is_button": 1, "is_main": 0, "options": { "code": "1681", "price": 699, "tax": "no_tax", "modifiers": [], "show_modifiers_always": 0, "max_weight_summ": null, "action": "", "group_name": "01.СЕТЫ", "subgroup_name": "АКЦИОННЫЕ СЕТЫ", "image": "",
"description": "" } }, { "name": "ХИТ", "uid": "3:1:0:79", "type": "product", "is_button": 1, "is_main": 0, "options": { "code": "F2132DE00B", "price": 499, "tax": "no_tax", "modifiers": [ "5:98:0:1256108", "5:99:0:23409", "5:98:0:1087161" ], "show_modifiers_always": 1, "max_weight_summ": null, "action": "", "group_name": "01.СЕТЫ", "subgroup_name": "СЕТЫ", "image": "" } }, { "is_button": 0, "is_main": 0, "is_modifier": 0, "name": "ЕЩЁ СЕТЫ", "type": "", "uid": "5:98:0:1328444" } ] }, { "name": "СУШИ", "uid": "5:1:0:256", "type": "", "is_button": 0, "is_main": 0, "is_modifier": 0, "buttons": [ { "name": "СУШИ УГОРЬ", "uid": "3:1:0:178", "type": "product", "is_button": 1, "is_main": 0, "options": { "code": "D3194D6AA7", "price": 49, "tax": "no_tax", "modifiers": [], "show_modifiers_always": 0, "max_weight_summ": null, "action": "", "group_name": "04.СУШИ", "subgroup_name": "СУШИ", "image": "",
"description": "" } } ] }, { "name": "ЕЩЁ СЕТЫ", "uid": "5:98:0:1328444", "type": "", "is_button": 0, "is_main": 0, "is_modifier": 0, "buttons": [ { "is_button": 0, "is_main": 0, "is_modifier": 0, "name": "СЕТЫ", "type": "", "uid": "5:1:0:247" } ] } ], "payment": [ // Массив c раскладками оплаты { "cash": "no", // Признак наличной оплаты (yes\no) "fiscal_num": 0, // Номер фискального вида оплаты. 0 - нефискальная оплата "type": "paymentBonus", "name": "Баллы", // Название вида оплаты "uid": "paymentBonus" // uid вида оплаты } ], "modifiersSections": [ // Массив с группами модификаторов { "name": "Для Лапши допы", "uid": "5:98:0:438315", "type": "", "is_button": 0, "is_main": 0, "is_modifier": 1, "is_auto_modifier": 0, // Признак Группа автоматических модификаторов "weight_min": 0, // Минимальный вес модификаторов для выбора "weight_max": 10, // Максимальный вес модификаторов для выбора "buttons": [ { "name": "АВОКАДО 10г", "uid": "3:99:0:31632", "type": "product", "is_button": 1, "is_main": 0, "options": { "code": "FCB50AD3F", "price": 49, "tax": "no_tax", "modifiers": [], // У модификатора не может быть модификаторов "action": "", "group_name": "13.ТОВАРЫ франшиза", "subgroup_name": "ЛИШНЕЕ", "quantity": "1", "weight": 1, // Вес модификатора "image": "",
"description": "" } }, { "name": "ЛОСОСЬ 25г", "uid": "3:99:0:53026", "type": "product", "is_button": 1, "is_main": 0, "options": { "code": "667", "price": 59, "tax": "no_tax", "modifiers": [], "action": "", "group_name": "13.ТОВАРЫ франшиза", "subgroup_name": "ЛИШНЕЕ", "quantity": "1", "weight": 1, "image": "",
"description": "" } } ] }, { "name": "ГАРНИРЫ СЕТЫ", "uid": "5:98:0:1256108", "type": "", "is_button": 0, "is_main": 0, "is_modifier": 1, "is_auto_modifier": 1, "weight_min": null, "weight_max": null, "buttons": [ { "name": "Соевый соус фасованный 30г.", "uid": "3:99:0:34145", "type": "product", "is_button": 1, "is_main": 0, "options": { "code": "658", "price": 0, "tax": "no_tax", "modifiers": [], "action": "", "group_name": "07.ДОПОЛНИТЕЛЬНО", "subgroup_name": "ГАРНИРЫ", "quantity": "2", "weight": 1, "image": "",
"description": "" } }, { "name": "Имбирь фасованный 30г.", "uid": "3:99:0:34144", "type": "product", "is_button": 1, "is_main": 0, "options": { "code": "657", "price": 0, "tax": "no_tax", "modifiers": [], "action": "", "group_name": "07.ДОПОЛНИТЕЛЬНО", "subgroup_name": "ГАРНИРЫ", "quantity": "1", "weight": 1, "image": "",
"description": "" } } ] } ] } }

Ответ ошибка

    {
    "status": "error",                          // Признак, что при выполнении запроса была ошибка
    "message": "SERVER_ID не зарегистрирован"   // Описание ошибки
    }

 

Авторизация сотрудника get_user_id


Описание


  • JPOS запрашивает у пользователя код авторизации и передает его в Юпитер.
  • Юпитер выполняет поиск сотрудника по полученному коду авторизации. Поиск происходит по коду+паролю и дорожке магнитной карты.
  • Если сотрудник найден, то Юпитер возвращает его UID

Примеры


Запрос

{
  "command": "get_user_id",
  "serverId": "5123123",
  "password": "11112"           // Пароль который вводится пользователем в JPOS
}

Ответ успех

{
    "status": "ok",
    "user_id": "4:1:0:14",
    "workday_id": "5:3:0:747531"  // UID рабочего дня в Юпитере
}

Ответ ошибка

{
    "status": "error",
    "message": "Пользователя с таким паролем не существует"
}

 

Блокировка заказа lock_order


Описание


  • Перед тем как открыть заказ на редактирование JPOS отправляет в Юпитер запрос lock_order
  • Юпитер проверяет можно ли открыть заказ на редактирование и если можно, то устанавливает блокировку на заказ.

Проверяет:

  • Что заказ не закрыт
  • Что в заказе не закрыта товарная часть (еще не печатали счет)
  • Что заказ не редактируется на другом рабочем месте (именно другом!)

Особенности блокировки:

  • В качестве рабочего места записывается UID сотрудника (4:1:0:14)
  • В расширенном протоколе запись о блокировке помечается, что блокировка от JPOS
  • Если в системе нет заказа с переданным id, то вернет успех

Если заказ можно открыть на редактирование, то Юпитер возвращает заказ в формате ORDER_JSON. 

Особенности возврата заказа:

  • Если в заказ не прописан id заказа JPOS, то возвращает uid заказа из Юпитера
  • В поле kod передает внутренний код заказа в Юпитере
  • В поле status передает closed если заказ закрыт, во всех других случаях open
  • Т.к. формат не предусматривает передачи модификаторов, модификаторы передаются как обычные товарные строки
  • В поле summa для оплаты попадает сумма оплаты без сдачи. Чтобы рассчитать сумму полученных денег нужно сложить summa и change

Примеры

Запрос

    {
        "command":"lock_order",
        "user_id":"4:1:0:14",
        "order_uid":"ac09d9d8-c206-4291-bd3f-e59c46f71b42"
    }

Ответ успех

    {
        "status" : "ok",
        "order" : {Заказ в формате ORDER_JSON}
    }

Ответ ошибка

    {
        "status" : "error",
        "message" : "Пользователь с таким id не существует"
    }

 

Печать счета print_bill


Описание


Делает тоже самое что и add_new_order, только еще печатает счет

Запрос и ответы точно такие же как и в add_new_order (только command = print_bill)

 

Разблокировка заказа unlock_order


Описание


  • Перед выходом из заказа, JPOS отправляет в Юпитер запрос unlock_order.
  • Если переданный заказ заблокирован указанным сотрудником, то Юпитер снимает блокировку с заказа.

Примеры

Запрос

    {
        "command":"unlock_order", 
        "user_id":"4:1:0:14", 
        "order_uid":"ac09d9d8-c206-4291-bd3f-e59c46f71b42"
    }

Ответ успех

    {
        "status" : "ok"
    }

Ответ ошибка

    {
        "status" : "error",
        "message" : "Пользователь с таким id не существует"
    }

 

 


Система JUPITER                                 www.jupiter.systems                                 (с) 2024г.