# Otomasyon İşleri

https://dev.wisecp.com/tr/otomasyon-isleri

Üç kuyruktaki işleri izleyen ve tek tek ya da toplu yöneten on uç.

## Genel Bakış

Otomasyon **üç kuyruk** taşır: zamanlanmış görevler, modül çağrıları ve bildirimler. Her kuyrukta iş satırları bekler, işlenir, tamamlanır ya da düşer; bu on uç o satırlarla çalışır.

Pano ucu **tek çağrıda** her şeyi verir: işçinin sağlığı, kuyruk sayıları, görev listesi, son işler ve son yirmi dört saatin grafiği. İzleme yazarken beş ayrı çağrı yerine bunu kullanın.

Tek işe dokunan dört uç (yeniden dene, iptal et, kilidi çöz, sil) yanına **kuyruk geneli üç uç** gelir. Sonuncular tek çağrıyla yüzlerce işi birden hareket ettirir ve geri dönüşü yoktur.

## Referans

### Panoyu Okuma

get/api/v1/admin/automation/dashboard

`Automation/GetAutomationDashboard` admin

Otomasyonun bütün durumunu tek çağrıda döndürür.

Sorgu 3

chart_rangestringGrafiğin kapsadığı süre.

chart_stagestringGrafiği belirli bir aşamayla sınırlar.

chart_taskstringGrafiği tek bir göreve daraltır.

Dönen alanlar data — 5

statusobjectİşçinin anlık durumu: sağlığı, son koşusu, kaç saniye önce koştuğu, sıradaki koşuya kalan süre, sıradaki görev ve bekleyen toplam iş.

statsobjectKuyruk ve sistem sayıları: kuyruk başına bekleyen, işlenen, gün içinde tamamlanan ve düşen; sistemde açık iş, bekleyen iş, en uzun bekleme ve koşular arası boşluk.

tasksarrayGörev listesi: adı, görünen adı, sıklığı, kapalı olup olmadığı, bekleyen ve işlenen iş sayısı, gün içindeki tamamlanan ve düşen sayısı, son hatası.

jobsobjectSon elli iş satırı, toplam iş sayısı ve geri yükleme şüphesinin durumu.

chartarraySon yirmi dört saatin tip başına başarı ve başarısızlık dökümü.

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/automation/dashboard' \
  -H "Authorization: Bearer $API_KEY"
```

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

if (data.status.status !== 'ok') console.warn('worker', data.status.status);
```

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

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

```php
// Izleme icin TEK cagri yeter; pano bes ayri ucun verisini birlikte tasir.
$d = Api::Automation()->GetAutomationDashboard()['data'];
$healthy = $d['status']['status'] === 'ok';
```

### İşleri Listeleme

get/api/v1/admin/automation/jobs

`Automation/GetAutomationJobs` admin imleçli sayfalama

Kuyruk beslemesini en yeniden eskiye doğru döndürür.

Sorgu 2

limitintKaç satır gelsin. On ile iki yüz arasına çekilir.

before_idintBu numaradan eski satırları getirir. Geriye doğru sayfalamanın yoludur.

Dönen alanlar data — 4

jobsarrayİş satırları: numarası, tipi, başlığı, durumu, etiketi, zamanı, deneme sayısı ve tahmini başlangıcı.

totalintKuyruktaki toplam satır. Yalnız ilk beslemede gelir.

restore_activeboolGeri yükleme şüphesinin açık olup olmadığı. Yalnız ilk beslemede gelir.

has_moreboolDaha eski satır var mı. Yalnız imleçli çağrıda gelir.

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/automation/jobs?limit=50' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const url = new URL('https://panel.ornek.com/api/v1/admin/automation/jobs');
url.searchParams.set('limit', '50');

const res  = await fetch(url, {
  headers: { Authorization: `Bearer ${apiKey}` },
});
const { data } = await res.json();

// Daha eskisi: url.searchParams.set('before_id', data.jobs.at(-1).id)
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/automation/jobs?' . http_build_query(['limit' => 50]));
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

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

