# Bildirim Şablonu Yönetimi

https://dev.wisecp.com/tr/bildirim-sablonu-yonetimi

Bildirim şablonlarını listeleyen, ekleyen, okuyan, düzenleyen ve kaldıran beş uç.

## Genel Bakış

Bir bildirim şablonu iki ayrı yerde yaşar. **Davranışı** ayar dosyasındadır: açık mı, kime gider, hangi kanaldan. **Metni** ise dil başına ayrı dosyalardadır: konu, e-posta gövdesi ve kısa mesaj.

Bu ayrım uçlara yansır. Liste ucu yalnız davranışı verir; metni görmek için tek şablonu okumak gerekir.

Şablonlar gruplara ayrılır ve bir grup kendi kurallarını getirir: fatura belgesi eklemek yalnız fatura grubunda anlamlıdır, diğer gruplarda gönderilse de yok sayılır.

## Referans

### Şablonları Listeleme

get/api/v1/admin/notifications/templates

`Notifications/GetNotificationTemplates` admin

Bütün bildirim şablonlarını gruplarıyla döndürür.

Dönen alanlar data[] — 3

groupstringGrubun anahtarı.

namestringGrubun çevrilmiş adı.

templatesarray templates[]Gruptaki şablonlar.

groupstringŞablonun grubu.

keystringŞablonun anahtarı.

namestringÇevrilmiş adı.

statusintŞablon açık mı.

customboolElle eklenmiş bir şablon mu.

user_mailintMüşteriye e-posta gitsin mi.

admin_mailintPersonele e-posta gitsin mi.

user_smsintMüşteriye kısa mesaj gitsin mi.

admin_smsintPersonele kısa mesaj gitsin mi.

send_pdfintFatura belgesi eklensin mi. Fatura grubu dışında boş gelir.

emailsstringEk e-posta alıcıları.

phonesstringEk telefon alıcıları.

departmentsint[]Bağlı departman numaraları.

variablesstringŞablonda kullanılabilecek değişkenler.

Hatalar 1

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl 'https://panel.ornek.com/api/v1/admin/notifications/templates' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/notifications/templates', {
  headers: { Authorization: `Bearer ${apiKey}` },
});

const { data } = await res.json();
const flat = data.flatMap((g) => g.templates);
const off  = flat.filter((t) => ! t.status);
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/notifications/templates');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// Liste GRUPLUDUR ve icerik metni TASIMAZ: konu ve govde ancak detay ucunda gelir.
$groups = Api::Notifications()->GetNotificationTemplates()['data'];
$flat   = array_merge(...array_column($groups, 'templates'));
```

### Şablon Ekleme

post/api/v1/admin/notifications/templates

`Notifications/CreateNotificationTemplate` admin

Bir grup altında yeni bir şablon açar.

Gövde 2

groupstringreqGrubun anahtarı.

keystringreqŞablonun anahtarı. Eğik çizgi, nokta ve virgül tireye çevrilir.

Dönen alanlar 201 — data — 14

dataobjectOluşan şablon. Listedeki şablon nesnesiyle aynı şekildedir.

Hatalar 6

group_required422Grup verilmedi.

key_required422Anahtar verilmedi.

invalid_group422Grup metin yerine liste veya nesne olarak gönderildi.

invalid_key422Anahtar metin yerine liste veya nesne olarak gönderildi.

already_exists422Bu grup ve anahtarda şablon zaten var.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl -X POST 'https://panel.ornek.com/api/v1/admin/notifications/templates' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"group":"account","key":"welcome-message"}'
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/notifications/templates', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ group: 'account', key: 'welcome-message' }),
});

const { data } = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/notifications/templates');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode(['group' => 'account', 'key' => 'welcome-message']),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// Yeni sablon BOS dogar ve cekirdek onu kendiliginden GONDERMEZ; iceriginizi ve tetigi siz kurun.
Api::Notifications()->CreateNotificationTemplate(['group' => 'account', 'key' => 'welcome-message']);
Api::Notifications()->UpdateNotificationTemplate([
    'group' => 'account', 'key' => 'welcome-message',
    'contents' => ['en' => ['subject' => 'Welcome', 'mail_content' => $html]],
]);
```

### Şablonu Okuma

get/api/v1/admin/notifications/templates/{group}/{key}

