Proje: Okul Platform · Hub: Okul Platform — Decisions
Karar
panel.checkout.basket (school domain) akışı paralel olarak saha modülüne taşındı. Saha tarafı artık okulcom-api admin/checkouts/* endpoint’lerine HTTP üzerinden gidiyor; school domain’deki Panel akışı hiç değiştirilmeden korundu.
Teknik özet
- HTTP istemcisi:
App\Service\Api\Checkout\CheckoutService(extendsApiService, scopeUserScopeType::ADMIN).ApiClientconsumer-key ile yetkilenir; saha kullanıcısının kendi token’ı API’ye gönderilmez. - Endpoint eşlemesi:
- Saha basket →
POST admin/checkouts/calculate+POST admin/checkouts - Saha listesi →
GET admin/checkouts - Saha detay/güncelle →
GET/PUT admin/checkouts/{id} approve/reject/sendPaymentLink/destroyşimdilik kapsam dışı.
- Saha basket →
- Şema dönüşümleri (Saha controller içinde):
- UI’daki
discount_code(string) → lokalSalesCampaignService::findDiscountCodeByCodeile id’ye çevrilip API’yediscount_code_id(int) gönderilir. customer_id: school detayından gelirkenschool.customer_id(her zaman dolu varsayımıyla) prefill edilir; çok-satır akışında tümschool_id’lerincustomer_id’si aynı olmak zorundadır (controllerassertSingleCustomerile 422 döner).school_products[].school_idzorunlu; calculate endpoint’ischool_namekabul etmez (sadece store kabul eder).
- UI’daki
- Routes:
routes/saha.phpiçindeprefix('teklif')grubu —saha.checkout.{index,basket,calculate,store,show,update}. Ayrıca saha-internal/api/product-prices/{location}/{schoolType}route’u Panel’inProductPriceController@getProductPriceByLocationAndSchoolTypemetodunu yeniden kullanır (saha subdomain’de/panel/...çağırılamaz). - Permission’lar Panel ile aynı:
view-checkout,use-basket,create-checkout,show-checkout,update-checkout— sales rolü zaten bu izinlere sahip olduğundan ek seed gerekmedi. - UI: Saha layout’u Tailwind CDN + Alpine.js kullanıyor (jQuery yok). Basket sayfası tek Alpine
x-datacomponent’i +fetch()ile çalışıyor; Panel basket’in 1603 satırlık jQuery + custom CSS’i sahaya taşınmadı, mobil-öncelikli kart UI sıfırdan yazıldı.
Giriş noktaları
- Saha dashboard quick-actions: 4. tile “Teklif Hazırla”.
- Saha okul detay sayfası: hero altında “Bu Okul için Teklif Oluştur” butonu (
?school_id=Xile basket’e geçer, ilk satır + customer prefilled).
Neden HTTP, neden okulcom-api?
Kullanıcının ifadesi: school domain bu pattern (yerel Panel\CheckoutController + App\Service\Checkout\CheckoutService) ile çalışmaya devam edecek; ancak saha modülünün okul-api’ye geçişi, ileride checkout sahipliğinin tamamen API tarafına alınması (ve okul.com.tr domain’inin checkout için sadece UI olarak kalması) için ilk basamak.
Açık riskler / sonradan netleşecek
customer_idher okulda her zaman dolu olması gerektiği — saha controller bunu varsayıyor; eksikse store API’si 422 döner.approve/reject/sendPaymentLink/destroysaha tarafında yok — ödeme/onay akışı için ileride eklenmeli.school_products[].school_idcalculate’te zorunlu olduğundan, kullanıcı row’a bir okul seçmeden hesaplayamaz; UI bu yüzden satır başı school + city + school_type alanlarını birlikte tutuyor.
Related
- 2026-05-06-saha-product-price-route-paylasimi — saha basket’in lokal product-price endpoint’ini paylaşma kararı