# Durum analizi — 21.10.2026

*Kapsam: 20–21.10.2026'da yapılan işler (EGT-216…226) ve sistemin geneli. Beş okuma ajanı (oturum kaydı, yetki, görünürlük/bağlantı, bugünkü kod incelemesi, dokümanlar/açık işler) + benim doğrulamam. Kod değiştirilmedi.*

**Kanıt etiketleri:** **[doğrulandı]** = bu analizde kodu okuyarak ya da koşarak kendim kontrol ettim · **[kod]** = ajan kod yolunu uçtan uca okudu, ben tekrar etmedim · **[olası]** = ajan izi tam sürmedi.

---

## 1 · Kullanıcının işi yapılamıyor (kırık)

| # | Bulgu | Etki | Kanıt |
|---|---|---|---|
| 1.1 | **Satışçı kendi görüşmesini kapatamıyor** — 404 | Gündemdeki görüşme hiç kapanmaz | **[doğrulandı]** geçici HTTP testi: sahibi `POST /satis/gorusmeler/{id}/kapat` → **404**, `completed_at` NULL. Sebep: `SalesAgendaController.php:88` `NotFoundOnDenied::found` → `Gate::denies('view', SalesMeeting)`; `SalesMeeting` için policy yok. Test bu yolu yalnız «başkasınınki 404» olarak deniyor (`SalesAgendaTest.php:245`) |
| 1.2 | **Fırsat aşaması ilerletilemiyor** — aynı sebep | Müşteri kartında fırsat taşınamaz | **[kod]** `CustomerController.php:600` aynı kalıp, `Opportunity` için policy yok |
| 1.3 | **İş ayarlarında iki alan kaydedilmiyor**: planlama SLA günü, varsayılan günlük ders saati | Yönetici «kaydedildi» görür, değer değişmez; planlama kuyruğu ve oturum planı eski değeri kullanır | **[doğrulandı]** `BusinessSettings.php:271,311` alanları çiziyor; kaydetme listesinde (`:569-612`) ve `UpdateBusinessSettings::KEYS`'te yoklar |
| 1.4 | **Belge düzeltmede yalnız ad değişince kimlik no belgeden siliniyor** (EGT-225) | Düzeltilen belge T.C. kimlik no'suz basılır; eski belge «düzeltildi» olarak kapanır | **[doğrulandı]** `TrainingCertificates.vue:62` kutuyu boş açıyor, `:67` `null` gönderiyor, `CorrectCertificate.php:70-76` null'u «boşalt» okuyor. Harita `:2233` «boş kutu = dokunma» diyor. Canlıda şablondan üretilen belge yok, veri bozulmadı; **Tayfun EGT-225'i test ederken bu hatayı görür** |
| 1.5 | **Müşteri portalında sertifika menüsü ile sayfa farklı izin istiyor** | Yalnız «belge görme» izni olan menüyü görür, tıklayınca 403; yalnız «katılımcı yönetimi» olan sayfaya menüden ulaşamaz | **[doğrulandı]** `PortalNavigation.php:162` `customer.view_documents`; `Customer/TrainingController.php:276` ve `Customer/CertificateController.php:36` `customer.manage_participants` |
| 1.6 | **Onaylar ekranı iki onay türünü dışarıda bırakıyor** (`quote.approve`, `training.widen_visibility`) | Yalnız görünürlük genişletme yetkisi olan şube direktörü «Onaylar»ı görmez, `/onaylar` 403 | **[kod]** `OfficeNavigation.php:349` `APPROVAL_RIGHTS` |
| 1.7 | Eksik çeviri anahtarları — ekranda ham anahtar görünür | Anket yanıtında hata metni; personel sorgulaması dışa aktarma sütunu; backoffice eski kayıt eşleştirme sütunu; müşteri girişinde passkey iptal metni | **[kod]** `AnswerSurvey.php:55,67,76`; `StaffQueryController.php:170` (`needs`≠`need`); `LegacyCustomerMatches.php:177`; `CustomerSessionController.php:34` `passkey` grubunu yüklemiyor. Arch testi PHP anahtarlarını ve `translate(...)` çağrısını taramıyor — bu yüzden kaçıyor |
| 1.8 | Müşteri kartında «Fırsat ekle» düğmesi yetkisiz kullanıcıya da çiziliyor | Planlamacı basar, 403 alır | **[kod]** `Customers/Show.vue:657` `v-if` yok |
| 1.9 | Yetki değişince açık ofis ekranları iki kez yenileniyor | Görsel titreme, gereksiz yayın | **[kod]** `TellTheOfficePanelToRefresh` hem elle (`AuthServiceProvider.php:119`) hem otomatik keşifle kayıtlı (`event:list` iki satır) |

