# SaaS Multi-Tenant Firma Yönetim Sistemi - Kapsamlı Plan

> **Tarih:** 2026-03-08
> **Durum:** PLAN - Onay Bekliyor
> **Kapsam:** Tam kapsamlı firma yönetim platformu (sadece HMI değil)

---

## 1. SİSTEM MİMARİSİ

### 1.1 Multi-Tenant Yapı

```
Süper Admin (FikoYT Sahibi)
 └── Firma A
 │    ├── Firma Yöneticisi (atanmış kullanıcı)
 │    ├── Departman Yöneticisi (birden fazla)
 │    └── Personeller
 │         ├── Cihazlar (PDKS, üretim, yemekhane...)
 │         └── Kart Okuyucular
 └── Firma B
      ├── Firma Yöneticisi
      └── ...
```

**İzolasyon Prensibi:** Her koleksiyon kaydında `firmaId` alanı zorunlu. Frontend service katmanı tüm sorguları `firmaId` ile filtreler.

### 1.2 Route Yapısı

```
/🧩/👑/                    → Süper Admin Panel (mevcut, genişletilecek)
/🧩/👑/firmalar/            → Firma CRUD (yeni)
/🧩/👑/cihazlar/            → Tüm cihaz yönetimi (yeni)
/🧩/👑/hmi-sistemi/         → HMI ayarları (mevcut, genişletilecek)

/🧩/🏢/                    → Firma Yönetici Panel (YENİ)
/🧩/🏢/:firmaId/pano        → Firma dashboard
/🧩/🏢/:firmaId/personeller → Personel yönetimi
/🧩/🏢/:firmaId/departmanlar→ Departman yapısı
/🧩/🏢/:firmaId/cihazlar    → Firmaya atanmış cihazlar
/🧩/🏢/:firmaId/vardiyalar  → Vardiya tanımları
/🧩/🏢/:firmaId/raporlar    → Raporlama
/🧩/🏢/:firmaId/ayarlar     → Firma ayarları

/🧩/📟/                    → HMI Cihaz Ekranı (mevcut, genişletilecek)
```

### 1.3 Guard Sistemi

| Guard | Kontrol | Kullanım |
|-------|---------|----------|
| `adminGuard` | `yetkiler.includes('Süper Yönetici')` | `/🧩/👑/*` |
| `firmaYoneticiGuard` | `firmaYetkileri[firmaId]` kontrol | `/🧩/🏢/*` |
| `cihazGuard` | Cihaz aktivasyon + firma eşleşme | `/🧩/📟/*` |

---

## 2. VERİ MODELLERİ (MongoDB Koleksiyonları)

### 2.1 `firmalar` Koleksiyonu

```typescript
interface IFirma {
  _id: string;
  firmaAdi: string;
  firmaKodu: string;           // Benzersiz kısa kod (örn: "UYAR")
  logo?: string;               // Resim URL
  renkTema: {
    birincil: string;          // HEX renk
    ikincil: string;
    arkaplan: string;
  };
  adres?: {
    il: string;
    ilce: string;
    tamAdres: string;
    konum?: { lat: number; lng: number };
  };
  iletisim?: {
    telefon: string;
    eposta: string;
    web?: string;
  };
  sektor: string;              // "Döküm", "Otomotiv", "Gıda" vb.
  abonelikTuru: 'deneme' | 'baslangic' | 'profesyonel' | 'kurumsal';
  abonelikBitis?: Date;
  maxPersonel: number;         // Abonelik limiti
  maxCihaz: number;
  aktif: boolean;
  olusturan: string;           // Süper Admin userId
  olusturulmaTarihi: Date;
  guncellenmeTarihi: Date;
}
```

### 2.2 `firma_yetkileri` Koleksiyonu

```typescript
interface IFirmaYetki {
  _id: string;
  firmaId: string;
  kullaniciId: string;
  rol: 'firma_yoneticisi' | 'departman_yoneticisi' | 'muhasebe' | 'ik' | 'izleyici';
  yetkiler: string[];          // Granüler yetkiler
  departmanlar?: string[];     // Departman bazlı kısıtlama
  olusturan: string;           // Kim atadı
  olusturulmaTarihi: Date;
}

// Yetki Listesi:
// - personel.goruntule, personel.ekle, personel.duzenle, personel.sil
// - cihaz.goruntule, cihaz.ekle, cihaz.duzenle, cihaz.sil
// - vardiya.goruntule, vardiya.yonet
// - rapor.goruntule, rapor.indir
// - departman.goruntule, departman.yonet
// - kart.ata, kart.iptal
// - ayar.goruntule, ayar.duzenle
// - puantaj.goruntule, puantaj.duzenle
```

### 2.3 `firma_personeller` Koleksiyonu

