# Ekran envanteri ve gezinme haritası — üç panel

**Tarih:** 03.08.2026 · **Üretim:** `php artisan route:list --json` + her controller metodunun gövdesinden `Inertia::render` okunarak. **Bellekten yazılmadı.**
**Amaç:** Playwright turunun neyi ziyaret edeceğini ve **nasıl** ziyaret edeceğini belirlemek. Tur bu listeden koşar; liste turdan üretilmez.

---

## 0 · Turun uyması gereken üç kural

### ⛔ 1. Parametreli adres **elle kurulamaz** — tıklanır

`App\Support\Http\OpaqueId`: tarayıcının gördüğü kimlik, kaydın id'si değil, **o kişinin o oturumunda** aynı kaydı gösteren 22 karakterlik bir token. *"İki kişi aynı müşteriye bakarken farklı token görür; aynı kişi yarın başka bir token görür."* 72 dosya bunu kullanıyor ve detay controller'ları parametreyi `string` olarak alıp çözüyor (`CustomerController::show(string $customer, …)`).

**Sonuç:** `/musteriler/5` diye bir adres **yoktur**. Detay ekranına ulaşmanın tek yolu listeden satıra tıklamaktır. Adres uyduran bir tur, ekranı değil 404'ü ölçer.

**Etkilenen:** ofiste 24, panelde 6 ekran (aşağıda `tıklama`).

### ⚠ 2. `{token}` taşıyan altı adres akış içindedir

Magic link, davet ve şifre sıfırlama bağlantıları. Tur bunları **üretmek zorundadır** (seeder'dan ya da action'dan), çünkü geçerli bir token olmadan çizilen ekran "süresi doldu" halidir — ki o da ölçülmeye değer, ama doğru halin yerine geçmez.

### ⚠ 3. `dosya` ve `json/akış` satırları ziyaret edilmez

Tarayıcıya indirme yaptırır ya da ham JSON çizer; ikisi de "boş render" gibi görünür ve yanlış bulgu üretir. Bunlar **tıklanarak** (indirme yakalanarak) ölçülür, adresle değil.

---

## 1 · Sayılar

| | Ofis | Panel | Backoffice |
|---|---|---|---|
| GET adresi | 76 | 30 | 50 |
| **Inertia ekranı** | **62** | **28** | — (Filament) |
| Dosya/indirme | 8 | 2 | — |
| JSON / akış / blade | 3 | 3 | — |
| Sabit adres (doğrudan gidilir) | 52 | 24 | 50 |
| **Tıklama gerektiren** | **24** | **6** | 21 (`{record}`) |

⚠ Backoffice Filament'tir: `{record}` parametreleri **düz id** taşır (OpaqueId Filament'e girmez — AD-25, token katmanının sınırı Filament'tir). Yani backoffice detayına adresle gidilebilir; ofis ve panelde gidilemez.

## 2 · Ofis paneli — `ofis.<domain>`

