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 (extends ApiService, scope UserScopeType::ADMIN). ApiClient consumer-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ışı.
  • Şema dönüşümleri (Saha controller içinde):
    • UI’daki discount_code (string) → lokal SalesCampaignService::findDiscountCodeByCode ile id’ye çevrilip API’ye discount_code_id (int) gönderilir.
    • customer_id: school detayından gelirken school.customer_id (her zaman dolu varsayımıyla) prefill edilir; çok-satır akışında tüm school_id’lerin customer_id’si aynı olmak zorundadır (controller assertSingleCustomer ile 422 döner).
    • school_products[].school_id zorunlu; calculate endpoint’i school_name kabul etmez (sadece store kabul eder).
  • Routes: routes/saha.php içinde prefix('teklif') grubu — saha.checkout.{index,basket,calculate,store,show,update}. Ayrıca saha-internal /api/product-prices/{location}/{schoolType} route’u Panel’in ProductPriceController@getProductPriceByLocationAndSchoolType metodunu 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-data component’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=X ile 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_id her okulda her zaman dolu olması gerektiği — saha controller bunu varsayıyor; eksikse store API’si 422 döner.
  • approve/reject/sendPaymentLink/destroy saha tarafında yok — ödeme/onay akışı için ileride eklenmeli.
  • school_products[].school_id calculate’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.