```typescript
interface IFirmaPersonel {
  _id: string;
  firmaId: string;
  sicilNo: string;
  ad: string;
  soyad: string;
  tcKimlik?: string;
  telefon?: string;
  eposta?: string;
  departmanId: string;
  unvan: string;
  gorev: string;
  iseGirisTarihi: Date;
  istenCikisTarihi?: Date;
  aktif: boolean;
  kartUid?: string;            // RFID kart UID
  kartAtanmaTarihi?: Date;
  fotoUrl?: string;
  yuzTanimaKayitli?: boolean;
  vardiyaGrupId?: string;
  izinHakki: {
    yillikIzin: number;
    kullanilanIzin: number;
    kalanIzin: number;
  };
  olusturulmaTarihi: Date;
  guncellenmeTarihi: Date;
}
```

### 2.4 `firma_departmanlar` Koleksiyonu

```typescript
interface IFirmaDepartman {
  _id: string;
  firmaId: string;
  departmanAdi: string;
  departmanKodu: string;
  ustDepartmanId?: string;     // Hiyerarşik yapı
  yoneticiPersonelId?: string;
  aktif: boolean;
  sira: number;
}
```

### 2.5 `firma_cihazlar` Koleksiyonu

```typescript
interface IFirmaCihaz {
  _id: string;
  firmaId: string;
  cihazKimlik: string;         // Donanım unique ID
  cihazAdi: string;
  aktivasyonKodu?: string;     // Tek kullanımlık aktivasyon
  aktivasyonDurumu: 'bekliyor' | 'aktif' | 'askida' | 'iptal';
  aktivasyonTarihi?: Date;
  uygulamaModu: CihazUygulamaModu;
  konum?: string;              // "Giriş Kapısı", "Yemekhane", "B Blok"
  departmanId?: string;
  donanim: {
    model?: string;
    seriNo?: string;
    macAdresi?: string;
    ipAdresi?: string;
    isletimSistemi?: string;
    ekranBoyutu?: string;
  };
  kartOkuyucu: {
    tip: 'nfc' | 'rfid' | 'qr' | 'biyometrik' | 'yok';
    marka?: string;
    seriPort?: string;
    baudRate?: number;
  };
  sonBaglantiZamani?: Date;
  cevrimiciMi: boolean;
  konfigürasyon: Record<string, any>;  // Mod bazlı ayarlar
  olusturulmaTarihi: Date;
}

type CihazUygulamaModu =
  | 'pdks'                // Giriş/Çıkış takip
  | 'uretim_takip'        // Üretim istasyonu
  | 'gecis_kontrol'       // Kapı geçiş
  | 'yemekhane'           // Yemekhane terminali
  | 'depo'                // Depo/stok terminali
  | 'ziyaretci'           // Ziyaretçi kayıt
  | 'is_guvenligi'        // İSG kontrol
  | 'arac_takip'          // Araç giriş/çıkış
  | 'anket'               // Personel anket
  | 'bilgi_ekrani';       // Sadece bilgi gösterim
```

### 2.6 `firma_giris_cikis` Koleksiyonu (PDKS)

```typescript
interface IGirisCikis {
  _id: string;
  firmaId: string;
  personelId: string;
  cihazId: string;
  kartUid: string;
  tur: 'giris' | 'cikis';
  zaman: Date;
  konum?: string;
  onayDurumu: 'otomatik' | 'manuel' | 'duzeltme';
  notlar?: string;
}
```

### 2.7 `firma_vardiyalar` Koleksiyonu

```typescript
interface IVardiya {
  _id: string;
  firmaId: string;
  vardiyaAdi: string;          // "Sabah Vardiyası", "Gece Vardiyası"
  vardiyaKodu: string;
  baslangicSaati: string;      // "08:00"
  bitisSaati: string;          // "17:00"
  molaSureleri: {
    baslangic: string;
    bitis: string;
    aciklama: string;
  }[];
  toleransSuresi: number;      // dakika (geç gelme toleransı)
  mesaiBaslangic?: string;     // Mesai başlangıç saati
  haftaSonu: boolean;
  aktif: boolean;
}

interface IVardiyaGrup {
  _id: string;
  firmaId: string;
  grupAdi: string;
  rotasyon: {
    vardiyaId: string;
    gunSayisi: number;
  }[];
  baslangicTarihi: Date;
}
```

### 2.8 `firma_izinler` Koleksiyonu

```typescript
interface IIzin {
  _id: string;
  firmaId: string;
  personelId: string;
  izinTuru: 'yillik' | 'mazeret' | 'hastalik' | 'dogum' | 'olum' | 'evlilik' | 'ucretsiz';
  baslangicTarihi: Date;
  bitisTarihi: Date;
  gunSayisi: number;
  durum: 'bekliyor' | 'onaylandi' | 'reddedildi' | 'iptal';
  onaylayanId?: string;
  aciklama?: string;
  belgeler?: string[];         // Dosya URL'leri
  olusturulmaTarihi: Date;
}
```

