# InPOS SDK İle Yazılım Geliştirme¶

## inposext¶

inposext kitaplığı Windows ya da Linux (32-bit) PC üzerinde çalışacak uygulamaların yazarkasa uygulamasına bağlanarak satış yapmasına olanak sağlamaktadır.

inposext kullanımına yönelik temel ilkeler:

- PC - cihaz arasında TCP bağlantısı kurulur.
- Bağlantı kurma aşamasında PC uygulaması (inposext) sunucu rolünü üstlenir. Cihaz ayarlanmış olan (PC uygulamasına ait) ip:port ikilisine bağlanmaya çalışır.
- Bağlantı kurulduktan sonra PC uygulaması istemci rolünü üstlenir. Cihaz ile olan tüm mesajlaşmalarda her zaman önce PC uygulamasından cihaza mesaj gönderilir. Kimi mesajlara anında yanıt beklenirken diğerleri tek yönlüdür.
  - Asenkron cihaz durumu özelliği kullanılırsa cihazdan PC'ye mesaj gönderilebilir.
- Aradaki bağlantının kopması durumunda cihaz otomatik olarak ilgili ip:port uç noktasına bağlanmaya çalışır.

inposext kitaplığı C API'leri içerir. Kitaplığın çalışması için QtCore4, QtNetwork4 ve libeay32 kitaplıkları gerekmektedir. Windows işletim sistemi için bu kitaplık dosyaları inposext ile birlikte dağıtılmaktadır, ancak kitaplık dosyaları qt.io sitesinden indirilebilecek olan Windows 32-bit VC++2010 Qt 4.8.7 paketinde bulunanlarla aynıdır. Kitaplıkların çalışması için Windows makinelerde Visual C++ 2010 Runtime 32-bit (x86) çalışma zamanı kitaplığı kurulu olmalıdır. Linux PC'lerde QtCore4, QtNetwork4 ve libcrypto kitaplıkları kurulu olmalıdır.

InposExt.Net kitaplığı .Net 2.0 ve üzeri .Net sürümleri hedefleyen, inposext'teki C fonksiyonlarının .Net ortamında kolayca kullanılmasını sağlamak için geliştirilmiş bir "wrapper" kitaplıktır. inposext ve inposext için gerekli olan QtCore4, QtNetwork4 ve libeay32 kitaplıkları ile birlikte kullanılmalıdır.

QtGui4 kitaplığı exttest ve inposgmp3 uygulamaları için gereklidir. PC uygulaması ile birlikte bu kitaplıkların dağıtılmasına gerek yoktur.

inposext kullanımı için inposext.h header dosyası yeterlidir:

    #include <inposext.h>

inposext_types.h header dosyası inposext.h dosyasında bulunan işlevlerin kullandığı enum ve struct tanımlarını içermektedir.

Yazıcı işlevleri de kullanılacaksa inposext_printer.h header dosyası da eklenmelidir:

    #include <inposext_printer.h>

inposext kullanımına yönelik açıklama ve öneriler:

- Uygulamayı bloklayabilecek tüm işlevler bir zaman aşımı parametresi almaktadır. Uygulama u zaman aşımı değerini kullanarak ana/GUI thread'ını uzun süreli bloklamayı engelleyecek şekilde geliştirilebilir.
  - ExtTest örnek uygulamasındaki inposext_initialiaze() kullanımı GUI thread'ini uzun süreli bloklamadan ilgili işlevin kullanımına bir örnektir.
- inposext API'leri cihaz içerisinde ekranlar arasında gezinmeyi sağlayan işlevler sunmamaktadır. Bu nedenle cihazı ve PC uygulamasını kullanan kişi PC uygulaması tarafından cihazı gerekli duruma getirme konusunda yönlendirilmelidir. Satış yapabilmek için cihazda herhangi bir kasiyer kullanıcına giriş yapılmış olmalı ve cihaz satışa giriş ekranında (InposEcrIdle) ya da kasiyer ana menüsüde (InposEcrMainMenu) bulunmalıdır .
- inposext_end_sale() işlevi satış işleminin sonlanmasını beklemeden döner. Satış işleminin sonucu inposext_ecr_state(), inposect_sale_state() ve inposext_receipt_data() işlevleri kullanılarak belirlenebilir. Başarılı satış sonrasında cihaz durumu InposEcrSale'den InposEcrIdle'a geçecektir. Kredi kartı ile tahsilat sırasında yazarkasa durumu (inposext_ecr_state()) InposEcrSale'de olacak ancak inposext_sale_state() InposSaleWaitingForTransactionCompleted bildirecektir. Diğer bir seçenek, inposext_receipt_data()'nın döndürdüğü satış verilerinde toplam tutar ile ödeme tiplerine ait tutarları karşılaştırarak satışın sonlanıp sonlanmadığına karar vermektir.

