Proje: Okul Platform · Hub: Okul Platform — Decisions

Saha checkout sepetinde yeni okul satırları artık “tahmini” değil

Karar

saha.checkout.basket (/teklif/sepet) ekranında listede yok / yeni okul checkbox’ı ile eklenen satırlar (is_new) artık lokal “tahmini” toplam olarak gösterilmez. Bu satırlar da saha.checkout.calculate endpoint’ine school_id: null, school_name: "..." payload’u ile gönderilir; özet API’nın döndüğü tek hesaba göre güncellenir.

Eşlik eden UI değişiklikleri:

  • ”↳ Yeni okullar (tahmini, kampanyasız)” özet satırı kaldırıldı.
  • Manuel okul adı input’unun altındaki “Bu satır tahmini fiyatla özete eklenir…” amber uyarısı kaldırıldı.
  • estimateNewSchoolsTotals() ve applySummary(data, newTotals) newTotals parametresi tamamen kaldırıldı.
  • collectPayload(forSubmit) → parametresiz collectPayload(); aynı payload hem calculate hem submit için kullanılır.
  • custom_school_name input’unda @input.debounce.300ms="calculate()" kaldırıldı. Okul ismi hesabı etkilemez (fiyat product_price_id’ye bağlı), her harfte API çağrısı yapılmamalı. Calculate yalnız fiyatı etkileyen alanlardan (şehir, kademe, ürün, adet, kampanya, indirim kodu, peşin ödeme, satır ekle/kaldır, is_new toggle) tetiklenir.

Ek olarak removeRow(idx) artık satırda doldurulmuş veri varsa native confirm() dialog gösterir (quantity=1 default değeri “boş” sayılır — prefilled school_id veya kullanıcı girişi olan herhangi bir alan tetikler).

Why

Kullanıcı geri bildirimi: saha rep yeni şube/okul eklerken fiyatın özet’te lokal hesaplanması, sonra teklif kaydedildiğinde API’dan farklı bir net tutar dönmesi karışıklık yaratıyordu. okul-api admin/checkouts/calculate zaten school_name’li satırı destekliyor — gereksiz iki kaynaklı (lokal tahmin + API hesabı) UI mantığı kaldırıldı. Tek doğruluk kaynağı API.

Confirm dialog ise yanlışlıkla satır kaldırma kazalarını engellemek için; özellikle Şehir/Kademe/Ürün üçlüsü doldurulmuş bir satırı kaldırmak rep için maliyetli (yeniden seçim).

How to apply

  • Saha checkout UI’ında lokal fiyat tahmini yapma; her zaman API’dan al. calculate() çağrıldığında en az bir bilinen okul (school_id) yoksa API’a gitme (controller resolveCustomerId 422 verir), bu durumda özet boş gösterilir.
  • Yeni satır tipi eklerken ya da fiyat değişen kampanya/indirim mantığı geliştirirken: API’nın discount_details formatı tek belirleyici — Frontend’de paralel tahmin tablosu kurma.
  • Veri kaybı potansiyeli olan kaldırma işlemlerinde (sepet, form satırları): confirm dialog default; “boş” tanımı sayfaya özgü yazılır (saha sepette quantity=1 boş sayılır, bkz isRowFilled).