Добавление чек маркированных лекарств

При продаже маркированных лекарств, чек должен содержать 14-ти разрядный идентификатор места продажи лекарства.

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

Чтобы добавить данные продажи маркированных лекарств, приложение должно обработать событие ReturnMedicineAttributeEvent.

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

Событие ReturnMedicineAttributeEvent обрабатывается службой для работы с чеками продажи — SellIntegrationService.

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

<!-- Разрешение на использование службы для работы с чеком продажи  -->
<uses-permission android:name="ru.evotor.permission.SELL_INTEGRATION_SERVICE" />

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

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

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

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

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

Смарт-терминал запрашивает данные продажи маркированных лекарств перед запросом реквизитов покупателя.

Чтобы добавить данные в чек:

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

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

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

Пример

class MedicineAttributeSellService : SellIntegrationService() {

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

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

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

        return ReturnMedicineAttributeEvent.Result(map)
    }

    private fun getMedicineAttribute(receiptUuid: String, context: Context): MedicineAttribute? {
        val subjectId: String?

        /**
         * Из SharedPreferences, получаем данные продажи, которые пользователь указал в MainActivity.
         */
        PreferenceManager.getDefaultSharedPreferences(context).run {
            subjectId = getString(MainActivity.SUBJECT_ID, null)
        }

        return if (subjectId != null) {
            MedicineAttribute(subjectId)
        } else null
    }

}