# Merkezi Hareketler - Parametre Seti Implementation Plan

> **For agentic workers:** REQUIRED: Use superpowers:subagent-driven-development (if subagents available) or superpowers:executing-plans to implement this plan. Steps use checkbox (`- [ ]`) syntax for tracking.

**Goal:** Tüm uygulama verilerini tek `hareketler` koleksiyonunda IKart formatında saklamak, parametre setleri ile tip-spesifik form/görünüm sağlamak.

**Architecture:** Kod tanımlı (statik) ve DB tanımlı (dinamik) parametre setlerini birleştiren bir servis katmanı. Mevcut paylas-kutusu → IKart → hareketler akışı korunur. Her veri tipi `vt` alanıyla ayrılır, parametreSetleri ile form şablonu belirlenir.

**Tech Stack:** Angular 20, Signals, Ng-Zorro, FikoYTIstekKok, MongoDB aggregation

---

## Dosya Haritası

### Yeni Dosyalar
| Dosya | Sorumluluk |
|---|---|
| `src/service/fikoyt-ui/src/lib/parametre-setleri/parametre-seti.service.ts` | Kod + DB setlerini birleştiren ana servis |
| `src/service/fikoyt-ui/src/lib/parametre-setleri/sistem-parametre-setleri.ts` | Statik parametre seti tanımları (7 grup) |
| `src/service/fikoyt-ui/src/lib/parametre-setleri/hareketler-veri.service.ts` | Generic CRUD helper (ekle/listele/guncelle/sil) |
| `src/app/uygulamalar/admin/parametre-setleri/parametre-setleri.component.ts` | Admin CRUD sayfası |
| `src/app/uygulamalar/admin/parametre-setleri/parametre-setleri.component.html` | Admin template |
| `src/app/uygulamalar/admin/parametre-setleri/parametre-setleri.component.less` | Admin stilleri |

### Değiştirilecek Dosyalar
| Dosya | Değişiklik |
|---|---|
| `src/service/fikoyt-ui/interfaces/IKart.interface.ts` | IVT ve IYollar type'larına yeni vt/yol değerleri ekle |
| `src/app/uygulamalar/admin/admin.routes.ts` | parametre-setleri route ekle |

---

## Chunk 1: Altyapı - Interface Genişletme & Servis Katmanı

### Task 1: IKart Interface - Yeni VT ve Yol Değerleri

**Files:**
- Modify: `src/service/fikoyt-ui/interfaces/IKart.interface.ts`

- [ ] **Step 1: IVT type'ına yeni vt değerleri ekle**

Mevcut IVT type'ını bul ve şu değerleri ekle:

```typescript
// Mevcut değerlere ek olarak:
| 'FikoYT.sistem.firmalar'
| 'FikoYT.sistem.firma.personeller'
| 'FikoYT.sistem.firma.departmanlar'
| 'FikoYT.sistem.firma.yetkiler'
| 'FikoYT.sistem.cihazlar'
| 'FikoYT.sistem.cihaz.olaylar'
| 'FikoYT.sistem.cihaz.komutlar'
| 'FikoYT.sistem.cihaz.tetikleyiciler'
| 'FikoYT.sistem.cihaz.tipler'
| 'FikoYT.sistem.denetim'
| 'FikoYT.sistem.giris_cikis'
| 'FikoYT.sistem.ajanlar'
| 'FikoYT.sistem.gorevler'
| 'FikoYT.sistem.bildirimler'
| 'FikoYT.sistem.mesajlar'
| 'FikoYT.sistem.soketler'
| 'FikoYT.sistem.teklifler'
| 'FikoYT.sistem.siparisler'
| 'FikoYT.sistem.kare_kodlar'
| 'FikoYT.sistem.parametreSetleri'
```

- [ ] **Step 2: IYollar type'ına yeni yol değerleri ekle**

```typescript
// Mevcut değerlere ek olarak:
| 'FikoYT.sistem.firmalar.*'
| 'FikoYT.sistem.cihazlar.*'
| 'FikoYT.sistem.denetim.*'
| 'FikoYT.sistem.ajanlar.*'
| 'FikoYT.sistem.ticaret.*'
| 'FikoYT.sistem.iletisim.*'
| 'FikoYT.sistem.parametreSetleri.*'
```

- [ ] **Step 3: Commit**

```bash
git add src/service/fikoyt-ui/interfaces/IKart.interface.ts
git commit -m "feat: IVT ve IYollar type'larına merkezi hareketler vt/yol değerleri eklendi"
```

---

### Task 2: Sistem Parametre Setleri (Statik Tanımlar)

**Files:**
- Create: `src/service/fikoyt-ui/src/lib/parametre-setleri/sistem-parametre-setleri.ts`

- [ ] **Step 1: Dosyayı oluştur ve 7 grup tanımla**

