# Hızlı Başlangıç

### Uygulamanızın Satış Uygulaması Olarak Tanımlanması

Uygulamanızın AndroidManifest.xml dosyasına aşağıdaki bilgilerin eklenmesi gerekmektedir.

```xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.example">

    <application>
        <!-- Gerekli meta-data bilgileri -->
        <!--
          Uygulamanızın ID olarak kullanılacak ismi.
          LYL_330TR_ ile başlamalıdır. Örnek: LYL_330TR_MYAPP
          Bu ismi kullanıcı görmez.
          -->
        <meta-data
            android:name="app_name"
            android:value="LYL_330TR_MYAPP" />
            
        <!-- X30TR için zorunlu değerdir. Değiştirmeyiniz. -->
        <meta-data
            android:name="app_model_type"
            android:value="330TR" />
            
        <!--
          Uygulamanızın versiyon numarası.
          build.gradle'ınızdaki versionCode değerine bağlayabilirsiniz.
          Geliştirmeniz sırasında 1 kullanabilirsiniz.
          -->
        <meta-data
            android:name="app_version"
            android:value="1" />
            
        <!-- Açılmasını istediğiniz activity -->
        <meta-data
            android:name="sale_activity_name"
            android:value="MainActivity">
        </meta-data>

    </application>
</manifest>
```

{% hint style="danger" %}
Manifest dosyanıza bu eklemeleri yaptıktan ve uygulamanızı cihaza yükledikten sonra bir defalığına mahsus aşağıdaki komutu çalıştırırsanız "Satış uygulamaları" listesinde görünecektir.

```
adb shell pm clear com.tokeninc.sardis.paymentgateway
```

{% endhint %}

### Satış Sepeti JSON Formatı

Basit bir satış için aşağıdaki gibi bir sepet JSON'ı kullanabilirsiniz. [JSON formatıyla ilgili ayrıntılı bilgi için tıklayın.](/token-developer-portal-1/x-platform/token-x-connect-wire/gelistirici-dokumani.md#json-aciklamalari)

{% hint style="warning" %}
Ürünün hangi kısıma ait olduğu bilgisini sectionNo ile ve KDV oranını taxPercent ile göndermeniz gereklidir. KDV değerleri cihazdaki tanımlı kısımlara ait olmalıdır.

Bu örnek sepette 1. kısmın %10 KDV'li olduğu varsayılmıştır.
{% endhint %}

```json
{
  "basketID": "c0a9138b-9193-4380-a4c6-3ab04523a02c",
  "createInvoice": false,
  "documentType": 0,
  "isVoid": false,
  "items": [
    {
      "name": "Yiyecek",
      "limit": 10000,
      "price": 1000,
      "quantity": 1000,
      "sectionNo": 1,
      "taxPercent": 1000,
      "type": 0
    }
  ]
}
```

### Ödeme Ekranına Geçilmesi

Bu kod aracılığıyla sepetinizi ödeme uygulamasını açabilirsiniz.

```kotlin
private fun startPGW(jsonObj : JSONObject){
    val PAYMENT_PROCESSOR_PACKAGE_NAME = "com.tokeninc.sardis.paymentgateway"
    val PAYMENT_PROCESSOR_APP_NAME = ".MainActivity"
    
    val appName = PAYMENT_PROCESSOR_PACKAGE_NAME + PAYMENT_PROCESSOR_APP_NAME
    val intent = Intent()
    val bundle = Bundle()
    
    bundle.putString("orderBody", jsonObj.toString())
    intent.putExtras(bundle)
    intent.component = ComponentName(PAYMENT_PROCESSOR_PACKAGE_NAME, appName)
    
    startActivityForResult(intent, 0x1003)
}
```

### Ödeme Sonucunun Alınması

