# Geliştirici Dokümanı

## Kendi Yazılımınız ile Token integration Hub DLL'i Entegre Edin

## C# .NET Forms App Örneği

### Adım 1: Yeni Bir Proje Açın

<figure><img src="https://828363377-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FTDApe9ujkHROOK7s0JPT%2Fuploads%2Fq1GXw8LpClU9OHm18qb8%2Fimage%20(5).png?alt=media&#x26;token=f8dcac4e-398a-40c7-8176-88f225457b0e" alt=""><figcaption></figcaption></figure>

### Adım 2: Sağladığımız IntegrationHub Kütüphanesini Projeye Ekleyin

* “Add Reference…” butonuna tıklayın.&#x20;

<figure><img src="https://828363377-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FTDApe9ujkHROOK7s0JPT%2Fuploads%2FCqt5tkXVMLShoNQ65LyH%2Fimage%20(7).png?alt=media&#x26;token=fcb822f8-01c3-416b-b2ee-938c739e6071" alt=""><figcaption></figcaption></figure>

* “IntegrationHub.dll” adlı dosyayı seçip OK tuşuna basın.

<figure><img src="https://828363377-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FTDApe9ujkHROOK7s0JPT%2Fuploads%2FwR2w0OlW1guOwSXUwkYo%2Fimage%20(8).png?alt=media&#x26;token=0f3ada11-ade1-4713-94e8-143cd0a2f6d8" alt=""><figcaption></figcaption></figure>

* Bu aşamalardan sonra kod içinde IntegrationHub kütüphanesini kullanabilirsiniz:

  ```csharp
  using IntegrationHub;
  public static IntegrationHub.POSCommunication communication = IntegrationHub.POSCommunication.getInstance("Firma İsmi");
  ```

### Adım 3 (Opsiyonel): Yardımcı Json Classlarımızı ve Json Kütüphanesini Ekleyin

Bu kısım isteğe bağlıdır, ancak önerilmektedir; çünkü JSON oluşturacak ve ayrıştıracaksınız. Sağladığımız sınıflar ve kütüphaneler, bunu yapmanızı kolaylaştıracaktır. Bu dokuman, bu adımı tamamlamışsınız gibi devam edecektir. Kendi JSON dönüştürme sistemlerinizi yazmak isterseniz, bunu yapmaktan çekinmeyin; ancak bu dokumanla ilerlemek zorlaşabilir.

* Newtonsoft.Json paketini NuGet ile indirin

<figure><img src="https://828363377-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FTDApe9ujkHROOK7s0JPT%2Fuploads%2Fo9zGa00N8hUDIIju6yeQ%2Fimage%20(6).png?alt=media&#x26;token=c73fd9c2-8df3-441d-87d1-74ac95cd7fcb" alt=""><figcaption></figcaption></figure>

* Projenize, şablon dosyalarında sağlanan `Basket.cs`, `FiscalInfo.cs` ve `ReceiptInfo.cs` sınıflarını ekleyin.

### Adım 4: Communication Objesinin Oluşturulması

Communication nesnesini, uygulama genelinde erişilebilir olmasını sağlamak için Program sınıfı kapsamında bir singleton olarak başlatın. İletişimin uygulama başlayınca hemen başlamasını istemiyorsanız Objeyi bir buton yardımı ile kullanıcı butona basınca oluşturabilirsiniz.

```csharp
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace TokenDotNet
{
    internal static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        /// 
				
        public static IntegrationHub.POSCommunication communication = IntegrationHub.POSCommunication.getInstance("Firma İsmi");

        [STAThread]
        static void Main()
        {

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            Application.Run(new MainForm());
        }
    }
}
```

### Adım 5: Sepet Objesi ve Callbackleri Ayarlamak

Cihaz durumu ve seri iletişimi yönetmek için callback'leri ayarlayın ve sepet nesnesini ana formun içinde bir üye değişkeni olarak ayarlayın. Aşağıdaki kod parçası, şablon projedeki kodun basitleştirilmiş bir versiyonudur.

