---
# System prepended metadata

title: Kampanya Yönetimi

---

# Kampanya Yönetimi 

[TOC]

## Veri Akışı
Tüm kaynaklardan müşteri özelinde belli zaman dilimi içinde akan kayıtların tutarsal ve adetsel olarak kaydını tutar.

### Akış Tanımı
Akan veriden gerekli kümelendirmeyi yaparak veriler ile ilgili özet bilginin toplanması için gerekli tanımı içerir.

```json=
{
  "stream-id": 1,
  "title": "Aylık Fatura Ödemesi",
  "frequency": "0 0 1 * *",
  "target-currency": "TRL",
  "sources": [
    {
      "topic": "http://localhost:8082/topics/cdc_payments/pay",
      "type": "add",
      "client-id-path": "data.custId",
      "amount-path": "data.payment.invoice.amount",
      "currency-path": "data.payment.invoice.currency"
    },
    {
      "topic": "http://localhost:8082/topics/cdc_payments/cancels",
      "type": "subtract",
      "client-id-path": "data.custId",
      "amount-path": "data.payment.invoice.amount",
      "currency-path": "data.payment.invoice.currency",
      "span": " 6:0:0:0"
    }
  ]
}
```

* **frequency** Cron formatında akışın kümeleme için  gruplama  frekansını belirler. 
* **sources** verinin aktığı kafta topiclerini belirler. Bu topicler üstünden alınan veriler toplanarak peryot içindeki toplamlara erişilir.
* **sources.type** verinin arttırılması için mi azaltılması (iptaller, iadeler vs.) için mi kullanılacağına karar vermek için kullanılır.
* **sources.currency-path** veri tutarının para birimini belirler. Eğer **target-currency** ile farklı birimlerden ise fx servisleri ile çevrilerek kullanılır.
* **span** verilen frekans dışında özellikle iade ve iptal gibi süreçleri yönetmek amacıyla ek dinlenmesi hedeflene süreyi belirler. [Format Bilgisi için tıklayınız](https://docs.microsoft.com/en-us/dotnet/api/system.timespan.parse?view=net-6.0#System_TimeSpan_Parse_System_String_)  


### Akış Verisi
Akış verisi içerisinde müşteri özelinde tanımlanmış akış verileri sonucunda oluşmuş özet veriler tutulur. Özet veriler hedeflerden ve kampanyalardan bağımsız olarak sürekli çalışır. 

Eğer özet verisini dinleyen bir hedef bir varsa özet verisine eriştiğinde hedef tetiklenir.

| Client     | Stream | State       | Currency | Begin      | End        | Full End    | Amount | Times |
| ---------- | ------ | ----------- | -------- | ---------- | ---------- | --- | ------:| -----:|
| 3855206900 | 1      | completed   | TRL      | 01-11-2021 | 30-11-2021 | 6-12-2022    |   1200 |     9 |
| 3855206900 | 1      | in-progress | TRL      | 01-12-2021 | 31-12-2021 | 6-1-2022    |    685 |     7 |

> **Primary Key:** Client, Stream, Begin, End


## Akış Hedefi

### Hedef Tanımı
Kampanyaya bağıl olarak bir akış sonucunda bir hedefe ulaşılması durumunda tutulan tanımlardır. Hedef tanımları kampanya tanımları için kullanılır.
Hedefler akış (stream)  veya sorgu (adhoc) olabilir.



Akış hedei için örnek olarak müşterinin 1000 tlye ulaşması durumunda çalışacak bir hedef tanımı;

```json=
{
  "goal-id": 101,
  "source":"stream",
  "stream-id": 1,
  "target": "1000",
  "type": "amount | times",
  "client-id": "3855206900",
  "trigger": "when-reach | after-full-end"
}
```
* **target** eğer **type** amount ise toplam tutarı, **times** ise işlem adetini temsil eder.
* **trigger** ile hedefe erişildiğinde mi yoksa akış tamamlandığında mı kampanyanın tetikleneceği tanımlanır.

Sorgu hedefi için ise cinsiyet kontrolü yapan hedef.

```json=
{
  "goal-id": 1101,
  "source":"adhoc",
  "expression": "response.data.person.gender == 'female'",
  "query": "api.burgan.com.tr/getprofile/{{clientid}}",
  "campaign-validation": "first-check | every-check"
}
```
* **query** ilgili servisi çağırıp json bir response bekler.
* **expression** ile dönüş değeri evalue edilir. Eğer servis boolean bir değer dönüyorsa, veya boş değer dönüp http response code 200 true kabul edilecekse expression boş bırakılır.
* **campaing-validation** ile bilginin sorgulaması ve doğrulamasının ne zaman yapılacağı tanımlanır. Bir defa doğrulandıktan sonra kampanya tanımında hedef için check atılabilir veya kampanya tüm hedefler doğrulana kadar her sorgulandığında durum kontrol edilebilir.


### Hedef Gerçekleşme

| Client     | Goal | Elapsed     | Begin      | End        |
| ---------- | ---- | ----------- | ---------- | ---------- |
| 3855206900 | 101  | 23 -11-2021 | 01-11-2021 | 30-11-2021 |
| 3855206900 | 101  | 17 -11-2021 | 01-12-2021 | 31-12-2021 |


:::info
Hedef configurasyonu ve verilerin sunumu için REST API kullanılacaktır.

Verilerin saklanması için SQL Server **in-memory table** kullanılacaktır.

> Project : **bbt.service.campaign.goal**
:::

## Kampanya 

### Kampanya Tanımı
Kampanyalar tanımlı hedef(ler)e ulaşıldığında tetiklenen tanımlardır.

```json=
{
  "campaign-id": 9001,
  "tag": [
    "odeme cashback",
    "fatura cashback"
  ],
  "display": "master | others | never",  
  "type": "merge-by-tag | standalone",
  "title": [
    {
      "language": "TR",
      "label": "Bir ayda toplamda bin liralık beş fatura öde 50 TL kazan"
    },
    {
      "language": "EN",
      "label": "Pay five invoices with total thousand and get fifty"
    }
  ],
  "description": [
    {
      "language": "TR",
      "label": "en fazla **150 tl** kazanabilirsin, bla bla"
    },
    {
      "language": "EN",
      "label": "maximum bla bla bla"
    }paing/adapter/invoce-cashback/{{client-id}}",
    "method": "POST"
  },
  "earning": {
    "currency": "TRL",
    "amount": 50,
    "ratio": 2,
    "limit": {
      "amount": 150,
      "times": 3
    }
  },
  "availability": {
    "from": "2012-01-01",
    "to": "2012-12-31",
    "status": "active"
  },
  "rules": {
    "join": "auto | customer | operator",
    "join-term": "frequency | frequency-with-span",
    "start-aggregation": "after-join | begining-of-period"
  },
  "goals": [
    {
      "id": 1,
      "rule": [
        101,
        102,
        1101
      ]
    },
    {
      "id": 2,
      "rule": [
        103,
        1101
      ]
    }
  ]
}
  ],
  "action": {
    "url": "https://api.burgan.com.tr/campaing/adapter/invoce-cashback/{{client-id}}",
    "method": "POST"
  },
  "earning": {
    "currency": "TRL",
    "amount": 50,
    "ratio": 2,
    "limit": {
      "amount": 150,
      "times": 3
    }
  },
  "availability": {
    "from": "2012-01-01",
    "to": "2012-12-31",
    "status": "active"
  },
  "rules": {
    "join": "auto | customer | operator",
    "join-term": "frequency | frequency-with-span",
    "start-aggregation": "after-join | begining-of-period"
  },
  "goals": [
    {
      "id": 1,
      "rule": [
        101,
        102,
        1101
      ]
    },
    {
      "id": 2,
      "rule": [
        103,
        1101
      ]
    }
  ]
}
```
*  **tag** ile kampanyanin ait oldugu grup belirlenir. Bu gruplar icin cati limitler konabilir. 
*  **type** kampanyaninin birlestirilebilir olup olmadigini belirler. Grup ici kampanyalarla birlestirilerek kullanilabilir. *Ratio* bazlı kampanyaların (mevduat veya kredi faizi gibi) toplam erkisini hesaplamak için kullanılır.
* **action** altında kampanya gerçekleştiğinde bildirimde bululacak servis tanımı yapılır. **method** body kabul ediyor ise kampanya ve gerçekleşen veriler JSON formatında submit edilir. Url oluşturulurken yine verilerle templating yapılabilir.
*  **earning-limits** ile müşterinin kampanyada kaç defa veya tutarsal olarak en fazla kaç lira yararlanabileceği belirlenir. 
* **goals** gerçekleşmesi beklenen hedefleri tanımlar. Goals altındaki her bir tanım **OR** olarak değerlendirilir. Goals tanımı içindeki rule dizinindeki goal kayıtları ise kendi aralarında **AND** tanımlıdır.

### Kampanya Çatı Limitleri
Bir musterinin yararlanacagi maksimum tutar, oranlari belirlerlemek icin kullanilir.

```json=
{
  "tag": [
    "odeme cashback",
    "fatura cashback"
  ],
  "frequency": "adhoc | montly| yearly",
  "earning-limits": {
    "currency": "TRL",
    "amount": 5000,
    "ratio": 2,
    "times": 10
  }
}

### Kampanya Katılım

Müşteriler eğer kampanya katılım gerektiren bir kampanya ise katılım kaydı yaparak kampanyadan yararlanabilirler. 

| Client     | Campaign | Status | Joined At  | Join Info |
| ---------- | -------- | ------ | ---------- | --------- |
| 3855206900 | 9001     | joined | 01-11-2021 | {..}      |
| 3855206901 | 9001     | exited | 11-11-2021 | {..}      |
| 3855206902 | 9001     | joined | 14-11-2021 | {..}      |


### Kampanya Gerçekleşme
Her bir hedefe erişildiğinde kampanya tanımına göre kampanya kaydı tetiklenir.

| Client     | Campaign | Status            | Begin      | End        | Completed Goals | Action Result |
| ---------- | -------- | ----------------- | ---------- | ---------- | --------------- | ------------- |
| 3855206900 | 9001     | elapsed           | 01-11-2021 | 30-11-2021 | 101,102         | {...}         |
| 3855206900 | 9001     | partially-elapsed | 01-12-2021 | 31-12-2021 | 101             |               |

:::info
Kampanya configurasyonu ve verilerin sunumu için REST API kullanılacaktır.

Verilerin saklanması için SQL Server **in-memory table** kullanılacaktır.

> Project : **bbt.service.campaign**
:::