| Adres | Route | Bileşen | Tür | Erişim |
|---|---|---|---|---|
| `/` | `office.dashboard` | `Office/Dashboard` | ekran | sabit |
| `/bildirimler` | `office.notifications.index` | `Office/Notifications/Index` | ekran | sabit |
| `/egitimler` | `office.trainings.index` | `Office/Trainings/Index` | ekran | sabit |
| `/egitimler/yeni` | `office.trainings.create` | `Office/Trainings/Plan` | ekran | sabit |
| `/egitmen` | `office.instructor.dashboard` | `Office/Instructor/Dashboard` | ekran | sabit |
| `/egitmen/belgelerim` | `office.instructor.documents` | `Office/Instructor/Documents` | ekran | sabit |
| `/egitmen/cari-durumum` | `office.instructor.ledger` | `Office/Instructor/Ledger` | ekran | sabit |
| `/egitmen/egitimlerim` | `office.instructor.trainings` | `Office/Instructor/Trainings` | ekran | sabit |
| `/egitmen/masraflarim` | `office.instructor.expenses` | `Office/Instructor/Expenses` | ekran | sabit |
| `/egitmen/musaitlik` | `office.instructor.availability` | `Office/Instructor/Availability` | ekran | sabit |
| `/egitmen/takvim` | `office.instructor.calendar` | `Office/Instructor/Calendar` | ekran | sabit |
| `/egitmenler` | `office.instructors.index` | `Office/Instructors/Index` | ekran | sabit |
| `/egitmenler/durum` | `office.instructors.workload` | `Office/Instructors/Workload` | ekran | sabit |
| `/egitmenler/durum/disa-aktar` | `office.instructors.workload.export` | `—` | dosya | sabit |
| `/egitmenler/yeni` | `office.instructors.create` | `Office/Instructors/Create` | ekran | sabit |
| `/giris` | `office.login.show` | `Office/Auth/SignIn` | ekran | sabit |
| `/gorevlerim` | `office.tasks.index` | `Office/Tasks/Index` | ekran | sabit |
| `/ikinci-faktor` | `office.second-factor.show` | `Office/Auth/SecondFactor` | ekran | sabit |
| `/kullanicilar` | `office.users.index` | `Office/Users/Index` | ekran | sabit |
| `/muhasebe` | `office.accounting.overview` | `Office/Accounting/Overview` | ekran | sabit |
| `/muhasebe/disa-aktar` | `office.accounting.export` | `—` | dosya | sabit |
| `/muhasebe/faturalar` | `office.invoices.index` | `Office/Invoices/Index` | ekran | sabit |
| `/musteriler` | `office.customers.index` | `Office/Customers/Index` | ekran | sabit |
| `/onaylar` | `office.approvals.index` | `Office/Approvals/Index` | ekran | sabit |
| `/oturum-dogrula` | `office.session.strengthen` | `Office/Auth/StrengthenSession` | ekran | sabit |
| `/oturumlar` | `office.sessions.index` | `—` | json/akış | sabit |
| `/planlama` | `office.agenda.planning` | `Office/Agenda/Planning` | ekran | sabit |
| `/planlama/sorgulama` | `office.planning.query` | `Office/Planning/Query` | ekran | sabit |
| `/planlama/sorgulama/disa-aktar` | `office.planning.query.export` | `—` | dosya | sabit |
| `/planlama/takvim` | `office.planning.calendar` | `Office/Planning/Calendar` | ekran | sabit |
| `/planlama/talepler` | `office.requests.index` | `Office/Requests/Index` | ekran | sabit |
| `/profil/guvenlik` | `office.profile.security` | `Office/Profile/Security` | ekran | sabit |
| `/profil/guvenlik/ikinci-faktor` | `office.profile.second-factor.enrol` | `Office/Profile/EnrolSecondFactor` | ekran | sabit |
| `/satis` | `office.sales.agenda` | `Office/Sales/Agenda` | ekran | sabit |
| `/satis/antet` | `office.quotes.letterhead` | `—` | dosya | sabit |
| `/satis/paketler` | `office.packages.catalogue` | `Office/ContentPackages/Index` | ekran | sabit |
| `/satis/planlama-talepleri/yeni` | `office.requests.create` | `Office/Requests/Create` | ekran | sabit |
| `/satis/takvimim` | `office.sales.calendar` | `Office/Sales/Calendar` | ekran | sabit |
| `/satis/teklifler` | `office.quotes.index` | `Office/Quotes/Index` | ekran | sabit |
| `/satis/teklifler/yeni` | `office.quotes.create` | `Office/Quotes/Create` | ekran | sabit |
| `/sifre/baglanti` | `office.password.request` | `Office/Auth/ForgotPassword` | ekran | sabit |
| `/sistem-gunlugu` | `office.system-log.index` | `Office/SystemLog/Index` | ekran | sabit |
| `/sistem-gunlugu/disa-aktar` | `office.system-log.export` | `—` | dosya | sabit |
| `/tedarikciler` | `office.suppliers.index` | `Office/Suppliers/Index` | ekran | sabit |
| `/yonetim` | `office.agenda.operations` | `Office/Agenda/Operations` | ekran | sabit |
| `/yonetim/anketler` | `office.agenda.surveys` | `Office/Agenda/Surveys` | ekran | sabit |
| `/yonetim/satiscilar` | `office.sellers.index` | `Office/Users/Sellers` | ekran | sabit |
| `/baglanti/{token}` | `office.magic-link` | `—` | json/akış | token |
| `/davet/{token}` | `office.invitation.show` | `Office/Auth/AcceptInvitation` | ekran | token |
| `/egitimler/{training}` | `office.trainings.show` | `Office/Trainings/Show` | ekran | tıklama |
| `/egitimler/{training}/adaylar` | `office.trainings.candidates` | `Office/Trainings/Candidates` | ekran | tıklama |
| `/egitimler/{training}/yoklama-listesi` | `office.trainings.register.sheet` | `Office/Trainings/Register` | ekran | tıklama |
| `/egitimler/{training}/yoklama/dosya` | `office.trainings.register.read` | `—` | dosya | tıklama |
| `/egitmen/egitimler/{training}` | `office.instructor.training` | `Office/Instructor/Training` | ekran | tıklama |
| `/egitmen/egitimler/{training}/gun` | `office.instructor.training.day` | `Office/Instructor/TrainingDay` | ekran | tıklama |
| `/egitmen/egitimler/{training}/materyal/{material}` | `office.instructor.training.material` | `—` | dosya | tıklama |
| `/egitmenler/{instructor}` | `office.instructors.show` | `Office/Instructors/Show` | ekran | tıklama |
| `/egitmenler/{instructor}/belge/{file}` | `office.instructors.document` | `—` | dosya | tıklama |
| `/egitmenler/{instructor}/egitimler` | `office.instructors.trainings` | `Office/Instructors/Trainings` | ekran | tıklama |
| `/egitmenler/{instructor}/finans` | `office.instructors.finance` | `Office/Instructors/Finance` | ekran | tıklama |
| `/egitmenler/{instructor}/loglar` | `office.instructors.logs` | `Office/Instructors/Logs` | ekran | tıklama |
| `/kullanicilar/{user}` | `office.users.show` | `Office/Users/Show` | ekran | tıklama |
| `/kullanicilar/{user}/kopyalanabilir/{source}` | `office.users.copyable` | `—` | json/akış | tıklama |
| `/kullanicilar/{user}/loglar` | `office.users.logs` | `Office/Users/Logs` | ekran | tıklama |
| `/kullanicilar/{user}/yetkiler` | `office.users.permissions.edit` | `Office/Users/Permissions` | ekran | tıklama |
| `/muhasebe/cari/{customer}` | `office.accounting.customer-ledger` | `Office/Accounting/CustomerLedger` | ekran | tıklama |
| `/muhasebe/faturalar/{invoice}` | `office.invoices.show` | `Office/Invoices/Show` | ekran | tıklama |
| `/musteriler/{customer}` | `office.customers.show` | `Office/Customers/Show` | ekran | tıklama |
| `/musteriler/{customer}/aktivite` | `office.customers.activity` | `Office/Customers/Activity` | ekran | tıklama |
| `/paketler/{package}` | `office.packages.show` | `Office/Packages/Show` | ekran | tıklama |
| `/satis/acik-egitim/{training}/duyuru` | `office.sales.announcement` | `Office/Sales/Announcement` | ekran | tıklama |
| `/satis/paketler/{package}` | `office.packages.catalogue.show` | `Office/ContentPackages/Show` | ekran | tıklama |
| `/satis/teklifler/{quote}` | `office.quotes.show` | `Office/Quotes/Show` | ekran | tıklama |
| `/satis/teklifler/{quote}/yazdir` | `office.quotes.printout` | `Office/Quotes/Printout` | ekran | tıklama |
| `/sifre/sifirla/{token}` | `office.password.reset` | `Office/Auth/ResetPassword` | ekran | token |
| `/tedarikciler/{supplier}` | `office.suppliers.show` | `Office/Suppliers/Show` | ekran | tıklama |

