Технічний довідник інтегратора

Syrve Server API

Повний опис серверного REST API Syrve RMS і Syrve Chain: авторизація, номенклатура, склад, каса, персонал, звіти та OLAP.

REST API v1 + v2 Syrve RMS / Chain Версії 3.9 → 9.x XML та JSON

01Швидкий старт

Чотири кроки, щоб отримати перші дані з сервера.

1. Порахувати SHA1 від пароля

Сервер приймає не пароль, а його SHA1-хеш у нижньому регістрі hex.

# bash
printf "myPassword" | sha1sum

# PowerShell
$p   = "myPassword"
$sha = [System.Security.Cryptography.SHA1]::Create()
$h   = $sha.ComputeHash([Text.Encoding]::UTF8.GetBytes($p))
($h | ForEach-Object { $_.ToString("x2") }) -join ""

2. Отримати токен

GET/resto/api/auth?login=[login]&pass=[sha1]
https://localhost:8080/resto/api/auth?login=admin&pass=2155245b2c002a1986d3f384af93be813537a476

# Відповідь — просто рядок:
b354d18c-3d3a-e1a6-c3b9-9ef7b5055318

3. Викликати будь-який метод із key

https://localhost:8080/resto/api/corporation/departments?key=b354d18c-3d3a-e1a6-c3b9-9ef7b5055318

4. Обов'язково вийти

GET/resto/api/logout?key=[token]

Звільняє слот ліцензії. Без цього наступна авторизація може впасти з помилкою.

Порт

Типовий порт Syrve Server — 8080 або 9080. В офіційних прикладах трапляються обидва; у вашій інсталяції дивіться resto.properties або адресний рядок бек-офісу.

02Базові принципи

Дві гілки API

ГілкаПрефіксФорматКоли використовувати
v1/resto/api/…переважно XMLСтарі методи: документи, звіти, події, співробітники, постачальники
v2/resto/api/v2/…переважно JSONУсе нове: номенклатура, довідники, OLAP v2, каса, залишки

Гілки співіснують: одна інтеграція спокійно користується обома. Токен спільний.

Як передавати токен

  • параметром key=… у query-рядку — працює завжди;
  • cookie з іменем key — з версії 4.3 сервер сам ставить цю cookie після /auth.

Створення і зміна сутностей

МетодContent-TypeПоведінка
POSTapplication/x-www-form-urlencodedЧасткове оновлення: передаєте лише ті поля, які змінюєте. Решта лишається як була.
PUTapplication/xmlТіло запиту — сама сутність. Поля, відсутні в тілі, отримають значення за замовчуванням при створенні і збережуть свої значення при оновленні.
  • Успішне створення → HTTP 201 Created.
  • Успішне оновлення → HTTP 200 OK.
  • Окрема сутність — XML-документ; список сутностей — XML-документ, кореневий елемент якого містить елементи-сутності.
Позначення в довіднику

Порожня плашка GET — метод лише читає дані. Залита POST, PUT або DELETE — метод змінює дані на сервері.

Кирилиця в JSON

Якщо передаєте українські символи в тілі JSON (наприклад, коментар до вилучення), явно вказуйте Content-Type: application/json;charset=UTF-8 — інакше текст поб'ється.

Формати дат

ФорматДе зустрічається
yyyy-MM-ddБільшість методів v2: dateFrom, dateTo, from, to
yyyy-MM-ddTHH:mm:ssМітки часу балансів, dateIncoming у документах
yyyy-MM-ddTHH:mm:ss.SSSПодії, фільтри за датою в OLAP
DD.MM.YYYYСтарі звіти v1 і завантаження накладних (dateIncoming, dueDate)

dd.MM.yyyy у v2 формально приймається, але не рекомендується — використовуйте ISO.

03Авторизація і ліцензійні слоти

GET/resto/api/auth?login=[login]&pass=[sha1passwordhash]
ПараметрОпис
loginЛогін користувача бек-офісу
passSHA1-хеш пароля (hex, нижній регістр)

У відповіді: рядок-токен. Його треба передавати в кожному наступному запиті — як cookie key або як параметр key.

GET/resto/api/logout?key=[token]

Завершує сесію і звільняє слот ліцензії. Працює і з cookie key без параметра.

Один слот на сесію

Кожна авторизація займає слот ліцензії API. Токен живе, доки не перестане працювати. Якщо ліцензія на сервері одна, а токен ви вже отримали — наступний запит на авторизацію поверне помилку.

Практика: або зберігайте токен і перевикористовуйте його, або обов'язково викликайте /logout після роботи. Найгірший сценарій — авторизуватися в циклі й не виходити.

Час життя сесії

Типовий таймаут — 1 година від входу або від останнього запиту. Оновлення токена в REST API v1/v2 не реалізовано, тому після 401 просто авторизуйтеся заново.

Права доступу

Права перевіряються за користувачем, під яким ви увійшли. Найчастіші вимоги:

Код праваНазваПотрібне для
B_ADMАдміністрування системиНалаштування підприємства
B_ENРедагування номенклатурних довідниківЕкспорт та імпорт номенклатури
B_VTJПереглядати журнал подійAPI подій
B_QMENUПереглядати швидке менюAPI швидкого меню
B_APIOПереглядати типи внесень/вилученьДовідник payInOutTypes
F_APIOАвторизовувати касові внесення і вилученняВиконання вилучень

04Помилки

Будь-який метод v1 або v2 замість очікуваної відповіді може повернути помилку з тілом text/plain.

КодЗначенняЩо робити
400Помилка в запиті: не той тип параметра, помилка десеріалізації, неповні дані. Wrong date format: 2019-0513 15:26, Malformed Product id: ''Виправити запит
401Не автентифіковано: не передано key, минув таймаут сесії, сервер перезавантажився або ще стартує й не може перевірити парольАвторизуватися заново
403Доступ заборонено: немає ліцензії на цей модуль API (Module %s is blocked within current license), вичерпано кількість підключень (License enhancement is required: no connections available for module %s), бракує права (Permission denied)Показати користувачеві. Текст не локалізований
404Об'єкт не знайдено або некоректний шляхПовідомити користувача чи розробника
409Помилка бізнес-логіки. Сервер повертає повідомлення для людини: «Доступ заборонено КОД_ПРАВА», «Операція створює прихід на від'ємні залишки…», «У вас немає права змінювати документи заднім числом», «Неможливо створити накладну зі складами, що належать різним підрозділам» — і сотні іншихПоказати текст користувачеві як є
500Внутрішня помилка: product == null, java.net.SocketException: Connection reset, Operation is allowed only in %s's thread, One product expected for article=%s but %d foundЗалогувати, за потреби — звернення в підтримку

Як читати тіло помилки

  • Тіло Content-Type: text/plain — це текст помилки. Показуйте його при 409 і завжди пишіть у власний лог.
  • Тіло text/html — це не помилка Syrve. Це мережева проблема або помилка конфігурації: одрук в URL, збій DNS, налаштування проксі, «порожній» Tomcat без сервера RMS/Chain; рідше — рестарт сервера.
  • Текст може містити обов'язкові переноси рядків — виводьте з white-space: pre-line.
  • Текст не екранований і може містити небезпечні для HTML/JS/SQL символи. Екрануйте самі.
  • Логи сервера (full.log, access.csv) містять більше, ніж бачить клієнт API, — зокрема попередження рівня WARN.

Скільки слотів ліцензії лишилось

GET/resto/api/licence/info?moduleId={moduleId}

Повертає кількість вільних слотів для конкретного ліцензійного модуля, наприклад ?moduleId=28008806. Дату закінчення ліцензії цей метод не повертає.

05Обмеження і поради

Сервер закладу — не хмара. Він одночасно обслуговує каси, і невдалий запит з API здатен його підвісити.

  1. Запити — строго послідовно. Наступний відправляйте лише після того, як завершився попередній. Паралельні виклики не підтримуються.
  2. Період — не більше місяця. Ідеально — день або тиждень.
  3. Вимикайте підсумки. Якщо загальні підсумки в OLAP не потрібні — build-summary=false. Для великих мереж true може підвісити сервер. З версії 9.1.2 значення за замовчуванням і так false.
  4. Не більше 7 полів у побудові OLAP-звіту.
  5. Спочатку демо-сервер. Перевіряйте запити на демо-стенді, а не на робочому сервері клієнта.
  6. Важкі поля — вночі. StartBalance.* і FinalBalance.* в OLAP підсумовують усю таблицю проводок за весь час роботи системи. Для залишків використовуйте окреме API балансів (розділ 16).

06Ревізії та синхронізація

Майже кожен метод-«список» підтримує параметр revisionFrom. Це головний механізм інкрементальної синхронізації: замість того щоб щоразу тягнути весь довідник, ви забираєте лише те, що змінилося.

ПараметрТипПоведінка
revisionFromчислоПовертає сутності з ревізією суворо більшою за вказану. За замовчуванням -1 — тобто повний, неревізійний запит

Правильний цикл синхронізації

  1. Перший запит: revisionFrom=-1 — отримуєте все.
  2. З відповіді запам'ятовуєте поле revision — це максимальна ревізія, доступна для вивантаження на момент запиту.
  3. Наступний запит: revisionFrom={збережена revision} — приходять лише зміни.
  4. Повторюєте.
Для подій — інакше

У журналі подій параметр називається from_rev, і туди треба передавати revision + 1 з попередньої відповіді, бо межа там включна. Також: якщо працюєте за ревізією, не можна вказувати to_time.

Підтримка revisionFrom у більшості методів v1 з'явилася у версії 6.4, у методах v2 — від початку.

07Структура підприємства

Ієрархія підрозділів

GET/resto/api/corporation/departments/

Версія 3.9 · параметр revisionFrom з 6.4 · відповідь: corporateItemDto

Код типуЩо це
CORPORATIONКорпорація
JURPERSONЮридична особа
ORGDEVELOPMENTСтруктурний підрозділ
DEPARTMENTТорговельне підприємство (заклад)
MANUFACTUREВиробництво
CENTRALSTOREЦентральний склад
CENTRALOFFICEЦентральний офіс
SALEPOINTТочка продажу
STOREСклад

Поля corporateItemDto

ПолеОпис
idGUID об'єкта ієрархії
parentIdGUID батьківського об'єкта
codeКод
nameНайменування
typeТип із таблиці вище
taxpayerIdNumberПодатковий номер юрособи (в Україні — ЄДРПОУ / ІПН)
jurPersonAdditionalPropertiesDtoЗ 6.3: розширені реквізити юрособи, зокрема iban і swiftBic — саме те, що потрібне для української звітності

Склади

GET/resto/api/corporation/stores/

