В integration-library v0.6.09 были добавлены новые свойства и новая ошибка в ответе на команды: Print…ReceiptCommand и PrintZReportCommand, а также команда для допечати прерванного документа. Для команд Open…ReceiptCommand, этот функционал не актуален, так как за процесс обработки новых свойств будет отвечать EvotorPOS.
В зависимости от модели и режима работы смарт-терминала, документ может записываться в ФН до начала печати на чековой ленте, либо в процессе печати. Если документ записан в ФН и не допечатан на чековой ленте, то не будет ошибки, но смарт-терминал не позволит формировать другие документы, пока прерванный не будет допечатан.
Новые механизмы, описанные в этом разделе нужны для того, чтобы понять, что документ не распечатался полностью и проинформировать об этом кассира. А после замены чековой ленты допечатать этот документ.
В объекты PrintReceiptCommandResult
и PrintZReportCommandResult
было добавлено новое свойство isNotPrinted
, которое принимает значение true
, если документ требуется допечатать. Используя это свойство можно выводить уведомление с просьбой заменить бумагу и распечатать документ до конца. Допечатать прерванный документ можно с помощью новой команды PrintUnprintedDocumentCommand
.
Команда PrintUnprintedDocumentCommand
используется в случаях, когда требуется допечатать фискальный документ, который не распечатался полностью. Например, когда при вызове команд Print…ReceiptCommand
или PrintZReportCommand
возвращается ошибка ERROR_CODE_PREVIOUS_DOCUMENT_NOT_PRINTED
, или в результате успешного ответа на команду свойство isNotPrinted
приняло значение true
.
Механизм работы команды PrintUnprintedDocumentCommand
отличается на модели Эвотор 6 и на остальной линейке смарт-терминалов Эвотор. Несмотря на отличие в механизме работы команды на различных линейках смарт-терминала, использовать команду нужно одинаковым образом на всех моделях, как описано в примере.
Если присутствует документ, требующий допечати, то команда запустит повторную печать документа. Если документ успешно распечатался, то будет возвращён Result.Type.OK
. Если документ не удалось распечатать, то вернётся Result.Type.ERROR
. При возращении кода ошибки ERROR_CODE_PRINT_DOCUMENT_FAILED
можно получить сообщение об ошибке, в котором будет указана причина, почему не удалось распечатать документ, например «Нет бумаги».
Если документ требующий допечати отсутствует, то при вызове этой команды всегда будет возвращаться Result.Type.OK
.
На остальной линейке смарт-терминалов допечать документа происходит автоматически, после того как будет установлен новый рулон чековой ленты. Поэтому команда проверяет состояние кассового модуля следующим образом:
Если документ не допечатан и чековая лента всё еще отсутствует, то вернётся Result.Type.ERROR
. При возращении кода ошибки ERROR_CODE_PRINT_DOCUMENT_FAILED
можно получить сообщение об ошибке, в котором будет указана причина, почему не удалось распечатать документ, например «Нет бумаги».
Если кассовый модуль не имеет в своём «буффере» документа, требующего допечати, то команда вернёт Result.Type.OK
.
В объекты PrintReceiptCommandResult
и PrintZReportCommandResult
добавлен новый код ошибки ERROR_CODE_PREVIOUS_DOCUMENT_NOT_PRINTED
. Ошибка будет возвращаться, когда печать следующего документа невозможна, из-за того, что в ККТ есть недопечатанный документ. Если по той или иной причине новое свойство isNotPrinted
было проигнорировано (например из-за непредвиденного завершения приложения) и кассир не заметил, что бумага закончилась, то при следующем вызове команды PrintReceiptCommandResult
или PrintZReportCommand
будет возвращаться ошибка ERROR_CODE_PREVIOUS_DOCUMENT_NOT_PRINTED
. В тексте ошибки будет отражаться причина, по которой не удалось распечатать предыдущий фискальный документ, например, «Предыдущий фискальный документ не был допечатан: Нет бумаги». Ошибка будет возвращаться до тех пор, пока недопечатанный фискальный документ не будет распечатан до конца. При возникновении этой ошибки нужно отправить недопечатанный документ на допечать с помощью новой команды PrintUnprintedDocumentCommand
.
val callback = IntegrationManagerCallback { future ->
if (future.result?.type == IntegrationManagerFuture.Result.Type.OK) {
val result: PrintZReportCommandResult? = PrintZReportCommandResult.create(future.result.data)
if (result?.notPrinted == true) {
// Z-отчет распечатан не до конца.
// Нужно отобразить уведомление с кнопкой, при нажатии на которую вызвать команду PrintUnprintedDocumentCommand
}
// Z-отчет успешно напечатан полностью
} else if (future.result?.type == IntegrationManagerFuture.Result.Type.ERROR) {
when (future.result.error.code) {
PrintZReportCommandResult.ERROR_CODE_PREVIOUS_DOCUMENT_NOT_PRINTED -> {
val errorReasonText = future.result.error.message
//Текст ошибки. Пример: "Предыдущий фискальный документ не был допечатан: Нет бумаги"
//Обработка ошибки
// Нужно отобразить уведомление с кнопкой, при нажатии на которую вызвать команду PrintUnprintedDocumentCommand
}
}
}
}
val callback = IntegrationManagerCallback { future ->
if (future.result?.type == IntegrationManagerFuture.Result.Type.OK) {
val result: PrintReceiptCommandResult? = PrintReceiptCommandResult.create(future.result.data)
if (result?.isNotPrinted == true) {
// Чек распечатался не до конца
// Нужно отобразить уведомление с кнопкой, при нажатии на которую вызвать команду PrintUnprintedDocumentCommand
}
// Z-отчет успешно напечатан полностью
} else if (future.result?.type == IntegrationManagerFuture.Result.Type.ERROR) {
when (future.result.error.code) {
PrintReceiptCommandResult.ERROR_CODE_PREVIOUS_DOCUMENT_NOT_PRINTED -> {
val errorReasonText = future.result.error.message
//Текст ошибки. Пример: "Предыдущий фискальный документ не был допечатан: Нет бумаги"
//Обработка ошибки
// Нужно отобразить уведомление с кнопкой, при нажатии на которую вызвать команду PrintUnprintedDocumentCommand
}
}
}
}
PrintUnprintedDocumentCommand().process(this){
val result = it.result
when(result.type){
ru.evotor.framework.core.IntegrationManagerFuture.Result.Type.OK -> {
//Чек допечатан, можно печатать следующий документ
}
ru.evotor.framework.core.IntegrationManagerFuture.Result.Type.ERROR -> {
when(result.error.code){
PrintUnprintedDocumentCommandResult.ERROR_CODE_KKM_IS_BUSY -> {
//ККМ в данный момент выполняет другую операцию, нужно попробовать позднее
}
PrintUnprintedDocumentCommandResult.ERROR_CODE_PRINT_DOCUMENT_FAILED -> {
val errorMessage = result.error.message // Текст с причиной ошибки
//При попытке допечатать чек произошла ошибка. Можно вывести текст ошибки, в котором будет указана причина, например "Нет бумаги"
}
}
}
}
}