# Інтеграція SDK

## Залежності

Додайте наступні залежності до вашого `build.gradle` файлу:

```kotlin
implementation 'androidx.core:core-ktx:1.10.1'
implementation 'androidx.appcompat:appcompat:1.6.1'

implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation 'com.squareup.retrofit2:converter-scalars:2.9.0'

implementation 'com.squareup.okhttp3:okhttp:4.9.3'
implementation 'com.squareup.okhttp3:logging-interceptor:4.9.3'
implementation 'com.squareup.okhttp3:okhttp-urlconnection:4.9.3'
```

## Ініціалізація

Ви можете ініціалізувати SDK наступним чином:

{% code title="Coroutines" fullWidth="false" %}

```kotlin
suspend fun Defin.init(
    merchantId: String, 
    terminalId: String, 
    cashierId: String, 
    deviceId: String
) : Defin
```

{% endcode %}

або:

{% code title="Звичайний метод" %}

```kotlin
fun Defin.init(
    merchantId: String, 
    terminalId: String, 
    cashierId: String, 
    deviceId: String, 
    listener: DefinInitListener
)
```

{% endcode %}

Слухач має наступний формат:

```kotlin
object : DefinInitListener {
    override fun onSuccess(defin: Defin) {
        this@MainActivity.defin = defin
    }

    override fun onFailure(error: DefinException) {
        Toast.makeText(this@MainActivity, error.getFullMessage(), Toast.LENGTH_SHORT).show()
    }
}

```

## Оплата

Посилання на оплату буде лише у випадку оплати картою

Метод `checkout` використовується для створення замовлення.

{% code title="Coroutines" %}

```kotlin
suspend fun defin.checkout(
    paymentType: String,
    purpose: String,
    ttn: String,
    customer: DefinCustomer, // Опціонально
    goods: List<DefinGood>
) : Defin.Order
```

{% endcode %}

або:

{% code title="Звичайний метод" %}

```kotlin
fun defin.checkout(
    paymentType: String, 
    purpose: String, 
    ttn: String,
    goods: List<DefinGood>, 
    customer: DefinCustomer, // Опціонально
    listener: DefinCheckoutListener
)
```

{% endcode %}

де:

* `paymentType` // ідентифікатор виду оплати
* `purpose` // Призначення платежу (ТТН)

### Методи оплати

Перелік доступних методів для оплати можна отримати у відповідь на ініціалізацію, а також окремим методом, якщо потрібно

```kotlin
defin?.availablePaymentTypes()
```

Існує метод отримання статусу методу оплати. Повертає `true` якщо переданий `paymentType` доступний цьому мерчанту

<pre class="language-kotlin"><code class="lang-kotlin"><strong>defin?.isAvailablePaymentType(
</strong><strong>    paymentType: DefinPaymentType
</strong><strong>)
</strong></code></pre>

Існуючі методи в системі:

**`DefinPaymentType`** — enum що містить всі можливі варианти оплати, серед них:

**`DefinPaymentType.CASH`** — Готівка

**`DefinPaymentType.QR`** — Інтернет-еквайринг (QR). Отримуємо лінку на динамічну сторінку оплати банка чи фінансової компанії

**`DefinPaymentType.PBT2PH`** — tap2phone від Приватбанку

### Перелік продуктів

Перелік продуктів формується з класів `DefinGood`

```kotlin
DefinGood(
    name: String, 
    amount: Double, 
    quantity: Float,
    taxGroup: Int,
    barcode: String?,
    uktzedCode: String?
)

```

Для відправки чеку клієнту є класс `DefinCustomer?`

```kotlin
DefinCustomer(
    email: String, 
    phone: String, // у форматі 380991234567
)

```

Інтерфейс слухача оплати

```kotlin
DefinCheckoutListener {
    fun onSuccess(order: Defin.Order)
    fun onFailure(error: DefinException)
}

```

### Приклад використання

