Proje: Okul Platform · Hub: Okul Platform — Domain

Checkout Nedir?

Admin (satış ekibi) tarafından oluşturulan ürün paketi satış teklifi. Bir müşteriye birden fazla okul için ürün paketi önerilir.

Checkout Status

  • draft — Taslak (henüz gönderilmedi)
  • sent — Müşteriye gönderildi (ödeme linki)
  • completed — Ödeme alındı, onaylandı
  • cancelled — İptal edildi

Önemli Field’lar (Checkout modeli)

  • customer_id — Hangi müşteri (firma)
  • items (JSON) — Ürün listesi (product + school + quantity)
  • initial_amount — İlk hesaplanan tutar
  • total_discount — Uygulanan indirim
  • final_amount — Son tutar
  • remaining_final_amount — Kalan tutar
  • discount_code_id → SalesCampaign (indirim kodu)
  • campaign_id → SalesCampaign (kampanya)
  • is_cash_payment — Nakit mi?
  • discounted_months — Kaç ay indirimli
  • payment_approved_at / payment_rejected_at — Onay/red tarihleri

İş Akışı

  1. POST /api/admin/checkouts/calculate — Tutar hesapla (commit yok)
  2. POST /api/admin/checkouts — Checkout oluştur (draft)
  3. POST /api/admin/checkouts/{id}/send-payment-link — Müşteriye link gönder (sent)
  4. POST /api/admin/checkouts/{id}/approve — Ödeme onayla (completed)
  5. POST /api/admin/checkouts/{id}/reject — Reddet (cancelled)

Servisler

app/Services/Admin/Checkout/:

  • CheckoutService — CRUD ve onay/red işlemleri
  • CheckoutCalculationService — Fiyat hesaplama mantığı
  • Discount/ — İndirim hesaplama

Custom Exceptions

  • CheckoutAlreadyCompletedException
  • CheckoutAlreadyCancelledException
  • CheckoutCannotBeModifiedException
  • CheckoutCannotBeRejectedException
  • CustomerPhoneNotFoundException

Ürün Yapısı (items JSON)

Her item: productPriceId, schoolId, schoolName, quantity

ProductPrice → okul tipi + şehir + fiyat kombinasyonu. Bir okul için birden fazla ürün seçilebilir.