Proje: Okul Platform · Hub: Okul Platform — Incidents

Semptom

  • panel/checkout listesinde Firma Adı ve Yetkili Ad Soyad sütunları boş gözüküyor.
  • panel/checkout/{id} detay sayfası 500 hatası: Undefined array key "products" (show.blade.php:19).

Root cause

checkouts tablosu, okul-api ile ortak schema’ya geçişle birlikte yeniden yapılandırılmış (saha checkout migration’ının yan etkisi):

Eski (panel kodunun beklediği)Yeni (gerçek schema)
firm_name (column)customer_idcustomers.firm_name (ilişki)
recipient_full_namefull_name
recipient_emailemail
items['products'] (JSON)items['school_products']
items['products'][i]['location_name']items['school_products'][i]['city_name']
items['products'][i]['price'] (yıllık)items['school_products'][i]['monthly_product_price'] (aylık)

Panel’in App\Models\Checkout’unda customer() ilişkisi yoktu, fillable hâlâ eski kolon adlarını barındırıyor; service select(['checkouts.*']) yapıp eski kolonları çekemiyor; blade’ler bu eski kolonlara {{$data->firm_name}} benzeri erişim deniyor → silent boş veya Undefined array key.

Why: Saha modülü için okul-api admin/checkouts/* üzerine taşıma yapıldı (bkz. 2026-05-06-saha-checkout-okulcom-api-gecisi). API ortak Checkout modeli schema’sını dayatıyor ama panel’in kendi blade/service kodu güncellenmemiş.

Çözüm

  1. App\Models\Checkout’a customer() BelongsTo Customer ilişkisi eklendi.
  2. App\Service\Checkout\CheckoutService::getAll
    • ->with('customer:id,name,firm_name') eager-load
    • search filter whereHas('customer', firm_name|name) + checkouts.full_name (eski firm_name/recipient_full_name join-li where kaldırıldı)
  3. resources/views/panel/checkout/list.blade.php:
    • Firma sütunu: $data->customer?->firm_name ?: $data->customer?->name ?: '—'
    • Yetkili sütunu: $data->full_name ?: '—'
    • firm_name sıralama header’ı kaldırıldı (joined relation, sortable değil)
  4. resources/views/panel/checkout/show.blade.php:
    • items['school_products'] (eski products anahtarına fallback bırakıldı)
    • Satır içi alanlar: school_name/city_name/product_name/monthly_product_price (eski location_name/price/12 fallback)
    • Üst başlıkta customer.firm_name|name, full_name, email, phone (yeni kolonlardan)

How to apply (gelecekte benzer durumda)

  • “Bir liste sayfasında alanlar boş” şikayeti gelirse, önce DB schema’sını doğrula (Schema::getColumnListing); panel kodunda hâlâ kalkmış kolonlara referans olabilir.
  • items (JSON) gibi cast edilen kolonlar API tarafında güncellendiyse, web blade tarafı da güncellenmeli; defansif ?? eskiKey fallback’leri ile geriye dönük uyum sağlanır.
  • okul-api ile ortak Eloquent kullanımları için: web app’in kendi modelini API’nin Checkout modeliyle senkronize tut (en azından ilişkiler ve fillable).