### 2.9 `firma_uretim_kayitlari` Koleksiyonu

```typescript
interface IUretimKayit {
  _id: string;
  firmaId: string;
  cihazId: string;
  personelId: string;
  isEmriNo?: string;
  urunKodu?: string;
  miktar: number;
  birim: string;
  durum: 'basladi' | 'devam' | 'tamamlandi' | 'durduruldu';
  baslangicZamani: Date;
  bitisZamani?: Date;
  notlar?: string;
}
```

### 2.10 `firma_ziyaretciler` Koleksiyonu

```typescript
interface IZiyaretci {
  _id: string;
  firmaId: string;
  cihazId: string;
  adSoyad: string;
  tcKimlik?: string;
  sirket?: string;
  ziyaretNedeni: string;
  ziyaretEdilenPersonelId?: string;
  girisZamani: Date;
  cikisZamani?: Date;
  fotoUrl?: string;
  geciciKartUid?: string;
}
```

---

## 3. CİHAZ AKTİVASYON AKIŞI

```
┌─────────────────┐     ┌──────────────────┐     ┌─────────────────┐
│   Süper Admin    │     │   Cihaz (HMI)    │     │  Firma Yönetici │
│   (Admin Panel)  │     │   (📟 ekranı)    │     │  (🏢 paneli)   │
└────────┬────────┘     └────────┬─────────┘     └────────┬────────┘
         │                       │                         │
    1. Firma oluştur             │                         │
         │                       │                         │
    2. Kullanıcıya               │                         │
       firma yetkisi ver         │                         │
         │                       │                         │
    3. Aktivasyon kodu           │                         │
       oluştur (6 hane)          │                         │
         │                       │                         │
         │              4. Cihaz ilk açılış                │
         │                 "Aktivasyon Kodu Girin"          │
         │                       │                         │
         │              5. Kod girilir                     │
         │                       │                         │
         │◄─────── 6. Kod doğrulama ───────►              │
         │                       │                         │
    7. Cihaz → Firma              │                         │
       eşleşmesi kaydedilir      │                         │
         │                       │                         │
         │              8. Cihaz konfigürasyonu             │
         │                 indirilir (mod, tema,            │
         │                 firma logosu vb.)                │
         │                       │                         │
         │                       │                    9. Cihaz listesinde
         │                       │                       görünür
         │                       │                         │
         │              10. Seçilen mod'a göre             │
         │                  UI yüklenir                    │
```

### Aktivasyon Kodu Doğrulama API:

```typescript
// Cihaz tarafından çağrılır
komut: 'FikoYT.sistem.DB.firma_cihazlar.aggregate'
pipeline: [
  { $match: { aktivasyonKodu: 'ABC123', aktivasyonDurumu: 'bekliyor' } },
  { $lookup: { from: 'firmalar', localField: 'firmaId', foreignField: '_id', as: 'firma' } },
  { $unwind: '$firma' }
]
```

---

## 4. CİHAZ UYGULAMA MODLARI

Her cihaza bir "uygulama modu" atanır. Mod, cihazın tüm davranışını belirler.

### 4.1 PDKS Modu (Giriş/Çıkış)

**Amaç:** Personel giriş/çıkış saatlerini kaydetme

**Ekran Akışı:**
```
[Bekleme Ekranı] → Kart okut → [Personel Tanındı] → Giriş/Çıkış kaydı → [Özet]
                                                    → Mesai bilgisi göster
                                                    → Son 5 hareket listesi
```

**Konfigürasyon:**
```typescript
interface IPdksKonfig {
  otomatikGirisCikis: boolean;    // Sıralı giriş-çıkış mı, yoksa butonla mı?
  toleransDakika: number;         // Geç gelme toleransı
  mesaiUyarisi: boolean;          // Fazla mesai uyarısı
  fotoKayit: boolean;             // Giriş/çıkışta fotoğraf çek
  sesliUyari: boolean;            // Kart okunduğunda ses
}
```

### 4.2 Üretim Takip Modu

**Amaç:** İş emri bazlı üretim kaydı

**Ekran Akışı:**
```
[Operatör Giriş - kart] → [İş Emri Listesi] → İş emri seç → [Üretim Sayacı]
                                                               → Miktar gir
                                                               → Durakla/Bitir
                                                               → Hata bildir
```

**Konfigürasyon:**
```typescript
interface IUretimKonfig {
  isEmriZorunlu: boolean;
  otomatikSayac: boolean;
  kaliteKontrol: boolean;
  fotografZorunlu: boolean;
}
```

### 4.3 Geçiş Kontrol Modu

**Amaç:** Kapı/bariyer açma yetkisi

**Ekran Akışı:**
```
[Kart Okut] → Yetki kontrol → ✅ Geçiş İzni / ❌ Yetkisiz
                              → GPIO/Relay tetikleme (kapı açma)
                              → Geçiş logu kaydet
```

