Müşteri Hizmet ve Mesaj Kancaları
Hizmet detayı ve toplu mesajın on üç kancası: modül paneli, eklentiler, paket değişimi, kullanım grafiği ve mesaj gönderimi.
Genel Bakış
Müşterinin hizmet detayında gördüğü veri ve toplu mesaj gönderimi burada.
Hizmet filtrelerinin ortak deseni görünürlük işaretidir: bir bölümü gizlemek ile içini boşaltmak farklı sonuçlar verir. Mesaj tarafında ise her şey parça üzerinden hesaplanır; alıcı sayısı ücreti vermez.
Referans
Modül panelini değiştirme
Sunucu modülünün ürettiği panel müşteriye gösterilmeden önce çalışır. Uzak panelin çıktısına dokunmanın tek yeri burasıdır.
Hook::add('filter:client.service_management_content', 10, function (&$content, $ctx) {
// Cikti KACISSIZ gosterilir.
if (($ctx['page'] ?? '') !== 'dashboard') return;
$content .= '<div class="alert alert-info">Acme</div>';
});Eklenti listelerini değiştirme
Hizmet detayındaki eklenti listeleri hazırlandıktan sonra çalışır. İki ayrı liste gelir: sahip olunanlar ve satın alınabilecekler.
Hook::add('filter:client.service_detail.addons', 10,
function (&$addonsOwned, &$addonsAvailable, $ctx) {
// Tekliflerden cikarmak satin almayi da engeller.
$addonsAvailable = array_values(array_filter($addonsAvailable,
fn ($a) => Acme::offerAllowed($a, $ctx['service'] ?? [])));
});Paket değişimi kataloğunu değiştirme
Paket yükseltme ve düşürme seçenekleri hazırlandıktan sonra çalışır.
Hook::add('filter:client.service_detail.upgrade_plans', 10, function (&$updown, $ctx) {
// Gizlemek ile bosaltmak farkli sonuclardir.
if (Acme::locked($ctx['service'] ?? [])) $updown['visible'] = false;
});Lisans devri bölümünü değiştirme
Yazılım lisansının devir bölümü hazırlandıktan sonra çalışır.
Hook::add('filter:client.service_detail.license_transfer', 10, function (&$lt, $ctx) {
// Devredilemeyen lisansta bolumu hic gostermeyin.
if (Acme::nonTransferable($ctx['service'] ?? [])) $lt['visible'] = false;
});Hizmet zaman çizelgesini değiştirme
Hizmetin geçmiş satırları ekrana gitmeden önce çalışır. Kendi olaylarınızı çekirdek geçmişin arasına koymanın yeri.
Hook::add('filter:client.service_detail.activity', 10, function (&$activity, $ctx) {
foreach (Acme::events((int) ($ctx['service_id'] ?? 0)) as $e) $activity[] = $e;
});Kullanım grafiğini değiştirme
Metrik kullanım grafiğinin verisi hazırlandıktan sonra çalışır.
Hook::add('filter:client.service_metric_chart', 10, function (&$chart, $ctx) {
// Veri olmayan gun BOS gelir: sifira cevirmeyin.
$chart['acme_limit'] = Acme::planLimit($ctx['metric'] ?? '');
});Mesaj gönderimini durdurma
Müşteri toplu mesaj göndermeden önce çalışır. Ücret hesaplanmış ama henüz tahsil edilmemiştir.
Hook::add('gate:client.sms_send', 10, function ($uid, $origin, $quote, $sendCtx) {
// Ucret hesaplandi ama HENUZ tahsil edilmedi.
if ((int) ($quote['recipients'] ?? 0) > Acme::dailyCap($uid))
return 'Gunluk gonderim sinirini asiyorsunuz.';
return null;
});Mesaj gönderimini izleme
Toplu mesaj gönderildikten sonra çalışır.
Hook::add('action:client.sms_sent', 10, function ($uid, $origin, $quote, $sentCtx) {
// Ucret PARCA uzerinden hesaplanir, alici sayisi uzerinden degil.
Acme::recordUsage($uid, (int) ($quote['total_parts'] ?? 0));
});Gönderici kimliği eklemeyi durdurma
Müşteri yeni bir gönderici kimliği eklemeden önce çalışır.
Hook::add('gate:client.sms_sender_add', 10, function ($uid, $name) {
// Bicim zaten dogrulandi: icerige bakin.
if (Acme::reservedBrand($name)) return 'Bu ad kullanilamaz.';
return null;
});Gönderici kimliğinin eklenmesini izleme
Yeni bir gönderici kimliği eklendikten sonra çalışır. Eklenmiş olması kullanılabilir olduğu anlamına gelmez: bazı ülkelerde ayrıca başvuru gerekir.
Hook::add('action:client.sms_sender_created', 10, function ($uid, $origin) {
// Eklenmis olmasi kullanilabilir oldugu anlamina gelmez.
Acme::noteSender($uid, $origin['name'] ?? '');
});Gönderici başvurusunu izleme
Gönderici kimliği için ön kayıt başvurusu yapıldıktan sonra çalışır.
Hook::add('action:client.sms_sender_requested', 10, function ($uid, $origin, $codes) {
// Her zaman liste gelir.
foreach ($codes as $iso) Acme::trackApplication($uid, $origin['name'] ?? '', $iso);
});Kişi içe aktarımını izleme
Müşteri kişi listesini içe aktardıktan sonra çalışır.
Hook::add('action:client.sms_contacts_imported', 10,
function ($uid, $imported, $skipped, $group_id) {
// Baslik satiri atlananlara dahil degil.
if ($skipped > 0) Acme::warnImportQuality($uid, $imported, $skipped);
});Ülke fiyat tablosunu değiştirme
Müşteriye gösterilen ülke fiyatları hazırlandıktan sonra çalışır.
Hook::add('filter:client.sms_rate', 10, function (&$out, $ctx) {
// Ucret PARCA basinadir.
foreach ($out as $iso => $row)
$out[$iso]['rate'] = Acme::applyMargin((float) ($row['rate'] ?? 0));
});Tuzaklar
Kullanım grafiğinde veri toplanmamış bir gün boş gelir. Bunu sıfıra çevirmek grafiğe gerçekte yaşanmamış bir düşüş koyar ve müşteriye yanlış bir kullanım tablosu gösterir. Boşluğu boş bırakın.
Uzun bir mesaj birden çok parçaya bölünür ve her parça ayrı ücretlendirilir. Alıcı sayısını maliyet sanan bir hesap, uzun mesajlarda gerçek tutarın çok altında kalır. Gönderim özetindeki parça sayısını kullanın.
İ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.