FINAL v7 1 Tablo! 31 Aralik 2025

Muzibu Corporate Spots Sistemi

Kurumsal hesaplar icin sarki arasi sesli spot yayin sistemi

v7 - Maksimum Basitlik

v6 (3 Tablo)

spots - Admin yüklemeleri

spot_corporates - Corporate ayarları

spot_plays - Loglar

Gereksiz karmaşıklık

v7 (1 Tablo!)

spots - HER ŞEY burada!

Corporate kendi spotunu yükler

Kendi ayarını yapar

İstatistik: play_count, skip_count

1

Yeni Tablo

+4

Kolon (accounts)

0

Admin Bağımlılığı

Temel Mantık

Corporate kendi spotunu yükler → Kendi tarih/sıra/aktiflik ayarını yapar → İstemezse arşivler

Gelecek: Admin onayı gerekirse is_approved kolonu eklenir.

Tüm Kararlar (Final)

Spot Atlanabilir

Skip serbest, zorlama yok.

Corporate Yükler

Kendi spotunu kendi yükler.

Arşivleme

Silmek yok, arşivle.

localStorage Sayaç

Performans öncelikli.

Max 30 MB

Dosya boyutu limiti.

Süre Limiti Yok

Ne yüklerse o.

30 Sn Kuralı

30 sn dinlenince 1 şarkı sayılır.

Basit İstatistik

play_count + skip_count

Veritabanı Yapısı (Tek Tablo!)

YENİ: muzibu_corporate_spots (HER ŞEY bu tabloda!)

Kolon Tip Açıklama
id BIGINT PK Auto increment
corporate_account_id BIGINT FK Hangi corporate'a ait
title VARCHAR(255) Spot başlığı
audio_path VARCHAR(500) Dosya yolu
duration INT Süre (saniye)
file_size INT Boyut (bytes)
starts_at TIMESTAMP NULL Başlangıç tarihi (NULL = her zaman)
ends_at TIMESTAMP NULL Bitiş tarihi (NULL = süresiz)
position INT DEFAULT 0 Sıralama (küçük = önce)
is_enabled BOOLEAN DEFAULT TRUE Aktif mi?
is_archived BOOLEAN DEFAULT FALSE Arşivlendi mi?
play_count INT DEFAULT 0 Kaç kez çalındı
skip_count INT DEFAULT 0 Kaç kez atlandı
timestamps TIMESTAMP created_at, updated_at
INDEX (corporate_account_id, is_enabled, is_archived)
INDEX (corporate_account_id, position)

GÜNCELLEME: muzibu_corporate_accounts (4 kolon ekleme)

spot_enabled BOOLEAN DEFAULT TRUE       -- Ana şube: Sistem açık mı?
spot_songs_between INT DEFAULT 10       -- Ana şube: Kaç şarkıda bir?
spot_current_index INT DEFAULT 0        -- Rotation index
spot_is_paused BOOLEAN DEFAULT FALSE    -- Her şube: Durduruldu mu?

Veritabanı Özeti

1

Yeni Tablo

+4

Kolon

13

Tablo Kolonları

Basit

Yapı

GELECEK: Admin Onayı Gerekirse

-- İleride eklenebilir:
is_approved BOOLEAN DEFAULT FALSE       -- Admin onayladı mı?
approved_at TIMESTAMP NULL              -- Ne zaman onaylandı?
approved_by BIGINT FK NULL              -- Kim onayladı?

Şimdilik gerekmez. İleride admin onayı istenirse bu kolonlar eklenir.

Sistem Akışı

Spot Yükleme → Çalma Akışı

1
Corporate Spot Yükler

Ses dosyası + başlık + tarih + sıralama → spots tablosu

2
Corporate Ayarları Yapar

Tarih aralığı, sıralama, aktif/pasif → Aynı tabloda günceller

3
Şube Durdurabilir

Her şube kendi için durdur/devam → spot_is_paused

4
Player Çalar

10 şarkıda bir spot çalar → play_count++ veya skip_count++

Spot Çalması İçin Tüm Koşullar

-- Spot çalabilir mi?
SELECT * FROM muzibu_corporate_spots
WHERE corporate_account_id = :main_corporate_id   -- Bu kuruma ait
  AND is_enabled = TRUE                            -- Aktif
  AND is_archived = FALSE                          -- Arşivlenmemiş
  AND (starts_at IS NULL OR starts_at <= NOW())    -- Tarih başlamış
  AND (ends_at IS NULL OR ends_at >= NOW())        -- Tarih geçmemiş
