# Fiko İş Takip 2.0 — Detaylı Tasarım Planı

> Amaç: mevcut Kral/İstemci + şemasız `IsKayit` motorunu DEĞİŞTİRMEDEN, UI
> katmanını "türler de veri" prensibiyle tamamen genelleştirmek. Sonuç: kullanıcı
> kod yazmadan sınırsız kayıt tipi (Üretim, Nakliye, Teslimat, Kalite Kontrolü,
> Garanti, ne isterse) + her kayda bağlı özel olay akışı + çoklu görünüm
> (Tablo/Kanban/Zaman Çizelgesi/İlişki Grafiği) kurabilecek.
>
> Bu doküman `docs/istakip_tasarim.md`'nin (D1-D4, mevcut/tamamlanmış) ÜZERİNE
> gelen bir sonraki dalga setidir — motor tarafı orada tanımlı, burada UI ve
> ince bir meta-veri katmanı ele alınıyor.

## 0. Neden motor değil UI katmanı?

`motor/istakip/model.hpp` zaten şemasız: `IsKayit{kimlik, tur(string),
surum, silindi, alanlar(key=val liste)}`. `tur` alanı serbest string —
motor "musteri" mi "nakliye" mi hiç bilmiyor/umursamıyor. Sabitleme tamamen
`uygulama/fikocad/istakip_penceresi.cpp` içindeki `turlar()` fonksiyonunda:
5 elemanlı statik `std::vector<TurTanim>`. Yani:

- Motora yeni mesaj tipi eklemeye gerek YOK.
- Delta senkron protokolüne dokunmaya gerek YOK.
- Sadece "tür tanımını nereden okuyoruz" sorusunu değiştiriyoruz:
  koddan → veriden (ki bu veri de zaten IsMerkez/DepoMongo/delta ile
  otomatik tüm istemcilere yayılıyor — bedava senkron şema).


## 1. Meta-şema: "_sema" kayıtları

Özel `tur = "_sema"` kayıtları — her biri BİR kayıt tipini tanımlar
(Müşteri, Teklif, Sipariş, İş Emri gibi mevcutlar dahil — onlar da artık
kod değil, kurulumda yazılan `_sema` kayıtları olacak).

Alanları (hepsi `alanlar` key=val içinde, motor yorumlamaz):

| Alan | Açıklama | Örnek |
|---|---|---|
| `tur_id` | Bu şemanın tanımladığı iş verisi türü (serbest string, benzersiz) | `"nakliye"` |
| `ikon` | Emoji/ikon | `"🚚"` |
| `baslik` | Sekme/menü başlığı | `"Nakliyeler"` |
| `tekil` | "Yeni ..." etiketi | `"Nakliye Kaydı"` |
| `renk` | Hex renk (kanban/grafik/zaman çizelgesi tutarlılığı) | `"#4C9BE8"` |
| `bag_tur` | Zincirde hangi türe bağlanır (boş=kök) | `"siparis"` |
| `alan_semasi` | JSON dizi: `[{"ad":"tasiyici","etiket":"Taşıyıcı","tip":"metin","tablo":true}, ...]` | — |
| `durum_semasi` | JSON dizi: `["hazirlaniyor","yolda","gumrukte","teslim edildi"]` (boş=kanban yok, düz tablo) | — |
| `sira` | Menüde sıralama ağırlığı (int, string olarak tutulur) | `"50"` |

**Alan tipleri (`tip`):** `metin`, `sayi`, `tarih`, `para`, `coktan_secmeli`
(seçenekler `secenekler` alt-anahtarında), `iliski` (başka bir türe referans
— dropdown ile o türün kayıtlarından seçilir, `iliski_tur` alt-anahtarıyla
hedef tür belirtilir), `dosya`. İlk sürümde `metin/sayi/tarih/para/durum`
yeterli; `iliski` ve `coktan_secmeli` F2 sonunda eklenir.

