# Fiko İş Takip — Merkezi Teklif/Sipariş/İş Emri Sistemi (Kral kipi)

> Fikri kararı (2026-07-23): **Orchestrator'dan AYRI sistem, AYRI pencere.** Bir fikocad
> "Kral" olur (`istakip.kral=true`), diğerleri IP:port ile uzaktan bağlanır. Normal sistem
> hiç etkilenmez — her şey `istakip.*` bayrakları arkasında, varsayılan KAPALI.
> Depo: **MongoDB** (kral makinede/ağda kurulu Community ya da mevcut docker mongo);
> sürücü **mongocxx (Apache 2.0)** — mongod DAĞITILMAZ (SSPL), yalnız bağlanılır.

## 1. Mimari

```
 uygulama/fikocad/istakip_penceresi.*      ← D2: ayrı pencere (FikoCamPencere + webskin)
        │
 motor/istakip/                            ← D1: UI'siz, testli çekirdek
   ├─ model      (IsKayit belge modeli + istakipproto serileştirme)
   ├─ merkez     (IsMerkez — kral: TEK YAZAR, sürüm sayacı, idempotent yazma, delta yayını)
   ├─ istemci    (IsIstemci — önbellek + snapshot/delta uygulama + çevrimdışı bekleyen kuyruk)
   └─ depo       (DepoArayuz: DepoBellek (test) · DepoMongo (mongocxx, kral tarafı))
        │
 taşıma: fiko::orkestra TasimaArayuz AYNEN KULLANILIR (kopya değil) — kral kendi
 portunu dinler (istakip.port), istemci istakip.kral_adres'e bağlanır. Orchestrator
 penceresi/kulesi kapalıyken de çalışır; yalnız taşıma-sürücüsü kodu ortak.
```

**İlkeler:**
1. **Tek yazar = Kral.** İstemci asla kendi diskine kayıt yazmaz; önbellek + bekleyen
   kuyruk bellekte. Çakışma/merge problemi tasarımda yok edilir.
2. **Belge modeli şemasız:** `IsKayit{kimlik,tur,surum,silindi,alanlar(key=val)}`.
   `tur` string ("musteri","teklif","siparis","is_emri","operasyon") → Mongo koleksiyon
   adı. Alan şeması UI'nin işi; motor migrasyonsuz.
3. **Sürüm = global artan sayaç** (kralda, depoda kalıcı). Delta senkronun imleci:
   istemci "sürüm X'ten beri" ister, kral `surum > X` kayıtları döker.
4. **İdempotent yazma:** istek anahtarı `(istemciNo=nodeId, sira)`. Kral istemci başına
   son işlenen sırayı tutar; tekrar gelen istek YOK SAYILIR (sonuç Onay ile döner).
   Silme = `silindi=true` (tombstone) — delta senkron silmeyi de taşır, kayıt kaybolmaz.
5. **Davranış korunur:** bayraklar kapalıyken hiç soket/Mongo bağlantısı açılmaz.

## 2. Akış

- **İstemci bağlanınca:** `IsSnapshotIste(sonSurum)` → kral `IsSnapshot` (sonSurum'dan
  beri değişen kayıtlar + yeni sürüm). İlk bağlantıda sonSurum=0 → tam döküm.
- **Canlı:** kral her başarılı yazmada tüm bağlı istemcilere `IsDelta` (tek kayıt +
  yazarın korelasyonu). Yazan istemci kendi korelasyonunu görünce bekleyenden düşer.
- **Yazma:** istemci `IsYaz(istemciNo, sira, kayıt taslağı)` → kral rol kapısı →
  kimlik/sürüm atar → DepoMongo'ya yazar → delta yayını. Kimlik 0 = yeni kayıt.
- **Çevrimdışı:** istemci yazmaları bekleyen kuyruğa; bağlantı dönünce sırayla iter
  (idempotens çifte uygulamayı önler). UI'da "bekliyor" rozeti.
- **Kral çevrimdışı:** istemciler salt-okunur önbellekte çalışır; dönünce delta ile yetişir.

## 3. Protokol (SurecMesajTip enum SONA)

