# Review — Fatura belgesi implementasyon planı (v1.1) — Re-review — 2026-10-20

> **Review type:** plan-re-review
> **Previous review:** `docs/reviews/review-fatura-belgesi-plan-2026-10-20.md` (v1.0, ❌ REJECTED, 4 bulgu: F-R1…F-R4)
> **Upstream document(s) read:** `design/39 Fatura Belgesi.dc.html` (tamamı), `docs/design/fatura-belgesi-brief.md`, `proje-haritasi.md` §4.4 «Şubeler» → «Fatura belgesi (tasarım 39) için kararlar» (satır 910, (3b) eklenmiş hâli), `docs/plans/sube-plan.md` (A5 / Rollback kalibrasyonu)
> **Other cross-referenced documents:** `CLAUDE.md`, `app/Domain/Sales/QuoteTotals.php`, `app/Actions/Sales/IssueInvoice.php`, `app/Policies/InvoicePolicy.php`, `routes/panel.php` (`/teklifler/{quote}/yazdir` model-binding kalıbı), `routes/office.php`, `app/Support/Invoicing/IssuingCompanies.php`, `resources/js/pages/Office/Quotes/Printout.vue`
> **Stage locks in effect:** Sets kararları (20.10.2026, (3b) dahil) kilitli — spec yok (Sets kararı); EGT-219 (sube-plan A5) canlıda ve kilitli

---

## Upstream Coverage Matrix (sıfırdan üretildi)

### Sets kararları (proje-haritasi.md:910, (3b) dahil)

| Upstream madde | Durum | Kanıt |
|---|---|---|
| (1) Fatura bilgileri lokasyondan değil, müşteri formunda «Fatura bilgileri» bölümü | ✓ | plan F-1/F-2 (satır 30–31), değişmedi |
| (2) Kalemin ikinci satırı, kesimde kopyalanır | ✓ | plan F-9 (satır 38), değişmedi |
| (3) KDV tanım/paket başına, boşsa genel; teklif kalemi dondurur; faturaya kalem bazında; oran başına KDV satırı | ✓ | plan F-4…F-8 |
| (3b) Çok oranlı teklifte 37 ve portal teklifi de oran başına KDV satırı; tek oranlıda bugünkü tek satır | ✓ | plan F-7 (satır 36), gerekçe artık proje-haritasi.md:910'daki Sets kararına atıfla yazılmış; karar metninde de (3b) olarak kayıtlı — **F-R4 kapandı** |
| (4) İndirim toplamlarda tek satır, teklif çıktısındaki (37) gibi | ✓ | plan F-10, değişmedi |
| (5) Yasal ibare şirket kaydından, boş olabilir | ✓ | değişmedi |
| Şahıs T.C. kimlik no belgede açık | ✓ | plan F-12, değişmedi |

### Brief + tasarım 39 öğeleri

| Öğe | Durum | Kanıt |
|---|---|---|
| B1 antet + kesen şirket künyesi | ✓ | değişmedi |
| B1 varyantı — antet yüklenmemişken sade başlık | ✓ | **F-16 eklendi** (satır 44): görsel alanı çizilmez, logo uydurulmaz, unvan solda kalın + künye sağda, alt çizgi aynı; test eklendi (satır 80: «antet yüklenmemiş şirketin belgesi sade başlıkla») — **F-R2 kapandı** |
| B2 no kutusu + varyantları (yerine kesildi, numarasız) | ✓ | değişmedi |
| B3 firma/şahıs alıcı bloğu | ✓ | değişmedi |
| B4 kalem tablosu + çok sayfa | ✓ | değişmedi |
| B5 oran başına KDV satırı | ✓ | değişmedi |
| B6/B7 not, ödeme, ayak | ✓ | değişmedi |
| Hâl 2 iptal | ✓ | değişmedi |
| Ekranda açılış: portal rotası | ✓ | **F-11 revize edildi** (satır 40): `GET /faturalar/{invoice}/belge`, portalın mevcut model-binding kalıbıyla aynı (`routes/panel.php:395` `/teklifler/{quote}/yazdir`); yetki `InvoicePolicy::view`'in müşteri dalına atıfla — koddan doğrulandı: `InvoicePolicy.php:43-49` gerçekten tenant_id eşleşmesi + `customer.view_invoices` + taslak hariç tutma yapıyor, plandaki tarif birebir tutuyor — **F-R1 kapandı** |
| 375px yatay kaydırma; siyah-beyaz okunurluk | ✓ | değişmedi |

