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_playlistspivot tablosu: Playlist-Corporate bağlantısıis_corporateflag: 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
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
Tablo: muzibu_playlists
Mimari Tasarım
Veritabanı Şeması
YENİ TABLO: muzibu_corporate_playlists
| Kolon | Tip | Açıklama |
|---|---|---|
| id | bigint PK | Auto increment |
| corporate_id | bigint FK | → corporate_accounts |
| playlist_id | bigint FK | → playlists |
| is_shared | boolean | Üyelere paylaşıldı mı? |
| shared_at | timestamp | Paylaşım tarihi |
| timestamps | datetime | created_at, updated_at |
GÜNCELLEME: muzibu_playlists
| Yeni Kolon | Tip | Açıklama |
|---|---|---|
| is_corporate | boolean | Kurumsal playlist mi? |
| owner_corporate_id | bigint FK | Sahibi olan kurum |
| visibility | enum | 'private', 'corporate', 'public' |
private→ Sadece sahibi görürcorporate→ Kurum üyeleri görürpublic→ 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ı
Veritabanı & Model Katmanı
Temel yapının oluşturulması
Migration
- create_muzibu_corporate_playlists_table
- add_corporate_fields_to_playlists
Model Güncellemeleri
- Playlist → corporates() relation
- Playlist → ownerCorporate() relation
- Corporate → playlists() relation
- Playlist scopes: corporate(), forCorporate()
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
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
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
Ü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)
Gelecek Özellikler (İleri Faz)
Sonraki geliştirmeler için planlanan
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
- • 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
Üye Görünümü
- • "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
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