Помощь кассиру

Вызов из приложения на кассе: Intent

актуальная

Ваше Android-приложение на том же устройстве вызывает YaKassa и получает результат чека или операции со сменой.

Подходит, если ваше приложение стоит прямо на терминале. Если программа работает на другом устройстве, берите обмен v4.

Вызов

ПараметрЗначение
Пакетkg.yaros.kkm
ДействиеYAROS_KKM_ACTION
Входные данныеJSON строкой в extra data
РезультатJSON строкой в extra result_data
Kotlin
private val launcher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
    val json = result.data?.getStringExtra("result_data")
    if (json == null) {
        // результата нет: операцию отменили или она не прошла, см. ниже
    }
}

fun sendToKassa(jsonString: String) {
    val intent = Intent("YAROS_KKM_ACTION").apply {
        setPackage("kg.yaros.kkm")
        putExtra("data", jsonString)
    }
    launcher.launch(intent)
}

На Android 11 и новее добавьте <queries><package android:name="kg.yaros.kkm" /></queries> в манифест, если проверяете наличие кассы заранее. Касса должна быть авторизована.

Чек

JSON
{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "cashless": true,
  "operation": "INCOME",
  "printInfo": "Спасибо за покупку",
  "products": [
    { "id": "product-1", "name": "Товар 1", "price": 100.50, "quantity": 2,
      "vat_value": 12, "st_value": 1, "calcItemAttributeCode": "0" }
  ]
}
ПолеТипОбяз.Описание
idStringдаUUID операции
operationStringдаINCOME продажа, INCOME_RETURN возврат продажи
productsArrayдасписок товаров или услуг
cashlessBooleanнетбезналичная оплата. Если поля нет, способ можно выбрать на экране кассы
cash_sumDecimalнетсумма наличными
cashless_sumDecimalнетсумма безналично
fd_numberStringдля возвратаномер исходного чека
rrnStringдля возврата на картуRRN исходной оплаты: касса вернёт деньги на карту, чек после успеха
skip_bankBooleanнетtrue: безнал проведён вне кассы, банк не вызывается. В возврате значит, что продажа прошла без банка
printInfoStringнеттекст в конце чека
fiscalBooleanнетпризнак фискализации, по умолчанию true

Поля позиции те же, что в обмене v4. Правила возврата на карту тоже те же.

Для смешанной оплаты передайте cash_sum и cashless_sum одновременно, сумма должна равняться сумме позиций. Поле cashless при этом можно не передавать.

Результат чека

JSON
{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "status": "OK",
  "qr": "https://…",
  "amount": 201.00,
  "cashless": true,
  "fdNumber": "12345"
}
ПолеТипОписание
idStringUUID из запроса
statusStringOK
qrStringссылка для проверки в ГНС
amountDecimalоплаченная сумма
cashlessBooleanпризнак безналичного расчёта
fdNumberStringномер фискального документа

Смена

Тот же вызов и то же extra data. Поле products не передаётся.

Открыть
{ "id": "shift-operation-uuid", "type": "SHIFT", "operation": "OPEN" }
ПолеТипОбяз.Описание
idStringдаUUID операции
typeStringрекомендуетсяSHIFT
operationStringдаOPEN, CLOSE или STATE
Результат
{ "id": "shift-operation-uuid", "status": "OK", "operation": "OPEN" }

Как и у чека, результат приходит только при успехе.

Настройки на кассе

Настраиваются в Настройки → Обмен и действуют только на Intent.

НастройкаЧто делает
Автоматическая обработкавключена: документ проводится сразу. Выключена: позиции попадают в продажу на экране, и чек завершает кассир. Возврат всегда проводится сразу
Автоматическое завершениеYaKassa закрывается после обработки и возвращает управление вашему приложению

Совместимость

Старый формат чеков не менялся: для чеков поле type не требуется. Операции со сменой добавлены поверх него и работают с версии кассы 2.2.09.361. Поля rrn и skip_bank см. в таблице версий.

Смотрите также