ORDER BY position ASC

-- Ek kontroller (corporate_accounts tablosundan):
-- spot_enabled = TRUE (Ana şube sistemi açık)
-- spot_is_paused = FALSE (Bu şube durdurulmamış)

Kontrol Matrisi

Corporate (spot) Tarih (spot) Ana Şube (accounts) Şube (accounts) Sonuç
is_enabled = FALSE - - - ÇALMAZ
TRUE Geçmemiş/Geçmiş - - ÇALMAZ
TRUE Tarih OK spot_enabled = FALSE - ÇALMAZ
TRUE Tarih OK TRUE spot_is_paused = TRUE ÇALMAZ
TRUE Tarih OK TRUE FALSE ÇALAR ✓

Kurumsal Panel (Ana Şube)

Spot Yönetimi

Kurumsal Spotlar

Kendi spotlarınızı yönetin

Spot Sistemi

Tüm şubelerde

Kaç şarkıda bir? 10
Spotlarınız
1

Yılbaşı Kampanyası

0:45 • 1.2 MB

25 Ara - 05 Oca

152 çalınma

2

Genel Duyuru

0:30 • 0.8 MB

Süresiz

89 çalınma

3

Happy Hour

0:20 • 0.5 MB

Arşivlenmiş Spotlar (1)

Eski Kampanya

0:35 • 45 çalınma

Spot Yükleme / Düzenleme

Dosyayı sürükle veya tıkla

Max 30 MB • MP3, WAV

Boş = Her zaman

Boş = Süresiz

Yılbaşı Kampanyası

kampanya.mp3

0:00 0:45

Süre

0:45

Boyut

1.2 MB

Format

MP3

Şube Sidebar Widget

Aktif

Spotlar

3 şarkı sonra

Açık

Durdurulmuş

Spotlar

Durduruldu

Durdu

Player

Spot Çalarken Player Görünümü

Normal Şarkı

Hayal Kahvesi

Sezen Aksu

Spot Çalarken

SPOT

Yılbaşı Kampanyası

0:27

30 Saniye Kuralı & localStorage

// Şarkı 30 saniye dinlenince sayaç artar
function onSongProgress(currentTime) {
    if (currentTime >= 30 && !songCounted) {
        songCounted = true;
        let count = parseInt(localStorage.getItem('spot_song_count') || '0');
        count++;
        localStorage.setItem('spot_song_count', count);

        // 10 şarkıya ulaştıysa spot çal
        if (count >= spotSongsBetween) {
            playNextSpot();
            localStorage.setItem('spot_song_count', '0');
        }
    }
}

// Spot bitince veya atlanınca
function onSpotEnded(wasSkipped) {
    fetch('/api/spot/played', {
        method: 'POST',
        body: JSON.stringify({
            spot_id: currentSpot.id,
            was_skipped: wasSkipped
        })
    });
    // Backend: play_count++ veya skip_count++
}

Neden localStorage? Her şarkı için DB sorgusu yapmak yerine tarayıcıda tutuyoruz. Performans öncelikli.

API Endpoints

Corporate (Ana Şube)

GET /api/corporate/spot-settings
PUT /api/corporate/spot-settings
GET /api/corporate/spots
POST /api/corporate/spots ← Yeni spot yükle
PUT /api/corporate/spots/{id}
POST /api/corporate/spots/reorder
POST /api/corporate/spots/{id}/archive
POST /api/corporate/spots/{id}/unarchive
GET /api/corporate/spot-stats

Şube

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

Player

GET /api/spot/init ← Ayarlar + aktif spotlar
GET /api/spot/next ← Sıradaki spot
POST /api/spot/played ← play_count++ veya skip_count++

Geliştirme Sırası

1 Veritabanı

1 migration (spots) + 1 migration (accounts kolonları) + model

2 Kurumsal Panel

CRUD + yükleme + ayarlar + sıralama + arşiv + istatistik

3 Şube Widget

Sidebar + durdur/devam

4 Player

JS logic + 30 sn kuralı + UI + skip button

5 Test & Deploy

Migration + test + build