Ana içeriğe atla
Target, bir göstergenin (indicator/KPI) performans hedefini ifade eder. Hedefler organizasyon genelinde veya belirli siteler için tanımlanabilir; mutlak değer (ABSOLUTE) ya da göreli yüzde (RELATIVE_PERCENT) olarak verilebilir ve yıllık, çeyreklik, aylık veya zaman damgası (timestamp) periyotlarıyla planlanabilir.

Genel Bakış

  • Bir göstergeye bağlanır (önerilir, isteğe bağlı)
  • Göreli hedefler için baz dönem belirlenir (yıl/çeyrek/ay)
  • Periyot, tip ve değeri içeren bir veya daha fazla hedef girişi eklenir
  • Girişler siteye özgü olabilir veya organizasyon kapsamlı bırakılabilir
  • Entegrasyon amaçlı metadata saklanabilir (örn. dataset eşlemeleri)

Veri Modeli

Target (özet):
// apps/azalt/src/server/db/types/target.ts
interface TargetEntry {
  siteId?: string | null;
  period: 'YEARLY' | 'QUARTERLY' | 'MONTHLY' | 'TIMESTAMP';
  year: number;
  month?: number | null;     // MONTHLY için 1-12
  quarter?: number | null;   // QUARTERLY için 1-4
  type: 'ABSOLUTE' | 'RELATIVE_PERCENT';
  targetValue: number;       // RELATIVE_PERCENT için yüzde değişim
}

interface Target {
  id: string;
  indicatorId: string | null;
  organizationId: string;
  title: string | null;
  baselineYear: number | null;
  baselineQuarter: number | null;
  baselineMonth: number | null;
  metadata: Record<string, unknown> | null; // örn. { indicatorMappings: { [indicatorId]: { name, field } } }
  targetEntries: TargetEntry[];
  createdAt: Date;
  updatedAt: Date;
}
Notlar:
  • TIMESTAMP, takvim dışı olay bazlı hedefleri destekler.
  • Bir giriş siteId içermiyorsa organizasyon genelinde geçerlidir.
  • Göreli hedeflerde targetValue, baz döneme göre yüzde değişimi ifade eder.

Hedef Girişleri (Entries)

Her giriş, belirli bir periyot ve (isteğe bağlı) site için hedefi temsil eder:
{
  "siteId": "site_123",            // isteğe bağlı
  "period": "MONTHLY",             // YEARLY | QUARTERLY | MONTHLY | TIMESTAMP
  "year": 2025,
  "month": 7,                       // MONTHLY için
  "type": "RELATIVE_PERCENT",      // ABSOLUTE | RELATIVE_PERCENT
  "targetValue": -12.5              // baz döneme göre %-12.5 iyileşme
}
Yaygın desenler:
  • Organizasyon hedefi: girişlerde siteId boş bırakılır
  • Site hedefi: girişlerde siteId belirtilir; farklı sitelere farklı hedef eğrileri atanır
  • Karma plan: yıllık ve aylık girişler bir arada kullanılabilir

Baz Dönem & Durum

  • Mutlak hedef: güncel gösterge değeri doğrudan targetValue ile karşılaştırılır
  • Göreli hedef: baselineYear/baselineQuarter/baselineMonth üzerinden baz referansa göre değişim değerlendirilir
UI (Targets sayfası) mevcut yılın en güncel girişine göre durumu özetler:
  • Mutlak hedefler için Yolunda/Uyarı/Geride (ilerleme yüzdesine göre)
  • Göreli hedeflerde baz dönemi gereklidir

API

TRPC prosedürleri (OpenAPI ile REST karşılıkları):
  • targets.list → GET /targets
  • targets.getById → GET /targets/{id}
  • targets.create → POST /targets
  • targets.update → PUT /targets/{id}
  • targets.delete → DELETE /targets/{id}
Oluşturma örneği:
{
  "indicatorId": "ind_abc",
  "title": "Elektrik Yoğunluğu Hedefleri",
  "baselineYear": 2024,
  "baselineQuarter": null,
  "baselineMonth": null,
  "metadata": {
    "indicatorMappings": {
      "ind_usage": { "name": "electricity", "field": "kwh" }
    }
  },
  "targetEntries": [
    { "period": "YEARLY", "year": 2025, "type": "ABSOLUTE", "targetValue": 100 },
    { "siteId": "site_1", "period": "MONTHLY", "year": 2025, "month": 12, "type": "RELATIVE_PERCENT", "targetValue": -10 }
  ]
}
Erişim kontrolü:
  • Tüm işlemler organizasyon izolasyonuna tabidir
  • Girişlerdeki siteId değerleri için site erişimi doğrulanır; yetkisiz site varsa istek reddedilir

UI & İş Akışı

  • Sayfa: /targets – başlık satır içi düzenleme, gösterge ön izlemesi ve durum rozetleri
  • Modal: oluştur/düzenle; periyot bazlı girişler, site kapsamı ve ön izleme
  • Zaman Çizgisi/Liste görünümü: girişler arası eğilim oklarıyla ilerleme görselleştirmesi
  • Gösterge eşlemeleri: metadata.indicatorMappings ile hedef bağlamını gösterge dataset’leriyle hizalama

Dashboard & Widget Entegrasyonu

  • Widget’lar seçili hedef girişlerini referans alabilir (ör. hedef çizgileri)
  • Seçim, widget ayarlarında selectedTargetEntries: string[] olarak saklanır

Sorgu Desenleri

  • list çağrısı; indicatorId/siteId/year ile filtreleme
  • İstemci, genellikle güncel gösterge değerlerini çekip mevcut yılın en güncel hedefi ile kıyaslar

Güvenlik

  • Organizasyon bazlı izolasyon sorgularda uygulanır
  • Girişlerdeki tüm siteId değerleri için erişim doğrulaması yapılır

Migrasyon Geçmişi (özet)

  • İlk sürüm: satır bazlı periyot/tip/değer alanlarıyla Target
  • Yeniden yapılandırma: çoklu giriş desteği için targetEntries (jsonb)
  • Eklemeler: title, organizationId, baselineQuarter

Bkz.

  • Kavramlar: Dataset, Unit, Dashboard, Widget
  • Sunucu: targets router – apps/azalt/src/server/api/routers/target