Перейти к содержимому

Суммы, скидки и НДС

Дробные числа в деньгах дают ошибки округления, поэтому локальный API принимает только целые числа.

Что В чём Пример
Цена, скидка, оплата тийины (1 сум = 100 тийин) 12 500,50 сум → 1250050
Количество тысячные доли 1 шт → 1000, 0,25 кг → 250, 1,5 л → 1500
НДС ставка в процентах 12 или 0 — сумму НДС считает приложение

Перевод из сумов: Math.round(сумма * 100); из штук или килограммов: Math.round(количество * 1000).

Стоимость позиции = round(unitPrice × quantity / 1000). Например, 0,25 кг по 120 000 сум/кг: 12000000 × 250 / 1000 = 3000000 тийин — 30 000 сум.

Сумма оплат должна точно равняться сумме позиций минус скидки:

payments.cash + payments.card = Σ стоимость позиций − discount

Иначе приложение ответит 400 BRIDGE_PAYMENT_MISMATCH и укажет обе суммы в message. Позиции с нулевой стоимостью (комплимент от заведения) в ФМ не отправляются и на сумму не влияют.

Скидку можно дать двумя способами, и их можно сочетать:

  • items[].discount — скидка на конкретную позицию;
  • discount у чека — общая скидка на чек, которая включает скидки позиций.

Приложение раскладывает общую скидку по позициям само, потому что ФМ принимает скидку только у позиции:

  1. Скидки позиций остаются как есть (но не больше стоимости позиции).
  2. Остаток discount − Σ скидок позиций делится между позициями пропорционально сумме к оплате.
  3. Тийины округления добавляются к первой позиции, у которой ещё есть запас.

Если discount меньше суммы скидок позиций, действуют скидки позиций.

НДС считается с суммы к оплате, то есть после скидки: round(к оплате × ставка / (100 + ставка)). Цена уже включает НДС — отдельно его прибавлять не нужно.

Все числа — то, что приложение отправит в ФМ.

Лепёшка: 2 шт по 5 000 сум, НДС 12%.

{ "quantity": 2000, "unitPrice": 500000, "vatPercent": 12 }
Стоимость Скидка К оплате НДС
1 000 000 0 1 000 000 1000000 × 12 / 112 = 107 143

Оплата: "payments": { "cash": 1000000 }.

Чай за 8 000 сум со скидкой 500 сум. Скидка позиции входит и в скидку чека:

{
"items": [{ "quantity": 1000, "unitPrice": 800000, "discount": 50000, "vatPercent": 12 }],
"discount": 50000,
"payments": { "cash": 750000 }
}
Стоимость Скидка К оплате НДС
800 000 50 000 750 000 80 357

Плов за 10 000 сум и самса за 8 000 сум, скидка на весь чек 1 000 сум:

{
"items": [
{ "name": "Плов", "quantity": 1000, "unitPrice": 1000000, "vatPercent": 12 },
{ "name": "Самса", "quantity": 1000, "unitPrice": 800000, "vatPercent": 12 }
],
"discount": 100000,
"payments": { "card": 1700000 }
}
Позиция Стоимость Скидка К оплате НДС
Плов 1 000 000 55 555 + 1 тийин округления = 55 556 944 444 101 190
Самса 800 000 44 444 755 556 80 952
Итого 1 800 000 100 000 1 700 000

Те же плов и самса. На плов скидка 500 сум, на весь чек — ещё 1 000 сум. В discount чека передаётся общая скидка — 1 500 сум:

{
"items": [
{ "name": "Плов", "quantity": 1000, "unitPrice": 1000000, "discount": 50000, "vatPercent": 12 },
{ "name": "Самса", "quantity": 1000, "unitPrice": 800000, "vatPercent": 12 }
],
"discount": 150000,
"payments": { "cash": 1650000 }
}
Позиция Стоимость Скидка К оплате НДС
Плов 1 000 000 50 000 + 54 286 = 104 286 895 714 95 969
Самса 800 000 45 714 754 286 80 816
Итого 1 800 000 150 000 1 650 000

Остаток скидки 1 000 сум разнесён пропорционально 950 000 и 800 000 тийин к оплате.

0,25 кг по 120 000 сум/кг, НДС 0%:

{ "quantity": 250, "unitPrice": 12000000, "vatPercent": 0 }

Стоимость 3 000 000 тийин, НДС 0.

"payments": { "cash": 500000, "card": 1200000, "cardType": "personal" }

cardType: personal — карта физлица (по умолчанию), corporate — корпоративная.