### Cihaz Eşleme¶

inposext API'lerinin kullanılabilmesi için öncelikle cihaz ile PC eşlenmelidir. Test cihazlarında uygulama no'su 1 olan harici uygulama tanımlanmıştır. Geliştirme süresince bu uygulama no'sunu hem cihazda hem de PC uygulamalarında kullanılmalıdır. Her bir harici uygulama entegrasyonu için daha sonra inPOS SDK geliştirme ekibi tarafından tekil bir numara belirlenecektir.

Test cihazlarında Servis hesabının şifresi 4321, diğer kullanıcıların şifresi 1234'tür.

PC'de eşleme hazırlığı:

- inposgmp3.exe uygulaması çalıştırılır. (Uygulama bağlantısı)
- IP alanında PC'de geçerli olan IPv4 IP adresleri listelenir. Bu adreslerden biri cihaza kaydedilmek üzere belirlenir.
  - Cihaz her zaman aynı ip:port ikilisine bağlanacağından geliştirme yapılan PC'nin her zaman aynı IP'yi alması gerekir. PC'ye statik IP tanımlanmalı.
- Bir port girilir.
  - /libinposext/bin/exttest.exe uygulaması öntanımlı port olarak 59000'i kullanmaktadır. Kolaylık olması için inposgmp3 uygulamasında da 59000 kullanılması önerilir.
- PC uygulaması seçilir.
  - Örneğin exttest.exe ya da ExtTest.Net.exe uygulamaları için bu uygulama dosyaları seçilmelidir.
- Geliştirme cihazının sicil no'su girilir.
  - Sicil no cihazın arkasındaki etikette, Servis veya Yönetici > Ayarlar > Sürüm Bilgileri ekranında, Servis kullanıcısı giriş ekranında ya da basılan herhangi bir fiş veya raporda görülebilir.
- Uygulama no olarak 1 girilmelidir.

Cihazda eşleme hazırlığı:

- Servis > 0.Diğer > 3.Harici Uygulamalar > 3.Uygulama Kapat ile 1 no'lu uygulama kapatılmalı.
- Servis > 0.Diğer > 3.Harici Uygulamalar > 1.Uygulama Eşle ekranına giriş yapılır. Sırasıyla 1 uygulama numarası, PC IP adresi ve PC uygulaması portu girilir.
  - Eşleme işlemi tekrarlanıyorsa önceden girilmiş IP ve port bilgileri ekranda gösterilir. IP veya port değişmiyorsa Giriş tuşu ile görünen değerler onaylanabilir.
- Port girildikten sonra girilen verilerin gösterildiği ekrana gelinir.

Yukarıdaki hazırlıklar yapıldıktan sonra önce PC'deki inposgmp3 uygulamasında Eşle tuşuna basılır, sonra cihazda Giriş tuşuna basarak eşleme başlatılır. Eşleme sonucu ekranda gösterilir. Eşleme başarılı ise sonraki adımda uygulama etkinleştirilir.

/libinposext/bin/exttest.exe uygulaması açılıp cihaz sicil no'su girilip, Enter'a basılıp, Cihaza Bağlan tuşuna basılarak cihazın uygulama bağlanması sağlanabilir. Eğer 59000'den farklı bir port seçildiyse Cihaza Bağlan'a basılmadan önce port doğru değere ayarlanmalıdır. ExtTest uygulamasına cihaz değil PC IP'si girilmelidir. IP alanı 0.0.0.0 olarak bırakılabilir. 0.0.0.0 PC'deki tüm arayüzlerden bağlantı kabul edilmesini sağlar.

### Bulgu Bildirme¶

