Добавление в чек реквизитов покупателя

Согласно ФФД версии 1.05 и выше, при расчёте между организациями, индивидуальными предпринимателями, физическими лицами, в чеке необходимо указывать реквизиты покупателя:

Эти данные могут понадобиться, например, при продаже страховых договоров.

Реквизиты покупателя хранятся в поле Purchaser, печатной группы чека и могут быть добавлены в чеки продажи, возврата, покупки и возврата покупки.

Чтобы добавить реквизиты покупателя в чек, приложение должно обработать событие ReturnPurchaserRequisitesForPrintGroupRequestedEvent, с помощью которого смарт-терминал запрашивает реквизиты покупателя.

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

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

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

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

Получение события

Создайте службу, которая будет обрабатывать событие, например, PurchaserSellService.

В манифесте приложения, в разделе службы, укажите соответствующее разрешение, а в intent-фильтре службы, укажите событие:

<service
    android:name=".PurchaserSellService"
    android:enabled="true"
    android:exported="true"
    android:permission="ru.evotor.permission.SELL_INTEGRATION_SERVICE">
    <!-- служба использует необходимое разрешение -->
    <intent-filter>
        <!-- событие добавления реквизитов -->
        <action android:name="ru.evotor.event.sell.PURCHASER_REQUISITES"/>
        <!-- добавляет иконку на экран оплаты чека -->
        <action android:name="ru.evotor.event.payback.DISCOUNT_SCREEN_ADDITIONAL_ITEMS"/>
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</service>

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

Смарт-терминал запрашивает реквизиты покупателя перед формированием чека (при завершении оплаты).

Чтобы добавить реквизиты покупателя в чек:

  1. Унаследуйте службу PurchaserSellService от класса SellIntegrationService.
  2. Переопределите метод handleEvent() и передайте в него запрос на добавление реквизитов, полученный от смарт-терминала ReturnPurchaserRequisitesForPrintGroupRequestedEvent.

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

  3. Верните результат ReturnPurchaserRequisitesForPrintGroupRequestedEvent.Result().

Пример

class PurchaserSellService : SellIntegrationService() {

    override fun handleEvent(event: ReturnPurchaserRequisitesForPrintGroupRequestedEvent)
            : ReturnPurchaserRequisitesForPrintGroupRequestedEvent.Result? {
        return handleEvent(event, this)
    }

    /**
     * Обрабатываем событие и получаем реквизиты покупателя из контекста приложения.
     */
    fun handleEvent(event: ReturnPurchaserRequisitesForPrintGroupRequestedEvent, context: Context)
            : ReturnPurchaserRequisitesForPrintGroupRequestedEvent.Result? {
        //Массив печатных групп и соответствующих им объектов с реквизитами покупателя.
        val map = mutableMapOf<PrintGroup?, Purchaser?>()
        //Реквизиты покупателя, которые пользователь указал в MainActivity.
        val currentPurchaser = getCurrentPurchaser(event.receiptUuid, context)

        //Наполняем массив.
        event.printGroups.forEach { printGroup -> currentPurchaser?.let { map[printGroup] = it } }

        return ReturnPurchaserRequisitesForPrintGroupRequestedEvent.Result(map)
    }

    private fun getCurrentPurchaser(receiptUuid: String, context: Context): Purchaser? {
        val purchaserName: String?
        val purchaserDocumentNumber: String?
        val oldReceiptUuid: String?

        /**
         * Из SharedPreferences, получаем реквизиты покупателя, которые пользователь указал в MainActivity.
         */
        PreferenceManager.getDefaultSharedPreferences(context).run {
            purchaserName = getString(MainActivity.TAG_1227_NAME, null)
            purchaserDocumentNumber = getString(MainActivity.TAG_1228_INN, null)
            oldReceiptUuid = getString(MainActivity.PURCHASER_UUID, null)
        }

        return if (purchaserName != null && purchaserDocumentNumber != null && oldReceiptUuid == receiptUuid) {
            Purchaser(purchaserName, purchaserDocumentNumber, PurchaserType.NATURAL_PERSON)
        } else null
    }

}