Согласно ФФД версии 1.05 и 1.1, при расчёте между организациями, индивидуальными предпринимателями, физическими лицами, в чеке необходимо указывать реквизиты покупателя:
Эти данные могут понадобиться, например, при продаже страховых договоров.
В ФФД версии 1.2 реквизиты покупателя расширены:
Реквизиты покупателя хранятся в поле Purchaser
, печатной группы чека и могут быть добавлены в чеки продажи, возврата, покупки и возврата покупки.
Чтобы добавить реквизиты покупателя в чек, приложение должно обработать событие ReturnPurchaserRequisitesForPrintGroupRequestedEvent
, с помощью которого смарт-терминал запрашивает реквизиты покупателя.
isPurchaserActive()
чтобы убедиться, что у пользователя активна функция добавления реквизитов покупателя.Событие ReturnPurchaserRequisitesForPrintGroupRequestedEvent
может обрабатываться различными службами, в зависимости от того, в какой чек ваше приложение будет добавлять реквизиты покупателя:
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" />
Создайте службу, которая будет обрабатывать событие, например, 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>
Смарт-терминал запрашивает реквизиты покупателя перед формированием чека (при завершении оплаты).
Чтобы добавить реквизиты покупателя в чек:
PurchaserSellService
от класса SellIntegrationService
.Переопределите метод handleEvent()
и передайте в него запрос на добавление реквизитов, полученный от смарт-терминала ReturnPurchaserRequisitesForPrintGroupRequestedEvent
.
Ваше приложение должно предоставить пользователю возможность указать реквизиты покупателя. Для этого вам может понадобиться вызвать соответствующее окно приложения, например, по нажатию кнопки на экране оплаты. В открывшемся окне, пользователь укажет необходимые данные, которые надо будет вернуть в результате.
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? {
//для ФФД 1.05 и 1.1
val purchaserName: String?
val purchaserInnNumber: String?
// для ФФД 1.2
val purchaserBirthDate: String?
val purchaserDocumentType: String?
val purchaserDocumentNumber: String?
val oldReceiptUuid: String?
/**
* Из SharedPreferences, получаем реквизиты покупателя, которые пользователь указал в MainActivity.
*/
PreferenceManager.getDefaultSharedPreferences(context).run {
purchaserName = getString(MainActivity.TAG_1227_NAME, null)
purchaserInnNumber = getString(MainActivity.TAG_1228_INN, null)
purchaserBirthDate = getString(MainActivity.TAG_1243_BIRTH, null)
purchaserDocumentType = getString(MainActivity.TAG_1245_DOCUMENT_TYPE, null)
purchaserDocumentNumber = getString(MainActivity.TAG_1246_DOCUMENT_NUMBER, null)
oldReceiptUuid = getString(MainActivity.PURCHASER_UUID, null)
}
return if (purchaserName != null && purchaserDocumentNumber != null && oldReceiptUuid == receiptUuid) {
Purchaser(purchaserName, purchaserDocumentNumber, PurchaserType.NATURAL_PERSON)
} else null
}
}