```php
// Toplam sayi ve geri yukleme isareti YALNIZ ilk cagrida gelir; imlecli cagri onlari tasimaz.
$first = Api::Automation()->GetAutomationJobs()['data'];
$older = Api::Automation()->GetAutomationJobs([], [
    'before_id' => end($first['jobs'])['id'],
]);
```

### İş Detayı

get/api/v1/admin/automation/jobs/{queue}/{id}

`Automation/GetAutomationJob` admin

Tek bir işin bütün satırını yükü ve günlükleriyle döndürür.

Yol 2

queuestringHangi kuyruk: `cron`, `module`, `notification`.

idintİşin numarası.

Dönen alanlar data

idintİşin numarası.

typestringİşin tipi.

statusstringİşin durumu.

attemptsintKaç kez denendiği.

created_atstringKuyruğa girdiği an.

completed_atstringBittiği an.

payloadobjectİşe verilen veri. Çözülmüş hâlde gelir.

process_logsobjectKoşu sırasında tutulan günlükler.

result_payloadobjectİşin bıraktığı sonuç.

result_summaryobjectSonucun okunur özeti. Zamanlanmış görev kuyruğunda gelir.

Hatalar 4

invalid_queue422Kuyruk anahtarı tanınmıyor.

invalid_id422İş numarası geçersiz.

not_found404İş bulunamadı.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

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

```bash
curl 'https://panel.ornek.com/api/v1/admin/automation/jobs/cron/9001' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res  = await fetch(`https://panel.ornek.com/api/v1/admin/automation/jobs/cron/${id}`, {
  headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
```

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

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

```php
// Donen alanlar KUYRUGA gore degisir; ortak olanlarin disini varsaymadan okuyun.
$job = Api::Automation()->GetAutomationJob(['queue' => 'cron', 'id' => $id])['data'];
$logs = $job['process_logs'] ?? [];
```

### İşi Yeniden Denetme

post/api/v1/admin/automation/jobs/{queue}/{id}/retry

`Automation/RetryAutomationJob` admin

İşi yeniden bekleyenler arasına alır.

Gövde —

——Gövde gerekmez, boş gönderin. İşi adresteki kuyruk ve kimlik belirler.

Dönen alanlar data — 3

retriedboolİşlem çalıştı mı.

queuestringİşin kuyruğu.

idintİşin numarası.

Hatalar 3

invalid_queue422Kuyruk anahtarı tanınmıyor.

invalid_id422İş numarası geçersiz.

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/automation/jobs/cron/9001/retry' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res = await fetch(`https://panel.ornek.com/api/v1/admin/automation/jobs/cron/${id}/retry`, {
  method: 'POST',
  headers: { Authorization: `Bearer ${apiKey}` },
});

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/automation/jobs/cron/' . $id . '/retry');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

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

```php
// Deneme sayaci SIFIRLANIR: is yeniden dusense de bastan basliyormus gibi gorunur.
Api::Automation()->RetryAutomationJob(['queue' => 'cron', 'id' => $id]);
```

### İşi İptal Etme

post/api/v1/admin/automation/jobs/{queue}/{id}/cancel

`Automation/CancelAutomationJob` admin

İşin durumunu iptal edildi yapar.

Gövde —

——Gövde gerekmez, boş gönderin. İşi adresteki kuyruk ve kimlik belirler.

Dönen alanlar data — 3

cancelledboolİşlem çalıştı mı.

queuestringİşin kuyruğu.

idintİşin numarası.

Hatalar 3

invalid_queue422Kuyruk anahtarı tanınmıyor.

invalid_id422İş numarası geçersiz.

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/automation/jobs/cron/9001/cancel' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res = await fetch(`https://panel.ornek.com/api/v1/admin/automation/jobs/cron/${id}/cancel`, {
  method: 'POST',
  headers: { Authorization: `Bearer ${apiKey}` },
});

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/automation/jobs/cron/' . $id . '/cancel');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

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

```php
// Iptal ZATEN KOSAN isi durdurmaz; yalniz kuyruk satirinin durumunu degistirir.
Api::Automation()->CancelAutomationJob(['queue' => 'cron', 'id' => $id]);
```

### Takılı Kilidi Çözme

post/api/v1/admin/automation/jobs/{queue}/{id}/reclaim

`Automation/ReclaimAutomationJob` admin çift koşum riski