## 2 · Yetki ve güvenlik açıkları

| # | Bulgu | Senaryo | Kanıt |
|---|---|---|---|
| 2.1 | **İptal onayında dört göz kuralı ve kapsam yok** | `training.cancel` + `cancel_approve` taşıyan planlamacı kendi iptal talebini onaylar (AD-23 kural 2 ihlali); başka şubenin talebini de onaylayabilir | **[doğrulandı]** `ApproveTrainingCancellation.php:41` yalnız `cancelApprove`; `TrainingPolicy.php:153-156` talep edeni ve kapsamı sormuyor. Maliyet ve gider onayı ikisini de soruyor |
| 2.2 | **Eğitmen denetim kayıtları yanlış müşterinin izine düşebiliyor** | Erişimi tek müşteriye sınırlı ofis kullanıcısı eğitmen dosyası açar/günceller → kayıt o müşterinin denetim izine yazılır | **[doğrulandı]** `AuditWriter.php:79` `officeRecord` yoksa `CurrentActor::tenantId()` (`CurrentActor.php:82` tek kapsam → o müşteri). `OpenInstructorToBranches:64`, `UpdateInstructorFile:118`, `CreateInstructorRecord:77` bayrağı geçmiyor; eğitmen modelleri `OfficeRecord` değil. EGT-220 yalnız erişim günlüğünü düzeltti; ticket yok |
| 2.3 | **Eğitimde `.own` / `.group` kapsam ekleri çözülmüyor**; detay sayfası listeden geniş | Merkezde `training.view.own` + `update.own` taşıyan planlamacı jetonla başkasının açık eğitimini açıp düzenler | **[kod]** `TrainingPolicy` `update:104`, `cancel:148`, `assignInstructor:158`, `notifyMinistry:169` yalnız «iznin herhangi bir kapsamı var mı»ya bakıyor; `groupsFor`/`covers` çağrılmıyor. Kod yorumu «merkez okuyucunun detayı değişmesin (P-7)» diyor — **bilinçli mi, karar sizin** |
| 2.4 | Talep kuyruğunda tek kayıt işlemleri kapsamsız | Şube planlamacısı listede görmediği talebi reddeder/yeniden açar | **[kod]** `TrainingRequestPolicy.php:42,74`; liste `TrainingRequestQueue::reaches()` ile süzülüyor |
| 2.5 | Belge doğrulama numaraları sırayla taranabilir | Giriş yapmış herhangi bir firma kullanıcısı `WNX2026000000001…N` döngüsüyle bütün firmaların personel adı + eğitim listesini çıkarır | **[kod]** `/dogrula/{number?}` (panel `routes/panel.php:770`, ofis) hız sınırı yok; erişim kaydı tutuluyor ama engel yok |
| 2.6 | Şube kullanıcısına süzülmeyen bölümler | Başka şubenin verisi görünür | **[kod]** müşteri kartı fırsatları (`CustomerCard.php:515`) ve yazışmaları (`:349,422`); eğitmen iş yükü ve dışa aktarımı (`InstructorController:297,317`); anket sonuçları; planlama gündemi sayaçları (`PlanningOutlook.php:125,588,613`); operasyon gündeminde ekip yükü (`:132`) |
| 2.7 | Müşteri kartı özetindeki eğitim sayısı şubeye göre süzülmüyor, yanındaki liste süzülüyor | Şube kullanıcısı özette «9 eğitim», listede ve yeni bağlantıda daha az görür | **[doğrulandı]** `CustomerCard::trainingCounts()` kapsam almıyor; `trainings()` `applyToBranchReaders` uyguluyor |
| 2.8 | `CorrectCertificateRequest` kimlik no'yu yalnız `digits:11` ile doğruluyor | Kontrol hanesi yanlış numara belgeye basılır | **[kod]** `:26`; harita kararı ofisteki bütün `digits:11`'lerin `WellFormedNationalId`'e geçmesiydi, kalan tek yer |
| 2.9 | `analytics.view` izni tanımlı ama hiçbir yerde sorulmuyor; kullanım analitiği erişim günlüğü izniyle açılıyor | Erişim günlüğü yetkisi olan analitiği de görür | **[kod]** `config/authorization.php:112`; `UsageInsights.php:56` |
| 2.10 | Müşteri portalında teklif/eğitim görme izni yok | Yalnız «belge yükleme» izni olan kişi firmanın tekliflerini fiyatlarıyla görür | **[olası]** `QuotePolicy::viewAny` her müşteri kullanıcısına true. Spec'te hüküm yok — **tasarım sorusu** |
| 2.11 | Arch testi `set_config()` çağrısını taramıyor | Kiracı bağlamı oturum düzeyinde kurulursa test yakalamaz (kırmızı çizgi 2) | **[kod]** `docs/issues.md:47` hâlâ açık |

