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

Редактировать

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

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

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

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

  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,
          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()
                    }
                })
        )
    }
}