Интеграция Common Provider и Barsy
Common Provider е универсален адаптер в Barsy, чрез който може да се интегрира произволна система за управление на начисления — хотелски PMS, клубна система, лоялти платформа или подобна.
При приключване на сметка Barsy извиква API на насрещната система, за да начисли консумацията към съответна сметка, стая или профил. При избор на ред от списъка Barsy може автоматично да зареди клиент и да приложи отстъпка. На касовата бележка се отпечатва избраният идентификатор и поле за подпис.
Насрещната система трябва да имплементира два HTTP endpoint-а: search_list и add_charge.
Note
Тази страница е предназначена за разработчиците на насрещната система. За настройване на Barsy вижте подстраниците по-долу.
Автентикация
Всички заявки от Barsy използват HTTP Digest автентикация (RFC 7616). Насрещният сървър трябва да изиска Digest автентикация и да валидира credentials-ите, конфигурирани в настройките на Barsy в полетата Api Username и Api Password.
Конструиране на URL
Barsy конструира URL-ите като добавя пътя на endpoint-а след Api URL (trailing slash се премахва автоматично):
Api URL (конфигурация) |
Резултат за search_list |
|---|---|
|
|
|
|
Search List
Извиква се когато потребителят въвежда стойност за търсене в диалога за приключване на сметка.
Important
Настройката Източник на списък с данни (Допълнителна информация при използване → Източник на списък с данни) трябва да е От външна система. Без тази настройка Barsy няма да извика search_list.
Заявка:
Параметърът query съдържа въведения текст (URL encoded).
GET {api_url}/search_list?query={стойност}
Успешен отговор (HTTP 200):
{
"results": [
{
"value_id": "ACC-001",
"value_name": "Стая 101",
"client_id": 42,
"client_name": "Иван Иванов",
"discount": 10,
"available_amount": 250.00
},
{
"value_id": "ACC-002",
"value_name": "Стая 202",
"client_id": 15
},
{
"value_id": "ACC-003",
"value_name": "Конферентна зала А",
"client_name": "Мария Петрова"
},
{
"value_id": "ACC-004",
"value_name": "Отворена сметка бар"
}
]
}
Ако results е празен масив или липсва, Barsy показва съобщение „Няма открити резултати“.
Свойства на обектите в results:
Поле |
Тип |
Задължително |
Описание |
|---|---|---|---|
|
string |
да |
Уникален идентификатор на записа. Изпраща се при начисляване (add_charge) и се отпечатва на касовата бележка. |
|
string |
да |
Четимо описание на записа. Показва се в списъка с резултати в POS интерфейса. |
|
int |
не |
ID на клиент в Barsy. Ако е подадено, Barsy зарежда автоматично съответния клиент при избор на реда. |
|
string |
не |
Ако няма client_id, Barsy търси клиент по точно съвпадение с името. Ако не го намери, продължава без клиент. |
|
float |
не |
Отстъпка в проценти като положително число (напр. 10 за 10%). Надписва отстъпката на клиента в Barsy. |
|
float |
не |
Налична сума по сметката (напр. остатъчен бюджет, лимит, баланс по стая). Показва се на касиера до бутона на начина на плащане като „Наличност“. |
Поведение при избор на ред от списъка:
Ако има client_id — Barsy зарежда клиента по ID. Ако стойността не съответства на съществуващ клиент в Barsy, тя се пренебрегва тихо. Ако в сметката вече има избран клиент (не анонимен), новата стойност не презаписва текущата.
Ако няма client_id, но има client_name — Barsy търси по точно съвпадение с името. При неуспех — продължава без клиент.
Ако има клиент и discount — надписва отстъпката на заредения клиент. Без клиент отстъпката се пренебрегва.
Ако няма нито клиент, нито отстъпка — клиентът се нулира (анонимен) и отстъпката става 0.
Отговор при грешка:
Вижте раздел Обработка на грешки.
Add Charge
Извиква се при финализиране на плащане. Записва начислението към съответната сметка/стая/профил в насрещната система.
Полето total присъства задължително при всички режими на групиране — съдържа крайния тотал на сметката с всички отстъпки. Полето account_id е номерът на сметката в Barsy и се изпраща за обратна референция. Всички цени са с включено ДДС (брутни) и след прилагане на всички отстъпки (на ниво ред и на ниво сметка).
Форматът на тялото зависи от настройката Групиране в Barsy (вижте раздел Режими на групиране).
Заявка:
POST {api_url}/add_charge
Content-Type: application/json
Само тотал (без детайли по артикули):
{
"value_id": "ACC-001",
"account_id": 5,
"total": 33.70,
"currency": "EUR",
"service_date": "2025-11-07 14:30:00"
}
С разбивка по ДДС група (Групиране = По ДДС група, по подразбиране):
{
"value_id": "ACC-001",
"account_id": 5,
"total": 33.70,
"currency": "EUR",
"service_date": "2025-11-07 14:30:00",
"groups": [
{
"group_name": "Артикули с ДДС 20% по сметка 5",
"price": 25.600,
"tax_rate": 20
},
{
"group_name": "Артикули с ДДС 9% по сметка 5",
"price": 8.100,
"tax_rate": 9
}
]
}
С разбивка по артикул (Групиране = По ред):
{
"value_id": "ACC-001",
"account_id": 5,
"total": 8.80,
"currency": "EUR",
"service_date": "2025-11-07 14:30:00",
"orders": [
{
"article_id": 101,
"article_name": "Кафе",
"price": 3.500,
"quantity": 2,
"tax_rate": 20
},
{
"article_id": 205,
"article_name": "Минерална вода",
"price": 1.800,
"quantity": 1,
"tax_rate": 20
}
]
}
Поле |
Тип |
Описание |
|---|---|---|
|
string |
Идентификаторът, избран от search_list |
|
int |
Номер на сметката в Barsy (за обратна референция) |
|
float |
Краен тотал с всички отстъпки (с ДДС), закръглен до 2 знака. Присъства при всички режими. |
|
string |
Валутен код (ISO 4217, напр. EUR, BGN) |
|
string |
Дата и час на отваряне на сметката в Barsy, формат YYYY-MM-DD HH:MM:SS |
|
array |
При разбивка по ДДС група — масив от групи, по една за всяка различна ДДС ставка |
|
string |
Описание на групата (генерирано от Barsy) |
|
float |
Обща сума за групата с всички отстъпки (с ДДС), закръглена до 3 знака |
|
float |
ДДС ставка в проценти (напр. 20, 9, 0) |
|
array |
При разбивка по артикул — масив от редове, по един за всеки артикул |
|
int |
ID на артикула в Barsy |
|
string |
Име на артикула |
|
float |
Единична цена след всички отстъпки (с ДДС), закръглена до 3 знака |
|
float |
Количество |
|
float |
ДДС ставка в проценти |
Успешен отговор (HTTP 200):
{
"charge_id": "CHG-A1B2C3D4"
}
Поле |
Тип |
Задължително |
Описание |
|---|---|---|---|
|
string |
да |
Уникален идентификатор на начислението. Barsy го записва като transaction ID и може да се използва за справки. |
Important
Ако отговорът не съдържа charge_id (или стойността е празна/null), Barsy третира операцията като неуспешна и показва грешка на потребителя.
Отговор при грешка:
Вижте раздел Обработка на грешки.
Режими на групиране
Настройката Групиране в Barsy определя формата на данните в add_charge. Конфигурира се от оператора и не се предава динамично.
Режим |
Описание |
|---|---|
По ред |
Изпраща по един запис за всеки артикул в сметката. Подходящо за системи с детайлна отчетност по артикул. |
По ДДС група (по подразбиране) |
Изпраща по един запис за всяка ДДС ставка в сметката. Подходящо за системи с отчетност по ДДС групи. |
Само тотал |
Изпраща само total — крайната сума без детайли. Подходящо за системи, на които не са нужни разбивки по артикули. |
Обработка на грешки
При грешка вашата система трябва да върне HTTP 4xx или 5xx с JSON тяло:
{
"error_code": "ACCOUNT_CLOSED",
"message": "Четимо съобщение за грешката"
}
Поле |
Тип |
Задължително |
Описание |
|---|---|---|---|
|
string |
да |
Съобщение за грешката, разбираемо за крайния потребител. Barsy го показва директно на екрана. |
|
string |
не |
Машинно-четим код на грешката за лесно разпознаване в насрещната система. Не се показва на потребителя. |
HTTP статус |
Поведение на Barsy |
|---|---|
4xx с поле message |
Показва стойността директно на потребителя |
4xx без поле message |
Показва общо съобщение за грешка |
5xx (всякакъв) |
Показва съобщение за недостъпност на насрещната система |
Съобщенията в message следва да са написани на езика на крайния потребител (касиер/сервитьор) и да са конкретни — например „Стая 101 не приема начисления“ вместо „Грешка“.
Поток на данните
Касиер (POS) Barsy Вашата система
| | |
| 1. Избира начин на | |
| плащане | |
| | |
| 2. Въвежда стойност | |
| за търсене | |
|---------------------->| |
| | 3. GET search_list?query=.. |
| |---------------------------->|
| | |
| | 4. { "results": [...] } |
| |<----------------------------|
| | |
| 5. Вижда списъка | |
|<----------------------| |
| | |
| 6. Избира ред | |
| (зарежда клиент | |
| и отстъпка) | |
| | |
| 7. Потвърждава | |
|---------------------->| |
| | 8. POST add_charge |
| | { value_id, account_id, |
| | total, ... } |
| |---------------------------->|
| | |
| | 9. { "charge_id": "..." } |
| |<----------------------------|
| | |
| 10. Плащането е | |
| записано. | |
| Печат на бележка | |
| (value_id) | |
|<----------------------| |
Пълен пример
Хотелски PMS — настройки в Barsy:
Настройка |
Стойност |
|---|---|
Име на системата |
|
Api URL |
|
Api Username |
|
Api Password |
|
Групиране |
По ДДС група |
Източник на списък с данни |
От външна система |
Заявка search_list:
GET https://pms.example.com/api/v1/search_list?query=101
Authorization: Digest username="barsy_user", ...
Отговор:
{
"results": [
{
"value_id": "FOLIO-8842",
"value_name": "Стая 101 - Иван Петров (до 15.11)",
"client_id": 42,
"discount": 15
},
{
"value_id": "FOLIO-8901",
"value_name": "Стая 1012 - Групова резервация",
"client_name": "Корп. клиент ООД"
}
]
}
Заявка add_charge (при групиране по ДДС група):
POST https://pms.example.com/api/v1/add_charge
Authorization: Digest username="barsy_user", ...
Content-Type: application/json
{
"value_id": "FOLIO-8842",
"account_id": 5,
"total": 54.65,
"currency": "EUR",
"service_date": "2025-11-07 14:30:00",
"groups": [
{
"group_name": "Артикули с ДДС 20% по сметка 5",
"price": 42.500,
"tax_rate": 20
},
{
"group_name": "Артикули с ДДС 9% по сметка 5",
"price": 12.150,
"tax_rate": 9
}
]
}
Отговор:
{
"charge_id": "PMS-TXN-20251107-001"
}
При грешка:
HTTP/1.1 400 Bad Request
Content-Type: application/json
{
"error_code": "ACCOUNT_CHECKED_OUT",
"message": "Стая 101 е checkout-ната. Моля, изберете активна стая."
}
Чеклист за имплементация
Endpoint-и
GET /search_list?query=… — приема query параметър, връща JSON с results
POST /add_charge — приема JSON body, връща JSON с charge_id
Автентикация
HTTP Digest автентикация е конфигурирана и работи
Невалидни credentials връщат 401 Unauthorized
Search List
Отговорът съдържа масив results (дори празен)
Всеки резултат има задължителните полета value_id и value_name
value_id е уникален идентификатор (ще се използва в add_charge)
client_id (ако се подава) съответства на реален клиент в Barsy
discount е положително число (напр. 10, а не -10)
available_amount (ако се подава) представлява налична сума по сметката
Add Charge
Поддържа се само тотал (без детайли по артикули)
Поддържа се разбивка по ДДС група, ако е необходимо
Поддържа се разбивка по артикул, ако е необходимо
Отговорът съдържа непразен charge_id
charge_id е уникален за всяко начисление
Обработка на грешки
Грешките връщат HTTP 4xx/5xx
Тялото съдържа JSON с поле message
Съобщенията са разбираеми за крайния потребител
Опционално: добавен error_code за машинно разпознаване на грешки
Общи
Content-Type на отговорите е application/json
Кодировка UTF-8
HTTPS е препоръчителен (credentials се предават при всяка заявка)