Приложение может создавать чеки и передавать их для оформления в смарт-терминал. Такие чеки являются фискальными.
С помощью команд печати чеков смарт-терминал может автоматически передавать созданные чеки на указанный адрес электронной почты (email) и/или номер телефона. Передача чеков актуальна, например, для интернет-магазинов.
Смарт-терминал передаёт чеки если указан email и/или номер телефона. Касса не печатает чек, если указаны поля email и/или номер телефона.
Чтобы передавать чек на email и номер телефона:
В манифесте укажите права приложения:
<uses-permission android:name="ru.evotor.permission.receipt.print.INTERNET_RECEIPT" />
Составьте список позиций, который требуется добавить в чек, наполните список
public void openReceipt() {
        List<PositionAdd> positionAddList = new ArrayList<>();
        JSONObject extra = new JSONObject();
      }
Где:
List<PositionAdd> positionAddList = new ArrayList<>()– список позиций. Как добавить позицию в чек смотрите в разделе Добавление, изменение и удаление позиций.
JSONObject extra = new JSONObject();– добавляет дополнительные данные к чеку. Данные доступны только вашему приложению. Не создавайте этот объект, если приложение не добавляет дополнительные поля к чеку.
Укажите способ оплаты:
List<Payment> payments = new ArrayList<>();
Payment payment = new Payment(
        UUID.randomUUID().toString(),
        new BigDecimal(9000),
        new PaymentSystem(PaymentType.ELECTRON, "Card", "Cashless"),
        null,
        null,
        null
);
Где:
PaymentType – задаёт способ оплаты.Создайте объект печатной группы:
 val printGroup: PrintGroup = PrintGroup(
    UUID.randomUUID().toString(),
 PrintGroup.Type.CASH_RECEIPT,
 null,
 null,
 null,
 TaxationSystem.COMMON,
 true,
 null,
 null,
 true
 )
Если формируете онлайн-чек, например, если пишете интеграцию для интернет-магазина, то в параметре receiptFromInternet укажите true.
Создайте объект чека и передайте в него позиции, печатную группу и платежи:
 val printReceipt: Receipt.PrintReceipt = Receipt.PrintReceipt(
    printGroup,
    getPositions(),
    getPayments(),
    java.util.HashMap<Payment, BigDecimal>(), java.util.HashMap<String, BigDecimal>()
 )
Создайте команду для передачи чека и вызовите метод .process:
PrintSellReceiptCommand(
listDocs,
null,
"791599999999",
"example@example.com",
null,
null,
"internet-market.ru"
).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();
     }
 }
});
Если формируете онлайн-чек, например, если пишете интеграцию для интернет-магазина, то обязательно заполните email clientEmail или телефон покупателя clientPhone. 
 В параметре paymentPlace укажите адрес сайта в сети интернет, на котором приобретался товар или услуга.
При пробитии чека интернет-магазина может возникнуть ошибка. Например, если на ФН закончилось место. Получить подробную информацию об ошибке можно через класс 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();
        }
    }
});