## 3 · Ekranda yanlış ya da çelişkili bilgi

| # | Bulgu | Kanıt |
|---|---|---|
| 3.1 | **Sınavdan kalan kişi müşteri portalında süresiz «Belge hazırlanıyor» görüyor**; ofiste aynı kişi «sınavdan kaldı» | **[kod]** `MyCertificates.php:56-65` sonuca bakmıyor; `TrainingCertificates.php:69` bakıyor (EGT-225) |
| 3.2 | **Doğrulama sayfası süresi geçmiş belgeye «Bu belge geçerlidir · …'e kadar geçerli» diyor** | **[kod]** `CertificateVerificationPage.php:67` yalnız durum. Plan üç hâl sayıyor, yani plana uygun — **«süresi doldu» hâli eklensin mi, karar sizin** |
| 3.3 | Belge tarihi ve seri yılı UTC'ye göre: 00:00–03:00 arası basılan belge önceki günün tarihini, 1 Ocak'ın ilk 3 saatinde önceki yılın serisini alır. **Fatura numarası da aynı** | **[kod]** `config/app.php:71` UTC; `CertificatePrinter.php:107`, `IssueInvoice.php:144` |
| 3.4 | Tanımın düzenleyeni sonradan değişirse düzeltme yanlış seriden numara alır ya da 500 verir | **[kod]** `CertificatePrinter::print:100` seriyi tanımın bugünkü hâlinden alıyor |
| 3.5 | Şablon yüklemesinde bir firmanın basımı hata verirse sonraki firmalar basılmaz, yükleme 500 döner | **[olası]** `UploadCertificateTemplate.php:150-155` |
| 3.6 | Belge listeleri çekilen/yedek kişileri de «belge düzenlenmedi» diye gösteriyor | **[olası]** `TrainingCertificates::places()`, `MyCertificates::pending()` kayıt durumunu süzmüyor |
| 3.7 | Portal profilinde «e-posta değiştirilemez» yazısının hemen altında e-posta değiştirme paneli var | **[kod]** `Portal/Profile.vue:92` |
| 3.8 | `certificate_records.voided_by` kolonunun FK'sı ve indeksi yok | **[kod]** migration `2026_11_05_000100` |

## 4 · Yardım metinleri ekranla çelişiyor

43 makale + 1 SSS tarandı. «Yalan söyleyen yardım olmayandan kötüdür» kuralına giren satırlar:

**Akış yanlış anlatılıyor**
1. `egitmen-musaitlik` adım 2 — izinli günde eğitmen «seçilebilir» diyor; kodda seçilemez **[kod]** `PlanningCandidates.php:220-224`.
2. `planlama-gerekceli-atama` adım 1 — «aynı gün başka eğitimi var» gerekçeyle atanabilir diyor; gerekçeli atama yalnız il tercihi için **[kod]**.
3. `planlama-egitmen-atama` adım 2 — «TERCİH ETMİYOR» il demek, eğitim/dönem değil **[kod]**.
4. `egitmen-belgelerim` — «doğrudan yükleyebilirsiniz»; ekran salt okunur **[kod]**.
5. `musteri-acik-egitimler` — «fiyat görünür, yer ayırtırsınız»; ekranda «Fiyat neden yazmıyor?», «Kontenjan İste» **[kod]**.
6. `operasyon-pasiflestirme` — «Pasifleştir» yok; «Dondur»/«Kapat» var **[kod]**.
7. `satis-yazisma`, `satis-revizyon-istegi`, `satis-teklif-surumu` — anlatılan bloklar yok **[kod]**.
8. `satis-teklif-onay-takibi`, `-gonderme`, `-hazirlama` — düğme ve durum adları farklı **[kod]**.
9. `musteri-gecmis-personel` — düğme adları farklı **[kod]**.
10. `egitmen-masraf` — «Yeni» değil «Masraf ekle» **[kod]**.

**Menü yolu yanlış**
11. «Satış → Müşteriler» — Müşteriler **YÖNETİM** altında **[doğrulandı]** (`OfficeNavigation.php:276`). ⚠ Aynı yanlışı EGT-226 test prosedürüne ben de yazdım; ticket'a düzeltme yorumu eklendi.
12. «Yönetim → Satışçılar/Kullanıcılar», «Planlama → Takvim/Kuyruk», «Seçenek listeleri», müşteri hesap menüsü adları **[kod]**.

**Kırık bağlantı:** `operasyon-denetim-zinciri.json:43-44` var olmayan slug'lara gidiyor **[doğrulandı]**.
**Ekran görüntüsü yanlış ekran olabilir** (yalnız dosya adına göre, içerik açılmadı): `planlama-bakanlik`, `planlama-egitim-gunu`, `planlama-gerekceli-atama`, `planlama-iptal-revizyon`, `operasyon-muafiyet`, `satis-acik-egitim`, `satis-yazisma`.
**Eksik anlatım:** `operasyon-yetki-verme` şube kilitlerini (EGT-219) anlatmıyor.

## 5 · Eksik özellikler (kodda yok, haritada açık)

- Operasyon direktörü eğitmen paneline giremiyor — kapı eğitmen kaydı (`InstructorPanelController.php:614`); «yetkisi varsa görür» kararıyla ters **[kod]**.
- Bildirim kapatılmış e-posta adresi yeniden açılamıyor — `lifted_at` okunuyor, hiçbir yer yazmıyor (`Deliverability.php:55,99`) **[kod]**.
- 33 bildirim olayından 24'ünün aktif kuralı yok (`quote.sent`, `task.assigned`, `certificate.issued`, `approval.pending`…) — 13.08.2026 kararı «aktif edilmedikçe gitmez»; canlı kural tablosu kontrol edilmedi.
- Bakanlık bildirimi doğum tarihini okumuyor; ofiste doğrudan katılımcı ekleme yok; SMS sağlayıcısı yok (EGT-76 Fixed ama yalnız `NullSmsGateway`); müşteri imzalı sözleşmeyi indiremiyor; eğitim detayından pakete dönüş yok; teklif listesinde ad hücresi bağlantı değil; içerik paketinde video/ses oynatıcı yok; e-Fatura entegratörü yok; Zoom/YouTube (EGT-41) **[kod/harita]**.
- Planlama takviminde boş güne tıklama/sürükleme ve eğitim günü sayacı yok (`tasarim-30-33` 30-b, 30-c); yoklama başlığında KUMS rozeti yok (22 A5); «N salonda» sayacı (41) **[kod]**.
- Çağıranı olmayan sorgu: `SupplierPriceHistory::forProvince` — planlamacının il bazında maliyet geçmişi ekranı yazılmamış **[olası]**.

## 6 · Süreç ve kayıt

