Ana içeriğe geç

4.11. Kural Tabloları#

BPMN uygulamasında; belirli girdilerin belirli ön şartları sağlamasına bağlı olarak, belirli çıktıları verdiği kural (karar) tablolarını tanımlama ve girdilere göre kuralları işleterek beklenen çıktıyı verme yeteneği vardır. Bu yetenek, Flowable'in DMN modülü ile sağlanır.

DMN Nedir?#

DMN (Decision Model and Notation), iş kurallarını ve karar tablolarını standart bir formatta tanımlamak için kullanılan bir modeldir. Flowable BPMN motoru, DMN formatındaki karar tablolarını çalıştırarak iş süreçlerinde otomatik kararlar alınmasını sağlar.

Yetenekler#

  • Excel formatında hazırlanan karar tabloları içe aktarılarak, arka planda otomatik olarak Flowable DMN formatına dönüştürülür ve sisteme yüklenir. Böylece; teknik bilgi gerektirmeden karar tabloları oluşturulabilir.

  • Standart DMN formatındaki dosyalar içe aktarılabilir.

  • bpmn-lib library'si ile listeleme ve yükleme işlemleri arayüzden yönetilebilir.

  • Uygulamanın /execute rest ucu çağırılarak, tanımlı kural tabloları çalıştırılabilir. Örnek istek aşağıdaki gibidir:

``` http request POST /process/decision/execute Content-Type: application/json { "key": "krediRiskHesaplama", "variables": { "yas": 30, "gelir": 7500, "calismaDurumu": "SERBEST" } }

Bu istek sonucunda beklenen çıktı aşağıdaki gibidir:

``` json
{
    "body": {
        "key": "krediRiskHesaplama",
        "variables": {
            "riskSeviyesi": "DUSUK",
            "krediLimiti": 50000
        }
    }
}

  • Süreç Yöneticisi yetkisine (bpmn) sahip kullanıcılar, kural tablosu yükleme ve silme işlemlerini yönetir. Süreç Görüntüleyicisi (bpmn:designer:view) yetkisine sahip kullanıcılar, sadece kural tablolarını listeleme işlemi yapabilir. Kural tablosunun çalıştırılıp çıktı alınması işlemi ise herhangi bir yetkiye bağlı değildir.

Uyarı

Bu yeteneklerin Bpmn uygulamasında kullanılabilmesi için "BPMN_DMN_ENABLED" parametresi true olmalıdır.


EXCEL DOSYASI YAPISI#

Excel dosyanız mutlaka iki sheet içermelidir:

📁 dosya_adi.xlsx
├── 📄 CONFIG          → Karar tablosu ayarları
└── 📄 DECISION_TABLE  → Karar kuralları

⚠️ ÖNEMLİ: Sheet isimleri tam olarak CONFIG ve DECISION_TABLE olmalıdır. Büyük/küçük harf duyarlıdır.


CONFIG SHEET#

CONFIG SHEET'i karar tablonuzun temel ayarlarını içerir.

Parametre Tablosu:#

Parametre Zorunlu Varsayılan Açıklama
DMN_KEY ✅ Evet - Sistemde bu karar tablosunu tanımlayan benzersiz anahtar. Execute işleminde bu değer kullanılır.
DMN_NAME ✅ Evet - Karar tablosunun kullanıcı dostu adı.
HIT_POLICY ❌ Hayır FIRST Birden fazla kural eşleştiğinde nasıl davranılacağını belirler.
FORCE_DMN11 ❌ Hayır true DMN 1.1 standardına uyumluluk.

DMN_KEY Yazım Kuralları:#

✅ DOĞRU ÖRNEKLER:
   - krediRiskHesaplama
   - otvOranBelirle
   - musteriSegmentasyon
   - risk_hesaplama_v2

❌ YANLIŞ ÖRNEKLER:
   - Kredi Risk Hesaplama  (boşluk var)
   - krediRiskHesaplaması  (Türkçe karakter)
   - 123kredi              (sayı ile başlıyor)

HIT_POLICY Seçenekleri:#

Policy Davranış Kullanım Alanı
FIRST İlk eşleşen kural sonucunu döndürür En yaygın kullanım. Öncelik sırasına göre kurallar
UNIQUE Sadece bir kural eşleşmeli, birden fazla eşleşme hata verir Kuralların çakışmaması gereken durumlar
ANY Birden fazla kural eşleşebilir ama aynı sonucu vermeli Tutarlılık kontrolü gereken durumlar
PRIORITY En yüksek öncelikli sonucu döndürür Öncelik bazlı kararlar
COLLECT Tüm eşleşen kuralların sonuçlarını liste olarak döndürür Çoklu sonuç gereken durumlar

