Derin Planlama Muzibu Corporate

Kurumsal Playlist Sistemi

Ana firma kendi playlistlerini oluşturur, üyelerine dağıtır

30 Aralık 2025 Tenant: Muzibu (1001) Versiyon: 1.0

Hedef Özeti

Basit Anlatım (Herkes İçin)

Şu anda: Kurumsal firmalar sadece abonelik alıp üyelerine dağıtabiliyor.

Hedef: Kurumsal firma sahibi (örn: Cafe zinciri sahibi) kendi özel çalma listelerini oluşturabilecek. Bu listeleri tüm şubelerine/üyelerine dağıtabilecek. Üyeler bu listeleri görecek ve dinleyebilecek. Ayrıca kullanıcılar playlist sayfasında "Sektör" veya "Radyo" seçer gibi "Kurum" da seçebilecek.

Teknik Özet (Geliştiriciler İçin)

  • corporate_playlists pivot tablosu: Playlist-Corporate bağlantısı
  • is_corporate flag: Playlist modeline ekleme
  • PlaylistController: Corporate filter ekleme
  • Frontend: Sektör/Radyo gibi kurum filtresi
  • Corporate Dashboard: Playlist CRUD yönetimi

Mevcut Durum Analizi

Kurumsal Sistem (Mevcut)

  • Hiyerarşik yapı: Ana firma → Şubeler (parent_id ile)
  • Davet kodu: 8 haneli unique kod ile üye ekleme
  • Abonelik paylaşımı: Firma aboneliği üyelere yansıyor
  • Playlist yok: Kurumsal playlist özelliği mevcut değil
Model: MuzibuCorporateAccount
Tablo: muzibu_corporate_accounts

Playlist Sistemi (Mevcut)

  • User playlist: Her kullanıcı kendi listesini oluşturur
  • System playlist: Admin tarafından oluşturulan genel listeler
  • Sektör & Radyo bağlantısı: Pivot tablolarla ilişki
  • Corporate bağlantısı yok: Kurumsal ilişki mevcut değil
Model: Playlist
Tablo: muzibu_playlists

Mimari Tasarım

Veritabanı Şeması

YENİ TABLO: muzibu_corporate_playlists

KolonTipAçıklama
idbigint PKAuto increment
corporate_idbigint FK→ corporate_accounts
playlist_idbigint FK→ playlists
is_sharedbooleanÜyelere paylaşıldı mı?
shared_attimestampPaylaşım tarihi
timestampsdatetimecreated_at, updated_at

GÜNCELLEME: muzibu_playlists

Yeni KolonTipAçıklama
is_corporate boolean Kurumsal playlist mi?
owner_corporate_id bigint FK Sahibi olan kurum
visibility enum 'private', 'corporate', 'public'
Visibility mantığı:
  • private → Sadece sahibi görür
  • corporate → Kurum üyeleri görür
  • public → Herkes görür

İlişki Diyagramı

┌─────────────────────┐          ┌──────────────────────┐
│ MuzibuCorporateAccount│          │      Playlist         │
├─────────────────────┤          ├──────────────────────┤
│ id                  │◄────┐    │ playlist_id          │
│ user_id (owner)     │     │    │ user_id              │
│ parent_id           │     │    │ is_corporate ✨      │
│ corporate_code      │     │    │ owner_corporate_id ✨│◄──┐
│ company_name        │     │    │ visibility ✨        │   │
│ is_active           │     │    │ is_system            │   │
└─────────────────────┘     │    │ is_public            │   │
         ▲                  │    └──────────────────────┘   │
         │                  │              ▲                │
         │                  │              │                │
         │    ┌─────────────┴──────────────┴─────┐          │
         │    │  muzibu_corporate_playlists      │          │
         │    ├──────────────────────────────────┤          │
         └────┤ corporate_id (FK)                │──────────┘
              │ playlist_id (FK)                 │
              │ is_shared                        │
              │ shared_at                        │
              └──────────────────────────────────┘

✨ = Yeni eklenecek alanlar
                    

Uygulama Fazları

1

Veritabanı & Model Katmanı

Temel yapının oluşturulması

Migration

  • create_muzibu_corporate_playlists_table
  • add_corporate_fields_to_playlists
⚠️ DİKKAT: Hem central hem tenant migration!

Model Güncellemeleri

  • Playlist → corporates() relation
  • Playlist → ownerCorporate() relation
  • Corporate → playlists() relation
  • Playlist scopes: corporate(), forCorporate()
2

Corporate Dashboard - Playlist Yönetimi

Ana kullanıcı (firma sahibi) playlist oluşturabilmeli

Kullanıcı Hikayesi