InPOS SDK kullanımı sırasında karşılaştığınız sorunları ya da diğer her türlü sorunuzu sdk@inpos.com.tr adresine gönderebilirsiniz. Karşılaştığınız sorunların inPOS geliştirme ekibi tarafından daha kolay ve doğru şekilde anlaşılabilmesi için aşağıdaki kontrol listesini belirtilen sıra ile uygulayıp başarısız olan adımları bulgu raporunuza ekleyin:

- inposext'in çalışması için ön koşul kontrolü: libinposext/bin klasöründeki ExtTest.exe'yi (ExtTest.Net.exe değil) çalıştırın. msvcr100.dll hatası alırsanız yukarıdaki belirtildiği üzere Microsoft Visual C++ 2010 32-bit (x86) runtime kitaplıklarını kurun.
- inposext sürümü: ExtTest.exe uygulamasındaki sürümün güncel sürüm olduğunu kontrol edin. Her yeni sürüm notu ile birlikte güncel sürüm no da bildiriliyor.
- InposExt.Net.dll için ön koşul kontrolü: libinposext/bin klasöründeki ExtTest.Net.exe'yi çalıştırın. ExtTest.Net.exe'yi değil ancak kendi uygulamanızı çalıştırırken hata alıyorsanız QtCore, QtNetwork, libeay32, inposext ve InposExt.Net dll'lerinin uygulama dosyanız ile aynı klasörde olduğundan emin olun. İlgili uyarılar libinposext/src/ExtTest.Net/BeniOku.txt belgesinde de bulunmaktadır.
- Cihaz yazılım sürümü: Yönetici ya da Servis > Ayarlar > Sistem Güncelleme ile cihazınızın alması gereken güncelleme olup olmadığını kontrol edin. Sürüm notlarında yeni bir sürüm sonrasında hem güncelleme gerektiğini hem de güncelleme sonrasında eşleme tekrar gerektiği yer alabilir. Sürüm notlarındaki yönergeleri uygulamış olduğunuzu kontrol edin. Cihaz yazılım sürümü Yönetici ya da Servis > Ayarlar > Sürüm Bilgileri ekranında görülebilir.
- Cihazda harici uygulama eşleştirme: Eşleme sırasında cihaza PC'nin IP:port'unun girildiğinden emin olun. Cihazda eşleme yapmak PC uygulamasına bağlanmak için yeterli değil. Servis > 0.Diğer > 3.Harici Uygulamalar > 4.Uygulama Bilgileri ekranından ip:port ve etkin/kapalı kontrolü yapın. Gerekiyorsa uygulamayı etkinleştirin ya da tekrar eşleme yapın.
- Bağlantı kontrolü: ExtTest.exe (ExtTest.Net.exe değil) uygulamasının IP alanını 0.0.0.0 olarak bırakarak, port alanına cihaz eşleme sırasında cihaza girilen portu girerek Cihaza Bağlan ile bağlantı kontrolü yapın. Birkaç saniye içerisinde bağlantı kurulmazsa:
  - Cihazın ağa bağlı ve IP aldığını kontrol edin: Yönetici ya da Servis > Ayarlar > Ağ > Bağlantı Bilgileri. Cihaz IP almadıysa ethernet kablosunu söküp yakın, bağlantı arayüzünü GPRS'e ve sonra tekrar Ethernet+GPRS'e çevirin. Hala IP almazsa cihazı tekrar başlatın.
  - ExtTest.exe uygulamasındaki IP alanına cihaz IP'si değil PC IP'si yazılması gerekiyor. IP alanını 0.0.0.0 bırakabilirsiniz, 0.0.0.0 tüm ağ arayüzlerinden bağlantı kabul edilmesini sağlar. Eğer IP alanına PC IP'si girmek isterseniz eşleme sırasında cihza kaydedilen IP'yi girmelisiniz. inposext_initialize() fonksiyonuna da PC IP ve portu parametre olarak geçilmeli. IP adresi olarak 0.0.0.0 da geçilebilir.
- ExtTest.exe ile ExtTest.Net.exe aynı işlevleri sunmaktadır. Sorunlu işlevin her iki uygulamada da mı görüldüğünü yoksa sadece birinde mi görüldüğünü kontrol edin.
- Bulgu bildirirken yukarıdaki adımların hangilerinde ne gözlemlendiğiniz yanında cihazınızın sicil numarasını da bildirin.

### Cihaz Malileştirme¶

