Открытие чека в приложении

Открыть чек продажи

Чтобы открыть чек продажи в смарт-терминале:

  1. Составьте список позиций, который требуется добавить в чек, и наполните его:

    public void openReceipt() {
            List<PositionAdd> positionAddList = new ArrayList<>();
    
            JSONObject extra = new JSONObject();
          }
    

    Где:

    List<PositionAdd> positionAddList = new ArrayList<>()– список позиций. Как добавить позицию в чек смотрите в разделе Добавление, изменение и удаление позиций.

    JSONObject extra = new JSONObject();– добавляет дополнительные данные к чеку. Данные доступны только вашему приложению. Не создавайте этот объект, если приложение не добавляет дополнительные поля к чеку.

  2. Создайте команду открытия чека и вызовите метод .process

    new OpenSellReceiptCommand(positionAddList, null).process(
                            activity,
                            new IntegrationManagerCallback() {
                                @Override
                                public void run(IntegrationManagerFuture integrationManagerFuture) {
                                    try {
                                        IntegrationManagerFuture.Result result = integrationManagerFuture.getResult();
                                        if (result.getType() == IntegrationManagerFuture.Result.Type.OK) {
                                            //Чтобы открыть другие чеки используйте методы NavigationApi.
                                            startActivity(NavigationApi.createIntentForSellReceiptPayment());
                                        }
                                    } catch (IOException e) {
                                        e.printStackTrace();
                                    } catch (IntegrationException e) {
                                        e.printStackTrace();
                                    }
                                }
                            });
    

    Где вместо null вы можете передать new SetExtra(extra), команду для создания дополнительных полей в чеке.

    Чтобы открыть чек другого типа используйте соответствующую команду. Возможные команды:

    • OpenSellReceiptCommand – команда открытия чека продажи.
    • OpenPaybackReceiptCommand – команда открытия чека возврата проданного товара.
    • OpenBuyReceiptCommand – команда открытия чека покупки.
    • OpenBuybackReceiptCommand – команда открытия чека возврата купленного товара.

Возвраты

Класс OpenPaybackReceiptCommand позволяет сформировать возврат из стороннего приложения на основании чека. Пример использования:

val cursor = ReceiptApi.getReceiptHeaders(appContext, Receipt.Type.SELL) // получить список headers предыдущих продаж

val receiptUuid = cursor?.toList()?.last()?.uuid // получить uuid последней продажи

val receipt = ReceiptApi.getReceipt(requireContext(), receiptUuid) // получить чек продажи

val positions = receipt.getPositions() // из чека продажи нужно получить список позиций и выбрать те, которые нужно вернуть

OpenPaybackReceiptCommand(positions, null, null, r.header.uuid) // открыть чек возврата
                  .process(requireActivity()) { future ->
                      when (future.result.type) {
                          Type.OK -> {}
                          Type.ERROR -> {}
                      }
                  }

Обработка ошибок

Новые ошибки

С версии EvotorPOS 8.11.0 изменяется логика работы команд для открытия чека. Если есть непустой чек и он отличается от создаваемого текущей командой, то будет возвращена соответствующая ошибка.

Список команд для которых это работает:

Перечисленные команды будут возвращать соответствующие новые ошибки:

Чтобы эти ошибки начали приходить, приложение должно быть собрано с использованием integration-library 0.6.03 или новее, а версия EvotorPOS должна быть 8.11.0 или новее.

Рекомендации

Пример обработки ошибок

Пример обработки ошибок для команды создания чека продажи — OpenSellReceiptCommand:

OpenSellReceiptCommand(
    positions,
    null,
    null
).process(
    activity
) { future ->
    when (future.result.type) {
        IntegrationManagerFuture.Result.Type.OK -> {
            activity.startActivity(NavigationApi.createIntentForSellReceiptEdit())
        }
        IntegrationManagerFuture.Result.Type.ERROR -> {
            when (future.result.error.code) {
                OpenReceiptCommandResult.ERROR_CODE_SELL_RECEIPT_IS_ALREADY_OPEN,
                OpenReceiptCommandResult.ERROR_CODE_PAYBACK_RECEIPT_IS_ALREADY_OPEN,
                OpenReceiptCommandResult.ERROR_CODE_BUY_RECEIPT_IS_ALREADY_OPEN,
                OpenReceiptCommandResult.ERROR_CODE_BUYBACK_RECEIPT_IS_ALREADY_OPEN,
                OpenReceiptCommandResult.ERROR_CODE_CORRECTION_INCOME_RECEIPT_IS_ALREADY_OPEN,
                OpenReceiptCommandResult.ERROR_CODE_CORRECTION_OUTCOME_RECEIPT_IS_ALREADY_OPEN,
                OpenReceiptCommandResult.ERROR_CODE_CORRECTION_RETURN_INCOME_RECEIPT_IS_ALREADY_OPEN,
                OpenReceiptCommandResult.ERROR_CODE_CORRECTION_RETURN_OUTCOME_RECEIPT_IS_ALREADY_OPEN -> {
                    activity.startActivity(NavigationApi.createIntentForSellReceiptEdit())
                }
                else -> {
                    AlertDialogFragment.newInstance().setMessage("Операция не выполнена ${future.result.error.message}")
                        .addDismissButton("Ok").show(
                            parentFragmentManager
                        )
                }
            }
        }
    }
}

Пример

Пример открытия чека продажи или возврата в демонстрационном приложении.