```typescript
import { IParametreSetiGrubu, IParametreSeti } from '../../../interfaces/IParametreSeti.interface';
import { IParametre } from '../parametreler/parametreler.component';

// =============================================
// 1. FİRMA YÖNETİMİ
// =============================================
const FIRMA_KAYIT: IParametreSeti = {
  id: 'firma.kayit',
  baslik: 'Firma Kayıt',
  simge: '🏢',
  aciklama: 'Yeni firma kaydı oluşturma',
  sayfaKurallari: { yeniSayfaEngelle: true, maxSayfa: 1 },
  parametreler: [
    { ismi: 'firma_adi', baslik: 'Firma Adı', turu: 'Yazı', ayarlar: { zorunlu: true } },
    { ismi: 'vergi_no', baslik: 'Vergi No', turu: 'Yazı' },
    { ismi: 'vergi_dairesi', baslik: 'Vergi Dairesi', turu: 'Yazı' },
    { ismi: 'sektor', baslik: 'Sektör', turu: 'Açılır Kutu', ayarlar: { secenekler: ['Üretim', 'Yazılım', 'Hizmet', 'Ticaret', 'Diğer'] } },
    { ismi: 'telefon', baslik: 'Telefon', turu: 'Yazı' },
    { ismi: 'email', baslik: 'E-posta', turu: 'Yazı' },
    { ismi: 'adres', baslik: 'Adres', turu: 'Yazı Alanı' },
    { ismi: 'konum', baslik: 'Konum', turu: 'Konum' },
    { ismi: 'web_sitesi', baslik: 'Web Sitesi', turu: 'Yazı' },
    { ismi: 'logo', baslik: 'Logo', turu: 'Resim' },
    { ismi: 'durum', baslik: 'Durum', turu: 'Açılır Kutu', ayarlar: { secenekler: ['Aktif', 'Pasif', 'Beklemede'] }, degeri: 'Aktif' },
    { ismi: 'notlar', baslik: 'Notlar', turu: 'Yazı Alanı' },
  ] as IParametre[],
};

const FIRMA_DEPARTMAN: IParametreSeti = {
  id: 'firma.departman',
  baslik: 'Departman',
  simge: '🏛️',
  sayfaKurallari: { yeniSayfaEngelle: true },
  parametreler: [
    { ismi: 'departman_adi', baslik: 'Departman Adı', turu: 'Yazı', ayarlar: { zorunlu: true } },
    { ismi: 'yonetici', baslik: 'Yönetici', turu: 'Yazı' },
    { ismi: 'aciklama', baslik: 'Açıklama', turu: 'Yazı Alanı' },
  ] as IParametre[],
};

const FIRMA_YETKI: IParametreSeti = {
  id: 'firma.yetki',
  baslik: 'Yetki Tanımı',
  simge: '🔑',
  sayfaKurallari: { yeniSayfaEngelle: true },
  parametreler: [
    { ismi: 'yetki_adi', baslik: 'Yetki Adı', turu: 'Yazı', ayarlar: { zorunlu: true } },
    { ismi: 'aciklama', baslik: 'Açıklama', turu: 'Yazı Alanı' },
    { ismi: 'seviye', baslik: 'Seviye', turu: 'Sayı', degeri: 0 },
  ] as IParametre[],
};

const FIRMA_GRUBU: IParametreSetiGrubu = {
  id: 'sistem.firmalar',
  baslik: 'Firma Yönetimi',
  simge: '🏢',
  renk: '#1890ff',
  kaynak: 'kod',
  sira: 1,
  altGruplar: [FIRMA_KAYIT, FIRMA_DEPARTMAN, FIRMA_YETKI],
};

// =============================================
// 2. PERSONEL YÖNETİMİ
// =============================================
const PERSONEL_KAYIT: IParametreSeti = {
  id: 'personel.kayit',
  baslik: 'Personel Kayıt',
  simge: '👤',
  sayfaKurallari: { yeniSayfaEngelle: true },
  parametreler: [
    { ismi: 'ad', baslik: 'Ad', turu: 'Yazı', ayarlar: { zorunlu: true } },
    { ismi: 'soyad', baslik: 'Soyad', turu: 'Yazı', ayarlar: { zorunlu: true } },
    { ismi: 'tc_no', baslik: 'TC Kimlik No', turu: 'Yazı' },
    { ismi: 'telefon', baslik: 'Telefon', turu: 'Yazı' },
    { ismi: 'email', baslik: 'E-posta', turu: 'Yazı' },
    { ismi: 'departman', baslik: 'Departman', turu: 'Açılır Kutu', ayarlar: { secenekler: [] } },
    { ismi: 'pozisyon', baslik: 'Pozisyon', turu: 'Yazı' },
    { ismi: 'giris_tarihi', baslik: 'İşe Giriş Tarihi', turu: 'Tarih' },
    { ismi: 'maas', baslik: 'Maaş', turu: 'Para' },
    { ismi: 'profil_resmi', baslik: 'Profil Resmi', turu: 'Resim' },
    { ismi: 'durum', baslik: 'Durum', turu: 'Açılır Kutu', ayarlar: { secenekler: ['Aktif', 'Pasif', 'İzinli', 'Ayrılmış'] }, degeri: 'Aktif' },
  ] as IParametre[],
};

const IZIN_KAYIT: IParametreSeti = {
  id: 'personel.izin',
  baslik: 'İzin Kaydı',
  simge: '🏖️',
  sayfaKurallari: { yeniSayfaEngelle: true },
  parametreler: [
    { ismi: 'izin_turu', baslik: 'İzin Türü', turu: 'Açılır Kutu', ayarlar: { zorunlu: true, secenekler: ['Yıllık', 'Hastalık', 'Mazeret', 'Doğum', 'Evlilik', 'Ölüm', 'Ücretsiz'] } },
    { ismi: 'baslangic', baslik: 'Başlangıç', turu: 'Tarih', ayarlar: { zorunlu: true } },
    { ismi: 'bitis', baslik: 'Bitiş', turu: 'Tarih', ayarlar: { zorunlu: true } },
    { ismi: 'gun_sayisi', baslik: 'Gün Sayısı', turu: 'Sayı' },
    { ismi: 'durum', baslik: 'Durum', turu: 'Açılır Kutu', ayarlar: { secenekler: ['Beklemede', 'Onaylandı', 'Reddedildi'] }, degeri: 'Beklemede' },
    { ismi: 'onaylayan', baslik: 'Onaylayan', turu: 'Yazı' },
    { ismi: 'aciklama', baslik: 'Açıklama', turu: 'Yazı Alanı' },
  ] as IParametre[],
};

const VARDIYA: IParametreSeti = {
  id: 'personel.vardiya',
  baslik: 'Vardiya Tanımı',
  simge: '⏰',
  sayfaKurallari: { yeniSayfaEngelle: true },
  parametreler: [
    { ismi: 'vardiya_adi', baslik: 'Vardiya Adı', turu: 'Yazı', ayarlar: { zorunlu: true } },
    { ismi: 'baslangic_saat', baslik: 'Başlangıç Saati', turu: 'Saat' },
    { ismi: 'bitis_saat', baslik: 'Bitiş Saati', turu: 'Saat' },
    { ismi: 'gunler', baslik: 'Günler', turu: 'Liste', ayarlar: { secenekler: ['Pazartesi', 'Salı', 'Çarşamba', 'Perşembe', 'Cuma', 'Cumartesi', 'Pazar'] } },
  ] as IParametre[],
};

const PERSONEL_GRUBU: IParametreSetiGrubu = {
  id: 'sistem.personeller',
  baslik: 'Personel Yönetimi',
  simge: '👥',
  renk: '#52c41a',
  kaynak: 'kod',
  sira: 2,
  altGruplar: [PERSONEL_KAYIT, IZIN_KAYIT, VARDIYA],
};

// =============================================
// 3. IoT CİHAZ YÖNETİMİ
// =============================================
const CIHAZ_KAYIT: IParametreSeti = {
  id: 'cihaz.kayit',
  baslik: 'Cihaz Kaydı',
  simge: '📡',
  sayfaKurallari: { yeniSayfaEngelle: true },
  parametreler: [
    { ismi: 'cihaz_adi', baslik: 'Cihaz Adı', turu: 'Yazı', ayarlar: { zorunlu: true } },
    { ismi: 'cihaz_tipi', baslik: 'Cihaz Tipi', turu: 'Açılır Kutu', ayarlar: { secenekler: ['Kart Okuyucu', 'CNC', 'Lamba Kontrolü', 'Makine Takip', 'Sensör', 'Diğer'] } },
    { ismi: 'seri_no', baslik: 'Seri No', turu: 'Yazı' },
    { ismi: 'ip_adresi', baslik: 'IP Adresi', turu: 'Yazı' },
    { ismi: 'mac_adresi', baslik: 'MAC Adresi', turu: 'Yazı' },
    { ismi: 'konum', baslik: 'Konum', turu: 'Konum' },
    { ismi: 'firmware', baslik: 'Firmware Sürümü', turu: 'Yazı' },
    { ismi: 'durum', baslik: 'Durum', turu: 'Açılır Kutu', ayarlar: { secenekler: ['Aktif', 'Pasif', 'Arızalı', 'Bakımda'] }, degeri: 'Aktif' },
    { ismi: 'notlar', baslik: 'Notlar', turu: 'Yazı Alanı' },
  ] as IParametre[],
};

const CIHAZ_OLAY: IParametreSeti = {
  id: 'cihaz.olay',
  baslik: 'Cihaz Olayı',
  simge: '⚡',
  sayfaKurallari: { yeniSayfaEngelle: true },
  parametreler: [
    { ismi: 'olay_tipi', baslik: 'Olay Tipi', turu: 'Açılır Kutu', ayarlar: { secenekler: ['Bağlantı', 'Kopma', 'Veri', 'Hata', 'Uyarı', 'Bilgi'] } },
    { ismi: 'cihaz_id', baslik: 'Cihaz', turu: 'Yazı' },
    { ismi: 'deger', baslik: 'Değer', turu: 'Yazı' },
    { ismi: 'detay', baslik: 'Detay', turu: 'Yazı Alanı' },
    { ismi: 'zaman', baslik: 'Zaman', turu: 'Tarih Saat' },
  ] as IParametre[],
};

const CIHAZ_KOMUT: IParametreSeti = {
  id: 'cihaz.komut',
  baslik: 'Cihaz Komutu',
  simge: '🎮',
  sayfaKurallari: { yeniSayfaEngelle: true },
  parametreler: [
    { ismi: 'komut_adi', baslik: 'Komut', turu: 'Yazı', ayarlar: { zorunlu: true } },
    { ismi: 'hedef_cihaz', baslik: 'Hedef Cihaz', turu: 'Yazı' },
    { ismi: 'parametreler_json', baslik: 'Parametreler (JSON)', turu: 'Kod' },
    { ismi: 'durum', baslik: 'Durum', turu: 'Açılır Kutu', ayarlar: { secenekler: ['Bekliyor', 'Gönderildi', 'Başarılı', 'Hata'] }, degeri: 'Bekliyor' },
  ] as IParametre[],
};

const CIHAZ_TETIKLEYICI: IParametreSeti = {
  id: 'cihaz.tetikleyici',
  baslik: 'Tetikleyici',
  simge: '🔔',
  sayfaKurallari: { yeniSayfaEngelle: true },
  parametreler: [
    { ismi: 'tetik_adi', baslik: 'Tetikleyici Adı', turu: 'Yazı', ayarlar: { zorunlu: true } },
    { ismi: 'kosul', baslik: 'Koşul', turu: 'Kod' },
    { ismi: 'aksiyon', baslik: 'Aksiyon', turu: 'Açılır Kutu', ayarlar: { secenekler: ['Bildirim', 'Komut', 'Webhook', 'Log'] } },
    { ismi: 'aktif', baslik: 'Aktif', turu: 'Anahtar', degeri: true },
  ] as IParametre[],
};

const CIHAZ_GRUBU: IParametreSetiGrubu = {
  id: 'sistem.cihazlar',
  baslik: 'IoT Cihaz Yönetimi',
  simge: '📡',
  renk: '#fa8c16',
  kaynak: 'kod',
  sira: 3,
  altGruplar: [CIHAZ_KAYIT, CIHAZ_OLAY, CIHAZ_KOMUT, CIHAZ_TETIKLEYICI],
};

// =============================================
// 4. DENETİM & LOGLAMA
// =============================================
const DENETIM_KAYIT: IParametreSeti = {
  id: 'denetim.kayit',
  baslik: 'Denetim Kaydı',
  simge: '📋',
  sayfaKurallari: { yeniSayfaEngelle: true },
  parametreler: [
    { ismi: 'islem_tipi', baslik: 'İşlem Tipi', turu: 'Açılır Kutu', ayarlar: { secenekler: ['Ekleme', 'Güncelleme', 'Silme', 'Görüntüleme', 'Giriş', 'Çıkış'] } },
    { ismi: 'kullanici', baslik: 'Kullanıcı', turu: 'Yazı' },
    { ismi: 'hedef', baslik: 'Hedef Kayıt', turu: 'Yazı' },
    { ismi: 'detay', baslik: 'Detay', turu: 'Yazı Alanı' },
    { ismi: 'ip', baslik: 'IP Adresi', turu: 'Yazı' },
  ] as IParametre[],
};

const GIRIS_CIKIS: IParametreSeti = {
  id: 'denetim.giris_cikis',
  baslik: 'Giriş/Çıkış',
  simge: '🚪',
  sayfaKurallari: { yeniSayfaEngelle: true },
  parametreler: [
    { ismi: 'personel', baslik: 'Personel', turu: 'Yazı', ayarlar: { zorunlu: true } },
    { ismi: 'yon', baslik: 'Yön', turu: 'Açılır Kutu', ayarlar: { secenekler: ['Giriş', 'Çıkış'] } },
    { ismi: 'zaman', baslik: 'Zaman', turu: 'Tarih Saat' },
    { ismi: 'cihaz', baslik: 'Cihaz', turu: 'Yazı' },
    { ismi: 'kart_no', baslik: 'Kart No', turu: 'Yazı' },
  ] as IParametre[],
};

const DENETIM_GRUBU: IParametreSetiGrubu = {
  id: 'sistem.denetim',
  baslik: 'Denetim & Loglama',
  simge: '📋',
  renk: '#722ed1',
  kaynak: 'kod',
  sira: 4,
  altGruplar: [DENETIM_KAYIT, GIRIS_CIKIS],
};

// =============================================
// 5. AJANLAR & GÖREVLER
// =============================================
const AJAN_TANIM: IParametreSeti = {
  id: 'sistem.ajan',
  baslik: 'Ajan Tanımı',
  simge: '🤖',
  sayfaKurallari: { yeniSayfaEngelle: true },
  parametreler: [
    { ismi: 'ajan_adi', baslik: 'Ajan Adı', turu: 'Yazı', ayarlar: { zorunlu: true } },
    { ismi: 'tipi', baslik: 'Tip', turu: 'Açılır Kutu', ayarlar: { secenekler: ['Socket', 'HTTP', 'Worker', 'Cron'] } },
    { ismi: 'ayarlar_json', baslik: 'Ayarlar (JSON)', turu: 'Kod' },
    { ismi: 'aktif', baslik: 'Aktif', turu: 'Anahtar', degeri: true },
  ] as IParametre[],
};

const GOREV: IParametreSeti = {
  id: 'sistem.gorev',
  baslik: 'Görev',
  simge: '✅',
  sayfaKurallari: { yeniSayfaEngelle: true },
  parametreler: [
    { ismi: 'baslik', baslik: 'Başlık', turu: 'Yazı', ayarlar: { zorunlu: true } },
    { ismi: 'aciklama', baslik: 'Açıklama', turu: 'Yazı Alanı' },
    { ismi: 'atanan', baslik: 'Atanan Kişi', turu: 'Yazı' },
    { ismi: 'oncelik', baslik: 'Öncelik', turu: 'Açılır Kutu', ayarlar: { secenekler: ['Düşük', 'Normal', 'Yüksek', 'Acil'] }, degeri: 'Normal' },
    { ismi: 'durum', baslik: 'Durum', turu: 'Açılır Kutu', ayarlar: { secenekler: ['Yeni', 'Devam Ediyor', 'Beklemede', 'Tamamlandı', 'İptal'] }, degeri: 'Yeni' },
    { ismi: 'bitis_tarihi', baslik: 'Bitiş Tarihi', turu: 'Tarih' },
    { ismi: 'ilerleme', baslik: 'İlerleme', turu: 'İlerleme Çubuğu', degeri: 0 },
  ] as IParametre[],
};

const BILDIRIM: IParametreSeti = {
  id: 'sistem.bildirim',
  baslik: 'Bildirim',
  simge: '🔔',
  sayfaKurallari: { yeniSayfaEngelle: true },
  parametreler: [
    { ismi: 'baslik', baslik: 'Başlık', turu: 'Yazı', ayarlar: { zorunlu: true } },
    { ismi: 'icerik', baslik: 'İçerik', turu: 'Yazı Alanı' },
    { ismi: 'tip', baslik: 'Tip', turu: 'Açılır Kutu', ayarlar: { secenekler: ['Bilgi', 'Uyarı', 'Hata', 'Başarı'] } },
    { ismi: 'okundu', baslik: 'Okundu', turu: 'Doğruluk', degeri: false },
  ] as IParametre[],
};

const AJAN_GRUBU: IParametreSetiGrubu = {
  id: 'sistem.ajanlar',
  baslik: 'Sistem',
  simge: '🤖',
  renk: '#13c2c2',
  kaynak: 'kod',
  sira: 5,
  altGruplar: [AJAN_TANIM, GOREV, BILDIRIM],
};

// =============================================
// 6. İLETİŞİM
// =============================================
const MESAJ: IParametreSeti = {
  id: 'iletisim.mesaj',
  baslik: 'Mesaj',
  simge: '💬',
  sayfaKurallari: { yeniSayfaEngelle: true },
  parametreler: [
    { ismi: 'gonderen', baslik: 'Gönderen', turu: 'Yazı' },
    { ismi: 'alici', baslik: 'Alıcı', turu: 'Yazı' },
    { ismi: 'icerik', baslik: 'İçerik', turu: 'Yazı Alanı' },
    { ismi: 'okundu', baslik: 'Okundu', turu: 'Doğruluk', degeri: false },
  ] as IParametre[],
};

const ILETISIM_GRUBU: IParametreSetiGrubu = {
  id: 'sistem.iletisim',
  baslik: 'İletişim',
  simge: '💬',
  renk: '#eb2f96',
  kaynak: 'kod',
  sira: 6,
  altGruplar: [MESAJ],
};

// =============================================
// 7. TİCARET
// =============================================
const TEKLIF: IParametreSeti = {
  id: 'ticaret.teklif',
  baslik: 'Teklif',
  simge: '📄',
  parametreler: [
    { ismi: 'musteri', baslik: 'Müşteri', turu: 'Yazı', ayarlar: { zorunlu: true } },
    { ismi: 'urunler', baslik: 'Ürünler', turu: 'Tablo' },
    { ismi: 'toplam', baslik: 'Toplam', turu: 'Para' },
    { ismi: 'para_birimi', baslik: 'Para Birimi', turu: 'Açılır Kutu', ayarlar: { secenekler: ['TRY', 'USD', 'EUR'] }, degeri: 'TRY' },
    { ismi: 'gecerlilik', baslik: 'Geçerlilik Tarihi', turu: 'Tarih' },
    { ismi: 'durum', baslik: 'Durum', turu: 'Açılır Kutu', ayarlar: { secenekler: ['Taslak', 'Gönderildi', 'Kabul', 'Red', 'Süresi Doldu'] }, degeri: 'Taslak' },
  ] as IParametre[],
};

const SIPARIS: IParametreSeti = {
  id: 'ticaret.siparis',
  baslik: 'Sipariş',
  simge: '📦',
  parametreler: [
    { ismi: 'teklif_ref', baslik: 'Teklif Referansı', turu: 'Yazı' },
    { ismi: 'musteri', baslik: 'Müşteri', turu: 'Yazı', ayarlar: { zorunlu: true } },
    { ismi: 'urunler', baslik: 'Ürünler', turu: 'Tablo' },
    { ismi: 'toplam', baslik: 'Toplam', turu: 'Para' },
    { ismi: 'teslimat_tarihi', baslik: 'Teslimat Tarihi', turu: 'Tarih' },
    { ismi: 'durum', baslik: 'Durum', turu: 'Açılır Kutu', ayarlar: { secenekler: ['Yeni', 'Üretimde', 'Hazır', 'Kargoda', 'Teslim Edildi', 'İptal'] }, degeri: 'Yeni' },
    { ismi: 'ilerleme', baslik: 'İlerleme', turu: 'İlerleme Çubuğu', degeri: 0 },
  ] as IParametre[],
};

const KARE_KOD: IParametreSeti = {
  id: 'ticaret.kare_kod',
  baslik: 'Kare Kod',
  simge: '📱',
  sayfaKurallari: { yeniSayfaEngelle: true },
  parametreler: [
    { ismi: 'kod', baslik: 'Kod Değeri', turu: 'KareKod', ayarlar: { zorunlu: true } },
    { ismi: 'tip', baslik: 'Tip', turu: 'Açılır Kutu', ayarlar: { secenekler: ['Ürün', 'Sipariş', 'Lokasyon', 'Ekipman', 'Diğer'] } },
    { ismi: 'iliskili_kayit', baslik: 'İlişkili Kayıt ID', turu: 'Yazı' },
  ] as IParametre[],
};

const TICARET_GRUBU: IParametreSetiGrubu = {
  id: 'sistem.ticaret',
  baslik: 'Ticaret',
  simge: '💰',
  renk: '#faad14',
  kaynak: 'kod',
  sira: 7,
  altGruplar: [TEKLIF, SIPARIS, KARE_KOD],
};

// =============================================
// EXPORT
// =============================================
export const SISTEM_PARAMETRE_SETLERI: IParametreSetiGrubu[] = [
  FIRMA_GRUBU,
  PERSONEL_GRUBU,
  CIHAZ_GRUBU,
  DENETIM_GRUBU,
  AJAN_GRUBU,
  ILETISIM_GRUBU,
  TICARET_GRUBU,
];

// VT eşleme tablosu: parametre seti id → vt değeri
export const SET_VT_ESLEME: Record<string, string> = {
  'firma.kayit': 'FikoYT.sistem.firmalar',
  'firma.departman': 'FikoYT.sistem.firma.departmanlar',
  'firma.yetki': 'FikoYT.sistem.firma.yetkiler',
  'personel.kayit': 'FikoYT.sistem.firma.personeller',
  'personel.izin': 'FikoYT.sistem.firma.personeller',
  'personel.vardiya': 'FikoYT.sistem.firma.personeller',
  'cihaz.kayit': 'FikoYT.sistem.cihazlar',
  'cihaz.olay': 'FikoYT.sistem.cihaz.olaylar',
  'cihaz.komut': 'FikoYT.sistem.cihaz.komutlar',
  'cihaz.tetikleyici': 'FikoYT.sistem.cihaz.tetikleyiciler',
  'denetim.kayit': 'FikoYT.sistem.denetim',
  'denetim.giris_cikis': 'FikoYT.sistem.giris_cikis',
  'sistem.ajan': 'FikoYT.sistem.ajanlar',
  'sistem.gorev': 'FikoYT.sistem.gorevler',
  'sistem.bildirim': 'FikoYT.sistem.bildirimler',
  'iletisim.mesaj': 'FikoYT.sistem.mesajlar',
  'ticaret.teklif': 'FikoYT.sistem.teklifler',
  'ticaret.siparis': 'FikoYT.sistem.siparisler',
  'ticaret.kare_kod': 'FikoYT.sistem.kare_kodlar',
};
```