**Konfigürasyon:**
```typescript
interface IGecisKonfig {
  acikKalmaSuresi: number;        // Kapı açık kalma (saniye)
  yetkiliDepartmanlar: string[];  // Hangi departmanlar geçebilir
  saatKisitlamasi?: {
    baslangic: string;
    bitis: string;
  };
  ziyaretciGecisi: boolean;
}
```

### 4.4 Yemekhane Modu

**Amaç:** Yemek hakkı kontrolü, günlük öğün takibi

**Ekran Akışı:**
```
[Kart Okut] → Yemek hakkı kontrol → ✅ "Afiyet Olsun" / ❌ "Hakkınız Kullanıldı"
                                    → Günlük sayaç güncelle
                                    → Menü göster
```

**Konfigürasyon:**
```typescript
interface IYemekhaneKonfig {
  gunlukOgunLimiti: number;       // Günde max kaç öğün
  ogunSaatleri: { ogun: string; baslangic: string; bitis: string }[];
  menuGoster: boolean;
}
```

### 4.5 Depo/Stok Modu

**Amaç:** Malzeme giriş/çıkış kaydı

**Ekran Akışı:**
```
[Operatör Giriş] → [İşlem Seç: Giriş/Çıkış/Sayım] → [Barkod/QR Oku] → Kaydet
```

### 4.6 Ziyaretçi Kayıt Modu

**Amaç:** Ziyaretçi kaydı ve takibi

**Ekran Akışı:**
```
[Yeni Ziyaretçi] → Ad/Soyad, TC, Firma, Neden → Fotoğraf çek → Geçici kart ver
[Ziyaretçi Çıkış] → Kart okut → Çıkış kaydı
```

### 4.7 İş Güvenliği Modu

**Amaç:** İSG kontrol noktası

**Ekran Akışı:**
```
[Kontrol Listesi] → Maddeler tamamla → İmza (kart okut) → Rapor oluştur
                  → Kaza/Olay bildir → Acil durum tetikle
```

### 4.8 Araç Takip Modu

**Amaç:** Araç giriş/çıkış ve park yönetimi

**Ekran Akışı:**
```
[Plaka/Kart Oku] → Araç tanı → Giriş/Çıkış kaydı → Bariyer aç
```

### 4.9 Anket Modu

**Amaç:** Personel memnuniyet, yemek değerlendirme vb.

**Ekran Akışı:**
```
[Kart Okut (opsiyonel)] → [Sorular - emoji/yıldız] → Teşekkürler
```

### 4.10 Bilgi Ekranı Modu

**Amaç:** Pasif bilgi gösterimi (TV/monitör)

**Ekran İçeriği:**
```
[Slayt Gösterisi] → Firma duyuruları, üretim verileri, mesai tablosu
                  → Otomatik yenileme (configurable interval)
```

---

## 5. SERVİS MİMARİSİ

### 5.1 FirmaService (Yeni)