```csharp
namespace TokenDotNet
{
    public partial class MainForm : Form
    {
        private Basket basket;
        private IntegrationHub.POSCommunication communication = Program.communication;

	public void deviceStateCallback(bool isConnected, string id)
	{
	    Control.CheckForIllegalCrossThreadCalls = false;
	    if (isConnected)
	    {
	        //Device connect
	    }
	    else
	    {
	       //Device disconnect
	    }
	}
			
	public int serialInCallback(int type, string value) {
	    //Do what you want with the data which is passed as type,value pair. 
	    //Types can be found in documentation. 
	    return 1;
	}
        
        private void setUpCallbacks()
        {
            communication.setDeviceStateCallback(deviceStateCallback);
            communication.setSerialInCallback(serialInCallback);
        }
        
        public MainForm()
        {
            InitializeComponent();

						//init callbacks non-blocking way
            Thread thread = new Thread(setUpCallbacks);
            thread.Start();

						//create basket
            basket = new Basket();
            basket.basketID = "93ced0be-99f5-4e42-b0ca-bc781c778d69";
            basket.createInvoice = false;
            basket.documentType = 0;
            basket.isVoid = false;
        }
        
        private void clearBasket()
        {
            basket = new Basket();
        }
        
        private FiscalInfo constructFiscalInfoFromJson(string json)
        {
            return JsonConvert.DeserializeObject<FiscalInfo>(json);
        }
        private ReceiptInfo constructReceiptInfoFromJson(string json)
        {
            return JsonConvert.DeserializeObject<ReceiptInfo>(json);
        }

        private string constructJsonFromBasket(Basket basket)
        {
            return JsonConvert.SerializeObject(basket, Formatting.Indented);
        }
        
        private void sendBasketToPOS()
        {
            int basketStatus = communication.sendBasket(constructJsonFromBasket(basket));
	}
    }
}
```

## Integration Hub API C# Dokümanı

### USB Üzerinden Seri Haberleşme İçin Communication Objesi

Communication, kodunuz ile Android ÖKC cihazı arasında Integration Hub API'sini kullanarak iletişimi kolaylaştıran bir objedir. İletişimi başlatmak için öncelikle bu nesneyi oluşturmalısınız. Bu nesne oluştuktan sonra arka planda DLL bağlanmış olacak ve dokumanın ileri kısımlarında anlatıldığı gibi cihaz bağlanması veya bağlantı kopması durumlarında sizi callback mekanizması ile bilgilendiriyor olacak. Detaylı kullanım için Token Template Simulator uygulamasının kaynak kodlarına bakabilirsiniz.

```csharp
//Init the communication object using Instance of it.
public static IntegrationHub.POSCommunication communication = IntegrationHub.POSCommunication.getInstance("Firma İsmi");
```

## ÖKC Bağlantısı

### Cihaz durumundaki değişiklikleri dinlemek

* Cihaz durumlarındaki değişiklikleri dinlemek için `setDeviceStateCallback()` komutunu kullanın. Bu callback, yeni bir cihaz bağlandığında veya mevcut cihaz bağlantısı kesildiğinde yürütülecektir.
* `isConnected` parametresi, callbackin bir cihaz bağlantısı mı yoksa bağlantı kesilmesi mi olduğunu temsil eder. **True** değeri, bir cihazın bağlı olduğu anlamına gelir; **false** değeri ise bir cihazın bağlantısının kesildiğini gösterir.
* `id` cihazın mali numara bilgisini döndürür.

{% hint style="warning" %}
&#x20;Bu fonksiyon, senkron olarak çalışan `getDeviceInfo()`'u çağırdığı için ana program akışınızı engelleyebilir. Kullanırken dikkatli olun, ana programınızın engellenmemesi için thread'ler veya diğer yapılar kullanın. Optimal bir durumda çalıştırılması çok az zaman alır, ancak sorunlara yol açabilir.
{% endhint %}

{% hint style="danger" %}
**isConnected true geldiğinde kısımları çekmek zorunludur. Fiscal bilgileri alınmadan satış işlemlerine başlamayın.**
{% endhint %}

```csharp
//Signature of the function
public delegate void DeviceStateCallback(bool isDeviceConnected, string id);

public void deviceStateCallback(bool isConnected, string id)
{
    Control.CheckForIllegalCrossThreadCalls = false;
    if (isConnected)
    {
        //Device connected
        string fiscalInfo = communication.getFiscalInfo();
    }
    else
    {
       //Device disconnected
    }
}

communication.setDeviceStateCallback(deviceStateCallback);
```

### Bağlı cihaz tipinin alınması

* IntegrationHub.dll hem **X30 TR** hem de **300 TR** ile uyumlu çalışmaktadır. Anlık olarak hangi cihazın bağlı olduğunu anlamak için `getActiveDeviceIndex` komutunu kullanabilirsiniz. Device state callback ile bağlantının sağlandığına emin olduktan sonra  bu komutu çağırdığınızda **X30 TR** için 0, **300 TR** için ise 1 değerini dönecektir.&#x20;

