Приложение может создавать чеки и передавать их для оформления в смарт-терминал. Такие чеки являются фискальными.
С помощью команд печати чеков смарт-терминал может автоматически передавать созданные чеки на указанный адрес электронной почты (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
– задаёт способ оплаты.Создайте команду для передачи чека и вызовите метод .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
, то будет выбран текущий авторизованный сотрудник.PrintSellReceiptCommand
используйте команду PrintPaybackReceiptCommand
.
В этом шаге необязательно использовать операции Activity
. Достаточно использовать Context
.Команда возвращает результат, описанный в классе 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();
}
}
});