

		Bu text dökümani tamamen okuyup okuduklarinizi mutlaka demo programda uygulamanizi tavsiye ederiz. Kafanizdaki bir çok soruya bu 
	sekilde hizlica cevap bulabileceksiniz.


- ExtTest.Net projesi InposExt.Net.dll (32 bit dll) kullandigi için her zaman x86 olarak derlenmelidir. Any CPU veya x64 64-bit islemcilerde çalismayacaktir. 
Hata olarak "An unhandled exception of type 'System.BadImageFormatException' occurred in Microsoft.VisualStudio.HostingProcess.Utilities.dll" bezeri bir dönüs alir.
Farkli bir projede de InposExt.Net.dll kullanilirsa konfigurasyon olarak x86 platformu seçilmelidir. 

- ExtTest.Net ayrica windows ortamda derlenmis oldugu ve 32 bit dll kullandigi için bazi windows runtimelarina ihtiyaç duyabilir. Alacaginiz "inposext.dll bulunamadi"
hatalarinda runtimelari kontrol etmenizi tavsiye ederiz. Mutlaka bulunmasi gereken runtime'lar;

	1. Microsoft Visual C++ Redist 2010 x86
	2. Microsoft Visual C++ Redist 2012 x86
	3. Microsoft Visual C++ Redist 2013 x86
	4. Microsoft Visual C++ Redist 2015-2022 x86

runtime'laridir. Bunlar yüklendikten sonra sorun çözülecektir.

- ExtTest.Net InposExt.Net dll'ini kullanir. Referans olarak bulamazsa projenizde doğru yerden aldigini göstermeniz gerekmektedir. Hata olarak "inposext.dll ya da
inposext.Net.dll bulunamadi." benzeri bir dönüs alir.

- InposExt.Net.dll'nin kullandigi dll'leri doğru dizine (örnek olarak ayni dizine) kopyalanmalidir.

- InposExt.Net.dll ve inposext.dll bagimli oldugu libeay32.dll, qtCore4.dll qtNetwork.dll 'leri mutlaka ayni dizinde olmalidir.


- Cihazin ve entegre olacagi uygulamanin çalistigi ortamda gmp3.exe adini verdigimiz bir uygulama ile eslenmesi gerekmektedir. Her seyden önce mutlaka bu yapilmalidir.
Bu uygulama ile cihaz - Pc arasinda TCP protokolü ile kullanilacak ip ve port üzerinden bir network olusturulur. Cihazda da bu ayarlar kaydedilmis olur. Bu network aktif
kaldigi sürecek gmp3.exe uygulamasini bir daha kullanmaya gerek yoktur. One-time bir uygulamadir.

-Esleme yapildiktan sonra demo uygulama üzerinde sol üstte "Kasiyer Adi" altinda olan kutucuga cihaz sicili girilir. Yanina esleme yapilmis ip girilir. Onun yaninda da
port no bilgisi girilerek, "Baglan" butonu ile cihaza baglanti saglanmis olur.

- m530 cihazi durum sorgu sonuçlarina göre islem yapilabilirlige sahip bir cihazdir. Cihaza gönderilecek komuttan önce mutlaka cihazin durumu sorgulanmali, dönen sorgu 
sonucuna göre islem yaptirilmalidir. Kullanilmasi gereken sorgularin metod isimleri ise "ecrState" ve "saleState" olarak ikiye ayrilir. Ayrica bu durumlar,
"inposEcrState" ve "inposEcrSaleState" olarak enumlandirilmistir. Bu enumlari asagida detaylandirdik. Incelemenizi tavsiye ederiz. 

	a. ecrState  => m530 cihazinin genel ekranlarinin konumu döndürür. "inposEcrSaleState", "inposEcrMainMenu" seklinde dönüs yapar. 

	b. saleState => m530 cihazinin satis konumunda oldugu durumda, satisin da kendi durumlari mevcuttur. Sorgu, bu durumlari döndürür. "inposSaleWaitingForInput"
seklinde dönüs yapar. Ayrica bu konumda yapilan satis durumu sorgusu, o anki fisno ve zno degerlerini cihazdan alarak, kullanildigi takdirde receiptData() metoduyla
yapilan parçali ödemelerin tutarlarini ve ödeme tiplerini döndürür. Bu metod sayesinde parçali ödemelerin basarili olup olmadigi kontrol edilmis olur.

	Konuyu ufak bir örnekle açiklamak gerekirse;

	1. Cihazin kasiyer girisi yapilan ekranda oldugunu varsayalim ve bir satis yapmak isteyelim. Burada ecrState sorgusu yaptiginizda sonuç olarak inposEcrLogin