Усі склади торговельних підприємств у вигляді corporateItemDto

Групи відділень і точки продажу

GET/resto/api/corporation/groups/

Версія 4.3 · відповідь: groupDto

У групі відділень може бути кілька точок продажу, але головна каса (pointOfSaleDto/main = true) підключається лише до однієї. У Syrve Chain інформація про касу точки продажу (cashRegisterInfo) може бути відсутня.

Режим обслуговування групи — groupServiceMode: FAST_FOOD, TABLE_SERVICE, PETROLEUM.

Термінали

GET/resto/api/corporation/terminals/

Версія 4.3 · відповідь: terminalDto (id, name, computerName, anonymous, groupInfo, restaurantSectionIds)

Зазвичай цікавлять лише фронтові термінали. Вони розрізняються за полем anonymous: у кас — false, у бек-офісів і системних терміналів — true.

Пошук

GET/resto/api/corporation/departments/search?code={regex}
GET/resto/api/corporation/stores/search?code={regex}
GET/resto/api/corporation/groups/search?name={regex}&departmentId={uuid}
GET/resto/api/corporation/terminals/search?name={regex}&computerName={regex}&anonymous=false

Усі code і name — регулярні вирази. Якщо передати просто рядок, шукається будь-яке його входження з урахуванням регістру. Пошук закладу за кодом має сенс переважно в Syrve Chain: у межах одного RMS сутність типу DEPARTMENT лише одна.

Пошук складу за кодом

Працює тільки якщо коди складів заповнені. Поле необов'язкове і за замовчуванням порожнє.

Налаштування підприємства

GET/resto/api/corporation/settings

Версія 6.2 · потрібне право B_ADM

{ "vatAccounting": "VAT_INCLUDED_IN_PRICE" }

VAT_INCLUDED_IN_PRICE — ПДВ включено в ціну закупівлі; VAT_NOT_INCLUDED_IN_PRICE — не включено. Це визначає, як рахувати суми в накладних.

08Довідники і рахунки

Універсальний метод довідників

GET/resto/api/v2/entities/list?rootType={Type}

Версія 5.0 · rootType можна передавати кілька разів

rootTypeЗ версіїЩо повертає
Account5.0Рахунки, зокрема склади
AccountingCategory5.0Бухгалтерська категорія номенклатури
AlcoholClass5.0Клас алкогольної продукції
AllergenGroup7.1.2Група алергенів
AttendanceType6.4Тип явки співробітника
Conception7.8.1Концепція
CookingPlaceType7.0.2Тип місця приготування
DiscountType5.0Тип знижки
MeasureUnit5.0Одиниця виміру
OrderType6.4Тип замовлення
PaymentType5.0Тип оплати
ProductCategory5.0Користувацька категорія номенклатури
ProductScale6.4Шкала розмірів
ProductSize6.4Розмір продукту
ScheduleType6.4Тип зміни
TaxCategory6.2.2Податкова категорія (ставка ПДВ)

Параметри

ПараметрОпис
includeDeletedtrue/false. За замовчуванням — включати видалені
revisionFromІнкрементальна вибірка, див. розділ 6
formatЗастаріле з 6.2.2, не використовується

Формат відповіді

ПолеОпис
idGUID об'єкта
rootTypeТип, який ви передали
deletedtrue — позначений видаленим
codeКод, артикул, табельний номер. Рядок, може бути null
nameНазва. Для системних об'єктів — мовою запиту (заголовок Accept-Language)

Додаткові поля за типами

ТипПолеЗначення
OrderTypeorderServiceTypeCOMMON — звичайне замовлення; DELIVERY_BY_COURIER — доставка кур'єром; DELIVERY_PICKUP — самовивіз
OrderTypedefaultForServiceTypeТип замовлення за замовчуванням для цього режиму
ProductSizeshortNameКоротка назва розміру
TaxCategoryvatPercentСтавка ПДВ
GET /resto/api/v2/entities/list?rootType=DiscountType&rootType=PaymentType&includeDeleted=false

[
  { "id":"97ab68db-…","rootType":"DiscountType","deleted":false,"code":null,"name":"Знижка 20%" },
  { "id":"09322f46-…","rootType":"PaymentType", "deleted":false,"code":"CASH","name":"Готівка" },
  { "id":"9e250341-…","rootType":"PaymentType", "deleted":false,"code":null,  "name":"Безготівковий розрахунок" }
]
Обережно з цим методом

Він повертає загальну довідкову інформацію без прив'язки до підрозділів і строків дії. У результаті можуть бути записи (наприклад, типи оплат), заборонені до застосування в конкретному підрозділі. Використовуйте його, щоб отримати назви об'єктів для відображення у звітах, — не для бізнес-логіки.

Тільки ідентифікатори

GET/resto/api/v2/entities/{entityType}/ids

Версія 9.1 · повертає плаский масив GUID. Приймає includeDeleted і revisionFrom. Приклад: /resto/api/v2/entities/Account/ids?includeDeleted=false&revisionFrom=10

Рахунки

GET/resto/api/entities/accounts/list

Параметри: includeDeleted (з 5.4), revisionFrom (з 6.4)

ПолеОпис
idGUID рахунку
accountParentIdGUID батьківського рахунку; у складів — null
parentCorporateIdGUID об'єкта структури корпорації, якому належить склад
codeКод рахунку, наприклад 5.01
nameНазва; для системних рахунків — мовою запиту
typeТип рахунку, див. розділ 21
systemtrue — попередньо встановлений склад на standalone RMS
customTransactionsAllowedЧи дозволені ручні проводки
rootTypeЗ 6.2.2 — завжди Account

Метод повертає лише довідкову інформацію: без балансів і без матеріально відповідальних осіб. Баланси — у розділі 16.

09Номенклатура

Потрібне право B_EN «Редагування номенклатурних довідників» — і на читання, і на запис.

Елементи номенклатури

GET/resto/api/v2/entities/products/list

Версія 6.1

ПараметрЗ версіїТипОпис
includeDeleted6.1BooleanВключати видалені. За замовчуванням false
ids6.2List<UUID>Фільтр за GUID
nums6.2List<String>Фільтр за артикулом
types6.2List<ProductType>Фільтр за типом
categoryIds6.2List<UUID>Фільтр за категорією продукту
parentIds6.2List<UUID>Фільтр за батьківською групою
Як фільтрувати за null

Щоб відібрати елементи, у яких поле порожнє, передайте параметр без значення: parentId=. На сервері це стане списком з одним елементом [null].

Кілька значень — повторенням параметра: parentId=111&parentId=222&parentId=333[111, 222, 333]. Комбінація parentId=111&parentId=222&parentId=[111, 222, null].

Основні поля

ПолеЗ версіїТипОпис
id6.1UUIDІдентифікатор
deleted6.1BooleanВидалений
name6.1StringНазва
description6.1StringОпис
num6.1StringАртикул — використовується під час друку документів і техкарт
code6.1StringКод швидкого пошуку на екрані редагування замовлення
parent6.1UUIDБатьківська група; null — коренева
type6.1EnumGOODS товар · DISH страва · PREPARED заготовка (напівфабрикат) · SERVICE послуга · MODIFIER модифікатор · OUTER зовнішні товари постачальників · RATE тариф (дочірній до послуги)
mainUnit6.1UUIDОсновна одиниця виміру
taxCategory6.1UUIDПодаткова категорія (ставка ПДВ)
category6.1UUIDКористувацька категорія
accountingCategory6.1UUIDБухгалтерська категорія
defaultSalePrice6.1BigDecimalЦіна за замовчуванням, грн (якщо немає наказів про меню)
defaultIncludeInMenu6.1BooleanЧи включати позицію в меню за замовчуванням
placeType6.1UUIDМісце приготування. Обов'язкове, якщо defaultIncludeInMenu = true
excludedSections6.1Set<UUID>Відділення, де цю страву продавати не можна
unitWeight6.1BigDecimalВага однієї одиниці, кг
unitCapacity6.1BigDecimalОб'єм однієї одиниці, л
notInStoreMovement6.1BooleanЧи бере участь у переміщеннях по складу
color, fontColor6.2RGBColorDtoКолір фону і шрифту кнопки на касі: {red, green, blue}
frontImageId6.2UUIDЗображення для каси
position6.2IntegerПозиція в меню
modifiers6.2ListМодифікатори (без урахування схем модифікаторів)
containers6.2.4ListФасування
modifierSchemaId6.4UUIDСхема модифікаторів
productScaleId6.4UUIDШкала розмірів. Якщо задана схема модифікаторів — шкала береться з неї
coldLossPercent7.1.2BigDecimalВтрати при холодній обробці, %
hotLossPercent7.1.2BigDecimalВтрати при гарячій обробці, %
allergenGroups7.1.5Set<UUID>Групи алергенів
canSetOpenPrice7.4.4BooleanВільна ціна
useBalanceForSellBooleanТовар продається на вагу
barcodes8.7.1ListШтрихкоди: {barcode, containerId}

Модифікатор — ChoiceBindingDto

ПолеТипОпис
modifierUUIDGUID модифікатора або номенклатурної групи, якщо модифікатор груповий
defaultAmountIntegerКількість за замовчуванням. У групового = сумі значень дочірніх
freeOfChargeAmountIntegerКількість безкоштовних. Не більше максимальної
minimumAmountIntegerМінімальна кількість. Для обов'язкового модифікатора має бути > 0
maximumAmountIntegerМаксимальна кількість
hideIfDefaultAmountBooleanХовати, якщо кількість за замовчуванням
requiredBooleanОбов'язковий. З 6.2.3 у відповіді не використовується
childModifiersHaveMinMaxRestrictionsBooleanОбмеження min/max у дочірніх. У дочірніх та одиночних має бути false
splittableBooleanПодільність. Тільки для схем модифікаторів
childModifiersListДочірні модифікатори

Фасування — ContainerDto

ПолеОпис
id, num, nameІдентифікатор, артикул, назва
countКількість продукту в основних одиницях виміру
containerWeightВага тари
fullContainerWeightВага разом із тарою
minContainerWeight, maxContainerWeightМін./макс. вага елемента номенклатури
useInFrontВикористовувати на касі
backwardRecalculationЗавжди false
deletedВидалене

Створення елемента

POST/resto/api/v2/entities/products/save

Версія 6.1 · тіло — JSON

Параметр URLОпис
generateNomenclatureCodeЧи генерувати артикул. За замовчуванням true
generateFastCodeЧи генерувати код швидкого пошуку. За замовчуванням true

Обов'язкові поля тіла

