Основная особенность развозной и разносной торговли — отсутствие постоянного адреса торговой точки и места расчёта с покупателями.
Пользователи смарт-терминалов в процессе регистрации или перерегистрации кассы указывают, работают ли они в развозной торговле. Выбрав эту опцию пользователь не сможет указать адрес торговой точки и место расчёта. Вместо этого, на смарт-терминал требуется установить приложение, которое перед печатью чека, будет предлагать указать адрес и место расчёта вручную. Если такое приложение отсутствует, смарт-терминал не оформит чек и отобразит ошибку.
Чтобы пользователь мог указать адрес и место расчёта в вашем приложении, вам необходимо обработать событие ReturnDeliveryRequisitesForReceiptRequestedEvent.kt
.
Событие ReturnDeliveryRequisitesForReceiptRequestedEvent
может обрабатываться различными службами, в зависимости от того, в какой чек ваше приложение будет добавлять адрес и место расчёта:
SellIntegrationService
позволяет добавить данные в чек продажи;PaybackIntegrationService
позволяет добавить данные в чек возврата;BuyIntegrationService
позволяет добавить данные в чек покупки;BuybackIntegrationService
позволяет добавить данные в чек возврата покупки.Для использования любой из этих служб, в манифесте приложения необходимо указать соответствующее разрешение:
<!-- Разрешение на использование службы для работы с чеком продажи -->
<uses-permission android:name="ru.evotor.permission.SELL_INTEGRATION_SERVICE" />
<!-- Разрешение на использование службы для работы с чеком возврата -->
<uses-permission android:name="ru.evotor.permission.PAYBACK_INTEGRATION_SERVICE" />
<!-- Разрешение на использование службы для работы с чеком покупки -->
<uses-permission android:name="ru.evotor.permission.BUY_INTEGRATION_SERVICE" />
<!-- Разрешение на использование службы для работы с чеком возврата покупки -->
<uses-permission android:name="ru.evotor.permission.BUYBACK_INTEGRATION_SERVICE" />
Смарт-терминал распространяет событие ReturnDeliveryRequisitesForReceiptRequestedEvent.kt
при выполнении всех следующих условий:
На терминале активна функция “Развозная торговля”.
Для проверки активности функции используйте метод isDeliveryActive.
isKktReadyForDelivery
, чтобы проверить выполнение этих условий.Чтобы получать событие, укажите его в манифесте приложения, в intent-фильтре соответствующей службы:
<service
android:name=".DeliveryProcessingService"
android:enabled="true"
android:exported="true"
android:label="Место расчёта"
android:permission="ru.evotor.permission.SELL_INTEGRATION_SERVICE">
<!-- служба использует необходимое разрешение -->
<intent-filter>
<category android:name="android.intent.category.DEFAULT" />
<!-- добавление адреса и места расчёта в чек продажи -->
<action android:name="ru.evotor.event.sell.DELIVERY_REQUISITES" />
</intent-filter>
</service>
Чтобы оформить чек при развозной или разносной торговле:
Унаследуйте службу DeliveryProcessingService
от службы, обрабатывающей чек необходимого типа.
Например, для обработки чеков продажи, унаследуйте службу от класса SellIntegrationService
.
Переопределите метод handleEvent()
и передайте в него запрос на добавление адреса и места расчёта, полученный от смарт-терминала ReturnDeliveryRequisitesForReceiptRequestedEvent
.
Ваше приложение должно предоставить пользователю возможность указать адрес и место расчёта. Для этого вам понадобится вызвать соответствующее окно, где пользователь укажет необходимые данные, которые приложение вернёт в результате.
Верните результат ReturnDeliveryRequisitesForReceiptRequestedEvent.Result
.
class DeliveryProcessingService : SellIntegrationService() {
override fun handleEvent(event: ReturnDeliveryRequisitesForReceiptRequestedEvent):
ReturnDeliveryRequisitesForReceiptRequestedEvent.Result? {
val isFeatureAvailable = KktApi.isKktReadyForDelivery(this)?.let { it } ?: false
//Проверяем активность функции "Развозная торговля" и запускаем операцию, в которой пользователь сможет указать адрес и место расчёта.
if (!isFeatureAvailable) {
return Intent(applicationContext, DeliveryIntegrationActivity::class.java).apply {
action = MainActivity.ACTION_NOT_PAID
}.let { startIntegrationActivity(it) }
}
val intent = Intent(applicationContext, DeliveryIntegrationActivity::class.java)
intent.putExtra(RECEIPT_UUID, event.receiptUuid)
intent.putExtra(RECEIPT_ADDRESS, event.paymentAddress)
intent.putExtra(RECEIPT_PLACE, event.paymentPlace)
return startIntegrationActivity(intent)
}
companion object {
const val RECEIPT_UUID = "RECEIPT_UUID"
const val RECEIPT_ADDRESS = "RECEIPT_ADDRESS"
const val RECEIPT_PLACE = "RECEIPT_PLACE"
}
}