```typescript
// src/app/uygulamalar/firma-yonetim/services/firma.service.ts

@Injectable({ providedIn: 'root' })
export class FirmaService {
  private FikoYT = inject(FikoYTService);

  // ─── TEMEL CRUD ───────────────────────────────────────────────────────────

  async firmaListesi(sayfa = 1, limit = 20): Promise<{ toplam: number; liste: IFirma[] }> {
    return this.aggregate('FikoYT.sistem.DB.firmalar.aggregate', [
      { $match: { aktif: true } },
      { $facet: {
        toplam: [{ $count: 'sayi' }],
        liste: [{ $sort: { olusturulmaTarihi: -1 } }, { $skip: (sayfa - 1) * limit }, { $limit: limit }]
      }}
    ]);
  }

  async firmaEkle(firma: Partial<IFirma>): Promise<any> {
    return this.ekle('FikoYT.sistem.DB.firmalar.ekle', firma);
  }

  async firmaGuncelle(firmaId: string, veri: Partial<IFirma>): Promise<any> {
    return this.guncelle('FikoYT.sistem.DB.firmalar.guncelle',
      { _id: firmaId }, { $set: veri }
    );
  }

  // ─── YETKİ YÖNETİMİ ──────────────────────────────────────────────────────

  async firmaYetkiAta(firmaId: string, kullaniciId: string, rol: string, yetkiler: string[]): Promise<any> {
    return this.ekle('FikoYT.sistem.DB.firma_yetkileri.ekle', {
      firmaId, kullaniciId, rol, yetkiler,
      olusturulmaTarihi: new Date()
    });
  }

  async kullaniciFirmaYetkileri(kullaniciId: string): Promise<IFirmaYetki[]> {
    return this.aggregate('FikoYT.sistem.DB.firma_yetkileri.aggregate', [
      { $match: { kullaniciId } },
      { $lookup: { from: 'firmalar', localField: 'firmaId', foreignField: '_id', as: 'firma' } },
      { $unwind: '$firma' }
    ]);
  }

  // ─── CİHAZ YÖNETİMİ ──────────────────────────────────────────────────────

  async cihazListesi(firmaId: string): Promise<IFirmaCihaz[]> {
    return this.aggregate('FikoYT.sistem.DB.firma_cihazlar.aggregate', [
      { $match: { firmaId } },
      { $sort: { olusturulmaTarihi: -1 } }
    ]);
  }

  async aktivasyonKoduOlustur(firmaId: string, cihazBilgi: Partial<IFirmaCihaz>): Promise<string> {
    const kod = Math.random().toString(36).substring(2, 8).toUpperCase();
    await this.ekle('FikoYT.sistem.DB.firma_cihazlar.ekle', {
      ...cihazBilgi,
      firmaId,
      aktivasyonKodu: kod,
      aktivasyonDurumu: 'bekliyor',
      cevrimiciMi: false,
      olusturulmaTarihi: new Date()
    });
    return kod;
  }

  async cihazAktivasyonDogrula(kod: string, cihazKimlik: string): Promise<IFirmaCihaz | null> {
    const sonuc = await this.aggregate('FikoYT.sistem.DB.firma_cihazlar.aggregate', [
      { $match: { aktivasyonKodu: kod, aktivasyonDurumu: 'bekliyor' } },
      { $lookup: { from: 'firmalar', localField: 'firmaId', foreignField: '_id', as: 'firma' } },
      { $unwind: '$firma' }
    ]);
    if (sonuc.length === 0) return null;

    // Aktifleştir
    await this.guncelle('FikoYT.sistem.DB.firma_cihazlar.guncelle',
      { _id: sonuc[0]._id },
      { $set: {
        cihazKimlik,
        aktivasyonDurumu: 'aktif',
        aktivasyonTarihi: new Date()
      }}
    );
    return sonuc[0];
  }

  // ─── PERSONEL ─────────────────────────────────────────────────────────────

  async personelListesi(firmaId: string, sayfa = 1, limit = 20, filtre?: any): Promise<any> {
    const match: any = { firmaId, aktif: true };
    if (filtre?.departmanId) match.departmanId = filtre.departmanId;
    if (filtre?.arama) {
      match.$or = [
        { ad: { $regex: filtre.arama, $options: 'i' } },
        { soyad: { $regex: filtre.arama, $options: 'i' } },
        { sicilNo: { $regex: filtre.arama, $options: 'i' } }
      ];
    }
    return this.aggregate('FikoYT.sistem.DB.firma_personeller.aggregate', [
      { $match: match },
      { $lookup: { from: 'firma_departmanlar', localField: 'departmanId', foreignField: '_id', as: 'departman' } },
      { $unwind: { path: '$departman', preserveNullAndEmptyArrays: true } },
      { $facet: {
        toplam: [{ $count: 'sayi' }],
        liste: [{ $sort: { ad: 1 } }, { $skip: (sayfa - 1) * limit }, { $limit: limit }]
      }}
    ]);
  }

  // ─── PDKS ─────────────────────────────────────────────────────────────────

  async girisCikisKaydet(firmaId: string, kayit: Partial<IGirisCikis>): Promise<any> {
    return this.ekle('FikoYT.sistem.DB.firma_giris_cikis.ekle', {
      ...kayit,
      firmaId,
      zaman: new Date()
    });
  }

  async gunlukPuantaj(firmaId: string, tarih: Date): Promise<any[]> {
    const gun = new Date(tarih);
    gun.setHours(0, 0, 0, 0);
    const ertesiGun = new Date(gun);
    ertesiGun.setDate(ertesiGun.getDate() + 1);

    return this.aggregate('FikoYT.sistem.DB.firma_giris_cikis.aggregate', [
      { $match: { firmaId, zaman: { $gte: gun, $lt: ertesiGun } } },
      { $sort: { zaman: 1 } },
      { $group: {
        _id: '$personelId',
        hareketler: { $push: { tur: '$tur', zaman: '$zaman', cihazId: '$cihazId' } }
      }},
      { $lookup: { from: 'firma_personeller', localField: '_id', foreignField: '_id', as: 'personel' } },
      { $unwind: '$personel' }
    ]);
  }

  // ─── RAPORLAMA ────────────────────────────────────────────────────────────

  async firmaOzet(firmaId: string): Promise<any> {
    const [personelSayisi, cihazSayisi, bugunGiris, aktifVardiya] = await Promise.all([
      this.aggregate('FikoYT.sistem.DB.firma_personeller.aggregate', [
        { $match: { firmaId, aktif: true } }, { $count: 'sayi' }
      ]),
      this.aggregate('FikoYT.sistem.DB.firma_cihazlar.aggregate', [
        { $match: { firmaId, aktivasyonDurumu: 'aktif' } }, { $count: 'sayi' }
      ]),
      this.aggregate('FikoYT.sistem.DB.firma_giris_cikis.aggregate', [
        { $match: { firmaId, tur: 'giris', zaman: { $gte: this.bugunBaslangic() } } },
        { $count: 'sayi' }
      ]),
      this.aggregate('FikoYT.sistem.DB.firma_vardiyalar.aggregate', [
        { $match: { firmaId, aktif: true } }, { $count: 'sayi' }
      ])
    ]);

    return {
      personelSayisi: personelSayisi[0]?.sayi || 0,
      cihazSayisi: cihazSayisi[0]?.sayi || 0,
      bugunGiris: bugunGiris[0]?.sayi || 0,
      aktifVardiya: aktifVardiya[0]?.sayi || 0
    };
  }

  // ─── YARDIMCI ─────────────────────────────────────────────────────────────

  private bugunBaslangic(): Date {
    const d = new Date();
    d.setHours(0, 0, 0, 0);
    return d;
  }

  private async aggregate(komut: string, pipeline: any[]): Promise<any> {
    const istek = new FikoYTIstekKok({ metod: 'POST', komut });
    istek.parametreler = { aggregate: pipeline };
    await istek.isteSync();
    return istek.cevap?.sonuc || [];
  }

  private async guncelle(komut: string, filter: any, veri: any): Promise<any> {
    const istek = new FikoYTIstekKok({ metod: 'POST', komut });
    const formData = new FormData();
    formData.append('req_body', JSON.stringify({ filter, veri }));
    istek.parametreler = formData;
    await istek.isteSync();
    return istek.cevap?.sonuc;
  }

  private async sil(komut: string, filter: any): Promise<any> {
    const istek = new FikoYTIstekKok({ metod: 'POST', komut });
    const formData = new FormData();
    formData.append('req_body', JSON.stringify({ filter }));
    istek.parametreler = formData;
    await istek.isteSync();
    return istek.cevap?.sonuc;
  }

  private async ekle(komut: string, veri: any): Promise<any> {
    const istek = new FikoYTIstekKok({ metod: 'POST', komut });
    const formData = new FormData();
    formData.append('req_body', JSON.stringify(veri));
    istek.parametreler = formData;
    await istek.isteSync();
    return istek.cevap?.sonuc;
  }
}
```

