Scripting Referansı
Bu belge, iş akışı kurallarında script yazma için kapsamlı bir referans sağlar. Scriptler, JavaScript kullanarak gelişmiş otomasyon mantığını uygulamanıza olanak tanır.
Genel Bakış
İş akışı kurallarındaki Run Script eylemi, karmaşık destek talebi işleme senaryolarını otomatikleştirmek için JavaScript kodunu çalıştırır. Scriptler, destek talebi verilerine, mesaj bağlamına ve yardımcı fonksiyonlara erişimle korumalı bir ortamda çalışır.
Temel özellikler:
- Destek talebi özelliklerini okuma ve değiştirme
- Müşteri ve sahip bilgilerine erişim
- Özel alanlarla çalışma
- Koşullu mantık ve döngüler kullanma
- Güvenlik için 10 saniyelik yürütme zaman aşımı
Ticket Nesnesi
ticket nesnesi, scriptleriniz için birincil bağlamdır. Destek talebi verilerine hem okuma hem de yazma erişimi sağlar.
Salt Okunur Özellikler
// Temel destek talebi bilgileri
ticket.id // UUID dizesi
ticket.subject // Destek talebi konu satırı
// Mevcut durum (nesne)
ticket.status.id // Durum UUID'si
ticket.status.code // Durum kodu (örn. "open", "closed")
ticket.status.name // Durum görünen adı
// Mevcut öncelik (nesne)
ticket.priority.id // Öncelik UUID'si
ticket.priority.name // Öncelik görünen adı
// Mevcut departman (nesne)
ticket.department.id // Departman UUID'si
ticket.department.name // Departman görünen adı
// Atanan sahip (nesne, tanımsız olabilir)
ticket.owner.id // Kullanıcı UUID'si
ticket.owner.email // Kullanıcı e-postası
ticket.owner.firstname // Kullanıcı adı
ticket.owner.lastname // Kullanıcı soyadı
// Müşteri bilgileri (nesne)
ticket.customer.id // Müşteri UUID'si
ticket.customer.email // Müşteri e-postası
ticket.customer.firstname // Müşteri adı
ticket.customer.lastname // Müşteri soyadı
ticket.customer.name // Müşteri tam adı
// Klasör ve etiketler
ticket.folder // Mevcut klasör: "INBOX", "ASSIGNED", "SPAM", "ARCHIVE"
ticket.tags // Etiket dizelerinin dizisi
Yazılabilir Özellikler
Bu özellikleri doğrudan atama ile değiştirebilirsiniz:
// Durumu kod veya ID ile ayarla
ticket.status = "closed";
ticket.status = "550e8400-e29b-41d4-a716-446655440000";
// Önceliği ad veya ID ile ayarla
ticket.priority = "High";
ticket.priority = "550e8400-e29b-41d4-a716-446655440001";
// Departmanı ad veya ID ile ayarla
ticket.department = "Sales";
ticket.department = "550e8400-e29b-41d4-a716-446655440002";
// Sahibi e-posta veya ID ile ayarla
ticket.owner = "[email protected]";
ticket.owner = "550e8400-e29b-41d4-a716-446655440003";
// Klasörü ayarla
ticket.folder = "ASSIGNED";
ticket.folder = "SPAM";
ticket.folder = "ARCHIVE";
ticket.folder = "INBOX";
// Etiketleri ayarla (mevcut tüm etiketleri değiştirir)
ticket.tags = ["urgent", "vip"];
Özel Alanlar
Özel alanlar, kod kullanılarak okunabilir ve yazılabilir (görünen ad değil).
Özel Alanları Okuma
// Özel alan değerine doğrudan erişim
var orderId = ticket.order_id; // Metin alanı
var amount = ticket.order_amount; // Sayı alanı
var isVip = ticket.is_vip; // Boolean alanı
var region = ticket.region; // Seçim alanı
Özel Alanlara Yazma
// Metin özel alanını ayarla
ticket.order_id = "ORD-12345";
// Sayı özel alanını ayarla
ticket.order_amount = 199.99;
// Boolean özel alanını ayarla
ticket.is_vip = true;
// Seçim özel alanını ayarla
ticket.category = "billing";
// Tarih özel alanını ayarla (ISO 8601 formatı)
ticket.due_date = "2024-12-31T23:59:59Z";
ticket.due_date = "2024-12-31";
Mesaj Nesnesi
message nesnesi, kural bir mesaj olayı (New Customer Reply, New Staff Reply vb.) tarafından tetiklendiğinde kullanılabilir.
if (message) {
message.id // Mesaj UUID'si
message.body_text // Mesaj içeriği (düz metin)
message.body_html // Mesaj içeriği (HTML)
message.createdAt // ISO 8601 zaman damgası
}
Örnek:
if (message && message.body_text) {
var bodyLower = message.body_text.toLowerCase();
if (bodyLower.includes("cancel subscription")) {
ticket.department = "Retention";
ticket.priority = "High";
}
}
Yardımcı Fonksiyonlar
getStatuses()
Mevcut tüm durumların bir dizisini döndürür.
var statuses = getStatuses();
// Döndürür: [{ id: "...", code: "open", name: "Open" }, ...]
// Belirli bir durumu bul
for (var i = 0; i < statuses.length; i++) {
if (statuses[i].code === "pending") {
ticket.status = statuses[i].id;
break;
}
}
getPriorities()
Mevcut tüm önceliklerin bir dizisini döndürür.
var priorities = getPriorities();
// Döndürür: [{ id: "...", name: "Low" }, { id: "...", name: "High" }, ...]
getDepartments()
Mevcut tüm departmanların bir dizisini döndürür.
var departments = getDepartments();
// Döndürür: [{ id: "...", name: "Support" }, { id: "...", name: "Sales" }, ...]
getUsers()
Mevcut tüm kullanıcıların (temsilcilerin) bir dizisini döndürür.
var users = getUsers();
// Döndürür: [{ id: "...", email: "[email protected]", firstname: "John", lastname: "Doe" }, ...]
fetch()
Harici API'lara HTTP istekleri yapar. Senkron - sonucu doğrudan döndürür.
var response = fetch(url, options);
// response: { ok, status, statusText, text, json }
Seçenekler: method (GET/POST/PUT/DELETE), headers (nesne), body (dize veya nesne)
Örnek: CRM'den veri çekme ve özel alanları güncelleme
var response = fetch("https://api.example.com/customers/" + ticket.customer.email, {
headers: { "Authorization": "Bearer YOUR_API_KEY" }
});
if (response.ok && response.json) {
ticket.customer_tier = response.json.tier;
ticket.lifetime_value = response.json.lifetime_value;
if (response.json.tier === "enterprise") {
ticket.priority = "High";
}
}
Örnek: Webhook'a POST
var response = fetch("https://hooks.example.com/helpdesk", {
method: "POST",
body: { ticket_id: ticket.id, customer_email: ticket.customer.email }
});
Notlar: Yalnızca HTTPS, 5 saniye zaman aşımı, 1MB yanıt limiti, dahili ağlar engellenir.
Yaygın Desenler
Koşullu Atama
// Konuya göre öncelik ayarla
if (ticket.subject.toLowerCase().includes("urgent")) {
ticket.priority = "High";
} else if (ticket.subject.toLowerCase().includes("question")) {
ticket.priority = "Low";
}
Departman Yönlendirme
var subject = ticket.subject.toLowerCase();
if (subject.includes("billing") || subject.includes("payment") || subject.includes("invoice")) {
ticket.department = "Billing";
} else if (subject.includes("technical") || subject.includes("bug") || subject.includes("error")) {
ticket.department = "Technical Support";
} else if (subject.includes("sales") || subject.includes("pricing") || subject.includes("quote")) {
ticket.department = "Sales";
}
Müşteri Alanına Dayalı Mantık
if (ticket.customer && ticket.customer.email) {
var email = ticket.customer.email;
var domain = email.split("@")[1];
// Kurumsal müşteri yönetimi
if (domain === "bigcorp.com" || domain === "enterprise.org") {
ticket.priority = "High";
ticket.department = "Enterprise Support";
ticket.is_enterprise = true;
}
// Eğitim kurumu
if (domain.endsWith(".edu")) {
ticket.segment = "education";
}
}
Etiket Yönetimi
// Mevcut etiketleri kaybetmeden etiket ekle
var existingTags = ticket.tags || [];
existingTags.push("processed");
existingTags.push("automated");
ticket.tags = existingTags;
Mesajlarla Çalışma
if (message && message.body_text) {
var body = message.body_text.toLowerCase();
// Hayal kırıklığı anahtar kelimelerini tespit et
var frustrationKeywords = ["frustrated", "angry", "terrible", "worst", "unacceptable"];
for (var i = 0; i < frustrationKeywords.length; i++) {
if (body.includes(frustrationKeywords[i])) {
ticket.priority = "High";
ticket.needs_attention = true;
break;
}
}
}
Dönüşümlü Atama
var users = getUsers();
if (users.length > 0) {
// Destek talebi ID hash'ine dayalı basit dönüşümlü atama
var ticketHash = 0;
for (var i = 0; i < ticket.id.length; i++) {
ticketHash += ticket.id.charCodeAt(i);
}
var assigneeIndex = ticketHash % users.length;
ticket.owner = users[assigneeIndex].email;
}
Hata İşleme
Scriptler güvenli bir ortamda çalıştırılır:
- Sözdizimi hataları yakalanır ve günlüğe kaydedilir; script atlanır.
- Geçersiz alan değerleri (örn. var olmayan durum adı) sessizce yoksayılır.
- Zaman aşımları (10 saniye) sonsuz döngüleri önler.
- Hatalar diğer kurallara veya sistem bileşenlerine yayılmaz.
En İyi Uygulamalar:
// Özelliklere erişmeden önce null/undefined kontrolü
if (ticket.customer && ticket.customer.email) {
// ticket.customer.email'e güvenle erişilebilir
}
if (message) {
// Mesaj özelliklerine güvenle erişilebilir
}
// Karmaşık mantık için try-catch kullan
try {
var data = JSON.parse(ticket.custom_json);
ticket.parsed_field = data.value;
} catch (e) {
// Hatayı zarif bir şekilde işle
}
Sınırlamalar
- Yürütme zaman aşımı: Scriptler 10 saniye sonra sonlandırılır.
- Dosya sistemi erişimi yok: Dosya işlemleri mevcut değildir.
- Kalıcı durum yok: Değişkenler script yürütmeleri arasında kalıcı değildir.
- Salt okunur alanlar:
ticket.id,ticket.subject,ticket.customerdeğiştirilemez. - ES5 JavaScript: Modern JavaScript özellikleri (ok fonksiyonlar, const/let vb.) mevcut olmayabilir.