Kimi güncellemelerden sonra ya da alınan kimi hatalardan sonra cihazın tekrar malileştirilmesi gerekebilir. Cihazı malileşme öncesine döndürmek için Servis > 0.Diğer > Cihazı Sıfırlama kullanılabilir.

Malileşmemiş cihaz ya da herhangi bir servis müdahalesi gerektiren bir kullanıcı mesajı görüldüğünde Giriş tuşuna basarak kullanıcı giriş ekranına geçilebilir. Malileşmemiş ya da servis müdahalesi gereken bir cihazda sadece Servis kullanıcısı görülür.

Cihazın malileşmesi için yapılması gerekli işlemlerin adlarının sonunda '*' bulunur. SCR ve MSR testleri çipli kredi kartı kullanılarak yapılabilir. Testler sırasında kart üzerinde herhangi bir işlem yapılmaz. Tarih/saat güncelleme NTP ile yapılabilir. Zorunda kalınırsa elle tarih ve saat de girilebilir. Programlama altında malileşme için yapılması zorunlu olan işlemler:

- En az bir kısım girme
- Fiş başlığında en az 1. ünvan ve adres satırları ile vergi dairesi ve no girme

Tüm işlemler yapıldığında Servis ana menüsünde Cihazı malileştir seçeneği görülecektir.

### Faturalı Satış¶

GİB'in 2 Aralık 2015 tarihinde yayımladığı Yeni Nesil Ödeme Kaydedici Cihazlardan Bilgi Fişi Teknik Kılavuzu belgesi ile YNÖKC'ler ayrıntılı bilgi fişleri düzenlemek zorunda olmuşlardır. Faturalı satış bilgi fişleri satış fişlerinde yer alan kısım bilgilerini (KDV oranı ve tutar), ödeme tipini, toplam tutar ve KDV'yi içerir duruma gelmiştir. Bunun yanında VKN/TCKN alanı ve e-fatura ya da e-arşiv fatura bilgi fişlerinin istenirse irsaliye olarak da düzenlenebilmesi öngörülmüştür.

Bilgi fişlerinin, satış kalemleri ve ödeme bilgileri balkımından satış fişleri kadar ayrıntılı olması nedeniyle faturalı satış işleminde normal satış işleminde kullanılan ekranlar ve özellikler devreye alınmıştır. inposext ile faturalı satış başlatıldığında (inposext_start_sale_with_invoice()) yazarkasa yazılımı InposEcrSale durumuna geçecek ve kalem ve ödeme ekleme boyunca bu durumda olacaktır. Bu aşamadan satış ile ilgili fonksiyonlar kullanılacaktır. Toplam tutar ödendiğinde InposEcrSaleWithInvoice durumuna geçilecek ve bilgi fişinde yer alan ek bilgiler beklenecektir. Bu noktada inposext_end_sale_with_invoice() ile ek bilgiler sağlanmalı ve faturalı satış sonlandırılmalıdır.

Faturalı satış akışı şu şekilde olacaktır:

- inposext_start_sale_with_invoice(): Yazarkasa durumu InposEcrSale olacak.
- inposext_add_sale_item(), inposext_add_payment() ya da inposext_end_sale() gibi satış fonksiyonlarıyla satış kalemleri ve ödeme bilgisi girilir. Bu aşamada inposext_sale_state() kullanılabilir.
- Ödenmiş tutar (cashPaymentAmount + creditCardPaymentAmount) ödenmesi gereken tutara (amountToPay) ulaştığında yazarkasa kendiliğinden InposEcrSaleWithInvoice durumuna geçer. Bu durumda inposext_sale_state() kullanılamaz.
- inposext_ecr_state() ile yazarkasanın InposEcrSaleWithInvoice durumuna geçtiği kontrol edildikten sonra inposext_end_sale_with_invoice() ile bilgi fişinde yer alacak ek bilgiler yazarkasaya gönderilir ve faturalı satış sonlandırılır.

Gene GİB'in yayımladığı bir duyuruya göre vergi mükellefi olmayan müşteriler TCKN'lerini işyeri ile paylaşmak zorunda değiller. Bu durumda TCKN alanına 11111111111 girilmeli.

E-fatura ve e-arşiv fatura bilgi fişleri irsaliye olarak düzenlenebilir. Normal faturalı satış bilgi fişi irsaliye olarak düzenlenemez.

### Yazıcı Kullanımı¶