```kotlin

launch{
    try{

        // Ініциалізаця
        val defin = Defin.init(merchantId, terminalId, cashierId, deviceId)

        // створення ордеру
        val goods = listOf(
            DefinGood(name = "Кава з молоком", amount = 2.34, quantity = 1f)
        )

        val order = defin.checkout(paymentType, purpose, ttn, goods)

    }catch(e: DefinException){
        Log.e("Defin", e.getFullMessage())
    }
}

// Або

private lateinit var defin: Defin

// Ініциалізаця
Defin.init(merchantId, terminalId, cashierId, deviceId, object : DefinInitListener{
    override fun onSuccess(defin: Defin) {
        this@MainActivity.defin = defin
    }

    override fun onFailure(error: DefinException) {
        Toast.makeText(this@MainActivity, error.getFullMessage(), Toast.LENGTH_SHORT).show()
    }
})

// створення ордеру

val goods = listOf(
    DefinGood(name = "Кава з молоком", amount = 2.34, quantity = 1f)
)

fun defin.checkout(paymentType, purpose, ttn, goods, object : DefinCheckoutListener {
    override fun onSuccess(order: Defin.Order) {
        // Ваш код
    }
    override fun onFailure(error: DefinException) {
        // Обробка помилки
    }
})

```

## Варіанти оплати

На поточний момент реалізовано три методи оплати (готівка, інвойсинг та tap2phone)

* У випадку оплати готівкою, зарахування виконується одразу;
* Для сплати через банківську форму, слід використати `order.paymentUrl;`
* Для можливості сплати через tap2phone, використовуйте наступну реалізацію:

### tap2phone

1. Для того щоб мати можливість виклику зовнішнього додатку програмного терміналу, ініціалізуйте клас на рівні активності:

```kotlin
private val tapToPhone = TapToPhone(this)

```

2. Реалізуйте виклик терміналу в методі `onSuccess(order: Defin.Order)`:

```kotlin
tapToPhone.pay(order, object : TapToPhone.Callback{
    override fun onSuccess() {
        PaymentDialog(this@MainActivity, 
            order).show()
    }
    override fun onFailure(error: DefinException) {
        Toast.makeText(this@MainActivity, 
            error.message, 
            Toast.LENGTH_SHORT).show()
    }
})

```

### Перевірка статусу оплати

Для отримання інформації про плату, використовуйте метод `order.check` з інтерфейсом `DefinCheckListener`.

Інтерфейс `DefinCheckListener`

```kotlin
DefinCheckListener{
    fun onSuccess(status: GoodsStatus)
    fun onFailure(error: DefinException)
}

```

### Приклад використання

```kotlin
suspend fun order.check() : GoodsStatus

// або

fun order.check(object : DefinCheckListener{
    override fun onSuccess(status: GoodsStatus) {
        // Ваш код
    }
    override fun onFailure(error: DefinException) {
        // Обробка помилки
    }
})

```

Варіанти `status:GoodsStatus`

* `DRAFT` // Драфтове замовлення
* `CREATED` // Замовлення очікує оплати
* `COMPLETED` // Замовлення завершено
* `FAILED` // Помилка

## Отримання чеку

В `order: Defin.Order` присутній метод `receipt`, який приймає обʼєкт, реалізуючий інтерфейс `DefinReceiptListener`.

Інтерфейс `DefinReceiptListener`

```kotlin
suspend fun receipt(): DefinReceipt

// або

fun order.receipt(object : DefinReceiptListener{
    override fun onSuccess(receipt: DefinReceipt) {
        // Ваш код
    }
    override fun onFailure(error: DefinException) {
        // Обробка помилки
    }
})

```

## Метод перевірки статусу та отримання квитанції (відокремлено від DefinOrder)

#### Перевірка статусу оплати

{% code overflow="wrap" %}

```kotlin
suspend fun getStatusByPaymentId(paymentId: String): Statuses
//або 

fun getStatusByPaymentId(paymentId: String, listener: DefinCheckListener)
```

{% endcode %}

#### Отримати квитанцію

{% code overflow="wrap" %}

```kotlin
suspend fun getReceiptByPaymentId(paymentId: String): DefinReceipt
//або 

fun getReceiptByPaymentId(paymentId: String, listener: DefinReceiptListener)
```

{% endcode %}