- **YouTrack:** EGT'de 95 çözülmemiş ticket; **84'ü In Review, hepsi Tayfun'da**, 60'tan fazlası ağustostan beri bekliyor (en eskisi EGT-73, 10.08).
  - EGT-214 (In Progress, Tayfun): Tayfun 22.09'da cevap verdi («2026 değil 2024»), o günden beri hareket yok — **top bizde görünüyor**.
  - EGT-188, 189, 201: yorumlara göre iş bitmiş, durum In Progress kalmış.
  - EGT-187 (In Review) «Excel'den Aktar gizlensin» diyor; EGT-201 düğmeyi 30.08'de geri açtı — Tayfun 187'yi test ederse başarısız görür.
  - EGT-100, 152, 206: «Test prosedürü» yorumu yok.
- **Karar bekleyen (Sets):** EGT-219 plan sapmaları (backoffice yetki adları, şube takviminde boş eğitmen hücresi, şube mali tablosunda eğitmen borcu, iki ek daraltma) heyet 823'te kabul, sizin onayınız kayıtlı değil · tasarım 32'de sorulmamış üç satır (aktivite satırı görünümü, görev bağlamı, «＋ Görev» boyu) · fatura numarası biçiminin muhasebeci teyidi · `no_show` kuralı · canlıda 3E şirket bilgileri (vergi no, seri öneki, yasal ibare) girildi mi — girilmediyse canlıda fatura kesilemez · yasal metinlerde `[3E TAM TİCARET ÜNVANI]` yer tutucuları.
- **Bayat dokümanlar:** `proje-haritasi.md`'de ~30 satır kodda kapanmış ama açık yazıyor (örn. `:928`, `:782`, `:798`); §7 ticket haritası; `docs/issues.md`'de ~5 kapanmış kalem; kapsama dosyalarında ~10 kapanmış satır; `ortamlar.md:380,41,333` ve CI adımı; CLAUDE.md «AD-01…28» (AD-29 var), «27 makale» (43).
- **Araçlar:** `.toolkit` 64 commit geride; YouTrack `update`'te süre seçeneği yok; commit hook'u düz metindeki «assignee» kelimesini reddediyor; TeamCity #1823'ü heyet tetiklemiş (CI kuralıyla çelişiyor).
- **Ölü kod:** `OverdueQuotes`, altı `notification.*_bands` ayar anahtarı, `GET /panel` deneme ucu, beş kullanılmayan yardım görseli, bayat `NoAuthorizationRequired` gerekçeleri (`CreateCustomer`, `ProvisionTenantAuthorization`).

## 7 · Kök sebepler — bunlar neden önden yakalanmadı

