Добавление в чек адреса и места расчёта

Основная особенность развозной и разносной торговли — отсутствие постоянного адреса торговой точки и места расчёта с покупателями.

Пользователи смарт-терминалов в процессе регистрации или перерегистрации кассы указывают, работают ли они в развозной торговле. Выбрав эту опцию пользователь не сможет указать адрес торговой точки и место расчёта. Вместо этого, на смарт-терминал требуется установить приложение, которое перед печатью чека, будет предлагать указать адрес и место расчёта вручную. Если такое приложение отсутствует, смарт-терминал не оформит чек и отобразит ошибку.

Чтобы пользователь мог указать адрес и место расчёта в вашем приложении, вам необходимо обработать событие ReturnDeliveryRequisitesForReceiptRequestedEvent.kt.

Разрешение на обработку события добавления адреса и места расчёта

Событие ReturnDeliveryRequisitesForReceiptRequestedEvent может обрабатываться различными службами, в зависимости от того, в какой чек ваше приложение будет добавлять адрес и место расчёта:

Для использования любой из этих служб, в манифесте приложения необходимо указать соответствующее разрешение:

<!-- Разрешение на использование службы для работы с чеком продажи  -->
<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 при выполнении всех следующих условий:

Чтобы получать событие, укажите его в манифесте приложения, в 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>

Обработка события

Чтобы оформить чек при развозной или разносной торговле:

  1. Унаследуйте службу DeliveryProcessingService от службы, обрабатывающей чек необходимого типа.

    Например, для обработки чеков продажи, унаследуйте службу от класса SellIntegrationService.

  2. Переопределите метод handleEvent() и передайте в него запрос на добавление адреса и места расчёта, полученный от смарт-терминала ReturnDeliveryRequisitesForReceiptRequestedEvent.

    Ваше приложение должно предоставить пользователю возможность указать адрес и место расчёта. Для этого вам понадобится вызвать соответствующее окно, где пользователь укажет необходимые данные, которые приложение вернёт в результате.

  3. Верните результат 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"
    }
}