**Neden JSON string içinde?** `IsKayit.alanlar` düz `string→string`
liste; iç içe yapı (alan listesi) için tek pratik yol tek bir alana JSON
gömmek. Motor bunu opak string olarak taşır, hiç parse etmez — sadece UI
katmanı (yeni `istakip_sema.hpp/cpp`) açar/kapatır. Küçük, bağımlılıksız
bir JSON parse edici (projede zaten `surecproto` içinde benzer serileştirme
kalıpları var; `nlohmann/json` header-only eklenebilir ya da 40 satırlık
elle yazılmış minik parser — tercih F1'de netleşir).

### 1.1 `turlar()` refactor

Şu anki imza:
```cpp
const std::vector<TurTanim>& turlar();  // static, kod-sabit
```
Yeni imza:
```cpp
std::vector<TurTanim> turlarOku(const istakip::IsIstemci& veri);
// veri->turListe("_sema") okur, her birini TurTanim'e çevirir (JSON parse),
// sira alanına göre sıralar. Sonuç g_turCache + g_turCacheSurum ile
// (listeKur'daki desenle aynı) sürüm değişince yeniden kurulur — kare-başı
// parse yok.
```
İlk açılışta `_sema` kaydı hiç yoksa (yeni kurulum / eski veritabanı):
`ilkKurulumSemalariYaz()` mevcut 5 türü (musteri/teklif/siparis/is_emri/
istemci_rol) `_sema` kaydı olarak kral'a yazar — GERİYE DÖNÜK UYUMLULUK,
mevcut kayıtlar hiç bozulmaz, sadece tanım kaynağı değişir.

## 2. Olay akışı: "_olay" kayıtları

Her iş kaydının (tür farketmez) altında canlı bir zaman çizelgesi/akış
olacak — sistemin kendi otomatik logları + kullanıcı yorumları + kullanıcının
uydurduğu özel olaylar ("Numune onaylandı", "Gümrükten çıktı") hepsi aynı
mekanizma:

| Alan | Açıklama |
|---|---|
| `ust` | Bağlı olduğu kaydın kimliği (mevcut `ALAN_UST` sabiti reuse) |
| `olay_tur` | `sistem` \| `yorum` \| `ozel` |
| `baslik` | Kısa özet (`"durum: üretimde → sevkiyat"`, ya da kullanıcı metni) |
| `detay` | Uzun metin (opsiyonel) |
| `yapan` | İstemciNo (kim yaptı — Erişim sekmesindeki kayıtlarla eşlenir) |
| `zaman` | Unix ms string (istemci saatiyle yazılır; kral `surum` zaten sıra garantisi verir) |

**Otomatik üretim:** `IstakipServis::yaz()` her başarılı yazmadan sonra,
eski/yeni kaydı diff'leyip (alan bazında) `_olay(olay_tur=sistem)`
kayıtlarını OTOMATİK oluşturur — kullanıcı hiçbir şey yapmaz, "durum
değişti", "termin güncellendi" gibi girdiler kendiliğinden akışa düşer.
Bu diff mantığı `istakip_servis.cpp`'ye eklenir (motor'a değil — kral zaten
delta yayınlıyor, servis kendi yazdığı değişimi otomatik olay'a çevirir).

**Neden ayrı tip, iç içe alan değil:** `_olay` kayıtları kendi `surum`/
delta akışına sahip olduğu için canlı güncelleme BEDAVA geliyor (var olan
`IsDelta` mekanizması) — ayrıca bağımsız CSV dışa aktarım / filtreleme /
arama otomatik çalışır (mevcut `turListe`, `filtreGecer` fonksiyonları
aynen kullanılır, `ust` alanına göre süzülür).

## 3. UI Mimarisi — 3 Panelli Kabuk

```
┌─ Komut Çubuğu (Ctrl+K) ────────────────────────────────────────────┐
├─ SOL (220px) ──────┬─ ORTA (esnek) ─────────────┬─ SAĞ (320px) ────┤
│ Tür Gezgini:       │ Görünüm sekmeleri:          │ Seçili kayıt:    │
│  🧑 Müşteriler 12  │  ☰ Tablo ▦ Kanban           │  tüm alanlar     │
│  📄 Teklifler  5   │  📅 Zaman Çiz. 🕸 İlişki    │  (inline düzenle)│
│  📦 Siparişler 8   │                              │ ── Olay Akışı ── │
│  🛠 İş Emirleri 3  │  [aktif görünümün içeriği]   │  ⚙ durum değişti │
│  🏭 Üretim     4   │                              │  💬 "acil yap"   │
│  🚚 Nakliye    2   │                              │  📎 dosya.pdf    │
│  ──────────────    │                              │  [yorum yaz...]  │
│  ⚙ Şema Tasarımcı  │                              │                  │
└────────────────────┴──────────────────────────────┴──────────────────┘
```

- **Sol panel**: `_sema` kayıtlarından üretilir (F1 sayesinde), her satırda
  canlı kayıt sayacı (`turListe(tur).size()`), sürükle-bırak ile sıralama
  (`sira` alanını günceller). En altta "⚙ Şema Tasarımcı" → F2 penceresi.
- **Orta panel**: seçili türe göre 4 görünüm sekmesi. Tablo/Kanban zaten
  var (taşınacak), Zaman Çizelgesi ve İlişki Grafiği F5'te yeni.
- **Sağ panel**: mevcut `formCiz` yerini alır ama İKİYE bölünür — üstte
  alanlar (şemadan üretilir, artık 8 sabit değil, `alan_semasi` kadar),
  altta `_olay` akışı (F3).
- **Komut çubuğu**: mevcut `dinamik_komut_penceresi.cpp` / `arama_menu.cpp`
  kalıbı reuse edilir — "yeni <tür>", "<serbest metin>" tüm türlerde arama,
  Enter ile o kayda git + sağ panel otomatik açılır.

## 4. Görünüm modları (F5)

- **Zaman Çizelgesi**: `termin` alanı olan TÜM türler tek yatay eksende;
  her satır bir tür şeridi, çubuklar kayıt aralığı (varsa `baslangic`+
  `termin`), gecikenler kırmızı kenarlık. ImGui custom-draw (mevcut
  `pafta_ciz.cpp`/`belge_ciz.cpp` gibi immediate-mode çizim kalıbı).
- **İlişki Grafiği**: `ALAN_UST`/`ALAN_KAYNAK` zincirini node-graph çizer
  (basit force-directed ya da sabit katmanlı ağaç — köke `bag_tur=""`
  olanlar, her katman bir tür). Node tıkla → sağ panel açılır. Kalıp
  `kinematik_agac.cpp`'deki ağaç görselleştirmesine yakın, referans alınır.

## 5. Fazlı plan (F1→F6) — kod dokunacağı dosyalar

| Faz | İçerik | Yeni/değişen dosyalar |
|---|---|---|
| **F1** | `_sema` okuma/yazma, `turlar()`→`turlarOku()`, JSON mini-parser, geri uyumlu ilk-kurulum yazıcı | YENİ `istakip_sema.hpp/.cpp`; DEĞİŞEN `istakip_penceresi.cpp` (turlar() çağrıları) |
| **F2** | Şema Tasarımcı penceresi: tür ekle/sil/düzenle, alan ekle/sil/sırala, durum listesi düzenleyici, renk seçici | YENİ `istakip_sema_penceresi.hpp/.cpp` |
| **F3** | `_olay` tipi, otomatik diff-log, sağ panelde akış listesi + yorum kutusu | DEĞİŞEN `istakip_servis.cpp` (yaz() sonrası diff), `istakip_penceresi.cpp` (akış UI) |
| **F4** | 3 panelli kabuk + komut çubuğu entegrasyonu | `istakip_penceresi.cpp` büyük yeniden yazım (mevcut sekme-üstü model → sol/orta/sağ) |
| **F5** | Zaman Çizelgesi + İlişki Grafiği görünümleri | YENİ `istakip_gantt.hpp/.cpp`, `istakip_grafik.hpp/.cpp` |
| **F6** | Çoklu dosya eki (mevcut `DosyaSenkron` köprüsü UI'ya bağlanır), sürükle-bırak hedefi her kayıt kartında | DEĞİŞEN `istakip_penceresi.cpp`, `istakip_servis.cpp` |

**Bağımlılık sırası kesin:** F1 şart (her şey ona dayanır) → F2 olmadan
kullanıcı yeni tür kuramaz (elle `_sema` kaydı yazmak zorunda kalır, çirkin)
→ F3 bağımsız, F1'den hemen sonra da yapılabilir → F4 F1+F2+F3 sonrası
mantıklı (yoksa kabuk değişimi iki kez yapılır) → F5/F6 en sona, kozmetik/
katma değer katmanı.

## 6. Riskler / kararlar (F1 başlarken netleşecek)

- JSON parser: header-only 3. parti mi (vcpkg `nlohmann-json`, zaten
  projede mongocxx vcpkg kullanıyor, ek bağımlılık sorun değil) yoksa elle
  minik parser mı (dış bağımlılık sıfır, ama F2'nin iç içe `secenekler`
  alanı için biraz daha kod). Öneri: `nlohmann-json` — hızlı, güvenilir,
  header-only, CMake'e 3 satır.
- `alan_semasi` JSON büyüklüğü sınırlı kalmalı (mevcut form 256 bayt/alan
  sabiti gibi bir üst sınır konur, aşırı büyük şema kayıtları depoya
  yük olmasın).
- Geri uyumluluk: F1 devreye girdiğinde MEVCUT üretim verisi (varsa) hiç
  dokunulmadan kalmalı — `_sema` sadece TANIM taşır, mevcut `musteri/
  teklif/siparis/is_emri` kayıtları aynı `tur` string'iyle kalmaya devam
  eder, sadece görüntüleme şeması artık koddan değil veriden gelir.