- [ ] **Step 2: Commit**

```bash
git add src/service/fikoyt-ui/src/lib/parametre-setleri/sistem-parametre-setleri.ts
git commit -m "feat: 7 grup, 19 set içeren statik parametre seti tanımları"
```

---

### Task 3: ParametreSetiService (Kod + DB Birleştirme)

**Files:**
- Create: `src/service/fikoyt-ui/src/lib/parametre-setleri/parametre-seti.service.ts`

- [ ] **Step 1: Servisi oluştur**

```typescript
import { Injectable, computed, signal } from '@angular/core';
import { IParametreSetiGrubu } from '../../../interfaces/IParametreSeti.interface';
import { SISTEM_PARAMETRE_SETLERI, SET_VT_ESLEME } from './sistem-parametre-setleri';

declare const FikoYT: any;

@Injectable({ providedIn: 'root' })
export class ParametreSetiService {
  private kodSetleri: IParametreSetiGrubu[] = SISTEM_PARAMETRE_SETLERI;
  private dbSetleri = signal<IParametreSetiGrubu[]>([]);
  private _yuklendi = signal(false);

  yuklendi = this._yuklendi.asReadonly();

  tumSetler = computed<IParametreSetiGrubu[]>(() =>
    this.birlestir(this.kodSetleri, this.dbSetleri())
  );

  async yukle(): Promise<void> {
    try {
      const istek = new FikoYT.IstekKok({
        metod: 'POST',
        komut: 'FikoYT.sistem.DB.hareketler.aggregate',
      });
      istek.parametreler = {
        aggregate: [
          { $match: { vt: 'FikoYT.sistem.parametreSetleri', silindi: { $ne: true } } },
          { $sort: { 'veri.sira': 1 } },
        ],
      };
      await istek.isteSync();
      const sonuc = istek.cevap?.sonuc || [];
      // DB'den gelen kartların veri.parametreSetiGrubu alanını çıkar
      const dbGruplar: IParametreSetiGrubu[] = sonuc.map((kart: any) => ({
        ...kart.veri?.parametreSetiGrubu,
        kaynak: 'db' as const,
      })).filter((g: any) => g?.id);
      this.dbSetleri.set(dbGruplar);
    } catch (e) {
      console.warn('[ParametreSetiService] DB setleri yüklenemedi:', e);
    }
    this._yuklendi.set(true);
  }

  private birlestir(kod: IParametreSetiGrubu[], db: IParametreSetiGrubu[]): IParametreSetiGrubu[] {
    const map = new Map<string, IParametreSetiGrubu>();
    kod.forEach(g => map.set(g.id, { ...g, kaynak: 'kod' }));
    db.forEach(g => map.set(g.id, { ...g, kaynak: 'db' }));
    return [...map.values()].sort((a, b) => (a.sira ?? 99) - (b.sira ?? 99));
  }

  vtIcinSetler(vt: string): IParametreSetiGrubu[] {
    return this.tumSetler().filter(grup => {
      const altSetIds = grup.altGruplar?.map(s => s.id) || [];
      const grupParametreIds = grup.parametreler ? [grup.id] : [];
      const tumIds = [...altSetIds, ...grupParametreIds];
      return tumIds.some(id => SET_VT_ESLEME[id] === vt);
    });
  }

  setIdIleVtBul(setId: string): string | undefined {
    return SET_VT_ESLEME[setId];
  }

  setIdIleBul(setId: string): { grup: IParametreSetiGrubu; set: any } | undefined {
    for (const grup of this.tumSetler()) {
      if (grup.id === setId) return { grup, set: grup };
      const alt = grup.altGruplar?.find(s => s.id === setId);
      if (alt) return { grup, set: alt };
    }
    return undefined;
  }
}
```