konumunda oldugunu dönecektir. Bu sonuca göre kasiyer girisi yapmaniz gerektigini anlayip giris yaparak cihazda kullanici girisi yapilmasi saglanmalidir. 

	2. Kasiyer girisi saglandiktan sonra cihaz durumu sorgusu (ecrState) dönüs olarak "ecrMainMenu" dönecektir. Burasi cihazin ana menüsüdür. Satis baslatma islemleri
rapor islemleri, ekü kopya islemleri bu menüde yapilir. Bu menüde satis sorgusu (saleState) yapilirsa, hata dönecektir çünkü satis baslamadi. Satis gerçeklestirmek için
startSale metodu çalistirilir ve cihaz satisa geçer.

	3. Satis ekraninda cihaz durumu sorgusu (ecrState) dönüs olarak "ecrSale" olarak dönecektir. Cihazin satis ekrani burasidir. Kalem ekleme, ödeme ekleme, o anki
aktif olan satis için fis sorgusu yapilabilir. Burada örnegin ecrLogin metodu yani kasiyer giris metodu çalistirilirsa, zaten hali hazirda kasiyer girisi yapilmis oldugu için
hata dönecektir(inposInvalidOperationError)

	4. Kalemler eklenir. Eklenecek olan kalemlerin kaynak kodda designer formunda da göreceginiz üzere birden fazla degiskeni vardir(item.name, item.section vb.) Bu degerler
dogru sekilde doldurulup kalem eklemesi yapilir. Bu adimda yapilacak sorgular cihaz zaten hala satista oldugu için ecrSale ve inposSaleWaitingForInput olarak dönecektir

	5. Ödeme ekleme ya da satis sonlandirma yapilir. Eger parçali bir satis söz konusu degilse endSale() metodu ödeme tipi set edildikten sonra gönderilebilir. Yapilan 
satis parçali ise burada addPayment() metodu kullanilmali. Bu metod tahsil edilecek tutar bilgisi ve ödeme tipini alir cihaza gönderir. Ödeme gerçeklestikten sonra 
kalan tutarlarda ayni sekilde kesilebilir.

	6. Satisin sonlanmasi durumunda cihaz konumu (ecrState) ecrMainMenu olarak dönecektir. Satis eger basarili bir sekilde tamamlanirsa bu konuma döndügünü görmeniz
kritiktir. Satisin sonlandigini bu sekilde anlamak mümkündür. Satisin gerçeklesmemesi durumunda cihaz konumu(ecrState) ecrMainMenu'ye dönmeyip satista(ecrSale) durumunda
kalacaktir ve satis durumu sorgusu(ecrSaleState) inposWaitingForInput ya da inposSaleIdle olarak görünecektir.

	ÖNEMLI NOT:
		Kredi karti satislarinda ödeme eklenirken ya da satis sonlandirirken, satis her seye ek olarak bir konuma daha geçis yapar. Burasi kartin okutuldugu konumdur.
	ecrState = ecrSale ve ecrSaleState = inposWaitingForTransactionCompleted olarak dönüs yapacaktir. "inposWaitingForTransactionCompleted" satis konumu cihazin kartli islem 
	baslattigini gösterir. Burada müsteri karti okutmalidir ve internet hizina bagli olarak bankanin ödemeyi tahsil etmesi beklenir. Kartli islem sonunda islemin tamamlandigi bilgisi
	yine eger tüm ödeme alindiysa ecrState ile, eger parçali ödemenin bir parçasi yapildiysa receiptData() metoduyla ögrenilebilir.

	ÖNEMLI NOT 2:
		Yazarkasa ile uygulamanin birbiriyle haberlesmesinde aksakliklar olmamasi için ve kullanicinin mümkün oldugunca sadece uygulamayi kullanmasi için
	cihazin tuslarinin kilitlenmesini kesinlikle tavsiye ederiz "blockEcrKeys()". Aksi takdirde disaridan müdahaleler saglikli bir entegrasyonun önüne geçebilir.

