# Kapsama matrisi — tedarikçi ekranları

*09.08.2026 · Tasarım: `design/25 Planlamaci Tedarikciler.dc.html` (390 satır) · Uygulama: `Office/Suppliers/{Index,Show}.vue`*

Tasarım dosyası **implementasyondan sonra açıldı** ve baştan sona okundu (Tasarım Uygulama Protokolü §3); matris bellekten değil dosyadan üretildi. İşaret **kodun** durumunu söyler: ✓ var · ⚠ kısmen · ❌ yok.

⚠ **Bu matris neden şimdi yazıldı:** EGT-71'in dört ekranından üçünün kapsama matrisi vardı (40, 63, 65/67/68), tedarikçininki hiç çıkarılmamıştı. Ekran 08.08 tarihli ofis turunda **işlevsel** olarak gezilmişti (A11 — fiyat kaydı hiç çalışmıyordu, `B-5` olarak düzeltildi), ama tasarıma karşı öğe öğe hiç ölçülmemişti.

## 1 · Liste — `25:31-114`

| # | Tasarım öğesi | Durum | Kanıt |
|---|---|---|---|
| 1 | Adres `/tedarikciler` | ✓ | `Index.vue:333` detay bağlantısı aynı kökten |
| 2 | Kırıntı `Kokpit / Tedarikçiler` | ✓ | `Index.vue` `PageHeader` `:trail` |
| 3 | Başlık + kayıt sayısı | ✓ | `PageHeader` başlığı, sayı `suppliers.length` |
| 4 | Arama — "Ad veya iletişim kişisi…" | ✓ | `Index.vue:244` `:search-placeholder` |
| 5 | Arama Türkçe harf duyarsız (`25:108`) | ✓ | katlama `lib/search.js` üzerinden (kırmızı çizgi 17) |
| 6 | `＋ Tedarikçi` düğmesi | ✓ | `Index.vue:235`, `can.create` ile |
| 7 | Tür sekmeleri, **sayılarıyla** | ✓ | `Index.vue:112-126` — sekmeler **veriden** üretiliyor, sayı `filter().length` |
| 8 | "türler yönetilen listeden gelir — sekme sayısı sabit değil" | ✓ | `Index.vue:112` yorumu bu kararı taşıyor; liste backoffice'ten |
| 9 | İl süzgeci | ✓ | `Index.vue:33` `provinces` prop'u + süzgeç |
| 10 | Durum süzgeci (Aktif ▾) | ✓ | `agreement.state` / aktiflik eşlemesi `:304` |
| 11 | Kolon **TEDARİKÇİ** (ad + iletişim satırı) | ✓ | `Index.vue:93`, `#cell-name` `:254` |
| 12 | Kolon **TÜR** | ✓ | `Index.vue:94` |
| 13 | Kolon **İL / İLÇE** (iki satır) | ✓ | `Index.vue:98`, `#cell-city` `:274-281` ilçe ikinci satırda |
| 14 | Kolon **SON TEKLİF** — tutar + birim + trend + tarih | ✓ | `Index.vue:100`, `#cell-last_quote` `:283-300` |
| 15 | Kolon **TEKLİF** (adet) | ✓ | `Index.vue:101` |
| 16 | Kolon **İNDİRİM** | ✓ | `Index.vue:105`, `#cell-discount` `:315` |
| 17 | Kolon **ANLAŞMA** — rozet + bitiş tarihi | ✓ | `Index.vue:107`, `#cell-agreement` `:302-313` |
| 18 | Satır eylemleri: Detay · Düzenle | ✓ | `Index.vue:330-343`; düzenleme `?duzenle=1` ile detaya gidiyor |
| 19 | Pasif kayıt satırı — soluk + "Aktifleştir" | ✓ | `Show.vue:387-399` pasifleştir/yeniden aç; listede `status="closed"` `:259` |
| 20 | ⛔ **Trend oku nötr** — "artış kötü haber değil, yalnız yön" | ✓ | `Index.vue:145-152` `trendOf`; ok `text-ink-800` ile çiziliyor, semantik renk **yok** |
| 21 | Sayfalama | ✓ | `DataTable`'ın kendi sayfalaması |

