Добавление позиции в чек через ActivityResult

Такой способ добавления позиции в чек нужно использовать для приложений, которые вызываются на экране выбора товара.

Для начала нужно получить тип операции чека, из которого был вызван экран выбора товара. Для этого воспользуйтесь методом getIntent из базового класса Activity:

val operationTypeOrdinal:Int = intent.getIntExtra("inOperationType", 0)

Чтобы использовать полученный тип операции для изменения поведения вашего приложения, воспользуйтесь таблицей:

Тип операции Описание
6 Продажа
7 Возврат по чеку
11 Возврат без чека
20 Покупка товара
21 Возврат покупки по чеку
22 Возврат покупки без чека
24 Чек коррекции прихода
25 Чек коррекции расхода
26 Чек коррекции возврата прихода
27 Чек коррекции возврата расхода

Полученное значение необходимо передать в созданный вами intent, в extra которого будет добавлен operationType и класс позиции из интеграционной библиотеки ru.evotor.framework.receipt.Position.

/**
* Создание Intent'а для передачи позиции в EvotorPOS
*/
private fun getIntent(position: Position): Intent {
   val intent = Intent()
   intent.putExtra("EXTRA_POSITION", position)
   intent.putExtra("EXTRA_OPERATION_TYPE", operationTypeOrdinal)
   return intent
}

Созданный intent необходимо передать c помощью метода setResult из базового класса Activity, после чего закрыть вашу Activity:

val intent = this.getIntent(position)
setResult(Activity.RESULT_OK, intent)
finish()

Когда ваша Activity будет закрыта, интерфейс EvotorPOS будет возвращён на окно чека, в котором отобразится добавленная позиция.

Пример кода

Описание Activity в манифесте приложения:

<!-- Задаёт Activity, которая будет вызвана при нажатии на иконку, картинку для иконки и текст, отображаемый поверх иконки -->
<activity
  android:name=".CreatePositionActivity"
  android:icon="@mipmap/ic_launcher"
  android:label="Быстрые товары"
  android:windowSoftInputMode="adjustUnspecified"
  android:exported="true"

  >
  <!-- Задаёт фон, на котором отображается иконка приложения. -->
  <meta-data
      android:name="ru.evotor.createPosition.background"
      android:value="#133788" />
  <intent-filter>
      <!-- Указывает, что иконка приложения будет отображаться в списке товаров, который открывается при добавлении позиции в чек. -->
      <action android:name="ru.evotor.createPosition" />
      <category android:name="android.intent.category.EVOTOR" />
  </intent-filter>
</activity>

Код Activity:

private const val SELL_OPERATION_TYPE_ORDINAL = 6
private const val PAYBACK_OPERATION_TYPE_ORDINAL = 7
private const val PAYBACK_BY_SUM_OPERATION_TYPE_ORDINAL = 11
private const val BUY_OPERATION_TYPE_ORDINAL = 20
private const val BUYBACK_OPERATION_TYPE_ORDINAL = 21
private const val BUYBACK_BY_SUM_OPERATION_TYPE_ORDINAL = 22
private const val CORRECTION_INCOME_OPERATION_TYPE_ORDINAL = 24
private const val CORRECTION_OUTCOME_OPERATION_TYPE_ORDINAL = 25
private const val CORRECTION_RETURN_INCOME_OPERATION_TYPE_ORDINAL = 26
private const val CORRECTION_RETURN_OUTCOME_OPERATION_TYPE_ORDINAL = 27

const val EXTRA_INCOME_OPERATION_TYPE = "inOperationType"
const val EXTRA_OUTCOME_POSITION = "EXTRA_POSITION"
const val EXTRA_OUTCOME_OPERATION_TYPE = "EXTRA_OPERATION_TYPE"


class CreatePositionActivity: ComponentActivity() {

   private val operationTypeOrdinal: Int by lazy {
       intent.getIntExtra(EXTRA_INCOME_OPERATION_TYPE, 0)
   }

   private val isSellReceipt
       get() = operationTypeOrdinal == SELL_OPERATION_TYPE_ORDINAL

   private val isPaybackReceipt
       get() = operationTypeOrdinal == PAYBACK_OPERATION_TYPE_ORDINAL || operationTypeOrdinal == PAYBACK_BY_SUM_OPERATION_TYPE_ORDINAL

   private val isPaybackBySumReceipt
       get() = operationTypeOrdinal == PAYBACK_BY_SUM_OPERATION_TYPE_ORDINAL

   private val isBuyReceipt
       get() = operationTypeOrdinal == BUY_OPERATION_TYPE_ORDINAL

   private val isBuybackReceipt
       get() = operationTypeOrdinal == BUYBACK_OPERATION_TYPE_ORDINAL || operationTypeOrdinal == BUYBACK_BY_SUM_OPERATION_TYPE_ORDINAL

   private val isBuybackBySumReceipt
       get() = operationTypeOrdinal == BUYBACK_BY_SUM_OPERATION_TYPE_ORDINAL

   private val isCorrectionReceipt
       get() = operationTypeOrdinal == CORRECTION_INCOME_OPERATION_TYPE_ORDINAL ||
               operationTypeOrdinal == CORRECTION_OUTCOME_OPERATION_TYPE_ORDINAL ||
               operationTypeOrdinal == CORRECTION_RETURN_INCOME_OPERATION_TYPE_ORDINAL ||
               operationTypeOrdinal == CORRECTION_RETURN_OUTCOME_OPERATION_TYPE_ORDINAL

   override fun onCreate(savedInstanceState: Bundle?) {
       super.onCreate(savedInstanceState)
       setContent {
           KKtApiTheme {
               Surface(
                   modifier = Modifier.fillMaxSize(),
                   color = MaterialTheme.colorScheme.background
               ) {
                   Column {
                       Button(onClick = { addShoppingBag() }) {
                           Text("Добавить пакет")
                       }
                   }
               }
           }
       }
   }

   /**
    * Создание Intent'а для передачи позиции в EvotorPOS
    */
   private fun getIntent(position: Position): Intent {
       val intent = Intent()
       intent.putExtra(EXTRA_OUTCOME_POSITION, position)
       intent.putExtra(EXTRA_OUTCOME_OPERATION_TYPE, operationTypeOrdinal)
       return intent
   }

   private fun addShoppingBag() {
       val position = Position.Builder.newInstance(
           UUID.randomUUID().toString(),
           null,//Обязательно null или существующий в базе товаров productUuid, с значением "" позиция не добавится
           "Пакет",
           Measure("шт", 0, 0),
           BigDecimal(5),
           BigDecimal.ONE
       ).setTaxNumber(TaxNumber.NO_VAT)
           .setSettlementMethod(SettlementMethod.FullSettlement())
           .build()

       val intent = this.getIntent(position)
       setResult(Activity.RESULT_OK, intent)
       finish()
   }

}