LDX Doküman Eşleme Eklentileri LOGO Ürün Geliştirme Kasım 2007
ĐÇĐNDEKĐLER LDX Doküman Eşleme Eklentileri :... 3 Eklenti Nasıl Hangi Dilde Yazılır?... 3 Eklenti Nasıl Kurulur?... 3 Eklenti Arayüzü :... 3 GetID... 3 GetAutohor... 4 GetName... 4 GetDescription... 4 GetVersion... 4 GetFileExtension... 4 GetErrorMsg... 5 GetConvertTypesByDoc... 5 GetConvertTypesByGroup... 6 GetDocString... 7 GetFileIdentification... 7 ConvertLogoToCustom... 8 ConvertCustomToLogo... 9 LDX Grup Kodları:... 10 LDX Doküman Tipleri :... 10 Örnek Eklenti :... 12
LDX Doküman Eşleme Eklentileri : B2B işlemleri karşılıklı bir ya da birden çok firma arasında gerçekleşir. B2B işlemi yapan firmalarda Logo Ticari Sistem (Unity/Tiger/Gold/Go/LKS) olabileceği gibi herhangi başka bir uygulamada olabilir. Eğer veri alışverişi yapan iki firmadan birinde Logo Ticari Sistem, diğerinde başka bir uygulama varsa veri alışverişi Doküman Eşleme Eklentisi (Plugin) kullanılarak mümkün olur. Örneğin; Sipariş alan ana dağıtıcı firma Logo Tiger kullanmaktadır, Bu dağıtıcı firmaya sipariş veren bir işletme ise siparişlerini kendi belirlediği bir şablonda excel e kaydetmekte ve dağıtıcı firmaya siparişlerini telefon ile geçmektedir. Dağıtıcı firma telefonla alınan siparişleri kendi sistemine kaydetmek için büyük zaman kaybetmekte ve zaman zaman (veri giriş hatası vs. gibi nedenlerden) aldığı siparişlerde sorunlar yaşamaktadır. Dağıtıcı firma bu zaman kayıpları ve hataların önüne geçmek için siparişlerin elektronik ortamda gönderilmesini istemektedir. Sipariş veren firma Logo uygulaması kullanmamaktadır. Böyle bir durumda sorunun çözümü için yazılacak bir Doküman Dönüşüm Eklentisi ile excelde girilen bu siparişler LDX üzerinden dağıtıcı firmaya gönderilebilir. Yine aynı şekilde dağıtıcı firma siparişe istinaden oluşturduğu faturayı LDX üzerinden siparişi veren firmaya gönderebilir ve Doküman Dönüşüm Eklentisi ile bu fatura excel dokümanı olarak kaydedilebilir. (Not: Burada sipariş veren işletme excel dışında herhangi bir 3. parti yazılımda kullanıyor olabilir.) Eklenti Nasıl Hangi Dilde Yazılır? Eklenti herhangi bir programalama dilinde aşağıda belirlenen arayüz e uygun DLL olarak yazılır. Eklenti Nasıl Kurulur? LDX Menü ağacında Çalışma Parametreleri -> Doküman Eşleme Eklentileri adımından Doküman Eşleme Eklentileri borowserına ulaşılır. Sol alt köşedeki yeni eklenti butonuna basılıp kurulacak DLL uzantılı eklenti seçilir ve kaydet butonuna basılır. Eklenti dosyası (DLL) kurulduğunda PRG klasörü altında PLUGINS dizinine kopyalanır. DLL bu klasöre manuel kopyalanarak eklenti kurulmaz. Eklentinin yukarıdaki işlem adımında bahsedildiği şekilde kayıt edilmesi gereklidir. Ancak eklenti daha önce kurulmuşsa güncellemek için yeniden kayıt etmeye gerek yoktur yeni DLL i üzerine kopyalamak yeterlidir. Eklenti Arayüzü : GetID Tip Yönü Açıklama Dönüş Değeri Integer Dışarı Eklenti ID si. Her eklenti için bir ID belirlenir. Belirlenen ID burda function result değeri olarak döndürülür. Aynı makinada bir LDX e birden fazla plugin kurulacaksa bu ID ler birbirinden farklı olmalı.
GetAutohor Dönüş Değeri Tip Yönü Açıklama OleVariant Dışarı Eklenti yazarının adı. (String) Eklenti yazarının adıdır. Bu değer Doküman Ekleme Eşlentileri ekranında Yazarı kolonunda görüntülenir. GetName Dönüş Değeri Tip Yönü Açıklama OleVariant Dışarı Eklenti adı. (String) Eklenti için belirlenen isimdir. Doküman Ekleme Eşlentileri ekranında Adı kolonunda görüntülenir. GetDescription Dönüş Değeri Tip Yönü Açıklama OleVariant Dışarı Açıklaması (String) Eklentiyi tanımlamak için kullanıbilecek açıklamadır. Bu değer Doküman Ekleme Eşlentileri ekranında Açıklaması kolonunda görüntülenir GetVersion Dönüş Değeri Tip Yönü Açıklama OleVariant Dışarı Eklenti versiyonu (String) Eklenti verisyon bilgisidir. Bu değer Doküman Ekleme Eşlentileri ekranında Versiyon kolonunda görüntülenir. GetFileExtension Dönüş Değeri Tip Yönü Açıklama OleVariant Dışarı Plugin in desteklediği dosya formatının uzantısı. (String) Eklentinin çalıştığı dosya uzantısıdır. Doküman dönştürme işlemi yapılırken oluşacak dosya bu uzantıda olacaktır.
GetErrorMsg Parametreler Tip Yönü Açıklama errcode Integer Đçeri Hata kodu Dönüş Değeri OleVariant Dışarı Eklentinin ürettiği hata kodlarının açıklamaları. LDX, eklenti tarafından üretilen hata kodunu kullanıcıya gösterirken ya da loglarken hata kodunun ne anlama geldiği bilgisini bu functiondan alır. GetConvertTypesByDoc Parametreler Tip Yönü Açıklama doctype Integer Đçeri LDX doküman tipi trcode Integer Đçeri LDX dokümanının Tran Kodu cross Boolean Đçeri Dönüşüm Çaprazmı olacak varr OleVariant Dışarı Dönüşebilecek doküman kodlarını içeren dizi (VarArray) Dönüş Değeri Integer Dışarı Dizideki doküman sayısı LDX teki bir dokümana karşılık eklentinin desteklediği dokümanlar burada belirtilir. Desteklenen her dokümanı temsil için bir numara belirlenir. Ve bu numara(lar) function parametresi olan varr disizisine eklenerek LDX e bildirilir. varr dizisine eklenen eleman sayısı function sonuç değeri olarak döndürülür. örnek; function GetConvertTypesByDoc(docType: Integer; trcode: Integer; cross: Boolean; var varr: OleVariant): Integer; stdcall; Result := -1; case doctype of 13 : if cross //verilen Sip. then Result := 1; varr[1] := '101'; end else Result := 1; varr[1] := '100'; end 15 : if cross //alınan sip. then Result := 1; varr[1] := '100'; end else Result := 1; varr[1] := '101'; end
Bu örnek için; 100 : Text Alınan Sipariş 101 : Text Verilen Sipariş olarak seçilmiştir. Bu numaralar bir standart değildir. Plugin yazarı tarafından Integer sınırları içinde istenilen değer belirlenir. Bu örnekteki gibi bir eklenti yazılıp eklenti kaydedilirse, LDX -> Çalışma Parametreleri -> Doküman Eşleme -> Sipariş Fişi - > Giden tabından Verilen sipariş - > çapraz gönderim adımından doküman seçilmek istenirse; seçilebilecek dokümanlar arasında eklentinin Text Alınan Sipariş dokümanı da listelendiği görülür. GetConvertTypesByGroup Parametreler Tip Yönü Açıklama groupcode Integer Đçeri LDX Doküman grup kodu varr OleVariant Dışarı Dönüşebilecek doküman kodlarını içeren dizi (VarArray) Dönüş Değeri Integer Integer Doküman Sayısı Parametre olarak verilen groupcode gurubunda dönüşüm yapılabilecek doküman(lar) burada belirtilir. Bizim örneğimizdeki eklenti; sadece sipariş grubunda Text Alınan Siparişi ve Text Verilen sipariş desteklemektedir. GetConvertTypesByDoc function undan farkı; GetConvertTypesByDoc bir dokümanın hangi dokümanlara dönüşebileceğini belirtirken GetConvertTypesByGroup bir gurupta hangi dokümanlar desteklendiği belirtilir. örnek; function GetConvertTypesByGroup(groupCode: Integer; var varr: OleVariant): Integer; stdcall; Result := -1; case groupcode of 1 : Result := 2; varr[1] := '100'; varr[2] := '101'; 100 ve 101 rakamaları yine örnektir. Örnekte; 1 grup kodu (Sipariş) için pluginin desteklediği doküman kodları 100 (Text Verilen sipariş) ve 101 (Text Alınan Sipariş) olduğu belirtilmiştir.
GetDocString Parametreler Tip Yönü Açıklama doctype Integer Đçeri Doküman numarası (Eklenti dokümanı) Dönüş Değeri OleVariant (String) Dışarı Dokümanın adı Doküman numarasına karşılık gelen text ifade. Daha önceki örneklerde bahsettiğimiz 100 ve 101 numaralı dokümanların text ifadesi burada belirtilir. LDX doküman eşlemede bu text ifade görüntülenir. function GetDocString(docType: Integer): OleVariant; stdcall; Result := ''; case doctype of 100 : Result := 'Text Verilen Sipariş'; 101 : Result := 'Text Alınan Sipariş'; GetFileIdentification Parametreler Tip Yönü Açıklama filen WideString Đçeri Dosyanın adı doctype Integer Dışarı Dosyanın içerdiği doküman tipi iscross Boolean Dışarı Doküman çaprazmı senderlid OleVariant Dışarı Dosyayı gönderenin E-iş Kodu (String) Dönüş Değeri Integer Dışarı Sonuç, Sıfırdan farkı ise hata var anlamındadır. Ldx bir klasör ya da ftp deki dosyanın içerdiği dokümanın ne olduğunu eklentinin bu functionunu çağırarak tespit eder. Tanınmak istenen dosyanın adı functiona parametre olarak geçer ve eklentiden dokümanın tipi, çapraz gönderilip gönderilmediği ve göndericinin e-iş kodu istenir. örnek; function GetFileIdentification(fileN: WideString; var doctype: Integer; var iscross: Boolean; var senderlid: OleVariant): Integer; stdcall; Result := 0; doctype := 100; senderlid := 'ZVLID00000001'; //24 karakter iscross := FALSE; Bu örnekte bilgiler sabit olarak belirtilmiştir. Gerçek uygulamada bu bilgiler dosya adından ya da dosya içindeki herhangi bir bilgiden alınabilir.
ConvertLogoToCustom Parametreler Tip Yönü Açıklama sourcefile WideString Đçeri Dönüşecek dosya adı (LDX dokümanı) destfile WideString Đçeri Dönüşeceği dosya adı (Eklenti) doctype Integer Đçeri Dönüşecek LDX dokümanı doküman tipi trcode Integer Đçeri Dönüşecek LDX dokümanı tran kodu customtype Integer Đçeri Dönüşeceği Plugin doküman tipi Dönüş Değeri Integer Dışarı Đşlem sonucu, 0 hata yok anlamında LDX dokümanından Eklentinin desteklediği bir dokümana dönüş işleminin yapılacağı function dur. Functiona LDX dokümanını içeren dosyanın adı, dokümanın tipi, ve tran kodu bilgisi parametre olarak geçilir ve yine parametrede belirtilen dosya isminde, customtype eklenti tipindeki dokümana dönüşüm yapılması istenir. Aşağıda örnek olması açısından basit bir dönüşüm işlemi nasıl yapılacağı gösterilmiştir. function ConvertLogoToCustom(sourceFile: WideString; destfile: WideString; doctype: Integer; trcode: Integer; customtype: Integer): Integer; stdcall; var xmldom : IXMLDOMDocument2; node : IXMLDOMNode; number : String; txtfile : TextFile; Result := 0; // noerror AssignFile(txtFile, destfile+'.'+cs_fileext); Rewrite(txtFile); xmldom := CoDOMDocument.Create; if xmldom.load(sourcefile) then node := xmldom.documentelement.firstchild.selectsinglenode('number'); if node <> NIL then number := node.text; writeln(txtfile, 'number:'+ number); writeln(txtfile, 'doctype:'+ IntToStr(docType)); writeln(txtfile, 'trcode:'+ IntToStr(trCode)); writeln(txtfile, 'customtype:'+ IntToStr(customType)); CloseFile(txtFile); xmldom := NIL;
ConvertCustomToLogo Parametreler Tip Yönü Açıklama sourcefile WideString Đçeri Dönüşecek dosya adı (Eklenti dokümanı) destfile WideString Đçeri Dönüşeceği dosya adı (LDX Dokümanı) doctype Integer Đçeri Dönüşeceği LDX doküman tipi trcode Integer Đçeri Dönüşeceği LDX dokümanı tran kodu customtype Integer Đçeri Dönüşecek eklenti doküman tipi. Dönüş Değeri Integer Dışarı Đşlem sonucu, 0 Hata yok anlamındadır. Eklentinin desteklediği dokümandan LDX dokümanına dönüşüm işlemi bu function ile yapılır. Eklenti dosyasının adı ve doküman tipi parametre olarak verilir. Parametrede belirtilen dosya isminde yine parametrede verilen doküman tipi ve tran kodunda dosya oluşturulması istenir. function ConvertCustomToLogo(sourceFile: WideString; destfile: WideString; doctype: Integer; trcode: Integer; customtype: Integer): Integer; stdcall; var xmldoc : IXMLDOMDocument2; node : IXMLDOMNode; Result := 0; // noerror xmldoc := CoDOMDocument.Create; case trcode of 1 : node := xmldoc.appendchild(xmldoc.createelement('purchase_orders')); 2 : node := xmldoc.appendchild(xmldoc.createelement('sales_orders')); node.appendchild(xmldoc.createnode(1, 'NUMBER', '001')); node.appendchild(xmldoc.createnode(1, 'DATE', '01.01.2001')); xmldoc.save(destfile);
LDX Grup Kodları: 1 Sipariş Fişi 2 İrsaliye 3 Fatura 4 Kasa İşlemi(Fatura) 5 Muhasebe Fişi 6 Fiyat Kartı 9 Malzeme (Sınıfı) Kartı 12 Kampanya Kartı 13 İthalat Operasyon Fişi 14 İhracat Operasyon Fişi 15 İhraç Kayıtlı Fatura 16 Malzeme Fişleri 17 Cari Hesap Kartı LDX Doküman Tipleri : -11 Özel Döküman (Gelen) -10 Özel Döküman (Giden) -4 Bilgilendirme -2 Bilinmeyen Paket -1 Hatalı Paket 1 Havale/EFT Gönder (Banka) 2 Çek/Senet Sonuçları (Banka) 3 Hesap Özeti 4 Havale/EFT Sonuçları (Banka) 5 Çek/Senet Gönder (Banka) 6 Fatura Gönder (Banka) 7 Fatura Sonuçları (Banka) 10 Muhasebe Fişi (Giden) 11 Muhasebe Fişi (Gelen) 12 Maaş Ödemesi 13 Verilen Sipariş (Giden) 14 Verilen Sipariş (Gelen) 15 Alınan Sipariş (Giden) 16 Alınan Sipariş (Gelen) 17 Alım Đrsaliyesi (Giden) 18 Alım Đrsaliyesi (Gelen) 19 Satış Đrsaliyesi (Giden) 20 Satış Đrsaliyesi (Gelen) 21 Alım Faturası (Giden) 22 Alım Faturası (Gelen) 23 Satış Faturası (Giden) 24 Satış Faturası (Gelen) 25 Malzememe Güncelleme (Giden) 27 Cari Kart Güncelleme (Giden) 28 Cari Kart Güncelleme (Gelen) 29 Malzeme Güncelleme Đstek (Giden) 30 Malzeme Güncelleme (Gelen) 31 Kullanıcı ve Kullanıcı Grubu Güncelleme 32 Firma Güncelleme 33 Kasa Đşlemi (Fatura) (Giden) 34 Kasa Đşlemi (Fatura) (Gelen) 35 Alış Fiyat Listesi (Giden) 36 Alış Fiyat Listesi (Gelen) 37 Satış Fiyat Listesi (Giden)
38 Satış Fiyat Listesi (Gelen) 40 Seri Lot (Gelen) 41 Cari Hesap Bilgileri Đsteği (Gelen) 42 Cari Hesap Bilgileri Đsteği Yanıtı (Giden) 45 Malzeme (Sınıfı) Kartı (Giden) 46 Malzeme (Sınıfı) Kartı (Gelen) 47 E-Mağaza Kodları (Giden) 48 E-Mağaza Kodları (Gelen) 50 E-Đş Ortamı Malzeme Güncelleme (Giden) 51 E-Mağaza Malzeme Güncelleme (Giden) 52 Malzeme Güncelleme (Gelen) 53 Malzeme Güncelleme (Silme Đsteği) 55 Firma Bilgileri (Gelen) 56 Firma Bilgileri Đsteği (Giden) 57 Firma Bilgileri Đsteği Cevabı (Gelen) 60 Banka Sertifika (Giden) 61 Bayi Kartı POS Ekstresi 62 Mahsup Faturası Gönder (Banka) 63 Mahsup Faturası Sonuçları (Banka) 64 Đade Faturası Gönder (Banka) 65 Đade Faturası Sonuçları (Banka) 66 Alım Faturası Gönder (Banka) 67 Alım Faturası Sonuçları (Banka) 68 Alım Faturası Gönder (Banka) (EFT-Havale Olarak) 69 Alım Faturası Sonuçları (Banka) (EFT-Havale Olarak) 70 Çek/Senet (Giden) 71 Çek/Senet (Gelen) 72 Cari Hesap Fişleri (Giden) 73 Cari Hesap Fişleri (Gelen) 90 Eşleme Tablosu 91 Cari Hesap Güncelleme 100 Gönder / Al (Giden) 101 Gönder / Al (Gelen) 120 Alış Kampanya Kartı (Giden) 121 Alış Kampanya Kartı (Gelen) 122 Satış Kampanya Kartı (Giden) 123 Satış Kampanya Kartı (Gelen) 150 Đhraç Kayıtlı Alım Faturası (Giden) 151 Đhraç Kayıtlı Alım Faturası (Gelen) 152 Đhraç Kayıtlı Satış Faturası (Giden) 153 Đhraç Kayıtlı Satış Faturası (Gelen) 160 Đhracat Operasyon Fişi (Giden) 161 Đhracat Operasyon Fişi (Gelen) 170 Đthalat Operasyon Fişi (Giden) 171 Đthalat Operasyon Fişi (Gelen) 180 Malzeme Fişi (Giden) 181 Malzeme Fişi (Gelen) 190 Cari Hesap Kartı (Giden) 191 Cari Hesap Kartı (Gelen)
Örnek Eklenti : Yukarıda örneklerde de geçen eklentinin bütün hali aşağıdar. Eklenti gerçek dönşüm işlemi yapmamaktadır. örnek olması açısından yazılmıştır. Eklentinin adı SamplePlgin.DLL dir ve Delphi ile yazılmıştır. library SamplePlgin; uses SysUtils, Classes, Variants, MSXML2_TLB; {$R *.res} const CS_ID = 1; CS_AUTHOR = 'TEST'; CS_NAME = 'TEST'; CS_DESC = 'LDX Test PlugIn'; CS_VER = '1.0'; CS_FILEEXT = 'TXT'; function GetID: Integer; stdcall Result := CS_ID; function GetAuthor: OleVariant; stdcall Result := CS_AUTHOR; function GetName: OleVariant; stdcall Result := CS_NAME; function GetDescription: OleVariant; stdcall Result := CS_DESC; function GetVersion: OleVariant; stdcall Result := CS_VER; function GetErrorMsg(errCode: Integer): OleVariant; stdcall Result := Format('(%d) %s', [errcode, 'Hata mesajı!']); function GetConvertTypesByDoc(docType: Integer; trcode: Integer; cross: Boolean; var varr: OleVariant): Integer; stdcall; Result := -1; case doctype of 13 : if cross then Result := 2; varr[1] := '98';
varr[2] := '99'; end else Result := 2; varr[1] := '97'; varr[2] := '96'; end function GetConvertTypesByGroup(groupCode: Integer; var varr: OleVariant): Integer; stdcall; Result := -1; case groupcode of 1 : Result := 4; varr[1] := '98'; varr[2] := '99'; varr[3] := '97'; varr[4] := '96'; function GetDocString(docType: Integer): OleVariant; stdcall; Result := ''; case doctype of 100 : Result := 'Text Verilen Sipariş'; 101 : Result := 'Text Alınan Sipariş'; function GetFileIdentification(fileN: WideString; var doctype: Integer; var iscross: Boolean; var senderlid: OleVariant): Integer; stdcall; Result := 0; doctype := 96; senderlid := 'ZVLID00000001'; //max. 24 karakter iscross := FALSE; function ConvertLogoToCustom(sourceFile: WideString; destfile: WideString; doctype: Integer; trcode: Integer; customtype: Integer): Integer; stdcall; var xmldom : IXMLDOMDocument2; node : IXMLDOMNode; number : String; txtfile : TextFile; Result := 0; // noerror AssignFile(txtFile, destfile+'.'+cs_fileext); Rewrite(txtFile); xmldom := CoDOMDocument.Create; if xmldom.load(sourcefile) then node := xmldom.documentelement.firstchild.selectsinglenode('number'); if node <> NIL
then number := node.text; writeln(txtfile, 'number:'+ number); writeln(txtfile, 'doctype:'+ IntToStr(docType)); writeln(txtfile, 'trcode:'+ IntToStr(trCode)); writeln(txtfile, 'customtype:'+ IntToStr(customType)); CloseFile(txtFile); xmldom := NIL; function ConvertCustomToLogo(sourceFile: WideString; destfile: WideString; doctype: Integer; trcode: Integer; customtype: Integer): Integer; stdcall; var xmldoc : IXMLDOMDocument2; node : IXMLDOMNode; Result := 0; // noerror xmldoc := CoDOMDocument.Create; case trcode of 1 : node := xmldoc.appendchild(xmldoc.createelement('purchase_orders')); 2 : node := xmldoc.appendchild(xmldoc.createelement('sales_orders')); node.appendchild(xmldoc.createnode(1, 'NUMBER', '001')); node.appendchild(xmldoc.createnode(1, 'DATE', '01.01.2001')); xmldoc.save(destfile); exports GetID, GetAuthor, GetName, GetDescription, GetVersion, GetErrorMsg, GetDocString, GetConvertTypesByDoc, GetConvertTypesByGroup, GetFileIdentification, ConvertLogoToCustom, ConvertCustomToLogo; end.