## 3 · Müşteri paneli — `panel.<domain>`

| Adres | Route | Bileşen | Tür | Erişim |
|---|---|---|---|---|
| `/` | `customer.portal` | `Portal/Dashboard` | ekran | sabit |
| `/acik-egitimler` | `customer.portal.open_trainings` | `Portal/OpenTrainings` | ekran | sabit |
| `/bildirimler` | `customer.portal.notifications` | `Portal/Notifications` | ekran | sabit |
| `/egitimler` | `customer.portal.trainings` | `Portal/Trainings` | ekran | sabit |
| `/faturalar` | `customer.portal.invoices` | `Portal/Invoices` | ekran | sabit |
| `/giris` | `customer.login.show` | `Portal/Auth/SignIn` | ekran | sabit |
| `/guvenlik` | `customer.portal.security` | `Portal/Security` | ekran | sabit |
| `/guvenlik/ikinci-faktor` | `customer.portal.security.second-factor.enrol` | `Portal/EnrolSecondFactor` | ekran | sabit |
| `/icerik` | `customer.portal.content` | `Portal/Content` | ekran | sabit |
| `/icerik/katalog` | `customer.portal.content.catalogue` | `Portal/ContentCatalogue` | ekran | sabit |
| `/ikinci-faktor` | `customer.second-factor.show` | `Portal/Auth/SecondFactor` | ekran | sabit |
| `/katilimci` | `customer.participant` | `Portal/Participant/Panel` | ekran | sabit |
| `/kimlik-teyidi` | `customer.challenge.show` | `Portal/Auth/Challenge` | ekran | sabit |
| `/lokasyonlar` | `customer.portal.locations` | `Portal/Locations` | ekran | sabit |
| `/organizasyon` | `customer.portal.organisation` | `Portal/Organisation` | ekran | sabit |
| `/oturumlar` | `customer.sessions.index` | `—` | json/akış | sabit |
| `/panel` | `customer.panel` | `—` | json/akış | sabit |
| `/personel` | `customer.portal.people` | `Portal/People` | ekran | sabit |
| `/personel/sablon` | `customer.portal.people.template` | `—` | dosya | sabit |
| `/sertifikalar` | `customer.portal.certificates` | `Portal/Certificates` | ekran | sabit |
| `/sifre/baglanti` | `customer.password.request` | `Portal/Auth/ForgotPassword` | ekran | sabit |
| `/teklif-istegi` | `customer.portal.quote.request.create` | `Portal/QuoteRequest` | ekran | sabit |
| `/teklifler` | `customer.portal.quotes` | `Portal/Quotes` | ekran | sabit |
| `/anket/{training}` | `customer.survey` | `Portal/Survey` | ekran | tıklama |
| `/baglanti/{token}` | `customer.magic-link` | `Portal/Auth/MagicLinkExpired` | ekran | token |
| `/davet/{token}` | `customer.invitation` | `—` | blade | token |
| `/egitimler/{training}` | `customer.portal.training` | `Portal/TrainingShow` | ekran | tıklama |
| `/icerik/dokuman/{document}` | `customer.portal.content.document` | `—` | dosya | tıklama |
| `/sifre/sifirla/{token}` | `customer.password.reset` | `Portal/Auth/ResetPassword` | ekran | token |
| `/teklifler/{quote}` | `customer.portal.quote` | `Portal/QuoteShow` | ekran | tıklama |

