Допечать фискального документа

В 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 и на остальной линейке смарт-терминалов Эвотор. Несмотря на отличие в механизме работы команды на различных линейках смарт-терминала, использовать команду нужно одинаковым образом на всех моделях, как описано в примере.

Эвотор 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 // Текст с причиной ошибки

                   //При попытке допечатать чек произошла ошибка. Можно вывести текст ошибки, в котором будет указана причина, например "Нет бумаги"
               }
           }
       }
   }
}