Вы можете добавлять скидку как на каждую позицию отдельно, так и на весь чек (см. ниже).
Приложение не может автоматически применять скидку, перед этим его требуется вручную вызвать с помощью иконки на экране оплаты смарт-терминала.
Для расчёта и назначения скидки:
ReceiptDiscountEvent
, которое сообщает о возможности начислить скидку.Чтобы добавить скидку на весь чек:
Подпишитесь на событие:
IntegrationService
, например MyDiscountService
.Переопределите метод createProcessors
службы MyDiscountService
и создайте в нём процессор ReceiptDiscountEventProcessor
.
public class MyDiscountService extends IntegrationService {
@Nullable
@Override
protected Map<String, ActionProcessor> createProcessors() {
Map<String, ActionProcessor> map = new HashMap<>();
map.put(ReceiptDiscountEvent.NAME_SELL_RECEIPT, new ReceiptDiscountEventProcessor() {
@Override
public void call(@NonNull String action, @NonNull ReceiptDiscountEvent event, @NonNull Callback callback){
}
});
return map;
}
}
где:
call
– метод получения событий и объектов.action
– действие при событии.event
– событие.callback
– объект возврата результата.Объявите службу в манифесте приложения:
<service
android:name="MyDiscountService"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="evo.v2.receipt.sell.receiptDiscount" />
</intent-filter>
</service>
Запросите результат ReceiptDiscountEventResult
.
try {callback.onResult(
new ReceiptDiscountEventResult(
discount,
new SetExtra(extra),
changes,
new SetPurchaserContactData(email, phone)
));
}
catch (RemoteException exc) {
exc.printStackTrace();
}
Где:
discount
– значение скидки в валюте;new SetExtra(extra)
– метод для создания дополнительных полей в чеке. Если дополнительные поля создавать не требуется вы можете передать null
;changes
– список изменений по позициям;new SetPurchaserContactData(email, phone)
— метод добавляет в чек контактные данные клиента для отправки электронного чека. Чек будет отправлен либо на email, либо по номеру телефона.Чтобы добавить скидку на позицию, вам потребуется передать значение цены с учётом скидки в поле priceWithDiscountPosition
. Если скидки на позицию нет, передавайте null
. Список полей позиции описан в классе position.java
.
Передать поле можно в любой момент, когда доступно редактирование существующих или добавление новых позиций в чек:
List<PositionAdd> positionAddList = new ArrayList<>();
positionAddList.add(
new PositionAdd(
Position.Builder.newInstance(
//идентификатор (uuid) позиции
UUID.randomUUID().toString(),
//идентификатор (uuid) товара
null,
//Наименование товара
"Зубочистки",
//Наименование единицы измерения
"кг",
//Точность единицы измерения
0,
//Цена без скидок
new BigDecimal(200),
//Количество
new BigDecimal(1)
//Добавление цены с учетом скидки на позицию. Итог = price - priceWithDiscountPosition
).setPriceWithDiscountPosition(new BigDecimal(100))
.setExtraKeys(set).build()
)
);
Получение скидки потребуется вам чтобы точно определить сумму уплаченную по чеку. Вы можете узнавать скидку начисленную как на открытый, так и на ранее сохранённые чеки.
Узнать значение скидки вы можете с помощью методов:
fun getDiscount(): BigDecimal
Где BigDecimal
– абсолютное значение скидки в рублях.
Методы принадлежат классу Receipt.kt
Метод getDiscount()
, вызванный в классе Receipt
возвращает абсолютное значение скидки на чек.
Метод getDiscount()
, вызванный в классе Receipt.PrintReceipt
возвращает абсолютное значение скидки на текущую печатную группу, без учёта скидки на чек.
package com.example.dfabrichnyi.integration_lib_test
import ru.evotor.framework.core.IntegrationService
import ru.evotor.framework.core.action.event.receipt.print_extra.PrintExtraRequiredEvent
import ru.evotor.framework.core.action.event.receipt.print_extra.PrintExtraRequiredEventProcessor
import ru.evotor.framework.core.action.processor.ActionProcessor
import ru.evotor.framework.receipt.Receipt
import ru.evotor.framework.receipt.ReceiptApi
import java.math.BigDecimal
class TestIntegrationService : IntegrationService() {
override fun createProcessors(): MutableMap<String, ActionProcessor> {
return hashMapOf(
Pair(PrintExtraRequiredEvent.NAME_SELL_RECEIPT, object : PrintExtraRequiredEventProcessor() {
override fun call(action: String, event: PrintExtraRequiredEvent, callback: Callback) {
//Возвращает текущий открытый чек.
val receipt = ReceiptApi.getReceipt(this@TestIntegrationService, Receipt.Type.SELL)!!
val receiptDiscount = receipt.getDiscount()
println("Скидка на чек. Без учета скидок на позиции: $receiptDiscount")
var sum = BigDecimal.ZERO
for (document in receipt.printDocuments) {
sum += document.getDiscount()
}
println("Сумма скидок для текущей группы: $sum")
callback.skip()
}
})
)
}
}