Ödeme tamamlandıktan sonra ödeme sonucunu aşağıdaki şekilde alabilirsiniz. [Ödeme sonucunda dönen JSON'ın formatıyla ilgili ayrıntılı bilgi için tıklayın.](/token-developer-portal-1/x-platform/token-x-connect-wire/gelistirici-dokumani.md#satis-durumu-jsoni)

```kotlin
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)

    if(requestCode == 0x1003) {
        try {
            var responseJson = data!!.getStringExtra("paymentBody")
        } catch (e : Exception){
            e.printStackTrace()
        }
    }
}
```

### Cihazda Tanımlı Kısımların Çekilmesi

Aşağıdaki AIDL'i projenize ekleyin.

```java
// IFiscalService.aidl
package com.tokeninc.fiscalservice;

interface IFiscalService {
 int getSection(out List<String> data);
}
```

Android Manifestinize bu satırları ekleyin.

```xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
    
      <!-- Bu izni eklemeniz gerekir -->
    <uses-permission
        android:name="android.permission.QUERY_ALL_PACKAGES"
        tools:ignore="QueryAllPackagesPermission" />

    <application>
    
     <!-- AIDL'in burada tanımlanması gerekir -->
    <queries>
        <intent>
            <action android:name="com.tokeninc.fiscalservice.AIDL" />
        </intent>
    </queries>

</manifest>
```

Uygulamanız içinde kısımları çekmek için bu kodu kullanabilirsiniz. [Kısımlarla beraber diğer dönen bilgilerin JSON formatı için tıklayın.](/token-developer-portal-1/x-platform/token-x-connect-wire/gelistirici-dokumani.md#fiscal-bilgisi-jsoni)

```kotlin
private fun bindToFiscalService() {
    try {
        val intent = Intent("com.tokeninc.fiscalservice.AIDL")
        val explicitIntent = convertImplicitIntentToExplicitIntent(this,intent)
        if (explicitIntent != null) {
            Log.i("$TAG-bindToFiscalService", "explicitIntent = VAR")
            bindService(explicitIntent, fiscalServiceConnection, BIND_AUTO_CREATE)
        } else {
            Log.i("$TAG-bindToFiscalService", "explicitIntent = null")
        }
    } catch (e: java.lang.Exception) {
        Log.i("$TAG-bindToFiscalService", "e: $e")
    }
}

private fun convertImplicitIntentToExplicitIntent(ct: Context, implicitIntent: Intent): Intent? {
    val pm = ct.packageManager
    val resolveInfoList = pm.queryIntentServices(implicitIntent, 0)
    if (resolveInfoList == null || resolveInfoList.size != 1) {
        return null
    }
    val serviceInfo = resolveInfoList[0]
    val component = ComponentName(serviceInfo.serviceInfo.packageName, serviceInfo.serviceInfo.name)
    val explicitIntent = Intent(implicitIntent)
    explicitIntent.component = component
    return explicitIntent
}

private fun fetchSections() {
    fiscalService!!.getSection(sectionList)
    
    // Array's first element is section info
    val sectionFiscalInfo = sectionList[0]
    Log.i("fetchSections", "Section Info: $sectionFiscalInfo")
}

var sectionList : MutableList<String> = mutableListOf()
var fiscalService: IFiscalService? = null
private var fiscalServiceConnection = object : ServiceConnection {
    override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
        try {
            fiscalService = IFiscalService.Stub.asInterface(service)
            fetchSections()
            fiscalService = null
        } catch (e: java.lang.Exception) {
            e.printStackTrace()
        }
    }
    override fun onServiceDisconnected(name: ComponentName?) {
        fiscalService = null
    }
}
```

### Cihazın Terminal ID'sinin Çekilmesi

{% file src="/files/wmR1VYgSqYCeqKFaqMHO" %}

Bu aar dosyasını indirin ve projenize ekleyin ve app build.gradle içinde aşağıdaki şekilde ekleyin.

```groovy
dependencies {
    implementation fileTree(dir: "libs", include: ["*.jar", "*.aar"])
}
```

Uygulamanız içinde terminal id'yi almak için:

```kotlin
private fun getTerminalID() {
    val deviceInfo = DeviceInfo(this)
    deviceInfo.getFiscalId(object : DeviceInfo.DeviceInfoResponseHandler{
        override fun onSuccess(result: String) {
            terminalId = result
        }

        override fun onFail(errMessage: String?) {
            Log.i("DeviceInfo-onFail", errMessage!!)
        }
    })
}
```

### Elektrik Kesintisi Durumunda Ödeme Bilgisinin Alınması

Ödeme sırasında cihazın elektriği kesilirse cihaz tekrar açıldığında otomatik olarak ödeme ekranına geçer. Bu ekrandan ödeme tamamlandıktan sonra uygulamanıza broadcast gönderilir.

Broadcasti alması için bu şekilde bir BroadcastReceiver kullanabilirsiniz. Burada dönen JSON ödeme sonucu JSON'ı ile aynıdır.

```kotlin
/**
 * Receives action token.intent.ACTION_POWERCUT_RESULT
 */
class SaleReceiptReceiver: BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        try {
            val paymentJson = intent.getStringExtra("paymentBody")!!
        } catch (e: Exception) {
            Log.i("SaleReceiptReceiver", "onReceive: Error occurred while saving power cut data!")
        }
    }
}
```

Android Manifest'inizde bu receiverı tanımlayın.

```xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <application>
        <!-- Elektrik kesintisi BroadcastReceiver tanımı -->
        <receiver android:name=".receivers.SaleReceiptReceiver" android:exported="true" android:enabled="true">
            <intent-filter>
                <action android:name="token.intent.ACTION_POWERCUT_RESULT"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </receiver>
        
    </application>

</manifest>
```

### Tam Entegre Android Manifest

```xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

     <!-- Bu izni eklemeniz gerekir -->
    <uses-permission
        android:name="android.permission.QUERY_ALL_PACKAGES"
        tools:ignore="QueryAllPackagesPermission" />

    <application>

         <!-- Gerekli meta-data bilgileri -->
        <!--
          Uygulamanızın ID olarak kullanılacak ismi.
          LYL_330TR_ ile başlamalıdır. Örnek: LYL_330TR_MYAPP
          Bu ismi kullanıcı görmez.
          -->
        <meta-data
            android:name="app_name"
            android:value="LYL_330TR_MYAPP" />
            
        <!-- X30TR için zorunlu değerdir. Değiştirmeyiniz. -->
        <meta-data
            android:name="app_model_type"
            android:value="330TR" />
            
        <!--
          Uygulamanızın versiyon numarası.
          build.gradle'ınızdaki versionCode değerine bağlayabilirsiniz.
          Geliştirmeniz sırasında 1 kullanabilirsiniz.
          -->
        <meta-data
            android:name="app_version"
            android:value="1" />
            
        <!-- Açılmasını istediğiniz activity -->
        <meta-data
            android:name="sale_activity_name"
            android:value="MainActivity">
        </meta-data>

        <!-- Elektrik kesintisi BroadcastReceiver tanımı -->
        <receiver android:name=".receivers.SaleReceiptReceiver" android:exported="true" android:enabled="true">
            <intent-filter>
                <action android:name="token.intent.ACTION_POWERCUT_RESULT"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </receiver>

    </application>

    <!-- AIDL'in burada tanımlanması gerekir -->
    <queries>
        <intent>
            <action android:name="com.tokeninc.fiscalservice.AIDL" />
        </intent>
    </queries>

</manifest>
```


---

# 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://developer.tokeninc.com/token-developer-portal-1/x-platform/in-app-integration/hizli-baslangic.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.