inposext_printer.h header dosyasında yazıcıdan basılmak üzere belge hazırlama ve belgeyi basma için fonksiyonlar bulunmaktadır.

Yazıcıdan belge basma işleminin temel adımları şunlardır:

- inposext_printer_set_encoding() ile bir metin kodlama yöntemi seçilir. Bu fonksiyon basılacak her bir belge için bir kere ve ilk olarak çağrılmalıdır.
- inposext_printer_add_text() ve inposext_printer_add_justified_text() ile belgeye metin parçaları eklenir. Eklenen metin parçaları inposext_printer_set_encoding() fonksiyonu ile belirtilen kodlama yöntemi ile kodlanmış olmalıdır.
- inposext_printer_add_line_feed() ile belgeye boş satır eklenebilir.
  - Belge basıldığında belgenin son satırlarının kağıdı yırtma çizgisinin üstünde kalması için belgenin sonuna en az 4 boş satır eklenmelidir.
- Belge inposext_print_slip() ile basılır.

Belge yazdırma zamanı ile ilgili olarak şu noktalara dikkat edilmelidir:

- Yazarkasa şu durumlardan birinde olduğunda belge yazdırılabilir:
  1. InposEcrIdle
  2. InposEcrSale
  3. InposEcrSaleWithInvoice
  4. InposEcrMainMenu
- Belge, eğer printAfterSale parametresinin değeri 0 ise inposext_print_slip() çağrıldığında yazdırılır. printAfterSale parametresi satış ya da faturalı satış sırasında dikkate alınır. Satış ya da faturalı satış yokken bu parametre dikkate alınmaz ve belge hemen yazdırılır.
- Belge yazdırılmadan önce kağıt durumunun kontrol edilmesi önerilir.
- Belge içeriği satış fişine eklenmez, EKÜ'ye kaydedilmez. Yarım kalmış satış için yedeklenen verilerle birlikte kaydedilmez.

Metin eklerken şu noktalara dikkat edilmelidir:

- Uzun metin parçaları için satır yönetimi otomatik olarak yapılmaktadır. Eklenen bir metin tek bir satıra sığmayacaksa metin otomatik olarak alt satırdan devam eder.
- Arka arkaya eklenecek 2 metin parçasının hizalaması farklı olacaksa ilk metin parçası yeni satır karakteri ('\n') ile sonlanmalıdır.
- Aynı satırda farklı kalınlıkta ve büyüklükte metin parçaları kullanılabilir.
- inposext_printer_add_justified_text() fonksiyonu tek bir satıra iki yana yaslı metin eklemek için kullanılabilir. Ancak metnin kalın olup olmamasına bağlı olarak bir satıra sığan karakter sayısı farklılık gösterebilmektedir. Bu nedenle zorunlu olmadıkça bu fonksiyonun kullanılması önerilmez.
- Küçük karakter büyüklüğü seçildiğinde bir satıra 42, seçilmediğinde 32 karakter sığar. Ancak metin kalın olduğunda bir satıra sığan karakter sayısı belirtilen sayılardan 1 karakter az olabilir. Bu nedenle yazdırılacak metin parçalarının satır değil paragraf düzeyinde kurgulanması önerilir.

### Satış Durumları¶

inposext_types.h dosyasında bulunan InposEcrSaleState enum'u yazarkasa uygulaması satış (InposEcrSale) durumundayken satış iş akışının bulunabileceği 16 farklı durumu içermektedir. Bu durumların birkaçı dışındakiler farklı hata durumlarına karşılık geliyor. Hata durumları da şu anda kullanıcı müdahalesi gerektiriyor. Bu bölümde InposEcrSaleState enum'undaki değerler incelenecek ve PC uygulamalarının satış sırasında inposext_sale_state() fonksiyonunu kullanarak farklı hata durumlarını belirlemeleri ve kullanıcıları uygun müdaheleye yönlendirmeleri konusu tartışılacak.

inposext_types.h dosyasında yer alan InposEcrState ve InposEcrSaleState enum'larının farkına bu noktada tekrar değinmekte yarar var: InposEcrSaleState enum'u eğer InposEcrState enum'unun InposEcrSale değeri için anlamlı. Yani InposEcrSaleState enum'u InposEcrSale durumunun alt durumlarını listeliyor denebilir. Bu bölümde ve belgenin geri kalanında "yazarkasa durumu" ifadesi inposext_ecr_state() fonksiyonunun döndürdüğü InposEcrState değeri için kullanılacak. InposEcrSaleState değerleri için "satış durumu" ifadesi kullanılacak.

