# Kapsama matrisi — `65` Eğitmen kaydı · `67` Eğitmen dosyası · `68` Eğitmen durumu

*02.08.2026 · Tasarımlar 02.08.2026 14:02–14:03'te teslim edildi (65 ve 67 revize, 68 yeni)*

Üç dosya da **baştan sona okundu** (Tasarım Uygulama Protokolü §1). Aşağıdaki matris, teslim edilen tasarım ile bugünkü **kodun** karşılaştırmasıdır.

⛔ **İşaretlerin anlamı — karıştırılmasın:** her satır tasarımda VARDIR. İşaret, o satırın **bizim kodumuzda** ne durumda olduğunu söyler.

| İşaret | Anlamı |
|---|---|
| ✓ | Tasarımda var, kodda da var |
| ⚠ | Tasarımda var, kodda **kısmen** var |
| ❌ | Tasarımda var, kodda **yok — yazılacak** |

Yani ❌ satırları tasarımcının eksiği değil, **bizim borcumuzdur**.

---

## `68 Egitmen Durumu` — **02.08.2026'da yazıldı** ✓

*Aşağıdaki tablo ilk okumada çıkarılmıştı; uygulamadan sonra tekrar geçildi. Kalan tek satır bölge kısayolu (Sets: gerek yok, ileride).*

Brief (`docs/design/egitmen-durumu-brief.md`) doğrultusunda çizilmiş ve **brief'in ötesine geçmiş**. Aşağıdaki satırların tamamı ❌ (ekran yazılmadı); işaretlenenler **brief'te olmayan, tasarımcının eklediği** kararlardır.

| # | Tasarım öğesi | Durum | Not |
|---|---|---|---|
| 1 | Adres `/egitmenler/durum` · kırıntı "Gündem / Eğitmenler / Durum" | ✓ | `routes/office.php` — ⚠ `{instructor}`'dan ÖNCE, yoksa "durum" kimlik sanılır |
| 2 | Başlık + eğitmen sayısı + alt cümle "atama yaparken bakılır" | ✓ | `Workload.vue` `PageHeader` |
| 3 | Dönem: Son 3 / 6 / 12 ay + **Özel aralık** | ✓ | `InstructorWorkload::PERIODS` + `window()`; ufuk adreste |
| 4 | Dönem özeti şeridi (tarih aralığı · N eğitim · N saha günü) | ✓ | `totals` |
| 5 | Süzgeçler: Kategori · İl | ⚠ | ikisi var; **belge süzgeci yok** — 68-d |
| 6 | Kural cümlesi: "dönem tüm sütunları etkiler; Son eğitim ve Yaklaşan bağımsız" | ✓ | `period_rule` + sorgu bu kurala göre yazıldı |
| 7 | Sütunlar: EĞİTMEN · EĞİTİM · GÜN · EN ÇOK GİTTİĞİ İLLER · SON EĞİTİM · YAKLAŞAN · BELGE | ✓ | `Workload.vue` tablosu |
| 8 | Sıralanabilir sütunlar + varsayılan "en uzun süredir eğitim almayan üstte" | ✓ | `sortBy()` + sorgunun kendi `usort`u |
| 9 | Satırda avatar + ad + kategori | ✓ | `Workload.vue` |
| 10 | Dikkat tonu 1: "hiç eğitim yazılmamış" + kayıt tarihi + "N gündür" | ✓ | `never` + `days_on_file` |
| 11 | Dikkat tonu 2: "dönemde eğitim yok" | ✓ | `idle` |
| 12 | Dikkat tonu 3: "tek il baskın" (≥yarısı bir ilde) | ✓ | `concentrated` (`CONCENTRATION = 0.5`) — ⚠ "kayıtlı ili X" yok, eğitmende kayıtlı il alanı yok |
| 13 | "Soru işaretidir, suçlama değil" cümlesi | ✓ | `tones_are_questions` |
| 14 | "BAŞKA SEBEP OLABİLİR" paneli | ⚠ | bölge tercihi satırları var; **belge engeli satırı yok** — 68-d |
| 15 | "DÖNEM DAĞILIMI" çubuk grafiği + sıfır alanlar | ✓ | `Workload.vue` dağılım bölümü |
| 16 | "sıfır eğitimli olanlar da listede" notu | ⚠ | not var; **sayfalama yok** (tablo tam liste) |
| 17 | Dışa Aktar | ✓ | CSV + ⛔ **erişim logu** (`instructor_workload_export`), testi var |
| 18 | Bölge tercihi bloğu: Tüm Türkiye / Seçili iller | ✓ | `instructor_travel_provinces` + `65` formu — ⛔ kısayol **bilinçli kapsam dışı** (Sets, 02.08.2026) |
| 19 | "Tercih, yasak değildir… uyarır ve gerekçe sorar" | ✓ | `CandidatePicker` üçüncü grup + gerekçe kutusu |
| 20 | Aday listesinde üç grup | ✓ | `PlanningCandidates` `eligible` / `outside_area` / `ineligible`, testi var |
| 21 | "Gerekçeyle Ata" — gerekçe atama kaydına yazılır | ✓ | `training_instructor_offers.outside_area_reason` → kabul/seçimde `training_instructor_assignments`e kopyalanır |
| 22 | 375px | ⚠ | tablo kendi kutusunda yatay kayıyor; **karta inme yok** — 68-e |

