Dashboard ve Raporlama
Hedef Kitle: Yönetici, Birim Liderleri
Sayfa Türü: Rehber (Nasıl Yapılır)
Faz: Fazlar Arası
Süre: 30 dakika
Amaç
Dashboard'ları kullanarak:
- ✅ Stratejik döngü ilerlemesini görün
- ✅ OKR skorlarını ve sağlık durumunu kontrol edin
- ✅ Birim performansını takip edin
- ✅ Veriye dayalı kararlar alın
Dashboard Türleri
1. Birim Lideri Paneli
Kim: SUPER_ADMIN, ADMIN, STRATEGY_MANAGER, TEAM_LEAD veya herhangi bir birim lideri (ROOT dahil)
Erişim: /dashboard → Birim Lideri Paneli sekmesi
Veri Kapsamı: Liderin yönettiği birimin kendi hedefleri + birinci seviye alt birimler.
ROOT seviyesinde liderlik yapan kullanıcılar ve birim liderleri aynı paneli görür. Fark kapsamdır: ROOT kapsamı kök hedefler + ilk seviye birimlerdir; birim lideri yalnızca kendi birimi ve alt birimlerini görür.
Metrik Hesaplamaları
A. Sağlık Skoru (Pace-Based Health — 0-100)
Her objective için, OKR Döngüleri sayfasındaki "Sağlık %" ile aynı formül kullanılır:
timeProgress = elapsed / totalDuration (0-1 arası)
Eğer elapsed ≤ 0 → 100 (döngü başlamadı)
Eğer timeProgress < 0.1 → 100 (grace period — ilk %10'luk dilim)
Eğer timeProgress > 1 → 1'e sabitle (döngü bitti)
expectedProgress = timeProgress × 100
healthScore = (currentProgress / expectedProgress) × 100
sonuç = clamp(0, 100, round(healthScore))
currentProgress = Objective'in KR'larının ağırlıklı ortalaması:
objProgress = Σ(kr.progress × kr.weight) / Σ(kr.weight)
KR weight yoksa, krType bazlı fallback: METRIC = 1, MILESTONE = 0.8, TASK = 0.5.
B. Ağırlıklı Başarım (Weighted Progress)
Birim bazında, o birimin doğrudan hedeflerinin ağırlıklı ortalaması:
weightedProgress = Σ(objProgress × obj.weight) / Σ(obj.weight)
Yalnızca aktif OKR döngülerindeki hedefler dahildir.
C. Ağırlıklı Sağlık (Weighted Health)
Birim bazında doğrudan hedeflerin health score ortalaması:
weightedHealth = Σ(healthScore × obj.weight) / Σ(obj.weight)
D. Alt Birimler Tablosu
Liderin yönettiği birimin birinci seviye alt birimleri ayrı bir tabloda gösterilir. Her alt birim için aynı metrikler hesaplanır:
| Sütun | Açıklama |
|---|---|
| Birim | Alt birim adı ve türü |
| Hedef Sayısı | O birime doğrudan ait objective sayısı |
| Ağırlıklı Başarım | KR bazlı ağırlıklı ortalama ilerleme |
| Sağlık | Pace-based health score (%0-100) |
Alt birimlerin kendi alt birimleri bu tabloda gösterilmez (sadece birinci seviye).
Veri Akışı
StrategicCycle (ACTIVE)
└─ OkrCycle (PLANNING | IN_APPROVAL | ACTIVE | REVIEW)
└─ OkrObjective (birimin doğrudan hedefleri)
└─ KeyResults (progress × weight → pace health)
2. Strateji Pusulası (Strategy Compass)
Kim: SUPER_ADMIN, ADMIN, STRATEGY_MANAGER
Erişim: /dashboard → Strateji Pusulası sekmesi
Amaç: "Gemi rotada mı?" sorusuna cevap verir. Stratejik temalar altındaki KPI'ların hedef–gerçekleşen karşılaştırmasını gösterir; sapma varsa anında fark edilir.
GROUP_ADMIN, TEAM_LEAD (ROOT lideri hariç) ve MEMBER bu paneli göremez.
Veri Kapsamı
Aktif stratejik döngüdeki tüm stratejik temalar ve bunlara bağlı KPI'ların en güncel ölçüm verileri değerlendirilir.
Metrik Hesaplamaları
A. KPI Fark Hesabı (Gap %)
Her KPI'nın yönüne (betterDirection) göre fark hesaplanır:
HIGHER_IS_BETTER → gapPercent = (actual - target) / target × 100
LOWER_IS_BETTER → gapPercent = (target - actual) / target × 100
Pozitif fark = hedefin üzerinde (iyi), negatif fark = hedefin altında (kötü).
B. KPI Durumu
| Fark % | Durum | Anlamı |
|---|---|---|
| ≥ -10% | ON_TRACK (Rotada) | Hedefin yakınında veya üstünde |
| -10% ile -25% arası | AT_RISK (Riskli) | Sapma başlıyor, müdahale gerekli |
| < -25% | OFF_TRACK (Sapma) | Ciddi sapma, acil aksiyon gerekli |
| Veri yok | NO_DATA | Ölçüm verisi girilmemiş |
C. Tema KPI Sağlığı
Tema'ya bağlı, verisi olan KPI'ların durum puanlarının ortalaması:
Puan: ON_TRACK = 100, AT_RISK = 50, OFF_TRACK = 0
themeKpiHealth = Σ(puan) / verisiolanKpiSayısı
D. Tema Bileşik Sağlığı
KPI sağlığı ve OKR hedef sağlığının (pace-based) ağırlıklı birleşimi:
combinedHealth = themeKpiHealth × 0.7 + objectiveHealth × 0.3
Hedef Sağlığı (objectiveHealth) ham ilerleme değil, zamanı hesaba katan pace-based health formülüdür:
timeProgress = geçenSüre / toplamSüre (0-1 arası, OKR döngüsünün başlangıç/bitişi)
Eğer geçenSüre ≤ 0 → 100 (döngü başlamadı)
Eğer timeProgress < 0.1 → 100 (grace period — ilk %10'luk dilim)
Eğer timeProgress > 1 → 1'e sabitle (döngü bitti)
beklenenİlerleme = timeProgress × 100
objHealth = (mevcutİlerleme / beklenenİlerleme) × 100
sonuc = clamp(0, 100, round(objHealth))
mevcutİlerleme = Σ(kr.progress × kr.weight) / Σ(kr.weight)
Tema düzeyinde hedef sağlığı = temaya bağlı tüm hedeflerin objHealth ortalaması.
KPI ağırlığı (%70) daha yüksektir çünkü bu panel birincil olarak KPI bazlı gap analizi içindir.
Sadece KPI verisi varsa yalnızca KPI sağlığı, sadece hedef varsa yalnızca hedef ilerlemesi kullanılır.
E. Genel Sağlık (Overall Health)
Tüm temaların ağırlıklı ortalaması:
overallHealth = Σ(tema.combinedHealth × tema.weight) / Σ(tema.weight)
Kullanıcı Arayüzü
| Bölüm | İçerik |
|---|---|
| Stratejik Döngü | Aktif döngü adı, zaman ilerlemesi, kalan gün |
| Genel Sağlık | Ağırlıklı genel sağlık yüzdesi |
| KPI Özeti | Toplam / Rotada / Riskli / Sapma KPI sayıları |
| Birim Bazlı Hedef Sağlığı | ROOT birim ve ilk seviye departmanların hedef sağlığı ortalaması (progress‑circle kartlar) |
| Tema Sağlık Haritası | Scatter chart: X=KPI Sağlığı, Y=Hedef Sağlığı, daire büyüklüğü=tema ağırlığı, renk=tema rengi |
| Tema Kartları | Her tema için: renk, ağırlık, durum dağılımı, bileşik sağlık |
| KPI Tablosu | Her tema altında: KPI adı, yön, hedef, gerçekleşen, fark %, durum |
| Hedef Tablosu | Her tema altında: bağlı OKR hedefleri, birim, sahip, KR sayısı, ilerleme, sağlık, durum |
Not: Temalarla ilişkili hedefler yalnızca ROOT birim ve bağlı ilk seviye departmanlardan filtrelenir. Alt seviye birimler dahil değildir.
Sapmada olan temalar varsayılan olarak açık gelir, rotada olanlar kapalı gelir (Collapse bileşeni).
API
GET /dashboard/strategy-compass
Headers: Authorization: Bearer <token>
RBAC: SUPER_ADMIN, ADMIN, STRATEGY_MANAGER
Response alanları:
| Alan | Açıklama |
|---|---|
activeCycle | Aktif stratejik döngü bilgileri |
overallHealth | Ağırlıklı genel sağlık skoru |
summary | KPI durum özeti sayıları |
themes[] | Tema bazlı KPI ve hedef detayları |
unitHealthSummary[] | Birim bazlı hedef sağlığı (unitId, unitName, unitType, objectiveCount, avgHealth) |
Veri Akışı
StrategicCycle (ACTIVE)
├─ StrategicTheme (ağırlıklı)
│ ├─ StrategicThemeKpi (isActive=true)
│ │ ├─ Kendi measurements (en güncel periodEnd)
│ │ └─ veya AsIsKpi.measurements (bağlı ise)
│ └─ OkrObjective (bağlı, aktif OKR döngülerinden, ROOT+1.seviye birimler)
│ └─ KeyResults (progress × weight)
├─ OkrCycle (PLANNING | IN_APPROVAL | ACTIVE | REVIEW)
└─ OrgUnit (isRoot=true → children[parentId=rootId, isActive=true])