### Özellikle bakılması istenenler (v1.0'da zaten ✓ olanlar, değişmedi)

| Konu | Durum | Kanıt |
|---|---|---|
| `QuoteTotals` geriye dönük uyum | ✓ | değişmedi, F-6 |
| Teklif indiriminin oran gruplarına dağıtımı | ✓ | değişmedi, F-6 |
| Dokuz çağıranın eksiksizliği | ✓ | değişmedi |
| Alıcı kopyasının şifreli saklanması (F-3) | ✓ | değişmedi |
| Belgede erişim logu (F-12) | ✓ | değişmedi |
| Çok sayfa teknik riski (F-14) | ✓ | değişmedi |
| Rollback planı | ✓ | **eklendi** (satır 88-89): `git revert` + additive migration `down()`; veri yazıldıktan sonra (`recipient_snapshot`, `invoice_items.detail`, `quote_items.vat_rate`) şemanın geri alınamayacağı açıkça gerekçelendirilmiş — **F-R3 kapandı** |

---

## ✅ What works

- **Dört bulgunun dördü de isim bazında ve doğru yerde çözülmüş**, kaçırılmış bir madde yok: F-R1 (portal rotası artık mevcut model-binding kalıbıyla ve var olan `InvoicePolicy::view`'e atıfla — kontrol ettim, policy metodu plandaki tarifi birebir karşılıyor), F-R2 (F-16 + test satırı), F-R3 (Rollback bölümü, additive migration'ların veri-yazıldıktan-sonra geri alınamazlığı dürüstçe işaretlenmiş), F-R4 (Sets'in kendisi karar vermiş ve proje-haritasi.md'ye (3b) olarak işlenmiş — gerekçe artık varsayım değil, kayıtlı karar).
- **Goal drift yok:** düzeltmeler planın hedefini (fatura belgesi + üç veri eksiğinin kapatılması) genişletmiyor, yalnız tasarım 39'un ıskalanmış bir varyantını ve eksik bir rota/rollback detayını tamamlıyor.
- F-11'in revize gerekçesi iddia değil, doğrulanmış kod: `InvoicePolicy.php:43-49` plandaki üç şartı (tenant eşleşmesi, izin, taslak hariç) aynen uyguluyor — bu, plan review'ın "kanıt dosya+satır" ölçütünü karşılıyor.

## ⚠️ Findings & Risks (in-scope for this review type)

Yok. Matriste ❌/⚠ satır kalmadı.

## ❓ Open Questions (to be answered before next stage)

Önceki review'daki açık sorulardan ikisi hâlâ açık, ama bunlar v1.0'ın REJECTED verdict'ine giren bulgular (F-R1…F-R4) değildi — yalnız kod aşamasına taşınabilecek küçük kararlardı:

1. Serbest fatura kaleminin KDV'si kesim anındaki genel oran (F-8) — admin-tanımlı ayardan geldiği için AD-08 ihlali değil; bilinçli bir plan kararı olarak kalabilir.
2. Fatura bilgisi hiç girilmemiş şahıs müşteride (TCKN boş) belgenin yalnız adla basılması — yasal belge için kasıtlı bir eksiklik olduğu teyitli değil.

Bu ikisi plan'ın onayını bloke eden madde değil; developer koda geçerken netleştirebilir ya da Sets'e sorabilir.

## Previous Findings Status

| Önceki bulgu | Durum |
|---|---|
| F-R1 — portal `{token}` rotası tanımsız | ✅ Resolved |
| F-R2 — antetsiz B1 varyantı eksik | ✅ Resolved |
| F-R3 — Rollback bölümü yok | ✅ Resolved |
| F-R4 — F-7'nin 37/portal teklife genişletilmesi onaysızdı | ✅ Resolved |

## Verdict: ✅ APPROVED

Matrix'te ❌/⚠ satır yok; dört önceki bulgunun hepsi isim bazında, kod kanıtıyla ve (F-R4'te) kayıtlı Sets kararıyla kapatılmış. Finansal çekirdek (QuoteTotals, indirim dağıtımı, dokuz çağıran, alıcı kopyası, erişim logu, çok sayfa riski) v1.0'da zaten sağlamdı ve değişmedi. Developer koda geçebilir.