---

## 6. UYGULAMA FAZLARİ

### FAZ 1: Altyapı (Öncelik: YÜKSEK)

**Süre:** İlk aşama

| # | İş | Dosya/Konum |
|---|-----|-------------|
| 1 | Interface tanımları | `src/app/uygulamalar/firma-yonetim/interfaces/` |
| 2 | FirmaService | `src/app/uygulamalar/firma-yonetim/services/firma.service.ts` |
| 3 | firmaYoneticiGuard | `src/app/guards/firma-yonetici.guard.ts` |
| 4 | cihazGuard | `src/app/guards/cihaz.guard.ts` |
| 5 | Route yapısı (🏢) | `src/app/uygulamalar/firma-yonetim/firma-yonetim.routes.ts` |
| 6 | uygulamalar.routes.ts güncelle | Mevcut dosyaya 🏢 route ekle |

### FAZ 2: Süper Admin - Firma Yönetimi

| # | İş | Dosya/Konum |
|---|-----|-------------|
| 1 | Firma CRUD (admin panelde) | `admin/firmalar/` |
| 2 | Firma yetki atama | `admin/firmalar/yetki-ata/` |
| 3 | Cihaz kayıt + aktivasyon kodu | `admin/cihazlar/` |
| 4 | Admin shell menüye ekleme | `admin/admin-shell.component.ts` |
| 5 | HMI sistemi route genişletme | `admin/hmi-sistemi/hmi-sistemi.routes.ts` |

### FAZ 3: Firma Yönetici Paneli (🏢)

| # | İş | Dosya/Konum |
|---|-----|-------------|
| 1 | Shell component (sidebar + header) | `firma-yonetim/firma-shell.component.ts` |
| 2 | Dashboard | `firma-yonetim/dashboard/` |
| 3 | Personel yönetimi | `firma-yonetim/personeller/` |
| 4 | Departman yönetimi | `firma-yonetim/departmanlar/` |
| 5 | Cihaz listesi & ayarları | `firma-yonetim/cihazlar/` |
| 6 | Vardiya tanımları | `firma-yonetim/vardiyalar/` |
| 7 | İzin yönetimi | `firma-yonetim/izinler/` |

### FAZ 4: Cihaz Uygulama Modları

