Для того щоб в чеку відобразити знижку на якусь певну суму чи % потрібно передати це значення в Device Manager в запиті на фіскалізацію чеку на продаж ("task": 1
) або на повернення("task": 2
).
Device Manager(далі ДМ) підтримує такі можливості при застосуванні знижок/націнок:
"discounts"
.В ДПС знижки не важливо якого типу із вищезазначених передаються як знижки на податкову групу товару із вказанням позиції в чеку до якої стосується знижка, тому рекомендовано ознайомитись з описом нижче для розуміння як коректно працювати зі знижками.
Загально типи знижок можемо поділити на 4 категорії:
По розрахунку знижки на позицію яка сума або який відсоток знижки передано - така значення знижки буде застосовано.
По розрахунку знижки на весь чек при застосуванні сумової і відсоткової знижки є різниця.
Якщо використано знижку на весь чек - знижка завджи розподіляється по всім товарам в чеку.
Умовно маємо приклад чеку 10 позицій, кожна має вартість 100 грн.
При застосуванні відсоткової знижки, наприклад 10% буде знято 10% від вартості кожного товару, тобто по 10грн.
Загальна знижка буде складати: 10 (товарів) * 10 (сума знижки з кожного товару) = 100
При застосуванні сумової загальної знижки на чек (наприклад 200грн) вираховуємо % суми кожного товару (не податкової групи а саме товару) від загальної суми чеку без урахування загальної знижки.
На останній товар в списку переданих накладається сума знижки за мінусом всіх інших знижок на інші товари.
-сума чеку 1000грн
-кожен товар в чеку має частку 10%
-на кожен товар буде застосовано суму знижки 20грн.
Приклад на чеку:
{
"tag": "",
"ver": 6,
"type": 1,
"device": "postgres1",
"fiscal": {
"task": 1,
"receipt": {
"sum": 56.86,
"discounts": [
{
"disc": 6.86,
"disc_name": "Знижка на весь чек"
}
],
"pays": [
{
"rrn": "",
"sum": 50,
"type": 0
}
],
"rows": [
{
"cnt": 1,
"code": "204365",
"cost": 11.2,
"disc": 2.24,
"name": "Товар 1",
"code2": "1904109000",
"price": 11.2,
"taxgrp": 1
},
{
"cnt": 1,
"code": "200710",
"cost": 63.5,
"disc": 15.6,
"name": "Товар 2 з акцизом",
"code2": "2203000100",
"price": 63.5,
"taxgrp": 3
}
]
}
}
}
Загальна знижка на весь чек 6.86,
Позицій в чеку 2. Тобто сума 6.86 поділиться на 2 позиції.
Фінальна сума після застосування всіх знижок
Товар 1 = 7.88
Товар 2 = 42.12
Розрахунок обігу по групі:
Товар 1 група А
Суму товару з урахуванням знижки на товар (якщо така наявна) ділимо на суму чека без урахування загальної знижки на чек.
11.2 - 2.24 = 8.96
8.96 / 56.86 = 0.15758
0.15758 * 6.86 = 1.08 (сума одразу заокруглена до 2-х знаків після коми)
1.08 загальної знижки пішло на 1 товар в чеку з групою А
Другий товар в чеку останній, тому там знижка вираховується по схемі: загальна знижка мінус сума всіх знижок по товарам до цього.
6.86 - 1.08 = 5.78
По першому товару
11.2 - 2.24 = 8.96
8.96 - 1.08 = 7.88
Сума 7.88
По другому товару
63.5 - 15.6 = 47.9
47.9 - 5.78 = 42.12
Сума 42.12
Якщо передано кілька знижок, всі знижки після першої нараховуються послідовно одна за одною, не важливо чи передано відсоткову знижку чи сумову, на чек або на позицію.
Приклад:
Вказуємо 2 знижки - перша 10%, друга 300 грн.
Спочатку нараховується перша, тобто 1000 - 100(10%) = 900, далі нараховується друга, тобто 900 - 300 = 600.
Аналогічно 2 відсоткові знижки: - перша 10%, друга 20%
Спочатку нараховується перша, тобто 1000 - 100(10%) = 900, далі нараховується друга, тобто 900 - 180 = 720.
При роботі з чеками на продаж/повернення важливо обрахувати та передати коректне значення сум для всіх позицій(товарів чи послуг) в чеку, суми та оплат по чеку в тому числі з урахуванням знижок/націнок.
Значення знижки/націнки передається наступними параметрами:
"disc"
- значення знижки. Обов'язковий параметр, при застосуванні знижки.
Додатнє значення, наприклад: "disc": 50
вважаєтсья знижкою;
Від'ємне значення, наприклад: "disc": -50
вважається націнкою.
"disc_type"
- тип знижки. 0 - сумова, 1 - відсоткова. Не обов'язковий параметр, якщо не передано = 0.
"disc_type": 0
і "disc": 50
- 50 грн сумової знижки
"disc_type": 1
і "disc": 50
- знижка 50%
"disc_name"
- назва для знижки для відображення в друкованій формі чеку. Не обов'язковий параметр.
"disc_apply_type"
- тип застосування знижки. Не обов'язковий параметр, якщо не передано = 3. Необіхдно передавати при фіскалізації чеку по якому була здійснена попередня оплата. Сума попередньої оплати має бути передана як знижка.
1 - знижка на суму попередньої оплати, 3 - звичайна знижка.
Якщо потрібно передати кілька знижок, значення всіх вищеперерахованих параметрів потрібно передати в масиві "discounts"
на позицію в чеку чи на весь чек. Для зручності можна передавати і одну знижку в масиві "discounts"
.
Приклад:
"discounts": [
{
"disc": 10,
"disc_type": 1,
"disc_name": "Акція"
},
{
"disc": 6.86,
"disc_type": 0,
"disc_name": "Бонуси"
}
],
За замовчуванням при передачі знижки на весь чек - вона нараховується на всі товари в чеку. Але з версії 5.197 є можливість відключити нарахування загальної знижки на товари які обкладаються додатковим збором, наприклад для товарів що мають групи:
Для цього в fiscal.receipt
потрібно передати значення "disc_calc_alg": 1
. Якщо передано - знижка яка передана на весь чек - не буде застосовуватись до товарів де до основного податку наявний додатковий збір.
В такому разі при використанні % знижки на весь чек - фінальна сума знижки буде відрізнятись.
Наприклад в чеку 4 товари по 100грн кожен, 2 із них з податковою групою ПДВ 20% + Акциз 5%
Загальна знижка на чек 10%
Якщо не передано "disc_calc_alg"
або передано 0 - сума знижки буде 40грн
Якщо передано "disc_calc_alg": 1
- сума знижки буде 20грн, тому що 2 товари з акцизом не підпадають на нарахування знижки.
Також варто врахувати якщо передано знижку на весь чек та "disc_calc_alg": 1
і в чеку немає товарів на які можна нарахувати знижку, буде повернуто помилку:
{
"ver": 6,
"resp_ver": 2,
"source": "",
"device": "postgres1",
"tag": "D411E0ED-C4CA-49B7-BF2F-093B8A134E47",
"task_status": 3,
"type": 1,
"task": 1,
"dt": "20240826164349776",
"res": 1138,
"res_action": 3,
"errortxt": "Якщо disc_calc_alg = 1, хоча б один товар в чеку повинен мати податкову групу без додаткового збору.",
"aq_errortxt": "",
"warnings": []
}
В ДМ є внутрішній контроль щоб сума чеку співпадала з сумою оплат, та сума чеку співпадала з сумою товарів. Першочергово відбуваєтсья перевірка відповідності суми чеку до суми по товарам, і тільки після того суми чеку з урахуванням знижки на весь чек з сумою по оплатам.
Як відбувається перевірка:
Сума(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": 1
}
]
}
}
}
Сума по товарам ("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
має бути рівна 47.14грн.
Відмінне значення від 47.14 призведе до помилки Сума чеку не співпадає з сумою по оплатам
.
Нижче буде наведено кілька прикладів чеку на продаж(для повернення все працює аналогічно) json body запиту коректної передачі даних.
Можна всі значення знижок на позицію або на весь чек в прикладах також передавати через масив об'єктів "discounts"
{
"ver": 6,
"source": "API",
"device": "postgres1",
"tag": "",
"type": 1,
"fiscal": {
"task": 1,
"receipt": {
"sum": 500,
"disc": 0,
"disc_type": 0,
"comment_down": "",
"rows": [
{
"code": "01",
"name": "Товар1",
"cnt": 3,
"price": 100,
"disc": 0,
"disc_type": 0,
"cost": 0,
"taxgrp": 1
},
{
"code": "02",
"name": "Товар2",
"cnt": 1,
"price": 200,
"disc": 0,
"disc_type": 0,
"cost": 200,
"taxgrp": 2
}
],
"pays": [
{
"type": 2,
"sum": 500,
"change": 0,
"paysys": "VISA",
"rrn": "123",
"cardmask": "1223******1111",
"term_id": "123456888",
"bank_id": "BANK123",
"auth_code": "AA12345678"
}
]
}
}
}
{
"ver": 6,
"source": "API",
"device": "postgres1",
"tag": "",
"type": 1,
"fiscal": {
"task": 1,
"receipt": {
"sum": 500,
"disc": 0,
"disc_type": 0,
"comment_down": "",
"rows": [
{
"code": "01",
"name": "Товар1",
"cnt": 3,
"price": 100,
"disc": 0,
"disc_type": 0,
"cost": 0,
"taxgrp": 1
},
{
"code": "02",
"name": "Товар2",
"cnt": 1,
"price": 200,
"disc": 0,
"disc_type": 0,
"cost": 200,
"taxgrp": 2
}
],
"pays": [
{
"type": 2,
"sum": 100,
"change": 0,
"paysys": "VISA",
"rrn": "123",
"cardmask": "1223******1111",
"term_id": "123456888",
"bank_id": "BANK123",
"auth_code": "AA12345678"
},
{
"type": 0,
"sum": 400,
"change": 500
}
]
}
}
}
{
"ver": 6,
"source": "API",
"device": "postgres1",
"tag": "",
"type": 1,
"fiscal": {
"task": 1,
"receipt": {
"sum": 300,
"disc": 0,
"disc_type": 0,
"comment_down": "",
"rows": [
{
"code": "01",
"name": "Товар1",
"cnt": 4,
"price": 100,
"disc": 50,
"disc_type": 1,
"cost": 0,
"taxgrp": 1
},
{
"code": "02",
"name": "Товар2",
"cnt": 1,
"price": 200,
"disc": 100,
"disc_type": 0,
"cost": 200,
"taxgrp": 2
}
],
"pays": [
{
"type": 2,
"sum": 300,
"change": 0,
"paysys": "VISA",
"rrn": "123",
"cardmask": "1223******1111",
"term_id": "123456888",
"bank_id": "BANK123",
"auth_code": "AA12345678"
}
]
}
}
}
{
"ver": 6,
"source": "API",
"device": "postgres1",
"tag": "",
"type": 1,
"fiscal": {
"task": 1,
"receipt": {
"sum": 300,
"disc": 0,
"disc_type": 0,
"comment_down": "",
"rows": [
{
"code": "01",
"name": "Товар1",
"cnt": 4,
"price": 100,
"disc": 50,
"disc_type": 1,
"cost": 0,
"taxgrp": 1
},
{
"code": "02",
"name": "Товар2",
"cnt": 1,
"price": 200,
"disc": 100,
"disc_type": 0,
"cost": 200,
"taxgrp": 2
}
],
"pays": [
{
"type": 2,
"sum": 100,
"change": 0,
"paysys": "VISA",
"rrn": "123",
"cardmask": "1223******1111",
"term_id": "123456888",
"bank_id": "BANK123",
"auth_code": "AA12345678"
},
{
"type": 0,
"sum": 200,
"change": 200
}
]
}
}
}
{
"ver": 6,
"source": "API",
"device": "postgres1",
"tag": "",
"type": 1,
"fiscal": {
"task": 1,
"receipt": {
"sum": 600,
"disc": 50,
"disc_type": 1,
"comment_down": "",
"rows": [
{
"code": "01",
"name": "Товар1",
"cnt": 4,
"price": 100,
"disc": 0,
"disc_type": 0,
"cost": 0,
"taxgrp": 1
},
{
"code": "02",
"name": "Товар2",
"cnt": 1,
"price": 200,
"disc": 0,
"disc_type": 0,
"cost": 200,
"taxgrp": 2
}
],
"pays": [
{
"type": 2,
"sum": 300,
"change": 0,
"paysys": "VISA",
"rrn": "123",
"cardmask": "1223******1111",
"term_id": "123456888",
"bank_id": "BANK123",
"auth_code": "AA12345678"
}
]
}
}
}
{
"ver": 6,
"source": "API",
"device": "postgres1",
"tag": "",
"type": 1,
"fiscal": {
"task": 1,
"receipt": {
"sum": 600,
"disc": 100,
"disc_type": 0,
"comment_down": "",
"rows": [
{
"code": "01",
"name": "Товар1",
"cnt": 4,
"price": 100,
"disc": 0,
"disc_type": 0,
"cost": 0,
"taxgrp": 1
},
{
"code": "02",
"name": "Товар2",
"cnt": 1,
"price": 200,
"disc": 0,
"disc_type": 0,
"cost": 200,
"taxgrp": 2
}
],
"pays": [
{
"type": 2,
"sum": 500,
"change": 0,
"paysys": "VISA",
"rrn": "123",
"cardmask": "1223******1111",
"term_id": "123456888",
"bank_id": "BANK123",
"auth_code": "AA12345678"
}
]
}
}
}
Відсоткова на чек і на товари
{
"ver": 6,
"source": "API",
"device": "postgres1",
"tag": "",
"type": 1,
"fiscal": {
"task": 1,
"receipt": {
"sum": 380,
"disc": 10,
"disc_type": 1,
"comment_down": "",
"rows": [
{
"code": "01",
"name": "Товар1",
"cnt": 4,
"price": 100,
"disc": 50,
"disc_type": 1,
"cost": 0,
"taxgrp": 1
},
{
"code": "02",
"name": "Товар2",
"cnt": 1,
"price": 200,
"disc": 10,
"disc_type": 1,
"cost": 200,
"taxgrp": 2
}
],
"pays": [
{
"type": 2,
"sum": 342,
"change": 0,
"paysys": "VISA",
"rrn": "123",
"cardmask": "1223******1111",
"term_id": "123456888",
"bank_id": "BANK123",
"auth_code": "AA12345678"
}
]
}
}
}
Відсоткова на чек і сумова на товари
{
"ver": 6,
"source": "API",
"device": "postgres1",
"tag": "",
"type": 1,
"fiscal": {
"task": 1,
"receipt": {
"sum": 350,
"disc": 10,
"disc_type": 1,
"comment_down": "",
"rows": [
{
"code": "01",
"name": "Товар1",
"cnt": 4,
"price": 100,
"disc": 200,
"disc_type": 0,
"cost": 0,
"taxgrp": 1
},
{
"code": "02",
"name": "Товар2",
"cnt": 1,
"price": 200,
"disc": 50,
"disc_type": 0,
"cost": 200,
"taxgrp": 2
}
],
"pays": [
{
"type": 2,
"sum": 315,
"change": 0,
"paysys": "VISA",
"rrn": "123",
"cardmask": "1223******1111",
"term_id": "123456888",
"bank_id": "BANK123",
"auth_code": "AA12345678"
}
]
}
}
}
Сумова на чек і на товари
{
"ver": 6,
"source": "API",
"device": "postgres1",
"tag": "",
"type": 1,
"fiscal": {
"task": 1,
"receipt": {
"sum": 350,
"disc": 70,
"disc_type": 0,
"comment_down": "",
"rows": [
{
"code": "01",
"name": "Товар1",
"cnt": 4,
"price": 100,
"disc": 200,
"disc_type": 0,
"cost": 0,
"taxgrp": 1
},
{
"code": "02",
"name": "Товар2",
"cnt": 1,
"price": 200,
"disc": 50,
"disc_type": 0,
"cost": 200,
"taxgrp": 2
}
],
"pays": [
{
"type": 2,
"sum": 280,
"change": 0,
"paysys": "VISA",
"rrn": "123",
"cardmask": "1223******1111",
"term_id": "123456888",
"bank_id": "BANK123",
"auth_code": "AA12345678"
}
]
}
}
}
Сумова на чек і відсоткова на товари
{
"ver": 6,
"source": "API",
"device": "postgres1",
"tag": "",
"type": 1,
"fiscal": {
"task": 1,
"receipt": {
"sum": 420,
"disc": 70,
"disc_type": 0,
"comment_down": "",
"rows": [
{
"code": "01",
"name": "Товар1",
"cnt": 4,
"price": 100,
"disc": 20,
"disc_type": 1,
"cost": 0,
"taxgrp": 1
},
{
"code": "02",
"name": "Товар2",
"cnt": 1,
"price": 200,
"disc": 50,
"disc_type": 1,
"cost": 200,
"taxgrp": 2
}
],
"pays": [
{
"type": 2,
"sum": 350,
"change": 0,
"paysys": "VISA",
"rrn": "123",
"cardmask": "1223******1111",
"term_id": "123456888",
"bank_id": "BANK123",
"auth_code": "AA12345678"
}
]
}
}
}