InposSaleIdle | Yazarkasa satış durumunda değilken yazarkasa yazılımının satış akışını gerçekleştiren kısmı bu durumda bulunur. inposext_sale_satate() fonksiyonu eğer yazarkasa satış durumunda değilse InposInvalidEcrStateError hatası döndüğünden PC uygulamaları bu satış durumunu göremezler.
InposSaleWaitingForInput | Satış başladığında bu satış durumuna geçilir. Bu durumda iken inposext'in satış ile ilgili API'leri kullanılabilir. Ancak satış işleminin bulunduğu aşamaya göre her API her zaman kullanılamayabilir. Örneğin ara toplam üzerinden indirim/artırım yapılmışken kalem eklenemez/silinemez. Ya da parçalılş satış yapılıyorken ara toplam üzerinden indirim/artırım yapılamaz.
InposSaleWaitingCancelLastItemResponse ve InposSaleWaitingCancelSaleResponse | Bu durumlar inposext API'ler kullanarak satış yapıldığında PC uygulamaları tarafından görülmez. Ancak satış sırasında kasiyerin cihaz üzerinden satışa müdahale etme izni olursa (ki şu anda herhangi bir kısıtlama yok) satış bu durumu bu iki değerden birini alabilir ve PC uygulaması inposext_sale_state() ile bu değerleri görebilir. Bu durumda kullanıcı cihaz üzerinden satışa müdahelesini tamamlamaya yönlendirilmelidir. inposext üzerinden yapılacak satış iptali ya da kalem silme işlemleri için kullancı onayı almak gerekli görülürse bu onaylar PC uygulamaları tarafından alınmalı ve sonra ilgili fonksiyonlar çağrılmalıdır.
InposSaleWaitingForSection | Bu durum inposext API'ler kullanarak satış yapıldığında PC uygulamaları tarafından görülmez. Ancak satış sırasında kasiyerin cihaz üzerinden satışa müdahale etme izni olursa, satış sırasında Menü tuşuna basıldığında kullanıcının kısım seçmesi için mevcut kısımlar görülüyorken inposext_sale_state() bu satış durumunu dönebilir. Bu durumda PC uygulaması kasiyeri bir kısım seçmesi ya da tekrer Menü tuşuna basarak kısım seçmeden satışa devam etmesi yönünde yönlendirmeli.
InposSaleWaitingForCustomerId | Bu durum inposext API'ler kullanarak satış yapıldığında PC uygulamaları tarafından görülmez. Ancak satış sırasında kasiyerin cihaz üzerinden satışa müdahale etme izni olursa ve cihazda muayene katkı payı işlevi açıksa, kasiyer cihaz üzerinden katkı payı girerken bu satış durumu görülebilir.
InposSaleWaitingForTransactionCompleted | Kredi kartıyla tahsilat yapılıyorken işlemin sonucu bu durumda beklenir. Eğer parçalış satış yapılıyorsa ve tahsilat sonunda hala ödenmesi gereken tutar varsa InposSaleWaitingForInput durumuna geçilir. Eğer tahsilat ile tüm/kalan tutar ödenmiş olursa satış sonlandırılır.
InposSaleLimitReachedWithLastItem ve InposSaleLimitReachedWithAddedAmount | Bu durumlara Yönetici > Programlama > Satış Limiti ile belirlenen satış limiti eşiği aşıldığında geçilir. Satış limiti faturalı satışın zorunlu olduğu tutarlara geçilmesi engellemek için kullanılan bir işlevdir. PC uygulamasının kullanılacağı işyerleri satış limit ve faturalı satış konusunda eğitilmelidir.
InposSaleUndefinedPluItem | Bu durum PC uygulamalrı tarafından görülemez.
InposSaleInvalidSectionOfPluItem ve InposSaleInvalidVatRateOfPluItem | inposext_add_sale_item() ile eklenen kalemin kısmı ya da kısmın KDV oranı geçersiz olduğunda bu durumlardan birine geçilir. Aşağıdaki InposSaleUndefinedSection açıklamaları dikkate alınmalı.
InposSaleUndefinedSection | Ancak kasiyer elle satış yaparken bu durum görülebilir. inposext_section_data() ile cihazdaki geçerli kısımlar alınabilmektedir. PC uygulaması geçerli kısım göndermek için her açıldığında cihazdaki kısımları daha önce aldığı kısımlarla karşılaştırmalıdır. Cihazda kayıtlı olan kısımların PC uygulaması ile entegrasyon yapıldıktan sonra cihaz üzerinden değiştirilmemesi ya da PC uygulamasıyle eşdügüm sağlanarak değiştirilmesi, PC uygulaması geliştiricilerinin işyerleri ile beraber ele alması gereken bir konu. Diğer yandan, GİB Bilgi Sistemleri'nin devreye alınması sonrasında GİB Yeni Nesil ÖKC'lere KDV oranları gönderebili duruma gelecektir. Her bir kısım, kısım adı yanında bir KDV oranı da içerdiğinden GİB tarafından yapılacak bir KDV güncellemesi kısımların tutarsız bir duruma gelmesine yol açabilir. Yazarkasa uygulaması KDV oranları değiştiğinde kullanıcıları kısımları gözden geçirme konusunda uyarmaktadır.
InposSaleUndefinedVatRate | Ancak kasiyer elle satış yaparken bu durum görülebilir.
InposSaleInvalidAmount | Örneğin ara toplama yapılan indirim tutarı ara toplamdan büyükse, yani toplam tutar 0 TL'nin altına inecekse bu duruma geçilir. Bu duruma ayrıca kullanıcının cihazdan elle girdiği tutar geçersiz olduğunda da geçilir.
InposSaleDataFinalized | Satış bu durumdayken yazarkasa yazılımı satışı sonlandırmaya başlamış demektir.

