Начисление скидок

Вы можете добавлять скидку как на каждую позицию отдельно, так и на весь чек (см. ниже).

Назначение скидки на чек

Приложение не может автоматически применять скидку, перед этим его требуется вручную вызвать с помощью иконки на экране оплаты смарт-терминала.

Для расчёта и назначения скидки:

  1. Подпишитесь на событие ReceiptDiscountEvent, которое сообщает о возможности начислить скидку.
  2. Получите результат, который сообщает о возможности начисления скидки.

Чтобы добавить скидку на весь чек:

  1. Подпишитесь на событие:

    1. Создайте службу, которая наследует класс IntegrationService, например MyDiscountService.
    2. Переопределите метод 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– объект возврата результата.
    3. Объявите службу в манифесте приложения:

      <service
              android:name="MyDiscountService"
              android:enabled="true"
              android:exported="true">
              <intent-filter>
                  <action android:name="evo.v2.receipt.sell.receiptDiscount" />
              </intent-filter>
      </service>
      
  2. Запросите результат ReceiptDiscountEventResult.

    try {callback.onResult(
      new ReceiptDiscountEventResult(
          discount,
          new SetExtra(extra),
          changes
    ));
        }
            catch (RemoteException exc) {
                    exc.printStackTrace();
                }
    
    

    Где:

    • discount – значение скидки в валюте.
    • new SetExtra(extra) – команда для создания дополнительных полей в чеке. Если дополнительные поля создавать не требуется вы можете передать null.
    • changes – список изменений по позициям.

Назначение скидки на позицию

Чтобы добавить скидку на позицию, вам потребуется передать значение цены с учётом скидки в поле 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()
                    }
                })
        )
    }
}