- Yazarkasa durumlari, satis durumlari ve hata(inposExtError) sonuçlarindan dönen enumlarin açiklamalarini asagida bulabilirsiniz.

	1. Yazarkasa durumlari (inposEcrState)
		a. InposEcrInitialization 			= 0	=> Yazarkasanin entegrasyona baglanti kurmadigi durumdur. initialize() metodu çalistirilmalidir.
		b. InposEcrIdle					= 1	=> Yazarkasanin bosta oldugu durumdur.
		c. InposEcrNotUsable 				= 2	=> Yazarkasanin mali islem yapamayacagi menülerde oldugu durumlardir. Servis ekrani buna örnektir.
		d. InposEcrError 				= 3	=> Yazarkasada bir hata oldugu durumdur. Yazici hatasi buna örnek olabilir.
		e. InposEcrLogin 				= 4	=> Yazarkasanin kasiyer giris ekraninda oldugu durumdur.
		f. InposEcrSale 				= 5	=> Yazarkasanin satis ekraninda oldugu durumdur.
		g. InposEcrSaleWithInvoice 			= 6	=> Yazarkasanin faturali satista oldugu durumdur.
		h. InposEcrMainMenu 				= 7	=> Yazarkasanin ana ekranda oldugu durumdur.
		i. InposEcrReports 				= 8 	=> Yazarkasanin raporlar menüsünde oldugu durumdur.
		j. InposEcrZReportRequired 			= 9	=> Yazarkasanin zorunlu z almasi gerektigi durumdur.
		k. InposEcrPrintingMerchantSlip 		= 10	=> Yazarkasanin isyeri slibi bastigi durumdur.
		l. InposEcrSaleWithCardPaymentCanceled		= 13	=> Kredi kartiyla alinmis parçali ödemenin iptal edilmesi için kart okutulmasini bekleyen durumdur.
	
	2. Satis durumlari (inposEcrSaleState)
		a. InposSaleIdle 				= 0 	=> Satisin bosta oldugu durumdur.
		b. InposSaleWaitingForInput 			= 1	=> Satisin aktif oldugu ve kalem ya da ödeme bilgisi beklenen durumdur.
		g. InposSaleWaitingForTransactionCompleted	= 6	=> Satisin kredi karti için banka uygulamasina gönderildigi durumdur.(Kart okuma)
		h. InposSaleDataFinalized			= 15	=> endSale() metoduna bagli bir durumdur. Satisin bittigini belirtir.

	3. Hata Kodlari (inposExtError)
		a. InposNoError					= 0 	=> Metod çalisirken bir hata olmadigini gösterir.
		b. InposNotInitializedError			= 1 	=> Yazarkasanin entegrasyona init olmadigini gösterir.
		c. InposConnectionError				= 2 	=> Yazarkasanin entegrasyon ile baglantisinin koptugunu gösterir.
		d. InposInvalidArgumentError			= 4 	=> Metodlarda kullanilan parametre degerlerinde bir hata oldugunu gösterir.
		e. InposInvalidEcrStateError			= 6 	=> Kullanilan metodun dogru cihaz konumunda çalistirilmadigini gösterir.
		f. InposInvalidSaleStateError			= 7 	=> Kullanilan metodun dogru satis konumunda çalistirilmadigini gösterir.
		g. InposInvalidOperationError			= 8 	=> Kullanilan metodun dogru cihaz konumu ya da satis konumunda çalistirilmadigini gösterir.
		h. InposNoPrinterPaperError			= 9 	=> Cihaz fis basarken yazicida kagit bittigini belirtir.
		i. InposGmp3PairingError			= 10	=> Yapilan esleme islemi basarili olsa bile eski versiyon dll ya da gmp3.exe kullanildigini gösterir.
		j. InposExternalPrinterError			= 14 	=> Kullanilan harici yazicida bir sorun oldugunu belirtir.
		k. InposReportPrintingError			= 15 	=> Çikartilacak raporun çikartilamadigini belirtir.
		l. InposSaleNotFinishedError			= 101 	=> endSale() metodu için receiptData metodunun fisin basilmasinin daha bitmedigi sirada kullanildigini gösterir.	
	
- Toplam tutara ya da kaleme indirimleri yapilacaksa;
	
	1. Kaleme indirim  -> Eklenecek ürüne indirim orani ya da indirim tutari verilir kalem bu sekilde eklenir. 
	2. Toplama indirim -> Toplama indirim, addSaleItem() kullanilarak ürün birim fiyati 0 ve indirim orani ya da tutari girilerek yapilir.

- Faturali satislar icin akis adim adim su sekildedir:

	1. startSaleWithInvoice()    => Faturali satis baslatma komutu.
	2. addSaleItem()	     => Kalemler eklenir
	3. addPayment() || endSale() => Satis sonlandirilir
		Bu aşamada cihazın ekranına nihai tüketici / mükellef seçeneği gelecektir. Ayrıca cihaz sorgusu "InposEcrSaleWithInvoice" olarak dönecektir. Cihaz üzerinden bir secim yapmadan
		sonraki adima geçin.
	4. endSaleWithInvoice()	     => Faturali satis parametreleri ile sonlandirilir.

