/admin/courses · CoursesPage.tsx). En üstte Takvim Etkinlikleri (Tablo/Takvim), altında beyaz-etiketli Kurslarım bölümü: arama + Etiketler + Sıralamayı Düzenle + Kurs Oluştur + AI ile Oluştur, yayın-durumu sekmeleri ve kart ızgarası. Kaynak: CoursesPageQuery (publishedCoursesCount/draftCoursesCount…) + OrganizationCourses_courses (OBJECT_INDEX ASC). Oluşturma COURSE_EDIT ile koşullanır; yetkisiz kullanıcı yalnızca yayındaki kartları salt-okunur görür.| Tür | Başlık | Başlangıç | Bitiş | |
|---|---|---|---|---|
| Rezervasyon | Kariyer Koçluğu — Deniz Aksoy | 11 Tem 2026, 14:00 | 11 Tem 2026, 14:45 | Detaya Git |
| Canlı Oturum | Psikolojiye Giriş — 6. Hafta Canlı Ders | 12 Tem 2026, 20:00 | 12 Tem 2026, 21:30 | Detaya Git |
| Rezervasyon | Mentörlük Görüşmesi — Elif Şahin | 13 Tem 2026, 10:30 | 13 Tem 2026, 11:00 | Detaya Git |
| Canlı Oturum | Mitoloji Serisi — Açılış Webinarı | 15 Tem 2026, 19:00 | 15 Tem 2026, 20:00 | Detaya Git |
useCustomLabel('NAV_MY_COURSES') → "Kurslarım"). Her başlığın yanında AdminHelpMenu "?" ikonu. Kart yayın rozeti: Yayında (success) / Taslak (nötr) / Arşivlenmiş. Kartta fiyat gösterilmez — kapak, başlık, akademik dönem etiketi, ürün etiketleri (ilk 3 + fazlası) ve öğrenci sayısı bulunur.<Suspense fallback={<SectionCardsSkeleton />}> her ürün bölümünü ayrı sarmalar; Relay bağlantısı çözülene kadar kapak-oranlı kart iskeletleri gösterilir.isEmptyState: tüm published+draft sayaçları 0) hub yerine iki-adımlı CoursesOnboarding gösterilir: Tanıtım → "Ne oluşturmak istersiniz?" ürün tipi seçici. Seçim ilgili oluşturma sihirbazını ?openWizard= ile açar.useCalendarEvents) aynı veriyi iki görünümde sunar. Takvimde gün hücreleri Rezervasyon (mavi) ve Canlı Oturum (yeşil) renkli noktalarıyla işaretlenir; gün seçilince detay paneli açılır. Hata: "Takvim etkinlikleri yüklenemedi.", boş: "Etkinlik bulunamadı."#meetings / #digital-products / #live-events / #bundles). Her aile kendi başlığı, açıklaması, araç çubuğu (arama + Etiketler + Sıralamayı Düzenle + Oluştur) ve kart ızgarasına sahiptir. Kaynak: OrganizationCoachingSessions / OrganizationDigitalProducts / OrganizationLiveEvents / OrganizationBundles. Paketler bölümü yalnızca ORG_BUNDLES_VIEW ile görünür; koçluk oluşturma COACHING_EDIT, DP/canlı etkinlik COURSE_EDIT ile koşullanır.[&>section+section]:border-t ile üstten hairline ile ayrılır. Yalnızca Koçluk kartlarında öğrenci sayısı gösterilir; Dijital Ürün kartı sadece başlık + durum, Paket kartı başlık + durum + etiketler, Canlı Etkinlik kartı başlangıç tarihi ve platform (Zoom) ayrı satırlarda gösterir — öğrenci sayısı göstermezler. Filtreyle eşleşme yoksa: "Filtrelere uygun birebir görüşme bulunamadı." / "Filtrelerinize uygun dijital ürün bulunamadı." / "Filtrelerinize uygun canlı etkinlik bulunamadı." / "Filtrelere uygun paket bulunamadı." Hiç ürün yoksa bölümde oluşturma (CREATE) kartı gösterilir.tagGroups (ACTIVE) altında gruplanır, grupsuzlar "Gruplanmamış" başlığında. Filtreler URL'ye senkronlanır (useUrlFilterSync).objectIndex alanını yeniden yazar (varsayılan sıralama OBJECT_INDEX ASC). Sıralama bırakınca otomatik kaydedilir — ayrı Kaydet/Kapat butonu yoktur (dialog X ile kapatılır). Her ürün ailesinin ayrı sheet'i vardır (ReorderCoachingSessions/DigitalProducts/LiveEvents/Bundles). Hata: "Sıralama güncellenemedi".| Dönem | Tarihler | Bağlı kurslar | |
|---|---|---|---|
| 2026 Bahar | 1 Şub 2026 – 15 Haz 2026 | 7 | |
| 2026 Güz | 15 Eyl 2026 – 20 Oca 2027 | 3 | |
| 2025 Güz | 16 Eyl 2025 – 18 Oca 2026 | 0 |
OrganizationAcademicTermsQuery (academicTerms: label, startDate, endDate, courseAcademicTermCount). COURSE_EDIT gerektirir, aksi halde notFound(). Silme dialogu bağlı kursların silinmeyeceğini, yalnızca bağlantının kaldırılacağını uyarır./admin/courses/[courseSlug]/[academicTermSlug] · AdminCoursePage.tsx). ProductDetailHeader (geri "Kurslar", başlık, yayın rozeti, "Öğrenme Deneyimini Görüntüle", sayfa bağlantıları, arama) + kaydırılabilir 9 sekmelik TabsList. Kaynak: AdminCoursePageQuery. Düzenleme COURSE_EDIT veya viewerInstructor.role = ADMIN ile açılır; yetkisizde Ayarlar/Öneriler/Sertifika/Dönemler sekmeleri kilitli.instructorTasksRequiringAction) sayar. Sekme şeridi 9 sekmeye kadar yatay kaydırılır (ScrollableTabsList); "Dönemler" yalnızca kursun birden çok akademik dönemi varsa görünür.PublishDraftBanner taslak kurslarda "Şimdi Yayınla" ile updateCourse status:PUBLISHED tetikler. Ödeme yöntemi eksikse "Ödeme Bilgilerin Eksik" uyarısı; arşivli kursta "Bu kurs arşivlendi" uyarı bannerı. Üçü de warning varyantı ve sekmelerin üstünde koşullu render edilir.SegmentedViewToggle ile beş gruba ayrılır: Genel / Fiyatlandırma / Görünüm / Özel Alanlar / Kritik İşlemler. OrderableSalesPauseCard ("Satış Durumu" başlıklı kart, "Satışı Duraklat" butonu) Genel grubunda; salesPausedAt bitini çevirir ve sipariş kapısı duraklatılmış üründe satın alımı bloklar (PR #437).ProductDetailHeader + sekmeler + Ayarlar SegmentedViewToggle paylaşır. Kaynak: AdminDigitalProductPageQuery / AdminLiveEventPageQuery. Düzenleme hasResourcePermission(COURSE, id, COURSE_EDIT) ile açılır; yetkisiz kullanıcı yalnızca salt-okunur ayar kartını görür.OrderableSalesPauseCard ve DigitalProductAttachments (Dosyalar, "Dosya Yükle" maks 1 GB). Kritik İşlemler grubunda "Kursa Dönüştür" (tek yönlü, yazarak-onayla) ve "Dijital Ürünü Sil".LiveEventCertificateTab) ve zamanlama/platform/kapasite alanları (startDate, endDate, platform, zoomMeeting, capacity, autoPublishRecording). Zoom senkronu başarısızsa oluşturma sihirbazında zoomSyncWarning gösterilir. Planlanan parite (D5): Canlı Etkinlik'e Ekler (attachments) eklenir — kayıt zaten Zoom'la var; ayrıca bir Topluluk Etkinliği bu ürüne dönüştürülebilir (bkz. 13.14/13.15).| Tarih | Öğrenci | Durum | Satış Fiyatı | Ödenen Fiyat | Ödeme Sağlayıcı Komisyonu | Teachfluence Komisyonu | Net Kazanç | ||
|---|---|---|---|---|---|---|---|---|---|
| 9 Tem 2026 | MŞ Merve Şen | merve.sen@ornek.com | Tamamlandı | ₺349 | ₺249 | ₺6,23 | Ücretsiz | ₺242,77 | |
| 8 Tem 2026 | KD Kaan Demir | kaandemir@ornek.com | Tamamlandı | ₺349 | ₺349 | ₺8,73 | Ücretsiz | ₺340,27 |
/admin/subscriptions · SubscriptionsPage.tsx). Şablonla-hızlı-başla satırı + yayın-durumu sekmeleri + ürün kartı ızgarası. Kaynak: SubscriptionsPageQuery (OrgSubscriptionProducts_organization). Görüntüleme ORG_SUBSCRIPTIONS_VIEW, oluşturma ORG_SUBSCRIPTIONS_MANAGE ile koşullanır. Yalnızca pi org'unda altta Teachfluence platform abonelikleri tablosu eklenir.ORG_SUBSCRIPTIONS_VIEW izni olmayan üyeye tüm sayfa yerine NoAccessMessage gösterilir (başlık "Bu bölüme erişiminiz yok"). Boş durum (izin var, ürün yok): "Üyeleriniz için yinelenen abonelik ürünü oluşturun" açıklaması + "Yeni Ürün Oluştur" butonu.pi org (dahili)| Organizasyon | Kademe | Durum | Plan | Sonraki Fatura | Dönem Sonu | |
|---|---|---|---|---|---|---|
| Flu Akademi | Scale | Aktif | Yıllık | 1 Şub 2027 | 1 Şub 2027 | |
| Entropi Eğitim | Growth | Aktif | Aylık | 28 Tem 2026 | 28 Tem 2026 | |
| Karataş Danışmanlık | Starter | Ödeme Gecikmiş | Aylık | — | 12 Tem 2026 |
organizationSlug === 'pi' için render edilir (Teachfluence dahili operasyon). Kademeler STARTER/GROWTH/SCALE/ENTERPRISE. Satır menüsü: Detayları Gör / Ödeme Geçmişi / Promosyon Kullanımları (sheet olarak açılır). Kaynak: PiEducationSubscriptions_query./admin/subscriptions/[productSlug] · AdminSubscriptionProductPage.tsx). Genel-bakış kartı (aralık rozetleri + metrik şeridi) + üç sekme: Abonelik Kademeleri / Aboneler / Hediye Abonelikler. Kaynak: AdminSubscriptionProductPageQuery. Görüntüleme ORG_SUBSCRIPTIONS_VIEW, düzenleme ORG_SUBSCRIPTIONS_MANAGE.TierTagsManager) gösterilir — kartta değil. Boş: "Bu ürün için henüz kademe oluşturulmadı."| Abone | Kademe | Durum | Periyot | Dönem Sonu | Abone Olma | ||
|---|---|---|---|---|---|---|---|
SY Selin Yıldırım | Yıllık | Aktif | Yıllık | 1 Şub 2027 | 1 Şub 2026 | ||
BÇ Burak Çelik | Aylık | Deneme | Aylık | 18 Tem 2026 | 4 Tem 2026 | ||
EA Ece Arslan | Aylık | Ödeme Gecikmiş | Aylık | 10 Tem 2026 | 10 Haz 2026 | ||
MK Mert Kaya | Yıllık | İptal Edildi | Yıllık | 22 Ağu 2026 | 22 Ağu 2025 |
BulkCancelStudentOrgSubscriptionsDialog: Dönem sonunda / Şimdi zamanlaması, neden, kısmi-başarısızlık tekrar-deneme). Kaynak: ProductSubscribers subscribers connection.| Alıcı | Kademe | Durum | Süre | Son Kullanma | Oluşturulma | Hediye Eden | |
|---|---|---|---|---|---|---|---|
NÖ Nazlı Öztürk nazli@ornek.com | Yıllık | Uygulandı | 12 ay | 1 Şub 2027 | 1 Şub 2026 | Ahmet Uysal | |
TA Tolga Aydın tolga@ornek.com | Aylık | Beklemede | 3 ay | 10 Eki 2026 | 10 Tem 2026 | Ahmet Uysal | |
GK Gökçe Kılıç gokce@ornek.com | Ömür Boyu | İptal Edildi | Ömür Boyu | — | 2 Haz 2026 | Ahmet Uysal |
/admin/subscriptions/subscriber/[subscriptionId] · AdminSubscriptionPage.tsx). Breadcrumb (ürün → öğrenci) + durum rozeti; iki kolon: solda Ödemeler / Öğrenci / Promosyonlar, sağda Özet. Kaynak: AdminSubscriptionPageQuery node(StudentOrgSubscription). Not: tüm kişisel veriler kurgusaldır.| Tarih | Tutar | Tür | Durum | Kart | Fatura |
|---|---|---|---|---|---|
| 1 Şub 2026 | ₺790 | İlk Ödeme | Başarılı | Visa **** 4242 | Hazır |
| 1 Şub 2027 | ₺790 | Yinelenen | Beklemede | Visa **** 4242 | — |
createPriceGroup ile org-geneli fiyat grubu (ör. Öğrenci, Erken Kayıt) tanımlanır, upsertOrderableGroupPrice ile bir ürüne gruba özel fiyat (sellingPrice · originalPrice · currency · enabled) yazılır; uygunluk şu an SELF_CLAIM (alıcı ödeme sırasında kendisi beyan eder). (b) Abonelik tahsilat/dunning — Gecikmiş Ödeme durumundaki bir öğrenci aboneliğinde retryStudentOrgSubscriptionCharge (aynı otomatik dunning denemesini elle çalıştırır) ve sendStudentOrgSubscriptionDunningReminder mutasyonları var; web'de bugün yalnızca İptal eylemi bulunuyor. Not: tüm kişisel veriler kurgusaldır.createPriceGroup: name · description · enabled · objectIndex, uygunluk SELF_CLAIM) org düzeyinde bir kez tanımlanır; her ürüne gruba özel fiyat upsertOrderableGroupPrice (orderableId · priceGroupId · currency · sellingPrice · originalPrice · enabled · taxRate) ile yazılır. orderableId Ders/DijitalÜrün/CanlıEtkinlik/KoçlukPlanı/Paket/Abonelik Kademesi GlobalId'sini kabul eder. Grup satırı: ad, uygunluk, gruba özel fiyat + indirim rozeti, aktif/pasif; “Grup Ekle” bir createPriceGroup+upsertOrderableGroupPrice modalı açar.| Tarih | Tutar | Tür | Durum | Kart | |
|---|---|---|---|---|---|
| 11 Tem 2026 | ₺790 | Yeniden Deneme | Başarısız | Visa **** 4242 | Yeniden Dene |
| 8 Tem 2026 | ₺790 | Yinelenen | Başarısız | Visa **** 4242 | — |
| 8 Haz 2026 | ₺790 | Yinelenen | Başarılı | Visa **** 4242 | — |
retryStudentOrgSubscriptionCharge (subscriptionId) başarısız ödemeyi otomatik dunning ile aynı denemeyi kullanarak hemen tekrar dener — durum değişmez, tahsilat asenkron çalışır; yalnızca Gecikmiş Ödeme (PAST_DUE) aboneliklerde geçerlidir. sendStudentOrgSubscriptionDunningReminder aboneye hatırlatma e-postası gönderir. Her ikisi de Sahip/Yönetici gerektirir; sonuç userErrors ile döner (ör. yanlış durum → “abonelik gecikmiş değil”). Denemeler sayacı (3/4) ve sonraki otomatik deneme tarihi durumdan türetilir.Orderable'dır (type Bundle implements Orderable & Node): kendi orderables: [BundleOrderable!]! bileşimi vardır — union BundleOrderable = CourseAcademicTerm | CoachingSessionPlan | DigitalProduct | LiveEvent. Detay ekranı üç sekmeli: Paket İçeriği (BundleContentManager), Ayarlar (SegmentedViewToggle: Genel/Fiyatlandırma/Etiketler ve Özel Alanlar/Kritik İşlemler) ve Öneriler. İçerik ekleme/çıkarma addBundleItem/removeBundleItem, fiyat ise updateBundle ile yazılır. Kaynak: AdminBundlePageQuery (BundleContentManager_bundle + BundlePricing_bundle). Gate: tüm sekmeler hasOrgPermission('ORG_BUNDLES_MANAGE') ile açılır; yetkisiz kullanıcıya sekme kilitli görünür ("Bu bölümü düzenleme yetkiniz yok").orderables listesi (Kurs / Koçluk / Dijital / Etkinlik)orderables union'ının dört varyantı). Her satır: küçük görsel + başlık + "tür · fiyat" (koçluk için "{n} oturum"). Sağdaki çember buton kaldırma işaretidir — işaretli satır üstü-çizili + onay ikonuna döner (kaydedilene dek pendingRemoveIds), primer-tonlu satır ise "Beklemede" rozetli pendingAddIds. Değişiklikler yalnızca Değişiklikleri Kaydet ile addBundleItem/removeBundleItem olarak yazılır. Boş durumda: "Bu pakette henüz içerik bulunmuyor. Aşağıdan kurs veya koçluk seansı ekleyin."addType state): adım 1 tür seçici (dört BundleOrderable varyantı, her biri "{count} eklenebilir"), adım 2 o türün eklenebilir öğe listesi. Zaten pakette olan veya beklemedeki öğeler listeden çıkarılır (existingIds/pendingAddIds).pendingAddIds'e ekler + "{title} paket içeriğine eklendi" toast'ı gösterir; öğe hemen "Mevcut İçerikler" listesinde "Beklemede" olarak belirir. Hiç kurs yoksa: "Henüz bir kurs oluşturmadınız." + "Kurs oluştur"; hepsi eklenmişse: "Tüm mevcut kurslar bu pakete eklenmiştir." (koçluk/dijital/etkinlik için eşdeğer metinler).BundlePricingformatCurrency → "Türk Lirası (₺)") + Aktif/Taslak rozeti, büyük satış fiyatı, orijinal fiyat üstü-çizili + "%N indirim", altında "%N KDV". Güncelle diyaloğu BundleUpdateForm section="pricing"'ı açar; orijinal fiyat, tüm bileşen fiyatlarının toplamı olan originalPrice'tan gösterilir. Fiyat grubunda ayrıca CheckoutPageSettingsCard (sipariş sayfası ayarları) bulunur.ProductPagePreviewSection), BundleUpdateForm section="general" (Başlık / Paket Adresi / Görsel + Yayında anahtarı) ve OrderableSalesPauseCard ("Satış Durumu" — Satışı Duraklat/Sürdür). Etiketler ve Özel Alanlar grubunda etiketler + abonelik erişim planları + özel alanlar; Kritik İşlemler grubunda yazarak-onaylı "Paketi Sil". Taslak paketlerde sayfa üstünde "Bu ürün taslak durumda" + Şimdi Yayınla banner'ı çıkar.