- [ ] **Step 2: Commit**

```bash
git add src/service/fikoyt-ui/src/lib/parametre-setleri/parametre-seti.service.ts
git commit -m "feat: ParametreSetiService - kod ve DB parametre setlerini birleştiren servis"
```

---

### Task 4: HareketlerVeriService (Generic CRUD)

**Files:**
- Create: `src/service/fikoyt-ui/src/lib/parametre-setleri/hareketler-veri.service.ts`

- [ ] **Step 1: Generic CRUD servisi oluştur**

```typescript
import { Injectable } from '@angular/core';
import { IParametre } from '../parametreler/parametreler.component';

declare const FikoYT: any;

export interface HareketEkleSecenekler {
  turu?: string;
  yol?: string;
  gizlilik?: string;
  etiketler?: any[];
  kisiler?: string[];
  icerikler?: any[];
  veri?: Record<string, any>;
  parametreSetiId?: string;
}

@Injectable({ providedIn: 'root' })
export class HareketlerVeriService {

  async ekle(vt: string, parametreler: IParametre[], opts: HareketEkleSecenekler = {}): Promise<any> {
    const istek = new FikoYT.IstekKok({
      metod: 'POST',
      komut: 'FikoYT.sistem.DB.hareketler.ekle',
    });
    istek.parametreler = {
      vt,
      yol: opts.yol || vt + '.kayit',
      turu: opts.turu || 'VERI',
      gizlilik: opts.gizlilik || 'Admin',
      etiketler: opts.etiketler || [],
      kisiler: opts.kisiler || [],
      parametreler,
      veri: {
        ...(opts.veri || {}),
        _parametreSetiId: opts.parametreSetiId,
        icerikler: opts.icerikler || [],
      },
    };
    await istek.isteSync();
    return istek.cevap?.sonuc;
  }

  async listele(vt: string, ekFiltreler: any[] = [], sayfalama?: { sayi: number; sayfa: number; siralama?: any }): Promise<any[]> {
    const istek = new FikoYT.IstekKok({
      metod: 'POST',
      komut: 'FikoYT.sistem.DB.hareketler.aggregate',
    });
    const pipeline: any[] = [
      { $match: { vt, silindi: { $ne: true } } },
      ...ekFiltreler,
      { $sort: sayfalama?.siralama || { _id: -1 } },
    ];
    if (sayfalama) {
      pipeline.push({ $skip: (sayfalama.sayfa - 1) * sayfalama.sayi });
      pipeline.push({ $limit: sayfalama.sayi });
    }
    istek.parametreler = { aggregate: pipeline };
    await istek.isteSync();
    return istek.cevap?.sonuc || [];
  }

  async guncelle(id: string, parametreler: IParametre[], ekVeri?: Record<string, any>): Promise<any> {
    const istek = new FikoYT.IstekKok({
      metod: 'PUT',
      komut: 'FikoYT.sistem.DB.hareketler.guncelle',
    });
    istek.parametreler = {
      filtre: { _id: id },
      guncelle: {
        $set: {
          parametreler,
          duzenlenmeTarihi: new Date(),
          ...(ekVeri || {}),
        },
      },
    };
    await istek.isteSync();
    return istek.cevap?.sonuc;
  }

  async sil(id: string): Promise<any> {
    const istek = new FikoYT.IstekKok({
      metod: 'PUT',
      komut: 'FikoYT.sistem.DB.hareketler.guncelle',
    });
    istek.parametreler = {
      filtre: { _id: id },
      guncelle: { $set: { silindi: true } },
    };
    await istek.isteSync();
    return istek.cevap?.sonuc;
  }

  async say(vt: string, ekFiltreler: any[] = []): Promise<number> {
    const istek = new FikoYT.IstekKok({
      metod: 'POST',
      komut: 'FikoYT.sistem.DB.hareketler.aggregate',
    });
    istek.parametreler = {
      aggregate: [
        { $match: { vt, silindi: { $ne: true } } },
        ...ekFiltreler,
        { $count: 'toplam' },
      ],
    };
    await istek.isteSync();
    return istek.cevap?.sonuc?.[0]?.toplam || 0;
  }
}
```