- Avans ve Cari Hesap için akis su sekildedir:

	1. startSale()		     => Satis baslanir.
	2. addSaleItem()	     => Avans ya da cari hesap kesilecek tutar kadar kalem eklemek zorunludur ama fise yansimayacaktir.
	3. Satış tipi Cari Hesap olarak değiştirilir.
	4. addPayment()		     => Yapilmak istenen avans ya da cari hesap tutari eklenir.
	5. endSaleWithInvoice()	     => Iki tahsilat türü de bilgi fisi oldugu için satis fatura keserek sonlandirilir.

- Verilmis olan inposext.dll uygulama çalistirildiginda ayni dizine txt olarak iki adet log dosyasi olusturacaktir. Karsilastiginiz hatalarda bu loglari incelemenizi
anlasilmayan noktalarda da bizlerden bilgi almanizi; bunun yaninda olusan loglar biraz büyük dosyalara dönüsebilecegi için ara ara dosyalari silmenizi tavsiye ederiz.

- Debug klasörü içinde bulunan dll'lerde yenilik olarak yemek karti ödemesi alabilecek metotlar eklenmistir. Demo proje içinde ödeme tipi combobox'tan yemek karti olarak
seçilip, altindaki combobox'tan ise yemek karti tipi seçilmelidir. Eklenen ödemeler sadece bilgi amaçli oldugu için receiptData() metodunda bulunan amountToPay degiskenine 
yemek karti ödeme tutari eklenmeyecek olup, totalAmount degiskenine eklenecektir.
Yapilan yemek karti ödemeleri eger parçali degilse(Örnek: nakit - yemek karti veya kredi karti - yemek karti) basilan fis bilgi fisi olarak çikacaktir. Eger parçali ödeme
var ise fis bilgi fisi olarak çikmayip sadece nakit ve kredi karti tutarlari kdv'ye ve toplama yansiyacaktir. Yemek karti ile alinan ödemenin alindi bilgisi basilacaktir.

- Fis üzerine bilgi yazmak için kullanilabilecek bir alan mevcuttur. cashierName her satis öncesi set edilir. Bu alanin bir karakter sinirlamasi bulunmamaktadir ancak bu kisim
üzerinde düzenleme yapilirken alt satira geçmesi için bir çözüm üretmeniz gerekecektir. Yazarkasanin kendi slibi tek satira maksimum 48 karakter alabilir. 49. karakter otomatik
olarak alt satira kendisi geçecektir.

- Cihaza harici yazici baglamak mümkündür. Bu islem 3 farkli sekilde yapilabilir. Cihazda servis menüsü içinde sirayla "Diger - Harici Yazici" bölümüne gidilip burada baglanacak
yazici tipi seçilir. Ekranda gördügünüz 2-3 model ile direkt entegremiz bulunmaktadir. Bu cihazlar haricinde yazici baglamak için ise ESC/POS seçenegi ile devam edilebilir.
ESC/POS standartlarina uyan yazicilar bu seçenek ile cihaza baglanabilir. 

	ÖNEMLI NOT: 
		Hali hazirda entegrasyonumuz bulunan firmalardan aldigimiz bilgilere nazaran, birçok ESC/POS standartlarina uydugunu belirten ama aslinda uymayan yazici modeliyle
	karsilastik. Yaptigimiz testlerde kimi yazicilarin türkçe karakterleri algilama ya da algilasa bile dogru standart üzerinden geri mesaj atamama sorunu, mali mühür simgesi(MF)
	tanimama, seri port, network, usb seçeneklerinden bazilarini karsilamama gibi sorunlari oldugunu tespit ettik. Entegrasyon sayisi arttikça da harici yazicilarda olusan 
	baglanti kopmalari, karakter basamamalari vs. gibi sorunlar için düzenleme islemleri sirf yazici standartlara düzgün uymadigi bunun yaninda çok uzun ve ciddi bir çalisma gerektirdigi
	için artik çalismayan yazicilar için destek vermeyi kestik. Daha iyi çözümler sunabilmek için ise alternatifler yaratmaya bir yandan da çalismaktayiz. Anlayisiniz için tesekkür ederiz.

- Yazici usb,ag,seri port olmak üzere 3 farkli sekilde baglanabilir.

