При продаже маркированных лекарств, чек должен содержать 14-ти разрядный идентификатор места продажи лекарства.
Эти данные хранятся в поле MedicineAttribute
печатной группы чека и могут быть добавлены в чеки продажи.
Чтобы добавить данные продажи маркированных лекарств, приложение должно обработать событие ReturnMedicineAttributeEvent.
isMedicineMarkActive()
чтобы убедиться, что у пользователя активна функция добавления маркированных товаров.Событие 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>
Смарт-терминал запрашивает данные продажи маркированных лекарств перед запросом реквизитов покупателя.
Чтобы добавить данные в чек:
MedicineAttributeSellService
от класса SellIntegrationService
.Переопределите метод handleEvent()
и передайте в него запрос на добавление данных, полученный от смарт-терминала ReturnMedicineAttributeEvent
.
Ваше приложение должно предоставить пользователю возможность указать данные продажи маркированного лекарства. Для этого вам может понадобиться вызвать соответствующее окно приложения, например, по нажатию кнопки на экране оплаты. В открывшемся окне, пользователь укажет необходимые данные, которые надо будет вернуть в результате.
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
}
}