Fatura Yaşam Döngüsü Kancaları
Faturanın kesilmesinden silinmesine on altı kanca: oluşturma kapısı, iki ayrı oluşturma olayı, durum geçişleri ve silme.
Genel Bakış
Fatura kancalarında dikkat edilecek ilk şey iki ayrı oluşturma olayının bulunmasıdır. Biri yalnız yenileme faturalarında çalışır, diğeri her fatura için. Adları benzediği için sık karıştırılır.
İkinci nokta paranın nerede olduğudur: fatura kesmek para almak değildir. Ödeme ayrı kancalarda gelir ve durum geçişi ödendi olduğunda tamamlanır.
Referans
Yenileme faturasını atlamak
Yenileme faturası kesilmeden önce çalışır. Bu kapı zamanlanmış görev içindedir; durdurmak hata üretmez, işi atlar.
service ya da addon.Hook::add('gate:invoice.create', 10, function ($target_type, $target_id, $duedate) {
// Iptal talebi acikken yenileme faturasi kesmek musteriyi kizdirir.
if ($target_type === 'service' && Acme::cancelPending($target_id))
return 'Iptal talebi acik; yenileme faturasi kesilmedi.';
return null;
});Fatura kaydını yazılmadan değiştirme
Fatura satırı veritabanına yazılmadan önce çalışır.
user_id, user_data, currency, status, toplamlar, pmethod. JSON alanlar bu noktada kodlanmış hâldedir; ham dizi beklemeyin.Hook::add('filter:invoice.create_payload', 10, function (&$data) {
// Kendi referansinizi ekleyin; JSON alanlar zaten kodlanmis gelir.
$data['notes'] = trim(($data['notes'] ?? '') . ' ' . Acme::stamp());
});Her faturayı yakalama
Her fatura yazıldıktan sonra çalışır: yenileme, elle kesilen, sipariş faturası, hepsi.
0 gelir; kontrol etmeden kullanmayın.Hook::add('action:invoice.created.any', 10, function ($invoice_id, $data) {
if ($invoice_id === 0) return; // yazma dustu
Accounting::mirror($invoice_id, $data);
});Yenileme faturasını yakalama
Yenileme faturası kesildikten sonra çalışır. Her fatura için değil: elle kesilen ve sipariş faturaları buraya gelmez.
Hook::add('action:invoice.created', 10, function ($invoice_id) {
// Bu YALNIZ yenileme faturalaridir; hepsini istiyorsaniz .any kullanin.
Dunning::scheduleReminder((int) $invoice_id);
});Elle kesilen faturayı yakalama
Operatör panelden fatura kestiğinde çalışır.
Hook::add('action:invoice.created_manually', 10, function ($invoice_id, $data) {
// Elle kesilen fatura otomatik olanlardan ayri raporlanir.
Accounting::tagManual((int) $invoice_id);
});Fatura durum geçişini durdurma
Fatura durumu değişmeden önce çalışır.
paid, unpaid, cancelled, refund, waiting.Hook::add('gate:invoice.status_change', 10,
function ($invoice, $status, $old_status, $options) {
// Odenmis faturayi geri almak muhasebeyi bozar.
if ($old_status === 'paid' && $status === 'unpaid')
return 'Odenmis fatura odenmemise cevrilemez.';
return null;
});Fatura durumunu izleme
Durum yazıldıktan sonra çalışır.
Hook::add('action:invoice.status_changed', 10,
function ($invoice, $status, $old_status, $options) {
// Para GERCEKTEN girdi mi? Yalniz odenmise gecise tepki verin.
if ($status === 'paid' && $old_status !== 'paid')
Accounting::settled((int) ($invoice['id'] ?? 0), $options['pmethod'] ?? '');
});Fatura silmeyi durdurma
Fatura silinmeden önce çalışır.
status, taxed, total. Resmileşmiş faturayı silmek yasal iz bırakmaz; bu alanları kontrol edin.Hook::add('gate:invoice.delete', 10, function ($id, $invoice) {
// Resmilesmis fatura silinmez; iptal edilir.
if (!empty($invoice['taxed'])) return 'Resmilesmis fatura silinemez.';
return null;
});Fatura silinmesini izleme
Bir fatura silindikten sonra çalışır. Kayıt artık yoktur: elinizdeki anlık görüntü son kopyadır.
Hook::add('action:invoice.deleted', 10, function ($id, $invoice) {
// Kayit gitti: gerekli alani anlik goruntuden alin.
Acme::voidInAccounting($id, $invoice['number'] ?? '');
});Kalem ayırmayı izleme
Bir faturanın kalemleri yeni bir faturaya taşındıktan sonra çalışır. Ortada artık iki fatura vardır.
Hook::add('action:invoice.items_split', 10,
function ($source_invoice_id, $new_invoice_id, $item_ids) {
// Iki fatura da muhasebeye ayri ayri gitmeli.
Acme::resync($source_invoice_id);
Acme::resync($new_invoice_id);
});Yenileme faturasının üretilmesini izleme
Bir yenileme faturası üretildikten veya var olana eklendikten sonra çalışır. Hem hizmetler hem eklentiler bu kancaya düşer.
service ya da addon.Hook::add('action:invoice.renewal_generated', 10,
function ($invoice_id, $target_type, $target) {
// Ayni fatura birden cok kez gelebilir: tekrarli calismaya dayanikli yazin.
Acme::noteRenewal($invoice_id, $target_type, (int) ($target['id'] ?? 0));
});Ödeme hatırlatmasını izleme
Bir fatura hatırlatması müşteriye ulaştıktan sonra çalışır; gönderilmiş ya da kuyrukta olabilir, hatırlatma görevinden, panelden ya da API'den gelebilir. Yalnız personele ulaşan hatırlatma onu çalıştırmaz. Aynı fatura için birden çok kez çalışabilir: hatırlatma tekrarlanır.
Hook::add('action:invoice.reminder_sent', 10, function ($invoice) {
// Ikinci kanaldan da hatirlatin.
Acme::smsReminder((int) ($invoice['user_id'] ?? 0), $invoice['number'] ?? '');
});Müşterinin faturayı açmasını izleme
Müşteri bir faturayı görüntülediğinde çalışır. Faturanın okunduğunu bilmek, hatırlatma ve tahsilat akışları için değerli bir sinyaldir.
Hook::add('action:invoice.viewed_by_client', 10, function ($invoice, $id, $ctx) {
// Okundu bilgisi tahsilat akisini yumusatir.
Acme::markSeen($id, (int) ($invoice['user_id'] ?? 0));
});Durum değişimini durdurma
Yönetici bir faturanın durumunu elle değiştirirken çalışır. Ödendi işaretlemek, iptal etmek ve iade etmek bu kapıdan geçer.
paid, unpaid, refund ya da cancelled.Hook::add('gate:invoice.update_status', 10,
function ($id, $status, $pmethod, $refund_method) {
// Kapanmis donemde elle iade yapilmasin.
if ($status === 'refund' && Acme::periodClosed($id))
return 'Bu donem kapandi, iade muhasebeden yapilmali.';
return null;
});Paylaşım bağlantısını durdurma
Bir fatura paylaşım bağlantısıyla açıldığında çalışır. Bağlantıyı açan giriş yapmamış olabilir: erişimin tek dayanağı adresteki gizli değerdir.
Hook::add('gate:invoice.share_view', 10,
function ($invoice, $id, $owner, $token, $isOwner) {
// Oturumsuz erisimi kendi IP listenizle sinirlayin.
if (!$isOwner && !Acme::ipAllowed()) return 'erisim disarida';
return null;
});Faturaya gömülen müşteri bilgisini değiştirme
Faturaya yazılacak müşteri ve adres bilgisi hazırlandıktan sonra, kaydedilmeden önce çalışır. Buraya yazdığınız değerler faturanın kalıcı parçası olur.
Hook::add('filter:invoice.client_details', 10, function (&$merged_data, $invoice) {
// Kurumsal musteride unvani muhasebedeki resmi adla esitleyin.
$official = Acme::officialName($merged_data['company_tax_number'] ?? '');
if ($official !== '') $merged_data['company'] = $official;
});Tuzaklar
Adı yalın olan olay yalnız yenileme faturalarında çalışır; sonu .any ile biten ise her faturada. Muhasebe aynası, dış senkron ya da tam sayım isteyen her iş .any ile yazılır — yoksa elle kesilen ve sipariş faturaları sessizce kaçar.
.any olayı, veritabanı yazması başarısız olduğunda da çalışır ve kimlik 0 gelir. Kontrol etmeden kullanmak, olmayan bir faturaya işlem yazmaya çalışmak demektir.
Oluşturma kancalarında fatura ödenmemiştir. Hizmet açmak, ek hizmet etkinleştirmek ya da "teşekkürler" demek buraya yazılmaz. Paranın girdiği an durum geçişinin ödendiye döndüğü andır.
Durum olayı, yeni ve eski durum aynı olsa bile çalışabilir. Ödeme sayfası iki kez çağrıldığında ya da bir görev tekrar koştuğunda bunu görürsünüz. İki durumu karşılaştırmadan tepki veren dinleyici işi çiftler.
İlgili Makaleler
- Fatura ve Ödeme Kancaları
- Hizmet Yenileme Kancaları
- Sipariş Akışı Kancaları
Geri bildiriminiz için teşekkürler!
Yukarıda bulamadığınız her şey için destek ekibimiz her zaman yanınızda.