Если ваше приложение заменяет кассовый интерфейс, то возникает необходимость выполнять проверку кодов маркировки до добавления всех позиций в чек (командой OpenXXXXReceiptCommand или PrintXXXXReceiptCommand). Это нужно, чтобы сразу после сканирования марки предупредить пользователя о том, что марка не прошла проверку. Раньше можно было самостоятельно обратиться к true-api «Честного знака» с помощью токена пользователя. В скором времени обращаться к true-api напрямую будет запрещено, проверка будет доступна только с помощью ТС ПИоТ.
На смарт-терминалы Эвотор ТС ПИоТ устанавливается отдельным приложением «ЕСМ» через Эвотор.Маркет. Чтобы выполнять проверку марок через это приложение, мы предоставили специальный сервис в rc01-v0.6.35.
Для проверки марок через ТС ПИоТ недостаточно просто подключиться к сервису в интеграционной библиотеке, требуется пройти сертификацию, чтобы получить специальные идентификаторы, которые добавляются в манифест вашего приложения.
Как выглядит процесс сертификации
Для работы с ТС ПИоТ в вашем приложении потребуется указать следующие данные:
<meta-data android:name="ru.esm.PMSR_ID" android:value="1234" />
<meta-data android:name="ru.esm.PMSR_TOKEN" android:value="4321" />
<uses-permission android:name="ru.evotor.permission.PMSR" />
Где:
ru.esm.PMSR_ID — ID приложения, которое выдается при сертификации в ЦРПТ. До сертификации можете указать любой uuid.ru.esm.PMSR_TOKEN — контрольная сумма/ЭЦП исполняемого файла ПМСР. До сертификации можете указать любой uuid.ru.evotor.permission.PMSR — разрешение для использования ТС ПИоТ в вашем приложении.val tspiot = TsPioTServiceConnector.connectTsPioTService(context).KktInfo getKktInfo(). Метод вернет объект с информацией о ТС ПИоТ:
/** Идентификатор ТС ПИоТ */
private final String tspiotId;
/** ЗН ККТ */
private final String kktSerial;
/** ЗН ФН */
private final String fnSerial;
/** ИНН ККТ */
private final String kktInn;
/** Время проверки кода в ТС ПИоТ (В миллисекундах) */
private final int codesCheckTimeOut;
CodesCheckResult getMarkedProductsInfo(List<MarkingCode> codes, String? userUuid). Поле userUuid заполняется только в том случае, если пользователь, сканирующий марки, сменился. Для отслеживания смены пользователя используйте событие ru.evotor.framework.core.action.event.usersUserChangedEvent. Метод вернет объект с онлайн и оффлайн проверками:
@Nullable private final List<OnlineCodesCheck> onlineCodesChecks;
@Nullable private final List<OfflineCodesCheck> offlineCodesChecks;
Внутри OnlineCodesCheck и OfflineCodesCheck содержатся данные с проверками, включая:
/** Уникальный идентификатор запроса */
protected final String reqId;
/** Дата и время формирования запроса (в UTC) */
protected final long reqTimestamp;
Эти данные нужны для формирования позиции с проверкой марки (объект MarksCheckingInfo в Position). Внутри объекта с онлайн или офлайн-проверкой содержатся результаты проверки марок:
/** Результат онлайн проверки марок*/
private final List<OnlineCodeCheck> codes;
/** Результат оффлайн проверки марок*/
private final List<OfflineCodeCheck> codes;
Используйте параметры с результатами проверки в соответствии с ПФС (программой испытаний от ЦРПТ), направленной вам для прохождения сертификации.
TsPioTService может вернуть клиентское исключение или исключение от драйвера ТС ПИоТ, их необходимо обработать. Полный список исключений доступен по пути ru.evotor.tspiot.exceptions.TsPioTServiceConnector.disconnectTsPioTService()try {
//Подключение к ТС ПИоТ
val tspiot = TsPioTServiceConnector.connectTsPioTService(this)
//Получение информации о ТС ПИоТ
val codesCheckTimeOut = tspiot.kktInfo.codesCheckTimeOut
//Проверка марок
val codesForCheck: MutableList<MarkingCode> = ArrayList()
val userUuid = if(isUserChanged()) UserApi.getAuthenticatedUser(this)?.uuid else null
codesForCheck.add(MarkingCode("0112345678901234219wbIc8fexZjeMSdKw==", null))
val checkResult = tspiot.getMarkedProductsInfo(codesForCheck, userUuid)
val onlineChecked = checkResult.onlineCodesChecks
val offlineChecked = checkResult.offlineCodesChecks
onlineChecked?.forEach {
val marks = it.codes
marks.forEach {
val isMarkBlocked = it.blocked
//Остальные проверки
}
}
}catch (e: TsPioTErrorHolderException){
//Обработка исключений от драйвера ТС ПИоТ
when(val error = e.errorDescriptionWrapper){
is MessageErrorDescriptionWrapper.NotRegistered ->
{
Log.d("TsPioTErrorHolderException", "ТС ПИоТ не зарегистрирован!")
}
else -> {
Log.d("TsPioTErrorHolderException", error.errorDescription.toString())
}
}
}catch (e: TsPioTServiceException){
//Обработка исключений, которые могу возникнуть на стороне клиента ТС ПИоТ
Log.d("TsPioTServiceException", e.message.toString())
}
//Завершение работы ТС ПИоТ
TsPioTServiceConnector.disconnectTsPioTService()