Çöken bir işçinin üzerinde bıraktığı kilidi çözer.

Gövde —

——Gövde gerekmez, boş gönderin. İşi adresteki kuyruk ve kimlik belirler.

Dönen alanlar data — 3

reclaimedboolİşlem çalıştı mı.

queuestringİşin kuyruğu.

idintİşin numarası.

Hatalar 3

invalid_queue422Kuyruk anahtarı tanınmıyor.

invalid_id422İş numarası geçersiz.

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/automation/jobs/cron/9001/reclaim' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res = await fetch(`https://panel.ornek.com/api/v1/admin/automation/jobs/cron/${id}/reclaim`, {
  method: 'POST',
  headers: { Authorization: `Bearer ${apiKey}` },
});

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/automation/jobs/cron/' . $id . '/reclaim');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

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

```php
// Isci HALA CALISIYORSA is iki kez kosar; once en uzun bekleme suresine bakin.
$d = Api::Automation()->GetAutomationDashboard()['data'];
if ($d['status']['status'] === 'dead')
    Api::Automation()->ReclaimAutomationJob(['queue' => 'cron', 'id' => $id]);
```

### İşi Silme

delete/api/v1/admin/automation/jobs/{queue}/{id}

`Automation/DeleteAutomationJob` admin

İş satırını kuyruktan kaldırır.

Dönen alanlar data — 3

deletedboolSilme çalıştı mı.

queuestringİşin kuyruğu.

idintSilinen işin numarası.

Hatalar 3

invalid_queue422Kuyruk anahtarı tanınmıyor.