- [ ] **Step 2: Commit**

```bash
git add src/service/fikoyt-ui/src/lib/parametre-setleri/hareketler-veri.service.ts
git commit -m "feat: HareketlerVeriService - generic CRUD helper for hareketler collection"
```

---

## Chunk 2: Admin Paneli - Parametre Seti Yönetimi

### Task 5: Admin Route Ekleme

**Files:**
- Modify: `src/app/uygulamalar/admin/admin.routes.ts`

- [ ] **Step 1: admin.routes.ts dosyasını oku ve parametre-setleri route'u ekle**

Mevcut routes array'ine ekle (sistem-ayarlari'ndan önce):

```typescript
{
  path: 'parametre-setleri',
  loadComponent: () => import('./parametre-setleri/parametre-setleri.component').then(m => m.ParametreSetleriComponent),
},
```

- [ ] **Step 2: Commit**

```bash
git add src/app/uygulamalar/admin/admin.routes.ts
git commit -m "feat: admin paneline parametre-setleri route eklendi"
```

---

### Task 6: Admin Parametre Setleri Sayfası

**Files:**
- Create: `src/app/uygulamalar/admin/parametre-setleri/parametre-setleri.component.ts`
- Create: `src/app/uygulamalar/admin/parametre-setleri/parametre-setleri.component.html`
- Create: `src/app/uygulamalar/admin/parametre-setleri/parametre-setleri.component.less`

