Ingenico Yeni nesil akıllı yazarkasa (ÖKC) entegrasyon Delphi bileşeni

Paket programlarınızın tanıtımını bu forumda yapabilirsiniz. Bu foruma soru sormayın!
Cevapla
ertank
Üye
Mesajlar: 1108
Kayıt: 11 Eyl 2015 11:45

Ingenico Yeni nesil akıllı yazarkasa (ÖKC) entegrasyon Delphi bileşeni

Mesaj gönderen ertank » 20 May 2018 03:05

Merhaba,

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);
Kullanıma hazırlık:

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;
Eşleştirme örnek kodu:

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;
Echo örnek kodu:

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;
Tek satır nakit fiş yazdırma örnek kodu:

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;
Bileşeni hafızadan silme:

Kod: Tümünü seç

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Pos.Free();
end;

Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2067
Kayıt: 12 Haz 2003 03:05
Konum: merkez camii yanı

Re: Ingenico Yeni nesil akıllı yazarkasa (ÖKC) entegrasyon Delphi bileşeni

Mesaj gönderen freeman35 » 21 May 2018 04:04

Kod: Tümünü seç

private
    { Private declarations }
    Pos: TIngenicoGmp;
Pos: bunu değiştirin, bu pascal da tanımlanmış bir isimdir.( http://docwiki.embarcadero.com/Librarie ... System.Pos ) yeni versiyonlarda derleyici hata vermiyor olsada, bu tip kullanımlardan kaçının.
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!

ertank
Üye
Mesajlar: 1108
Kayıt: 11 Eyl 2015 11:45

Re: Ingenico Yeni nesil akıllı yazarkasa (ÖKC) entegrasyon Delphi bileşeni

Mesaj gönderen ertank » 22 May 2018 12:05

freeman35 yazdı:
21 May 2018 04:04
Pos: bunu değiştirin, bu pascal da tanımlanmış bir isimdir.( http://docwiki.embarcadero.com/Librarie ... System.Pos ) yeni versiyonlarda derleyici hata vermiyor olsada, bu tip kullanımlardan kaçının.
Merhaba,

Konu ile ilgilenenler cihazları "pos" cihazı olarak adlandırdığı için benimsemesi daha kolay olur diye düşünerek örnek kodlarda bu adı tercih etmiştim. Yorumunuzda haklısınız. Kullanımı gösteren örnek uygulama kodu içindeki adını "IngenicoGmp" olarak değiştirdim.

Uyarı için teşekkürler.

Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7438
Kayıt: 09 Haz 2003 11:26
Konum: İstanbul
İletişim:

Re: Ingenico Yeni nesil akıllı yazarkasa (ÖKC) entegrasyon Delphi bileşeni

Mesaj gönderen mussimsek » 22 May 2018 09:41

Bu tarz değişken tanımlarında genellikle başına "F" koymak adeti var. Sadece pos gibi kelimeler için değil, diğerleri içinde...

FPos
FKasa
FZRaporu
...

gibi kullanabilirsiniz.

Kolay gelsin.

Cevapla