1. **Testler action'ı doğrudan çağırıyor, ekranın gönderdiği isteği değil.** 1.1, 1.2, 1.4 üçü de bu: action testi yeşil, HTTP yolu kırık. Kural önerisi: her yazma ucunun «sahibi kendi kaydında başarılı» HTTP testi.
2. **Arch testleri yalnız Vue'daki `$t(` kalıbını tarıyor.** PHP `__()` ve `translate()` kaçıyor (1.7). Kapanış: anahtar taramasını PHP'ye genişletmek.
3. **Menü kapısı ile sayfa kapısı ayrı yazılıyor.** 1.5, 1.6, 1.8: aynı soru iki yerde iki ayrı izinle soruluyor. Kapanış: menü kalemini ve düğmeyi hedef rotanın kendi yeteneğinden türetmek ya da her menü kalemi için «görünüyorsa açılıyor» testi.
4. **Kapsam (şube/own/group) liste sorgusunda var, sayaçta ve tek kayıt yolunda yok.** 2.3, 2.4, 2.6, 2.7. Kapanış: her policy `view`'unun listeyle aynı kapsam sınıfını kullandığını kilitleyen test.
5. **Form alanı ile kaydetme listesi ayrı tutuluyor** (1.3, 03.08.2026'daki hatanın aynısı). Kapanış: formdaki her alanın `KEYS`'te olduğunu kilitleyen test.
6. **Yardım metni yalnız ekran değiştiğinde güncelleniyor; ekranı yazılmadan önce yazılmış makaleler hiç düzeltilmemiş** (bölüm 4). Kapanış: bir kerelik tarama + makaledeki «…» etiketlerinin `lang/tr`'de bulunduğunu denetleyen test.

## Doğrulanmayanlar

Canlı veritabanı (şirket bilgileri, bildirim kuralları, yasal metinler); ekran görüntülerinin içeriği; [kod]/[olası] etiketli satırlar ajan okumasıdır, tek tek tekrar etmedim; 489 rotanın ~260'ı yetkiyi bağımlılığa devrettiği için «tamam» sayıldı, uçtan uca izlenmedi.

---

## Uygulama — aynı gün (Sets kararı: dört grubun hepsi, her grup ayrı ticket)

*Canlı: `20261021-045512` (`da2c656c`) · TeamCity #1840 yeşil (2823) · lokal 2442 + 381 yeşil.*

| Bulgu | Ticket | Durum |
|---|---|---|
| 1.1, 1.2, 1.8, 2.6 (fırsatlar) | EGT-227 | In Review → Tayfun |
| 1.3 + masraf formunun ayarı dosyadan okuması (yeni bulgu) | EGT-228 | In Review → Tayfun |
| 1.5 | EGT-229 | In Review → Tayfun |
| 1.6 | EGT-230 | In Review → Tayfun |
| 1.7 + PHP anahtar denetimi | EGT-231 | In Review → Tayfun |
| 1.4, 2.8, 3.1, 3.4, 3.5, 3.6, 3.8 | EGT-232 | In Review → Tayfun |
| 2.1 | EGT-233 | In Review → Tayfun |
| 2.2 (eğitmen dahil 64 model `OfficeRecord`) | EGT-234 | Fixed (ekran yüzeyi yok) |
| 2.3 (Sets kararı: detay listeyle aynı) | EGT-235 | In Review → Tayfun |
| 2.4 | EGT-236 | In Review → Tayfun |
| 2.6, 2.7 (kart özeti, yazışmalar, iş yükü, anket, ekip yükü, kuyruk) | EGT-237 | In Review → Tayfun |
| 2.5 | EGT-238 | In Review → Tayfun |
| 2.11 · 2.9 **yanlış alarm** (`analytics.view` ofis ailesinin, ertelenmiş BI ekranının izni) | EGT-239 | Fixed |
| Bölüm 4 + kilit testi | EGT-240 | In Review → Tayfun |
| Bölüm 6 (doküman bayatlığı) | EGT-241 | Fixed |

**Bilinçli olarak dokunulmayanlar:** planlama gündeminin dört sayaç kartı (gece özetiyle karşılaştırıldığı için şirket geneli — EGT-219 kararı) · 1.9 çift dinleyici (zararsız, ayrı küçük iş) · ekran görüntüleri.

**Sets kararı bekleyenler:** 3.2 süresi dolmuş belge · 3.3 belge/fatura tarihinin saat dilimi · 2.10 portalda teklif görme izni · şüpheli yedi ekran görüntüsü · bölüm 5'teki eksik özellikler için ticket · EGT-219 sapmaları ve tasarım 32'nin üç sorulmamış satırı · müşteriden türeyen kayıtların (teklif kalemi, yazışma, muafiyet) denetim izinin yeri — bugün okuyanın kapsamına düşüyor.

**Karar turu (Sets, 21.10.2026) — dördü de önerilen yönde, aynı gün canlıda (`20261021-051838`, TeamCity #1841 yeşil, 2827):** 3.2 → EGT-242 «süresi doldu» durumu · 3.3 → EGT-243 Türkiye takvimi (referans kod yılları dahil) · 2.10 → EGT-244 portalda teklifler «Teklif talep etme» ya da «Teklif onaylama» yetkisine bağlı · şüpheli görseller → EGT-245 yedisi yeniden çekildi (duyuru önizlemesi yerel veride çekilemedi, kokpit kullanıldı). Hepsi In Review → Tayfun.

**Hâlâ açık (Sets kararı):** bölüm 5'teki eksik özellikler için ticket · EGT-219 plan sapmalarının onayı · tasarım 32'nin üç sorulmamış satırı · müşteriden türeyen kayıtların denetim izi · EGT-214/188/189/201 durumları (Tayfun'da) · 1.9 çift dinleyici (küçük).