- [ ] **Step 1: Component TS dosyası**

```typescript
import { Component, OnInit, signal, inject, ChangeDetectionStrategy } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { NzTableModule } from 'ng-zorro-antd/table';
import { NzButtonModule } from 'ng-zorro-antd/button';
import { NzTagModule } from 'ng-zorro-antd/tag';
import { NzModalModule, NzModalService } from 'ng-zorro-antd/modal';
import { NzMessageService } from 'ng-zorro-antd/message';
import { NzInputModule } from 'ng-zorro-antd/input';
import { NzEmptyModule } from 'ng-zorro-antd/empty';
import { NzPopconfirmModule } from 'ng-zorro-antd/popconfirm';
import { NzCardModule } from 'ng-zorro-antd/card';
import { NzBadgeModule } from 'ng-zorro-antd/badge';
import { ParametreSetiService } from '../../../../service/fikoyt-ui/src/lib/parametre-setleri/parametre-seti.service';
import { HareketlerVeriService } from '../../../../service/fikoyt-ui/src/lib/parametre-setleri/hareketler-veri.service';
import { IParametreSetiGrubu, IParametreSeti } from '../../../../service/fikoyt-ui/interfaces/IParametreSeti.interface';

@Component({
  selector: 'app-admin-parametre-setleri',
  standalone: true,
  imports: [
    CommonModule, FormsModule,
    NzTableModule, NzButtonModule, NzTagModule, NzModalModule,
    NzInputModule, NzEmptyModule, NzPopconfirmModule, NzCardModule, NzBadgeModule,
  ],
  templateUrl: './parametre-setleri.component.html',
  styleUrls: ['./parametre-setleri.component.less'],
  changeDetection: ChangeDetectionStrategy.OnPush,
})
export class ParametreSetleriComponent implements OnInit {
  private pss = inject(ParametreSetiService);
  private hvs = inject(HareketlerVeriService);
  private mesaj = inject(NzMessageService);
  private modal = inject(NzModalService);

  yukleniyor = signal(false);

  get gruplar(): IParametreSetiGrubu[] {
    return this.pss.tumSetler();
  }

  async ngOnInit() {
    this.yukleniyor.set(true);
    await this.pss.yukle();
    this.yukleniyor.set(false);
  }

  altSetSayisi(grup: IParametreSetiGrubu): number {
    return (grup.altGruplar?.length || 0) + (grup.parametreler ? 1 : 0);
  }

  async dbdenSil(grup: IParametreSetiGrubu) {
    if (grup.kaynak !== 'db') {
      this.mesaj.warning('Kod tanımlı setler silinemez');
      return;
    }
    // DB'den parametre seti kartını sil
    const liste = await this.hvs.listele('FikoYT.sistem.parametreSetleri', [
      { $match: { 'veri.parametreSetiGrubu.id': grup.id } },
    ]);
    if (liste.length > 0) {
      await this.hvs.sil(liste[0]._id);
      await this.pss.yukle();
      this.mesaj.success('Parametre seti silindi');
    }
  }

  async yeniGrupEkle() {
    // Basit bir modal ile yeni grup ekleme
    let yeniId = '';
    let yeniBaslik = '';
    let yeniSimge = '📦';

    this.modal.confirm({
      nzTitle: 'Yeni Parametre Seti Grubu',
      nzContent: `
        <div style="display:flex;flex-direction:column;gap:8px">
          <input id="psg-id" placeholder="Grup ID (örn: ozel.uretim)" style="padding:6px"/>
          <input id="psg-baslik" placeholder="Başlık" style="padding:6px"/>
          <input id="psg-simge" placeholder="Simge (emoji)" value="📦" style="padding:6px"/>
        </div>
      `,
      nzOnOk: async () => {
        const idEl = document.getElementById('psg-id') as HTMLInputElement;
        const baslikEl = document.getElementById('psg-baslik') as HTMLInputElement;
        const simgeEl = document.getElementById('psg-simge') as HTMLInputElement;
        if (!idEl?.value || !baslikEl?.value) {
          this.mesaj.warning('ID ve Başlık zorunlu');
          return false;
        }
        const yeniGrup: IParametreSetiGrubu = {
          id: idEl.value,
          baslik: baslikEl.value,
          simge: simgeEl?.value || '📦',
          kaynak: 'db',
          altGruplar: [],
        };
        await this.hvs.ekle('FikoYT.sistem.parametreSetleri', [], {
          turu: 'VERI',
          yol: 'FikoYT.sistem.parametreSetleri.kayit',
          veri: { parametreSetiGrubu: yeniGrup },
        });
        await this.pss.yukle();
        this.mesaj.success('Grup oluşturuldu');
        return true;
      },
    });
  }
}
```

