Fatura Tutar Kancaları
Faturadaki rakamlara dokunan on üç kanca: kalemler, toplamlar, gecikme ücreti, yenileme fiyatı ve resmileştirme.
Genel Bakış
Bu kancalar müşterinin ödeyeceği tutarı belirler. Hepsi referansla çalışır ve yazdığınız değer doğrudan faturaya girer; hesap hatası burada paraya dönüşür.
Son iki kanca farklıdır: resmileştirme, faturayı yasal bir belgeye çevirir. O noktadan sonra tutar değiştirilemez, fatura silinemez ve numarası sabitlenir.
Referans
Fatura toplamlarını değiştirme
Toplamlar hesaplandıktan sonra, faturaya yazılmadan önce çalışır.
subtotal, tax, additional_tax, pmethod_commission, total, discounts. Yalnız birini değiştirmek toplamı tutarsız bırakır; ara toplama dokunduysanız genel toplamı da düzeltin.Hook::add('filter:invoice.totals', 10, function (&$totals, $invoice, $items) {
// Bir alani degistirdiyseniz TOPLAMI da elden gecirin.
if (Acme::roundUp($invoice)) {
$totals['total'] = ceil((float) $totals['total']);
}
});Fatura indirimlerini değiştirme
Fatura düzenlenirken indirimler kaydedilmeden önce çalışır.
Hook::add('filter:invoice.items', 10,
function ($id, &$invDiscounts, $pendingCustomDiscounts, $invoice) {
// Ad yaniltici: bu KALEM listesi degil, indirim yapisidir.
Acme::capDiscounts($invDiscounts, (float) ($invoice['subtotal'] ?? 0));
});Gecikme ücretini değiştirme
Gecikme ücreti hesaplandıktan sonra, faturaya kalem olarak eklenmeden önce çalışır.
Hook::add('filter:invoice.late_fee_amount', 10, function (&$fee, $invoice, $cycle) {
// Gunluk donguda her gun calisir: tavani asmayin.
$cap = (float) ($invoice['subtotal'] ?? 0) * 0.2;
if ($fee > $cap) $fee = $cap;
});Gecikme ücretinin eklendiğini izleme
Gecikme ücreti faturaya kalem olarak eklendikten sonra çalışır.
percentage ya da fixed.Hook::add('action:invoice.late_fee_applied', 10,
function ($invoice_id, $fee_amount, $fee_type, $item_id) {
// Musteriye fatura buyudugunu haber verin; sessiz artis sikayete doner.
Notify::lateFee($invoice_id, (float) $fee_amount);
});Yenileme fiyatını değiştirme
Bir hizmetin yenileme fiyatı çözüldükten sonra çalışır.
amount (birim fiyat), quantity, currency, taxexempt, additional_taxes, discounts, pricing_source, period_time. Tutar adet başınadır; toplam sonradan çarpılır.Hook::add('filter:invoice.renewal_amount', 10, function (&$result) {
// amount BIRIM fiyattir: adetle carpimi cekirdek yapar.
if (($result['pricing_source'] ?? '') === 'locked') return;
$result['amount'] = Acme::loyaltyPrice((float) $result['amount']);
});Yenileme açıklamasını değiştirme
Yenileme kaleminin açıklaması hazırlandıktan sonra çalışır.
Hook::add('filter:invoice.renewal_description', 10, function (&$description) {
$description .= ' — ' . Acme::periodNote();
});Resmileştirmeyi durdurma
Fatura resmileştirilmeden önce çalışır. Bu adımdan sonra fatura değiştirilemez ve silinemez.
Hook::add('gate:invoice.formalize', 10, function ($invoice, $user_id) {
// Resmilesme geri alinamaz: eksik vergi bilgisiyle yapilmasin.
if (!Acme::taxDetailsComplete($invoice))
return 'Vergi bilgileri tamamlanmadan fatura resmilestirilmez.';
return null;
});Resmileşmeyi izleme
Fatura resmileştikten sonra çalışır.
Hook::add('action:invoice.formalized', 10, function ($invoice, $user_id) {
// Artik yasal belge: muhasebeye buradan gonderin, once degil.
Accounting::submit($invoice);
});Liste özet kartlarını değiştirme
Fatura listesinin üstündeki özet kartları hesaplandıktan sonra çalışır. Değiştirdiğiniz değerler hem karta hem de kart alanına ekleme yapan görsel kancaya geçer.
Hook::add('filter:invoice.list_stats', 10, function (&$initial_stats, $stats_cards) {
// Bayi faturalarini ozetin disinda tutun.
$initial_stats['unpaid']['formatted'] = Acme::excludeResellers($initial_stats['unpaid']);
});Fatura belgesinin yazı tipini değiştirme
Fatura belgesi oluşturulurken çalışır. Latin dışı alfabelerde varsayılan yazı tipi harfleri basamaz: doğru yazı tipini burada verirsiniz.
Hook::add('filter:invoice.pdf_font', 10, function ($pdf, $invoice) {
// Latin disi alfabede varsayilan yazi tipi harfleri basamaz.
if (($invoice['user_data']['lang'] ?? '') === 'ru') $pdf->setDefaultFont('dejavusans');
});Fatura belgesine blok ekleme
Fatura belgesi oluşturulurken ve müşteri fatura sayfasını açarken çalışır. Başlığı ve açıklaması olan bir görseli burada eklersiniz: e-fatura ya da ödeme QR kodu, doğrulama damgası.
image, title ve description taşıyan bir öğe eklersiniz. Görsel zorunludur: PNG, JPEG ya da GIF data URI'si veya sunucudaki böyle bir dosyanın yolu. Web adresi reddedilir. En çok dört blok görünür, metinleri düz metin olarak görünür.pdf (fatura e-postasının eki, panelden indirme), müşterinin fatura sayfası için screen. Müşterinin kendi indirdiği PDF o sayfanın görüntüsüdür; screen için eklenen blok ona da girer.Hook::add('filter:invoice.document_blocks', 10, function (&$blocks, &$invoice, &$surface) {
// QR gorselini burada uretin; web adresi indirilmez.
$png = Acme::invoiceQr($invoice);
$blocks[] = [
'image' => 'data:image/png;base64,' . base64_encode($png),
'title' => 'E-fatura QR kodu',
'description' => 'Faturayı doğrulamak için okutun.',
];
});Ödeme yöntemi logosu ekleme
Fatura ekranında ödeme yöntemi rozetleri gösterilirken çalışır. Kendi yönteminizin logosunu buraya eklersiniz.
null döndürün. Boş metin, sıfır ve yanlış değerler zaten elenir.Hook::add('register:invoice.module_logos', 10, function () {
// HTML degil, tek bir adres dondurun.
return Acme::assetUrl('acme-pay.svg');
});Müşterinin kupon uygulamasını izleme
Müşteri kendi faturasına kupon uyguladıktan sonra çalışır. İndirim çoktan işlenmiştir.
Hook::add('action:invoice.coupon_applied_by_client', 10,
function ($uid, $id, $coupon, $couponCtx) {
// Fatura satiri kasten gecilmez: gerekiyorsa taze okuyun.
Acme::trackDiscount($uid, $coupon['code'] ?? '', (float) ($couponCtx['discount'] ?? 0));
});Tuzaklar
Toplamlar filtresinde ara toplamı değiştirip genel toplamı olduğu gibi bırakmak, faturayı kendi içinde tutarsız yapar: müşteri bir rakam görür, ödeme başka bir rakamı ister. Bir alana dokunduysanız bağlı olanları da elden geçirin.
Adı kalemleri çağrıştırsa da bu filtre indirim yapısını verir. Kalem listesi bekleyen bir dinleyici tanımadığı bir dizi bulur ve sessizce yanlış yere yazar. İkinci parametrenin ne olduğunu kaydından doğrulayın.
Ücret döngüsü günlükse filtre ve olay her gün yeniden çalışır. Tavan koymayan bir kural, ödenmemiş bir faturayı haftalar içinde ödenemez hâle getirir. Bildirim gönderiyorsanız da her gün göndermemeye dikkat edin.
Resmileşen fatura silinemez ve tutarı değiştirilemez. Muhasebeye gönderme, numara ayırma ve arşivleme gibi işler resmileşme olayına yazılır; daha erken yazılan iş, sonradan iptal edilen bir faturayı yasal kayıt sanar.
İ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.