ПолеОбов'язковеПримітка
nameтакНазва
typeтакGOODS, DISH, PREPARED, MODIFIER, SERVICE, RATE
mainUnitтакGUID одиниці виміру
numумовноОбов'язковий, якщо generateNomenclatureCode = false
placeTypeумовноОбов'язковий, якщо defaultIncludeInMenu = true
accountingCategoryніЗа замовчуванням «товар»
unitWeightніЗа замовчуванням 1
unitCapacity, defaultSalePriceніЗа замовчуванням 0

Редагування, видалення, відновлення

POST/resto/api/v2/entities/products/update

Тіло — те саме, що й для save, плюс id елемента. Параметри URL: overrideFastCode, overrideNomenclatureCode (обидва за замовчуванням false)

POST/resto/api/v2/entities/products/delete
POST/resto/api/v2/entities/products/restore

Тіло: {"items":[{"id":"…"},{"id":"…"}]}. У restore є параметр overrideNomenclatureCode (з 6.4): якщо артикул відновлюваного продукту збігається з чинним, буде згенеровано новий.

{
  "result": "SUCCESS",
  "errors": null,
  "response": [ { "id":"fcdf4324-…", "deleted":true, "name":"test API-6", … } ]
}

Номенклатурні групи

GET/resto/api/v2/entities/products/group/list
POST/resto/api/v2/entities/products/group/save
POST/resto/api/v2/entities/products/group/update
POST/resto/api/v2/entities/products/group/delete

Версія 6.2 · параметри списку: includeDeleted, ids, parentIds, nums і codes (з 6.2.3), revisionFrom (з 6.4)

Поля ProductGroupDto повторюють поля продукту в частині id, deleted, name, description, num, code, parent, плюс налаштування відображення групи на касі.

Користувацькі категорії

GET/resto/api/v2/entities/products/category/list
POST/resto/api/v2/entities/products/category/save
POST/resto/api/v2/entities/products/category/update
POST/resto/api/v2/entities/products/category/delete
POST/resto/api/v2/entities/products/category/restore

Шкала і розміри

GET/resto/api/v2/entities/productScales
GET/resto/api/v2/entities/productScales/{productScaleId}
POST/resto/api/v2/entities/productScales/save
POST/resto/api/v2/entities/productScales/update
POST/resto/api/v2/entities/productScales/delete
POST/resto/api/v2/entities/productScales/restore
GET/resto/api/v2/entities/products/{productId}/productScale
GET/resto/api/v2/entities/products/productScales

Версія 6.4 · шкала розмірів і прив'язка розмірів до продуктів

Зображення

GET/resto/api/v2/images/load?imageId={imageId}
POST/resto/api/v2/images/save
POST/resto/api/v2/images/delete

GUID завантаженого зображення підставляється в поле frontImageId елемента номенклатури.

Швидке меню

GET/resto/api/v2/entities/quickLabels/list
POST/resto/api/v2/entities/quickLabels/save
POST/resto/api/v2/entities/quickLabels/update

Потрібне право B_QMENU

Швидке меню складається з трьох сторінок, кожна — сітка 3 × 8. У комірці — або елемент номенклатури, або група.

ПолеТипОпис
idUUIDІдентифікатор швидкого меню
dependsOnWeekDaybooleanЧи залежить меню від дня тижня
departmentIdUUIDПідрозділ, для якого діє меню
sectionIdUUIDВідділення. null — меню для всього підрозділу
pageNamesList<String>Назви сторінок — рівно три
labels[].dayIntegerДень тижня: 0 — понеділок … 6 — неділя, або null
labels[].pageIntegerСторінка: 0, 1, 2
labels[].xIntegerX-координата: 0, 1, 2
labels[].yIntegerY-координата: 0…7
labels[].entityIdUUIDGUID сутності
labels[].entityTypeEnumPRODUCT або PRODUCT_GROUP

10Технологічні карти

GET/resto/api/v2/assemblyCharts/getAll?dateFrom={d}&dateTo={d}&includeDeletedProducts=true&includePreparedCharts=false

Усі техкарти за період

GET/resto/api/v2/assemblyCharts/getAllUpdate?knownRevision={n}&dateFrom={d}&dateTo={d}

Інкрементально: лише те, що змінилося після knownRevision

GET/resto/api/v2/assemblyCharts/getTree?date={d}&productId={uuid}&departmentId={uuid}

Дерево техкарти — з розкладанням напівфабрикатів

GET/resto/api/v2/assemblyCharts/getAssembled?date={d}&productId={uuid}&departmentId={uuid}

Згорнута («зібрана») техкарта

GET/resto/api/v2/assemblyCharts/getPrepared?date={d}&productId={uuid}&departmentId={uuid}
GET/resto/api/v2/assemblyCharts/byId
GET/resto/api/v2/assemblyCharts/getHistory
POST/resto/api/v2/assemblyCharts/save
POST/resto/api/v2/assemblyCharts/delete
Техкарта завжди має дату

Техкарта — версійна сутність: вона діє з певної дати. Тому date / dateFromdateTo обов'язкові, а getHistory показує всю історію змін конкретної карти.

Входження товару в страву

GET/resto/api/reports/ingredientEntry

Версія 3.9 · зворотний пошук: у які страви входить цей інгредієнт

ПараметрЗначенняОпис
departmentGUIDПідрозділ
dateDD.MM.YYYYНа яку дату
productGUIDІдентифікатор продукту
productArticleStringАртикул продукту. Пріоритет пошуку: спочатку productArticle, потім product
includeSubtreeBooleanВключати рядки піддерев. За замовчуванням false

11Ціни, накази, розклади

Цінові категорії

GET/resto/api/v2/entities/priceCategories
GET/resto/api/v2/entities/priceCategories/byId?id={uuid}

Версія 7.8 · параметри списку: includeDeleted, id (список), revisionFrom

ПолеТипОпис
idUUIDІдентифікатор
nameStringНазва
deletedbooleanВидалена
codeStringКод елемента довідника
assignableManuallybooleanЧи можна призначити вручну на касі
pricingStrategy.typeEnumABSOLUTE_VALUE — знижка/націнка абсолютним числом; PERCENT — у відсотках від базової ціни
pricingStrategy.deltaBigDecimalДля ABSOLUTE_VALUE. Знак «−» — знижка, «+» — націнка. У гривнях
pricingStrategy.percentBigDecimalДля PERCENT. Діапазон [−100, +∞)
{
  "result": "SUCCESS",
  "errors": [],
  "response": [
    { "id":"95035a38-…", "name":"Доставка",  "deleted":false, "code":"3",
      "assignableManually":true,  "pricingStrategy":{ "type":"PERCENT", "percent":-5 } },
    { "id":"67a54111-…", "name":"Плюс 100 грн", "deleted":false, "code":"2",
      "assignableManually":false, "pricingStrategy":{ "type":"ABSOLUTE_VALUE", "delta":100 } }
  ],
  "revision": 187420
}

Накази про зміну прейскуранта

GET/resto/api/v2/documents/menuChange
GET/resto/api/v2/documents/menuChange/byId?id={uuid}
GET/resto/api/v2/documents/menuChange/byNumber?documentNumber={n}
POST/resto/api/v2/documents/menuChange

Версія 7.8 · саме цим документом задаються ціни продажу

MenuChangeDocumentDto

ПолеТипОпис
idUUIDІдентифікатор
dateIncomingStringОблікова дата проведення, yyyy-MM-dd
documentNumberStringОбліковий номер
statusEnumNEW · PROCESSED · DELETED
commentStringКоментар
shortNameStringКоротка назва для кнопок на касі
deletePreviousMenuBooleanЯкщо true — страви, яких немає в документі, будуть виключені з меню
scheduleIdUUIDРозклад — для наказу «за часом»
schedulePeriodScheduleDtoРозгорнутий розклад. Тільки читання
dateToStringДата закінчення дії (скасування) наказу
itemsListПозиції наказу

MenuChangeDocumentItemDto

ПолеТипОпис
numIntegerПозиція рядка. При створенні не враховується
departmentIdUUIDПідрозділ, у якому продається продукт
productIdUUIDПродукт
productSizeIdUUIDРозмір продукту
includingBooleanЧи включений продукт у прейскурант
priceBigDecimalЦіна, грн
dishOfDayBooleanХіт / страва дня
flyerProgramBooleanУчасть у флаєрній програмі

Редагувати наказ можна лише поки його статус NEW. Якщо id не задано — створюється новий документ; якщо задано — редагується наявний.

Розклади (періоди дії)

GET/resto/api/v2/entities/periodSchedules
GET/resto/api/v2/entities/periodSchedules/byId?id={uuid}

Версія 7.8 · параметри: includeDeleted, id (список), revisionFrom

ПолеТипОпис
id, name, deletedІдентифікатор, назва, ознака видалення
periods[].beginStringПочаток напівінтервалу, HH:mm
periods[].endStringКінець напівінтервалу, HH:mm
periods[].daysOfWeekList<Integer>1 — понеділок … 7 — неділя
Дні тижня нумеруються по-різному

У розкладах (periodSchedules) понеділок — це 1, неділя — 7. У швидкому меню (quickLabels) понеділок — 0, неділя — 6. Легко переплутати.

{
  "id": "598ce53a-…",
  "name": "Робочий полуденок",
  "deleted": false,
  "periods": [ { "begin":"16:00", "end":"17:00", "daysOfWeek":[1,2,3,4,5] } ]
}

12Складські документи

Документи розділені на два покоління: старі XML-методи /resto/api/documents/… і нові JSON-методи /resto/api/v2/documents/…. Нові з'явилися у 7.9.3 і покривають акти списання та внутрішні переміщення.

Прибуткова накладна

POST/resto/api/documents/import/incomingInvoice

Версія 3.9, редагування з 5.2 · Content-Type: application/xml · тіло: incomingInvoiceDto · відповідь: documentValidationResult

Поле документаОпис
documentNumberОбліковий номер документа
dateIncomingДата документа. У цьому методі — dd.mm.YYYY
dueDateСтрок оплати, dd.mm.YYYY
incomingDateЗ 7.6.1: вхідна дата зовнішнього документа, YYYY-mm-dd. Якщо не вказана — береться з dateIncoming
incomingDocumentNumberВхідний номер зовнішнього документа
invoiceНомер податкової накладної / рахунка-фактури
supplierGUID постачальника
defaultStoreСклад. Якщо вказаний — той самий склад має бути в кожній позиції
conception / conceptionCodeКонцепція (GUID / код, код — з 7.8)
statusNEW · PROCESSED · DELETED
useDefaultDocumentTimefalse (за замовч.) — використати передані дату-час як є. true — узяти налаштування проведення документів із підрозділу
employeePassToAccountПоле «зарахувати співробітнику»
transportInvoiceNumberНомер товарно-транспортної накладної
linkedOutgoingInvoiceIdЗ 5.4, тільки читання: пов'язана видаткова накладна
distributionAlgorithmЗ 6.0, тільки читання: DISTRIBUTION_BY_SUM · DISTRIBUTION_BY_AMOUNT · DISTRIBUTION_NOT_SPECIFIED