- [ ] **Step 2: HTML template**

```html
<div class="psy-sayfa">
  <div class="psy-baslik">
    <h2>Parametre Setleri</h2>
    <button nz-button nzType="primary" (click)="yeniGrupEkle()">+ Yeni Grup</button>
  </div>

  @if (yukleniyor()) {
    <nz-empty nzNotFoundContent="Yükleniyor..."></nz-empty>
  } @else {
    <div class="psy-grid">
      @for (grup of gruplar; track grup.id) {
        <nz-card class="psy-kart" [nzTitle]="kartBaslik" [nzExtra]="kartExtra">
          <ng-template #kartBaslik>
            <span class="psy-kart-baslik">
              <span class="psy-simge">{{ grup.simge }}</span>
              <span>{{ grup.baslik }}</span>
              <nz-tag [nzColor]="grup.kaynak === 'kod' ? 'blue' : 'green'">{{ grup.kaynak }}</nz-tag>
            </span>
          </ng-template>
          <ng-template #kartExtra>
            @if (grup.kaynak === 'db') {
              <button nz-button nzType="text" nzDanger nz-popconfirm nzPopconfirmTitle="Silmek istediğinize emin misiniz?" (nzOnConfirm)="dbdenSil(grup)">Sil</button>
            }
          </ng-template>

          @if (grup.aciklama) {
            <p class="psy-aciklama">{{ grup.aciklama }}</p>
          }

          <div class="psy-alt-setler">
            @if (grup.altGruplar?.length) {
              @for (set of grup.altGruplar; track set.id) {
                <div class="psy-set-satir">
                  <span>{{ set.simge }} {{ set.baslik }}</span>
                  <nz-tag>{{ set.parametreler?.length || 0 }} parametre</nz-tag>
                </div>
              }
            }
            @if (grup.parametreler?.length) {
              <div class="psy-set-satir">
                <span>Doğrudan parametreler</span>
                <nz-tag>{{ grup.parametreler.length }} parametre</nz-tag>
              </div>
            }
            @if (!grup.altGruplar?.length && !grup.parametreler?.length) {
              <nz-empty nzNotFoundContent="Alt set yok"></nz-empty>
            }
          </div>

          <div class="psy-kart-alt">
            <span class="psy-toplam">{{ altSetSayisi(grup) }} set</span>
            @if (grup.renk) {
              <span class="psy-renk" [style.background]="grup.renk"></span>
            }
          </div>
        </nz-card>
      }
    </div>
  }
</div>
```