- Entegrasyonu tamamladiginizda mutlaka test etmenizi tavsiye ederiz. Sahada olusabilecek durumlar için birkaç test senaryosunu asagida bulabilirsiniz.Bu senaryolar haricinde kullanilacak
yerde olusabilecegini düsündügünüz sorunlar için kendi test yöntemlerinizi de düsünüp denemeniz oldukça önemlidir.

	1. Baglanti hatalari: Satis esnasinda ya da öncesinde hatta sonrasinda etherneti söküp hata almaya çalisin. Tekrar baglanmaya çalistiginizda neler oldugunu tespit edin ve buna
göre entegrasyonunuzda gerekiyorsa düzenlemelere gidin.

	2. Satis iptalleri: m530 cihazinin önemli özelliklerinden biri, parçali ödemede alinmis bir parça ödeme varken satis iptali yapilabilmesidir. Parçali tahsilat yapilmisken özellikle
kredi karti tahsilati yapilmisken islem iptal edilebilir. Bu durumda cihaz, satisin iptal oldugunu bu sebep ile yapilmis olan ödemenin iptalinin yapilmasini isteyecektir. Bu senaryo mutlaka
test edilmelidir. EcrState ve EcrSaleState metodlari kullanilarak cihazin durumlarini da kontrol etmeyi unutmayin.

	3. Üst üste metod çalistirmayi deneyin. Alinabilecek hatalara göre düzenlemelerinizi yapin.
	4. Testlerinizi hem demo uygulamada hem kendi uygulamanizda deneyin.




Versiyon 0.19.1

addPayment_Click() metodu:
1. 	artık ödeme gönderilince, gönderilen ödeme başarılıysa "ödeme alındı" ve "isPaymentOk = true" dönüşleri yapıyor.
	gönderilen ödeme başarısız ise "ödeme alınmadı" ve "isPaymentOk = false" dönüşü yapıyor.
2.	Toplam tahsilat tutarı addPayment ile tamamlanırsa otomatik fiş kesip satışı bitiren bir yapısı zaten bulunuyordu. Artık satış biterse
	"Satış tamamlandı." ve "isSaleEnd = true" dönüşleri yapıyor.
3.	Demo uygulama içinde isSaleEnd ve isPaymentOk return edilen birer değişken değil. Kendi kullanmak istediğiniz şekle göre manipüle edebilirsiniz.
4.	Metodun içinde yazarkasa ve satış durum sorguları internalCheckEcrStatus() ve internalCheckSaleStatus() metodlarıyla kontrol edilmektedir. Bu metodlar içinde
	eğer sorgu sırasında bağlantı kopması durumu yaşanmışsa reconnect() isimli metod çağrılıp tekrar bağlantı kurulması beklenir. Bu metodlar bir while döngüsü içinde
	bağlantı tekrar gelene kadar ve statik bir hata sayısı durumu sağlanana kadar deneme yapılır. Bağlantı hatası değişkeninin dönüş sayısının fazlalığına göre
	bağlantı gelmemesi durumunda uzun süreler bekleme yaşayabilirsiniz. Kendinize göre bunu düşürüp en ideali bulmak denenebilir.
5.	Faturalı satış başlatıldıktan sonra ya da avans ve cari hesap kesimleri yapılırken fatura parametreleri dolu bir şekilde addPayment_Click() çalıştırılırsa
	cihaz otomatik olarak bekleme yapmadan faturayı sonlandırır. 
6.	Yemek kartı ödemelerinde, ödeme tipi yemek kartı seçildikten sonra alttaki combobox ile yemek kartı acquirer(yemek kartı tipi) seçerek ödeme alınmalıdır.
7.	Bu versiyonla beraber havale/eft ödeme tipi eklenmiştir.
8.	Bu dll versiyonuyla beraber sahadaki cihazların da güncellemesi yapıldı. Sahadaki cihazlar eğer güncellenmediyse bu dll çalışırken sorunlarla karşılaşabilirsiniz.
9.	.net.dll içinde ödeme kontrolleriyle ilgili ufak eklemeler yapıldı. 
10. Login_Click() metodu içinde, kasiyer girişi yapıldıktan sonra cihazın z raporu alması gerektiği bilgisi gelirse otomatik z raporu alma işlemi yapması sağlanmıştır.



Önemli Not:
	1. Lütfen testlerinizi dikkatli yapın. Gönderdiğiniz her komuttan sonra cihaz ekranına mutlaka bakın. Değişimleri takip edin.
	2. Mutlaka cihazın tuş takımını kilitleyin.
	
	