"Cafe zinciri sahibi olarak, tüm şubelerimde çalacak özel playlist'ler oluşturmak istiyorum. Her şubem benim oluşturduğum listeleri görebilmeli ve dinleyebilmeli."

Oluşturma

  • • Playlist adı (JSON - çoklu dil)
  • • Kapak görseli
  • • Açıklama
  • • Visibility seçimi
  • • Şarkı ekleme (mevcut songs)

Paylaşma

  • • Tüm üyelere paylaş
  • • Seçili üyelere paylaş
  • • Paylaşımı geri al
  • • Paylaşım geçmişi

Yönetim

  • • Playlist düzenleme
  • • Şarkı sırası değiştirme
  • • Playlist silme
  • • İstatistik görme

Gerekli Dosyalar

• CorporateFrontController.php (genişletme)
• CorporatePlaylistService.php (YENİ)
• corporate/playlists/index.blade.php
• corporate/playlists/manage.blade.php
• components/corporate-playlist-card.blade.php
• API routes (SPA için)
3

Frontend - Kurum Filtresi

Playlist sayfasında sektör/radyo gibi kurum seçimi

Kullanıcı Hikayesi

"Bir cafede oturuyorum. Playlist sayfasından o cafe'nin özel listelerini seçip dinlemek istiyorum. Tıpkı sektör veya radyo seçer gibi kurum seçebilmeliyim."

Filter Tabs

Tümü (mevcut)
Sektörler (mevcut)
Radyolar (mevcut)
Kurumlar (YENİ)

Kurum Dropdown

Kullanıcı "Kurumlar" seçtiğinde:

  • Kurum arama (isim ile)
  • Public kurumları listele
  • Üye olunan kurumlar önce
  • Seçince o kurumun playlistleri

Teknik Detay

PlaylistController'da ?corporate={id} query parametresi ile filtreleme. API endpoint: /api/playlists?corporate=5

4

Üye Deneyimi

Kurumsal üyelerin playlist erişimi

Görüntüleme

  • • My Corporate sayfasında "Kurumsal Playlistler" sekmesi
  • • Sidebar'da kurumsal playlist bölümü
  • • Ana sayfada "Kurumunuzdan" section
  • • Playlist detay sayfasında kurum badge

Dinleme

  • • Normal playlist gibi çalma
  • • Queue'ya ekleme
  • • Favorilere ekleme (opsiyonel)
  • • Paylaşma (opsiyonel - firma izni)
5

Gelecek Özellikler (İleri Faz)

Sonraki geliştirmeler için planlanan

GELECEK

Analytics

Hangi playlist en çok dinleniyor, üye aktiviteleri

Zamanlama

Belirli saatlerde otomatik playlist değişimi

Rol Yönetimi

Şube yöneticilerine playlist düzenleme izni

Teknik Uygulama Detayları

Model İlişkileri

Playlist Model (Eklenecek)

// Sahibi olan kurum
public function ownerCorporate(): BelongsTo
{
    return $this->belongsTo(
        MuzibuCorporateAccount::class,
        'owner_corporate_id'
    );
}

// Paylaşıldığı kurumlar (many-to-many)
public function corporates(): BelongsToMany
{
    return $this->belongsToMany(
        MuzibuCorporateAccount::class,
        'muzibu_corporate_playlists',
        'playlist_id',
        'corporate_id'
    )->withPivot('is_shared', 'shared_at')
     ->withTimestamps();
}

// Scope: Kurumsal playlistler
public function scopeCorporate($query)
{
    return $query->where('is_corporate', true);
}

// Scope: Belirli kurumun playlistleri
public function scopeForCorporate($query, $corporateId)
{
    return $query->where('owner_corporate_id', $corporateId)
                 ->orWhereHas('corporates', fn($q) =>
                     $q->where('corporate_id', $corporateId)
                       ->where('is_shared', true)
                 );
}

Corporate Model (Eklenecek)

// Kurumun kendi playlistleri
public function ownedPlaylists(): HasMany
{
    return $this->hasMany(
        Playlist::class,
        'owner_corporate_id'
    );
}

// Paylaşılan playlistler (many-to-many)
public function sharedPlaylists(): BelongsToMany
{
    return $this->belongsToMany(
        Playlist::class,
        'muzibu_corporate_playlists',
        'corporate_id',
        'playlist_id'
    )->withPivot('is_shared', 'shared_at')
     ->wherePivot('is_shared', true)
     ->withTimestamps();
}