invalid_id422İş numarası geçersiz.

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/automation/jobs/cron/9001' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res = await fetch(`https://panel.ornek.com/api/v1/admin/automation/jobs/cron/${id}`, {
  method: 'DELETE',
  headers: { Authorization: `Bearer ${apiKey}` },
});

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/automation/jobs/cron/' . $id);
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
// Silmek yerine IPTAL edin: kayit kalir, is de bir daha alinmaz.
Api::Automation()->CancelAutomationJob(['queue' => 'cron', 'id' => $id]);
```

### Toplu Silme

post/api/v1/admin/automation/jobs/{queue}/bulk-delete

`Automation/BulkDeleteAutomationJobs` admin

Verdiğiniz iş numaralarını tek çağrıda siler.

Gövde 1

idsint[]reqSilinecek iş numaraları. Sıfır ve altı atılır, tekrarlananlar birleştirilir.

Dönen alanlar data — 3

deletedboolİşlem çalıştı mı.

queuestringİşlerin kuyruğu.

countintSilinen iş sayısı.

Hatalar 3

invalid_queue422Kuyruk anahtarı tanınmıyor.

ids_required422Hiç iş numarası verilmedi.

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/automation/jobs/cron/bulk-delete' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"ids":[9001,9002,9003]}'
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/automation/jobs/cron/bulk-delete', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ ids: [9001, 9002, 9003] }),
});

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/automation/jobs/cron/bulk-delete');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode(['ids' => [9001, 9002, 9003]]),
]);

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

```php
// Donen sayi gonderdiginizden AZ olabilir: baska kuyruga ait numaralar silinmez.
$n = Api::Automation()->BulkDeleteAutomationJobs([
    'queue' => 'cron', 'ids' => $ids,
])['data']['count'];
```

### Bütün Düşenleri Yeniden Denetme

post/api/v1/admin/automation/jobs/{queue}/retry-all-failed

`Automation/RetryAllFailedAutomationJobs` admin kuyruk geneli

Kuyruktaki bütün düşmüş işleri yeniden bekleyenlere alır.

Gövde —

——Gövde gerekmez, boş gönderin. Kuyruğu adres belirler; kapsam daraltılamaz, içindeki düşmüş işlerin tümü alınır.

Dönen alanlar data — 2

retriedboolİşlem çalıştı mı.

queuestringİşlenen kuyruk. Kaç işin etkilendiği dönmez.

Hatalar 2

invalid_queue422Kuyruk anahtarı tanınmıyor.

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/automation/jobs/cron/retry-all-failed' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/automation/jobs/cron/retry-all-failed', {
  method: 'POST',
  headers: { Authorization: `Bearer ${apiKey}` },
});

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/automation/jobs/cron/retry-all-failed');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

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

```php
// AYNI SEBEPLE dusmus yuzlerce is ayni anda yeniden kosar ve yine duser.
// Once bir isin detayindan sebebi okuyun, sonra bu cagriyi yapin.
Api::Automation()->RetryAllFailedAutomationJobs(['queue' => 'cron']);
```

### Bütün Bekleyenleri İptal Etme

post/api/v1/admin/automation/jobs/{queue}/cancel-all-pending

`Automation/CancelAllPendingAutomationJobs` admin kuyruk geneli

Kuyrukta bekleyen bütün işleri iptal eder.

Gövde —

——Gövde gerekmez, boş gönderin. Kuyruğu adres belirler; kapsam daraltılamaz, içinde bekleyen işlerin tümü alınır.

Dönen alanlar data — 2

cancelledboolİşlem çalıştı mı.

queuestringİşlenen kuyruk. Kaç işin iptal edildiği dönmez.

Hatalar 2

invalid_queue422Kuyruk anahtarı tanınmıyor.

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/automation/jobs/cron/cancel-all-pending' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/automation/jobs/cron/cancel-all-pending', {
  method: 'POST',
  headers: { Authorization: `Bearer ${apiKey}` },
});

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/automation/jobs/cron/cancel-all-pending');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

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

```php
// Bekleyen isler FATURA, BILDIRIM ve saglayici cagrilaridir; hepsi birden duser.
Api::Automation()->CancelAllPendingAutomationJobs(['queue' => 'cron']);
```

## Tuzaklar

> **Kuyruk geneli uçlar geri alınamaz**
> 
> Bütün düşenleri yeniden denetmek ve bütün bekleyenleri iptal etmek **tek çağrıda yüzlerce işi** hareket ettirir; hangi işlerin etkilendiğini de söylemez. Bekleyenleri iptal etmek kesilmemiş faturaları, gönderilmemiş bildirimleri ve sağlayıcıya gitmemiş çağrıları birden düşürür. Önce beslemeden ne olduğuna bakın.

> **Kilit çözmek işi iki kez çalıştırabilir**
> 
> Kilit çözme ucu, işi alan işçinin **öldüğünü varsayar**. İşçi hâlâ çalışıyorsa iş ikinci kez alınır ve aynı fatura iki kez kesilebilir. Bu ucu kullanmadan önce panodaki işçi sağlığına bakın; canlı bir işçide takılı görünen iş çoğu zaman yalnız uzun sürüyordur.

> **İptal çalışan işi durdurmaz**
> 
> İptal ucu kuyruk satırının **durumunu değiştirir**, çalışan süreci öldürmez. İşlenmekte olan bir işi iptal etmek onu yarıda kesmez; iş bittiğinde kendi sonucunu yazar. Gerçekten durdurmanız gereken bir şey varsa cron anahtarını kapatmak tek yoldur.

> **Yeniden deneme sayacı sıfırlar**
> 
> Bir işi yeniden denemek **deneme sayacını sıfırlar**. Yani üç kez düşmüş bir iş, yeniden denendikten sonra ilk kez koşuyormuş gibi görünür ve yeniden düşse de sayaç birden başlar. Sorunlu işleri sayaca bakarak ayıklayan bir denetim yazıyorsanız bu ayrımı kaçırırsınız.

> **Toplu silme kuyruğa bağlıdır**
> 
> Toplu silme **yalnız adres yolundaki kuyrukta** arar; başka bir kuyruğa ait numaralar sessizce atlanır. Dönen sayı gönderdiğinizden az çıkarsa hata yoktur, numaralar başka kuyruktadır. Karışık bir liste siliyorsanız numaraları kuyruğa göre ayırıp ayrı çağrılar yapın.

## İlgili Makaleler

- [Zamanlanmış Görevler](https://dev.wisecp.com/tr/zamanlanmis-gorevler)
- [Cron Ayarları](https://dev.wisecp.com/tr/cron-ayarlari)
- [Kuyruk Bakımı](https://dev.wisecp.com/tr/kuyruk-bakimi)