### Bağlantı Kontrolü¶

Cihaz ile olan bağlantının etkin olduğunu kontrol edip gerektiğinde tekrar cihaza bağlanmak PC uygulamalarının sorumluluğundadır. Bu nedenle düzenli olarak bağlantı kontrolü yapmak inPOS - PC entegrasyonunun en az sorunla yönetilmesi için üzerine önemle eğinilmesi gereken bir konudur.

inposext_ecr_sale_state() ve inposext_ecr_state() fonksiyonu cihaz tarafında diğer fonksiyonlardan farklı şekilde işlenmektedir. Bu sayede, yazarkasa yazılımı örneğin satış sonlandırma ya da Z raporu basımı gibi inposext fonksiyonlarına yanıt veremediği bir işlem yapıyor olsa da inposext_ecr_sale_state() ya da inposext_ecr_state() sorgularına yanıt verilebilmektedir.

PC uygulamaları bu davranışı 2 şekilde kullanabilir:

1. Yazarkasa durumunu her zaman doğru şekilde alabilmek ve buna göre doğru davranışı sergileyebilmek.
2. Yazarkasa ile olan TCP bağlantısını etkin tutmak ve bağlantının ayakta olduğunu doğrulamak.

İlk kullanım şekli temel bir zorunluluk olmakla birlikte, ikincisi 0.5.0 sonrasında eklenen yeni bir olanak. inposext_ecr_state() ya da inposext_ecr_sale_state() fonksiyonunu bağlantı kontrol amacıyla şu şekilde kullanmak değerlendirilmeli:

- Düzenli olarak, örneğin dakikada bir, inposext_ecr_sale_state() çağrılarak cihaz ile olan bağlantının etkin olduğu kontrol edilmeli.
- Bağlantı kontrolü amacıyla kullanıldığında inposext_ecr_sale_state()'e küçük bir zaman aşımı değeri geçilmeli. 700ms ile 1s arasında bir zaman aşımı değeri kullanılabilir.
- Eğer zaman aşımı hatası ya da bağlantı hatası alınırsa sırasıyla inposext_close() ve inposext_initialize() çağrılarak cihazla tekrar bağlantı kurulmalı.

Bağlantı kontrolünü bir işlem yapılacağında yapmak yerine düzenli olarak yapmak daha sorunsuz bir işleyiş sağlayacaktır. inposext_initialize() ilk çağrıldığında görece uzun sürse de sonraki çağrılarda hızlı sonlanmaktadır. Bu nedenle inposext_initialize() kullanımından çekinilmemelidir.