Приложение может создавать чеки и передавать их для оформления в смарт-терминал. Такие чеки являются фискальными.
С помощью команд печати чеков смарт-терминал может автоматически передавать созданные чеки на указанный адрес электронной почты (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();
}
}
});