| # | İş | Dosya/Konum |
|---|-----|-------------|
| 1 | Cihaz aktivasyon ekranı | `hmi-pano/aktivasyon/` |
| 2 | Mod yönlendirici (mod'a göre UI) | `hmi-pano/mod-yonlendirici/` |
| 3 | PDKS modu | `hmi-pano/modlar/pdks/` |
| 4 | Üretim takip modu | `hmi-pano/modlar/uretim/` |
| 5 | Geçiş kontrol modu | `hmi-pano/modlar/gecis/` |
| 6 | Yemekhane modu | `hmi-pano/modlar/yemekhane/` |
| 7 | Bilgi ekranı modu | `hmi-pano/modlar/bilgi-ekrani/` |

### FAZ 5: PDKS & Puantaj Sistemi

| # | İş | Dosya/Konum |
|---|-----|-------------|
| 1 | Giriş/çıkış kayıt mantığı | Servis + PDKS modu |
| 2 | Puantaj tablosu | `firma-yonetim/puantaj/` |
| 3 | Mesai hesaplama | Servis |
| 4 | Geç gelme/erken çıkma raporları | Rapor |

### FAZ 6: Raporlama & Analytics

| # | İş | Dosya/Konum |
|---|-----|-------------|
| 1 | Firma dashboard metrikleri | `firma-yonetim/dashboard/` |
| 2 | Personel devam raporu | `firma-yonetim/raporlar/devam/` |
| 3 | Cihaz kullanım raporu | `firma-yonetim/raporlar/cihaz/` |
| 4 | Zaman serisi grafikleri | Chart.js/ECharts |
| 5 | Excel/PDF export | Servis |

### FAZ 7: Ek Modlar & Gelişmiş Özellikler

| # | İş |
|---|-----|
| 1 | Ziyaretçi kayıt modu |
| 2 | Depo/stok modu |
| 3 | İş güvenliği modu |
| 4 | Araç takip modu |
| 5 | Anket modu |
| 6 | Push bildirimler (ntfy entegrasyonu) |
| 7 | Mobil uygulama entegrasyonu (Flutter) |

---

## 7. DOSYA YAPISI (Nihai)

```
src/app/
├── guards/
│   ├── admin.guard.ts                    (mevcut)
│   ├── firma-yonetici.guard.ts           (YENİ)
│   └── cihaz.guard.ts                    (YENİ)
│
├── uygulamalar/
│   ├── admin/                            (mevcut - genişletilecek)
│   │   ├── firmalar/                     (YENİ)
│   │   │   ├── firmalar.component.ts     → Firma listesi
│   │   │   ├── firma-detay/              → Firma detay/düzenle
│   │   │   ├── yetki-ata/                → Kullanıcıya firma yetkisi ver
│   │   │   └── firmalar.routes.ts
│   │   ├── cihazlar/                     (YENİ)
│   │   │   ├── cihazlar.component.ts     → Tüm cihaz listesi
│   │   │   ├── cihaz-detay/              → Cihaz detay/ayar
│   │   │   └── aktivasyon/               → Aktivasyon kodu oluştur
│   │   ├── hmi-sistemi/                  (mevcut - genişletilecek)
│   │   └── admin-shell.component.ts      (güncelle - menüye firma/cihaz ekle)
│   │
│   ├── firma-yonetim/                    (YENİ - 🏢)
│   │   ├── interfaces/
│   │   │   ├── firma.interface.ts
│   │   │   ├── personel.interface.ts
│   │   │   ├── cihaz.interface.ts
│   │   │   ├── vardiya.interface.ts
│   │   │   └── pdks.interface.ts
│   │   ├── services/
│   │   │   ├── firma.service.ts
│   │   │   └── pdks.service.ts
│   │   ├── firma-shell.component.ts      → Sidebar + header + firma seçici
│   │   ├── firma-secici/                 → Firma seçme ekranı
│   │   ├── dashboard/                    → Firma dashboard
│   │   ├── personeller/                  → CRUD + kart atama
│   │   ├── departmanlar/                 → Departman ağacı
│   │   ├── cihazlar/                     → Firmadaki cihazlar
│   │   ├── vardiyalar/                   → Vardiya tanım/rotasyon
│   │   ├── izinler/                      → İzin talep/onay
│   │   ├── puantaj/                      → Puantaj tablosu
│   │   ├── raporlar/                     → Raporlama sayfaları
│   │   ├── ayarlar/                      → Firma ayarları (logo, renk, vb.)
│   │   └── firma-yonetim.routes.ts
│   │
│   ├── hmi-pano/                         (mevcut - genişletilecek)
│   │   ├── aktivasyon/                   (YENİ)
│   │   │   └── aktivasyon.component.ts   → İlk açılış aktivasyon ekranı
│   │   ├── mod-yonlendirici/             (YENİ)
│   │   │   └── mod-yonlendirici.ts       → Mod'a göre doğru UI'ı yükle
│   │   ├── modlar/                       (YENİ)
│   │   │   ├── pdks/                     → PDKS modu UI
│   │   │   ├── uretim/                   → Üretim takip UI
│   │   │   ├── gecis/                    → Geçiş kontrol UI
│   │   │   ├── yemekhane/                → Yemekhane UI
│   │   │   ├── bilgi-ekrani/             → Bilgi ekranı UI
│   │   │   ├── ziyaretci/                → Ziyaretçi kayıt UI
│   │   │   ├── depo/                     → Depo terminali UI
│   │   │   └── anket/                    → Anket UI
│   │   ├── pano/                         (mevcut - firmaId desteği ekle)
│   │   ├── services/
│   │   │   ├── kart-websocket.service.ts (mevcut)
│   │   │   └── seri-port.service.ts      (mevcut)
│   │   └── hmi-pano.routes.ts            (güncelle)
```

---

## 8. HMI PANO SHELL GÜNCELLEMESİ

Mevcut shell'e firma branding entegrasyonu:

```typescript
// hmi-pano-shell.component.ts değişiklikleri:

// 1. Firma bilgilerini yükle
firmaKonfig: IFirmaCihaz | null = null;

ngOnInit() {
  // Mevcut init...
  this.firmaKonfigYukle();
}

private async firmaKonfigYukle() {
  const cihazKimlik = localStorage.getItem('cihaz-kimlik');
  if (!cihazKimlik) return; // Aktivasyon ekranına yönlendir

  const sonuc = await this.firmaService.cihazBilgisi(cihazKimlik);
  if (sonuc) {
    this.firmaKonfig = sonuc;
    // Firma teması uygula
    document.documentElement.style.setProperty('--firma-renk-1', sonuc.firma.renkTema.birincil);
    // Başlık güncelle
    // Logo güncelle
  }
}

// 2. Template'de firma logosu ve rengi kullan
// <img [src]="firmaKonfig?.firma?.logo || './simgeler/logo.webp'" />
// <span>{{ firmaKonfig?.firma?.firmaAdi || 'FikoYT' }} HMI</span>
```

---

## 9. SOCKET.IO OLAY GENİŞLETMESİ

Mevcut olaylar korunarak firma bazlı room'lar eklenir:

```
Mevcut:
  FikoYT.sistem.io.cihaz.guncellendi
  FikoYT.sistem.io.cihaz.baglandi
  FikoYT.sistem.io.cihaz.koptu

Yeni (firma bazlı):
  FikoYT.sistem.io.firma.{firmaId}.cihaz.guncellendi
  FikoYT.sistem.io.firma.{firmaId}.personel.giris
  FikoYT.sistem.io.firma.{firmaId}.personel.cikis
  FikoYT.sistem.io.firma.{firmaId}.alarm
```

---

## 10. TEKNOLOJİ KARARLARI

| Karar | Seçim | Neden |
|-------|-------|-------|
| State management | Angular Signals | Mevcut pattern, OnPush uyumu |
| UI Framework | Ng-Zorro | Mevcut, tutarlılık |
| Grafik kütüphanesi | ECharts (ngx-echarts) | Zengin chart tipleri, büyük veri desteği |
| Tablo | NzTable (virtual scroll) | Mevcut pattern, sayfalama desteği |
| Form | Reactive Forms | Karmaşık validasyon, dinamik alanlar |
| Export | SheetJS (xlsx) + jsPDF | Client-side export |
| Harita | Leaflet | Konum bazlı özellikler |
| Real-time | Socket.IO (mevcut) | Cihaz iletişimi |
| API | FikoYTIstekKok (mevcut) | Backend değişikliği yok |
| Auth | FikoYTService.kimlik (mevcut) | Mevcut auth sistemi |

---

## 11. GÜVENLİK

1. **Firma izolasyonu:** Her sorguya `firmaId` enjekte et (service katmanında)
2. **Yetki kontrolü:** Guard + service seviyesinde çift kontrol
3. **Kart güvenliği:** Kart UID + firma eşleşmesi doğrula
4. **Aktivasyon kodları:** Tek kullanımlık, 24 saat geçerlilik
5. **API rate limiting:** Mevcut backend rate limiting kullan
6. **Veri erişimi:** Kullanıcı sadece yetkili olduğu firmaların verilerine erişebilir

---

## BAŞLANGIÇ NOKTASI

**Önerilen başlangıç sırası:**

1. Interface dosyaları oluştur (`firma-yonetim/interfaces/`)
2. Guard'ları oluştur (`firma-yonetici.guard.ts`, `cihaz.guard.ts`)
3. FirmaService oluştur (`firma-yonetim/services/firma.service.ts`)
4. Route yapısını kur (`firma-yonetim.routes.ts` + `uygulamalar.routes.ts` güncelle)
5. Admin panele firma CRUD ekle
6. Firma yönetici shell oluştur
7. İlk mod: PDKS