## 2 · Boş durum — `25:119-128`

| # | Tasarım öğesi | Durum | Kanıt |
|---|---|---|---|
| 22 | Başlık "Henüz tedarikçi kaydı yok" | ✓ | `Index.vue:245` `:empty-heading` |
| 23 | Açıklama — "bu bölgede kiminle çalışıyoruz, ne kadar tutuyordu" | ✓ | `Index.vue:246` `:empty-description` |
| 24 | Türe özel boş metin ("Otel türünde kayıt yok") | ⛔ | **Ulaşılamaz** — aşağıdaki nota bakın |

## 3 · Ekleme drawer'ı — `25:131-174`

| # | Tasarım öğesi | Durum | Kanıt |
|---|---|---|---|
| 25 | Drawer (sayfa değil) | ✓ | `Index.vue:235` `creating`, drawer bileşeni |
| 26 | Başlık + "künye zorunlu · ilk fiyat teklifi opsiyonel" | ✓ | `suppliers.quote.first_quote` ve drawer başlığı |
| 27 | Ad * / Tür * | ✓ | `Index.vue:400-420` |
| 28 | İl * / İlçe * — **ilçe ile bağlı** | ✓ | `Index.vue:435-437` `v-model:province` + `:provinces`; `:182-183` ilçe ile seçilmeden boş |
| 29 | İletişim kişisi | ✓ | `Index.vue:445` |
| 30 | İndirim oranı (%) | ✓ | `Index.vue:460` |
| 31 | Sabit telefon — **alan kodu ayrı** | ✓ | `PhoneInput` `kind="landline"` (kırmızı çizgi 17) |
| 32 | Cep telefonu | ✓ | `PhoneInput` |
| 33 | E-posta | ✓ | `EmailInput` (ham `TextInput` değil) |
| 34 | Web sitesi | ✓ | `Index.vue:504` |
| 35 | Notlar (tam genişlik) | ✓ | `Index.vue:516` |
| 36 | **"İlk fiyat teklifini şimdi gir"** işaret kutusu | ✓ | `Index.vue:66` `withQuote`, `:525-526` `Checkbox` |
| 37 | İşaretlenmezse fiyatsız kaydedilir | ✓ | `Index.vue:197` — `quote` yalnız işaretliyken gönderiliyor |
| 38 | Teklif bloğu: Tutar * · Birim * · Miktar · Tarih * · Not | ✓ | `Index.vue:538-585` |
| 39 | "Kaydet ve Detaya Git" | ✓ | kayıt sonrası detaya yönlendirme |
| 40 | Vazgeç | ✓ | drawer kapanışı, `:217` `withQuote` sıfırlanıyor |

## 4 · Detay — `25:179-330`

