v3 - Final Plan 31 Aralık 2025

Muzibu Anons Sistemi

Tüm kararlar netleştirilmiş final plan

Netleşen Kararlar

Anons Atlanamaz

Zorunlu dinleme. Skip butonu yok, progress bar ile atlama yok.

Süre Limiti Yok

Anons süresi bizi ilgilendirmez. Admin ne yüklerse o.

Durdur Butonu

Her şube kendisi durdurabilir. Saat aralığı ayarı yok.

Max 30 MB

Dosya boyutu limiti 30 MB.

Basit İstatistik

Hangi şube kaç kere dinledi yeterli. Saniye detayı gereksiz.

Kolon Ekleme

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?

A

Client-Side Sayaç (localStorage)

Nasıl Çalışır?

  1. Şarkı 30sn+ dinlendi → localStorage sayacı +1
  2. Sayaç = 10 oldu → Anons çal
  3. Anons çalınca → DB'ye log at + sayaç sıfırla
DB'ye yük bindirmez (sadece anons çalınca yazılır)
Hızlı (network bekleme yok)
Tarayıcı değişince sayaç sıfırlanır
localStorage temizlenirse kaybolur
Şarkı dinleme kaydı tutulmaz (sadece anons)
B

song_plays'den Sayaç Hesapla

Nasıl Çalışır?

  1. Şarkı 30sn+ → song_plays'e kayıt (mevcut sistem)
  2. Şarkı bitince → "Son anonstan sonra kaç şarkı?"
  3. COUNT = 10 → Anons çal + announcement_plays'e log
Cihaz/tarayıcı değişse bile doğru sayar
Veri kaybı yok, güvenilir
Her şarkı sonunda DB sorgusu (performans?)
song_plays zaten yazılıyor, ek yük sadece COUNT

SELECT COUNT(*) FROM song_plays
WHERE user_id = ? AND source_type = 'corporate'
AND created_at > (son_anons_zamani)

C

Hibrit Yaklaşım (Önerim)

Tavsiye

Nasıl Çalışır?

  1. Sayfa yüklendiğinde: DB'den son anons zamanını çek, song_plays'den COUNT yap → başlangıç sayacı
  2. Şarkı dinlerken: localStorage'da sayaç tut (hızlı)
  3. Anons çalınca: announcement_plays'e kaydet, localStorage sıfırla
  4. 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?

A) Sadece localStorage B) Sadece DB (song_plays COUNT) C) Hibrit (Önerim)

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)

Admin Panel Anons Yükle (MP3) Sırala (Drag&Drop) Aktif/Pasif

Ana Şube (Kurumsal)

Kurumsal Panel Anons Ayarları Kaç şarkıda bir? (slider) Aç/Kapat

Şube (Alt/Ana)

Sidebar'da Widget Durdur / Devam Sadece kendi şubeyi etkiler

Player (Dinleyici)

♪ Şarkı 1 ♪ 2 ... ♪ 10 📢 ANONS ♪ 11 ...

* Şarkı 30 saniye+ dinlenirse sayılır. Anons atlanamaz.

UI Tasarımları

Admin: Anons Listesi

Anonslar
1

Yılbaşı Kampanyası

0:45 • 523 çalınma

2

Happy Hour

0:30 • 412 çalınma

Kurumsal: Anons Ayarları

Kaç şarkıda bir anons? 10
5 20
Anons Sistemi

Şube: Sidebar Widget

Anonslar
Aktif
Sonraki: 3 şarkı sonra

Player: Anons Çalarken

ANONS

Yılbaşı Kampanyası

0:27/0:45

API Endpoints

Admin

GET/api/admin/announcements
POST/api/admin/announcements
PUT/api/admin/announcements/{id}
DEL/api/admin/announcements/{id}
POST/api/admin/announcements/reorder

Corporate (Ana Şube)

GET/api/corporate/announcement-settings
PUT/api/corporate/announcement-settings

Player

GET/api/announcement/init← Sayfa açılışında
GET/api/announcement/next← Sıradaki anons
POST/api/announcement/played← Anons çalındı log
POST/api/announcement/pause← Şube durdur
POST/api/announcement/resume← Şube devam

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ı

1

Veritabanı

3 migration + 2 model + ilişkiler

2

Admin Panel

Livewire CRUD + drag-drop + dosya yükleme

3

Kurumsal Panel

Ayarlar sayfası + API

4

Şube Widget

Sidebar component + durdur/devam

5

Player Entegrasyonu

JS mantığı + anons çalma UI + sayaç

6

Test & Deploy

Migration + test + npm run prod + cache