Передача электронных чеков

Приложение может создавать чеки и передавать их для оформления в смарт-терминал. Такие чеки являются фискальными.

С помощью команд печати чеков смарт-терминал может автоматически передавать созданные чеки на указанный адрес электронной почты (email) и/или номер телефона. Передача чеков актуальна, например, для интернет-магазинов.

Передача чека на email и номер телефона

Смарт-терминал передаёт чеки если указан email и/или номер телефона. Касса не печатает чек, если указаны поля email и/или номер телефона.

Чтобы передавать чек на email и номер телефона:

  1. В манифесте укажите права приложения:

    <uses-permission android:name="ru.evotor.permission.receipt.print.INTERNET_RECEIPT" />
    
  2. Составьте список позиций, который требуется добавить в чек, наполните список

    public void openReceipt() {
            List<PositionAdd> positionAddList = new ArrayList<>();
    
            JSONObject extra = new JSONObject();
          }
    

    Где:

    List<PositionAdd> positionAddList = new ArrayList<>()– список позиций. Как добавить позицию в чек смотрите в разделе Добавление, изменение и удаление позиций.

    JSONObject extra = new JSONObject();– добавляет дополнительные данные к чеку. Данные доступны только вашему приложению. Не создавайте этот объект, если приложение не добавляет дополнительные поля к чеку.

  3. Укажите способ оплаты:

    List<Payment> payments = new ArrayList<>();
    Payment payment = new Payment(
            UUID.randomUUID().toString(),
            new BigDecimal(9000),
            new PaymentSystem(PaymentType.ELECTRON, "Card", "Cashless"),
            null,
            null,
            null
    );
    

    Где:

  4. Создайте команду для передачи чека и вызовите метод .process:

    PrintSellReceiptCommand command = new PrintSellReceiptCommand(positions, payments, clientPhone, clientEmail, userUuid);
    command.process(MainActivity.this, new IntegrationManagerCallback() {
        @Override
        public void run(IntegrationManagerFuture future) {
            IntegrationManagerFuture.Result result = null;
            try {
                result = future.getResult();
                switch (result.getType()) {
                    case OK:
                        PrintReceiptCommandResult printSellReceiptResult = PrintReceiptCommandResult.create(result.getData());
                        Toast.makeText(MainActivity.this, "OK", Toast.LENGTH_LONG).show();
                        break;
                    case ERROR:
                        Error error = result.getError();
                        Toast.makeText(MainActivity.this, error.getMessage(), Toast.LENGTH_LONG).show();
                        break;
                }
            } catch (IntegrationException e) {
                e.printStackTrace();
            }
        }
    });
    

    Где:

    • positions — список позиций чека;
    • payments — информация о способе оплаты;
    • clientPhone — номер телефона клиента в формате строки. Может быть null. Смарт-терминал передаёт чек на указанный номер телефона. Если поле не указано, смарт-терминал вернёт ошибку;
    • clientEmail — email клиента в формате строки. Может быть null. Смарт-терминал передаёт чек на указанный адрес электронной почты. Если поле не указано, смарт-терминал вернёт ошибку;
    • userUuid — Идентификатор сотрудника в формате uuid64, от лица которого будет произведена операция. Если передано null, то будет выбран текущий авторизованный сотрудник.

Команда возвращает результат, описанный в классе PrintReceiptCommandResult.

Получить расширенные данные об ошибке

При пробитии чека интернет-магазина может возникнуть ошибка. Например, если на ФН закончилось место. Получить подробную информацию об ошибке можно через класс PrintReceiptCommandErrorData. Пример использования:

if (result.getType() != IntegrationManagerFuture.Result.Type.OK) {
    PrintReceiptCommandErrorData data = PrintReceiptCommandErrorDataFactory.create(result.getData());
    String dataStr = "";
    if (data != null) {
    	dataStr = "ext: ";
        dataStr += "errorcode = " + ((PrintReceiptCommandErrorData.KktError) data).getKktErrorCode();
        dataStr += " errordescription = " + ((PrintReceiptCommandErrorData.KktError) data).getKktErrorDescription();
    }
    Log.e("TAG", dataStr)
}

Пример

Пример печати электронных чеков в демонстрационном приложении.

Существует также более детальный способ создания и передачи чека:

List<Position> list = new ArrayList<>();
list.add(
        Position.Builder.newInstance(
                UUID.randomUUID().toString(),
                null,
                "1234",
                "12",
                0,
                new BigDecimal(1000),
                BigDecimal.TEN
        ).build()
);
list.add(
        Position.Builder.newInstance(
                UUID.randomUUID().toString(),
                null,
                "1234",
                "12",
                0,
                new BigDecimal(500),
                BigDecimal.ONE
        ).setPriceWithDiscountPosition(new BigDecimal(300)).build()
);
HashMap payments = new HashMap<Payment, BigDecimal>();
payments.put(new Payment(
                    UUID.randomUUID().toString(),
                    new BigDecimal(9300),
                    new PaymentSystem(PaymentType.ELECTRON, "Internet", "12424"),
                    null,
                    null,
                    null
            ), new BigDecimal(9300));
PrintGroup printGroup = new PrintGroup(UUID.randomUUID().toString(),
                PrintGroup.Type.CASH_RECEIPT, null, null, null, null, false);
final Receipt.PrintReceipt printReceipt = new Receipt.PrintReceipt(
        printGroup,
        list,
        payments,
        new HashMap<Payment, BigDecimal>()
);

ArrayList<Receipt.PrintReceipt> listDocs = new ArrayList<>();
listDocs.add(printReceipt);
BigDecimal receiptDiscount = new BigDecimal(1000);
new PrintSellReceiptCommand(listDocs, null, null, "example@example.com", receiptDiscount).process(MainActivity.this, new IntegrationManagerCallback() {
    @Override
    public void run(IntegrationManagerFuture integrationManagerFuture) {
        try {
            IntegrationManagerFuture.Result result = integrationManagerFuture.getResult();
            switch (result.getType()) {
                       case OK:
                           PrintReceiptCommandResult printSellReceiptResult = PrintReceiptCommandResult.create(result.getData());
                           Toast.makeText(MainActivity.this, "OK", Toast.LENGTH_LONG).show();
                           break;
                       case ERROR:
                           Error error = result.getError();
                           Toast.makeText(MainActivity.this, error.getMessage(), Toast.LENGTH_LONG).show();
                           break;
                   }
        } catch (IntegrationException e) {
            e.printStackTrace();
        }
    }
});