## 4 · Backoffice — `backoffice.<domain>` (Filament)

| Adres | Route | Erişim |
|---|---|---|
| `//` | `filament.backoffice.pages.dashboard` | sabit |
| `/access-log` | `filament.backoffice.pages.access-log` | sabit |
| `/auth-method-settings` | `filament.backoffice.pages.auth-method-settings` | sabit |
| `/backoffice-users` | `filament.backoffice.resources.backoffice-users.index` | sabit |
| `/backoffice-users/create` | `filament.backoffice.resources.backoffice-users.create` | sabit |
| `/business-settings` | `filament.backoffice.pages.business-settings` | sabit |
| `/consent-texts` | `filament.backoffice.resources.consent-texts.index` | sabit |
| `/consent-texts/create` | `filament.backoffice.resources.consent-texts.create` | sabit |
| `/content-packages` | `filament.backoffice.resources.content-packages.index` | sabit |
| `/content-packages/create` | `filament.backoffice.resources.content-packages.create` | sabit |
| `/customer-segments` | `filament.backoffice.resources.customer-segments.index` | sabit |
| `/document-types` | `filament.backoffice.resources.document-types.index` | sabit |
| `/document-types/create` | `filament.backoffice.resources.document-types.create` | sabit |
| `/groups` | `filament.backoffice.resources.groups.index` | sabit |
| `/instructor-requirements` | `filament.backoffice.resources.instructor-requirements.index` | sabit |
| `/instructor-requirements/create` | `filament.backoffice.resources.instructor-requirements.create` | sabit |
| `/instructor-settings` | `filament.backoffice.pages.instructor-settings` | sabit |
| `/login` | `filament.backoffice.auth.login` | sabit |
| `/multi-factor-authentication/set-up` | `filament.backoffice.auth.multi-factor-authentication.set-up-required` | sabit |
| `/notification-settings` | `filament.backoffice.pages.notification-settings` | sabit |
| `/notification-templates` | `filament.backoffice.resources.notification-templates.index` | sabit |
| `/notification-templates/create` | `filament.backoffice.resources.notification-templates.create` | sabit |
| `/office-users` | `filament.backoffice.resources.office-users.index` | sabit |
| `/office-users/create` | `filament.backoffice.resources.office-users.create` | sabit |
| `/option-lists` | `filament.backoffice.resources.option-lists.index` | sabit |
| `/price-bands` | `filament.backoffice.resources.price-bands.index` | sabit |
| `/price-groups` | `filament.backoffice.resources.price-groups.index` | sabit |
| `/price-lists` | `filament.backoffice.resources.price-lists.index` | sabit |
| `/price-lists/create` | `filament.backoffice.resources.price-lists.create` | sabit |
| `/profile` | `filament.backoffice.auth.profile` | sabit |
| `/regulations` | `filament.backoffice.resources.regulations.index` | sabit |
| `/regulations/create` | `filament.backoffice.resources.regulations.create` | sabit |
| `/survey-questions` | `filament.backoffice.resources.survey-questions.index` | sabit |
| `/survey-questions/create` | `filament.backoffice.resources.survey-questions.create` | sabit |
| `/training-definitions` | `filament.backoffice.resources.training-definitions.index` | sabit |
| `/training-definitions/create` | `filament.backoffice.resources.training-definitions.create` | sabit |
| `/usage-insights` | `filament.backoffice.pages.usage-insights` | sabit |
| `/write-log` | `filament.backoffice.pages.write-log` | sabit |
| `/backoffice-users/{record}/edit` | `filament.backoffice.resources.backoffice-users.edit` | tıklama |
| `/consent-texts/{record}/edit` | `filament.backoffice.resources.consent-texts.edit` | tıklama |
| `/content-packages/{record}/edit` | `filament.backoffice.resources.content-packages.edit` | tıklama |
| `/document-types/{record}/edit` | `filament.backoffice.resources.document-types.edit` | tıklama |
| `/instructor-requirements/{record}/edit` | `filament.backoffice.resources.instructor-requirements.edit` | tıklama |
| `/notification-templates/{record}/edit` | `filament.backoffice.resources.notification-templates.edit` | tıklama |
| `/office-users/{record}/edit` | `filament.backoffice.resources.office-users.edit` | tıklama |
| `/option-lists/{record}/edit` | `filament.backoffice.resources.option-lists.edit` | tıklama |
| `/price-lists/{record}/edit` | `filament.backoffice.resources.price-lists.edit` | tıklama |
| `/regulations/{record}/edit` | `filament.backoffice.resources.regulations.edit` | tıklama |
| `/survey-questions/{record}/edit` | `filament.backoffice.resources.survey-questions.edit` | tıklama |
| `/training-definitions/{record}/edit` | `filament.backoffice.resources.training-definitions.edit` | tıklama |

