Logo Connect, e-Fatura/e-Arşiv/e-İrsaliye gibi belgeler GİB’e gönderilmeden önce veya sonra devreye giren bir “kural motoru”dur: bir alanı başka bir alana taşımak, bir veriyi hesaplayıp UBL’e eklemek, belirli bir koşulda bir satırı silmek gibi işleri, VBScript benzeri küçük script’lerle ya da hiç kod yazmadan, hazır bir arayüzden tanımlayabilirsiniz. Bu yazıda, kural örneklerinin yanı sıra bu kurallarla üretilen verilerin Tasarım Aracı’nda nasıl gösterileceğini de tek kaynakta topladım — ihtiyacınız olduğunda aşağıdaki içindekiler listesinden doğrudan ilgili bölüme atlayabilirsiniz.
İçindekiler
Alan / Açıklama Taşıma
Kod yazmadan kural örneği Açıklama2 → Satır Açıklaması Description ↔ Name Değiştirme Satır Açıklaması ↔ Malzeme Açıklaması Varyant Kodu/Açıklaması Getirme Kod + Üretici Kodu Yan Yana Hizmet Kartı Açıklama2 Getirme Tanımlı Alanlar (Başlıkla) Satıcı Kod ve Adı Getirme Dövizli Faturada “TL” KaldırmaSipariş / İrsaliye / Kod Taşıma
Sipariş Fiş No Getirme Barkod → Tedarikçi Kodu GTIP Kodu → Satıra Tedarikçi Özel Kodu → Satıra Malzeme Barkodu → Satıra Sipariş No/Tarihi Açıklamadan Okuma İrsaliye No/Tarihi → Sipariş Doküman İzleme No → BAYINO Perakende KDV’li FiyatCari Bakiye, Sevkiyat, İrsaliye
Cari Bakiyeyi Faturaya Getirme e-Arşiv Sevkiyat Adresi “İrsaliye Yerine Geçer” Kuralı Karma Koli KurallarıÖzel Durum Kuralları
Ana Birim Kodu / Çevrimi İhracat Satır Miktar Toplamı Gelen Faturada Satır Eşleme Tesis Devri KuralıTasarım Aracı Ek Alanları
Detaylı Bilgiyi Tasarıma Getirme İrsaliye Numaralarını Yan Yana Yazma Ödeme Planı Tarihi Sevkiyat Hesabı Unvan / Adres / VKN Alıcı / Satıcı / Üretici Kodu Kuralla Eklenen Serbest Alanı Gösterme Satırdaki İrsaliye / Sipariş No-Tarihi Navlun / Sigorta TutarıVeritabanı ve Referans
Veritabanından Ek Veri Çekme UQUERY_GETFLD Metodu Kural Operatörleri Genel TavsiyelerCNB Kural Kütüphanesi (13 Kural)
1. Banka Bilgileri Aktarımı 2. SATIR AÇIKLAMAYA VARYANT EKLEME 3. SEVKİYAT ADRESİ 4. Gelen faturadaki bazı verileri boşalt 5. Fatura üzerinde değişiklik yap 1 6. Birim setinde kullanılan birimi adet’e çevirir 7. Fatura kart tipindeki indirim masraf 8. Fatura Kural Tanımı 9. Varyant Bilgi Boşalt 10. SATIŞ ELEMANI 11. FATURA GONDER KURAL 12. IRSALİYE KURAL (VERILERI SIL) 13. Müşteri Tedarikçi Kodu Kuralı (GoPlus için)Ek Kural Örnekleri
Gelen Fatura Açıklamasını Boşaltma NOTES4 → Sipariş No Atama Raporlama Dövizi → Açıklama İşlem Döviz Bilgileri (2 Varyant) Özel Kodu Malzeme Açıklamasına Ekleme Belge No → İrsaliye No (+ XML Aktarımı) SQL’den Günlük Döviz Kuru Çekme Malzeme Grubu Eşleme (Şablon) Çoklu Koşullu Kural ŞablonuKod Yazmadan Kural: İrsaliye No’ya Belge No Getirme
Her kural script gerektirmez. Logo Connect’in Kural Tanımlama ekranında “Veri üzerinde değişiklik yap” işlemini seçip alan eşlemesini yaparak da kural yazabilirsiniz. Örneğin bir e-Fatura’nın irsaliye numarasına, belge numarasını otomatik yazdırmak için:
| Ayar | Değer |
|---|---|
| Doküman | e-Fatura (Giden) |
| Olay | Onaylanmadan Önce |
| İşlem | Veri üzerinde değişiklik yap |
| DISPATCHES.DISPATCH.NUMBER | DOC_NUMBER |
Sol tarafa hedef alanı, sağ tarafa kaynak alanı yazıyorsunuz; Logo Connect her belge üretiminde bu eşlemeyi otomatik uyguluyor. Script gerektiren ihtiyaçlarda ise aşağıdaki gibi ProcessEvent fonksiyonlu kurallar kullanılır.
Alan / Açıklama Taşıma Kuralları
Malzeme Açıklama2 → Satır Açıklaması
sub ProcessEvent(App)
ok1 = App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
while ok1
name = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.MASTER_DEF3")
App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.DESCRIPTION", name
ok1 = App.Doc.NextChild
wend
App.Doc.SaveData
end subDescription ↔ Name Alanlarını Değiştirme
Belirli bir cari hesap koduna özel çalışır:
sub ProcessEvent(App)
TAX = App.Doc.FieldAsString("ARP_CODE")
If TAX = "CARI-KODUNUZ" then
rOk = App.Doc.FirstRoot
while rOk
ok1 = App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
while ok1
KOD = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.MASTER_CODE")
DEF = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.MASTER_DEF")
App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.MASTER_DEF", KOD
App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.MASTER_CODE", DEF
ok1 = App.Doc.NextChild
wend
rOk = App.Doc.NextRoot
wend
App.Doc.SaveData
end If
end subSatır Açıklaması ↔ Malzeme Açıklaması
İki yönlü kullanılabilir. Birincisi, satır açıklaması doluysa bunu malzeme açıklamasının yerine geçirir:
sub ProcessEvent(App)
okay = App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
while okay
ACIKLAMA = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.DESCRIPTION")
if ACIKLAMA <> Empty then
App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.MASTER_DEF", ACIKLAMA
end if
okay = App.Doc.NextChild
wend
App.Doc.SaveData
end subİkincisi, cari hesap kodu boşsa satır açıklamasını malzeme koduna yazar (gelen faturalarda hızlı eşleme için kullanışlıdır):
sub ProcessEvent(App)
CariKod = App.Doc.FieldAsString("ARP_CODE")
if CariKod = "" Then
rOk = App.Doc.FirstRoot
while rOk
okay = App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
while okay
ASIN = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.DESCRIPTION")
App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.MASTER_CODE", ASIN
okay = App.Doc.NextChild
wend
rOk = App.Doc.NextRoot
wend
App.Doc.SaveData
End if
end subVaryant Kodu ve Açıklamasının Malzeme Kodu/Açıklamasına Getirilmesi
Varyantlı malzemelerde (CANCONFIG = 1) çalışır:
sub ProcessEvent(App)
ok1 = App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
while ok1
Var = App.Doc.FieldAsInteger("CANCONFIG")
if Var = 1 then
Code = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.VARIANTCODE")
Desc = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.VARIANTNAME")
App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.MASTER_CODE", Code
App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.MASTER_DEF", Desc
end if
ok1 = App.Doc.NextChild
wend
App.Doc.SaveData
end subMalzeme Kodu + Üretici Kodu, Açıklama + Açıklama2’nin Yan Yana Gelmesi
sub ProcessEvent(App)
rOk = App.Doc.FirstRoot
while rOk
ok1 = App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
while ok1
KOD = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.MASTER_CODE")
URET = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.PROCEDUCER_CODE")
ACK1 = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.MASTER_DEF")
ACK2 = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.MASTER_DEF3")
App.Doc.ModifyData "MASTER_CODE", KOD + " / " + URET
App.Doc.ModifyData "MASTER_DEF", ACK1 + " / " + ACK2
ok1 = App.Doc.NextChild
wend
rOk = App.Doc.NextRoot
wend
App.Doc.SaveData
end subHizmet Kartı Açıklama2’nin Açıklamaya Getirilmesi
Sadece hizmet satırlarında (TYPE = 4) çalışır:
sub ProcessEvent(App)
okay = App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
while okay
sType = App.Doc.FieldAsInteger("TRANSACTIONS.TRANSACTION.TYPE")
If sType = 4 Then
rOk = App.Doc.FirstChild("SALES_SERVICES.SERVICE")
while rOk
ACIKLAMA2 = App.Doc.FieldAsString("SALES_SERVICES.SERVICE.DESCRIPTION2")
rOk = App.Doc.NextChild
wend
App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.MASTER_DEF", ACIKLAMA2
end if
okay = App.Doc.NextChild
wend
App.Doc.SaveData
end subTanımlı Alanların Başlığıyla Beraber Açıklamaya Getirilmesi
sub ProcessEvent(App)
DETAY = App.Doc.FieldAsString("DEFNFLDSLIST.DEFNFLD.TEXTFLDS1")
DETAY1 = App.Doc.FieldAsString("DEFNFLDSLIST.DEFNFLD.TEXTFLDS2")
App.Doc.ModifyData "NOTES5", "Başlık: " + DETAY
App.Doc.ModifyData "NOTES6", "Başlık2: " + DETAY1
App.Doc.SaveData
end subSatıcı Kod ve Adının Genel Açıklamalara Getirilmesi
sub ProcessEvent(App)
DETAY = App.Doc.FieldAsString("SALESMAN_CODE")
DETAY1 = App.Doc.FieldAsString("SALESMAN_DEF")
App.Doc.ModifyData "NOTES5", "Satıcı Kodu:" + DETAY
App.Doc.ModifyData "NOTES6", "Satıcı Adı:" + DETAY1
App.Doc.SaveData
end subDövizli Faturalarda “Yalnız TL” İbaresinin Kaldırılması
Döviz cinsi seçiliyken tutarın yazıyla TL karşılığını (TOTAL_NET_STR) UBL’den çıkarır:
sub ProcessEvent(App)
sTip = App.Doc.FieldAsInteger("CURR_INVOICE")
if sTip <> Empty Then
App.Doc.RemoveChild "TOTAL_NET_STR"
end if
App.Doc.SaveData
end subSipariş, İrsaliye, Barkod ve Tedarikçi Kodu Taşıma
Sipariş Fiş Numarasının Faturaya Getirilmesi
sub ProcessEvent(App)
ORDER = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.ORDER_FICHENO")
ok1 = App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
while ok1
App.Doc.ModifyData "CUSTORDNO", ORDER
ok1 = App.Doc.NextChild
wend
App.Doc.SaveData
end subBarkod Numarasının Tedarikçi Koduna (Satıra) Getirilmesi
sub ProcessEvent(App)
rOk = App.Doc.FirstRoot
while rOk
ok1 = App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
while ok1
barkod = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.BARCODE")
App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.ITEM_SUPPLIERCODE", barkod
ok1 = App.Doc.NextChild
wend
rOk = App.Doc.NextRoot
wend
App.Doc.SaveData
end subGTIP Kodunun Satıra Getirilmesi
sub ProcessEvent(App)
rOk = App.Doc.FirstRoot
while rOk
okay = App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
while okay
GTIP = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.MASTER_GTIPCODE")
App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.ITEM_SUPPLIERCODE", GTIP
okay = App.Doc.NextChild
wend
rOk = App.Doc.NextRoot
wend
App.Doc.SaveData
end subTedarikçi Kodunun (Özel Kod) Fatura Satırına Getirilmesi
sub ProcessEvent(App)
rOk = App.Doc.FirstRoot
while rOk
okay = App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
while okay
OZELKOD = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.MASTER_AUXIL_CODE")
App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.ITEM_CUSTOMERCODE", OZELKOD
okay = App.Doc.NextChild
wend
rOk = App.Doc.NextRoot
wend
App.Doc.SaveData
end subMalzeme Barkodunun Satıra Getirilmesi
sub ProcessEvent(App)
rOk = App.Doc.FirstRoot
while rOk
okay = App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
while okay
OZELKOD = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.BARCODE")
App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.PROCEDUCER_CODE", OZELKOD
okay = App.Doc.NextChild
wend
rOk = App.Doc.NextRoot
wend
App.Doc.SaveData
end subSipariş No ve Tarihinin Açıklama Satırlarından Okunması
Sipariş bilgisi elle açıklama alanına (NOTES3/4) yazılmışsa, bunu standart sipariş alanlarına aktarır:
sub ProcessEvent(App)
rOk = App.Doc.FirstRoot
while rOk
ST_DEGISKEN1 = App.Doc.FieldAsString("NOTES3")
ST_DEGISKEN2 = App.Doc.FieldAsString("NOTES4")
ok1 = App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
while ok1
App.Doc.ModifyData "CUSTORDNO", ST_DEGISKEN1
App.Doc.ModifyData "ORDER_FICHENO", ST_DEGISKEN1
App.Doc.ModifyData "ORDER_FICHEDATE", ST_DEGISKEN2
ok1 = App.Doc.NextChild
wend
rOk = App.Doc.NextRoot
wend
App.Doc.SaveData
end subİrsaliye Numarası ve Tarihinin Sipariş Numarası/Tarihine Getirilmesi
Belirli bir cari hesap koduna özel çalışır:
sub ProcessEvent(App)
ARPCODE = App.Doc.FieldAsString("ARP_CODE")
If ARPCODE = "CARI-KODUNUZ" then
rOk = App.Doc.FirstRoot
while rOk
MusteriSiparisNo = App.Doc.FieldAsString("DISPATCHES.DISPATCH_NUMBER")
IrsaliyeTarihi = App.Doc.FieldAsString("DISPATCHES.DISPATCH.DATE")
ok1 = App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
while ok1
App.Doc.ModifyData "CUSTORDNO", MusteriSiparisNo
App.Doc.ModifyData "ORDER_FICHEDATE", IrsaliyeTarihi
ok1 = App.Doc.NextChild
wend
rOk = App.Doc.NextRoot
wend
App.Doc.SaveData
end If
end subDoküman İzleme Numarasının “BAYINO” Alanına Getirilmesi
Cari hesap kodu koşullu:
sub ProcessEvent(App)
ARPCODE = App.Doc.FieldAsString("ARP_CODE")
If ARPCODE = "CARI-KODUNUZ" then
DETAY = App.Doc.FieldAsString("DOC_TRACK_NR")
App.Doc.ModifyData "SHIPLOC_CODE", DETAY
App.Doc.SaveData
End if
end subPerakende Satış Faturasında KDV’li Birim Fiyatı Satıra Getirme
sub ProcessEvent(App)
ok1 = App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
while ok1
fiyat = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.PRICE")
App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.ITEM_SUPPLIERCODE", fiyat
ok1 = App.Doc.NextChild
wend
App.Doc.SaveData
end subCari Hesap Bakiyesini Fatura Tasarımına Getirme
Faturanın altına, o anki cari hesap bakiyesini otomatik yazdırmak iki adımda kurulur: önce bakiyeyi hesaplayıp UBL’e yazan bir kural, sonra bu veriyi tasarımda gösteren bir ek alan tanımı.
1. Adım — Kural: cari hesabın borç-alacak farkını (SUM(DEBIT)-SUM(CREDIT)) sorgular ve sonucu UBL’e BAKIYE etiketiyle yazar:
sub ProcessEvent(App)
ST_ClRef = App.Doc.FieldAsInteger("ARP_LOGICALREF")
ST_CHRRef = CStr(ST_ClRef)
BAKIYE = App.UQUERY_GETFLD(60,"SUM(DEBIT)-SUM(CREDIT)",24,6,FALSE, _
"CARDREF ="+ST_CHRRef+" AND TOTTYP = 1" )
App.Doc.WriteStartElement "ADDITIONALDOCUMENTS/ADDITIONALDOCUMENT"
App.Doc.WriteElementString "ID", Replace(cstr(BAKIYE),",",".")
App.Doc.WriteElementString "ISSUEDATE", Year(Date) & "-" & Right("0" & Month(Date), 2) & "-" & Right("0" & Day(Date), 2)
App.Doc.WriteElementString "DOCUMENTTYPE", "BAKIYE"
App.Doc.WriteEndElement
App.Doc.SaveData
end subKuralı doküman türü olarak e-Fatura (Giden), olay olarak Onaylanmadan Önce tanımlamanızı öneririm — bakiye, fatura GİB’e gitmeden hemen önceki güncel haliyle hesaplanır.
2. Adım — Tasarım: kural çalıştıktan sonra UBL’e şu kayıt eklenir:
<cac:AdditionalDocumentReference>
<cbc:ID>4250.75</cbc:ID>
<cbc:IssueDate>2026-08-25</cbc:IssueDate>
<cbc:DocumentType>BAKIYE</cbc:DocumentType>
</cac:AdditionalDocumentReference>Bunu görmek için Özel Entegratörlük Portalı → Araçlar → Görsel Tasarım Ek Alanları‘na gidip yeni bir ek alan açın ve DocumentType değerine göre filtreleyen şu XSLT’yi yazın:
<xsl:for-each select="//n1:Invoice/cac:AdditionalDocumentReference">
<xsl:if test="cbc:DocumentType = 'BAKIYE'">
<xsl:value-of select="cbc:ID"/>
</xsl:if>
</xsl:for-each>Bu ek alanı kaydettikten sonra Tasarım Aracı’nda “Kullanıcı Tanımlı” alanlar listesinde görünür; sürükleyip faturanın altına, örneğin “Cari Hesap Bakiyeniz:” etiketinin yanına yerleştirebilirsiniz.
e-Arşiv Faturalarında Sevkiyat Adresini UBL’e Ekleme
e-Arşiv faturalarında sevkiyat adresi bilgisi (açıklama, il, ilçe, adres) varsayılan olarak UBL’e yazılmaz. Aşağıdaki kural, bu bilgileri “ek belge” olarak fatura XML’ine ekler:
sub ProcessEvent(App)
DETAY = App.Doc.FieldAsString("SHIPLOC_DEF")
App.Doc.WriteStartElement "ADDITIONALDOCUMENTS/ADDITIONALDOCUMENT"
App.Doc.WriteElementString "ID", DETAY
App.Doc.WriteElementString "ISSUEDATE", Year(Date) & "-" & Right("0" & Month(Date), 2) & "-" & Right("0" & Day(Date), 2)
App.Doc.WriteElementString "DOCUMENTTYPE", "SEVKIYAT"
App.Doc.WriteEndElement
App.Doc.SaveData
' Ayni mantikla il / ilce / acik adres icin de EINVOICE_EXTENSIONS
' altindaki SHIPINFO_CITY, SHIPINFO_TOWNDIST, SHIPINFO_ADDRES alanlari
' SEHIR / ILCE / ADRES DOCUMENTTYPE degerleriyle tekrarlanir.
end subTasarımda göstermek için dört ayrı ek alan (SEVKIYAT, ADRES, SEHIR, ILCE) tanımlayıp her biri için kuralla eklenen serbest alanı gösterme bölümündeki if kalıbını kullanmanız yeterli.
“İrsaliye Yerine Geçer” İbaresi Kuralı
e-Arşiv faturalarda irsaliye bağlantısı yoksa, tasarımda otomatik olarak “irsaliye yerine geçer” ifadesinin çıkması istenebilir. Bunun yolu, UBL’deki irsaliye alanını kuralla kaldırmaktır — irsaliye alanı UBL’de yoksa ifade otomatik devreye girer:
sub ProcessEvent(App)
rOk = App.Doc.FirstChild("DISPATCHES.DISPATCH")
while rOk
App.Doc.RemoveChild "DISPATCH.NUMBER"
rOk = App.Doc.NextChild
wend
App.Doc.SaveData
end subKarma Koli Kuralları
“Karma koli satırına KDV oranı ve toplamı gelsin, fakat alt satırlar (koli içeriği) silinsin; e-Fatura gönderirken tasarımda ve UBL’de bu alt satırlar görünmesin” isteniyorsa şu kural kullanılır. Doküman olarak e-Fatura/e-Arşiv, olay olarak Onaylanmadan/İmzalanmadan Önce seçilmelidir:
sub ProcessEvent(App)
okay = App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
While okay
sTip = App.Doc.FieldAsInteger("TRANSACTIONS.TRANSACTION.TYPE")
if sTip = 6 Then
App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.VAT_RATE", 18
elseif sTip = 7 Then
App.Doc.RemoveChild "TRANSACTION.TYPE"
end if
okay = App.Doc.NextChild
Wend
App.Doc.SaveData
end subKaynak dokümanda “Karma Koli Kuralı” ve “Karma Koli Malzeme Kuralı” adıyla iki ayrı başlık altında verilse de kod bloğu aynıdır — pratikte tek bir kural, hem KDV satırını düzenleyip hem de koli içi malzeme satırlarını (tip 7) kaldırma işini birlikte yapar.
Özel Durum Kuralları
Ana Birim Kodu / Ana Birim Çevrimi
Birden fazla birim setiyle çalışan malzemelerde, satırdaki miktarı ana birime çevirip açıklamaya ya da UBL’e ek alan olarak yazar:
' Ana birim koduna gore miktari cevirip aciklamaya yazma
sub ProcessEvent(App)
okay = App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
while okay
Quantity = App.Doc.FieldAsFloat("TRANSACTIONS.TRANSACTION.QUANTITY")
GBKod = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.UNIT_GLOBAL_CODE")
ok1 = App.Doc.FirstChild("UNIT_SETS.UNIT_SET.UNITS.UNIT")
while ok1
GBKod2 = App.Doc.FieldAsString("GLOBAL_CODE")
If GBKod = GBKod2 Then
value = App.Doc.FieldAsFloat("CONV_FACT1")
end if
ok1 = App.Doc.NextChild
wend
a = ((Quantity) * (value))
App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.DESCRIPTION", a
okay = App.Doc.NextChild
wend
App.Doc.SaveData
end sub
' Butun satirlarin toplam ana birim karsiligini UBL'e ek alan olarak yazma
sub ProcessEvent(App)
b = 0.0
okay = App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
while okay
Quantity = App.Doc.FieldAsFloat("TRANSACTIONS.TRANSACTION.QUANTITY")
GBKod = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.UNIT_GLOBAL_CODE")
ok1 = App.Doc.FirstChild("UNIT_SETS.UNIT_SET.UNITS.UNIT")
while ok1
GBKod2 = App.Doc.FieldAsString("GLOBAL_CODE")
If GBKod = GBKod2 Then
value = App.Doc.FieldAsFloat("CONV_FACT1")
end if
ok1 = App.Doc.NextChild
wend
a = ((Quantity) * (value))
b = b + a
okay = App.Doc.NextChild
wend
App.Doc.WriteStartElement "ADDITIONALDOCUMENTS/ADDITIONALDOCUMENT"
App.Doc.WriteElementString "ID", b
App.Doc.WriteElementString "ISSUEDATE", Year(Date) & "-" & Right("0" & Month(Date), 2) & "-" & Right("0" & Day(Date), 2)
App.Doc.WriteElementString "DOCUMENTTYPE", "KILOTOPLAM"
App.Doc.WriteEndElement
App.Doc.SaveData
end subİhracat Faturalarında Satır Miktar Toplamının Açıklamaya Getirilmesi
EXIM_FICHE_TYPE = 2 veya 3 koşuluyla çalışır:
sub ProcessEvent(App)
Type1 = App.Doc.FieldAsString("EXIM_FICHE_TYPE")
If Type1 = 2 or 3 Then
b = 0.0
okay = App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
while okay
Type2 = App.Doc.FieldAsInteger("TRANSACTIONS.TRANSACTION.TYPE")
If Type2 = 0 Then
Quantity = App.Doc.FieldAsFloat("TRANSACTIONS.TRANSACTION.QUANTITY")
b = Quantity + b
end if
okay = App.Doc.NextChild
wend
App.Doc.WriteStartElement "ADDITIONALDOCUMENTS/ADDITIONALDOCUMENT"
App.Doc.WriteElementString "ID", b
App.Doc.WriteElementString "ISSUEDATE", Year(Date) & "-" & Right("0" & Month(Date), 2) & "-" & Right("0" & Day(Date), 2)
App.Doc.WriteElementString "DOCUMENTTYPE", "TOPLAMMIKTAR"
App.Doc.WriteEndElement
end if
App.Doc.SaveData
end subGelen Faturada Satırları Tek Bir Malzeme İle Eşleme
Tedarikçiden gelen e-faturadaki tüm satırları, kendi tek bir “genel malzeme” kartınıza eşlemek için:
sub ProcessEvent(App)
ok1 = App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
while ok1
App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.TYPE", "0"
App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.UNITSET_CODE", "05"
App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.UNIT_GLOBAL_CODE", "C62"
App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.UNIT_CODE", "ADET"
App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.MASTER_CODE", "TM-001"
ok1 = App.Doc.NextChild
wend
App.Doc.SaveData
end subTesis Devri Kuralı
Belirli bir özel koda (TESISDEVRI) sahip faturalarda, genel gider tutarını KDV ve net tutara dağıtan daha kapsamlı bir örnek. Farklı belge tiplerinde (fatura, irsaliye, e-fatura vergi alanları) aynı tutarı tekrar tekrar yazması nedeniyle en uzun kurallardan biridir; kendi firmanızda kullanmadan önce test ortamında denemenizi öneririm:
' Ozelkod: TESISDEVRI
sub ProcessEvent(App)
OZELKOD = App.Doc.FieldAsString("AUXIL_CODE")
If OZELKOD = "TESISDEVRI" then
rOk = App.Doc.FirstRoot
while rOk
ToplamTutarA = App.Doc.FieldAsFloat("TOTAL_NET")
ToplamTutarB = App.Doc.FieldAsFloat("TC_NET")
Geneltutar = App.Doc.FieldAsFloat("EXPENSE_DISTRB")
Geneltutarnew = CDbl(Geneltutar)
Toplambedel1 = Geneltutarnew + ToplamTutarA
Toplambedel2 = Geneltutarnew + ToplamTutarB
App.Doc.ModifyData "TOTAL_VAT", Replace(cstr(Geneltutarnew), ",", ".")
App.Doc.ModifyData "TOTAL_NET", Replace(cstr(Toplambedel1), ",", ".")
App.Doc.ModifyData "TC_NET", Replace(cstr(Toplambedel2), ",", ".")
ok1 = App.Doc.FirstChild("DISPATCHES.DISPATCH")
while ok1
App.Doc.ModifyData "TOTAL_VAT", Replace(cstr(Geneltutarnew), ",", ".")
App.Doc.ModifyData "TOTAL_NET", Replace(cstr(Toplambedel1), ",", ".")
ok1 = App.Doc.NextChild
wend
ok1 = App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
while ok1
App.Doc.ModifyData "VAT_AMOUNT", Replace(cstr(Geneltutarnew), ",", ".")
ok1 = App.Doc.NextChild
wend
ok1 = App.Doc.FirstChild("EINVOICE_EXTENSIONS.EXTENSIONS.TAXSUBTOTALS.TAXSUBTOTAL")
while ok1
App.Doc.ModifyData "TAXAMOUNT", Replace(cstr(Geneltutarnew), ",", ".")
App.Doc.ModifyData "PERCENT", 18
ok1 = App.Doc.NextChild
wend
rOk = App.Doc.NextRoot
wend
App.Doc.SaveData
end If
end sub
' Not: "Dagitilacak Toplam" alani KDV Tutari olarak girilmelidir.Detaylı Bilgi Alanını Tasarıma Getirme
Logo Tiger/Go’da malzeme veya hizmet satırına girilen “Detaylı Bilgi” metni, varsayılan olarak fatura tasarımında görünmez. Kural motorunda bu alan ITEXT olarak okunur.
Basit yöntem — tek satırlık kısa notlar için, doğrudan boş bir açıklama alanına yazmak yeterli:
sub ProcessEvent(App)
DETAY = App.Doc.FieldAsString("ITEXT")
App.Doc.ModifyData "NOTES5", DETAY
App.Doc.SaveData
end subSatır sonu korumalı yöntem — detaylı bilgi metninde birden fazla satır varsa (madde madde yazılmış bir açıklama), düz metne aktarıldığında satır sonları kaybolur. Önce satır ayraçlarını özel bir işaretleyiciyle değiştirip, tasarım tarafında bu işaretleyiciyi gerçek satır sonuna çeviren bir XSLT şablonu kullanmak gerekir.
1. Kural (her faturada çalışır):
sub ProcessEvent(App)
rOk = App.Doc.FirstRoot
while rOk
ST_DETAY = App.Doc.FieldAsString("ITEXT")
App.Doc.ModifyData "NOTES12", Replace(ST_DETAY, "\u00a6", "\\YS_ST#")
rOk = App.Doc.NextRoot
wend
App.Doc.SaveData
end sub2. Tasarımda “Genel Açıklamalar” bloğunun eklendiği yere:
<xsl:if test="//n1:Invoice/cbc:Note">
<b>Genel Açıklamalar</b><br/>
<xsl:for-each select="//n1:Invoice/cbc:Note">
<xsl:call-template name="insertBreaks">
<xsl:with-param name="pText" select="." />
</xsl:call-template>
</xsl:for-each>
</xsl:if>3. XSLT dosyasının en altına (kapanış </xsl:template> etiketinden hemen sonra):
<xsl:template match="text()" name="insertBreaks">
<xsl:param name="pText" select="."/>
<xsl:choose>
<xsl:when test="not(contains($pText, '\\YS_ST#'))">
<xsl:copy-of select="$pText"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="substring-before($pText, '\\YS_ST#')"/>
<br/>
<xsl:call-template name="insertBreaks">
<xsl:with-param name="pText" select="substring-after($pText, '\\YS_ST#')"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>\YS_ST# işaretiyle değiştirir. XSLT şablonu ise metni bu işaretten böler ve aralarına gerçek bir <br/> koyar — böylece madde madde yazılmış bir açıklama, faturada da okunaklı şekilde görünür.Fatura Tasarımı Ek Alanları (Görsel Tasarım Ek Alanları)
Tasarım Aracı, hazır alan listesinde bulunmayan ihtiyaçlar için (irsaliye numaralarını yan yana yazdırmak, sevkiyat adresini göstermek, satırdaki sipariş bilgisini bastırmak gibi) Araçlar → Görsel Tasarım Ek Alanları bölümünde kendi XSLT kod parçanızı tanımlamanızı ister. Tanımladığınız her ek alan, Tasarım Aracı’nda “Kullanıcı Tanımlı” alanlar listesinde görünür ve normal bir alan gibi sürükleyip tasarıma ekleyebilirsiniz.
Birden Fazla İrsaliye Numarasını Yan Yana Yazma
<b>İrsaliye Numaraları</b><br/>
<xsl:for-each select="//n1:Invoice/cac:DespatchDocumentReference">
<xsl:value-of select="cbc:ID"/>
<text>-</text>
</xsl:for-each>Numaranın yanına tarihi de eklemek isterseniz, cbc:IssueDate alanını gün/ay/yıl olacak şekilde parçalayıp aynı döngü içine eklemeniz yeterli:
<xsl:for-each select="//n1:Invoice/cac:DespatchDocumentReference">
<xsl:value-of select="cbc:ID"/><text>/</text>
<xsl:for-each select="cbc:IssueDate">
<xsl:value-of select="substring(.,9,2)"/>.<xsl:value-of select="substring(.,6,2)"/>.<xsl:value-of select="substring(.,1,4)"/>
</xsl:for-each>
</xsl:for-each>Ödeme Planı Tarihi
<b>Ödeme Planı Tarihleri</b><br/>
<xsl:for-each select="//n1:Invoice/cac:PaymentMeans/cbc:PaymentDueDate">
<xsl:value-of select="substring(.,9,2)"/>-<xsl:value-of select="substring(.,6,2)"/>-<xsl:value-of select="substring(.,1,4)"/>
<text> </text>
</xsl:for-each>Sevkiyat Hesabı Unvanı, Adresi ve VKN’si
Bu alanlar, fatura detaylarındaki “Sevkiyat Hesabı” alanına vergi/TC kimlik numarası girildiğinde UBL’e BuyerCustomerParty altında ayrı bir kayıt olarak düşer. VKN en kısası:
VKN:
<xsl:value-of select="n1:Invoice/cac:BuyerCustomerParty/cac:Party/cac:PartyIdentification/cbc:ID"/>Unvan (cac:Person altında ad/soyad parçaları) ve adres (cac:PostalAddress altında cadde, kapı no, ilçe, il) alanları daha uzundur çünkü her alt alanı ayrı ayrı okuyup birleştirmeniz gerekir:
<!-- Sevkiyat unvani / ad-soyad -->
<xsl:for-each select="//n1:Invoice/cac:BuyerCustomerParty/cac:Party">
<xsl:if test="cac:PartyName">
<xsl:value-of select="cac:PartyName/cbc:Name"/><br/>
</xsl:if>
<xsl:for-each select="cac:Person">
<xsl:value-of select="cbc:FirstName"/> <xsl:value-of select="cbc:FamilyName"/>
</xsl:for-each>
</xsl:for-each>
<!-- Sevkiyat adresi -->
<xsl:for-each select="//n1:Invoice/cac:BuyerCustomerParty/cac:Party/cac:PostalAddress">
<xsl:value-of select="cbc:StreetName"/>
<xsl:if test="cbc:BuildingNumber"> No:<xsl:value-of select="cbc:BuildingNumber"/></xsl:if>
<xsl:value-of select="cbc:CitySubdivisionName"/> / <xsl:value-of select="cbc:CityName"/>
</xsl:for-each>Alıcı / Satıcı / Üretici Kodu (Satır Bazlı)
Bu üç alan InvoiceLine içinde yer aldığı için yalnızca satır tasarımında kullanılabilir:
<!-- Alıcı Kodu -->
<xsl:value-of select="./cac:Item/cac:BuyersItemIdentification/cbc:ID"/>
<!-- Satıcı Kodu -->
<xsl:value-of select="./cac:Item/cac:SellersItemIdentification/cbc:ID"/>
<!-- Üretici Kodu -->
<xsl:value-of select="./cac:Item/cac:ManufacturersItemIdentification/cbc:ID"/>Kural İle Eklenen Serbest Alanı Tasarımda Gösterme
Logo Connect’ten bir kuralla UBL’e AdditionalDocumentReference olarak serbest bir alan eklediğinizde, bu şu şekilde XML’e düşer:
<cac:AdditionalDocumentReference>
<cbc:ID>AS-003</cbc:ID>
<cbc:IssueDate>2026-01-17</cbc:IssueDate>
<cbc:DocumentType>CARIKOD</cbc:DocumentType>
</cac:AdditionalDocumentReference>Bunu tasarıma çekmek için, UBL’de birden fazla AdditionalDocumentReference olabileceğini unutmadan, DocumentType değerine göre filtreleyen bir if kısıtı kullanmanız gerekir:
<xsl:for-each select="//n1:Invoice/cac:AdditionalDocumentReference">
<xsl:if test="cbc:DocumentType = 'CARIKOD'">
<xsl:value-of select="cbc:ID"/>
</xsl:if>
</xsl:for-each>DocumentType etiketindeki metin, kuralda ve tasarımdaki if koşulunda birebir aynı yazılmalı. Farklı bir ek alan için farklı bir DocumentType değeri (örn. BELGENO) kullanıp ayrı bir tasarım ek alanı tanımlayarak birden çok serbest alanı karıştırmadan yönetebilirsiniz.Satırdaki İrsaliye / Sipariş Numarası ve Tarihi
<!-- Satırdaki irsaliye numarası -->
<xsl:for-each select="./cac:DespatchLineReference">
<xsl:value-of select="./cac:DocumentReference/cbc:ID"/>
</xsl:for-each>
<!-- Satırdaki sipariş numarası (müşteri sipariş no için cbc:ID kullanın) -->
<xsl:for-each select="./cac:OrderLineReference">
<xsl:value-of select="./cac:OrderReference/cbc:SalesOrderID"/>
</xsl:for-each>Tarihler için aynı yapıya substring ile gün/ay/yıl parçalama eklenir — yukarıdaki irsaliye tarihi örneğindeki kalıpla birebir aynı mantık kullanılır.
İhracat Faturalarında Navlun / Sigorta Tutarı
İhracat profilindeki (ProfileID = 'IHRACAT') faturalarda navlun ve sigorta bedelleri AllowanceCharge altında, AllowanceChargeReason alanına göre ayırt edilerek tutulur:
<xsl:if test="//n1:Invoice/cbc:ProfileID = 'IHRACAT'">
<xsl:for-each select="//n1:Invoice/cac:AllowanceCharge">
<xsl:if test="cbc:AllowanceChargeReason = 'Navlun'">
<xsl:value-of select="format-number(cbc:Amount, '###.##0,00', 'european')"/>
<xsl:if test="cbc:Amount/@currencyID = 'TRY'"> TL</xsl:if>
</xsl:if>
</xsl:for-each>
</xsl:if>“Sigorta” için aynı bloğu AllowanceChargeReason = 'Sigorta' koşuluyla tekrarlayın. Dövizli faturada bu tutarın TL karşılığını göstermeniz gerekirse, cbc:Amount değerini cac:PricingExchangeRate/cbc:CalculationRate ile çarparak formatlayabilirsiniz.
Veritabanından Ek Veri Çeken Kurallar (ve Bunları Güvenli Yazmak)
Bazı ihtiyaçlar, faturanın kendi alanlarında değil, veritabanındaki başka bir tabloda karşılığını bulur — İngilizce kod/açıklama, iş yeri adresi, ürün menşei, cari özel kod gibi. Bu kurallar hep aynı iskeleti kullanır: ADODB ile ayrı bir bağlantı açılır, sorgu çalıştırılır, sonuç ilgili alana yazılır.
sub ProcessEvent(App)
strDBUser = "kural_kullanici" ' salt-okunur, sinirli yetkili kullanici
strDBPass = "***" ' asla acik metin yazmayin
strDBServer = "SUNUCU_ADI"
strDBName = "VERITABANI_ADI"
Set conn = CreateObject("ADODB.Connection")
conn.ConnectionString = "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=" + _
strDBUser + ";Password=" + strDBPass + ";Initial Catalog=" + strDBName + ";Data Source=" + strDBServer
conn.Open
Set rs = CreateObject("adodb.recordset")
rs.ActiveConnection = conn
' -- Ornek: Malzemenin ingilizce kod/aciklamasini LNGEXCSETS'ten okuma --
ok1 = App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
while ok1
Ref = App.Doc.FieldAsInteger("TRANSACTIONS.TRANSACTION.MASTER_ORGLOGICALREF")
strQuery = "SELECT A.FIELDCONT,B.FIELDCONT FROM LG_001_LNGEXCSETS A,LG_001_LNGEXCSETS B " & _
"WHERE A.DOCREF=B.DOCREF AND A.DOCID=1 AND A.LANGID=2 AND A.FIELDID=10 " & _
"AND B.FIELDID=1 AND A.DOCREF=" & CStr(Ref)
rs.Open strQuery, conn
strCode = rs.Fields(0).value
strDesc = rs.Fields(1).value
App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.MASTER_CODE", strCode
App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.MASTER_DEF", strDesc
rs.close
App.Doc.SaveData
ok1 = App.Doc.NextChild
wend
conn.close
end subAynı iskeletle çözülen diğer örnekler:
- Cari özel kod alanının PROFILE_ID’ye getirilmesi —
SELECT PROFILEID FROM LG_001_CLCARD WHERE LOGICALREF = ... - İş yeri bazlı adres bilgilerinin e-faturaya getirilmesi —
SELECT STREET, ROAD, DOORNR, DISTRICT, CITY FROM L_CAPIDIV WHERE FIRMNR=1 AND NR IN (SELECT BRANCH FROM LG_001_03_INVOICE WHERE FICHENO = ...) - Ürün menşei / malzeme özel kod1’in satır açıklamasına getirilmesi (ihracat fatura koşullu) —
SELECT DEFINITION_ FROM LG_001_SPECODES WHERE ... AND SPECODE IN (SELECT PRODCOUNTRY/SPECODE FROM LG_001_ITEMS WHERE LOGICALREF = ...) - E-arşiv faturada malzeme barkodunun satıra getirilmesi —
UNITBARCODE,ITMUNITA,ITEMS,STLINEveINVOICEtablolarınınLEFT OUTER JOINile birleştirilmesiyle malzeme koduna karşılık gelen barkodu bulur.
SELECT yetkisi olan, ayrı ve sınırlı bir SQL kullanıcısı tanımlayın; sa gibi yönetici yetkili bir hesabı asla kurala gömmeyin.UQUERY_GETFLD ile Cari Özel Kod 5’in Cari Açıklamaya Yazılması — ayrı bir veritabanı bağlantısı açmadan, Logo Connect’in kendi UQUERY_GETFLD metoduyla da aynı işi yapabilirsiniz:
sub ProcessEvent(App)
ClCode = App.Doc.FieldAsString("ARP_CODE")
If ClCode = "CARI-KODUNUZ" Then
rOk = App.Doc.FirstRoot
While rOk
ClOzelCode5 = App.UQUERY_GETFLD(15, "SPECODE5", 16, 52, FALSE, "CODE='"+ClCode+"'")
App.Doc.ModifyData "ARP_DEF", ClOzelCode5
rOk = App.Doc.NextRoot
Wend
end if
App.Doc.SaveData
end subUQUERY_GETFLD Metodu
UQUERY_GETFLD(portNr, fldName, fldSz, fldType, isDate, whrCls) — Logo Connect’in ayrı bir veritabanı bağlantısı açmadan, Logo’nun kendi tablolarından tek bir alan okumasını sağlayan kestirme yoldur. Parametreler:
- portNr: Sorgulanacak tabloyu belirten port numarası (aşağıdaki tabloda en sık kullanılanlar var)
- fldName: Döndürülecek alanın adı
- fldSz: Döndürülecek alanın boyutu
- fldType: Alan tipi —
BYTE=1, SMALLINT=2, INT=3, REAL=5, DOUBLE=6, EXTENDED=7, STRING=51, CSTRING=52, WSTRING=53 - isDate: Dönecek alan tarih tipinde mi (TRUE/FALSE)
- whrCls: SQL
WHEREkoşulu, metin olarak
| Port | Tablo |
|---|---|
| 1 | Stok kartları |
| 2 | Hizmet kartları |
| 5 | Ambar toplamları |
| 8 | Stok fişleri |
| 9 | Stok hareket |
| 12 | Sipariş fişi |
| 13 | Sipariş satırı |
| 14 | Fatura |
| 15 | Cari hesap kartı |
| 16 | Cari hesap hareket |
| 18 | Cari hesap risk rakamları |
| 19 | Cari hesap toplamlar |
| 20 | Ödeme planı |
| 21 | Ödeme planı satırı |
| 23 | Banka kartı |
| 24 | Banka hesap |
| 25 | Banka hareket |
| 27 | Muhasebe kart |
| 28 | Muhasebe fiş |
| 29 | Muhasebe hareket |
| 33 | Kasa kart |
| 34 | Kasa hareket |
| 35 | Çek / senet |
| 38 | Fiyat listesi |
| 40 | Özel kod tanımları |
| 42 | Müstahsil makbuzu |
| 47 | Sabit kıymet kayıtları |
| 58 | Sevkiyat bilgileri |
| 60 | Cari hesap genel toplamları |
| 70 | Satış elemanları |
| 81 | Satış fırsatları |
| 83 | Teklifler |
| 106 | Çalışan tanımları |
| 111 | Seri / lot numaraları |
| 117 | Malzeme tedarikçileri |
| 130 | Birim setleri tanımları |
| 157 | Üretim emri |
| 188 | Üretim reçeteleri |
| 205 | Kampanya kartları |
| 207 | Genel gider kartları |
| 226 | Talep fişi |
| 236 | Paketleme fişleri |
| 246 | Geri ödeme planı |
| 293 | E-Beyanname kayıtları |
| 298 | Cari hesap teminat mektubu risk bilgileri |
| 305 | Malzeme özellik setleri |
| 307 | Malzeme varyantları |
| 316 | Ürün katalog tanımları |
| 330 | Banka kredileri kartları |
| 350 | Garanti kayıtları |
| 355 | Satınalma siparişi şablon kartı |
Kural Koşullarında Kullanılan Operatörler
Kuralın çalışacağı koşulları tanımlarken alan değerlerini karşılaştırmak için aşağıdaki operatörlerden yararlanılır.
| Grup | Operatör | Açıklama |
|---|---|---|
| Matematiksel | + | Toplama |
- | Çıkarma | |
* | Çarpma | |
/ | Bölme | |
| Karşılaştırma | = | Eşit |
<> | Eşit değil | |
> | Büyük | |
>= | Büyük eşit | |
< | Küçük | |
<= | Küçük eşit | |
| Mantıksal | AND | Tüm şartlar doğru olmalı |
| OR | En az bir şart doğru olmalı | |
| NOT | Sonucu tersine çevirir | |
| XOR | Yalnızca bir şart doğruysa sonuç doğru | |
| Koşul | IFTHEN | IFTHEN(Koşul?Doğruysa;Yanlışsa) |
| SWITCH | SWITCH(ifade?Değer1=Sonuç1;DeğerN=SonuçN;...) | |
| Metin | MID | MID(String,Başlangıç,Bitiş) — belirli aralıktaki karakterleri alır |
| LEN | Metnin karakter sayısını verir | |
| % | NUMBER='A%' gibi, belirtilen önekle başlıyor mu kontrolü | |
| Özel | TODAY | Terminalin sistem tarihini metin olarak getirir |
İki örnek kullanım:
' Fis numarasi 7 karakterse basina 'X', degilse 'Y' ekler
NUMBER = IFTHEN(LEN(NUMBER)=7 ? 'X'+NUMBER ; 'Y'+NUMBER)
' Dokuman izleme numarasina gore harf atar
NUMBER = SWITCH(DOC_NUMBER ? '01'='A' ; '02'='B' ; '03'='D')CNB Kural Kütüphanesi (Gerçek Üretim Kuralları)
Aşağıdaki 13 kural, gerçek bir Logo Connect kural kütüphanesinden (kod öneki CNB00xx) derlenmiştir — yalnızca e-Fatura, e-Arşiv ve e-İrsaliye ile ilgili olanlar seçilmiştir (sipariş fişi, cari hesap fişi, banka fişi, kasa işlemi, çek/senet bordrosu gibi e-devlet dışı doküman türlerine ait kurallar kapsam dışı bırakılmıştır). Gerçek şifre, e-posta ve IBAN gibi kimlik bilgileri örnek değerlerle değiştirilmiştir.
1. Banka Bilgileri Aktarımı
e-Fatura (Giden) · Onaylanmadan Önce (Giden)
sub ProcessEvent(App)
rOk=App.Doc.FirstRoot
while rOk
DTUR = App.Doc.FieldAsString("TRCURR_GLOBAL_CODE")
App.Doc.ModifyData "NOTES5", "-------------------------------------------------------------------------------------------------"
App.Doc.ModifyData "NOTES6", "--------------Banka Bilgilerimiz----------------------------------------"
IF DTUR="" THEN
App.Doc.ModifyData "NOTES7", "BANKA ADI ŞUBE ADI HESAP ADI ------ TL ------ TR00 0000 0000 0000 0000 0000 00"
App.Doc.ModifyData "NOTES8", "BANKA ADI ŞUBE ADI HESAP ADI"
END IF
IF DTUR="USD" THEN
App.Doc.ModifyData "NOTES7", "BANKA ADI ŞUBE ADI HESAP ADI ------ USD ------ TR00 0000 0000 0000 0000 0000 00"
App.Doc.ModifyData "NOTES8", "BANKA ADI ŞUBE ADI HESAP ADI"
END IF
IF DTUR="EUR" THEN
App.Doc.ModifyData "NOTES7", "BANKA ADI ŞUBE ADI HESAP ADI ------ EUR ------ TR00 0000 0000 0000 0000 0000 00"
App.Doc.ModifyData "NOTES8", "BANKA ADI ŞUBE ADI HESAP ADI"
END IF
App.Doc.ModifyData "NOTES11", "-------------------------------------------------------------------------------------------------"
rOk=App.Doc.NextRoot
wend 'MSGBOX(DOKUMANNO) 'App.Doc.ModifyData NOTES1,NOTES1+DOKUMANNO
App.Doc.SaveData
end sub2. SATIR AÇIKLAMAYA VARYANT EKLEME
e-Fatura (Giden) · Onaylanmadan Önce (Giden)
sub ProcessEvent(App)
' ÖRNEK : Fatura satırındaki açıklama alanı üzerinden veri gönderme
'CariKod = App.Doc.FieldAsString("ARP_CODE") ' Bu örneğin sadece bir Cari için (CARI.01 için) çalışmasını istiyoruz.
' Bu yüzden öncelikle faturadaki carinin ne olduğunu XML üzerinden okuyoruz
'if CariKod = "CARI.01" then ' Fatura XML i üzerinden okuduğumuz carinin CARI.01 olup olmadığını kontrol ediyoruz
okay=App.Doc.FirstChild("TRANSACTIONS.TRANSACTION") ' Faturanın ilk satırına konumlanılıyor.
while okay ' Eğer faturanın bir satırı varsa okay değişkeni true(başarılı) sonucunu alıyor.
' bir sonraki satıra her başarılı konumlanmada aşağıdaki while bloğu bir kez dönmektedir.
sType = App.Doc.FieldAsInteger("TRANSACTIONS.TRANSACTION.TYPE") ' Satır tipi okunuyor
if sType = 0 then ' Eğer satır tipi = 0 ise (malzemeyse) okuma-yazma işlemleri başlıyor
strLineSpeCode1 = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.VARIANTNAME") ' istenilen veriler ERP XML i içerisinden okunuyor
strLineSpeCode2 = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.AUXIL_CODE2")
strLineDeliveryCode = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.DELVRY_CODE")
' Veriler tek bir alan (satır açıklaması) üzerinden aktarılacağı için yukarıda toplanan veriler
' birleştiriliyor. Birleştirme esnasında verilerin birbiriyle karışmaması için ";" ayracını yerleştiriyoruz
strDescription = strLineSpeCode1 '+ ";" + strLineSpeCode2 + ";" + strLineDeliveryCode
App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.DESCRIPTION", strDescription ' birleştirilen veri, DESCRIPTION alanına yazılıyor
end If
okay=App.Doc.NextChild ' bir sonraki satır çağırılıyor.
' eğer çağırılabilirse okay = true değeri alıp dönü devam ediyor
' eğer çağırılamazsa, yani son satırda isek okay = false değeri alır ve döngü sona erer
wend
App.Doc.SaveData ' Yapılan değişiklikler kaydediliyor
'end if
end sub3. SEVKİYAT ADRESİ
e-Fatura (Giden) · Onaylanmadan Önce (Giden)
sub ProcessEvent(App)
strDBUser = "sa"
strDBPass = "***"
strDBServer = "SRVAPP"
strDBName = "TIGERENTERPRISE"
Set conn = CreateObject("ADODB.Connection")
conn.ConnectionString = "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=" + strDBUser + ";Password=" + strDBPass + ";Initial Catalog=" + strDBName+ ";Data Source=" + strDBServer
conn.Open
Set rs = CreateObject("adodb.recordset")
rs.ActiveConnection = conn
Ref = App.Doc.FieldAsString("SHIPLOC_CODE")
CLCODE= App.Doc.FieldAsString("ARP_CODE")
strQuery = "SELECT SEVKADR FROM CNB_EFATURA_SEVKADRES_118 WHERE CODE='" + Ref + "' AND CARIKOD='"+ CLCODE +"'"
rs.Open strQuery, conn
strname = rs.Fields(0).value
App.Doc.ModifyData "NOTES10", "SEVKİYAT ADRESİ: " + strname
rs.close
App.Doc.SaveData
conn.close ' ADODB bağlantısı kapatılıyor
end sub4. Gelen faturadaki bazı verileri boşalt
Fatura · Kaydedilmeden Önce
sub ProcessEvent(App)
rOk=App.Doc.FirstRoot
while rOk
App.Doc.ModifyData "GL_CODE", ""
App.Doc.ModifyData "PAYMENT_CODE", ""
App.Doc.ModifyData "SALESMAN_CODE", ""
App.Doc.ModifyData "OHP_CODE", ""
App.Doc.ModifyData "PROJECT_CODE", ""
App.Doc.ModifyData "SHIPLOC_CODE", ""
ok1=App.Doc.FirstChild("DISPATCHES.DISPATCH")
while ok1
App.Doc.ModifyData "OHP_CODE", ""
App.Doc.ModifyData "PROJECT_CODE", ""
App.Doc.ModifyData "SHIPLOC_CODE", ""
App.Doc.ModifyData "PAYMENT_CODE", ""
App.Doc.ModifyData "SALESMANCODE", ""
App.Doc.ModifyData "GL_CODE", ""
ok2=App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
while ok2
App.Doc.ModifyData "OHP_CODE2", ""
App.Doc.ModifyData "OHP_CODE1", ""
App.Doc.ModifyData "PRCLISTREF", 0
App.Doc.ModifyData "PROJECT_CODE", ""
App.Doc.ModifyData "SALEMANCODE", ""
App.Doc.ModifyData "PAYMENT_CODE", ""
App.Doc.ModifyData "GL_CODE2", ""
App.Doc.ModifyData "GL_CODE1", ""
ok2=App.Doc.NextChild
wend
ok1=App.Doc.NextChild
wend
ok1=App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
while ok1
App.Doc.ModifyData "PROJECT_CODE", ""
App.Doc.ModifyData "OHP_CODE2", ""
App.Doc.ModifyData "PURCH_GL_CODE", ""
App.Doc.ModifyData "PRCLISTREF", 0
App.Doc.ModifyData "OHP_CODE1", ""
App.Doc.ModifyData "PAYMENT_CODE", ""
App.Doc.ModifyData "SALEMANCODE", ""
App.Doc.ModifyData "GL_CODE2", ""
App.Doc.ModifyData "GL_CODE1", ""
ok1=App.Doc.NextChild
wend
rOk=App.Doc.NextRoot
wend
App.Doc.SaveData
end sub5. Fatura üzerinde değişiklik yap 1
Fatura · Onaylanmadan Önce
sub ProcessEvent(App)
qry ="INVOICE.TRANSACTIONS.AsString.TRANSACTION.INVOICE.TYPE=2"
if App.Doc.RunQuery(qry, false) then
rOk=App.Doc.FirstRoot
while rOk
ok1=App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
while ok1
App.Doc.ModifyData "DISCEXP_CALC", 1
App.Doc.ModifyData "MASTER_CODE", ""
ok1=App.Doc.NextChild
wend
rOk=App.Doc.NextRoot
wend
App.Doc.SaveData
end if
end sub6. Birim setinde kullanılan birimi adet’e çevirir
Fatura · Kaydedilmeden Önce
sub ProcessEvent(App)
okay=App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
while okay
sType = App.Doc.FieldAsInteger("TRANSACTIONS.TRANSACTION.TYPE")
if sType = 0 then
App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.UNIT_CODE", "ADET"
App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.UNITSET_CODE", "ADET1"
end if
okay=App.Doc.NextChild
wend
App.Doc.SaveData
end sub7. Fatura kart tipindeki indirim masraf
Fatura · Kaydedilmeden Önce
sub ProcessEvent(App)
okay=App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
while okay
sType = App.Doc.FieldAsInteger("TRANSACTIONS.TRANSACTION.TYPE")
sMaterCode = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.MASTER_CODE")
if (((sType = 2) OR (sType = 3)) AND (sMaterCode <> "")) then
App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.MASTER_CODE", ""
App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.DISCEXP_CALC", 1
end if
okay=App.Doc.NextChild
wend
App.Doc.SaveData
end sub8. Fatura Kural Tanımı
Fatura · Onaylanmadan Önce
'unity login bilgileri
Public const unityUser = "LOGO"
Public const unityPass = ""
'ldx login bilgileri
Public const ldxUser = "LOGO"
Public const ldxPass = ""
'alıcı logoid
Public const receiverLOGOID = "YJİ"
'Üretici Kodu
Public const speCode = "LOGO"
'Gönderilecek fatura tran kodları
Public const invTrCodes = "2, 3, 7, 8, 14"
function GetADMOwnerDept(UObj, CityCode)
set qry = uObj.NewQuery
qStr = "Select DEPARTMENTID from LDX_ADMOWNERS WHERE CITYCODE = CAST('"&CityCode&"' AS int)"
AddDebugFile(qStr)
qry.Statement = qStr
res = qry.OpenDirect
res = qry.First
if res then
DeptNr = qry.QueryFields(0).Value
DeptCode = "XXX"
Select Case DeptNr
Case 1
DeptCode = "MAR"
Case 2
DeptCode = "ANA"
Case 3
DeptCode = "EGE"
End Select
AddDebugFile("Bulunan fatura clCode = "&DeptCode)
end if
qry.Close
qry = Empty
GetADMOwnerDept =DeptCode
end function
function GetFormatedCityCode(CityCode)
prefix = CityCode
do while len(prefix) < 3
prefix = "0"+prefix
Loop
GetFormatedCityCode = prefix
end function
function GetFormatedCLCodeNumber(CLNumber)
prefix = ""
prefix = CStr(CLNumber)
do while len(prefix) < 4
prefix = "0"+prefix
Loop
GetFormatedCLCodeNumber = prefix
end function
function GetMaxCLCodeNumber(UObj,FirmNr, DeptCode)
set qry = uObj.NewQuery
qStr = "Select MAX(CODE) from " + GetFirmPrefix(FirmNr) + "CLCARD MAIN WHERE (CARDTYPE<>22) AND (CODE LIKE '" & DeptCode & "%')"
AddDebugFile(qStr)
qry.Statement = qStr
res = qry.OpenDirect
res = qry.First
TotStr=""
if res then
MaxClCode = qry.QueryFields(0).Value
res = NOT ((isnull(MaxClCode)) OR (MaxClCode = ""))
end if
if res then
MaxClCode = qry.QueryFields(0).Value
AddDebugFile("Bulunan Max clCode = "&MaxClCode)
TotStr = ""
For i = Len(MaxClCode) To 1 Step -1
a = Mid(MaxClCode, i, 1)
If isnumeric(a) Then
TotStr = CStr(a) + TotStr
Else
if (Len(TotStr)=0) then
TotStr = "1"
end if
Exit For
End If
Next
TotStr = TotStr + 1
else
TotStr="1"
end if
qry.Close
qry = Empty
AddDebugFile("Kodlamada kullanılacak numara = "&TotStr)
GetMaxCLCodeNumber=TotStr
end Function
function GetARPCode(UObj, CityCode,FirmNr)
Part1 = GetADMOwnerDept(UObj,CityCode)
Part2 = GetFormatedCityCode(CityCode)
dummystr = GetMaxCLCodeNumber(UObj, FirmNr, Part1)
AddDebugFile("formatlanmamış kullanılacak numara : " & dummystr)
dummystr1 = GetFormatedCLCodeNumber(dummystr)
AddDebugFile("formatlanmış kullanılacak numara : " & dummystr1)
Part3 = dummystr1
dummystr = Part1 & "." & Part2 & "." & Part3
AddDebugFile(dummystr)
GetARPCode = dummystr
end function
'////////////////////////////////////////////////////////////////
'*********************************
function GetFirmPrefix(uFirm)
prefix = CStr(uFirm)
do while len(prefix) < 3
prefix = "0"+prefix
Loop
GetFirmPrefix = "LG_"+prefix+"_"
end function
'*********************************
function GetFullPrefix(uFirm, uPeriod)
prefix = CStr(uFirm)
do while len(prefix) < 3
prefix = "0"+prefix
Loop
if uPeriod < 10 then
prefix = prefix + "_0"+ CStr(uPeriod)
else
prefix = prefix + "_"+ CStr(uPeriod)
end if
prefix = "LG_"+prefix +"_"
GetFullPrefix = prefix
end function
'*********************************
sub AddDebugFile(str)
set fso = CreateObject("Scripting.FileSystemObject")
set ts = fso.OpenTextFile ("c:\Debug.txt", 8, True)
ts.WriteLine (str)
ts.Close()
fso = Null
end sub
'*********************************
sub ProcessEvent(App)
WorkSpaceNr = 951
FirmNr = 951
PeriodNr = 1
AddDebugFile("****************************************************************")
AddDebugFile(" !!! Script Rule LOGO-SERVER !!! Başladı : " & now())
AddDebugFile("****************************************************************")
MyArpCode = App.Doc.FieldAsString("ARP_CODE")
MyclCode = App.Doc.FieldAsString("EXTCLCODE")
MyclDef = App.Doc.FieldAsString("EXTCLDEF")
MyclAddr1 = App.Doc.FieldAsString("EXTCLADDR1")
MyclAddr2 = App.Doc.FieldAsString("EXTCLADDR2")
MyclTaxNr = App.Doc.FieldAsString("EXTCLTAXNR")
MyclTaxOffice = App.Doc.FieldAsString("EXTCLTAXOFFICE")
MyclCity = App.Doc.FieldAsString("EXTCLCITY")
MyclCityCode = App.Doc.FieldAsString("EXTCLCITYCODE")
MyclCountry = App.Doc.FieldAsString("EXTCLCOUNTRY")
MyclCountryCode = App.Doc.FieldAsString("EXTCLCOUNTRYCODE")
AddDebugFile("gelen faturadaki EXTCLCITYCODE bilgisi : " & MyclCityCode)
AddDebugFile("gelen faturadaki EXTCLTAXNR bilgisi : " & MyclTaxNr)
if (MyclCityCode = "") AND (MyclCityCode = null) then
msgbox("Şehir bilgisi alınamadı!")
exit sub
end if
if (MyclTaxNr = "") AND (MyclTaxNr = null) then
msgbox("Vergi Numarası alınamadı!")
exit sub
end if
if (MyArpCode = "") AND (MyArpCode = null) then
msgbox("Cari Hesap alınamadı!")
exit sub
end if
if (MyclCode = "") AND (MyclCode = null) then
msgbox("Cari Hesap alınamadı!")
exit sub
end if
'if (MyclCode <> MyArpCode) then
' msgbox("alınan cari ile fatura carisi uyumsuz!")
' exit sub
'end if
set uObj = CreateObject("UnityObjects.UnityApplication")
if isnull(uObj) then
msgbox("Logo Objects yaratılamıyor!")
exit sub
end if
if Not uObj.Login(unityUser, unityPass, FirmNr) then 'Unity kullanıcı adı şifresi ve firma
msgbox("Logo Objects Login Err Nr: " & uObj.GetLastError & uObj.GetLastErrorString)
exit sub
end if
if NOT uObj.loggedIn then
msgbox("Logo Objects ile bağlantı kurulamadı!")
exit sub
End if
set qry = uObj.NewQuery
qStr = "Select CODE,DEFINITION_,ADDR1,ADDR2,TAXNR, TAXOFFICE, CITY, CITYCODE, COUNTRY,COUNTRYCODE from " + GetFirmPrefix(FirmNr) + "CLCARD MAIN WHERE (CARDTYPE<>22) AND (TAXNR='"&MyclTaxNr&"')"
AddDebugFile(qStr)
qry.Statement = qStr
res = qry.OpenDirect
res = qry.First
if res then
clCode = qry.QueryFields(0).Value
dummystr= "Bulunan fatura clCode = "&clCode
AddDebugFile(dummystr)
App.Doc.ModifyData "ARP_CODE", clCode
AddDebugFile("Gelen faturadaki cari hesap bilgisi değiştirildi.")
App.Doc.SaveData
AddDebugFile("Fatura XML dosyasında yapılan değişiklikler kaydedildi.")
else
Set ar_ap = uObj.NewDataObject(30)
ar_ap.New
If IsEmpty(ar_ap) Then
MsgBox("Objects can not create")
Exit Sub
End If
ar_ap.DataFields.FieldByName("ACCOUNT_TYPE").Value = 3
MyCityCode = MyclCityCode
MyARPCode = GetARPCode(UObj,MyCityCode, FirmNr)
ar_ap.DataFields.FieldByName("CODE").Value =MyARPCode
ar_ap.DataFields.FieldByName("TITLE").Value = MyclDef
ar_ap.DataFields.FieldByName("ADDRESS1").Value = MyclAddr1
ar_ap.DataFields.FieldByName("ADDRESS2").Value = MyclAddr2
ar_ap.DataFields.FieldByName("CITY_CODE").Value = MYclCityCode
ar_ap.DataFields.FieldByName("CITY").Value = MyclCity
ar_ap.DataFields.FieldByName("COUNTRY_CODE").Value = MyclCountryCode
ar_ap.DataFields.FieldByName("COUNTRY").Value = MyclCountry
ar_ap.DataFields.FieldByName("TAX_ID").Value = MYclTaxNr
ar_ap.DataFields.FieldByName("TAX_OFFICE").Value = MyclTaxOffice
'ar_ap.DataFields.FieldByName("TAX_OFFICE_CODE").Value = vergi kodu
ar_ap.DataFields.FieldByName("CORRESP_LANG").Value = 1
ar_ap.DataFields.FieldByName("CREDIT_TYPE").Value = 1
ar_ap.DataFields.FieldByName("RISKFACT_CHQ").Value = 1
ar_ap.DataFields.FieldByName("RISKFACT_PROMNT").Value = 1
'ar_ap.DataFields.FieldByName("ORD_RISK_TOTAL").Value = 2827.28
ar_ap.DataFields.FieldByName("CL_ORD_FREQ").Value = 1
'ar_ap.DataFields.FieldByName("LOGOID").Value = YJİ
'ar_ap.DataFields.FieldByName("INVOICE_PRNT_CNT").Value = 1
ar_ap.DataFields.FieldByName("PURCHBRWS").Value = 1
ar_ap.DataFields.FieldByName("SALESBRWS").Value = 1
ar_ap.DataFields.FieldByName("IMPBRWS").Value = 1
ar_ap.DataFields.FieldByName("EXPBRWS").Value = 1
ar_ap.DataFields.FieldByName("FINBRWS").Value = 1
If ar_ap.Post Then
AddDebugFile("!!! CARİ Hesap EKLENDİ !!!")
AddDebugFile("Oluşturulan Cari Kodu " & MyARPCode)
App.Doc.ModifyData "ARP_CODE", MyARPCode
App.Doc.SaveData
else
If ar_ap.ErrorCode <> 0 Then
MsgBox ("DB Error : (" + CStr(ar_ap.ErrorCode) + ") - " + ar_ap.ErrorDesc)
Else
If ar_ap.ValidateErrors.Count > 0 Then
For i = 0 To ar_ap.ValidateErrors.Count - 1
MsgBox ("XML Error : (" + CStr(ar_ap.ValidateErrors.Item(i).ID) + ") - " + ar_ap.ValidateErrors.Item(i).Error)
Next
End If
End If
End If
ar_ap = Empty
end if
qry.Close
qry = Empty
AddDebugFile("****************************************************************")
AddDebugFile(" !!! Script Rule - LOGO SERVER !!! Bitti : " & now())
AddDebugFile("****************************************************************")
AddDebugFile("****************************************************************")
AddDebugFile("****************************************************************")
end sub9. Varyant Bilgi Boşalt
Fatura · İmzalanmadan/Onaylanmadan Önce
sub ProcessEvent(App)
rOk=App.Doc.FirstRoot
while rOk
ok1=App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
while ok1
App.Doc.ModifyData "VARIANTCODE", " "
App.Doc.ModifyData "VARIANTNAME", " "
ok1=App.Doc.NextChild
wend
rOk=App.Doc.NextRoot
wend
App.Doc.SaveData
end sub10. SATIŞ ELEMANI
Fatura · Kaydedilmeden Önce
sub ProcessEvent(App)
sCode = App.Doc.FieldAsString("SALESMAN_CODE")
sDef = App.Doc.FieldAsString("SALESMAN_DEF")
if (sCode<>"") then
salesman = App.UQuery_GetFld(70, CODE, 24, 52, FALSE, "CODE='"+sCode+"'")
if (saleman="") then
App.UQuery_Insert 70, "CODE, DEFINITION_, CARDTYPE, ACTIVE, USERID, FIRMNR, DIVISID, DEPTID, TYP", "'"+sCode+"','"+sDef+"',0,0,1," + CStr(App.FirmNr)+",0,0,0"
end if
end if
okay=App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
while okay
sCode = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.SALEMANCODE")
sDef = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.SALESMAN_DEF")
if (sCode<>"") then
salesman = App.UQuery_GetFld(70, CODE, 24, 52, FALSE, "CODE='"+sCode+"'")
if (saleman="") then
App.UQuery_Insert 70, "CODE, DEFINITION_, CARDTYPE, ACTIVE, USERID, FIRMNR, DIVISID, DEPTID, TYP", "'"+sCode+"','"+sDef+"',0,0,1," + CStr(App.FirmNr)+",0,0,0"
end if
end if
okay=App.Doc.NextChild
wend
end sub11. FATURA GONDER KURAL
Fatura · İmzalanmadan/Onaylanmadan Önce
sub ProcessEvent(App)
TBL_ORFICHE = 12
TBL_ORFLINE = 13
intFirmNr = App.UObject.CurrentFirm
intPeriod = App.UObject.ActivePeriod
tblOrfiche = App.UObject.GetTableName(TBL_ORFICHE, intFirmNr, intPeriod)
tblOrfline = App.UObject.GetTableName(TBL_ORFLINE, intFirmNr, intPeriod)
rOk=App.Doc.FirstRoot
while rOk
App.Doc.RemoveChild "GL_CODE"
App.Doc.RemoveChild "PAYMENT_CODE"
App.Doc.RemoveChild "SALESMAN_CODE"
App.Doc.RemoveChild "SALESMAN_DEF"
App.Doc.RemoveChild "OHP_CODE"
App.Doc.RemoveChild "PROJECT_CODE"
App.Doc.RemoveChild "SHIPLOC_CODE"
App.Doc.RemoveChild "ARP_CODE_SHPM"
App.Doc.RemoveChild "SHIPMENT_TYPE"
App.Doc.RemoveChild "SHIPPING_AGENT"
App.Doc.RemoveChild "TRADING_GRP"
App.Doc.RemoveChild "TRACK_NR"
App.Doc.RemoveChild "DOC_TRACK_NR"
App.Doc.RemoveChild "PROJECT_CODE"
App.Doc.RemoveChild "OHP_CODE"
App.Doc.RemoveChild "AUXIL_CODE"
App.Doc.RemoveChild "AUTH_CODE"
App.Doc.RemoveChild "FRG_TYP_CODE"
App.Doc.RemoveChild "APPROVE"
App.Doc.RemoveChild "PAYMENT_LIST"
strDocNumber = App.Doc.FieldAsString("DOC_NUMBER")
App.Doc.ModifyData "NUMBER", strDocNumber
ok1=App.Doc.FirstChild("DISPATCHES.DISPATCH")
while ok1
App.Doc.RemoveChild "OHP_CODE"
App.Doc.RemoveChild "PROJECT_CODE"
App.Doc.RemoveChild "SHIPLOC_CODE"
App.Doc.RemoveChild "PAYMENT_CODE"
App.Doc.RemoveChild "SALESMANCODE"
App.Doc.RemoveChild "GL_CODE"
App.Doc.RemoveChild "AUXIL_CODE"
App.Doc.RemoveChild "AUTH_CODE"
App.Doc.RemoveChild "ARP_CODE_SHPM"
App.Doc.RemoveChild "TRADING_GRP"
ok2=App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
while ok2
App.Doc.RemoveChild "OHP_CODE2"
App.Doc.RemoveChild "OHP_CODE1"
App.Doc.RemoveChild "PRCLISTREF"
App.Doc.RemoveChild "PROJECT_CODE"
App.Doc.RemoveChild "SALEMANCODE"
App.Doc.RemoveChild "PAYMENT_CODE"
App.Doc.RemoveChild "GL_CODE2"
App.Doc.RemoveChild "GL_CODE1"
App.Doc.RemoveChild "AUXIL_CODE"
App.Doc.RemoveChild "DELVRY_CODE"
ok2=App.Doc.NextChild
wend
ok1=App.Doc.NextChild
wend
ok1=App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
while ok1
App.Doc.RemoveChild "PROJECT_CODE"
App.Doc.RemoveChild "OHP_CODE2"
App.Doc.RemoveChild "PURCH_GL_CODE"
App.Doc.RemoveChild "PRCLISTREF"
App.Doc.RemoveChild "OHP_CODE1"
App.Doc.RemoveChild "PAYMENT_CODE"
App.Doc.RemoveChild "SALEMANCODE"
App.Doc.RemoveChild "GL_CODE2"
App.Doc.RemoveChild "GL_CODE1"
App.Doc.RemoveChild "MASTER_TRACK_TYPE"
strOrderLineRef = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.ORDER_REFERENCE")
strOrderLineSiteID = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.ORDER_SITE")
if strOrderLineSiteID = "" Then strOrderLineSiteID = "0"
If strOrderLineRef <> "" Then
Set objQry = App.UObject.NewQuery
strQuery = " SELECT ORF.CUSTORDNO FROM " + tblOrfiche + " ORF WITH(NOLOCK)" + Chr(10)
strQuery = strQuery + " LEFT OUTER JOIN " + tblOrfline + " ORFL WITH(NOLOCK) ON ORFL.ORDFICHEREF = ORF.LOGICALREF " + Chr(10)
'strQuery = strQuery + " WHERE (ORFL.LOGICALREF = " + strOrderLineRef + ")"
strQuery = strQuery + " WHERE (((ORFL.ORGLOGICREF = " + strOrderLineRef + ") AND (ORFL.SITEID = " + strOrderLineSiteID + "))"
strQuery = strQuery + " OR ((ORFL.LOGICALREF = " + strOrderLineRef + ")AND(ORFL.SITEID = " + strOrderLineSiteID + ")))"
objQry.Statement = strQuery
If objQry.OpenDirect Then
If objQry.First Then
strOrderFicheNo = objQry.QueryFields.ITEM(0).Value
Else
MsgBox "Error occured. Logo Objects Error Nr : " & CStr(objQry.Error)
End If
objQry.Close
End If
End If
App.Doc.RemoveChild "SL_DETAILS"
'App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.SL_DETAILS.MASTER_TRACK_TYPE", ""
'App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.SL_DETAILS.SOURCE_MT_SITEID", ""
'App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.SL_DETAILS.SOURCE_MT_REFERENCE", ""
'App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.SL_DETAILS.SOURCE_SLT_REFERENCE", ""
'App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.SL_DETAILS.SOURCE_QUANTITY", ""
'App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.SL_DETAILS.IOCODE", ""
'App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.SL_DETAILS.SL_TYP", ""
'App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.SL_DETAILS.SL_CODE", ""
'App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.SL_DETAILS.MU_QUANTITY", ""
'App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.SL_DETAILS.QUANTITY", ""
'App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.SL_DETAILS.UNIT_CONV1", ""
'App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.SL_DETAILS.UNIT_CONV2", ""
'App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.SL_DETAILS.DATE_EXPIRED", ""
'App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.SL_DETAILS.DATA_REFERENCE", ""
'App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.SL_DETAILS.ORGLOGOID", ""
'App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.SL_DETAILS.ORGLINKREF", ""
'App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.SL_DETAILS.SL_NAME", ""
'App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.SL_DETAILS.SALESMAN_CODE", ""
'App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.SL_DETAILS.SALESMAN_DEF", ""
ok1=App.Doc.NextChild
wend
App.Doc.ModifyData "DOC_NUMBER", strOrderFicheNo
rOk=App.Doc.NextRoot
wend
App.Doc.SaveData
end sub12. IRSALİYE KURAL (VERILERI SIL)
İrsaliye · İmzalanmadan/Onaylanmadan Önce
sub ProcessEvent(App)
rOk=App.Doc.FirstRoot
while rOk
App.Doc.ModifyData "SALESMANCODE", ""
App.Doc.ModifyData "SALESMAN_DEF", ""
App.Doc.ModifyData "PROJECT_CODE", ""
App.Doc.ModifyData "ARP_CODE_SHPM", ""
App.Doc.ModifyData "SHIPMENT_TYPE", ""
App.Doc.ModifyData "SHIPPING_AGENT", ""
App.Doc.ModifyData "AUXIL_CODE", ""
App.Doc.ModifyData "AUTH_CODE", ""
App.Doc.ModifyData "SHIPLOC_CODE", ""
App.Doc.ModifyData "TRACK_NR", ""
App.Doc.ModifyData "FRG_TYP_CODE", ""
App.Doc.ModifyData "GL_CODE", ""
App.Doc.RemoveChild "FACTORY"
App.Doc.RemoveChild "DIVISION"
App.Doc.RemoveChild "DEPARTMENT"
App.Doc.RemoveChild "SOURCE_WH"
App.Doc.RemoveChild "SOURCE_COST_GRP"
App.Doc.RemoveChild "APPROVE"
ok1=App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
while ok1
App.Doc.ModifyData "PROJECT_CODE", ""
App.Doc.ModifyData "GL_CODE1", ""
App.Doc.ModifyData "AUXIL_CODE", ""
App.Doc.RemoveChild "SOURCEINDEX"
App.Doc.RemoveChild "SOURCECOSTGRP"
App.Doc.ModifyData "DELVRY_CODE", ""
App.Doc.ModifyData "GL_CODE2", ""
App.Doc.ModifyData "SALEMANCODE", ""
App.Doc.ModifyData "MASTER_TRACK_TYPE", ""
App.Doc.RemoveChild "TRANSACTIONS.TRANSACTION.SL_DETAILS"
ok1=App.Doc.NextChild
wend
rOk=App.Doc.NextRoot
wend
App.Doc.SaveData
end sub13. Müşteri Tedarikçi Kodu Kuralı (GoPlus için)
e-Fatura (Giden) · Onaylanmadan Önce (Giden)
sub ProcessEvent(App)
rOk=App.Doc.FirstRoot
while rOk
okay=App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
while okay
Ozelkod=App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.MASTER_AUXIL_CODE")
App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.ITEM_CUSTOMERCODE", Ozelkod
okay=App.Doc.NextChild
wend
rOk=App.Doc.NextRoot
wend
App.Doc.SaveData ' Yapılan değişiklikler kaydediliyor
end subEk Kural Örnekleri
Gelen Fatura Satırlarındaki Açıklamayı Boşaltma
sub ProcessEvent(App)
' Gelen fatura satirlarindaki aciklama alaninin silinmesi
okay = App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
while okay
App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.DESCRIPTION", " "
okay = App.Doc.NextChild
wend
App.Doc.SaveData
end subAçıklama (NOTES4) Alanını Sipariş Numarasına Atama
sub ProcessEvent(App)
rOk = App.Doc.FirstRoot
while rOk
DOKUMANNO = App.Doc.FieldAsString("NOTES4")
App.Doc.ModifyData "NOTES4", ""
STLINEOK = App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
while STLINEOK
App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.ORDER_FICHENO", DOKUMANNO
STLINEOK = App.Doc.NextChild("TRANSACTIONS.TRANSACTION")
wend
rOk = App.Doc.NextRoot
wend
App.Doc.SaveData
end subRaporlama Dövizi Kur/Tutar/Türünün Açıklama Alanına Eklenmesi
sub ProcessEvent(App)
rOk = App.Doc.FirstRoot
while rOk
DOKUMANIZLEMENO = App.Doc.FieldAsString("DOC_TRACK_NR")
DKUR = App.Doc.FieldAsString("RC_XRATE")
DTUTAR = App.Doc.FieldAsString("RC_NET")
App.Doc.ModifyData "RC_XRATE", ""
App.Doc.ModifyData "NOTES1", "KUR :" + DKUR + " Döviz Tutarı :" + DTUTAR + " " + DOKUMANIZLEMENO
rOk = App.Doc.NextRoot
wend
App.Doc.SaveData
end subİşlem Döviz Bilgilerinin Açıklamaya Eklenmesi (İki Varyant)
Birincisi kur/tutar/dövizi tek satırda birleştirir:
sub ProcessEvent(App)
rOk = App.Doc.FirstRoot
while rOk
DKUR = App.Doc.FieldAsString("TC_XRATE")
DTUTAR = App.Doc.FieldAsString("TC_NET")
DTUR = App.Doc.FieldAsString("TRCURR_GLOBAL_CODE")
NOT4 = App.Doc.FieldAsString("NOTES4")
App.Doc.ModifyData "NOTES4", NOT4 + " Döviz Bilgileri - KUR:" + DKUR + " TUTAR:" + DTUTAR + " " + DTUR
rOk = App.Doc.NextRoot
wend
App.Doc.SaveData
end subİkincisi, döviz cinsi boşsa hiç yazmayan, TL/döviz ayrımlı hali:
sub ProcessEvent(App)
rOk = App.Doc.FirstRoot
while rOk
DKUR = App.Doc.FieldAsString("TC_XRATE")
DTUTAR = App.Doc.FieldAsString("TC_NET")
DTUR = App.Doc.FieldAsString("TRCURR_GLOBAL_CODE")
NOT5 = App.Doc.FieldAsString("NOTES5")
IF DTUR = "" THEN
ELSE
App.Doc.ModifyData "NOTES5", NOT5 + "Döviz Bilgileri : Döviz Kuru: " + DKUR + " / Döviz Tutarı: " + DTUTAR + " " + DTUR
END if
rOk = App.Doc.NextRoot
wend
App.Doc.SaveData
end subÜrün/Hizmet Özel Kodunu Malzeme Açıklamasına Ekleme
sub ProcessEvent(App)
rOk = App.Doc.FirstRoot
while rOk
MALHIZACIKLAMA = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.MASTER_DEF")
MALOZELKOD = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.MASTER_AUXIL_CODE")
HIZOZELKOD = App.Doc.FieldAsString("TRANSACTIONS.TRANSACTION.SALES_SERVICES.SERVICE.AUXIL_CODE")
App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.MASTER_DEF", ""
STLINEOK = App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
while STLINEOK
App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.MASTER_DEF", MALHIZACIKLAMA + " " + MALOZELKOD + " " + HIZOZELKOD
STLINEOK = App.Doc.NextChild("TRANSACTIONS.TRANSACTION")
wend
rOk = App.Doc.NextRoot
wend
App.Doc.SaveData
end subFatura Belge No Alanını İrsaliye No’ya Aktarma
Belge no alanını okuyup hem irsaliye numarasına hem orijinal numara alanına yazar, ardından belge no alanını temizler:
sub ProcessEvent(App)
rOk = App.Doc.FirstRoot
while rOk
BELGENO = App.Doc.FieldAsString("DOC_NUMBER")
App.Doc.ModifyData "DOC_NUMBER", ""
STFICHEOK = App.Doc.FirstChild("DISPATCHES.DISPATCH")
while STFICHEOK
App.Doc.ModifyData "DISPATCHES.DISPATCH.NUMBER", BELGENO
App.Doc.ModifyData "DISPATCHES.DISPATCH.ORIG_NUMBER", BELGENO
STFICHEOK = App.Doc.NextChild("DISPATCHES.DISPATCH")
wend
rOk = App.Doc.NextRoot
wend
App.Doc.SaveData
end sub<RULES><RULE>...</RULE></RULES> yapısında bir XML olarak dışa aktarılabilir. Script’in kendisi bu XML içinde RULE_DATA etiketi altında Base64 ile kodlanmış olarak durur — bir kuralı yedeklemek veya başka bir firmaya taşımak için bu XML dosyasını Logo Connect’in içe aktarma ekranından kullanabilirsiniz.SQL’den Fatura Tarihine Göre Günlük USD/EUR Kurunu Çekme
Faturanın tarihine göre, Logo’nun kendi döviz kuru tablosundan o günün USD ve EUR alış kurunu okuyup açıklama alanlarına yazar:
sub ProcessEvent(App)
strDBUser = "kural_kullanici"
strDBPass = "***"
strDBServer = "SUNUCU_ADI"
strDBName = "VERITABANI_ADI"
Set conn = CreateObject("ADODB.Connection")
conn.ConnectionString = "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=" + strDBUser + _
";Password=" + strDBPass + ";Initial Catalog=" + strDBName + ";Data Source=" + strDBServer
conn.Open
Set rs = CreateObject("adodb.recordset")
rs.ActiveConnection = conn
fInvoiceDate = App.Doc.FieldAsString("DATE")
strQuery = "SELECT REPLACE(CONVERT(VARCHAR(10),RATES2),'.',','), CRTYPE FROM LG_EXCHANGE_515 " & _
"WHERE CONVERT(NVARCHAR(10),EDATE,104)='" & fInvoiceDate & "' AND CRTYPE IN (1,20)"
rs.Open strQuery, conn
do while (rs.EOF = false)
fBak = rs.Fields(0).value
fCrType = rs.Fields(1).value
if fCrType = 1 then
USDKUR = "Kur USD : " + fBak
else
EURKUR = "Kur EUR : " + fBak
end if
rs.MoveNext()
loop
rs.close
App.Doc.ModifyData "NOTES5", USDKUR
App.Doc.ModifyData "NOTES6", EURKUR
App.Doc.SaveData
conn.close
end subMalzeme Grup Açıklamasını SQL’den Okuyup Koda Yazma (Örnek Şablon)
Bazı entegrasyonlarda, gelen faturadaki malzeme kodunun bir kısmına (örn. ilk birkaç karakterine) göre, o gruba ait açıklamayı özel kod tablosundan (SPECODES) çekip malzeme koduna yazmak gerekebilir. Aşağıdaki şablon bu tekniği gösterir — strQuery içindeki grup kodu ve firma numarasını kendi sisteminize göre değiştirmeniz gerekir:
sub ProcessEvent(App)
strDBUser = "kural_kullanici"
strDBPass = "***"
strDBServer = "SUNUCU_ADI"
strDBName = "VERITABANI_ADI"
Set conn = CreateObject("ADODB.Connection")
conn.ConnectionString = "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=" + strDBUser + _
";Password=" + strDBPass + ";Initial Catalog=" + strDBName + ";Data Source=" + strDBServer
conn.Open
Set rs = CreateObject("adodb.recordset")
rs.ActiveConnection = conn
rOk = App.Doc.FirstRoot
while rOk
' Firmanizin tekil bir kayit numarasini (orn. vergi no) SND alanindan okuyup
' aciklama alanina ek bilgi (orn. Mersis No) eklemek isterseniz buraya yazabilirsiniz.
STLINEOK = App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
while STLINEOK
strQuery = "SELECT SPECODES.DEFINITION_ FROM LG_001_ITEMS ITEMS " & _
"LEFT JOIN LG_001_SPECODES SPECODES ON ITEMS.STGRPCODE = SPECODES.SPECODE " & _
"AND CODETYPE = 4 WHERE CODE LIKE 'GRUP-KODU%'"
rs.Open strQuery, conn
strEkAciklama = ""
IF rs.EOF = false THEN
strEkAciklama = rs.Fields(0).value
END IF
App.Doc.ModifyData "TRANSACTIONS.TRANSACTION.MASTER_CODE", strEkAciklama
rs.close
STLINEOK = App.Doc.NextChild("TRANSACTIONS.TRANSACTION")
wend
rOk = App.Doc.NextRoot
wend
App.Doc.SaveData
conn.close
end subCari Koda ve İrsaliye Özel Koduna Göre Çoklu Koşullu Kural (Şablon)
Farklı müşteriler için farklı davranış gerektiğinde (örneğin bir müşteride sipariş no zorunlu, başka bir müşteride sabit bir değer atanacak; irsaliye özel koduna göre farklı bir e-posta adresine bildirim gidecek), kural içinde birden fazla IF bloğu birlikte kullanılabilir. Aşağıdaki şablon bu deseni gösterir — gerçek cari kodları, firma adlarını ve e-posta adreslerini kendi verilerinizle değiştirin:
sub ProcessEvent(App)
rOk = App.Doc.FirstRoot
while rOk
CariKod = App.Doc.FieldAsString("ARP_CODE")
DokumanNo = App.Doc.FieldAsString("DOC_TRACK_NR")
Irs = App.Doc.FirstChild("DISPATCHES.DISPATCH")
while Irs
IrsaliyeOzelKod = App.Doc.FieldAsString("AUXIL_CODE")
Irs = App.Doc.NextChild
wend
okay = App.Doc.FirstChild("TRANSACTIONS.TRANSACTION")
while okay
IF CariKod = "CARI-KODU-1" THEN
IF DokumanNo = "" THEN
MSGBOX ("Bu müşteri için Doküman No alanı zorunludur.")
else
App.Doc.ModifyData "ORDER_FICHENO", DokumanNo
end if
END if
IF CariKod = "CARI-KODU-2" THEN
App.Doc.ModifyData "ORDER_FICHENO", "SABIT-DEGER"
END IF
okay = App.Doc.NextChild
wend
IF CariKod = "CARI-KODU-3" THEN
IF IrsaliyeOzelKod = "GRUP-A" OR IrsaliyeOzelKod = "GRUP-B" THEN
IF IrsaliyeOzelKod = "GRUP-A" THEN
App.Doc.ModifyData "ARP_EMAILADDR", "grup-a@sirketiniz.com"
END IF
IF IrsaliyeOzelKod = "GRUP-B" THEN
App.Doc.ModifyData "ARP_EMAILADDR", "grup-b@sirketiniz.com"
END IF
ELSE
MSGBOX ("Hatalı irsaliye özel kodu girişi: " + IrsaliyeOzelKod)
END IF
END IF
rOk = App.Doc.NextRoot
wend
App.Doc.SaveData
end subKural Yazarken Genel Tavsiyeler
- Yeni bir kuralı doğrudan canlı firmada değil, test/deneme firmasında deneyin.
- Kuralı “Öncelik” ve “Olay” (Onaylanmadan Önce / Sonra, Hazırlanmadan Önce vb.) alanlarıyla doğru sıraya oturtun — sıralama yanlışsa kural beklenmedik sonuç verebilir.
RemoveChildgibi veri silen kurallarda kısıt (koşul) eklemeyi unutmayın; koşulsuz kural tüm belgeleri etkiler.- UBL’e yazdığınız her ek alanın tasarımda da karşılığı olduğundan emin olun — kural veriyi taşır, görünürlüğü tasarım sağlar.
- Veritabanı bağlantılı kurallarda gerçek sunucu bilgisi/şifre kullanmayın, sınırlı yetkili ayrı bir SQL kullanıcısı tanımlayın.
