Para Birimi ve Kupon Kancaları
Kur çevrimi, tutar biçimi ve kuponlara dokunan on yedi kanca.
Genel Bakış
Bu alandaki kancalar her ekranda çalışır. Kur çevrimi ve tutar biçimi sitenin her fiyat gösteriminden geçer, o yüzden burada yapılan ağır iş bütün sitenin yükü olur.
Kuponlar ise farklıdır: seyrek çalışır ama doğrudan paraya dokunur. Uygulama kapısı sepette, kayıt kapısı ise operatör kupon tanımlarken çalışır.
Referans
Kupon uygulamasını durdurma
Kupon sepete uygulanmadan önce çalışır.
percent, amount, fixed), oran ya da tutar, para birimi, kendiliğinden uygulanma ve birleşme işaretleri, ürün kısıtları.0 gelir; hesap üzerinden kural yazarken bunu unutmayın.items (fiyatlanmış sepet kalemleri), subtotal, user_currency.Hook::add('gate:money.coupon_apply', 10, function ($coupon, $uid, $context) {
// Misafirde uid 0 gelir: hesaba bagli kurali once ona gore ayirin.
if ($uid === 0) return 'Bu kupon icin giris yapmaniz gerekiyor.';
if (Acme::alreadyUsed($uid, $coupon['code'] ?? '')) return 'Kupon zaten kullanildi.';
return null;
});Kupon kaydını durdurma
Operatör kupon kaydetmeden önce çalışır.
0.Hook::add('gate:money.coupon.save', 10, function ($code, $state, $isEdit, $id) {
// Yuzde 90 uzeri indirim genelde yazim hatasidir.
if (($state['type'] ?? '') === 'percent' && (float) ($state['rate'] ?? 0) > 90)
return 'Yuzde 90 uzeri indirim onay ister.';
return null;
});Kaydedilecek kuponu değiştirme
Kupon verisi veritabanına yazılmadan önce çalışır.
status ve oluşturma tarihi bu filtreden sonra eklenir; buraya yazdığınız değerler ezilir.0.Hook::add('filter:money.coupon.save_data', 10, function (&$data, $isEdit, $id) {
// Yeni kayitta status yazmayin: bu filtreden SONRA uzerine yazilir.
$data['code'] = strtoupper((string) ($data['code'] ?? ''));
});Kupon durumunu izleme
Kupon durumu değiştikten sonra çalışır.
0; bir kuponun kopya olup olmadığını buradan anlarsınız.Hook::add('action:money.coupon.status_changed', 10,
function ($coupon_id, $source_id, $status) {
// Kaynak dolu ise bu kupon bir kopyadir.
if ($source_id > 0) Acme::linkCopy($coupon_id, $source_id);
});Kur çevrimini değiştirme
Bir tutar başka para birimine çevrildikten sonra çalışır. Her çevrimde çalışır.
Hook::add('filter:money.exchange_rate', 10,
function (&$converted, $amount, $from, $to) {
// HER cevrimde calisir: sorgu ya da uzak cagri koymayin.
$converted = round($converted * (1 + Acme::MARGIN), 4);
});Tutar biçimini değiştirme
Bir tutar metne çevrildikten sonra çalışır.
Hook::add('filter:money.format_output', 10, function (&$output, $amount) {
// Tarayici tarafi ayni bicimi uretmiyorsa sayfa yuklenince rakam titrer.
if ((float) $amount === 0.0) $output = Acme::freeLabel();
});Kur güncellemesini izleme
Kurlar güncellendikten sonra çalışır.
Hook::add('action:money.exchange_rates_updated', 10, function ($changes, $localCode) {
if (!$changes) return; // bu koşuda degisiklik yok
Ops::note('fx', $localCode . ': ' . implode(',', array_keys($changes)));
});Para birimi durumunu durdurma
Bir para birimi açılıp kapatılmadan önce çalışır.
Hook::add('gate:money.currency.status_change', 10, function ($currency, $status) {
// Kullanimda olan para birimini kapatmak fiyatlari cozumsuz birakir.
if ($status !== 'active' && Acme::inUse($currency['id'] ?? 0))
return 'Bu para biriminde acik hizmet var; kapatilamaz.';
return null;
});Kupon kaydını izleme
Bir kupon oluşturulduğunda ya da düzenlendiğinde çalışır. İki durum da aynı kancaya düşer; hangisi olduğunu bir parametre söyler.
Hook::add('action:coupon.saved', 10, function ($id, $code, $isEdit, $data) {
// Yalniz yeni kuponu kampanya sistemine tanitin.
if (!$isEdit) Acme::publishCampaign($code, $data);
});Kuponun silinmesini izleme
Bir kupon silindikten sonra çalışır.
Hook::add('action:money.coupon.deleted', 10, function ($coupon_id, $coupon) {
Acme::retireCampaign($coupon['code'] ?? '');
});Ana para biriminin değişmesini izleme
Sistemin ana para birimi değiştiğinde çalışır. Bu, kurumsal ölçekte bir değişimdir: bütün kurlar artık yeni birime göre okunur.
Hook::add('action:money.currency.local_changed', 10, function ($id, $currency) {
// Butun kurlar artik yeni birime gore okunur.
Acme::rebaseReports($id);
});Vergi kuralının kaydını durdurma
Bir vergi kuralı kaydedilmeden önce çalışır. Yanlış bir oran bütün yeni faturalara işleyeceği için buradaki denetim ucuzdur.
Hook::add('gate:money.tax_rule.save', 10, function ($country_id, $state_id, $rate) {
// Makul araligin disindaki oran genelde parmak hatasidir.
if ($rate < 0 || $rate > 40) return 'Vergi orani beklenen araligin disinda.';
return null;
});Vergi oranı değişimini izleme
Bir vergi kuralı kaydedildikten sonra çalışır.
Hook::add('action:money.tax_rates_changed', 10, function ($country_id, $state_id, $rate) {
Acme::syncTaxTable($country_id, $state_id, $rate);
});Para birimi değişikliğini düzenleme
Bir para birimi kaydedilirken, yalnız değişen alanlar yazılmadan önce çalışır. Elinizdeki kaydın tamamı değil, farktır.
Hook::add('filter:money.currency.save_data', 10, function (&$sets, $id, $currency) {
// Fark bos gelebilir: once bakin.
if (!$sets) return;
// Kuru kendi kaynaginizdan sabitleyin.
if (isset($sets['rate'])) $sets['rate'] = Acme::officialRate($currency['code'] ?? '');
});Tutarın yazım biçimini değiştirme
Bir tutar biçimlendirilirken çalışır. Sistemdeki her para gösterimi buradan geçer: fatura, sepet, liste, belge.
null güvenle atlanır. Ama '', 0 ve false atlanmaz, atanır ve tutar boş görünür.Hook::add('filter:money.digit', 10, function ($amount, $currency, $symbol, $exchange) {
if (($currency['code'] ?? '') !== 'BTC') return; // '' DONDURMEYIN: tutari bosaltir
return number_format($amount, 8, '.', '');
});Çekilen kurları değiştirme
Kurlar dış kaynaktan alındıktan sonra, kaydedilmeden önce çalışır. Kur ekleyebilir, değiştirebilir ya da güvenmediğinizi listeden çıkarabilirsiniz.
Hook::add('filter:money.exchange_rates_fetch', 10,
function (&$rates, $localCode, $targets) {
// Kendi resmi kaynaginizi dis servisin uzerine yazin.
$own = Acme::officialRates($localCode);
foreach ($own as $code => $rate) $rates[$code] = $rate;
});Düzenli gider kaydını izleme
Düzenli gider kuralları işlendikten sonra çalışır. Tek gider için değil, turun tamamı için bir kez çalışır.
Hook::add('action:expense.recurring_recorded', 10, function ($entries, $recorded) {
// Tur basina tek cagri: dis muhasebeye toplu gonderin.
Acme::pushExpenses($entries);
});Tuzaklar
Bir katalog sayfası yüzlerce fiyat gösterir ve bu iki kanca her biri için çalışır. İçlerine sorgu, dosya okuma ya da uzak çağrı koymak sayfayı yüzlerce kez yavaşlatır. Gereken veriyi bir kez hazırlayıp durağan bir değişkende tutun.
Kupon kapısındaki hesap kimliği, giriş yapılmamış alışverişte 0 gelir. "Bu müşteri kuponu daha önce kullandı mı" gibi bir kural, bütün misafirleri aynı kişi sayar. Hesaba bağlı kuralı yazmadan önce sıfır durumunu ayırın.
Yeni kupon kaydında status ve oluşturma tarihi filtreden sonra eklenir. Filtrede bu alanlara yazdığınız değer sessizce kaybolur — hata çıkmaz, yalnız etki görülmez. Durum belirlemek istiyorsanız kaydın ardından ayrı bir kancaya yazın.
Biçim filtresi sunucu tarafında çalışır. Sayfadaki bazı rakamlar tarayıcı tarafında yeniden yazılır; iki taraf farklı biçim üretirse müşteri sayfa yüklenirken rakamın gözle görülür biçimde değiştiğini görür. Biçimi değiştiriyorsanız her iki tarafı da değiştirin.
İlgili Makaleler
- Fatura Tutar Kancaları
- Sipariş Akışı Kancaları
- Fatura ve Ödeme Kancaları
Geri bildiriminiz için teşekkürler!
Yukarıda bulamadığınız her şey için destek ekibimiz her zaman yanınızda.