Для того щоб в чеку відобразити знижку на якусь певну суму чи % потрібно передати це значення в 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": []
}
Є можливість фіскалізовувати чеки з нульовою сумою на наявними товарами при вказанні 100% знижки або знижки на всю суму товара чи чеку.
В чеку не вказується товар з сумою 0, тому що за вимогами ДПС має бути зазначена реальна вартість товару, а зазначається повна сума і використовується знижка.
Не важливо як саме буде передана знижка на весь чек чи на кожен товар окремо, сумова чи відсоткова, головне щоб сума до оплати після всіх знижок була 0.
Для того щоб дозволити фіскалізацію таких чеків потрібно в об'єкт fiscal.receipt в передати "allow_zero_sum": true. В іншому випадку при спробі фіскалізувати чек з нульовою сумою буде повернуто помилку.
"res": 1133,
"res_action": 3,
"errortxt": "Фіскалізація чеків з наявними товарами та нульовою сумою заборонена. Для фіскалізації такого чеку необхідно передати \"allow_zero_sum\": true в об`єкт fiscal.receipt",
Можна вказати потрібну форму оплати (готівка, карта, тощо) або взагалі не вказувати, тоді в чеку вона відображатись не буде
Body запиту:
{
"device": "postgres1",
"tag": "",
"type": 1,
"fiscal": {
"task": 1,
"receipt": {
"sum": 4000,
"allow_zero_sum": true,
"discounts": [
{
"disc": 100,
"disc_type": 1,
"disc_name": "Доступні ліки"
}
],
"round": 0,
"rows": [
{
"code": "185",
"name": "Товар 1",
"cnt": 1,
"price": 1000,
"cost": 1000,
"discounts": [],
"taxgrp": 1
},
{
"code": "187",
"name": "товар 2",
"cnt": 1,
"price": 3000,
"cost": 3000,
"discounts": [],
"taxgrp": 1
}
],
"pays": [
{
"type": 0,
"sum": 0
}
]
}
}
}
Візуалізація:

Body запиту:
{
"device": "postgres1",
"tag": "",
"type": 1,
"fiscal": {
"task": 1,
"receipt": {
"sum": 4000,
"allow_zero_sum": true,
"discounts": [
{
"disc": 100,
"disc_type": 1,
"disc_name": "Доступні ліки"
}
],
"round": 0,
"rows": [
{
"code": "185",
"name": "Товар 1",
"cnt": 1,
"price": 1000,
"cost": 1000,
"discounts": [],
"taxgrp": 1
},
{
"code": "187",
"name": "товар 2",
"cnt": 1,
"price": 3000,
"cost": 3000,
"discounts": [],
"taxgrp": 1
}
],
"pays": []
}
}
}
Візуалізація:

Нижче буде наведено кілька прикладів чеку на продаж(для повернення все працює аналогічно) 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"
}
]
}
}
}