# Tasarım 39 — Fatura Belgesi · kapsama matrisi

*20.10.2026 · EGT-222 · commit `d3b82827` · tasarım dosyası `design/39 Fatura Belgesi.dc.html` bu turda baştan sona açılıp okundu; satır numaraları ondan.*

Uygulama: `resources/js/organisms/InvoiceDocument.vue` (ortak belge), `resources/css/invoice.css`, sayfalar `pages/Office/Invoices/Document.vue` ve `pages/Portal/InvoiceDocument.vue`, sorgu `app/Queries/Office/InvoiceDocument.php`.

| Tasarım öğesi (satır) | Durum | Kanıt |
|---|---|---|
| Rozet: yalnız kesildi / iptal yazdırılır, taslak yazdırılmaz (28) | ✓ | `InvoiceDocument::printable`; iki controller 404; test «answers 404 … for a draft» |
| Rozet: siyah-beyazda okunur, bilgi renkte değil (29) | ✓ | `invoice.css` iptal kutusu çerçeve + kelime; `print.css` mürekkep kuralı |
| Rozet: mobilde ayrı görünüm yok, belge yatay kayar (30) | ✓ | `.invoice-stage { overflow-x: auto }`, sayfa 794px; `invoice-document.spec.js` 375'te ölçüyor |
| A4 sayfa 794×1123, iç boşluk 44/52/36 (38) | ✓ | `invoice.css` `.invoice` |
| B1 antet alanı 150×56 solda, künye sağda (40-46) | ✓ | `InvoiceDocument.vue:162-168`, `.invoice-letterhead` |
| B1 künye: unvan kalın 10.5px, V.D. · VKN, adres, telefon (42-45) | ✓ | `issuerLines`, `.invoice-issuer-name` |
| B1 alt çizgi 2px (40) | ✓ | `.invoice-head` |
| B1 antet yüklenmemişken: unvan sola kalın, künye sağa, logo uydurulmaz (221-228) | ✓ | `InvoiceDocument.vue:170-174`, `.invoice-head--plain`; test `issuer.has_letterhead` false |
| B2 «FATURA» başlığı 22px (50) | ✓ | `.invoice-title` |
| B3 «SAYIN» + alıcı adı + V.D. · VKN + adres + «posta kodu ilçe / il» (51-53) | ✓ | `recipientLines`; test alıcı kopyası |
| B2 numara kutusu: Fatura no (mono, kalın), Fatura tarihi, Son ödeme, Referans kodu gri zeminli + «telefonda söylenecek kod» (55-62) | ✓ | `InvoiceDocument.vue:192-215` |
| B2 numarasız eski kayıt: «numarasız (eski kayıt)» italik gri (194-203) | ✓ | `.invoice-unnumbered`; test «says an earlier invoice has no number» |
| B2 başka faturanın yerine: «… numaralı faturanın yerine düzenlenmiştir», numara mono kalın, sol çizgili kutu (188-191) | ✓ | `.invoice-replaces`, `replaces` computed; test `replaces` |
| B3 şahıs alıcı: T.C. Kimlik No açık, vergi satırı yerine (209-215) | ✓ | `recipientLines` natural_person dalı; erişim logu testi |
| B4 kalem tablosu 6 sütun: # · AÇIKLAMA · MİKTAR · BİRİM FİYAT · KDV · TUTAR, genişlikler 30/–/56/84/48/92 (65-73) | ✓ | `InvoiceDocument.vue:220-238` colgroup `w-7.5/w-14/w-21/w-12/w-23` |
| B4 kalem ikinci satırı gri (75-77) | ✓ | `.invoice-detail`; `IssueInvoice::detailOf`; test «gives a line its second line» |
| B4 KDV sütunu «%20» (75) | ✓ | `rate()` |
| B4 çok sayfa: thead tekrar, satır bölünmez (241) | ✓ | `print.css` `thead { table-header-group }`, `.invoice-items tr { break-inside: avoid }` |
| B4 çok sayfa: sonraki sayfalarda ince devam başlığı «FATURA · no · devam · Sayfa 2 / 2», antet tekrar etmez (234, 241) | ✓ | `@page invoice` `@top-left/@top-right`, `:first`'te yok (`InvoiceDocument.vue:126-136`). Heyet 826 F-R4(a) sonrası doğrulandı: yanıtı Playwright'ta 40 kaleme çoğaltılmış fatura PDF'e basıldı, metinde 1. sayfada devam başlığı yok, 2. sayfada «FATURA FT-2026-NS5D … devam · Sayfa 2 / 2», `AÇIKLAMA` başlığı 2. sayfada tekrar, ayakta «Sayfa 1 / 2» ve «Sayfa 2 / 2». |
| B4 «toplamlar, not, banka bloğu yalnız son sayfada» (239) | ✓ | akışta tablodan sonra geliyor |
| B5 toplam kutusu 290px: Ara toplam (KDV hariç), KDV %oran (matrah …), GENEL TOPLAM kalın çerçeveli (81-90) | ✓ | `InvoiceDocument.vue:243-286`; matrah yalnız birden çok oranda (Hâl 1 iki oranla matrah gösteriyor; Hâl 2'de yok — tek oranlı faturada matrah = ara toplam olduğu için gösterilmiyor) |
| B5 indirim: «Liste tutarı · İndirim −₺ · Ara toplam» (plan F-10, Sets kararı 4) | ✓ | `discounted`; test «prints the discount the way the quote printout does» |
| B6 NOT bloğu (92-96) | ✓ | `.invoice-note`; not yoksa çizilmez |
| B6 ÖDEME BİLGİLERİ: banka adı kalın · şube, IBAN mono sağda (97-104) | ✓ | `.invoice-bank`, `iban()` dörtlü gruplar |
| B6 «Alıcı: faturayı kesen şirket · üçüncü hesap için yer ayrılmıştır» (105) | ✓ (Sets) | Tasarımcı notu, basılmaz — Sets 20.10.2026 (heyet 826 F-R4 b), `proje-haritasi.md` |
| B7 yasal ibare, boşsa satır yok (110) | ✓ | `InvoiceDocument.vue:320` |
| B7 ayak: unvan · V.D. VKN solda, «no · Sayfa n / m» sağda, her sayfada (111) | ✓ | Ekranda `.invoice-foot-line`; baskıda `@bottom-left/right` kenar kutuları (PDF metninde görüldü) |
| B7 ayak sayfanın dibinde (`margin-top:auto`) (109) | ✓ (Sets) | Ekranda dipte; baskıda yasal ibare içerikten sonra tek sefer akar, sayfa ayağı ve numarası kenar kutusunda her sayfanın dibinde — Sets 20.10.2026 (F-R4 c): «şimdiki gibi kalsın» |
| Hâl 2 iptal kutusu: çerçeveli, taramalı, «İPTAL EDİLDİ» + tarih · gerekçe + yerine kesilen (120-123) | ✓ | `.invoice-cancelled`; test «prints a cancelled invoice…» |
| Hâl 2 «İPTAL» damgası: çift çizgi, %50 saydam, −14°, rakamlarla kesişmez (124, 177) | ✓ | `.invoice-stamp` akışta, toplamlardan sonra — hiçbir hücreyle kesişemez |
| Hâl 2 «yer yoksa yalnız üst kutu kalır» (177) | ✓ | Sets 20.10.2026 (F-R4 d) «tasarımdaki gibi». `InvoiceDocument.vue` `measureStamp` son sayfadaki boşluğu ölçer, yetmezse `data-room="none"` → `invoice.css` baskıda gizler. PDF'te denendi (iptal fatura, kalem sayısı çoğaltılarak): 1–11 kalem damga basılı ve tek sayfa; 12–21 kalem damga yok, sayfa sayısı artmıyor; 22 kalem toplamlar 2. sayfada, damga altında. |
| Hâl 2 ayakta «İPTAL» tekrarı (174) | ✓ | `footNumber` |
| Hâl 2'de not/banka/ibare yok (173-175) — plan F-13: iptal belgesi tam içerikle basılır | ✓ (plan) | Plan F-13 bilinçli olarak tam içerik diyor |
| Ekranda açılış: «Yazdır / PDF» koyu düğme, yeni sekme + yazdırma penceresi (245-250, 256) | ✓ | Ofis `Invoices/Show.vue:231`; portal `Invoices.vue:228-234` ve kart; sayfalar `onMounted(window.print)` |
| Ekranda açılış: taslakta pasif düğme + «Taslak fatura yazdırılmaz — önce kesilmesi gerekir.» (251-255) | ✓ | `Invoices/Show.vue:226-232` |
| Ofis/portal ayrımı yok, aynı belge (24, 256) | ✓ | tek organizma iki ince sayfa |