---

## 5 · Turun ziyaret **etmeyeceği** adresler ve neden

| Adres | Neden |
|---|---|
| `/egitmenler/durum/disa-aktar` · `/muhasebe/disa-aktar` · `/planlama/sorgulama/disa-aktar` · `/sistem-gunlugu/disa-aktar` | CSV/XLSX indirir — tarayıcıda boş sayfa gibi görünür |
| `/egitmenler/{instructor}/belge/{file}` · `/icerik/dokuman/{document}` · `/egitmen/egitimler/{training}/materyal/{material}` | Şifreli evrak baytları; tıklanarak indirme olayıyla ölçülür |
| `/personel/sablon` · `/satis/antet` | Şablon dosyası |
| `/egitimler/{training}/yoklama/dosya` | İmzalı yoklama görüntüsü |
| `/oturumlar` (iki host) · `/panel` · `/kullanicilar/{user}/kopyalanabilir/{source}` | JSON uçları — ekran değil |
| `/davet/{token}` (panel) | Düz blade, Inertia değil; yine de **ziyaret edilir** (yer tutucu olduğu biliniyor) |
| `horizon/*` · `livewire-*` · `filament/exports/*` · `/up` | Paket adresleri, bizim ekranımız değil |

## 6 · Bu envanterin çıkardığı iki soru

**6.1 · `/panel` hâlâ JSON stub.** `CustomerPanelController` `{"panel":true}` döndürüyor ve omurga çağından beri orada. Panelin kendisi artık `/` adresinde yaşıyor; bu adres **ölü**. Kaldırılsın mı, yoksa bir yönlendirme mi olsun?

**6.2 · `/oturumlar` iki hostta da JSON.** Tasarım `10`'un profil güvenlik sekmesi aktif oturumları çiziyor ve ofiste `/profil/guvenlik`, panelde `/guvenlik` bunu zaten gösteriyor. Yani bu uç ya bir ekranın veri kaynağı ya da artık. Hangisi olduğu turda ölçülecek.
