Netleşen Kararlar
Zorunlu dinleme. Skip butonu yok, progress bar ile atlama yok.
Anons süresi bizi ilgilendirmez. Admin ne yüklerse o.
Her şube kendisi durdurabilir. Saat aralığı ayarı yok.
Dosya boyutu limiti 30 MB.
Hangi şube kaç kere dinledi yeterli. Saniye detayı gereksiz.
Settings için yeni tablo değil, corporate_accounts'a kolon.
Tartışma: Sayaç Nasıl Çalışsın?
Mevcut Durum: song_plays tablosu her şarkı dinlemesini kaydediyor.
Aynı mantıkla announcement_plays tablosu her anons çalmasını kaydedecek.
Soru: Kullanıcı kaç şarkı dinlediğini (sayaç) nereden bilecek?
Client-Side Sayaç (localStorage)
Nasıl Çalışır?
- Şarkı 30sn+ dinlendi → localStorage sayacı +1
- Sayaç = 10 oldu → Anons çal
- Anons çalınca → DB'ye log at + sayaç sıfırla
song_plays'den Sayaç Hesapla
Nasıl Çalışır?
- Şarkı 30sn+ → song_plays'e kayıt (mevcut sistem)
- Şarkı bitince → "Son anonstan sonra kaç şarkı?"
- COUNT = 10 → Anons çal + announcement_plays'e log
SELECT COUNT(*) FROM song_plays
WHERE user_id = ? AND source_type = 'corporate'
AND created_at > (son_anons_zamani)
Hibrit Yaklaşım (Önerim)
TavsiyeNasıl Çalışır?
- Sayfa yüklendiğinde: DB'den son anons zamanını çek, song_plays'den COUNT yap → başlangıç sayacı
- Şarkı dinlerken: localStorage'da sayaç tut (hızlı)
- Anons çalınca: announcement_plays'e kaydet, localStorage sıfırla
- Sayfa yenilenirse: Adım 1'e dön (DB'den sync)
Avantajları
- Performanslı (runtime'da DB sorgusu yok)
- Güvenilir (sayfa yenilenince sync olur)
- Cihaz değişse bile kaldığı yerden devam
- Mevcut song_plays altyapısını kullanır
Özet: İlk yüklemede DB'den sync, sonra localStorage ile devam. Her şarkıda değil, sadece sayfa açılışında 1 sorgu. En az yük, en güvenilir sonuç.
Senin Tercihin Hangisi?
Veritabanı Yapısı (Final)
GÜNCELLEME: muzibu_corporate_accounts
Mevcut tabloya 4 kolon ekleniyor:
ALTER TABLE muzibu_corporate_accounts ADD COLUMN
announcement_enabled BOOLEAN DEFAULT TRUE, -- Ana şube: Sistem açık mı?
announcement_songs_between INT DEFAULT 10, -- Ana şube: Kaç şarkıda bir?
announcement_current_index INT DEFAULT 0, -- Ana şube: Rotation sırası
announcement_is_paused BOOLEAN DEFAULT FALSE; -- Her şube: Durduruldu mu?
Ana Şube Kullanır
- • announcement_enabled
- • announcement_songs_between
- • announcement_current_index
Her Şube Kullanır
- • announcement_is_paused
YENİ TABLO: muzibu_announcements
Anons dosyaları:
| Kolon | Tip | Açıklama |
|---|---|---|
| id | BIGINT PK | Auto increment |
| title | VARCHAR(255) | Admin için görünen isim |
| audio_path | VARCHAR(500) | Dosya yolu |
| duration | INT | Saniye (ffprobe ile otomatik) |
| file_size | INT | Bytes |
| position | INT DEFAULT 0 | Sıralama (rotation) |
| is_active | BOOLEAN DEFAULT TRUE | Aktif/Pasif |
| play_count | INT DEFAULT 0 | Toplam çalınma (hızlı erişim için) |
| timestamps | TIMESTAMP | created_at, updated_at |
YENİ TABLO: muzibu_announcement_plays
Her anons çalması kaydedilir (song_plays gibi):
| Kolon | Tip | Açıklama |
|---|---|---|
| id | BIGINT PK | Auto increment |
| announcement_id | BIGINT FK | Hangi anons çaldı |
| corporate_account_id | BIGINT FK | Hangi şubede çaldı |
| user_id | BIGINT FK NULL | Hangi kullanıcıya çaldı |
| played_at | TIMESTAMP | Ne zaman çaldı |
Index'ler:
INDEX (corporate_account_id, played_at)
INDEX (announcement_id)
INDEX (user_id, played_at)
Bu tablodan çıkarılacak istatistikler:
- • Ankara şubesi bu ay kaç anons dinledi?
- • Yılbaşı anonsu toplam kaç kere çaldı?
- • Son anons ne zaman çaldı? (sayaç hesabı için)
- • Hangi şube en çok anons dinliyor?
Veritabanı Özeti
+4
Kolon (mevcut tabloya)
+2
Yeni Tablo
0
Gereksiz Tablo
Sistem Akışı
Admin (Muzibu)
Ana Şube (Kurumsal)
Şube (Alt/Ana)
Player (Dinleyici)
* Şarkı 30 saniye+ dinlenirse sayılır. Anons atlanamaz.
UI Tasarımları
Admin: Anons Listesi
Yılbaşı Kampanyası
0:45 • 523 çalınma
Happy Hour
0:30 • 412 çalınma
Kurumsal: Anons Ayarları
Şube: Sidebar Widget
Player: Anons Çalarken
Yılbaşı Kampanyası
API Endpoints
Admin
Corporate (Ana Şube)
Player
Oluşturulacak Dosyalar
Backend (Laravel)
// Migrations
database/migrations/tenant/
├── add_announcement_fields_to_corporate.php
├── create_announcements_table.php
└── create_announcement_plays_table.php
// Models
Modules/Muzibu/app/Models/
├── Announcement.php
└── AnnouncementPlay.php
// Controllers
Modules/Muzibu/app/Http/Controllers/
├── Admin/AnnouncementController.php
└── Api/AnnouncementApiController.php
// Livewire
Modules/Muzibu/app/Http/Livewire/Admin/
└── AnnouncementManagement.php
Frontend (JS + Blade)
// Views - Admin
resources/views/admin/muzibu/
└── announcements/
├── index.blade.php
└── manage.blade.php
// Views - Frontend
resources/views/themes/muzibu/
└── components/
├── announcement-widget.blade.php
└── announcement-player.blade.php
// JavaScript
public/themes/muzibu/js/
├── muzibu-store.js (güncelle)
└── player/
└── features/
└── announcement.js (yeni)
Geliştirme Adımları
Veritabanı
3 migration + 2 model + ilişkiler
Admin Panel
Livewire CRUD + drag-drop + dosya yükleme
Kurumsal Panel
Ayarlar sayfası + API
Şube Widget
Sidebar component + durdur/devam
Player Entegrasyonu
JS mantığı + anons çalma UI + sayaç
Test & Deploy
Migration + test + npm run prod + cache