Örnekler ve En İyi Uygulamalar
Pi v2 ile geliştirilen örnek uygulamalar ve en iyi uygulamalar.
Basit IVR Menüsü
Temel bir IVR menü sistemi örneği:
// Aramayı yanıtla
await answer();
await addLog("Çağrı yanıtlandı", $arayan, $aranan);
// Hoş geldin mesajı
await tts("Şirketimize hoş geldiniz");
// Ana menü
const mainMenuText = `
Ana menü için seçiminizi yapın:
Satış departmanı için 1,
Teknik destek için 2,
Muhasebe için 3,
Operatöre bağlanmak için 0 tuşlayın
`;
const choice = await getDigitsWithTTS(mainMenuText, 10000, 1);
switch (choice.result) {
case "1":
await tts("Satış departmanına aktarılıyorsunuz");
await redirectToIVR("sales_queue");
break;
case "2":
await tts("Teknik destek departmanına aktarılıyorsunuz");
await redirectToIVR("tech_support_queue");
break;
case "3":
await tts("Muhasebe departmanına aktarılıyorsunuz");
await redirectToIVR("accounting_queue");
break;
case "0":
await tts("Operatöre bağlanıyorsunuz");
await redirectToIVR("operator_queue");
break;
default:
await tts("Geçersiz seçim, operatöre aktarılıyorsunuz");
await redirectToIVR("operator_queue");
}
await addLog("Menü seçimi:", choice.result);
Müşteri Kimlik Doğrulama
Müşteri numarası ile kimlik doğrulama örneği:
await answer();
await tts("Güvenlik için kimlik doğrulama yapacağız");
// Müşteri numarası al
const customerIdPrompt = "Lütfen müşteri numaranızı tuşlayın";
const customerIdInput = await getDigitsWithTTS(customerIdPrompt, 15000, 8);
if (!customerIdInput.result) {
await tts("Müşteri numarası alınamadı, operatöre aktarılıyorsunuz");
await redirectToIVR("operator_queue");
return;
}
// API ile müşteri doğrulama
try {
const customerData = await get(
`https://api.company.com/customer/${customerIdInput.result}`
);
const customer = str2JSON(customerData);
if (customer.phone === $arayan) {
await tts(`Merhaba ${customer.name}, size nasıl yardımcı olabilirim?`);
await addLog("Kimlik doğrulama başarılı:", customer.id, customer.name);
// Müşteri menüsüne yönlendir
await showCustomerMenu(customer);
} else {
await tts("Kimlik doğrulama başarısız, güvenlik nedeniyle çağrı sonlandırılıyor");
await addLog("Kimlik doğrulama başarısız:", customerIdInput.result, $arayan);
await closeCall();
}
} catch (error) {
await addLog("Kimlik doğrulama API hatası:", error.message);
await tts("Sistem hatası, operatöre aktarılıyorsunuz");
await redirectToIVR("operator_queue");
}
async function showCustomerMenu(customer) {
const menuText = `
${customer.name}, aşağıdaki seçeneklerden birini seçin:
Hesap bilgileri için 1,
Son işlemler için 2,
Yeni talep için 3,
Operatör için 0
`;
const choice = await getDigitsWithTTS(menuText, 12000, 1);
switch (choice.result) {
case "1":
await showAccountInfo(customer);
break;
case "2":
await showRecentTransactions(customer);
break;
case "3":
await createNewRequest(customer);
break;
case "0":
await redirectToIVR("operator_queue");
break;
default:
await tts("Geçersiz seçim");
await showCustomerMenu(customer); // Tekrar menü göster
}
}
Anket Uygulaması
Müşteri memnuniyet anketi örneği:
await answer();
await tts("Memnuniyet anketimize katıldığınız için teşekkürler");
const surveyData = {
caller: $arayan,
timestamp: new Date().toISOString(),
responses: {}
};
// Soru 1: Genel memnuniyet
const q1 = await getDigitsWithTTS(
"Hizmetimizden memnuniyetinizi 1 ile 5 arasında değerlendirin. 1 çok kötü, 5 mükemmel",
10000,
1
);
if (q1.result && q1.result >= "1" && q1.result <= "5") {
surveyData.responses.satisfaction = parseInt(q1.result);
const rating = numberToWords(parseInt(q1.result));
await tts(`${rating} puan verdiniz`);
} else {
await tts("Geçersiz değerlendirme");
surveyData.responses.satisfaction = null;
}
// Soru 2: Tekrar tercih
const q2 = await getDigitsWithTTS(
"Bizi tekrar tercih eder misiniz? Evet için 1, Hayır için 2",
8000,
1
);
if (q2.result === "1") {
surveyData.responses.would_recommend = true;
await tts("Teşekkürler");
} else if (q2.result === "2") {
surveyData.responses.would_recommend = false;
await tts("Geri bildiriminiz için teşekkürler");
} else {
surveyData.responses.would_recommend = null;
}
// Soru 3: Yorum bırakma
const q3 = await getDigitsWithTTS(
"Sesli yorum bırakmak ister misiniz? Evet için 1, Hayır için 2",
8000,
1
);
if (q3.result === "1") {
await tts("Lütfen yorumunuzu bırakın, bittiğinde sessiz kalın");
await startVoiceRecord();
// Kullanıcı ses kaydını manuel olarak durdurabilir
const recordBase64 = await stopVoiceRecord();
surveyData.voice_comment_base64 = recordBase64;
await tts("Yorumunuz kaydedildi");
}
// Sonuçları kaydet
try {
const result = await post(
"https://api.company.com/survey/submit",
JSON2str(surveyData),
{ "Content-Type": "application/json" }
);
await tts("Anket tamamlandı, katılımınız için teşekkürler");
await addLog("Anket tamamlandı:", JSON2str(surveyData));
// SMS ile teşekkür
const smsCredentials = {
username: await getVariable("SMS_USERNAME"),
password: await getVariable("SMS_PASSWORD"),
sender: "SURVEY"
};
const thanksSMS = [{
to: $arayan,
text: "Anketimize katıldığınız için teşekkürler! Görüşleriniz bizim için çok değerli."
}];
await sendSMS(smsCredentials, thanksSMS);
} catch (error) {
await addLog("Anket kayıt hatası:", error.message);
await tts("Anket kaydedilirken hata oluştu");
}
await closeCall();
Randevu Sistemi
Otomatik randevu alma sistemi:
await answer();
await tts("Randevu sistemine hoş geldiniz");
// Müşteri kimlik doğrulama
const customerId = await getDigitsWithTTS(
"Müşteri numaranızı giriniz",
12000,
6
);
if (!customerId.result) {
await tts("Müşteri numarası gerekli, çağrı sonlandırılıyor");
await closeCall();
return;
}
// Müşteri bilgilerini al
try {
const customerResponse = await get(
`https://api.clinic.com/customer/${customerId.result}`
);
const customer = str2JSON(customerResponse);
await tts(`Merhaba ${customer.name}`);
// Mevcut randevuları kontrol et
const appointmentsResponse = await get(
`https://api.clinic.com/appointments/${customer.id}`
);
const appointments = str2JSON(appointmentsResponse);
if (appointments.length > 0) {
const nextAppointment = appointments[0];
const appointmentDate = new Date(nextAppointment.date).toLocaleDateString('tr-TR');
await tts(`Mevcut randevunuz: ${appointmentDate} ${nextAppointment.time}`);
const action = await getDigitsWithTTS(
"Yeni randevu için 1, mevcut randevuyu iptal için 2, çıkış için 9",
10000,
1
);
if (action.result === "2") {
await cancelAppointment(nextAppointment.id, customer);
return;
} else if (action.result === "9") {
await tts("İyi günler");
await closeCall();
return;
}
}
// Yeni randevu al
await bookNewAppointment(customer);
} catch (error) {
await addLog("Randevu sistemi hatası:", error.message);
await tts("Sistem hatası, lütfen daha sonra tekrar deneyin");
await closeCall();
}
async function bookNewAppointment(customer) {
// Müsait günleri al
const availableDaysResponse = await get(
"https://api.clinic.com/available-days"
);
const availableDays = str2JSON(availableDaysResponse);
// Günleri seslendir
let daysText = "Müsait günler: ";
availableDays.forEach((day, index) => {
const dayName = new Date(day.date).toLocaleDateString('tr-TR', { weekday: 'long' });
daysText += `${dayName} için ${index + 1}, `;
});
const dayChoice = await getDigitsWithTTS(daysText, 15000, 1);
const selectedDayIndex = parseInt(dayChoice.result) - 1;
if (selectedDayIndex = availableDays.length) {
await tts("Geçersiz gün seçimi");
return;
}
const selectedDay = availableDays[selectedDayIndex];
// Müsait saatleri al
const availableTimesResponse = await get(
`https://api.clinic.com/available-times/${selectedDay.date}`
);
const availableTimes = str2JSON(availableTimesResponse);
// Saatleri seslendir
let timesText = "Müsait saatler: ";
availableTimes.forEach((time, index) => {
timesText += `${time} için ${index + 1}, `;
});
const timeChoice = await getDigitsWithTTS(timesText, 15000, 1);
const selectedTimeIndex = parseInt(timeChoice.result) - 1;
if (selectedTimeIndex = availableTimes.length) {
await tts("Geçersiz saat seçimi");
return;
}
const selectedTime = availableTimes[selectedTimeIndex];
// Randevuyu kaydet
const appointmentData = {
customer_id: customer.id,
date: selectedDay.date,
time: selectedTime,
phone: $arayan
};
try {
const bookingResponse = await post(
"https://api.clinic.com/book-appointment",
JSON2str(appointmentData),
{ "Content-Type": "application/json" }
);
const booking = str2JSON(bookingResponse);
if (booking.success) {
const appointmentDate = new Date(selectedDay.date).toLocaleDateString('tr-TR');
await tts(`Randevunuz ${appointmentDate} ${selectedTime} için kaydedildi`);
// SMS onayı gönder
const smsCredentials = {
username: await getVariable("SMS_USERNAME"),
password: await getVariable("SMS_PASSWORD"),
sender: "CLINIC"
};
const confirmationSMS = [{
to: $arayan,
text: `Randevu Onayı\nTarih: ${appointmentDate}\nSaat: ${selectedTime}\nRandevu No: ${booking.appointment_id}`
}];
await sendSMS(smsCredentials, confirmationSMS);
await tts("SMS ile onay gönderildi");
await addLog("Randevu oluşturuldu:", JSON2str(appointmentData));
} else {
await tts("Randevu kaydedilemedi, lütfen tekrar deneyin");
}
} catch (error) {
await addLog("Randevu kayıt hatası:", error.message);
await tts("Randevu kaydedilirken hata oluştu");
}
}
async function cancelAppointment(appointmentId, customer) {
const confirmation = await getDigitsWithTTS(
"Randevunuzu iptal etmek istediğinizden emin misiniz? Evet için 1, Hayır için 2",
8000,
1
);
if (confirmation.result === "1") {
try {
const cancelResponse = await post(
"https://api.clinic.com/cancel-appointment",
JSON2str({ appointment_id: appointmentId }),
{ "Content-Type": "application/json" }
);
const result = str2JSON(cancelResponse);
if (result.success) {
await tts("Randevunuz iptal edildi");
await addLog("Randevu iptal edildi:", appointmentId, customer.id);
} else {
await tts("Randevu iptal edilemedi");
}
} catch (error) {
await addLog("Randevu iptal hatası:", error.message);
await tts("İptal işleminde hata oluştu");
}
} else {
await tts("Randevunuz korundu");
}
}
En İyi Uygulamalar
1. Hata Yönetimi
// Her async işlemi try-catch ile sarın
try {
const result = await apiCall();
// Başarılı işlem
} catch (error) {
await addLog("Hata:", error.message);
await tts("Bir hata oluştu, lütfen tekrar deneyin");
// Alternatif akış
}
// Timeout'ları uygun şekilde ayarlayın
const userInput = await getDigitsWithTTS(
"Seçiminizi yapın",
10000, // 10 saniye - çok kısa değil, çok uzun değil
1
);
2. Kullanıcı Deneyimi
// Açık ve net talimatlar verin
await tts("Lütfen 1 ile 5 arasında bir rakam tuşlayın");
// Seçenekleri tekrarlama imkanı sunun
const choice = await getDigitsWithTTS(menuText, 12000, 1);
if (!choice.result) {
const retry = await getDigitsWithTTS(
"Seçim yapılmadı. Menüyü tekrar duymak için 1, çıkış için 9 tuşlayın",
8000,
1
);
if (retry.result === "1") {
// Menüyü tekrar göster
}
}
// Bekleme sürelerinde bilgilendirme yapın
await tts("Lütfen bekleyiniz, işleminiz gerçekleştiriliyor");
3. Güvenlik
// Hassas bilgileri loglamayın
await addLog("Kullanıcı girişi alındı"); // ✓ Güvenli
await addLog("Kullanıcı şifresi:", password); // ✗ Güvensiz
// API anahtarlarını environment variable'lardan alın
const apiKey = await getVariable("API_KEY");
// Kullanıcı girişlerini doğrulayın
if (userInput.result && userInput.result.length >= 6) {
// İşleme devam et
} else {
await tts("Geçersiz giriş");
}
4. Performans
// Gereksiz API çağrılarından kaçının
let customerData = null;
if (!customerData) {
customerData = await getCustomerData(customerId);
}
// Paralel işlemler için Promise.all kullanın
const [customerData, appointmentData] = await Promise.all([
```bash
getCustomerData(customerId),
getAppointmentData(customerId)
]);
// Uzun işlemler için progress bildirimi yapın await tts("İşleminiz başlatıldı"); const result = await longRunningOperation(); await tts("İşleminiz tamamlandı");
### 5\. Loglama
```javascript
// Önemli olayları logla
await addLog("Uygulama başlatıldı", $uygulamaId);
await addLog("Kullanıcı seçimi:", userChoice);
await addLog("API çağrısı:", apiEndpoint, "Sonuç:", success ? "Başarılı" : "Hatalı");
await addLog("Uygulama sonlandırıldı");
// Structured logging kullanın
const logData = {
event: "user_action",
action: "menu_selection",
user: $arayan,
selection: choice.result,
timestamp: new Date().toISOString()
};
await addLog("Event:", JSON2str(logData));