Laravel İle Dinamik Bir İndirim Kuponu Yönetim Sistemi Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Projeye başlamadan önce sisteminizde PHP 8.2+ ve Laravel 11 yüklü olmalıdır. Ayrıca veritabanı işlemleri için MySQL veya PostgreSQL kullanılması önerilir. Geliştirme ortamınızda Composer paket yöneticisinin güncel olduğundan emin olun.

  • PHP 8.2 veya üzeri
  • Laravel 11.x framework
  • Composer paket yöneticisi
  • Veritabanı (MySQL 8.0+ önerilir)

Veritabanı Tasarımı ve Migration Oluşturma

İndirim kuponlarının esnek olması için veritabanı şemasını doğru kurgulamalıyız. "Coupons" tablomuzda kod, indirim türü (yüzde veya tutar), değer, başlangıç/bitiş tarihleri ve kullanım limitleri gibi alanlar bulunmalıdır.


// Migration dosyası: create_coupons_table.php
public function up(): void
{
    Schema::create('coupons', function (Blueprint $table) {
        $table->id();
        $table->string('code')->unique();
        $table->enum('type', ['percent', 'fixed'])->default('percent');
        $table->decimal('value', 8, 2);
        $table->integer('max_uses')->nullable();
        $table->integer('used_count')->default(0);
        $table->dateTime('starts_at');
        $table->dateTime('expires_at');
        $table->boolean('is_active')->default(true);
        $table->timestamps();
    });
}

Bu yapı, kuponların belirli bir süre boyunca ve belirli bir kullanım limitine kadar geçerli olmasını sağlar. used_count alanı, kuponun kaç kez kullanıldığını takip ederek sistemin suistimal edilmesini engeller.

Eloquent Modeli ve Kupon Doğrulama Mantığı

Kuponların geçerliliğini kontrol etmek için model içerisinde bir "scope" veya yardımcı metot kullanmak, kodun tekrarını önler. Aşağıdaki örnekte, bir kuponun geçerli olup olmadığını kontrol eden mantığı görüyoruz.


// app/Models/Coupon.php
public function isValid(): bool
{
    return $this->is_active &&
           now()->between($this->starts_at, $this->expires_at) &&
           ($this->max_uses === null || $this->used_count < $this->max_uses);
}

Bu metot, kuponun aktif olup olmadığını, tarih aralığında bulunup bulunmadığını ve kullanım limitinin dolup dolmadığını tek bir noktadan kontrol etmenizi sağlar.

Kupon Uygulama Servisi

İş mantığını controller içerisinde değil, bir "Service" sınıfında toplamak en iyi pratiktir. Bu sayede kupon hesaplama mantığını farklı yerlerde kolayca kullanabilirsiniz.


// app/Services/CouponService.php
namespace App\Services;

use App\Models\Coupon;

class CouponService
{
    public function applyCoupon(string $code, float $cartTotal): float
    {
        $coupon = Coupon::where('code', $code)->firstOrFail();

        if (!$coupon->isValid()) {
            throw new \Exception("Kupon geçersiz veya süresi dolmuş.");
        }

        return $coupon->type === 'percent' 
            ? $cartTotal * ($coupon->value / 100) 
            : $coupon->value;
    }
}

Burada firstOrFail() kullanarak kupon bulunamadığında otomatik olarak 404 hatası döndürülmesini sağlıyoruz. Hesaplama mantığı, indirim türüne göre dinamik olarak belirlenir.

Güvenlik ve Validasyon Önlemleri

Kupon kodları kullanıcı tarafından girildiği için XSS ve SQL Injection saldırılarına karşı korunmalıdır. Laravel'in FormRequest sınıfını kullanarak gelen veriyi doğrulayın.


// app/Http/Requests/ApplyCouponRequest.php
public function rules(): array
{
    return [
        'coupon_code' => 'required|string|exists:coupons,code',
    ];
}

Güvenlik Uyarısı: Kullanıcıların indirim tutarını manipüle etmemesi için, indirim hesaplamasını asla istemci tarafında (JavaScript) yapmayın. Her zaman sunucu tarafında (Laravel) hesaplayın ve veritabanındaki değerleri referans alın.

Özet: Kupon Türleri Karşılaştırması

Kupon Türü Avantajı Dezavantajı
Yüzde (%) Yüksek sepet tutarlarında caziptir. Düşük tutarlarda etkisi az kalabilir.
Sabit Tutar Daha net bir indirim algısı yaratır. Düşük sepetlerde kâr marjını düşürebilir.

Sıkça Sorulan Sorular

Kupon kullanım limitini nasıl artırabilirim?

Veritabanındaki max_uses sütununu güncelleyerek veya veritabanında NULL değerini koruyarak sınırsız kullanım sağlayabilirsiniz.

Kuponlar veritabanında nasıl hashlenmeli?

Kupon kodlarını hashlemenize gerek yoktur; ancak veritabanında unique kısıtlaması olması zorunludur.

Kupon geçersizse kullanıcıya nasıl hata döndürürüm?

try-catch bloğu kullanarak CouponService içerisinden dönen hataları yakalayıp back()->withErrors() ile kullanıcıya iletebilirsiniz.

Kuponlar belirli ürünlerde geçerli olabilir mi?

Evet, coupon_product adında bir pivot tablo oluşturarak kuponları belirli ürünlere veya kategorilere bağlayabilirsiniz.

Kupon kullanımı sonrası veritabanı nasıl güncellenir?

Ödeme başarılı olduğunda $coupon->increment('used_count') metodunu kullanarak kullanımı güvenli bir şekilde artırın.

Sorumluluk Reddi: Bu rehberdeki kod örnekleri genel eğitim amaçlıdır. Üretim ortamında (production) kullanmadan önce mutlaka birim testleri (unit tests) yazın ve güvenlik açıklarına karşı kodunuzu gözden geçirin.

Sonuç

Laravel ile dinamik bir indirim kuponu yönetim sistemi kurmak, veritabanı modellemesi ve servis mimarisi ile oldukça düzenli bir süreçtir. Bu rehberde öğrendiğiniz adımları takip ederek, kendi projenize özel indirim kurgularını kolayca entegre edebilirsiniz. Bir sonraki adım olarak, kuponları belirli kullanıcı gruplarına özel hale getirmek için "Kullanıcı-Kupon" ilişkisi (One-to-Many veya Many-to-Many) üzerine çalışabilirsiniz.

Bu yazıya tepkinizi paylaşın:
Emre Çelik

Eğitici içerik tasarımı ve yapılandırılmış metin oluşturma konusunda deneyimliyim. Kullanıcıların doğrudan sonuca ulaşmasını sağlayan net ve yalın bir anlatım tarzım var.

Yorumlar (0)

Yorum Yaz