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)
Skip serbest, zorlama yok.
Kendi spotunu kendi yükler.
Silmek yok, arşivle.
Performans öncelikli.
Dosya boyutu limiti.
Ne yüklerse o.
30 sn dinlenince 1 şarkı sayılır.
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, 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ışı
Corporate Spot Yükler
Ses dosyası + başlık + tarih + sıralama → spots tablosu
Corporate Ayarları Yapar
Tarih aralığı, sıralama, aktif/pasif → Aynı tabloda günceller
Şube Durdurabilir
Her şube kendi için durdur/devam → spot_is_paused
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
Spotlarınız
Yılbaşı Kampanyası
0:45 • 1.2 MB
25 Ara - 05 Oca
152 çalınma
Genel Duyuru
0:30 • 0.8 MB
Süresiz
89 çalınma
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
Süre
0:45
Boyut
1.2 MB
Format
MP3
Şube Sidebar Widget
Aktif
Spotlar
3 şarkı sonra
Durdurulmuş
Spotlar
Durduruldu
Player
Spot Çalarken Player Görünümü
Normal Şarkı
Hayal Kahvesi
Sezen Aksu
Spot Çalarken
Yılbaşı Kampanyası
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)
Şube
Player
Geliştirme Sırası
1 migration (spots) + 1 migration (accounts kolonları) + model
CRUD + yükleme + ayarlar + sıralama + arşiv + istatistik
Sidebar + durdur/devam
JS logic + 30 sn kuralı + UI + skip button
Migration + test + build