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 - нет
            "guest": 1, // Привязка строки к гостю. null если привязки нет
          	"course": 1, // Курс приготовления. null если курс не задан
            "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)
  • 2026-02-03 Возвращает список всех открытых заказов, а не только текущего сотрудника. Какие заказы доступны пользователю JPOS определяет сам (T171928).

Примеры

Запрос

{
  "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": [ // Список ID заказов, которые есть в JPOS и были закрыты в Юпитере
    "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", // Сумма заказа (после скидок)
      "user_id": "4:1:0:14", // id сотрудника (официанта)
      "user_name": "Трофимова В.А." // Имя сотрудника (официанта)
    },
    {
      "uid": "ggggg-22222-33333-4444-5555555",
      "open_time": "15:49",
      "name": "6",
      "sum_fakt": "1000",
      "user_id": "4:1:0:55",
      "user_name": "Абакумов Г.О."
    }
  ]
}

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

Описание

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г.