Talep Yönetimi
Destek taleplerini açan, güncelleyen, silen ve yeniden düzenleyen dokuz uç.
Genel Bakış
Bu dokuz uç talebin kendisiyle ilgilenir: açmak, okumak, alanlarını değiştirmek, silmek ve geçmişini görmek. Yanıtlar, notlar ve özel alanlar ayrı uçlarda yaşar; detay ucu onları taşımaz.
Yanına üç yeniden düzenleme işlemi girer. Toplu işlem bir seferde çok talebi kapatır ya da siler. Birleştirme dağılmış bir konuşmayı tek talepte toplar. Bölme ise araya karışmış bir konuyu kendi talebine ayırır.
Bu alan müşteriye dokunur. Talep açmak, çözüldü demek ve bölerken haber vermek birer e-posta üretir; personel atamak da atanana haber gider. Toplu bir betik yazarken bunu hesaba katın.
Referans
Talepleri Listeleme
Destek taleplerini süzerek ve sayfalayarak döndürür.
open, waiting, process, replied, solved.open, waiting, process, replied, solved.curl 'https://panel.ornek.com/api/v1/admin/tickets?status=waiting&limit=25' \
-H "Authorization: Bearer $API_KEY"const url = new URL('https://panel.ornek.com/api/v1/admin/tickets');
url.searchParams.set('status', 'waiting');
const res = await fetch(url, {
headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();$ch = curl_init('https://panel.ornek.com/api/v1/admin/tickets?' . http_build_query(['status' => 'waiting', 'limit' => 25]));
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $apiKey],
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);// Sifreli yanitta onizleme metni BOS gelir; sifreli metin listeye hic konmaz.
$rows = Api::Tickets()->GetTickets([], ['status' => 'waiting'])['data'];
$prev = $rows[0]['last_reply']['message'] ?? null;Talep Açma
Personel adına bir müşteriye talep açar ve ilk mesajı yazar.
open, waiting, process, replied, solved.curl -X POST 'https://panel.ornek.com/api/v1/admin/tickets' \
-H "Authorization: Bearer $API_KEY" \
-H 'Content-Type: application/json' \
-d '{"client_id":2,"subject":"Hos geldiniz","message":"Merhaba {FULL_NAME}, hizmetiniz hazir.","department_id":4}'const res = await fetch('https://panel.ornek.com/api/v1/admin/tickets', {
method: 'POST',
headers: {
Authorization: `Bearer ${apiKey}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
client_id: 2,
subject: 'Welcome aboard',
message: 'Hi {FULL_NAME}, your service {SERVICE} is ready.',
department_id: 4,
}),
});
const body = await res.json();$ch = curl_init('https://panel.ornek.com/api/v1/admin/tickets');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $apiKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'client_id' => 2,
'subject' => 'Welcome aboard',
'message' => 'Hi {FULL_NAME}, your service {SERVICE} is ready.',
'department_id' => 4,
]),
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);// Talep acmak MUSTERIYE MAIL GONDERIR; ice aktarma dongusunde her kayit bir posta demektir.
Api::Tickets()->CreateTicket([
'client_id' => $uid,
'subject' => $subject,
'message' => 'Hi {FULL_NAME}, your service {SERVICE} is ready.',
]);Talep Detayı
Tek bir talebi çözülmüş bağlantılarıyla döndürür.
open, waiting, process, replied, solved.curl 'https://panel.ornek.com/api/v1/admin/tickets/402' \
-H "Authorization: Bearer $API_KEY"const res = await fetch(`https://panel.ornek.com/api/v1/admin/tickets/${id}`, {
headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();$ch = curl_init('https://panel.ornek.com/api/v1/admin/tickets/' . $id);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $apiKey],
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);// Detay MESAJLARI TASIMAZ; yanitlar, notlar ve gecmis ayri uclardan okunur.
$ticket = Api::Tickets()->GetTicket(['id' => $id])['data'];Talebi Güncelleme
Gönderdiğiniz alanları uygular; her değişen alan kendi izini bırakır.
open, waiting, process, replied, solved. Çözüldü ve işlemde durumları müşteriye haber verir.curl -X PATCH 'https://panel.ornek.com/api/v1/admin/tickets/402' \
-H "Authorization: Bearer $API_KEY" \
-H 'Content-Type: application/json' \
-d '{"status":"solved","priority":3}'const res = await fetch(`https://panel.ornek.com/api/v1/admin/tickets/${id}`, {
method: 'PATCH',
headers: {
Authorization: `Bearer ${apiKey}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({ status: 'solved', priority: 3 }),
});
const { meta } = await res.json();
console.log(meta.applied);$ch = curl_init('https://panel.ornek.com/api/v1/admin/tickets/' . $id);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'PATCH',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $apiKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode(['status' => 'solved', 'priority' => 3]),
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);// Ayni degeri gondermek NO-OP'tur; gercekte neyin degistigini meta.applied soyler.
$r = Api::Tickets()->UpdateTicket(['id' => $id, 'status' => 'solved']);
$changed = $r['meta']['applied'];Talebi Silme
Talebi, yanıtlarını ve dosyalarını kaldırır.
curl -X DELETE 'https://panel.ornek.com/api/v1/admin/tickets/404' \
-H "Authorization: Bearer $API_KEY"const res = await fetch(`https://panel.ornek.com/api/v1/admin/tickets/${id}`, {
method: 'DELETE',
headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();$ch = curl_init('https://panel.ornek.com/api/v1/admin/tickets/' . $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);// Cop kutusu YOK: yanitlar, ekler ve ozel alan dosyalari birlikte gider.
Api::Tickets()->DeleteTicket(['id' => $id]);Talep Geçmişi
Talepte ne olduğunu zaman sırasıyla döndürür.
curl 'https://panel.ornek.com/api/v1/admin/tickets/402/history' \
-H "Authorization: Bearer $API_KEY"const res = await fetch(`https://panel.ornek.com/api/v1/admin/tickets/${id}/history`, {
headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();$ch = curl_init('https://panel.ornek.com/api/v1/admin/tickets/' . $id . '/history');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $apiKey],
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);// Olay adi HAM anahtardir; kendi ekraninizda okunur metne siz cevirirsiniz.
$events = Api::Tickets()->GetTicketHistory(['id' => $id])['data'];Toplu İşlem
Birden çok talebi tek çağrıda kapatır ya da siler.
close çözüldü yapar, delete siler, block-close ve block-delete ayrıca müşteriyi talep açmaktan engeller.curl -X POST 'https://panel.ornek.com/api/v1/admin/tickets/bulk' \
-H "Authorization: Bearer $API_KEY" \
-H 'Content-Type: application/json' \
-d '{"ids":[405,406],"action":"close"}'const res = await fetch('https://panel.ornek.com/api/v1/admin/tickets/bulk', {
method: 'POST',
headers: {
Authorization: `Bearer ${apiKey}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({ ids: [405, 406], action: 'close' }),
});
const body = await res.json();$ch = curl_init('https://panel.ornek.com/api/v1/admin/tickets/bulk');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $apiKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode(['ids' => [405, 406], 'action' => 'close']),
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);// Panelin sildirmeden once sordugu sifre adimi API'de YOKTUR; kapi yalnizca kapsamdir.
Api::Tickets()->BulkTicketActions(['ids' => $ids, 'action' => 'close']);Talepleri Birleştirme
Birden çok talebi tek talepte toplar.
curl -X POST 'https://panel.ornek.com/api/v1/admin/tickets/merge' \
-H "Authorization: Bearer $API_KEY" \
-H 'Content-Type: application/json' \
-d '{"ids":[419,418]}'const res = await fetch('https://panel.ornek.com/api/v1/admin/tickets/merge', {
method: 'POST',
headers: {
Authorization: `Bearer ${apiKey}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({ ids: [419, 418] }),
});
const { meta } = await res.json();
console.log(meta.primary_id); // 418$ch = curl_init('https://panel.ornek.com/api/v1/admin/tickets/merge');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $apiKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode(['ids' => [419, 418]]),
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);// Ana talebi SIZ SECMEZSINIZ: en kucuk numara kazanir, digerleri icine katilip silinir.
$r = Api::Tickets()->MergeTickets(['ids' => [419, 418]]);
$primary = $r['meta']['primary_id']; // 418Talebi Bölme
Seçtiğiniz yanıtları yeni bir talebe taşır.
curl -X POST 'https://panel.ornek.com/api/v1/admin/tickets/402/split' \
-H "Authorization: Bearer $API_KEY" \
-H 'Content-Type: application/json' \
-d '{"reply_ids":[846,847],"subject":"Fatura sorusu","department_id":4}'const res = await fetch(`https://panel.ornek.com/api/v1/admin/tickets/${id}/split`, {
method: 'POST',
headers: {
Authorization: `Bearer ${apiKey}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
reply_ids: [846, 847],
subject: 'Billing question split out',
department_id: 4,
}),
});
const body = await res.json();$ch = curl_init('https://panel.ornek.com/api/v1/admin/tickets/' . $id . '/split');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $apiKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'reply_ids' => [846, 847],
'subject' => 'Billing question split out',
'department_id' => 4,
]),
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);// Yanitlar TASINIR, kopyalanmaz: kaynak talepte artik gorunmezler.
$new = Api::Tickets()->SplitTicket([
'id' => $id,
'reply_ids' => $ids,
'subject' => 'Billing question split out',
])['data'];Tuzaklar
Birleştirmede en küçük numaralı talep ana talep olur; dizideki sıra hiçbir şey değiştirmez. Diğerlerinin yanıtları oraya taşınır ve kendileri silinir. Listenin başına yazdığınız numaranın kazanacağını sanmak, konuşmayı beklediğinizin tersi yönde toplar. Sonucu doğrulamak için dönen ana numaraya bakın.
Talep listesindeki son yanıt önizlemesi, yanıt şifreliyse boş gelir. Şifreli metin listeye hiç konmaz, bu kasti bir sınırdır. Önizlemeyi olduğu gibi ekrana basan bir istemci o satırda boşluk gösterir; boş değeri "şifreli" diye işaretlemek doğru davranıştır.
Güncellemede her alan kendi yolunu işletir: durumu çözüldü yapmak müşteriye, personel atamak atanan kişiye bildirim gönderir. Aynı değeri yeniden göndermek hiçbir şey yapmaz, yani bir kayıt gerçekten değiştiğinde posta çıkar. Neyin gittiğini görmek için dönen uygulanan alan listesine bakın.
Toplu işlemin engelleyen iki seçeneği yalnız talepleri kapatıp silmez; müşteriyi de talep açmaktan alıkoyar. Bu, o hesabın destek yolunu kapatan kalıcı bir karardır ve talep silmekle aynı şey değildir. Spam temizliği yazarken engelleyen değil düz seçeneği kullanın.
Talep silindiğinde yanıtları, ekleri, not ekleri ve özel alan dosyaları birlikte gider. Çöp kutusu ya da geri alma yoktur. Kapatmak isteyip silen bir betik, müşterinin geçmişini de götürür; kapatmak için durumu çözüldü yapan güncelleme yeterlidir.
İlgili Makaleler
Geri bildiriminiz için teşekkürler!
Yukarıda bulamadığınız her şey için destek ekibimiz her zaman yanınızda.