`Notifications/GetNotificationTemplate` admin

Şablonun ayarlarını ve her dildeki metnini döndürür.

Dönen alanlar data — 15

groupstringŞablonun grubu.

keystringŞablonun anahtarı.

namestringÇevrilmiş adı.

statusintŞablon açık mı.

customboolElle eklenmiş bir şablon mu.

user_mailintMüşteriye e-posta gitsin mi.

admin_mailintPersonele e-posta gitsin mi.

user_smsintMüşteriye kısa mesaj gitsin mi.

admin_smsintPersonele kısa mesaj gitsin mi.

send_pdfintFatura belgesi eklensin mi. Fatura grubu dışında boş gelir.

emailsstringEk e-posta alıcıları.

phonesstringEk telefon alıcıları.

departmentsint[]Bağlı departman numaraları.

variablesstringŞablonda kullanılabilecek değişkenler.

contentsobject contents.Dil başına metin.

subjectstringE-posta konusu.

mail_contentstringE-posta gövdesi.

sms_contentstringKısa mesaj metni.

Hatalar 2

not_found404Şablon bulunamadı.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl 'https://panel.ornek.com/api/v1/admin/notifications/templates/invoice/invoice-created' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res = await fetch(`https://panel.ornek.com/api/v1/admin/notifications/templates/${group}/${key}`, {
  headers: { Authorization: `Bearer ${apiKey}` },
});

const { data } = await res.json();
const missing = langs.filter((l) => ! data.contents[l]?.subject);
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/notifications/templates/' . $group . '/' . $key);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// Kullanilabilir degiskenler burada yazar; sablona baska bir degisken yazmak METIN olarak gider.
$t = Api::Notifications()->GetNotificationTemplate(['group' => $g, 'key' => $k])['data'];
$allowed = $t['variables'];
```

### Şablonu Güncelleme

patch/api/v1/admin/notifications/templates/{group}/{key}

`Notifications/UpdateNotificationTemplate` admin

Gönderdiğiniz ayarları ve metinleri yazar, gerisine dokunmaz.

Gövde 10

statusintŞablon açık mı.

user_mailintMüşteriye e-posta gitsin mi.

admin_mailintPersonele e-posta gitsin mi.

user_smsintMüşteriye kısa mesaj gitsin mi.

admin_smsintPersonele kısa mesaj gitsin mi.

send_pdfintFatura belgesi eklensin mi. Fatura grubu dışında yok sayılır.

emailsstringEk e-posta alıcıları, virgülle ya da satır sonuyla ayrılmış.

phonesstringEk telefon alıcıları, virgülle ya da satır sonuyla ayrılmış.

departmentsint[]Departman numaraları. Liste yerine geçer, üzerine eklemez.

contentsobject contents.Dil başına metin.

subjectstringE-posta konusu.

mail_contentstringE-posta gövdesi.

sms_contentstringKısa mesaj metni.

Dönen alanlar data — 15

dataobjectGüncel şablon. Okuma ucuyla aynı şekildedir.

Hatalar 13

not_found404Şablon bulunamadı.

invalid_emails422E-posta alıcıları metin yerine liste veya nesne olarak gönderildi.

invalid_phones422Telefon alıcıları metin yerine liste veya nesne olarak gönderildi.

invalid_status422Açma kapama anahtarı liste veya nesne olarak gönderildi.

invalid_user_mail422Müşteri e-posta anahtarı liste veya nesne olarak gönderildi.

invalid_admin_mail422Personel e-posta anahtarı liste veya nesne olarak gönderildi.

invalid_user_sms422Müşteri mesaj anahtarı liste veya nesne olarak gönderildi.

invalid_admin_sms422Personel mesaj anahtarı liste veya nesne olarak gönderildi.

invalid_send_pdf422Fatura belgesi anahtarı liste veya nesne olarak gönderildi.

invalid_departments422Departman listesindeki bir öğe numara yerine liste veya nesne.

invalid_contents422Metin dile göre gruplanmamış ya da bir parçası metin değil.

config_write_failed422Ayar dosyası yazılamadı.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl -X PATCH 'https://panel.ornek.com/api/v1/admin/notifications/templates/invoice/invoice-created' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"status":1,"user_mail":1,"departments":[1,2]}'
```

