# Інтеграція 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 %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.defin.com.ua/sdk-documentation/readme.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