CONFIG Örneği:#

┌─────────────┬─────────────────────────┐
│ DMN_KEY     │ musteriKrediLimiti      │
├─────────────┼─────────────────────────┤
│ DMN_NAME    │ Müşteri Kredi Limiti    │
├─────────────┼─────────────────────────┤
│ HIT_POLICY  │ FIRST                   │
├─────────────┼─────────────────────────┤
│ FORCE_DMN11 │ true                    │
└─────────────┴─────────────────────────┘

DECISION_TABLE#

Satır Yapısı:#

┌─────────────────────────────────────────────────────────┐
│ Satır 1: Kolon Tipleri (INPUT / OUTPUT)                 │
├─────────────────────────────────────────────────────────┤
│ Satır 2: Etiketler (Görünen İsimler)                    │
├─────────────────────────────────────────────────────────┤
│ Satır 3: Değişken Adları (Kod İsimleri)                 │
├─────────────────────────────────────────────────────────┤
│ Satır 4: Veri Tipleri (string/number/boolean/date)      │
├─────────────────────────────────────────────────────────┤
│ Satır 5: Kural 1                                        │
├─────────────────────────────────────────────────────────┤
│ Satır 6: Kural 2                                        │
├─────────────────────────────────────────────────────────┤
│ ...      ...                                            │
└─────────────────────────────────────────────────────────┘

Kolon Tipleri (Satır 1):#

Tip Açıklama
INPUT Karar vermek için kullanılan giriş değişkenleri
OUTPUT Karar sonucunda döndürülecek çıkış değerleri

💡 İpucu: Önce tüm INPUT kolonlarını, sonra OUTPUT kolonlarını sıralayın.

Değişken Adı Yazım Kuralları (Satır 3):#

✅ DOĞRU ÖRNEKLER:
   - musteriYasi
   - aylikGelir
   - aktifMi
   - krediNotu

❌ YANLIŞ ÖRNEKLER:
   - müşteri yaşı    (Türkçe karakter ve boşluk)
   - Müşteri-Yaşı    (Türkçe karakter ve tire)
   - 1musteriYasi    (sayı ile başlıyor)

Veri Tipleri (Satır 4):#

Veri Tipi Açıklama Örnek Değerler
string Metin değerleri "YUKSEK", "DUSUK", "AKTIF"
number Sayısal değerler (tam sayı veya ondalık) 100, 3.14, -50
boolean Mantıksal değerler true, false
date Tarih değerleri 2024-01-15

OPERATÖR KULLANIM KILAVUZU#

📌 BOŞ DEĞER / HERHANGİ BİR DEĞER#

Hücreyi boş bırakın veya - yazın. Bu, "herhangi bir değer olabilir" anlamına gelir.

┌──────────────┬─────────────┬──────────────┐
│ Yaş (INPUT)  │ Gelir       │ Sonuç        │
├──────────────┼─────────────┼──────────────┤
│ -            │ > 5000      │ "ONAY"       │  ← Yaş ne olursa olsun, gelir > 5000 ise ONAY
│              │ <= 5000     │ "RED"        │  ← Boş hücre de aynı anlama gelir
└──────────────┴─────────────┴──────────────┘

📌 EŞİTLİK OPERATÖRÜ (==)#

Belirli bir değere eşit olup olmadığını kontrol eder.

Yazım Formatı:

== değer        (sayılar için)
== "değer"      (metinler için)
== true/false   (boolean için)

Ek olarak; hücrede herhangi bir operator olmaması durumunda da eşitlik kontrolü uygulanır.

┌──────────────┬─────────────┬──────────────┐
│ Yaş (INPUT)  │ Kredi Notu  │ Sonuç        │
├──────────────┼─────────────┼──────────────┤
│ -            │ Geçerli     │ "ONAY"       │  ← =="Geçerli" demektir
│              │ Geçersiz    │ "RED"        │  ← =="Geçersiz" demektir
└──────────────┴─────────────┴──────────────┘

Örnekler:

Veri Tipi Excel'de Yazım Anlamı
string == "ALTIN" Değer "ALTIN" mı?
number == 100 Değer 100'e eşit mi?
boolean == true Değer true mu?
┌─────────────────┬─────────────┬──────────────┐
│ Segment (INPUT) │ VIP (INPUT) │ İndirim      │
├─────────────────┼─────────────┼──────────────┤
│ == "ALTIN"      │ == true     │ 20           │
│ == "GUMUS"      │ == true     │ 15           │
│ == "BRONZ"      │ -           │ 5            │
└─────────────────┴─────────────┴──────────────┘

📌 EŞİT DEĞİL OPERATÖRÜ (!=)#

Belirli bir değere eşit olmadığını kontrol eder.

Yazım Formatı:

!= değer        (sayılar için)
!= "değer"      (metinler için)

Örnekler:

┌─────────────────┬──────────────┐
│ Durum (INPUT)   │ İşlem        │
├─────────────────┼──────────────┤
│ != "IPTAL"      │ "DEVAM"      │  ← Durum "IPTAL" değilse DEVAM
│ == "IPTAL"      │ "DURDUR"     │  ← Durum "IPTAL" ise DURDUR
└─────────────────┴──────────────┘

📌 KARŞILAŞTIRMA OPERATÖRLERİ (<, <=, >, >=)#

Sayısal değerleri karşılaştırmak için kullanılır.

Yazım Formatı:

< değer     → Küçük
<= değer    → Küçük veya eşit
> değer     → Büyük
>= değer    → Büyük veya eşit

Örnekler:

┌─────────────────┬─────────────────┬──────────────┐
│ Yaş (INPUT)     │ Gelir (INPUT)   │ Risk         │
├─────────────────┼─────────────────┼──────────────┤
│ < 25            │ < 5000          │ "YUKSEK"     │  ← Yaş 25'ten küçük VE Gelir 5000'den az
│ >= 25           │ >= 5000         │ "DUSUK"      │  ← Yaş 25 veya üzeri VE Gelir 5000 veya üzeri
│ < 18            │ -               │ "RED"        │  ← Yaş 18'den küçükse (gelir fark etmez)
│ > 65            │ -               │ "OZEL"       │  ← Yaş 65'ten büyükse
└─────────────────┴─────────────────┴──────────────┘

📌 ARALIK OPERATÖRÜ (BETWEEN)#

Bir değerin belirli bir aralıkta olup olmadığını kontrol eder. Sınır değerler dahildir.

Yazım Formatı:

BETWEEN:minimum,maksimum

Örnekler:

┌─────────────────────┬──────────────┐
│ Puan (INPUT)        │ Not          │
├─────────────────────┼──────────────┤
│ BETWEEN:90,100      │ "AA"         │  ← 90 ile 100 arasında (90 ve 100 dahil)
│ BETWEEN:80,89       │ "BA"         │  ← 80 ile 89 arasında
│ BETWEEN:70,79       │ "BB"         │  ← 70 ile 79 arasında
│ BETWEEN:60,69       │ "CB"         │  ← 60 ile 69 arasında
│ BETWEEN:0,59        │ "FF"         │  ← 0 ile 59 arasında
└─────────────────────┴──────────────┘

⚠️ DİKKAT: Virgülden önce ve sonra boşluk bırakmayın: BETWEEN:10,100 ✅ | BETWEEN: 10, 100


📌 LİSTE İÇİNDE OPERATÖRÜ (IS_IN)#

Bir değerin belirli bir liste içinde olup olmadığını kontrol eder.

Yazım Formatı:

IS_IN:değer1,değer2,değer3

Örnekler:

┌────────────────────────────┬─────────────────┬──────────────┐
│ Sehir (INPUT)              │ Bolge (INPUT)   │ Kargo Ucreti │
├────────────────────────────┼─────────────────┼──────────────┤
│ IS_IN:Istanbul,Ankara,Izmir│ -               │ 15           │  ← 3 büyük şehir
│ IS_IN:Bursa,Antalya,Adana  │ -               │ 25           │  ← Diğer büyük şehirler
│ -                          │ == "DOGU"       │ 45           │  ← Doğu bölgesi
│ -                          │ -               │ 35           │  ← Varsayılan
└────────────────────────────┴─────────────────┴──────────────┘

Araç Sınıfı Örneği (OTV Hesaplama gibi):

┌──────────────────────────────────┬──────────────┐
│ AracSinifi (INPUT)               │ OTV Orani    │
├──────────────────────────────────┼──────────────┤
│ IS_IN:M1,M1G                     │ "45"         │  ← Binek araçlar
│ IS_IN:N1,N1G,N2,N3               │ "18"         │  ← Ticari araçlar
│ IS_IN:M2,M2G,M3                  │ "1"          │  ← Otobüsler
│ IS_IN:L1,L2,L3                   │ "22"         │  ← Motosikletler
└──────────────────────────────────┴──────────────┘