`IsSnapshotIste=19 · IsSnapshot=20 · IsDelta=21 · IsYaz=22` — gövdeler `istakipproto`
(surecproto yardımcıları üstünde), sürümlü, sondaki fazla bayt yok sayılır (ileri-uyum).
Yazma reddi mevcut `Onay` çerçevesiyle korelasyonlu döner. Roller orkestra eşleştirme/rol
sisteminden (İzleyici salt-okur, Operatör yazar, Yönetici siler).

## 4. Depo

- `DepoArayuz{yaz(IsKayit), surumdenBeri(surum)→liste, sayac()→u64}` — merkez yalnız bunu görür.
- `DepoBellek`: testler + Mongo'suz geliştirme.
- `DepoMongo` (yalnız kral yükler): mongocxx; TEK koleksiyon `kayitlar`
  `{_id=kimlik, tur, surum, silindi, alanlar:[{a,d}]}` (surum+tur indeksli — delta imleci
  tek sorgu); istemci sıra haritası `sistem` koleksiyonunda (idempotens kral yeniden
  başlasa da korunur).
  Bağlantı: `istakip.mongo_uri` (örn. `mongodb://localhost:27017/fiko_istakip`).
  vcpkg: `mongo-cxx-driver:x64-windows`. CMake `find_package(mongocxx)` bulunamazsa
  DepoMongo derlenmez (FIKO_ISTAKIP_MONGO=0) — motor testleri Mongo'suz yeşil kalır.

## 5. Varlık zinciri (UI şeması — D2)

`Müşteri → Teklif → Sipariş → İş Emri → Operasyon` — bağ alanları: `ust=<kimlik>`.
Dönüşümler (Teklif→Sipariş vb.) = yeni kayıt + `kaynak=<kimlik>` alanı; kaynak kayıt
`durum=donusturuldu`. Dosya ekleri: yol referansı; transfer orkestra DosyaSenkron ile (D3).

## 6. AyarSistemi kayıtları

```
 istakip.kral        = false   (bu makine Kral — Mongo'ya bağlanır, port dinler)
 istakip.port        = 47820   (kral çerçeve kanalı)
 istakip.kral_adres  = ""      (istemci: "ip:port"; boş = istemci kapalı)
 istakip.mongo_uri   = "mongodb://localhost:27017/fiko_istakip"
 istakip.rol_zorunlu = true    (rol kapısı; kapatınca herkes Operatör — tek atölye kolaylığı)
```

## 7. Dalga planı ve DURUM (2026-07-23 seferberliği)

| Dalga | Kapsam | Durum |
|-------|--------|-------|
| **D1** | motor/istakip: model+proto+merkez+istemci+kanal+DepoBellek — sahte taşımayla uçtan uca testli | ✅ 86 test (çakışma kilidi, parçalı snapshot, idempotens, rol reddi, kopukluk) |
| **D1b** | DepoMongo (mongocxx 4.4, vcpkg) + TCP sürücüleri (`istakip_ag.*`: kral dinleyici + istemci backoff yeniden bağlanma) | ✅ canlı Mongo entegrasyon testi (auth'lu docker mongo'ya karşı) + loopback TCP testleri |
| **D2** | IstakipServis (yaşam döngüsü, tek yazma API'si, olay yayını) + `istakip.*` ayarları + "Fiko İş Takip" penceresi (Müşteri·Teklif·Sipariş·İş Emri sekmeleri, tablo+form+dönüşüm akışları, durum rozetleri) | ✅ (kanban görünümü cila olarak açık) |
| **D3** | Lua `fiko.istakip.liste/kayit/yaz` (MCP bu kanaldan) + olaylar (`IsKayitDegisti, IsKralBaglandi, IsKralKoptu` enum SONA) | ✅ |
| **D4** | Dosya ekleri (DosyaSenkron köprüsü) + rapor/dışa aktarım + kanban + müşteri referans dropdown + eşleştirme/rol tam entegrasyonu | ⏳ açık |

Notlar:
- Yazma redleri kalıcıysa ("yetki"/"cakisma") bekleyen düşer + olay; "depo" ise bekler.
- Kral kurulum denemesi bayrak geçişinde BİR KEZ (Mongo timeout ana ipliği kilitlemesin;
  URI'ye `serverSelectionTimeoutMS=2000` otomatik eklenir). Başarısızsa bayrak kapat-aç.
- Auth'lu Mongo için URI örneği: `mongodb://kullanici:sifre@host:27017/fiko_istakip?authSource=admin`.