- [ ] **Step 3: LESS stilleri**

```less
.psy-sayfa {
  padding: 24px;
}

.psy-baslik {
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-bottom: 24px;

  h2 { margin: 0; }
}

.psy-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(350px, 1fr));
  gap: 16px;
}

.psy-kart-baslik {
  display: flex;
  align-items: center;
  gap: 8px;
}

.psy-simge {
  font-size: 20px;
}

.psy-aciklama {
  color: rgba(255, 255, 255, 0.45);
  margin-bottom: 12px;
}

.psy-alt-setler {
  display: flex;
  flex-direction: column;
  gap: 6px;
}

.psy-set-satir {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 6px 8px;
  border-radius: 6px;
  background: rgba(255, 255, 255, 0.04);
}

.psy-kart-alt {
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-top: 12px;
  padding-top: 12px;
  border-top: 1px solid rgba(255, 255, 255, 0.08);
}

.psy-toplam {
  color: rgba(255, 255, 255, 0.45);
  font-size: 12px;
}

.psy-renk {
  width: 12px;
  height: 12px;
  border-radius: 50%;
}
```

- [ ] **Step 4: Commit**

```bash
git add src/app/uygulamalar/admin/parametre-setleri/
git commit -m "feat: admin parametre setleri yönetim sayfası (liste, ekle, sil)"
```

---

## Chunk 3: Entegrasyon & Doğrulama

### Task 7: Tüm Dosyaların Build Doğrulaması

- [ ] **Step 1: Angular build kontrolü**

Run: `cd D:/__sistem__/Masaustu/FikoYT.Yeni.Cag/fikoyt-sistem && npx ng build --configuration development 2>&1 | tail -20`

Expected: Build başarılı, hata yok

- [ ] **Step 2: Hata varsa düzelt ve tekrar build et**

- [ ] **Step 3: Final commit**

```bash
git add -A
git commit -m "feat: merkezi hareketler parametre seti sistemi - altyapı tamamlandı"
```

---

## Özet

| Chunk | Task | Dosya | Açıklama |
|---|---|---|---|
| 1 | 1 | IKart.interface.ts | IVT/IYollar genişletme |
| 1 | 2 | sistem-parametre-setleri.ts | 7 grup, 19 set statik tanımlar |
| 1 | 3 | parametre-seti.service.ts | Kod + DB birleştirme servisi |
| 1 | 4 | hareketler-veri.service.ts | Generic CRUD helper |
| 2 | 5 | admin.routes.ts | Route ekleme |
| 2 | 6 | parametre-setleri.component.* | Admin yönetim sayfası |
| 3 | 7 | - | Build doğrulama |