// Tüm erişilebilir playlistler
public function allAccessiblePlaylists()
{
    $owned = $this->ownedPlaylists()->pluck('playlist_id');
    $shared = $this->sharedPlaylists()->pluck('playlist_id');

    return Playlist::whereIn('playlist_id',
        $owned->merge($shared)
    );
}

Service Katmanı

CorporatePlaylistService.php (YENİ)

class CorporatePlaylistService
{
    // Kurumsal playlist oluştur
    public function createPlaylist(
        MuzibuCorporateAccount $corporate,
        array $data
    ): Playlist

    // Playlist'i üyelere paylaş
    public function shareWithMembers(
        Playlist $playlist,
        array $memberIds = null // null = tümüne
    ): void

    // Paylaşımı geri al
    public function unshare(
        Playlist $playlist,
        array $memberIds = null
    ): void

    // Kullanıcının erişebildiği kurumsal playlistler
    public function getAccessiblePlaylists(User $user): Collection

    // Kurumun tüm playlistleri (owned + shared)
    public function getCorporatePlaylists(
        MuzibuCorporateAccount $corporate
    ): Collection

    // İstatistikler
    public function getPlaylistStats(Playlist $playlist): array
}

API Routes

Method Endpoint Açıklama Yetki
GET /api/corporate/playlists Kurumun playlistleri Corporate Owner
POST /api/corporate/playlists Yeni playlist oluştur Corporate Owner
PUT /api/corporate/playlists/{id} Playlist güncelle Corporate Owner
DELETE /api/corporate/playlists/{id} Playlist sil Corporate Owner
POST /api/corporate/playlists/{id}/share Üyelere paylaş Corporate Owner
POST /api/corporate/playlists/{id}/unshare Paylaşımı kaldır Corporate Owner
GET /api/my-corporate/playlists Üyenin eriştiği playlistler Corporate Member
GET /api/playlists?corporate={id} Public kurumsal playlistler Public

UI/UX Tasarım Notları

Corporate Dashboard

Yeni Tab: 🎵 Playlistlerim
  • • Grid view (playlist kartları)
  • • "Yeni Playlist" butonu (sağ üst)
  • • Her kartta: Düzenle, Paylaş, Sil
  • • Paylaşım durumu badge (Paylaşıldı/Özel)
  • • Dinlenme sayısı istatistiği

Playlist Sayfası Filtre

Tümü Sektörler Radyolar Kurumlar ✨
"Kurumlar" seçildiğinde → Kurum dropdown/arama açılır

Üye Görünümü

My Corporate sayfasında:
  • • "Kurumsal Playlistler" section
  • • Kurum adı + logo header
  • • Paylaşılan playlistler grid
  • • Tek tıkla çalma

Sidebar Entegrasyonu

  • Kurumsal Listeler (yeni section)
  • └ Cafe XYZ Sabah Listesi
  • └ Cafe XYZ Akşam Listesi
  • └ Özel Cuma Listesi
Sadece üye olduğu kurumun playlistleri görünür

Risk Analizi & Dikkat Noktaları

Potansiyel Riskler

  • Yetki karmaşası: Kim neyi düzenleyebilir?
  • Veri izolasyonu: Kurumlar arası veri sızıntısı
  • Performans: Çok sayıda kurumda N+1 query
  • UX karmaşası: Çok fazla filtre seçeneği

Çözüm Stratejileri

  • Middleware: CorporateOwnerMiddleware
  • Policy: PlaylistPolicy::manageCorporate()
  • Eager loading: with('corporates')
  • Progressive disclosure: Basit başla

Uygulama Kontrol Listesi

Faz 1: Database

  • Migration: corporate_playlists pivot
  • Migration: playlists tablosuna alanlar
  • Index'ler ve foreign key'ler

Faz 2: Backend

  • Playlist model relations
  • Corporate model relations
  • CorporatePlaylistService
  • API routes & controllers
  • PlaylistPolicy güncellemesi

Faz 3: Frontend - Dashboard

  • Corporate dashboard playlist tab
  • Playlist create/edit modal
  • Song picker component
  • Share modal

Faz 4: Frontend - Public

  • Playlist index kurum filtresi
  • Kurum dropdown component
  • My Corporate playlist section
  • Sidebar kurumsal listeler

Sonuç & Öneri

Önerilen Başlangıç

Faz 1 + Faz 2 ile başlamak mantıklı. Database ve backend hazır olunca frontend aşamalı olarak eklenebilir. İlk etapta sadece "Corporate Owner playlist oluşturma" ve "üyelerin görüntülemesi" yeterli.

Tahmini Kapsam

  • • 2 Migration dosyası
  • • 1 Service class (yeni)
  • • 2 Model güncelleme
  • • 4-5 View dosyası
  • • 8-10 API endpoint