Позиція накладної

ПолеОпис
numОбов'язкове. Номер позиції в документі
product / productArticleТовар: GUID або артикул (з 5.0). Хоча б одне має бути заповнене; GUID має пріоритет
supplierProduct / supplierProductArticleТовар у постачальника: GUID або артикул
amountКількість в основних одиницях виміру товару
actualAmountФактична (підтверджена) кількість основних одиниць
containerIdФасування
amountUnitБазова одиниця виміру
priceЦіна за одиницю, грн
priceWithoutVatЗ 6.2: ціна без ПДВ за фасування з урахуванням знижки
sumОбов'язкове. Сума рядка без урахування знижки. Як правило sum = amount × price / container + discountSum + vatSum
vatPercent, vatSumЗ 5.0: відсоток і сума ПДВ. Якщо не задана сума — рахується за відсотком; якщо не заданий відсоток — береться з картки товару. Задати лише суму без відсотка не можна
storeСклад позиції
producerВиробник/імпортер. Має бути в списку виробників у картці товару
customsDeclarationNumberНомер митної декларації
isAdditionalExpenseЗ 6.0, тільки читання: чи є рядок додатковою витратою
Як рахувати кількість і ціну з фасуванням

У накладній позиція з товаром у ящиках, базова одиниця — кг. 5 ящиків по 1000 грн, у кожному 10 кг:

  • amount («в од.») = 5 × 10 = 50
  • actualAmount («фактична кількість») = 5 × 10 = 50
  • price («ціна базової одиниці») = 1000 / 10 = 100

Якщо фасування немає — усі поля заповнюються кількістю товару в одиницях виміру.

<document>
  <items>
    <item>
      <num>1</num>
      <product>0F22AA60-E8AE-4C8E-80CD-F1E00B88FEC6</product>
      <supplierProduct>BF1DA0F2-B511-431E-BC7D-F2A68715054B</supplierProduct>
      <amount>3.00</amount>
      <actualAmount>3.00</actualAmount>
      <price>10.00</price>
      <sum>30.00</sum>
      <vatPercent>20.00</vatPercent>
      <store>1239d270-1bbe-f64f-b7ea-5f00518ef508</store>
    </item>
  </items>
  <documentNumber>dn-7</documentNumber>
  <dateIncoming>17.12.2025</dateIncoming>
  <useDefaultDocumentTime>true</useDefaultDocumentTime>
  <defaultStore>1239d270-1bbe-f64f-b7ea-5f00518ef508</defaultStore>
  <supplier>3F08E41C-AA25-4573-B1E0-60B3B8A09F6A</supplier>
  <dueDate>27.12.2025</dueDate>
</document>

Відповідь — documentValidationResult

ПолеОпис
validРезультат валідації
warningtrue — помилка некритична, це попередження
documentNumberНомер документа
otherSuggestedNumberНовий номер, якщо старий порушує унікальність
errorMessageТекст помилки (або лише заголовок, якщо є additionalInfo). Не завжди локалізований
additionalInfoДеталі. Наприклад, при списанні в мінус — розшифровка по кожній позиції, що дає від'ємні залишки

Видаткова накладна

POST/resto/api/documents/import/outgoingInvoice

Версія 4.4 · Content-Type: application/xml · тіло: outgoingInvoiceDto

ПолеОпис
dateIncomingОблікова дата-час. Якщо не заповнено — час сервера. yyyy-MM-ddTHH:mm:ss
accountToCodeРахунок списання товарів. За замовчуванням 5.01 «Витрата продуктів»
revenueAccountCodeРахунок виручки. За замовчуванням 4.01 «Торговельна виручка»
defaultStoreId / defaultStoreCodeСклад. При створенні з проведенням — обов'язковий. Заповнюється або в документі, або в кожному рядку, але не одночасно
counteragentId / counteragentCodeКонтрагент
conceptionId / conceptionCodeКонцепція
items[].productId / productArticleЕлемент номенклатури
items[].priceОбов'язкове. Ціна за фасування з урахуванням знижки, грн
items[].amountОбов'язкове. Кількість у базових одиницях
items[].sumОбов'язкове. Сума рядка без знижки
items[].discountSumСума знижки
items[].vatPercent, vatSumПДВ, з 5.0

Розпроведення накладних

POST/resto/api/documents/unprocess/incomingInvoice
POST/resto/api/documents/unprocess/outgoingInvoice

Версія 7.7 · тіло — та сама структура документа · відповідь — documentValidationResult

Вивантаження накладних

GET/resto/api/documents/export/incomingInvoice?from={d}&to={d}&supplierId={uuid}
GET/resto/api/documents/export/outgoingInvoice?from={d}&to={d}&supplierId={uuid}

Версія 5.4 · дати YYYY-MM-DD, обидві включно (час не враховується) · supplierId можна повторювати; без нього повертаються всі накладні за період · revisionFrom з 6.4

GET/resto/api/documents/export/incomingInvoice/byNumber
GET/resto/api/documents/export/outgoingInvoice/byNumber
ПараметрТипОпис
numberStringНомер документа
currentYearBooleanОбов'язковий. true — тільки за поточний рік, тоді from і to передавати не можна. falsefrom і to обов'язкові
from, toYYYY-MM-DDМежі періоду, включно

Інші документи (XML)

POST/resto/api/documents/import/productionDocument

Акт приготування · версія 3.9 · поля: storeFrom, storeTo, dateIncoming, documentNumber, status, items[] з product, amount, amountUnit, containerId, num

POST/resto/api/documents/import/salesDocument

Акт реалізації · версія 3.9 · поля: accountToCode (за замовч. 5.01), revenueAccountCode (за замовч. 4.01), items[] з productId, storeId, amount, sum, discountSum

POST/resto/api/documents/import/returnedInvoice

Повернення постачальнику · версія 4.4 · ключові поля: incomingInvoiceNumber і incomingInvoiceDate — вихідна прибуткова накладна, counteragentId

<documentValidationResult>
    <valid>false</valid>
    <warning>false</warning>
    <errorMessage>Cannot find document of type INCOMING_INVOICE by number
                   'TAKT0001' and date '2016-05-01'</errorMessage>
</documentValidationResult>

Інвентаризація

POST/resto/api/documents/import/incomingInventory

Версія 5.1 · тіло: incomingInventoryDto · відповідь: incomingInventoryValidationResult

POST/resto/api/documents/check/incomingInventory

Версія 5.1 · той самий документ, але без проведення — сервер лише рахує розбіжності й повертає їх

Це найкорисніша пара методів для мобільного застосунку інвентаризації: спершу check, показуєте комірникові розбіжності, і тільки після підтвердження — import.

<incomingInventoryValidationResult>
    <valid>true</valid>
    <store><id>1239d270-…</id><code>1</code><name>Головний склад</name></store>
    <date>2016-07-03T00:26:00+03:00</date>
    <items>
        <item>
            <product><id>c6d6c2f2-…</id><code>00001</code><name>Товар</name></product>
            <expectedAmount>13.600000000</expectedAmount>
            <expectedSum>535.370000000</expectedSum>
            <actualAmount>29.450</actualAmount>
            <differenceAmount>15.850000000</differenceAmount>
            <differenceSum>623.930000000</differenceSum>
        </item>
    </items>
</incomingInventoryValidationResult>

У позиції передається productId, amountContainer (кількість у фасуванні) і, за потреби, containerId та comment. Один і той самий товар можна вказати кілька разів різними фасуваннями — сервер підсумує.

Акти списання (v2)

GET/resto/api/v2/documents/writeoff?dateFrom={d}&dateTo={d}
GET/resto/api/v2/documents/writeoff/byId?id={uuid}
GET/resto/api/v2/documents/writeoff/byNumber?documentNumber={n}
POST/resto/api/v2/documents/writeoff

