FINAL v6 Basitletirildi 31 Aralik 2025

Muzibu Corporate Spots Sistemi

Kurumsal hesaplar icin sarki arasi sesli spot yayin sistemi

v6 Degisiklikler (v5'ten Farklar)

v5 (Karmasik)

spots tablosu: Admin tarihleri + siralamasi

schedules tablosu: Corporate override

COALESCE(schedule.date, spot.date)

Override mantigi karisik

v6 (Basit)

spots tablosu: SADECE dosya bilgisi

spot_corporates: Corporate'in TUM ayarlari

Override YOK - Corporate karar verir

Silme YOK - Arsivleme VAR

Temel Mantik

Admin spot yukler (dosya) → Corporate'lara atar → Her Corporate kendi tarih/sira/aktiflik ayarini yapar → Istemezse arsivler (silmez)

Tum Kararlar (Final)

Spot Atlanabilir

Skip serbest, zorlama yok.

Corporate Karar Verir

Tarih, sira, aktiflik = Corporate.

Arsivleme

Silmek yok, arsivle.

localStorage Sayac

Performans oncelikli.

Max 30 MB

Dosya boyutu limiti.

Sure Limiti Yok

Admin ne yuklerse o.

30 Sn Kural

30 sn dinlenince 1 sarki sayilir.

2 Katman Kontrol

Corporate → Sube

Veritabani Yapisi (Basitlestirilmis)

YENi: muzibu_corporate_spots (Admin'in yukladigi spotlar - SADECE dosya bilgisi)

Kolon Tip Aciklama
id BIGINT PK Auto increment
title VARCHAR(255) Spot basligi
audio_path VARCHAR(500) Dosya yolu
duration INT Saniye
file_size INT Bytes
is_active BOOLEAN DEFAULT TRUE Admin genel kontrol (false = tamamen kapali)
timestamps TIMESTAMP created_at, updated_at

Basit: Tarih yok, siralama yok. Sadece dosya + Admin genel acik/kapali.

YENi: muzibu_corporate_spot_corporates (Corporate'in TUM ayarlari)

Kolon Tip Aciklama
id BIGINT PK Auto increment
spot_id BIGINT FK Hangi spot
corporate_account_id BIGINT FK Hangi kurum (ana sube)
starts_at TIMESTAMP NULL Baslangic tarihi (NULL = her zaman)
ends_at TIMESTAMP NULL Bitis tarihi (NULL = suresiz)
position INT DEFAULT 0 Siralama (kucuk = once)
is_enabled BOOLEAN DEFAULT TRUE Aktif mi?
is_archived BOOLEAN DEFAULT FALSE Arsivlendi mi? (silmek yerine)
timestamps TIMESTAMP created_at, updated_at
UNIQUE (spot_id, corporate_account_id)
INDEX (corporate_account_id, is_enabled, is_archived)

YENi: muzibu_corporate_spot_plays (Calinma loglari)

Kolon Tip Aciklama
id BIGINT PK
spot_id BIGINT FK Hangi spot
corporate_account_id BIGINT FK Hangi sube
user_id BIGINT FK NULL Kim dinledi
was_skipped BOOLEAN DEFAULT FALSE Atlandi mi?
played_at TIMESTAMP Ne zaman

GUNCELLEME: muzibu_corporate_accounts (4 kolon ekleme)

spot_enabled BOOLEAN DEFAULT TRUE       -- Ana sube: Sistem acik mi?
spot_songs_between INT DEFAULT 10       -- Ana sube: Kac sarkida bir?
spot_current_index INT DEFAULT 0        -- Rotation index
spot_is_paused BOOLEAN DEFAULT FALSE    -- Her sube: Durduruldu mu?

Veritabani Ozeti

3

Yeni Tablo

+4

Kolon

Basit

Yapi

Arsiv

Silme yok

Sistem Akisi

Spot Yukleme → Calma Akisi

1
Admin Spot Yukler

Ses dosyasi + baslik → spots tablosu

2
Admin Corporate'lara Atar

Hangi kurumlar bu spotu gorecek? → spot_corporates kayit olusur

3
Corporate Ayarlarini Yapar

Tarih, siralama, aktif/pasif → spot_corporates gunceller

4
Sube Durdurabilir

Her sube kendi icin durdur/devam → spot_is_paused

5
Player Calar

10 sarkida bir spot calar → spot_plays loglama

Spot Calmasi Icin Tum Kosullar

-- Spot calabilir mi?
SELECT spot.*, sc.*
FROM muzibu_corporate_spots spot
JOIN muzibu_corporate_spot_corporates sc ON spot.id = sc.spot_id
WHERE spot.is_active = TRUE                          -- Admin aktif
  AND sc.corporate_account_id = :corporate_id        -- Bu kurum
  AND sc.is_enabled = TRUE                           -- Corporate aktif
  AND sc.is_archived = FALSE                         -- Arsivlenmemis
  AND corporate.spot_enabled = TRUE                  -- Kurum sistemi acik
  AND branch.spot_is_paused = FALSE                  -- Sube durdurulmamis
  AND (sc.starts_at IS NULL OR sc.starts_at <= NOW())
  AND (sc.ends_at IS NULL OR sc.ends_at >= NOW())
ORDER BY sc.position ASC

Kontrol Matrisi

Admin (spot) Corporate (spot_corporates) Tarih (spot_corporates) Sube (accounts) Sonuc
is_active = FALSE - - - CALMAZ
TRUE is_enabled = FALSE - - CALMAZ
TRUE TRUE Gecmemis/Gecmis - CALMAZ
TRUE TRUE Tarih OK spot_is_paused = TRUE CALMAZ
TRUE TRUE Tarih OK FALSE CALAR

Admin Panel

Spot Listesi

Corporate Spots
Spot Sure Atama Durum Islem

Yilbasi Kampanyasi

1.2 MB

0:45 12 kurum Aktif

Eski Kampanya

0.8 MB

0:30 5 kurum Pasif

Kurumlara Atama

Yilbasi Kampanyasi

0:45 • 1.2 MB

Hangi kurumlara atansin?

Kurumsal Panel (Ana Sube)

Spot Yonetimi (Ana Sube)

Kurumsal Spot Ayarlari

Spotlari kurum icin ozellestirin

Spot Sistemi

Tum subelerde

Kac sarkida bir? 10
Bize Atanan Spotlar
1

Yilbasi Kampanyasi

0:45

25 Ara - 05 Oca

2

Genel Duyuru

0:30

Suresiz

3

Happy Hour

0:20

Arsivlenmis Spotlar (1)

Eski Kampanya

0:35 • Arsivlendi

Siralamyi degistirmek icin surukle-birak yapin. Istemediginiz spotlari arsivleyin.

Spot Ayarlari

Yilbasi Kampanyasi

0:45

Bos = Her zaman

Bos = Suresiz

Sube Sidebar Widget

Aktif

Spotlar

3 sarki sonra

Acik

Durdurulmus

Spotlar

Durduruldu

Durdu

Player

Spot Calarken Player Gorunumu

Normal Sarki

Hayal Kahvesi

Sezen Aksu

Spot Calarken

SPOT

Yilbasi Kampanyasi

0:27

Atla butonu: Kullanici isterse spotu atlayabilir. Atlama "was_skipped=true" olarak loglanir.

localStorage Sayac Mantigi

// Sarki 30 sn dinlenince
localStorage.setItem('spot_song_count', count + 1);

// 10 sarkiya ulasinca
if (count >= 10) {
    playNextSpot();
    localStorage.setItem('spot_song_count', 0);
}

// Sayac tarayici bazli, performans oncelikli

API Endpoints

Admin

GET /api/admin/corporate-spots
POST /api/admin/corporate-spots
PUT /api/admin/corporate-spots/{id}
DELETE /api/admin/corporate-spots/{id}
POST /api/admin/corporate-spots/{id}/assign ← Kurumlara ata
GET /api/admin/corporate-spots/stats

Corporate

GET /api/corporate/spot-settings
PUT /api/corporate/spot-settings
GET /api/corporate/spots ← Atanan spotlar
PUT /api/corporate/spots/{id} ← Tarih/durum/sira
POST /api/corporate/spots/reorder
POST /api/corporate/spots/{id}/archive
POST /api/corporate/spots/{id}/unarchive
GET /api/corporate/spot-stats

Sube

POST /api/branch/spots/pause
POST /api/branch/spots/resume

Player

GET /api/spot/init
GET /api/spot/next
POST /api/spot/played

Gelistirme Sirasi

1 Veritabani

3 migration + 2 model + iliskiler

2 Admin Panel

CRUD + atama + istatistik

3 Kurumsal Panel

Ayarlar + tarih + siralama + arsiv + istatistik

4 Sube Widget

Sidebar + durdur/devam

5 Player

JS logic + UI + skip button

6 Test & Deploy

Migration + test + build