При фіскалізації чеків зазначаються різні суми, наприклад сума чеку, або сума оплати, при розрахунках готівкою має зазначатись округлення та решта.
Далі описано загальні правила по передачі сум в чеку та як розраховувати решту і округлення.
До версії Device Manager (далі ДМ) 6.3 щоб зазначити в чеку, наприклад на суму 79.83 який оплачений готівкою номіналом 100 грн, коректно суму чека, решту та заокруглення потрібно було окремо передавати:
fiscal.receipt.sum
): 79.83fiscal.receipt.round
): -0.03"change"
в об'єкті всередині масиву fiscal.receipt.pays
): 20.2З версії 6.3 було внесено деякі спрощення:
Для виконання автоматичного округлення в чеку потрібно передати "autoround": true
в об'єкті fiscal.receipt
. Якщо даний ключ не передавати, за замовчуванням вважається як false
.
Якщо "autoround": true
в такому разі ДМ самостійно враховує необхідність виконання округлення і виконає його згідно правил. При "autoround": true
ключ "round"
не передається, або може бути переданий як 0.
При відмінних значеннях від 0 буде помилка
{
"ver": 6,
"resp_ver": 4,
"source": "",
"device": "postgres1",
"tag": "7DC54CC3-D275-4ACF-AB93-40675E82E143",
"task_status": 3,
"type": 1,
"task": 1,
"dt": "20250606151131081",
"res": 1157,
"res_action": 3,
"errortxt": "Сума округлення (\"round\") в об'єкті fiscal.receipt не може бути відмінним від нуля, якшо увімкнено автоокруглення (\"autoround\":true) ",
"aq_errortxt": "",
"warnings": []
}
Ключ "autoround": true
можна передавати в будь яких запитах, не обов'язково лише при розрахунку готівкою.
Додатково якщо "autoround": true
в оплатах (fiscal.receipt.pays
) готівкою дозволяються лише суми кратні 10 копійкам, у випадку якщо сума оплати готівкою не кратна 10 копійкам, наприклад 121.32 - буде повернуто помилку:
{
"ver": 6,
"resp_ver": 4,
"source": "",
"device": "postgres1",
"tag": "331314B7-DE9D-4538-9910-24B8158BB38D",
"task_status": 3,
"type": 1,
"task": 1,
"dt": "20250610122635857",
"res": 1164,
"res_action": 3,
"errortxt": "При автоматичному округленні (\"autoround\":true) дозволено передавати суму готівки лише кратну 10 копійкам.",
"aq_errortxt": "",
"warnings": []
}
Решта буде розрахована автоматично залежно від суми яка була передана в оплатах.
Розберемо на прикладі:
{
"ver": 6,
"device": "postgres1",
"type": 1,
"fiscal": {
"cashier": "",
"task": 1,
"receipt": {
"sum": 79.83,
"autoround": true,
"pays": [
{
"type": 0,
"sum": 100
}
],
"rows": [
{
"code1": "4044572307200",
"name": "Товар 1",
"cnt": 1,
"price": 79.83,
"cost": 79.83,
"taxgrp": 7
}
]
}
}
}
Як видно з прикладу в оплатах передана сума 100 і увімкнено автоокруглення. В такому випадку буде автоматично обраховано як округлення так і решту:
Решта та округлення стосуються тільки оплати готівкою і не використовуються для інших форм оплат.
В разі якщо передати всі дані як в запиті у прикладі, тільки змінити форму оплати на іншу окрім готівки - буде повернуто помилку:
{
"ver": 6,
"resp_ver": 2,
"source": "",
"device": "postgres1",
"tag": "4028AC7D-B36A-487A-A020-7AFBDAD4F1B1",
"task_status": 3,
"type": 1,
"task": 1,
"dt": "20240826155836748",
"res": 1102,
"res_action": 3,
"errortxt": "Сума чеку не співпадає з сумою по оплатам",
"aq_errortxt": "",
"warnings": []
}
При розрахунку формами оплати відмінними від готівки - в оплатах передається точна сума (рівна сумі всього чеку) яка була отримана від покупця.
Додатково автоматичний обрахунок решти та округлення працює при розрахунку змішаною формою оплати коли одна частина чеку оплачується готівкою, а інша - іншою формою безготівкового розрахунку.
Наприклад візьмемо чек вище, але цього разу він оплачений картою (50 грн) та готівкою (отримано від клієнта 50 грн)
{
"ver": 6,
"device": "postgres1",
"type": 1,
"fiscal": {
"cashier": "",
"task": 1,
"receipt": {
"sum": 79.83,
"autoround": true,
"pays": [
{
"type": 2,
"sum": 50
},
{
"type": 0,
"sum": 50
}
],
"rows": [
{
"code1": "4044572307200",
"name": "Товар 1",
"cnt": 1,
"price": 79.83,
"cost": 79.83,
"taxgrp": 7
}
]
}
}
}
В такому разі 50грн по карті зарахується в повному розмірі, а 50 грн отриманої готівки в чеку розіб'ється на суму оплати (29.8), округлення (-0.03) та решту (20.20)
Працюватиме після версії 6.3 обидві схеми зазначення решти та округлення в чеках, якщо реалізована одна - змінювати схему на іншу немає потреби.
В ДМ є внутрішній контроль щоб сума чеку співпадала з сумою оплат, та сума чеку співпадала з сумою товарів. Першочергово відбуваєтсья перевірка відповідності суми чеку до суми по товарам, і тільки після того суми чеку з урахуванням знижки на весь чек з сумою по оплатам.
Як відбувається перевірка:
Сума(sum
) всіх позицій(в масиві fiscal.receipt.rows
) з урахуванням знижки на кожну з позицій має співпадати з сумою по чеку(fiscal.receipt.sum
).
У випадку неспівпадіння буде помилка:
{
"ver": 6,
"resp_ver": 2,
"source": "",
"device": "postgres1",
"tag": "4028AC7D-B36A-487A-A020-7AFBDAD4F1B9",
"task_status": 3,
"type": 1,
"task": 1,
"dt": "20240826155836748",
"res": 1101,
"res_action": 3,
"errortxt": "Сума чеку не співпадає з сумою по позиціям",
"aq_errortxt": "",
"warnings": []
}
Сума по чеку(fiscal.receipt.sum
) з урахуванням знижок на весь чек(як одної так і кількох) має співпадати з загальною сумою по оплатам в чеку(fiscal.receipt.pays
) якщо використовується будь яка безготівкова форма безготівкова оплати. При оплатах готівкою можна зазначати суму в оплатах більше за суму чеку в такому разі різниця попаде в решту.
У випадку неспівпадіння буде помилка:
{
"ver": 6,
"resp_ver": 2,
"source": "",
"device": "postgres1",
"tag": "4028AC7D-B36A-487A-A020-7AFBDAD4F1B1",
"task_status": 3,
"type": 1,
"task": 1,
"dt": "20240826155836748",
"res": 1102,
"res_action": 3,
"errortxt": "Сума чеку не співпадає з сумою по оплатам",
"aq_errortxt": "",
"warnings": []
}
Наприклад:
{
"ver": 6,
"type": 1,
"device": "postgres1",
"fiscal": {
"task": 1,
"receipt": {
"sum": 60,
"discounts": [
{
"disc": 10,
"disc_type": 1,
"disc_name": "Акція"
},
{
"disc": 6.86,
"disc_type": 0,
"disc_name": "Бонуси"
}
],
"rows": [
{
"cnt": 1,
"cost": 100,
"disc": 40,
"disc_type": 0,
"name": "Товар 10",
"price": 100,
"taxgrp": 1
}
],
"pays": [
{
"sum": 47.14,
"type": 2
}
]
}
}
}
Сума по товарам ("cost": 100
або "price" * "cnt"
, якщо "cost"
не передано) 100 - сума знижки ("disc": 40
) = 60грн.
Тобто сума чеку(fiscal.receipt.sum
) має бути 60грн.
Відмінне значення від 60 призведе до помилки Сума чеку не співпадає з сумою по позиціям
Сума чеку 60грн - сума першої знижки на чек(10%) = 54грн
Сума чеку після першої знижки 54грн - сума другої знижки (6.86грн) = 47.14грн.
Тобто сума по оплатам в fiscal.receipt.pays
може бути:
Сума чеку не співпадає з сумою по оплатам
.