# Kapsama matrisi — satışçının imzalı nüsha ekranı (EGT-81)

*09.08.2026 · Kaynak: `docs/design/sozlesmeler-brief.md` §3 A5 ve A5-b · Uygulama: `Office/Customers/Show.vue`, `Actions/Office/RecordSignedFrameworkAgreement`*

⛔ **Tasarım dosyası yok ve beklenmedi** *(Sets, 09.08.2026: "katalogda zaten her şeyimiz var dosya yüklemeyle alakalı… tasarımcıya gerek var mı sence?")*. Kararın gerekçesi ölçüldü: aynı ekranın ikizi tedarikçi tarafında zaten yazılı — anlaşma kartı, durum rozeti, imzalı nüsha satırı, "kopya kritiktir" notu (`Office/Suppliers/Show.vue`, `UploadSupplierDocument`) — ve katalogda eksik atom yok (`FileDrop`, `ConfirmModal` `wide`, `StatusBadge`, `DatePicker`, `FormField`).

Bu matris **brief'e** karşı üretildi, tasarım dosyasına değil; ölçüt brief §3'ün kendi cümleleridir.

---

## 1 · A5-b — brief'in dört istediği

| # | Brief'in cümlesi | Durum | Kanıt |
|---|---|---|---|
| 1 | "sözleşme durumu rozeti" | ✓ | `Show.vue` `StatusBadge` — `active` / `awaiting_signature`. ⚠ Rozet tonu **amber**, kırmızı değil: bir şey bozulmuş değil, kâğıt satışçının çantasında ve firmaya teklif vermek engellenmiyor |
| 2 | "İmzalı Nüshayı Yükle" | ✓ | `Show.vue` `customers.framework.file_copy` düğmesi → `ConfirmModal wide` + `FileDrop` |
| 3 | "kim/ne zaman yükledi izi" | ✓ | `customer_agreements.recorded_by` (ofis kullanıcısı) + `accepted_at`. ⛔ **İki ayrı kişi** ve kart ikisini de yazıyor: `signatory_name` kâğıdı imzalayan, `recorded_by` dosyalayan |
| 4 | "yanlış firmaya yüklemeyi zorlaştıran firma adı teyidi" | ✓ | `RecordSignedFrameworkAgreement` — ad **yazılır**, `TurkishFold::matches` ile karşılaştırılır. Onay kutusu değil: kutu, insanların işaretlediği şeydir |

## 2 · A5 — üç yükleyici yolu (brief `§3` tablosu)

| # | Yol | Durum | Kanıt |
|---|---|---|---|
| 5 | Müşteri portalda **elektronik kabul** | ✓ | `AcceptFrameworkAgreement`, teklif onayının içinde (EGT-80) |
| 5b | Müşteri **indirir · imzalar · yükler** | ✓ | ✅ **EGT-82** — `/sozlesmeler/cerceve/yazdir` + `/nusha`, `FileFrameworkAgreementCopy` (`customer.approve_quote`, MFA kapılı) |
| 6 | **Satışçı** ziyaretten imzalı nüshayla döner | ✓ | Bu ticket — `/musteriler/{customer}/cerceve-sozlesme` |
| 7 | **Operasyon** yükler | ✓ | Aynı yol; kapı `customer.update` **politikası** — operasyon direktörü süper kullanıcıdır ve müşteriye atanma kuralını da taşır |
| 8 | "Üç yol da aynı kaydı doldurur; ekran **hangisiyle geldiğini** yazar" | ✓ | `customer_agreements.method` (`portal` / `wet_signature`) + veritabanı CHECK'i. Portal yolu kişiyi, kâğıt yolu imzalayanı adlandırmak **zorunda** — iki CHECK ile |
| 9 | "Sözleşme beklemede diye portalda hiçbir şey kapanmaz" | ✓ | Kapı yok; bekleme yalnız teklif onayı anında (`ApproveQuote`) |

## 3 · Nüshanın kendisi

| # | Öğe | Durum | Kanıt |
|---|---|---|---|
| 9b | "Evrak backoffice'ten üretilir: antetli, sürümlü, teklif antet motorunun aynısı" | ✓ | ✅ **EGT-82** — `FrameworkContractPrintout`, `organisms/ContractDocument.vue`. Antet `DocumentTemplate::QUOTE_LETTERHEAD` (satır 3E'nin antedidir, adı ilk kullanan belgeden gelir); yoksa şirket ayarlarından düz başlık |
| 9c | Satışçının ziyarete götüreceği kâğıt | ✓ | `/musteriler/{customer}/cerceve-sozlesme/yazdir` — imza yerleri, sürüm ve yürürlük tarihi üzerinde |
| 10 | Şifreli saklama | ✓ | `SecureFileStore::storeBytes` — tenant anahtarıyla, özet **düz metin** üzerinden |
| 11 | Nüsha müşterinin silebileceği listeye düşmez | ✓ | `customer_agreements`'a asılı, `customer_documents` satırı **değil** — imzalı teklif nüshasının izlediği aynı gerekçe |
| 12 | Okuma bizden geçer, log'lanır | ✓ | `CustomerController::frameworkCopy` — `AccessLogger::record(..., 'framework_agreement.read')`, `Cache-Control: private, no-store` |
| 13 | Portalda "hangi yöntemle" görünür | ✓ | `CustomerContracts::companyCard` → A5 kartı; **EGT-80 matrisinin #31 ve #32'si burada kapandı** |

## 4 · Reddedilen hâller

| # | Kural | Kanıt |
|---|---|---|
| 14 | Yanlış firma adı → kayıt yok | `SignedFrameworkAgreementTest`: "refuses when the typed company name is another company" |
| 15 | Büyük/küçük harf ve boşluk farkı reddedilmez | `TurkishFold` — "CEVA LOJİSTİK" ile "Ceva Lojistik" bir firmadır |
| 16 | Gelecek tarihli imza reddedilir | Form kuralı **ve** action; ikisi birden, çünkü form kuralı tek başına dursaydı konsoldan çağıran onu atlardı |
| 17 | Bağlı firmaya ikinci nüsha yüklenmez | Bir firmanın "ne zaman imzaladı" sorusuna iki cevabı olmaz |
| 18 | Yayımlanmış metin yoksa dosyalanmaz | İmzası olmayan bir yükümlülük listesi |

---

## Sonuç

21 öğenin **21'i karşılanıyor**. Sapma yok.

⚠ **09.08.2026 akşamı eklendi (EGT-82):** antetli/sürümlü çıktı ve müşterinin kendi yükleme yolu. İkisi tek işti — çıktı olmadan yükleme anlamsız, yükleme olmadan çıktı bir çıkmaz sokak.

⚠ **Hâlâ verilmemiş tek karar:** müşterinin **imzalanmış nüshayı geri indirmesi**. Portal kartı nüshanın 3E'de saklı olduğunu yazıyor; sözleşme metninin kendisi yazdırılabiliyor ama imzalı taramayı firmanın her personeline açan bir bağlantı yok — kim indirebilir, loglanır mı, filigranlanır mı soruları cevaplanmadı.