Версія 7.9.3 · JSON · параметри вибірки: dateFrom і dateTo (обов'язкові, yyyy-MM-dd), status, revisionFrom

Обов'язкові поля при створенні: dateIncoming, status, storeId, accountId і мінімум одна позиція. У позиції обов'язкові productId та amount. Якщо documentNumber не заданий — згенерується автоматично. Редагувати можна лише документ зі статусом NEW.

POST /resto/api/v2/documents/writeoff
{
  "dateIncoming": "2026-08-16T23:00",
  "status": "NEW",
  "comment": "Псування",
  "storeId":   "7954d76d-6177-402c-ba2a-cc0ff16486fa",
  "accountId": "8c46f55a-0698-4e3f-8703-8bb36b24e8ac",
  "items": [ { "productId": "50cedffc-04e9-aa79-016b-d1f9c56122e8", "amount": 1 } ]
}

Внутрішні переміщення (v2)

GET/resto/api/v2/documents/internalTransfer?dateFrom={d}&dateTo={d}
GET/resto/api/v2/documents/internalTransfer/byId?id={uuid}
GET/resto/api/v2/documents/internalTransfer/byNumber?documentNumber={n}
POST/resto/api/v2/documents/internalTransfer

Версія 7.9.3 · обов'язкові: dateIncoming, status, storeFromId, storeToId і мінімум одна позиція

{
  "dateIncoming": "2026-08-15T06:00",
  "status": "NEW",
  "storeFromId": "05a407d4-d7c6-4bc2-a578-6ad5de99d468",
  "storeToId":   "370620fe-c789-46db-9d92-33bec29b82a3",
  "items": [
    { "productId": "ccdada6c-…", "amount": 5, "containerId": "e2e67737-…" },
    { "productId": "8972b757-…", "amount": 5, "containerId": "84d13550-…" }
  ]
}

У відповіді на створення приходить конверт {"result":"SUCCESS","errors":[],"response":{…}} із заповненими num, measureUnitId і cost.

13Постачальники

GET/resto/api/suppliers

Версія 3.9 · revisionFrom з 6.4 · відповідь — структура employees (постачальник у Syrve — це різновид контрагента)

GET/resto/api/suppliers/search

Пошук за id не виконується. Доступні поля:

ПараметрПоле в картці
nameІм'я в системі
codeТаб. номер / код
phone, cellPhoneТелефон, мобільний телефон
firstName, middleName, lastNameІм'я, по батькові, прізвище
emailE-mail
cardNumberНомер картки (вкладка «Додаткові відомості»)
taxpayerIdNumberПодатковий номер (вкладка «Юр. особа»)

Прайс-лист постачальника

GET/resto/api/suppliers/{code}/pricelist?date={DD.MM.YYYY}

Версія 3.9 · {code} — це код постачальника, не GUID · без параметра date повертається останній прайс-лист

ПолеОпис
nativeProduct, nativeProductCode, nativeProductNum, nativeProductNameТовар у нас: GUID, код, артикул, назва
supplierProduct, supplierProductCode, supplierProductNum, supplierProductNameТовар у постачальника
costPriceВартість товару, грн
allowablePriceDeviationДопустиме відхилення від ціни, %
containerФасування: id, name, count, containerWeight, fullContainerWeight, useInFront

14Каса і касові зміни

Список змін

GET/resto/api/v2/cashshifts/list
ПараметрЗначенняОпис
openDateFromYYYY-MM-DDПеріод відкриття зміни «з», включно
openDateToYYYY-MM-DDПеріод відкриття зміни «по», включно
departmentIdUUIDСписок закладів; порожньо — без фільтра
groupIdUUIDСписок груп секцій
statusEnumНе може бути порожнім. ANY · OPEN · CLOSED · ACCEPTED прийнята · UNACCEPTED не прийнята · HASWARNINGS підозріла
revisionFromчислоЗ версії 6.4
Поле відповідіОпис
idІдентифікатор зміни
sessionNumberНомер касової зміни в нумерації каси
fiscalNumberФіскальний номер зміни (з РРО)
cashRegNumber, cashRegSerialНомер РРО в нумерації Syrve і його серійний номер
openDate, closeDate, acceptDateВідкриття, закриття, прийняття. acceptDate = null — зміну не прийнято
managerIdВідповідальний менеджер
responsibleUserВідповідальний касир
sessionStartCashЗалишок у касі на початок дня, грн
payOrdersСума всіх замовлень з урахуванням знижки, грн
sumWriteoffOrdersСума замовлень, закритих за рахунок закладу
salesCash, salesCard, salesCerditПродажі готівкою, карткою, у кредит. Так, у salesCerdit одрук у самому API
payInСума всіх внесень
payOutСума всіх вилучень, без урахування вилучення в кінці зміни
payIncomeСума вилучення в кінці зміни
cashRemainЗалишок у касі після закриття зміни
cashDiffЗагальне розходження книжкових і фактичних сум
sessionStausСтатус зміни. Знову одрук в оригінальній назві поля
conception, pointOfSaleКонцепція і точка продажу зміни

Зміна за ідентифікатором

GET/resto/api/v2/cashshifts/byId/{sessionId}
GET/resto/api/v2/cashshifts/closedSessionDocument/{id}

Другий метод повертає документ прийняття касової зміни

Платежі, внесення і вилучення за зміну

GET/resto/api/v2/cashshifts/payments/list/{sessionId}?hideAccepted=false

Версія 5.4

ПолеОпис
sessionIdGUID запитаної зміни
cashlessRecordsБезготівкові платежі
payInRecordsВнесення
payOutRecordsВилучення

Запис проводки — info

ПолеОпис
idGUID проводки
dateОбліковий день, округлений до доби (для оплат замовлень)
creationDateДата з прив'язкою до часу. Може бути меншою за date, якщо «кінець облікового дня» ≠ 00:00
groupCARD безготівка · CREDIT кредит · PAYOUT вилучення · PAYIN внесення
accountIdРедагований рахунок — зазвичай кінцевий рахунок проводки
counteragentId, paymentTypeId, type, sum, commentКонтрагент, тип оплати, тип проводки, сума, коментар
auth.user, auth.cardАвторизаційні дані: користувач, номер картки
causeEvenIdGUID події оплати замовлення
cashierId, departmentIdКасир, заклад
cashFlowCategoryСтаття руху грошових коштів: code, parentCategory, type (OPERATIONAL/INVESTMENT/FINANCE)

Поруч із info є actualSum і originalSum: перша — сума з документа закриття зміни (якщо він її скоригував), друга — сума самої проводки. Аналогічно editedPayAccountId та originalPayAccountId.

Типи внесень і вилучень

GET/resto/api/v2/entities/payInOutTypes/list?includeDeleted=false

Потрібне право B_APIO

ПолеОпис
idGUID типу внесення/вилучення
chiefAccountGUID шеф-рахунку
accountGUID кор-рахунку. При вилученні кошти йдуть на кор-рахунок, при внесенні — навпаки
counteragentTypeNONE · COUNTERAGENT · EMPLOYEE · SUPPLIER · CLIENT · INTERNAL_SUPPLIER
transactionTypeТип проводки, див. розділ 21
cashFlowCategoryСтаття ДДС
conceptionКонцепція: id, code, name
limitГранична сума для внесень/вилучень на касі, грн
mandatoryFrontCommentВимагати коментар до операції на касі

Виконати вилучення

POST/resto/api/v2/payInOuts/addPayOut

Версія 6.0 · потрібне право F_APIO · Content-Type: application/json;charset=UTF-8

ПолеТипОпис
payOutTypeIdUUIDТип вилучення
payOutDateStringyyyy-MM-dd. Час проставляється поточний
counteragentUUIDКонтрагент — залежно від типу вилучення
departmentSumMapUUID → BigDecimalЗаклад → сума вилучення, грн
payrollIdUUIDПлатіжна відомість. Указується, якщо вилучення йде на кор-рахунок «Поточні розрахунки зі співробітниками»
commentStringКоментар
{
  "payOutTypeId": "114c757f-bac4-422c-a184-0935923b60b8",
  "payOutDate":   "2026-08-13",
  "counteragent": "d244cb85-9115-4b4d-8e02-a4f7fdd8ec15",
  "departmentSumMap": { "372f68b4-8e7a-bae1-015f-0f9c638f000d": 4500.00 },
  "comment": "Аванс постачальнику"
}

# Відповідь
{ "result": "SUCCESS", "errors": null, "payOutSettings": { … } }

При помилці result = ERROR, а errors містить список об'єктів із кодом і текстом помилки.

Платіжні відомості

GET/resto/api/v2/payrolls/list?dateFrom={d}&dateTo={d}&department={uuid}

Версія 6.0 · дати yyyy-MM-dd, включно · є includeDeleted

Повертає payrollId, dateFrom, dateTo, department, documentNumber, status (NEW/PROCESSED/DELETED), comment.

15Співробітники

Список і пошук

GET/resto/api/employees?includeDeleted=false
GET/resto/api/employees/byDepartment/{departmentCode}
GET/resto/api/employees/byId/{employeeUUID}
GET/resto/api/employees/byCode/{employeeCode}
GET/resto/api/employees/search?firstName={regex}&middleName={regex}

Версія 4.0 · includeDeleted з 5.0 · revisionFrom з 6.4

Пошук працює за будь-яким текстовим або булевим полем DTO — регулярним виразом: address, cardNumber, cellPhone, client, code, email, employee, firstName, lastName, login, mainRoleCode, middleName, name, note, phone, supplier. Без параметрів повертає всіх активних.

У Syrve RMS byDepartment ідентичний звичайному списку; різниця з'являється тільки в Syrve Chain.

Створення і редагування

PUT/resto/api/employees/byId/{UUID}

Повне заміщення. Новий id201 Created. Наявний id200 OK і всі поля перезаписуються: не вказали необов'язкове поле — воно скинеться

POST/resto/api/employees/byId/{employeeUUID}

Часткове оновлення. Поля, не вказані в запиті, лишаються без змін. Content-Type: application/x-www-form-urlencoded

PUT/resto/api/employees/byCode/{employeeCode}

Створення нового співробітника. Враховується лише код, переданий у тілі PUT-запиту. employeeCode потрапляє в поле «Табельний номер»

DELETE/resto/api/employees/byId/{employeeUUID}

Порожня відповідь, якщо співробітника видалено (або він уже був видалений). Entity of class User not found by id — якщо GUID неіснуючий

Ключові поля employee

ПолеОпис
idGUID
codeТабельний номер. Порожній у системних облікових записів
nameІм'я в системі
loginЛогін для входу в бек-офіс
passwordПароль бек-офісу. Тільки на запис, у відповіді не віддається
pinCodePIN для входу на касу. Тільки на запис
mainRoleCode / mainRoleIdОсновна посада. Входить у roleCodes / rolesIds
roleCodes / rolesIdsУсі посади співробітника
firstName, middleName, lastNameІм'я, по батькові, прізвище
phone, cellPhone, email, address, birthday, noteДовідкова інформація
hireDate, hireDocumentNumberДата і номер наказу про прийняття
fireDateЗ 5.4: дата звільнення
cardNumberНомер картки співробітника
taxpayerIdNumberПодатковий номер (в Україні — ІПН)
glnЗ 6.0: Global Location Number — для постачальників
preferredDepartmentCodeЗ 5.0: підрозділ, у якому зміни призначаються в першу чергу
departmentCodesПризначені підрозділи. null — усі, наявні й майбутні
responsibilityDepartmentCodesПідрозділи, де співробітник є відповідальним. null — усі
supplier, employee, clientОзнаки ролі контрагента
activationDate, deactivationDate, deletedАктивація, деактивація, видалення
Довільні поля

У полі externalData / publicExternalData можна зберігати власні пари ключ-значення. Формат — XML усередині значення параметра, корінь довільний:

<r><entry><key>crm_id</key><value>18734</value></entry></r>

key обов'язковий, value може бути порожнім.

Посади

GET/resto/api/employees/roles

revisionFrom з 6.4

ПолеОпис
id, code, nameІдентифікатор, код, назва посади
paymentPerHourОплата за годину, грн
steadySalaryЗ 6.2.2, тільки читання: оклад за місяць, грн
scheduleTypeСтратегія розрахунку зарплати: SESSION за зміну · HOURS погодинно · FIXED оклад

Оклади

GET/resto/api/employees/salary
GET/resto/api/employees/salary/byId/{employeeUUID}
GET/resto/api/employees/salary/byId/{employeeUUID}/{YYYY-MM-DD}

Третій варіант — оклад на конкретну дату. Установлення окладу — POST на /resto/api/employees/salary

Зміни й розклади

GET/resto/api/employees/schedule/types
GET/resto/api/employees/schedule/?from={d}&to={d}&withPaymentDetails={bool}&revisionFrom=-1
GET/resto/api/employees/schedule/byEmployee/{employeeUUID}/?from={d}&to={d}
GET/resto/api/employees/schedule/byDepartment/{departmentCode}/?from={d}&to={d}
GET/resto/api/employees/schedule/department/{departmentId}/?from={d}&to={d}
GET/resto/api/employees/schedule/byId/{scheduleUUID}
POST/resto/api/employees/schedule/create
POST/resto/api/employees/schedule/update

Дати YYYY-MM-DD. withPaymentDetails=true додає розрахунок оплати. Є варіанти byDepartment/{code} (за кодом підрозділу) і department/{id} (за GUID), а також комбінація з byEmployee

Явки

GET/resto/api/employees/attendance/types
GET/resto/api/employees/attendance?from={d}&to={d}&withPaymentDetails={bool}&revisionFrom=-1
GET/resto/api/employees/attendance/byEmployee/{employeeUUID}/?from={d}&to={d}
GET/resto/api/employees/attendance/byDepartment/{departmentCode}/?from={d}&to={d}
GET/resto/api/employees/attendance/department/{departmentId}/?from={d}&to={d}
GET/resto/api/employees/attendance/byId/{attendanceUUID}
POST/resto/api/employees/attendance/create
POST/resto/api/employees/attendance/update
GET/resto/api/employees/availability/list?from={d}&to={d}&department={uuid}&role={uuid}&user={uuid}

Останній метод — доступність співробітників (побажання щодо графіка)

Бригади офіціантів

GET/resto/api/employees/waiterTeams
GET/resto/api/employees/waiterTeams/byDepartment/{departmentUUID}
GET/resto/api/employees/waiterTeams/byCode/{teamCode}
GET/resto/api/employees/waiterTeams/byId/{teamUUID}
GET/resto/api/employees/waiterTeams/search?{param}={regexp}&includeDeleted={bool}
GET/resto/api/employees/waiterTeams/assignments
GET/resto/api/employees/waiterTeams/assignments/byDepartment/{departmentId}

assignments — призначення офіціантів у бригади

16Залишки і звіти

Залишки на складах

GET/resto/api/v2/reports/balance/stores

Версія 5.2 · основний спосіб отримати залишки — швидкий, на відміну від OLAP

ПараметрОпис
timestampОбов'язковий. Облікова дата-час звіту, yyyy-MM-ddTHH:mm:ss
departmentGUID підрозділу, можна кілька
storeGUID складу, можна кілька
productGUID елемента номенклатури, можна кілька
GET /resto/api/v2/reports/balance/stores?timestamp=2026-08-18T23:10:10

[
  { "store":"657ded9f-…", "product":"f464e4d4-…", "amount":123,   "sum":64083 },
  { "store":"1239d270-…", "product":"c6d6c2f2-…", "amount":29.45, "sum":1159.3 }
]

amount — кількісний залишок, sum — грошовий, у гривнях.

Баланси за рахунками і контрагентами

GET/resto/api/v2/reports/balance/counteragents

Версія 5.2 · параметри: timestamp (обов'язковий), account, counteragent, department — усі можна повторювати

[
  { "account":"657ded9f-…", "counteragent":null, "department":"ef9461e9-…", "sum":64083 },
  { "account":"8a11a460-…", "counteragent":null, "department":"ef9461e9-…", "sum":-50 }
]

Це готова відповідь на питання «скільки ми винні постачальнику» і «скільки грошей на рахунку» на конкретний момент.

Складські звіти

GET/resto/api/reports/storeOperations

Версія 3.9 · відповідь: storeReportItemDto

ПараметрЗначенняОпис
dateFrom, dateToDD.MM.YYYYПеріод
storesGUIDСклади. Порожньо — усі
documentTypesEnumТипи документів (розділ 21). Порожньо — усі
productDetalizationBooleantrue — деталізація по товарах, але без дати. false — кожен документ одним рядком із сумами
showCostCorrectionsBooleanЧи включати корекції собівартості. Враховується лише разом із фільтром за типами документів; інакше корекції включаються завжди
presetIdGUIDПреднастроєний звіт. Якщо вказаний — усі налаштування, крім дат, ігноруються
GET/resto/api/reports/storeReportPresets

Список преднастроєних складських звітів, збережених у бек-офісі

GET/resto/api/reports/productExpense

Витрата продуктів за продажами · параметри: department, dateFrom, dateTo, hourFrom, hourTo (за замовчуванням -1 — увесь час)

GET/resto/api/reports/sales

Звіт з виручки · додатково: dishDetails (розбивка по стравах, за замовч. false) і allRevenue (true — усі типи оплат, false — тільки виручка)

GET/resto/api/reports/monthlyIncomePlan

План з виручки за день · department, dateFrom, dateTo

Звіти з доставки

У всіх методів цієї групи спільні параметри: department (код або GUID у форматі department={code="005"}; без нього — по всіх підрозділах у Chain), dateFrom, dateTo (DD.MM.YYYY або YYYY-MM-DD).

GET/resto/api/reports/delivery/consolidated

Зведений звіт: середній чек, кількість страв, кількість замовлень за днями. Додатковий параметр writeoffAccounts — рахунки списання

GET/resto/api/reports/delivery/couriers

Звіт по кур'єрах. Цільові показники: targetCommonTime (за замовч. 30 хв), targetOnTheWayTime, targetDoubledOrders, targetTripledOrders, targetTotalOrders. Тип метрики: AVERAGE, TARGET, MAXIMUM

GET/resto/api/reports/delivery/orderCycle

Цикл замовлення. Цільові: targetPizzaTime, targetCuttingTime, targetOnShelfTime, targetInRestaurantTime, targetOnTheWayTime, targetTotalTime

GET/resto/api/reports/delivery/halfHourDetailed

Півгодинний деталізований звіт

GET/resto/api/reports/delivery/regions

Звіт по регіонах: середній час доставки, відсоток доставлених, максимум замовлень за день

GET/resto/api/reports/delivery/loyalty

Лояльність: нові гості, замовлень на гостя. Додатково metricType: AVERAGE, MINIMUM, MAXIMUM

17OLAP v1

Проста GET-версія OLAP: усі поля передаються параметрами URL. Для нових інтеграцій рекомендується v2 (розділ 18), але v1 зручний для швидких перевірок і одноразових вивантажень.

GET/resto/api/reports/olap

Версія 3.9

ПараметрЗначенняОпис
reportSALES · TRANSACTIONS · DELIVERIES · STOCKПродажі · проводки · доставки · контроль зберігання
from, toDD.MM.YYYYПеріод
groupRowім'я поляГрупування по рядках. Повторюваний параметр
groupColім'я поляГрупування по колонках
agrім'я поляАгрегація
summarytrue / falseЧи рахувати підсумки. З 9.1.2 за замовчуванням false. З false звіт будується значно швидше
https://localhost:8080/resto/api/reports/olap
  ?key=ec621550-afae-133e-80c8-76155db2b268
  &report=SALES&from=01.08.2026&to=18.08.2026
  &groupRow=WaiterName&groupRow=OpenTime
  &agr=fullSum&agr=OrderNum

Найуживаніші поля звіту «Продажі»

ПолеОписГрупув.Агрег.Тип
OpenDate.TypedДата відкриття (для фільтра за датою)такніDATE
OpenTimeЧас відкриттятакніDATETIME
CloseTimeЧас закриттятакніDATETIME
DishNameСтраватакніSTRING
DishSumIntСума страви, грннітакMONEY
DishDiscountSumIntСума зі знижкою, грннітакMONEY
DishAmountIntКількість стравнітакAMOUNT
WaiterNameОфіціанттакніSTRING
OrderNumНомер замовленнятактакINTEGER
PayTypesТипи оплатитакніSTRING
SessionNumНомер касової змінитакніINTEGER
DeletedWithWriteoffТип видалення стравитакніENUM
OrderDeletedОзнака видалення замовленнятакніENUM
DishServicePrintTime.MaxСервісний друк останньої стравинітакDATETIME

Найуживаніші поля звіту «Проводки»

ПолеОписШвидкий залишокТип
Account.NameРахунок (у тому числі склад)такSTRING
Account.CodeКод рахункутакSTRING
Account.TypeТип рахункутакENUM
Account.GroupГрупа рахункутакENUM
Account.AccountHierarchyTopThirdІєрархія рахунку по рівняхтакSTRING
Contr-Account.NameКор. рахунок / складніSTRING
DateTime.DateTypedОбліковий день — поле для фільтра за датоютак*DATE
DateTime.TypedДата і частак*DATETIME
DateTime.Hour, DayOfWeak, Month, YearЧас, день тижня, місяць, ріктак*STRING
Product.Name, Product.NumЕлемент номенклатури, артикултакSTRING
Product.Hierarchy, TopParent, SecondParent, ThirdParentІєрархія і групи номенклатури по рівняхтакSTRING
Product.MeasureUnitОдиниця вимірутакSTRING
Product.AccountingCategory, Product.CategoryБухгалтерська і користувацька категоріїтакSTRING
Counteragent.NameКонтрагенттакSTRING
Department, Department.Code, Department.JurPersonЗаклад, код, юрособатакSTRING
Conception, Conception.CodeКонцепціятакSTRING
CashFlowCategory та ієрархіяСтаття ДДСтакSTRING
DocumentНомер документаніSTRING
Amount, Amount.In, Amount.OutКількість, прихід, витратаAMOUNT
Sum.Incoming, Sum.OutgoingСуми приходу і витрати, грнMONEY
Product.AvgSumСередня ціна, грнMONEY
StartBalance.Amount, StartBalance.MoneyПочатковий залишок товару і грошейAMOUNT / MONEY
FinalBalance.Amount, FinalBalance.MoneyКінцевий залишок товару і грошейAMOUNT / MONEY
PercentOfSummary.ByRow, ByCol% по рядку / по стовпцюніPERCENT
Залишки в OLAP — це пастка

Поля StartBalance.* і FinalBalance.* обчислюються підсумовуванням усієї таблиці проводок за весь час роботи системи. Такий запит може виконуватися дуже довго і сповільнити сервер.

З 5.5 такі запити оптимізовані через балансові таблиці — але лише якщо групування і фільтри використовують поля, позначені як «швидкий залишок» (StartBalanceOptimizable). Оптимізовано саме Account.Name (рахунок «поточної» сторони проводки, зокрема склад), а не Store.

Правило: склад завжди беріть із Account.Name, а не зі Store — воно рахується значно швидше. А для залишків краще взагалі не використовуйте OLAP: є /resto/api/v2/reports/balance/stores (розділ 16).

Звіти по доставці — поля

Група Delivery.*: Delivery.Number номер доставки, Delivery.Courier кур'єр, Delivery.Address, Delivery.City, Delivery.Street, Delivery.Region район, Delivery.Phone, Delivery.Email, Delivery.CustomerName, Delivery.CustomerComment, Delivery.DeliveryComment, Delivery.MarketingSource реклама, Delivery.SourceKey джерело, Delivery.CancelCause причина скасування, Delivery.ServiceType (PICKUP / COURIER), Delivery.ExpectedTime, Delivery.ActualTime, Delivery.SendTime, Delivery.CloseTime, Delivery.BillTime, Delivery.Delay запізнення у хвилинах, Delivery.WayDuration час у дорозі.

18OLAP v2

Рекомендована версія. Запит — JSON у тілі POST, а перелік доступних полів можна отримати з самого сервера.

Які поля доступні

GET/resto/api/v2/reports/olap/columns?reportType={SALES|TRANSACTIONS|DELIVERIES}

Версія 4.1 · застарілі (deprecated) поля не виводяться

"FieldName": {
  "name": "Назва в бек-офісі",
  "type": "MONEY",
  "aggregationAllowed": true,
  "groupingAllowed": false,
  "filteringAllowed": false,
  "tags": ["Оплата"]
}
ПолеОпис
FieldNameІм'я колонки. Саме його ви передаєте в запиті
nameНазва колонки в бек-офісі. Довідково
typeENUM · STRING · ID (внутрішній ідентифікатор, з 5.0) · DATETIME · INTEGER · PERCENT (0…1) · DURATION_IN_SECONDS · AMOUNT · MONEY
aggregationAllowedЧи можна агрегувати
groupingAllowedЧи можна групувати
filteringAllowedЧи можна фільтрувати
tagsКатегорії поля — те саме, що в правому верхньому куті конструктора звіту

Побудова звіту

POST/resto/api/v2/reports/olap

Версія 4.1 · Content-type: application/json; charset=utf-8

{
  "reportType": "SALES",
  "buildSummary": false,
  "groupByRowFields": ["OpenDate.Typed", "DishName"],
  "groupByColFields": [],
  "aggregateFields":  ["DishDiscountSumInt", "DishAmountInt"],
  "filters": {
    "OpenDate.Typed": {
      "filterType": "DateRange",
      "periodType": "CUSTOM",
      "from": "2026-08-01T00:00:00.000",
      "to":   "2026-08-31T00:00:00.000"
    },
    "OrderDeleted": { "filterType": "IncludeValues", "values": ["NOT_DELETED"] }
  }
}
ПолеОпис
reportTypeSALES продажі · TRANSACTIONS проводки · DELIVERIES доставки
buildSummaryЗ 5.3.4. Необов'язкове. До 9.1.2 за замовчуванням true, з 9.1.2 — false
groupByRowFieldsПоля групування по рядках. Лише ті, у яких groupingAllowed = true
groupByColFieldsНеобов'язкове. Групування по стовпцях
aggregateFieldsПоля агрегації
filtersФільтри. Лише поля з filteringAllowed = true
З версії 5.5 фільтр за датою обов'язковий

Кожен OLAP-запит має містити фільтр за датою. Для продажів і доставок це OpenDate.Typed, для проводок — DateTime.DateTyped (дата) або DateTime.Typed (дата-час). У версії 4.1 замість них використовувалися OpenDate і DateTime.OperDayFilter.

Фільтр за значенням

Для полів типу ENUM і STRING.

"DeletedWithWriteoff": {
  "filterType": "ExcludeValues",
  "values": ["DELETED_WITH_WRITEOFF", "DELETED_WITHOUT_WRITEOFF"]
}

IncludeValues — беруться лише перелічені значення; ExcludeValues — усі, крім перелічених.

Фільтр за діапазоном

Для INTEGER, PERCENT, AMOUNT, MONEY.

"SessionNum": { "filterType": "Range", "from": 758, "to": 760, "includeHigh": true }

includeLow за замовчуванням true, includeHighfalse.

Фільтр за датою

"OpenDate.Typed": {
  "filterType": "DateRange",
  "periodType": "CUSTOM",
  "from": "2026-08-01T00:00:00.000",
  "to":   "2026-08-03T00:00:00.000",
  "includeLow": true,
  "includeHigh": false
}
periodTypeЗначення
CUSTOMВручну: працюють from, to, includeLow, includeHigh
OPEN_PERIODПоточний відкритий період
TODAY / YESTERDAYСьогодні / вчора
CURRENT_WEEK / CURRENT_MONTH / CURRENT_YEARПоточний тиждень / місяць / рік
LAST_WEEK / LAST_MONTH / LAST_YEARМинулий тиждень / місяць / рік

Для всіх типів, крім CUSTOM, решта параметрів ігнорується — крім from: його передавати обов'язково, значення може бути будь-яким.

includeHigh і час

Включати верхню межу має сенс лише для полів, що видають округлену дату, а не дату-час. Для DATETIME лишайте includeHigh: false, інакше отримаєте зайвий день.

Структура відповіді

{
  "data": [
    { "OpenDate.Typed":"2026-08-01", "DishName":"Борщ",
      "DishDiscountSumInt":2450.00, "DishAmountInt":35 }
  ],
  "summary": [
    [ {}, { "DishDiscountSumInt":184300.00, "DishAmountInt":2610 } ],
    [ { "OpenDate.Typed":"2026-08-01" },
      { "DishDiscountSumInt":6120.00, "DishAmountInt":88 } ]
  ]
}
  • data — лінійні дані звіту, по рядку на запис. Один запис = один рядок у гриді бек-офісу.
  • summary — список блоків із двох структур. Перша — поля групування, за якими зібраний проміжний підсумок (порожня — це загальний підсумок по звіту). Друга — самі підсумки по полях агрегації.
  • При buildSummary: false масив summary буде порожнім.

Преднастроєні звіти

GET/resto/api/v2/reports/olap/presets
GET/resto/api/v2/reports/olap/presets/{presetType}
GET/resto/api/v2/reports/olap/byPresetId/{presetId}?dateFrom={d}&dateTo={d}

Версія 4.2 · presetType: stock, sales, transactions, deliveries

Найшвидший спосіб зібрати складний звіт

Не складайте JSON вручну. Побудуйте потрібний OLAP у Syrve Office (розділ «Роздрібні продажі» → «OLAP звіт з продажів» або «Фінанси» → «OLAP звіт з проводок»), додайте поля й період, збережіть під назвою — і викликайте його через byPresetId. Список збережених конфігурацій віддає /presets.

У бек-офісі комбінація Ctrl + Shift + F3 відкриває вікно з параметрами поточного OLAP-звіту — на них зручно орієнтуватися, складаючи запит в API.

19Журнал подій

Потрібні: ліцензійний модуль 2200 (він же API_EVENTS(2200), «iikoAPI (ApiEvents)») і право B_VTJ «Переглядати журнал подій».

Список подій

GET/resto/api/events

Версія 3.9 · відповідь: eventsList

ПараметрФорматОпис
from_timeyyyy-MM-ddTHH:mm:ss.SSSЗ якого часу. За замовчуванням — початок поточної доби
to_timeyyyy-MM-ddTHH:mm:ss.SSSПо який час, не включно. За замовчуванням межі немає
from_revчислоРевізія. Кожна відповідь містить тег revision; наступного разу передавайте revision + 1

У штатному режимі одна й та сама подія повторно з різними ревізіями не приходить, але гарантії цього немає. GUID події унікальний — використовуйте його як ключ дедуплікації.

Фільтр за типами подій і номерами замовлень

POST/resto/api/events

Версія 5.0 · тіло application/xml

<eventsRequestData>
  <events>
    <event>orderCancelPrecheque</event>
    <event>orderPaid</event>
  </events>
  <orderNums>
    <orderNum>175658</orderNum>
  </orderNums>
</eventsRequestData>

Дерево типів подій

GET/resto/api/events/metadata
POST/resto/api/events/metadata

Версія 3.9 (GET) і 5.0 (POST з фільтром) · відповідь: groupsList

Повертає ієрархію подій — аналог дерева журналу подій у бек-офісі. Поле <id> групи або типу — це те, що ви підставляєте в <type> події. Структура також визначає список атрибутів, специфічних для кожної події, і severity (0 — низька, 1 — середня, 2 — висока).

Запис власних подій

POST/resto/api/events/add

Версія 8.0.3 · тіло — eventsList

<eventsList>
  <event>
    <date>2026-08-28T19:24:29.033+03:00</date>
    <type>externalDelivery</type>
    <departmentId>2</departmentId>
    <attribute>
      <name>userName</name><value>Адміністратор</value>
      <type>java.lang.String</type>
    </attribute>
    <attribute>
      <name>success</name><value>1</value>
      <type>java.lang.Boolean</type>
    </attribute>
  </event>
</eventsList>
type атрибутаЩо класти у value
java.lang.Boolean"0" — false, "1" — true
java.lang.StringТекст
java.util.DateДата у форматі yyyy-MM-dd'T'HH:mm:ss.SSS
resto.db.GuidUUID
Нащадки java.lang.Number (java.lang.Integer, java.math.BigDecimal)Число
Нащадки resto.db.CachedEntity (User, Department, Terminal)UUID відповідного довідника

Тип події може бути будь-яким рядком до 255 символів. Але якщо цей тип зареєстрований у events.xml, подія має містити всі обов'язкові для нього атрибути.

Касові зміни з журналу подій

GET/resto/api/events/sessions?from_time={t}&to_time={t}

Версія 5.0 · час відкриття і закриття, менеджер, номер зміни, номер каси, операційний день

20Реплікація

Методи мають сенс лише на Syrve Chain. На окремому RMS перші два повернуть помилку.

GET/resto/api/replication/statuses

Версія 5.0 · список статусів останніх реплікацій усіх під'єднаних до Chain серверів RMS

GET/resto/api/replication/byDepartmentId/{departmentId}/status

Статус реплікації конкретного закладу. Помилка, якщо в Chain немає закладу з таким GUID

GET/resto/api/replication/serverType

Тип сервера: CHAIN, REPLICATED_RMS, STANDALONE_RMS. Працює скрізь — зручно як перша перевірка того, з чим ви взагалі з'єдналися

21Коди базових типів

Ці рядкові константи використовуються і в параметрах запитів, і у відповідях, і як значення enum-фільтрів в OLAP. Перекладу не підлягають.

Типи документів

КодНазваСкор.
INCOMING_INVOICEПрибуткова накладнап/н
OUTGOING_INVOICEВидаткова накладнар/н
RETURNED_INVOICEПовернена накладнав/н
INCOMING_INVENTORYІнвентаризаціяінв
INCOMING_SERVICEАкт приймання послугв/с
OUTGOING_SERVICEАкт надання послугв/с
WRITEOFF_DOCUMENTАкт списанняа/с
SALES_DOCUMENTАкт реалізаціїа/р
SALES_RETURN_DOCUMENTАкт приймання поверненняп/в
SESSION_ACCEPTANCEПрийняття змінип/с
INTERNAL_TRANSFERВнутрішнє переміщенняв/п
PRODUCTION_DOCUMENTАкт приготуванняа/пр
TRANSFORMATION_DOCUMENTАкт переробкиа/пб
DISASSEMBLE_DOCUMENTАкт розбиранняа/рб
PRODUCTION_ORDERЗамовлення у виробництвоз/п
CONSOLIDATED_ORDERКонсолідоване замовленняк/з
PREPARED_REGISTERВідомість напівфабрикатівв/пф
MENU_CHANGEНаказ про зміну прейскурантап/м
PRODUCT_REPLACEMENTЗаміна товарівз/т
PAYROLLПлатіжна відомістьз/в
INCOMING_CASH_ORDERПрибутковий касовий ордерп/ко
OUTGOING_CASH_ORDERВидатковий касовий ордерр/ко

Типи проводок

КодНазва
OPENING_BALANCEПочатковий баланс
CUSTOMРучна проводка
CASHПродаж за готівку
CARDВиручка за картками
CREDITВиручка в кредит
PREPAYПередоплата
PREPAY_CLOSEDПродаж із передоплатою
PREPAY_RETURNПовернення передоплати
PREPAY_CLOSED_RETURNПовернення продажу з передоплатою
DISCOUNTЗнижка
PAYINВнесена сума
PAYOUTВилучена сума
PAY_COLLECTIONЗнята виручка (інкасація)
CASH_CORRECTIONКорекція по касі
CASH_SURPLUSНадлишок по касі
CASH_SHORTAGEНестача по касі
INVENTORY_CORRECTIONІнвентаризація
STORE_COST_CORRECTIONКорекція собівартості
INVOICEНакладна
INVOICE_PAYMENTОплата накладної
NDS_INCOMINGПДВ вхідний
NDS_SALESПДВ з продажів
SALES_REVENUEВиручка від реалізації
OUTGOING_INVOICEВидаткова накладна
OUTGOING_INVOICE_REVENUEВиручка видаткової накладної
RETURNED_INVOICEПовернена накладна
RETURNED_INVOICE_REVENUEВиручка поверненої накладної
WRITEOFFСписання
SESSION_WRITEOFFРеалізація товарів
TRANSFERВнутрішнє переміщення
TRANSFORMATIONАкт переробки
PRODUCTIONАкт приготування
DISASSEMBLEАкт розбирання
SALES_RETURN_PAYMENTОплата приймання повернення
SALES_RETURN_WRITEOFFПовернення товарів
ON_THE_HOUSEОплата замовлення за рахунок закладу
CLOSE_AT_EMPLOYEE_EXPENSEЗакриття столу за рахунок співробітника
TARIFF_HOURПогодинна оплата
TARIFF_PERCENTВідсоток із продажів
INCENTIVE_PAYMENTМотивація
PENALTYШтраф
BONUSПремія
ADVANCEАванс із зарплати
EMPLOYEE_PAYMENTНарахування окладу
EMPLOYEE_CASH_PAYMENTВидача готівки співробітникам
SESSION_ACCEPTANCEПрийняття зміни
INCOMING_SERVICEОтримання послуг
OUTGOING_SERVICEНадання послуг
INCOMING_SERVICE_PAYMENTОплата отримання послуг
OUTGOING_SERVICE_PAYMENTОплата надання послуг
OUTGOING_DOCUMENT_PAYMENTПрийняття оплати вихідного документа
OUTGOING_SALES_DOCUMENT_PAYMENTПрийняття оплати акта реалізації
IMPORTED_BANK_STATEMENTЗавантаження банківської виписки

Рахунки

Група рахунку

ASSETS активи · LIABILITIES зобов'язання · EQUITY капітал · INCOME_EXPENSES доходи/витрати

Склад чи рахунок

STORE склад · ACCOUNT рахунок

Дебет / кредит

DEBIT · CREDIT

Участь у ДДС

CASH_FLOW бере участь · NOT_CASH_FLOW не бере участі

Тип рахункуНазва
CASHГрошові кошти
ACCOUNTS_RECEIVABLEЗаборгованість покупців
DEBTS_OF_EMPLOYEESЗаборгованість співробітників
CURRENT_ASSETПоточні активи
OTHER_CURRENT_ASSETОсновні засоби
INVENTORY_ASSETSСкладські запаси
EMPLOYEES_LIABILITYРозрахунки зі співробітниками
ACCOUNTS_PAYABLEРозрахунки з постачальниками
CLIENTS_LIABILITYРозрахунки з гостями
OTHER_CURRENT_LIABILITYІнші поточні зобов'язання
LONG_TERM_LIABILITYДовгострокові зобов'язання
EQUITYКапітал
COST_OF_GOODS_SOLDПрямі витрати (собівартість)
INCOME / EXPENSESДоходи / витрати
OTHER_INCOME / OTHER_EXPENSESІнші доходи / інші витрати

Номенклатура і контрагенти

ГрупаЗначення
Тип елемента номенклатуриGOODS товар · DISH страва · PREPARED заготовка · SERVICE послуга · MODIFIER модифікатор · OUTER зовнішні товари · PETROL паливо · RATE тариф
Тип товару (в OLAP)DISH · GOOD · MODIFIER
Типи груп продуктуPRODUCTS продукт · MODIFIERS модифікатор (використовується лише в номенклатурі, що вивантажується в/з RKeeper та StoreHouse)
Тип контрагентаNONE · COUNTERAGENT усі · EMPLOYEE співробітник · SUPPLIER постачальник · CLIENT гість · INTERNAL_SUPPLIER внутрішній постачальник
Тип алкогольної продукціїSTRONG міцні · BEER пиво
Тип статті ДДСOPERATIONAL операційна · INVESTMENT інвестиційна · FINANCE фінансова діяльність

Замовлення й оплати

ГрупаЗначення
Типи видалення стравDELETED_WITHOUT_WRITEOFF видалено без списання · DELETED_WITH_WRITEOFF видалено зі списанням · NOT_DELETED не видалено
Ознака видалення замовленняNOT_DELETED · DELETED
Ознака доставкиDELIVERY_ORDER доставка · ORDER_WITHOUT_DELIVERY не доставка
Ознака банкетуTRUE банкет · FALSE не банкет
Тип операціїSTORNED сторнування · PREPAY передоплата · PREPAY_RETURN повернення передоплати · NO_PAYMENT без оплати · PAYMENT оплата
Група оплатиCASH готівка · CARD банківські картки · NON_CASH безготівковий розрахунок · WRITEOFF без виручки
Ознака фіскальностіFISCAL · NOT_FISCAL · NO_PAYMENT
Статус документаNEW · PROCESSED · DELETED

22Готові рецепти

PowerShell: авторизація, запит, вихід

$host_   = "https://localhost:8080"
$login   = "admin"
$passRaw = "myPassword"

function Get-Sha1Hex([string]$s) {
  $sha = [System.Security.Cryptography.SHA1]::Create()
  $b   = $sha.ComputeHash([Text.Encoding]::UTF8.GetBytes($s))
  ($b | ForEach-Object { $_.ToString("x2") }) -join ""
}

$pass  = Get-Sha1Hex $passRaw
$key   = Invoke-RestMethod "$host_/resto/api/auth?login=$login&pass=$pass"

try {
  # Залишки на складах на зараз
  $ts   = (Get-Date).ToString("yyyy-MM-ddTHH:mm:ss")
  $bal  = Invoke-RestMethod "$host_/resto/api/v2/reports/balance/stores?key=$key&timestamp=$ts"
  $bal | Select-Object -First 10 | Format-Table store, product, amount, sum
}
finally {
  # Звільняємо слот ліцензії навіть якщо запит упав
  Invoke-RestMethod "$host_/resto/api/logout?key=$key" | Out-Null
}

curl: OLAP v2 з фільтром за датою

KEY=$(curl -s "https://localhost:8080/resto/api/auth?login=admin&pass=$SHA1")

curl -s -X POST "https://localhost:8080/resto/api/v2/reports/olap?key=$KEY" \
  -H "Content-Type: application/json; charset=utf-8" \
  -d '{
    "reportType": "SALES",
    "buildSummary": false,
    "groupByRowFields": ["OpenDate.Typed","DishName"],
    "aggregateFields":  ["DishDiscountSumInt","DishAmountInt"],
    "filters": {
      "OpenDate.Typed": {
        "filterType":"DateRange","periodType":"CUSTOM",
        "from":"2026-08-01T00:00:00.000","to":"2026-08-08T00:00:00.000"
      }
    }
  }'

curl -s "https://localhost:8080/resto/api/logout?key=$KEY"

Інкрементальна синхронізація номенклатури

# 1. Перший прохід
GET /resto/api/v2/entities/products/list?key=…&revisionFrom=-1
# → зберігаємо revision = 187420

# 2. Кожні N хвилин
GET /resto/api/v2/entities/products/list?key=…&revisionFrom=187420
# → приходять лише змінені; оновлюємо збережену revision

# 3. Видалені елементи не зникають — вони приходять із deleted:true,
#    тому передавайте includeDeleted=true, якщо треба ловити видалення.

Типові помилки інтеграцій

СимптомПричинаРішення
Через день інтеграція перестає авторизуватисяСлоти ліцензії вичерпані: авторизувалися в циклі й не викликали logoutКешувати токен або завжди виходити у finally
Замість JSON приходить HTMLНеправильний URL, проксі, Tomcat без сервера RMS або сервер перезапускаєтьсяПеревірити базовий URL і /resto/api/replication/serverType
OLAP-запит висить хвилинамиУ полях агрегації StartBalance.* / FinalBalance.*, або buildSummary: true на великій мережіПрибрати залишки з OLAP, узяти їх із /v2/reports/balance/stores
400 Wrong date formatВикористали ISO там, де метод чекає DD.MM.YYYY (старі методи v1)Звірити формат дати з описом конкретного методу
Коментарі українською перетворюються на «???»Не вказано кодування в Content-Typeapplication/json;charset=UTF-8
Накладна проводиться, але суми не збігаютьсяНе враховано налаштування «ПДВ включено в ціну закупівлі»Прочитати /resto/api/corporation/settings
Пошук складу за кодом нічого не знаходитьКоди складів не заповнені — поле необов'язковеШукати за GUID або заповнити коди в бек-офісі
Періодично «губляться» подіїВикористали from_rev разом із to_timeПри роботі за ревізією to_time не передавати