📌 LİSTE DIŞINDA OPERATÖRÜ (NOT_IN)#

Bir değerin belirli bir liste içinde olmadığını kontrol eder.

Yazım Formatı:

NOT_IN:değer1,değer2,değer3

Örnekler:

┌────────────────────────────┬──────────────┐
│ Durum (INPUT)              │ İşlem        │
├────────────────────────────┼──────────────┤
│ NOT_IN:IPTAL,ASKIDA,BEKLE  │ "ISLE"       │  ← Bu durumlardan biri değilse işle
│ IS_IN:IPTAL,ASKIDA,BEKLE   │ "BEKLET"     │  ← Bu durumlardan biriyse beklet
└────────────────────────────┴──────────────┘

OUTPUT (ÇIKIŞ) DEĞERLERİ YAZIM KURALLARI#

String (Metin) Çıkışlar:#

Mutlaka çift tırnak içinde yazın:

✅ DOĞRU:
   "YUKSEK"
   "ONAYLANDI"
   "Risk Seviyesi Yüksek"

❌ YANLIŞ:
   YUKSEK
   'ONAYLANDI'

Sayısal Çıkışlar:#

Tırnak kullanmadan yazın:

✅ DOĞRU:
   100
   3.14
   -50
   0

❌ YANLIŞ:
   "100"
   100,00 (virgül yerine nokta kullanın)

Boolean Çıkışlar:#

✅ DOĞRU:
   true
   false

❌ YANLIŞ:
   "true"
   TRUE
   1/0

KURAL SIRASI VE HIT POLICY#

FIRST Policy ile Kural Sırası:#

HIT_POLICY: FIRST kullandığınızda, kurallar yukarıdan aşağıya değerlendirilir ve ilk eşleşen kural uygulanır. Bu nedenle:

⚠️ ÖNEMLİ: Spesifik kuralları üste, genel kuralları alta yazın!

YANLIŞ Sıralama:

┌─────────────────┬──────────────┐
│ Yaş (INPUT)     │ Kategori     │
├─────────────────┼──────────────┤
│ -               │ "STANDART"   │  ← Her şey buna eşleşir!
│ < 18            │ "COCUK"      │  ← Buraya hiç ulaşılmaz
│ > 65            │ "YASLI"      │  ← Buraya hiç ulaşılmaz
└─────────────────┴──────────────┘

DOĞRU Sıralama:

┌─────────────────┬──────────────┐
│ Yaş (INPUT)     │ Kategori     │
├─────────────────┼──────────────┤
│ < 18            │ "COCUK"      │  ← Önce spesifik kurallar
│ > 65            │ "YASLI"      │  
│ -               │ "STANDART"   │  ← En son varsayılan kural
└─────────────────┴──────────────┘


GERÇEK DÜNYA ÖRNEKLERİ#

Örnek 1: Kredi Risk Değerlendirme#

CONFIG:

A B
DMN_KEY krediRiskDegerlendirme
DMN_NAME Kredi Risk Değerlendirme
HIT_POLICY FIRST
FORCE_DMN11 true

DECISION_TABLE:

A B C D E F
INPUT INPUT INPUT INPUT OUTPUT OUTPUT
Yaş Aylık Gelir Kredi Notu Mevcut Borç Risk Seviyesi Max Kredi
yas aylikGelir krediNotu mevcutBorc riskSeviyesi maxKredi
number number number number string number
< 21 - - - "RED" 0
- < 5000 < 500 - "YUKSEK" 10000
- < 5000 >= 500 - "ORTA" 25000
- >= 5000 < 500 > 50000 "YUKSEK" 15000
- >= 5000 >= 500 <= 50000 "DUSUK" 100000
- >= 10000 >= 700 <= 20000 "COK_DUSUK" 250000
- - - - "ORTA" 50000

Örnek 2: Kargo Ücreti Hesaplama#

CONFIG:

A B
DMN_KEY kargoUcretiHesaplama
DMN_NAME Kargo Ücreti Hesaplama
HIT_POLICY FIRST
FORCE_DMN11 true

DECISION_TABLE:

A B C D E
INPUT INPUT INPUT OUTPUT OUTPUT
Şehir Ağırlık (kg) Üyelik Tipi Kargo Ücreti Tahmini Süre
sehir agirlik uyelikTipi kargoUcreti tahminiSure
string number string number string
IS_IN:Istanbul,Ankara,Izmir <= 5 == "PREMIUM" 0 "1-2 gün"
IS_IN:Istanbul,Ankara,Izmir <= 5 - 15 "2-3 gün"
IS_IN:Istanbul,Ankara,Izmir > 5 == "PREMIUM" 10 "1-2 gün"
IS_IN:Istanbul,Ankara,Izmir > 5 - 25 "2-3 gün"
- <= 5 == "PREMIUM" 15 "3-5 gün"
- <= 5 - 35 "4-6 gün"
- > 5 - 50 "5-7 gün"

Örnek 3: OTV Oranı Belirleme (Karmaşık Örnek)#

CONFIG:

A B
DMN_KEY otvOraniBelirleme
DMN_NAME OTV Oranı Belirleme
HIT_POLICY FIRST
FORCE_DMN11 true

DECISION_TABLE:

A B C D E F G
INPUT INPUT INPUT INPUT INPUT INPUT OUTPUT
Araç Sınıfı Motor Hacmi Elektrikli Mi Koltuk Sayısı Azami Ağırlık 4x4 Mü OTV Oranı
aracSinifi motorHacmi elektrikliMi koltukSayisi azamiAgirlik dortCekenMi otvOrani
string number boolean number number boolean string
IS_IN:M1,M1G <= 1600 == false - - == false "45"
IS_IN:M1,M1G <= 1600 == false - - == true "50"
IS_IN:M1,M1G BETWEEN:1601,2000 == false - - - "50"
IS_IN:M1,M1G > 2000 == false - - - "80"
IS_IN:M1,M1G - == true - - - "10"
IS_IN:N1,N1G - == false - <= 3500 - "15"
IS_IN:N1,N1G - == true - - - "1"
IS_IN:M2,M3 - - >= 26 - - "1"
IS_IN:M2,M3 - - BETWEEN:10,25 - - "4"
- - - - - - "18"

HATA ÇÖZÜMLEME REHBERİ#

Sık Karşılaşılan Hatalar ve Çözümleri:#

Hata Mesajı Olası Sebep Çözüm
CONFIG sheet bulunamadı Sheet adı yanlış Sheet adını tam olarak "CONFIG" yapın
DECISION_TABLE sheet bulunamadı Sheet adı yanlış Sheet adını tam olarak "DECISION_TABLE" yapın
DMN_KEY değeri tanımlanmamış CONFIG'de DMN_KEY yok CONFIG sheet'e DMN_KEY satırı ekleyin
Geçersiz dosya formatı .xls veya başka format Dosyayı .xlsx olarak kaydedin
En az bir INPUT kolonu tanımlanmalı INPUT kolonu yok İlk satırda en az bir INPUT ekleyin
En az bir OUTPUT kolonu tanımlanmalı OUTPUT kolonu yok İlk satırda en az bir OUTPUT ekleyin
Geçersiz HIT_POLICY Yanlış policy adı FIRST, UNIQUE, ANY, PRIORITY veya COLLECT kullanın
Bu DMN_KEY değerine sahip tablo mevcut Aynı key ile kayıt var Farklı DMN_KEY kullanın veya mevcut olanı silin
BETWEEN operatörü için geçersiz format Virgül hatası BETWEEN:10,100 formatında yazın (boşluksuz)

SIK SORULAN SORULAR (SSS)#

Soru: Aynı DMN_KEY ile yeni versiyon yükleyebilir miyim?#

Cevap: Hayır, önce mevcut karar tablosunu silmeniz gerekir. Ardından aynı key ile yeni tablo yükleyebilirsiniz.

Soru: Kaç tane INPUT/OUTPUT kullanabilirim?#

Cevap: Teknik olarak sınır yoktur, ancak performans için 20'den fazla kolon önerilmez.

Soru: Türkçe karakter kullanabilir miyim?#

Cevap: DMN_NAME ve Label (Satır 2) alanlarında kullanabilirsiniz. DMN_KEY ve Değişken Adı (Satır 3) alanlarında kullanamazsınız.

Soru: Excel'de formül kullanabilir miyim?#

Cevap: Hayır, tüm değerler sabit metin/sayı olmalıdır. Formüller çalışmaz.

Soru: Boş satır bırakabilir miyim?#

Cevap: Evet, kurallar arasında boş satır bırakabilirsiniz. Boş satırlar atlanır.