```javascript
const res = await fetch(`https://panel.ornek.com/api/v1/admin/notifications/templates/${group}/${key}`, {
  method: 'PATCH',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    status: 1,
    contents: { en: { subject: 'Your invoice', mail_content: html } },
  }),
});

const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/notifications/templates/' . $group . '/' . $key);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'PATCH',
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode(['status' => 1]),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// Departman listesi YERINE GECER; birini eklemek icin once mevcut listeyi okuyun.
$t = Api::Notifications()->GetNotificationTemplate(['group' => $g, 'key' => $k])['data'];
$t['departments'][] = $newDid;

Api::Notifications()->UpdateNotificationTemplate([
    'group' => $g, 'key' => $k, 'departments' => $t['departments'],
]);
```

### Şablonu Silme

delete/api/v1/admin/notifications/templates/{group}/{key}

`Notifications/DeleteNotificationTemplate` admin

Şablonu ve bütün dillerdeki metinlerini siler.

Dönen alanlar data — 3

deletedboolSilme çalıştı mı.

groupstringGrubun anahtarı.

keystringSilinen şablonun anahtarı.

Hatalar 2

not_found404Şablon bulunamadı.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl -X DELETE 'https://panel.ornek.com/api/v1/admin/notifications/templates/account/welcome-message' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res = await fetch(`https://panel.ornek.com/api/v1/admin/notifications/templates/${group}/${key}`, {
  method: 'DELETE',
  headers: { Authorization: `Bearer ${apiKey}` },
});

const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/notifications/templates/' . $group . '/' . $key);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'DELETE',
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// Cekirdegin KENDI sablonunu silmek o olayin bildirimini komple susturur; durumu kapatmak yeter.
Api::Notifications()->UpdateNotificationTemplate(['group' => $g, 'key' => $k, 'status' => 0]);
```

## Tuzaklar

> **Departman listesi yerine geçer**
> 
> Güncellemede gönderdiğiniz departman listesi mevcut olanın **yerine geçer**. Bir departman eklemek isterken yalnız onu göndermek diğerlerini kaldırır ve o departmanlar bildirimi almaz olur. Önce okuyup listeyi birleştirin.

> **Bilinmeyen değişken metin olarak gider**
> 
> Şablonun kullanabileceği değişkenler kendi kaydında yazılıdır. Listede olmayan bir değişken yazmak **hata vermez**; bildirim gider ve müşteri süslü parantezli ham metni görür. Metni yazmadan önce izin verilen listeyi okuyun.

> **Yeni şablon kendiliğinden gönderilmez**
> 
> Elle eklenen bir şablon yalnız bir kayıttır: çekirdekte onu tetikleyen bir olay **yoktur**. Gönderilmesi için bir modülün ya da kancanın onu çağırması gerekir. Şablonu açmak tek başına hiçbir mesaj üretmez.

> **İki şablonun durumu kayıt ayarına bağlıdır**
> 
> E-posta ve telefon doğrulama şablonlarının açık kapalı durumu, **kayıt doğrulama ayarıyla** birlikte hareket eder. Şablonu kapatmak kayıt akışındaki doğrulamayı da kapatır. Bunu bir görünüm ayarı sanıp değiştirmek yeni üyelerin doğrulamasını düşürür.

> **Belge eki grup dışında sessizce düşer**
> 
> Fatura belgesi ekleme ayarı yalnız fatura grubunda çalışır. Başka bir grubun şablonuna gönderirseniz **hata almazsınız**, değer yok sayılır ve okuma ucunda boş görünür. Bunu kaydın çalışmadığı sanmayın.

> **Yanlış tip güncellemenin tamamını durdurur**
> 
> Metin ya da 0 ve 1 beklenen bir alana liste veya nesne gönderirseniz istek 422 ile **reddedilir**. O istekteki hiçbir şey kaydedilmez, doğru gönderilen alanlar da. Hatada adı geçen alanı düzeltip isteği yeniden gönderin.

## İlgili Makaleler

- [Bildirim Düzeni](https://dev.wisecp.com/tr/bildirim-duzeni)
- [Personel Departmanları](https://dev.wisecp.com/tr/personel-departmanlari)
- [Dil Paketleri](https://dev.wisecp.com/tr/dil-paketleri)