---

## `67 Yonetici Egitmen Dosyasi` — tasarım eksiksiz; **kodda büyük kısmı var, iki gerçek eksik**

| # | Tasarım öğesi | ✓/⚠/❌ | Kanıt |
|---|---|---|---|
| 23 | Künye başlığı: avatar, ad, hesap durumu, **"Kısmen engelli — 2 eğitim"** rozeti | ✓ | `Show.vue` başlık + `blocked_for` bloğu |
| 24 | Alt satır: kategori · bakanlık ID · **açık bakiye** | ✓ | `Show.vue` + `instructor.finance.balance` |
| 25 | Butonlar: Hesabı Pasifleştir · ＋ Belge Yükle · Künyeyi Düzenle | ✓ | `Show.vue` |
| 26 | Dört sekme: Dosya · Eğitimler N · Finans ₺ · Loglar | ✓ | `InstructorFileNav` (02.08.2026'da dördüncü sekme eklendi) |
| 27 | Künye düzenleme: ad, e-posta (+doğrulama sıfırlanır uyarısı), telefon, kategori, bakanlık ID, sertifika, kurum sayısı, tarife (saatlik/günlük + override cümlesi) | ✓ | `Show.vue` düzenleme formu; tarife birimi `SegmentedControl` |
| 28 | Hassas alanlar: TCKN / SGK maskeli + "Aç" + log uyarısı | ✓ | `Show.vue` + `RevealInstructorIdentifier` |
| 29 | **Yaklaşan atamalar** kartı + "Takvimde gör →" | ✓ | `instructor.file.upcoming` |
| 30 | Finans özeti kartı: açık bakiye · bu yıl hakediş · onaylı masraf · onay bekleyen | ✓ | `instructor.file.finance_summary` |
| 31 | "Eğitimler" sekmesi — dönem/statü/il süzgeci, kolonlar, iptaller listede kalır | ✓ | `InstructorTrainings` + `Trainings.vue`; iptalin günü **null** (sıfır değil), testi var |
| 32 | Yan paneller: DÖNEM ÖZETİ · BÖLGE DAĞILIMI · NEDEN AZ EĞİTİM | ✓ | `summary` · `provinces` · `reasons` (belge engeli + bölge tercihi) |
| 33 | Finans başlığı: TOPLAM BORÇ · ÖDENEN · AÇIK BAKİYE · ONAY BEKLEYEN (bakiyeye dahil değil) | ✓ | `Finance.vue` + `InstructorLedger` |
| 34 | **Program → eğitim → masraf üç kademe** | ✓ | `InstructorLedger::groupByProgramme()` |
| 35 | Yıl süzgeci · "Yalnız açık kalemler" + "N program gizli" | ✓ | `year` + `openOnly` + `hidden` |
| 36 | Arama (eğitim, kod, yer) | ✓ | `search` — ⛔ ortak `fold()` üzerinden (kırmızı çizgi 17) |
| 37 | Program satırı: kod, tarih aralığı, N eğitim, pencere, hakediş, N masraf, net + açık | ✓ | `Finance.vue` program başlığı |
| 38 | Eğitim satırı: hakediş satırı (gün × tarife · **kategori tarifesi mi override mı** · eğitim koduna ↗) | ✓ | hakediş satırı + eğitim bağlantısı |
| 39 | Masraf sayımı + "Masrafları listele →" drawer (tür filtresi, önizleme) | ✓ | `TrainingExpenses` + `Finance.vue` drawer'ı; rows kısmi yüklemeyle gelir |
| 40 | Satırda tutar, **tür limiti**, karar + **gerekçesi** | ✓ | `TrainingExpenses` satırı — limit her zaman yazılır ("içinde" de bir bilgidir) |
| 41 | Hızlı önizleme — tek bileşen, üç yerde aynı davranış | ⚠ | `DocumentPreview` finans fişlerine **bağlandı**; dosya evrakında hâlâ bağlı değil — 67-c |
| 42 | Program ortak masrafları satırı | ✓ | `shared_expenses` |
| 43 | "Hakediş henüz doğmadı" hâli + sebebi (evrak eksik) | ✓ | `awaiting` + `Finance.vue` bekleyen satırı |
| 44 | Eğitime bağlı olmayan hareketler (ELLE) + not zorunlu | ✓ | `standalone` + `FileManualMovement` |
| 45 | Ödemeler listesi + **dağıtım özeti** + dekont "gör" | ✓ | `payments` + `allocations` |
| 46 | Ödeme modalı: tutar, tarih, **dağıtım (hakediş/masraf ayrı)**, dağıtılan sayacı, yöntem, dekont, not; dengesizse Kaydet pasif | ✓ | `Finance.vue` `allocationBalanced` |
| 47 | Masraf/ödeme kaydı modalı: tip, tutar, **bağlam (program/eğitim/bağımsız)**, not zorunlu, fiş, "onaya gider" cümlesi, **kendi kaydını kendin onaylayamazsın** | ✓ | `FileManualMovement` + `movement.scope` |
| 48 | Boş durumlar: "Henüz eğitim vermemiş" · "Bakiye sıfır" | ✓ | `isEmpty` |
| 49 | 375px finans | ✓ | kartlar + "Fişi gör" → aynı önizleme bileşeni (375px'te tam ekran açılır) |

---

## `65 Yonetici Egitmen Kayit` — tasarım eksiksiz; **kod da eksiksiz** (tek ⚠: bölge kısayolu)

| # | Tasarım öğesi | ✓/⚠/❌ | Kanıt |
|---|---|---|---|
| 50 | Üç bölüm: kimlik/hesap · mevzuat dosyası · verebileceği eğitimler | ✓ | `Create.vue` |
| 51 | Canlı gereklilik listesi (seçim değiştikçe büyür) | ✓ | `requirementsByDefinition` + `RequirementMap` |
| 52 | Her gereklilik: **şimdi yükle / görev: ben / görev: eğitmen**, hiçbiri seçilmezse görev size | ✓ | `Create.vue` |
| 53 | "Kaydettiğinizde ne olacak" özeti (yüklenen belge, açılacak görevler, bakanlık bildirimi son günü, davet) | ✓ | `Create.vue` özet kartı |
| 54 | Zorunlu alan ayrımı: kırmızı kaydı durdurur (bakanlık ID, kimlik) · amber sonuç doğurur | ✓ | form doğrulaması + uyarı metinleri |
| 55 | "Şimdi yükle" — belge türü **kendi alanlarını sorar** (diploma: okul/bölüm/yıl/no) | ✓ | `DocumentTypeFields` deseni |
| 56 | Özel nitelikli/kritik tür **eğitmene atanamaz** (seçenek pasif) | ✓ | tür ayarı `uploadable_by` |
| 57 | Yetkinlik tablosu: eğitim → gereklilik → karşılayan belge → durum → adaylık | ✓ | `Show.vue` `competence` |
| 58 | Belge dosyası + açık belge görevleri + bakanlık bildirimi satırı | ✓ | `Show.vue` |
| 59 | Bölge tercihi alanı | ✓ | `Show.vue` künye formunda; ⛔ bölge kısayolu **bilinçli kapsam dışı** (Sets, 02.08.2026: "gerek yok, ileride gerekiyorsa koyarız") |
| 60 | 375px: gereklilik paneli formun altına iner | ✓ | `Create.vue` ızgarası |

---

## Kapanmamış satırlar — karar gerekiyor (Onay Kuralı 6)

| Kod | Satır | Durum |
|---|---|---|
| **68-a** | #17 Dışa Aktar | ✓ **Karar verildi ve yazıldı** (Sets, 02.08.2026): CSV, erişim logu ile |
| **68-b** | #21 "Gerekçeyle Ata" | ✓ **Karar verildi ve yazıldı**: gerekçe zorunlu, atama kaydına yazılıyor |
| **68-c** | #18/#59 bölge kısayolu | ⛔ **Kapsam dışı** (Sets, 02.08.2026): "gerek yok, il filtresi zaten var; dataint tarafında coğrafi bölge veri setimiz var, gerektiğinde koyarız" |
| **67-a** | #35/#36 finans yıl süzgeci + arama | ✓ **Yazıldı** |
| **68-d** | #5, #14 belge süzgeci ve belge engeli satırı | ✓ **Kapandı** — 09.08.2026'da ölçüldü |
| **68-e** | #22 375px kart görünümü | ✓ **Kapandı** — 09.08.2026'da ölçüldü |
| **67-c** | #41 önizleme | ✓ **Kapandı** — 09.08.2026'da ölçüldü |
| **68-f** | #12 "kayıtlı ili" | ✓ **Kapandı** — 09.08.2026'da ölçüldü |

## Dört açık satır 09.08.2026'da kapandı — ve hiçbiri o gün yazılmadı

⚠ Sets bu dördünün yazılmasını istedi; koda bakınca **dördü de zaten yazılmıştı**. Matris 02.08 tarihliydi ve aradaki turlarda (03–08.08) kapanmışlardı — yani açık olan şey ekran değil, **bu belgeydi**. Yazmadan önce ölçmenin sebebi tam olarak bu: istenen dört iş, yapılmış dört işti.

| Kalem | Tasarım | Kanıt |
|---|---|---|
| **68-d** belge durumu süzgeci | `68:57` "Belge: tümü ▾" | `Instructors/Workload.vue:69` `DOCUMENT_STATES` · `:232-245` üçüncü süzgeç (`workload-document`) |
| **68-d** "başka sebep" belge satırı | `68:156` "CTU belgesi dolu…" | `Workload.vue:151-154` panelin kümesi belgeyi de sayıyor · `:482-491` satır belge durumunu ve tercih illerini birlikte yazıyor |
| **68-e** 375px kart | `68:236-248` | `Workload.vue:390-439` `#card` şablonu: avatar, ad, kategori · yük, **il rozetleri sayılarıyla**, yoğunlaşma satırı, son eğitim · yaklaşan · belge. Tasarımın "bölge üçlüsü ve son eğitim düşmez" cümlesi birebir karşılanıyor |
| **68-f** kayıtlı il | `68:245` "kayıtlı ili İstanbul" | `Instructor.php:38` `home_province_option_value_id` + `:130` ilişki · `Workload.vue:424-426` kartta `based_in` olarak yazılıyor |
| **67-c** dosya evrakında önizleme | `67:41` | `Instructors/Show.vue:16,698` `DocumentPreview` bağlı (finans tarafı `Finance.vue:1014`) |

## Kararsız kalan yok — yazılacaklar

Bunlar için soruya gerek yok, tasarım net: **68 ekranının tamamı**, **67'nin Eğitimler sekmesi** (+ dönem özeti, bölge dağılımı, "neden az eğitim" panelleri), **dört sekmeli gezinme**, **masraf listesi drawer'ı**, **masraf satırında limit/karar notu**.
