Kendi geliştirdiğim Delphi 2009 ve sonrası sürümler ile çalışan IngenicoGmp.dll dosyasını (en son versiyon P12.19) direk kullanan kodları bir bileşen haline çevirdim. Bileşen sadece editör üzerinden kod yazarak kullanılabiliyor ("Tool Palette" içine fare kullanımı için eklenmiyor).
Bileşen kodu içinde kullanılan birden fazla özellik maalesef Delphi 7 ile kullanılmasını engellemektedir. Bu sebeple sadece Delphi 2009 ve sonrası sürümlerde kullanılabilir durumda.
Ücreti karşılığında bileşeni hedef Delphi sürümü DCU dosyaları olarak (iki adet dcu dosyasından oluşmaktadır) ve örnek kullanım projesi kaynak kodu ile birlikte temin edebilirim. Bileşen 1 yıllık destek ile satılıyor olacak. Alım tarihiden itibaren bir yıllık süre boyunca çıkacak ana sürüm güncellemeleri ücretsiz temin edilecektir.
İlgilenenler özel mesaj göndererek bağlantıya geçebilir.
Bileşen özellikleri:
- Eşleşme (Pairing)
- Kdv bilgilerini okuma (TLV data)
- Başlangıç testi (ilk eşleşme sonrası cihazda yarım kalmış fiş var mı kontrolü)
- Echo (cihaz bağlantısında sorun var mı kontrolü)
- Z Raporu alma (ÖKC cihazı üzerindeki kullanıcı şifresi standart kabul edilmiştir. İhtiyaca göre güncellenebilir)
- X Raporu alma (ÖKC cihazı üzerindeki kullanıcı şifresi standart kabul edilmiştir. İhtiyaca göre güncellenebilir)
- Çekmece açma özelliği
- Nakit ödeme fiş kesme
- Kredi kartı ödemeli fiş kesme
- Nakit+Kredi kartı ödemeli fiş kesme
- Fiş keserken fiş satırlarını "Batch Mode" olarak yazdırma (Batch Mode yazdırma tekil komut yazdırmadan daha hızlıdır. Ancak çok satırlı fişlerde ÖKC cihaz hafıza limiti sebebi ile sorun çıkarabilmektedir)
- KDV eşleştirmesini Kısım (Departman) adına göre yapma
- KDV eşleştirmesini Orana göre yapma
- Fiş satırı bazında tanımlanabilenler
* Barkod (opsiyonel)
* Ürün adı
* Birim
* Miktar
* Tutar (kdv dahil)
* Kdv Oranı
* Kdv Kısım (Departman) Adı
* İndirim yazısı (opsiyonel)
Fiş Geneli için tanımlanabilenler
* Barkod ön eki, Barkod son eki
* Fiş nakit tutarı
* Fiş kredi tutarı
* Fiş indirim tutarı (fiş genel toplamı üzerinden)
* Fiş indirim yazısı (Gmp DLL özelliği sebebi ile sadece tekil mod ile çalışmaktadır)
* Dip not 1 (siyah zemin üzeri beyaz yazı)
* Dip not 1 ön eki
* Dip not 2 (beyaz zemin üzeri siyah yazı - normal yazı)
* Dip not 2 son eki
Genel özellikleri:
* Log dosya adı isteğe göre tanımlanabilir.
* Log işlemi açık/kapalı hale getirilebilir.
* Kullanılan DLL versiyonu öğrenilebilir.
* Fiş başarılı şekilde yazdırıldıktan sonra; EKU (mali hafıza), Z Numarası, Fiş Numarası, Rasmi Fiş tarih ve saati, ÖKC Fiş UniqueID, Fiş toplam kdv tutarı, Kredi kartı ödemelerinde kart banka adı bilgileri bileşen özelliklerinden okunabilir.
* İsteğe göre fiş kesildiği zaman bilgisayar tarih ve saati ÖKC tarih ve saatine ayarlanabilir (uzun süreli çalışmalarda bilgisayar saati ileri/geri kalabilir. Bunun önüne geçmek için)
* Kesilen son fiş ile ilgili yazdırma süresi milisaniye cinsinden öğrenilebilir. (İlerleyen zamanlarda ÖKC cihazı daha yavaş yazmaya başlayabilir. Bu satır sayısı bilgisi ile birlikte database içine kaydedilerek ilerleyen zamanlardaki performans hesaplanabilir)
* ÖKC cihazı seri numarası bileşen üzerinden okunabilir. Bu bilgi database içine kaydedilerek birden fazla ÖKC kullanılan iş yerlerinde fişin hangi ÖKC ile kesildiği rahatlıkla belirlenebilir.
* Otomatik hata kontolü vardır. Fiş kesimi sırasında hata oluşur ise fiş otomatik iptal edilir. Bileşen üzerinden "LastError" parametresi ile hatanın ne olduğu öğrenilebilir.
* Manuel hata kontrolü mümkündür. "OnPrintError()", "OnVatNotFound()" olayları kullanılarak fiş yazdırma sırasında oluşabilecek hatalar ile ilgili ekrana özel mesajlar göstermek mümkündür.
Bileşen kullanımına örnek kod aşağıdaki gibidir:
Form içinde tanımı:
Kod: Tümünü seç
uses
uIngenicoGmp;
type
TForm1 = class(TForm)
//...
private
{ Private declarations }
Pos: TIngenicoGmp;
procedure NotFinishedOperation(Sender: TObject; var CancelOldOperation: Boolean);
procedure PrintError(Sender: TObject; var Continue: Boolean);
procedure VatNotFound(Sender: TObject; const ItemIndex: SmallInt; const Barcode, VatOnDeviceName: string; const VatAmount: Double);
Kod: Tümünü seç
procedure TForm1.FormCreate(Sender: TObject);
var
I: Integer;
begin
Pos := nil;
Pos := TIngenicoGmp.Create();
Pos.LogFile := FormatDateTime('yyyy-mm-dd', Now()) + '.log';
Pos.Logging := True;
Pos.InterfaceToUse := 1; // XML bağlantı ayar dosyası içindeki ilk tanımı kullan
Pos.ReadInterfaces(); // XML dosyasındaki interface bilgilerini bileşen hafızasına yükle
Pos.BatchMode := True;
Pos.OnNotFinishedOperation := NotFinishedOperation; // Yarım kalmış fiş var ise tetiklenecek olay (olay içinde ne yapılacağına karar verilecek)
Pos.OnPrintError := PrintError; // Fiş yazdırılır iken hata oluşur ise tetiklenecek olay (KDV uyuşmadı, kağıt bitti, vs)
Pos.OnVatNotFound := VatNotFound; // ÖKC içinde tanımlı KDV bilgileri ile PrintReceipt() fonksiyonuna parametre olarak gönderilen yazdırılacak fiş satırları içindeki KDV bilgileri eşleştirilemez ise
// tek bir satırın KDV bilgisi dahi eşleştirilemese bu olay çalıştırılacak *ve* fiş iptal edilecektir
Log('DLL version: ' + Pos.DllFileVersion);
for I := 0 to Pred(Pos.Interfaces.Count) do
begin
Log('Interface[' + I.ToString() + ']: ' + Pos.Interfaces[I]);
end;
end;
Kod: Tümünü seç
procedure TForm1.btnPairClick(Sender: TObject);
begin
if Pos.Pair() then
begin
Log('Pairing OK');
Log('ÖKC Seri No: ' + Pos.Serial);
end
else
begin
Log('Pairing hatası: ' + Pos.LastError);
end;
end;
Kod: Tümünü seç
procedure TForm1.btnEchoClick(Sender: TObject);
begin
if Pos.Echo() then
begin
Log('Echo OK');
Log('ÖKC tarih saat: ' + FormatDateTime('yyyy-mm-dd hh:nn:ss', Pos.DeviceDateTimeAtEcho));
end
else
begin
Log('Echo hatası: ' + Pos.LastError);
end;
end;
Kod: Tümünü seç
procedure TForm1.btnCashOnlyReceiptClick(Sender: TObject);
var
Tutar: Double;
Indirim: Double;
KdvOran: Single;
Baslik: TReceiptHeader; // TIngenicoGmp sınıfı içinde tanımlanan record türü.
Detay: TReceiptLines; // TIngenicoGmp sınıfı içinde tanımlanan record türü.
begin
if not TryStrToFloat(edtPrice.Text, Tutar) then
begin
ShowMessage('Fiş tutarı hatalı.');
Exit();
end;
if not TryStrToFloat(edtKdvOran.Text, KdvOran) then
begin
ShowMessage('KDV Oranı hatalı.');
Exit();
end;
if not TryStrToFloat(edtDiscount.Text, Indirim) then
begin
ShowMessage('İndirim tutarı hatalı.');
Exit();
end;
Baslik.DiscountAmount := Indirim; // Sıfır bile olsa atama yapılmalı
Baslik.DiscountText := AnsiString(edtDiscountText.Text);
Baslik.TotalCash := Tutar - Indirim;
Baslik.TotalCredit := 0; // Sıfır bile olsa atama yapılmalı
SetLength(Detay, 1); // Çok satır için yazdırılmak istenilen satır kadar rakam yazılıp array içindeki tüm satır bilgileri doldurulabilir.
Detay[0].Barcode := edtBarcode.Text;
Detay[0].Name := edtName.Text;
Detay[0].Amount := Tutar;
Detay[0].&Unit := edtBirim.Text;
Detay[0].Count := 1;
Detay[0].VATAmount := KdvOran;
Detay[0].VATInDeviceName := edtKdvAdi.Text;
Detay[0].DiscountText := edtIndirim.Text;
Pos.BottomNote1 := edtDipNot1.Text;
Pos.BottomNote1Prefix := EmptyStr;
Pos.BottomNote2 := edtDipNot2.Text;
Pos.BottomNote2Prefix := '!!! '; // ikinci dip not için ön ek
if Pos.PrintReceipt(Baslik, Detay) then
begin
Log('Nakit fiş yazdırıldı.');
end
else
begin
Log('Nakit fiş yazdırma hatası: ' + Pos.LastError);
end;
end;
Kod: Tümünü seç
procedure TForm1.FormDestroy(Sender: TObject);
begin
Pos.Free();
end;