| # | Tasarım öğesi | Durum | Kanıt |
|---|---|---|---|
| 41 | **Sekme yok** — künye şeridi + iki kolon | ✓ | `Show.vue:34-39` kararın kendisi yorumda; tek sayfa |
| 42 | Künye: baş harf karesi, ad, Aktif rozeti, tür rozeti | ✓ | `Show.vue` başlık bloğu |
| 43 | Künye satırı: il/ilçe · kişi · iki telefon · e-posta · site · indirim | ✓ | `Show.vue` künye şeridi |
| 44 | `Pasifleştir` · `Künyeyi Düzenle` · `＋ Fiyat Teklifi` | ✓ | `Show.vue:367` `edit_identity`, `:387-399` pasifleştir/yeniden aç |
| 45 | **NOTLAR** şeridi + Düzenle | ✓ | notlar kartı ve düzenleme |
| 46 | Fiyat tarihçesi başlığı + teklif sayısı | ✓ | `Show.vue` tarihçe başlığı |
| 47 | **Birim anahtarı** (Gecelik / Tümü) | ✓ | `Show.vue:125-127` — grafik **tek birim** okur, gerekçesi yazılı |
| 48 | Sütun grafiği | ✓ | `Show.vue:21` `PriceTrendChart`, `:176` `chartPoints` |
| 49 | **BÖLGE ORTALAMASI** kartı | ✓ | `Show.vue:461-474` — tutar, birim, "İskenderun · otel · son N ay · N tedarikçi" |
| 50 | "yeni maliyet kaleminde tahmin olarak önerilir" | ✓ | aynı kartın alt satırı |
| 51 | Tarihçe tablosu: Tarih · Tutar · Birim · Miktar · Not · Düzelt | ✓ | `Show.vue` tarihçe tablosu |
| 52 | ⛔ **Düzeltme kaydı — eski değer üstü çizili kalır** | ✓ | `Show.vue:494-496` — "corrected value stays readable, struck" |
| 53 | "Silme yok: yanlış fiyat düzeltme kaydıyla yönetilir" (AD-11) | ✓ | `Show.vue:38` — ekranda hiçbir şey silmiyor |
| 54 | Anlaşma kartı + `＋ Anlaşma` | ✓ | `Show.vue:594-608` |
| 55 | Anlaşma rozeti + kalan gün + tarih aralığı | ✓ | `Show.vue:594-602` `days_left`, `open_ended` |
| 56 | İmzalı nüsha + "kopya kritiktir" notu | ✓ | `Show.vue:618-622` |
| 57 | Geçmiş anlaşmalar | ✓ | `Show.vue:628-633` |

## 5 · 375px — `25:333-390`

| # | Tasarım öğesi | Durum | Kanıt |
|---|---|---|---|
| 58 | Liste karta iner | ✓ | `Index.vue:346` `#card` şablonu |
| 59 | Kartta ad + anlaşma rozeti | ✓ | `Index.vue:349-354` |
| 60 | Tür · il / ilçe | ✓ | `Index.vue:357-360` |
| 61 | Son teklif: tutar / birim + trend | ✓ | `Index.vue:363-367` |
| 62 | Teklif sayısı ve indirim | ✓ | `Index.vue:370-374` |

## Tek sapma — ve yazılmaması bilinçli

**25-a · #24, türe özel boş metin.** Tasarım şunu diyor (`25:127`): *"Bir türde kayıt yoksa **sekme yerine**: 'Otel türünde kayıt yok — bu türe ilk kaydı ekleyin'"*.

Kod aynı soruya bir adım önce cevap veriyor: `Index.vue:126-129` **sayısı sıfır olan türü sekme olarak hiç çizmiyor** ve gerekçesi yanında yazılı — *"a tab with nothing behind it teaches somebody the list is broken"*. Yani tasarımın "sekme yerine" dediği yerde bizde sekmenin kendisi yok.

⛔ Sonuç: o cümlenin **görünebileceği bir an yok**. Yazmak, hiçbir kullanıcının ulaşamayacağı bir metin eklemek olurdu — ekranda ölü bir dal. Bu yüzden yazılmadı.

⚠ Kaybedilen tek şey şu dürtü: *"bu türde hiç kaydımız yok, ilkini sen ekle."* Bugün genel boş metin (`suppliers.empty_hint` — "Otel, acente veya araç firması ekleyin") aynı işi tür adı olmadan yapıyor. İstenirse çözüm sekmeyi geri getirmek değil, **ekleme drawer'ının tür listesinde** "henüz kayıt yok" işareti olur — orası kararın gerçekten verildiği yer. *Sets'e soruldu, cevap bekliyor.*

**Sonuç:** 62 öğenin 61'i karşılanıyor; 62'ncisi tasarımın kendi kararıyla çelişmeyen, gerekçesi yazılı bir sapma.