### ÖKC'den kısımları (KDV'leri, departmanları) nasıl çekebilirim?

* Device state callback'i ile bağlantının sağlandığına emin olduktan sonra `getFiscalInfo()` komutunu kullanarak ÖKC cihazından bölüm ve kaydedilmiş ürün bilgilerini alın. Bağlantının sağlandığına nasıl emin olunacağı ile alakalı kod örneği Token Template Simulator'ün kaynak dosyalarında bulunmaktadır. [Bu fonksiyon, bir JSON objesi döndürür.](#fiscal-bilgisi-jsoni)

{% hint style="danger" %}
**Fiscal bilgilerini almak protokolü kullanmak için zorunludur. Fiscal bilgilerini alınmadan satış işlemlerine başlamayın.**
{% endhint %}

{% hint style="warning" %}
Bu fonksiyon senkron olarak çalıştığı için ana program akışınızı engelleyebilir. Kullanırken dikkatli olun; ana programınızın engellenmemesi için thread'ler veya diğer yapılar kullanın. Optimal bir durumda çalıştırılması çok az zaman alır, ancak sorunlara yol açabilir.
{% endhint %}

```csharp
//Returns the sections and saved products as a json string.
string fiscalInfo = communication.getFiscalInfo()
```

## Protokolün İletişim Fonksiyonları

### ÖKC'ye Sepet Yollamak

* `sendBasket()` fonksiyonu, sepet bilgilerini ÖKC cihazına göndermek için kullanılır. Parametre olarak bir sepet JSON'u sağlanmalıdır. Bu JSON'un örneğini 'JSON Örnekleri' bölümünde bulabilirsiniz.
* sendBasket fonksiyonuna cevap olarak gönderimin başarılı olduğu (1) veya başarısız olduğu (0) bilgisi döner.
* Satışın ve ödemelerin durumunu [serialInCallback üzerinden ilgili tag ile takip etmelisiniz.](#okcden-gelen-paketleri-dinlemek)

```cpp
//Returns 1 if succeed, 0 if fail
int basketStatus = communication.sendBasket(REQUEST_BODY);
```

### ÖKC' ye Ödeme Yollamak

* Eğer **X30 TR**' ye bağlıysanız, hem sepet hem ödeme bilgilerini aynı istek içinde `sendBasket` fonksiyonu ile göndermelisiniz.
* Eğer **300 TR**' ye bağlıysanız, sadece 1 tane ödeme varsa ödeme bilgisini **X30tr**' de olduğu gibi sepet içerisindeki ürün bilgileriyle beraber `sendBasket` komutu ile gönderebilirsiniz. Birden fazla ödeme yollanmak istenirse `sendBasket` komutu ile sepet gönderilip serialInCallback' e `type: 1, status: 0` cevabı aldıktan sonra `sendPayment` komutu ile ödemeler tek tek gönderilmelidir. 1' den fazla `sendPayment` çağırılmak istenirse bir önceki `sendPayment` için serialInCallback' e `type: 10, status: 0` cevabı aldıktan sonra sonraki `sendPayment` çağırılmalıdır.
* sendPayment fonksiyonuna cevap olarak gönderimin başarılı olduğu (1) veya başarısız olduğu (0) bilgisi döner.
* Ödemelerin durumunu [serialInCallback üzerinden ilgili tag ile takip etmelisiniz.](#okcden-gelen-paketleri-dinlemek)

```cpp
//Returns 1 if succeed, 0 if fail
int paymentStatus = communication.sendPayment(REQUEST_BODY);
```

* **300TR** için örnek `sendPayment` isteği:

```
  {
    "amount": 1000,
    "type": 1
  }
```

* **300TR**' de fiş iptali için ise,`sendPayment` isteği içinde isVoid değerini true göndermeniz yeterli.

```
  {
    "isVoid": true
  }
```

### ÖKC'den Gelen Paketleri Dinlemek

* `setSerialInCallback()` komutunu kullanarak ÖKC'den gelen yanıtları dinleyin. Bu komutu girdikten sonra, ayrı bir thread' de izlenen iletişim, gelen bilgileri belirlediğiniz callback fonksiyonuna yönlendirilecektir.
* `Type`, ÖKC'den gelen verinin türünü temsil eder; türler ve tanımları bu belgede bulunan [Türler tablosunda](#serialincallbackte-hangi-veri-tipleri-gelir) bulunabilir.
* `Value`, veriyi temsil eden JSON dizesidir.

```csharp
//Signature of the function
public delegate int SerialInCallback(int type, string value);

public int serialInCallback(int type, string value) {
	//Do what you want with the data which is passed as type,value pair. 
	//Types can be found in documentation. 
	return 1;
}

communication.setSerialInCallback(serialInCallback);
```

### serialInCallback'te Hangi Veri Tipleri Gelir?

Aşağıdaki tablo, kütüphanede mevcut olan istek türlerini açıklamaktadır. Bu türler, seri iletişimdeki callback aracılığıyla dinlenmelidir.

| Veri Tipi | Açıklama                                                                            |
| --------- | ----------------------------------------------------------------------------------- |
| 1         | Sepet durumunun döndüğü tip **(sadece 300TR' de parçalı ödemele senaryoları için)** |
| 3         | Satış bilgisini döner                                                               |
| 9         | Cihazda satış ekranı açık değilken sepet veya ödeme gönderilirse bu paket döner.    |
| 10        | Gönderilen ödemenin cevabı **(sadece 300TR' de parçalı ödemele senaryoları için)**  |

### Satış Bilgilerini Dinlemek

* Callback fonksiyonu ayarlandığında, gönderilen satışların durumu belirttiğiniz callback fonksiyonuna iletilecektir.
* Aşağıda callback fonksiyonunun örnek kullanımı görülebilir. Satış JSON'u örneği 'Örnek JSON' bölümünde bulunabilir.

```csharp
public int serialInCallback(int type, string value) {
	 // If sale info
	 if(type == 3){
		 //This will print 3 to the console since type of sale info is 3.
		 //See request types table in documentation.
		 Console.WriteLine(type);
		 //This will write the sale json to console.
		 Console.WriteLine(value);
	 }
	 return 1;
 }
```

### İletişimin Kod Üzerinden Olarak Kontrol Edilmesi

Kod üzerinden ÖKC bağlantısını kesmek ve ÖKC'ye tekrar bağlanmak için `deleteCommunication()` ve `reConnect()` fonksiyonlarını kullanabilirsiniz.

```csharp
// Bağlantının Kesilmesi
communication.deleteCommunication();

// Tekrar Bağlanılması
communication.reConnect();
```

## JSON Açıklamaları

### Sepet JSON'ı

Örnek

```json
{
  "basketID": "93ced0be-99f5-4e42-b0ca-bc781c778d69",
  "createInvoice": false,
  "documentType": 0,
  "isVoid": false,
  "items": [
    {
      "name": "Su",
      "pluNo": 0,
      "price": 500,
      "sectionNo": 1,
      "unit": "Adet",
      "quantity": 1000,
      "taxPercent": 1000
    },
    {
      "barcode": "",
      "name": "Armut",
      "pluNo": 0,
      "price": 1500,
      "sectionNo": 1,
      "quantity": 1000,
      "taxPercent": 1000
    }
  ],
  "paymentItems": [
    {
      "amount": 1000,
      "type": 1
    },
    {
      "amount": 1000,
      "type": 3
    }
  ],
  "customerInfo": {
    "buildingName": "Building B",
    "buildingNumber": "202",
    "cityName": "City Y",
    "citySubdivisonName": "Subdivision 2",
    "country": "Country B",
    "email": "customer2@example.com",
    "isLock": false,
    "name": "Ege Yardımcı",
    "postalZone": "67890",
    "region": "Region Y",
    "room": "20",
    "street": "Street B",
    "taxID": "0987654321",
    "taxScheme": "Scheme B",
    "telefax": "654321",
    "telephone": "0123456789"
  },
  "adjust": {
    "description": "İndirim Açıklaması",
    "discountOrSurcharge": 0,
    "type": 0,
    "value": 2000
  }
}
```

Açıklama

```json
{
  "basketID": "93ced0be-99f5-4e42-b0ca-bc781c778d69",
  "createInvoice": false,
  "documentType": 0,
  "isVoid": false,
  "items": [],
  "paymentItems": [],
  "customerInfo": null,
  "adjust": null
}
```

| **Alan**        | **Tip**    | **Açıklama**                           | **Örnek Değer**                                                                                                                        |
| --------------- | ---------- | -------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- |
| `basketID`      | `string`   | UUID                                   | `“93ced0be-99f5-4e42-b0ca-bc781c778d69”`                                                                                               |
| `createInvoice` | `bool`     | Fiş oluştur.                           | `true`                                                                                                                                 |
| `documentType`  | `int`      | Satış tipi.                            | SATIS(0), AVANS(9000), CARI TAHSILAT(9002), FATURA BILGI FISI(9005), E-FATURA BILGI FISI(9006), E-ARSIV BILGI FISI(9007), ECZANE(9008) |
| `isVoid`        | `bool`     | Eğer true ise iptal fisi basilacaktir. | `false`                                                                                                                                |
| `items`         | `[object]` | Sepetteki ürünlerin listesi.           |                                                                                                                                        |
| `paymentItems`  | `[object]` | Ödeme planının listesi.                |                                                                                                                                        |
| `customerInfo`  | `object`   | Müşteri Bilgisi.                       |                                                                                                                                        |
| `adjust`        | `object`   | İndirim/Arttırım bilgisi.              |                                                                                                                                        |
| note            | string     | Fiş altı notu                          |                                                                                                                                        |

## Sepete nasıl ürün eklerim?

### Items Objesi

Sepete bu formatta ürün ekleyebilirsiniz.

Eklediğiniz ürün cihazda PLU olarak kayıtlıysa pluNo ekleyebilirsiniz.

```json
"items": [
  {
    "barcode": "",
    "name": "Su",
    "pluNo": 0,
    "price": 500,
    "sectionNo": 1,
    "taxPercent": 1000,
    "unit": "Adet",
    "quantity": 1000
  }]
```

| **Alan**    | **Tip**  | **Açıklama**                                                        | **Örnek Değer** |
| ----------- | -------- | ------------------------------------------------------------------- | --------------- |
| `barcode`   | `string` | Ürün barkodu                                                        | 8690006200      |
| `name`      | `string` | Ürün adı                                                            | `"Su"`          |
| `pluNo`     | `int`    | Ürün PLU numarası (sadece cihazda PLU olarak kayıtlıysa gereklidir) | `0`             |
| `price`     | `int`    | Ürünün kuruş cinsinden fiyatı                                       | `500`           |
| `sectionNo` | `int`    | Kısım no                                                            | `1`             |
| `unit`      | `string` | Ölçü birimi                                                         | `"Adet"`        |
| `quantity`  | `int`    | Miktarın 1000 ile çarpılmış hali                                    | `1000`          |

## Sepete ödeme nasıl eklerim?

### PaymentItems Objesi

Sepete aşağıdaki gibi ödeme ekleyerek ÖKC'de ekstra işleme gerek kalmadan ödemeleri tamamlayabilirsiniz.

```json
"paymentItems": [
  {
    "amount": 1000,
    "type": 1
  }
]
```

| **Alan** | **Tip** | **Açıklama**                  | **Örnek Değer** |
| -------- | ------- | ----------------------------- | --------------- |
| `amount` | `int`   | Kuruş cinsinden ödeme miktarı | `1000`          |
| `type`   | `int`   | [Ödeme türü](#odeme-tipleri)  | `1`             |

### Ödeme Tipleri

Sepete ödeme eklerken ve satış durum bilgisini alırken aşağıdaki ödeme tipi değerlerini kullanabilirsiniz.

<table data-header-hidden><thead><tr><th></th><th width="40"></th><th></th></tr></thead><tbody><tr><td><strong>Ödeme Tipi</strong></td><td><strong>Değer</strong></td><td><strong>Açıklama</strong></td></tr><tr><td><code>PAYMENT_CASH</code></td><td>1</td><td>Nakit</td></tr><tr><td><code>PAYMENT_CHEQUE</code></td><td>2</td><td>Çek</td></tr><tr><td><code>PAYMENT_CREDITCARD</code></td><td>3</td><td>Kredi Kartı</td></tr><tr><td><code>PAYMENT_FOOD</code></td><td>7</td><td>Yemek Kartı</td></tr><tr><td><code>PAYMENT_ODEMESIZ</code></td><td>8</td><td>Ödemesiz</td></tr><tr><td><code>PAYMENT_IKRAM</code></td><td>9</td><td>İkram</td></tr><tr><td><code>PAYMENT_PUAN</code></td><td>11</td><td>Puan</td></tr><tr><td><code>PAYMENT_VPOS</code></td><td>12</td><td>EPOS Ödeme</td></tr><tr><td><code>PAYMENT_MOBILE</code></td><td>13</td><td>Mobil Ödeme</td></tr><tr><td><code>PAYMENT_EMONEY</code></td><td>14</td><td>E-Para Ödeme</td></tr><tr><td><code>PAYMENT_CHARITY</code></td><td>15</td><td>Bağış</td></tr><tr><td><code>PAYMENT_BOND</code></td><td>16</td><td>Bond ile Ödeme</td></tr><tr><td><code>PAYMENT_OPENACCOUNT</code></td><td>17</td><td>Açık Hesap</td></tr><tr><td><code>PAYMENT_MONEYTRANSFER</code></td><td>18</td><td>Para Transferi</td></tr><tr><td><code>PAYMENT_TRANSPORTATIONCARD</code></td><td>19</td><td>Ulaşım Kartı</td></tr><tr><td><code>PAYMENT_GIFTCARD</code></td><td>20</td><td>Hediye Kartı</td></tr></tbody></table>

## Hangi satış tipleri kullanabilirim?

Sepet JSON'ı içine "documentType" hanesinde desteklenen satış tiplerini gönderebilirsiniz. Normal satış dışındaki satış tipleri için sepette başka gerekli haneler bulunmaktadır. Diğer satış tipleri için örnek sepetler burada bulunmaktadır. Diğer bilgiler dokümantasyonda bulunmaktadır.

| Satış/Belge Tipi                                   | documentType değeri |
| -------------------------------------------------- | ------------------- |
| Satış                                              | 0                   |
| Avans                                              | 9000                |
| Cari Tahsilat                                      | 9002                |
| Fatura Bilgi Fişi                                  | 9005                |
| e-Fatura Bilgi Fişi                                | 9006                |
| e-Arşiv Bilgi Fişi                                 | 9007                |
| Matrah Dışı Tutar İçeren Satış (Eczane/Katkı Payı) | 9008                |

## Sepete müşteri bilgileri nasıl eklerim?

### CustomerInfo Objesi

Gerekli durumlarda müşteri bilgilerini aşağıdaki formatta ekleyerek belge düzenlenmesini sağlayabilirsiniz.

```json
"customerInfo": {
  "buildingName": "Building B",
  "buildingNumber": "202",
  "cityName": "City Y",
  "citySubdivisonName": "Subdivision 2",
  "country": "Country B",
  "email": "customer2@example.com",
  "isLock": false,
  "name": "Ege Yardımcı",
  "postalZone": "67890",
  "region": "Region Y",
  "room": "20",
  "street": "Street B",
  "taxID": "0987654321",
  "taxScheme": "Scheme B",
  "telefax": "654321",
  "telephone": "0123456789"
}

```

| **Alan**             | **Tip**  | **Açıklama**                                                | **Örnek Değer**           |
| -------------------- | -------- | ----------------------------------------------------------- | ------------------------- |
| `buildingName`       | `string` | Bina adı.                                                   | `"Building B"`            |
| `buildingNumber`     | `string` | Bina numarası.                                              | `"202"`                   |
| `cityName`           | `string` | Şehir adı.                                                  | `"City Y"`                |
| `citySubdivisonName` | `string` | İlçe adı.                                                   | `"Subdivision 2"`         |
| `country`            | `string` | Ülke adı.                                                   | `"Country B"`             |
| `email`              | `string` | Email.                                                      | `"customer2@example.com"` |
| `isLock`             | `bool`   | Eğer true ise gönderdiğiniz bilgiler ÖKC'de değiştirilemez. | `false`                   |
| `name`               | `string` | İsim.                                                       | `"Ege Yardımcı"`          |
| `postalZone`         | `string` | Posta kodu.                                                 | `"67890"`                 |
| `region`             | `string` | Bölge.                                                      | `"Region Y"`              |
| `room`               | `string` | Oda numarası.                                               | `"20"`                    |
| `street`             | `string` | Sokak adı.                                                  | `"Street B"`              |
| `taxID`              | `string` | Vergi numarası.                                             | `"0987654321"`            |
| `taxScheme`          | `string` | Vergi dairesi.                                              | `"Scheme B"`              |
| `telefax`            | `string` | Telefax numarası.                                           | `"654321"`                |
| `telephone`          | `string` | Telefon numarası.                                           | `"0123456789"`            |

## Sepete veya ürüne nasıl indirim artırım ekleyebilirim?

### Adjust Objesi

Sepete veya ürüne indirim artırım eklemek için aşağıdaki obje formatını kullanabilirsiniz.

Bu objeyi ürünün altına eklediğinizde ürüne, doğrudan sepetin altına eklediğinizde sepetin tamamına indirim/artırım yapmış olursunuz.

```json
"adjust": {
  "description": "Açıklama",
  "discountOrSurcharge": 0,
  "type": 0,
  "value": 2000
}
```

| **Alan**              | **Tip**  | **Açıklama**                                                                   | Örnek Değer |
| --------------------- | -------- | ------------------------------------------------------------------------------ | ----------- |
| `description`         | `string` | İndirim/Arttırım açıklaması. Fişte bastırılır.                                 | `"İndirim"` |
| `discountOrSurcharge` | `int`    | 0 indirim, 1 arttırım.                                                         | `0`         |
| `type`                | `int`    | 0 fiyat indirim/arttırımı, 1 yüzdelik indirim arttırım.                        | `0`         |
| `value`               | `int`    | **Adet başına** İndirim veya arttırım değerinin 100 ile çarpılmış hali         | `2000`      |
| `totalValue`          | `int`    | **Ürüne yapılan toplam** indirim veya artırım değerinin 100 ile çarpılmış hali | `2000`      |

{% hint style="info" %}
2 adet olan bir ürüne value=1000 gönderirseniz 20 TL, totalValue=1000 gönderirseniz 10 TL indirim/artırım yapılmış olur.

Sepete indirim/artırım yaparken **sadece value gönderilebilir**. totalValue kullanılamaz.
{% endhint %}

### Fiscal Bilgisi JSON'ı

Örnek

```json
{
  "businessMode": 0,
  "pluCount": 1,
  "plus": [
    {
      "barcode": "",
      "name": "Elma",
      "pluNo": 0,
      "price": 2000,
      "sectionNo": 1,
      "taxPercent": 1000,
      "type": 0,
      "unit": "Adet",
      "vatID": 1
    }
  ],
  "receiptLimit": null,
  "sectionCount": 2,
  "sections": [
    {
      "limit": 0,
      "name": "GİDA",
      "price": 0,
      "sectionNo": 1,
      "taxPercent": 1000,
      "type": 0
    },
    {
      "limit": 0,
      "name": "TEKEL",
      "price": 0,
      "sectionNo": 2,
      "taxPercent": 2000,
      "type": 0
    }
  ],
  "currencies": [
    {
      "id": 1,
      "name": "DOLAR",
      "rate": 415068
    },
    {
      "id": 2,
      "name": "AVRO",
      "rate": 487512
    },
    {
      "id": 3,
      "name": "STERLIN",
      "rate": 557010
    },
    {
      "id": 4,
      "name": "RUBLE",
      "rate": 5003
    },
    {
      "id": 5,
      "name": "YEN",
      "rate": 279792
    }
  ],
  "currencyDate": 1759276800,
  "paymentAppInfo": [67,10005]
}

```

<table data-header-hidden><thead><tr><th></th><th></th><th></th><th></th></tr></thead><tbody><tr><td><strong>Alan</strong></td><td><strong>Tip</strong></td><td><strong>Açıklama</strong></td><td>Örnek Değer</td></tr><tr><td><code>businessMode</code></td><td><code>int</code></td><td>Isletme modu.</td><td>Standart(0), Eczane(1), Konaklama(2)</td></tr><tr><td><code>pluCount</code></td><td><code>int</code></td><td>Cihazda kayitli PLU adeti.</td><td><code>1</code></td></tr><tr><td><code>plus</code></td><td><code>[object]</code></td><td>Cihazda kayıtlı ürünlerin listesi.</td><td><code>[{"barcode": "", "name": "Elma", "pluNo": 0, "price": 2000, "sectionNo": 1, "taxPercent": 1000, "type": 0, "unit": "Adet", "vatID": 1}]</code></td></tr><tr><td><code>receiptLimit</code></td><td><code>int</code></td><td>Fiş limiti. Bu tutarın üstüne bilgi fişi oluşturulmalıdır.</td><td>6900</td></tr><tr><td><code>sectionCount</code></td><td><code>int</code></td><td>Cihazda kayıtlı kısımların sayısı.</td><td><code>2</code></td></tr><tr><td><code>sections</code></td><td><code>[object]</code></td><td>Cihazda kayıtlı kısımların listesi.</td><td><code>[{"limit": 0, "name": "GİDA", "price": 0, "sectionNo": 1, "taxPercent": 1000, "type": 0}, {"limit": 0, "name": "TEKEL", "price": 0, "sectionNo": 2, "taxPercent": 2000, "type": 0}]</code></td></tr><tr><td>currencies</td><td>[object]</td><td>Cihazda kayıtlı <a href="../doviz-ile-odeme">dövizlerin</a> ve kurlarının listesi</td><td></td></tr><tr><td>currencyDate</td><td>int</td><td>Cihazdaki döviz kurlarının son güncellendiği tarih</td><td><p></p><pre><code>1759276800
</code></pre></td></tr><tr><td>paymentAppInfo</td><td>[int]</td><td>Cihazdaki ödeme uygulamalarının (banka, yemek...) <a href="banka-yemek-uygulamalari">operatorId listesi </a></td><td>[67, 1005]</td></tr></tbody></table>

### Plus Objesi

```json
"plus": [
  {
    "barcode": "",
    "name": "Elma",
    "pluNo": 0,
    "price": 2000,
    "sectionNo": 1,
    "taxPercent": 1000,
    "type": 0,
    "unit": "Adet",
    "vatID": 1
  }
]

```

| **Alan**     | **Tip**  | **Açıklama**                 | **Örnek Değer**           |
| ------------ | -------- | ---------------------------- | ------------------------- |
| `barcode`    | `string` | Ürün barkodu.                | `""`                      |
| `name`       | `string` | Ürün ismi                    | `"Elma"`                  |
| `pluNo`      | `int`    | PLU numarası.                | `0`                       |
| `price`      | `int`    | Ürün fiyatı kuruş cinsinden. | `2000`                    |
| `sectionNo`  | `int`    | Bağlı oldugu kısım numarası. | `1`                       |
| `taxPercent` | `int`    | Vergi dilimi.                | `1000`                    |
| `type`       | `int`    | Ürün tipi.                   | Standart(0), Konaklama(1) |
| `unit`       | `string` | Ölçü birimi.                 | `"Adet"`                  |
| `vatID`      | `int`    | -                            | `1`                       |

### Section Objesi

```json
"sections": [
  {
    "limit": 0,
    "name": "GİDA",
    "price": 0,
    "sectionNo": 1,
    "taxPercent": 1000,
    "type": 0
  }
]
```

| **Alan**     | **Tip**  | **Açıklama**    | **Örnek Değer** |
| ------------ | -------- | --------------- | --------------- |
| `limit`      | `int`    | -               | `0`             |
| `name`       | `string` | Kısım adı.      | `"GİDA"`        |
| `price`      | `int`    | -               | `0`             |
| `sectionNo`  | `int`    | Kısım numarası. | `1`             |
| `taxPercent` | `int`    | Vergi dilimi.   | `1000`          |
| `type`       | `int`    | -               | `0`             |

### Satış Durumu JSON'ı

Satış durumu JSON'u, ÖKC tarafından ana makineye gönderilecektir. Başarılı satış JSON'ı aşağıda verilmiştir. Bu bilgiler callback'ler aracılığıyla gözlemlenebilir.

Örnek

```json
//Başarılı Satış
{
  "basketID": "93ced0be-99f5-4e42-b0ca-bc781c778d69",
  "documentType": 0,
  "InstanceIdentifier": "XXXX",
  "invoiceID": "",
  "message": "OK",
  "paymentCount": 1,
  "paymentItems": [
    {
      "amount": 2000,
      "BatchNo": 0,
      "currencyId": 0,
      "description": "Tum tutarı nakit olarak odet",
      "operatorId": 0,
      "status": -1,
      "TxnNo": 0,
      "type": 1
    }
  ],
  "customerInfo": {},
  "receiptNo": 2,
  "status": 0,
  "UUID": "aa2c8046-f0bd-4617-9f5d-0bb6eb4f4ed7",
  "zNo": 12
}
```

[customerInfo  objesinin bilgisi için tıklayın.](#customerinfo-objesi)

Status olarak aşağıdaki değerler gelebilir:

| status | Anlamı    |
| ------ | --------- |
| 0      | Başarılı  |
| -1     | Başarısız |
| 99     | Fiş iptal |

## Belirli Banka ve Yemek Kartı Uygulamalarına Yönlendirme

paymentItems içindeki ödemelerde, eğer o ödeme kredi kartı (type 3) veya yemek kartı (type 7) ise, cihazda yüklü olması şartıyla, belirli bir banka veya yemek kartı uygulamasına yönlendirilmesini sağlayabilirsiniz.

[Banka ve yemek kartı uygulamaları listesi için tıklayın.](https://developer.tokeninc.com/token-developer-portal-1/x-platform/token-x-connect-wire/banka-yemek-uygulamalari)

```json
"paymentItems": [
  {
    "amount": 1000, // 10 TL
    "type": 3, // Kredi Kartı
    "operatorId": 67 // Yapı Kredi
  }
]
```

veya

```json
"paymentItems": [
  {
    "amount": 1000, // 10 TL
    "type": 7, // Yemek Kartı
    "operatorId": 1005 // TokenFlex
  }
]
```
