{
    "date": "2026-08-14",
    "entries": [
        {
            "title": "Müşteriye satışçı atarken listede eğitmenler ve operasyoncular da çıkıyordu",
            "tickets": [
                "EGT-134"
            ],
            "changes": {
                "satis": {
                    "fixed": [
                        "Müşteri kartındaki «Sorumlu satışçılar» kutusu aktif olan HERKESİ listeliyordu: eğitmenler, operasyoncular, muhasebe. Kutunun altında «Seçilen satışçılar bu firmayı görebilir ve teklif hazırlayabilir» yazdığı hâlde, listeden seçilebilen kişilerin çoğu teklif hazırlayamıyordu — atanan isim işi yapamıyordu ve ekranda bunu gösteren hiçbir şey yoktu.",
                        "Liste artık teklif hazırlama yetkisi olan kişileri gösteriyor. Ölçüt yetkinin kendisi; «satışçı» diye ayrı bir işaret tutulmuyor, çünkü ikinci bir liste birinin görevi değiştiği gün eskiyen liste olurdu. Satışçılar ekranı zaten bu tanımı kullanıyordu, müşteri kartı kullanmıyordu.",
                        "Yöneticiler listeden ÇIKARILMADI: satış yöneticisi de operasyon direktörü de teklif yazabiliyor, dolayısıyla «satış yapabilenler» listesinden düşürülemezler. Eksik olan kimin ne olduğuydu — her ismin yanında artık rolü yazıyor (Satış Personel, Satış Grup Yöneticisi, Operasyon Direktör…), ve bir kişi birden fazla yerde duruyorsa en üst yerleşimi gösteriliyor.",
                        "İkiden fazla rol varsa listenin üstüne role göre süzme çıkıyor; tek rol varsa çıkmıyor.",
                        "Rol süzgecinde «Hepsi» çipi ile ekip ağacında hiçbir yere yerleştirilmemiş kişileri toplayan «Yerleşimsiz» çipi aynı değeri taşıyordu: ikisi de seçili görünüyor ve süzgeç bırakılamıyordu. Ekranda ölçüldü, düşünülerek bulunmadı."
                    ]
                }
            }
        },
        {
            "title": "Müşteriye satışçı atamayı anlatan yardım makalesi",
            "tickets": [
                "EGT-137"
            ],
            "changes": {
                "operasyon": {
                    "added": [
                        "Yardım Merkezi'ne yeni makale: «Müşteriye satışçı atama: kim görür, kim teklif yazar». Kutunun kime göründüğü, listede kimlerin çıktığı, rozetlerin ne anlattığı, süzgecin neyi değiştirdiği (ve neyi değiştirmediği) ve kaydın işlem günlüğüne nasıl düştüğü beş adımda yazıldı. İki ekran görüntüsü: bölümün tamamı ve role göre süzülmüş hâli.",
                        "Müşteri kartı makalesinden bu makaleye bağlantı verildi."
                    ],
                    "fixed": [
                        "Yardım makalelerinde kalın yazı için konan yıldız işaretleri ekranda düz metin olarak çıkıyordu — makale gövdesi biçimlendirme okumuyor. Müşteri kartı makalesindeki dört yıldız çifti temizlendi."
                    ]
                }
            }
        },
        {
            "title": "Onay bildirimlerindeki «onaylandı / reddedildi» kelimesi",
            "tickets": [
                "EGT-122"
            ],
            "changes": {
                "altyapi": {
                    "fixed": [
                        "Bir onay bildiriminin metnine konan «karar» değişkeni, yerine geçecek kelimeyi koddan alıyordu. Artık dil dosyasından geliyor: bildirimde «onaylandı» ya da «reddedildi» yazacak kelime birinin okuduğu bir metindir, dolayısıyla diğer bütün arayüz metinleriyle aynı yerde durur — değiştirilmesi gerektiğinde koda dokunulmaz."
                    ]
                }
            }
        },
        {
            "title": "Satışçı teklif yazarken fiyatı görüyor",
            "tickets": [
                "EGT-138"
            ],
            "changes": {
                "satis": {
                    "fixed": [
                        "«Kalem ekle» penceresinde birim fiyat kutusu BOŞ geliyordu. Kalem eklendiğinde arka planda doğru fiyat zaten yazılıyordu — müşterinin fiyat tablosuna göre — ama satışçı onu hiçbir yerde görmüyordu: ne standart fiyatı, ne müşterinin grubuna özel fiyatı. Yani ya başka bir yerden bakıp elle yazıyordu ya da rakamı kendi uyduruyordu.",
                        "Eğitim ve fiyat tipi seçilince kutunun üstünde üç satır çıkıyor: standart fiyat, müşterinin grubunun indirim oranı (grup adıyla) ve bu firmaya özel fiyat. Üçü birden yazıyor çünkü bunlar satışçının pazarlık cümlesi: «normal fiyatımız 3.950, VIP müşterimiz olduğunuz için %10 indiriminiz var, size özel fiyat 3.357,50».",
                        "Birim fiyat kutusu artık o fiyatla dolu geliyor ve değiştirilebilir kalıyor. Satışçı elini sürmezse fiyat değiştirilmiş sayılmaz ve gerekçe istenmez; değiştirirse eskisi gibi gerekçe sorulur. Yazmaya başladığı andan itibaren kutu kendi kendine düzelmeyi bırakır.",
                        "Firma varsayılan fiyat tablosundaysa tek satır çıkıyor — onun için «standart fiyat» ile «size özel fiyat» aynı şeydir, aynı rakamı iki başlık altında yazmak olmayan bir ayrım uydururdu.",
                        "Birim fiyat kutusu para kutusuna çevrildi: «3357.5» yerine «₺ 3.357,50» yazıyor. Aynı ekrandaki paket fiyatı kutusu da öyle."
                    ]
                },
                "backoffice": {
                    "added": [
                        "Bir fiyat grubunun indirim oranı tanımlıysa, o grubun hücreleri artık orana uymak ZORUNDA. Uymayan bir rakam yazılırsa fiyat listesi kaydedilmiyor; hangi bantta, hangi grupta ne yazıldığı ve ne yazılması gerektiği tek tek söyleniyor. Sebep satışçı tarafında: ekran artık müşterinin karşısında «normal fiyatımız şu, size %20 indirim var» diye bir cümle kuruyor — matrisin bunun tersini söylemesi, birinin ağzına o cümleyi koyup yanındaki rakamla yalanlamak olurdu.",
                        "Hücre reddediliyor, düzeltilmiyor: oradaki rakam birinin verdiği ticari karardır, sessizce yeniden hesaplamak o kararı bizim vermemiz olurdu.",
                        "İndirim oranı TANIMSIZ olan gruplar bu kuralın dışında — «özel müşteri» hâli budur: ortada bir vaat yok, dolayısıyla çelişecek bir şey de yok, rakam elle yazılır."
                    ],
                    "fixed": [
                        "Mevcut hücreler düzeltildi: production'da 71, geliştirmede 45 hücre kendi grubunun oranıyla uyuşmuyordu. Rakamlar demo verisinden geliyordu (kendi çarpanları %8/%15/%22 iken grupların tanımlı oranları %5/%10/%20'ydi) ve sonradan bir grubun oranı değiştirilirken hücreler yerinde kalmıştı. Hepsi grubun oranına göre yeniden hesaplandı. ⚠ Yazılmış tekliflerin fiyatı DEĞİŞMEDİ — kalem, fiyatını ve geldiği listeyi eklendiği anda donduruyor.",
                        "Demo veri üreticisi de düzeltildi: gruplara kendi çarpanlarını uyguluyordu, artık grubun tanımlı oranını kullanıyor. Yoksa her sıfırlanan ortam kendi kuralını ihlal eden bir matrisle doğardı."
                    ]
                }
            }
        },
        {
            "title": "Yetki ekranında ham bir anahtar görünüyordu",
            "tickets": [
                "EGT-139"
            ],
            "changes": {
                "operasyon": {
                    "fixed": [
                        "Kullanıcılar → «Yetkileri Düzenle» ekranındaki kaynak × eylem matrisinde bir satırın adı yerine «permission.resources.office.institution_document» yazıyordu. O satır Kurum belgeleridir; adı hiç yazılmamıştı ve metin bulunamayınca ekrana anahtarın kendisi düşüyordu. Adı yazıldı, yanına aynı sebeple eksik kalan «Eğitmen masrafları» ve «İndirim limitleri» de eklendi (ikisi bugün matriste çizilmiyor ama çizildiği gün aynı hatayı verirlerdi).",
                        "Aynı ekranda ikinci bir satırın adı da eksikmiş ve kimse görmemişti: denetim mühür zinciri satırı. Yedek dal düzeltilince ortaya çıktı, adı yazıldı."
                    ]
                },
                "altyapi": {
                    "fixed": [
                        "Metin bulunamadığında devreye girmesi gereken yedek dal hiç çalışmıyordu: çeviri bulunamayınca anahtarın KENDİSİ döndüğü ve o da bir metin olduğu için «metin var mı» kontrolü hep «var» diyordu. Üç yerde düzeltildi (kaynak adı, eylem adı, eylem açıklaması).",
                        "Yeni bir kontrol: yetki matrisinin çizdiği her SATIR ve her SÜTUN, hem Türkçe hem İngilizce adına sahip olmak zorunda; olmayan sürüm CI'da kırılır. ⚠ Liste izin adlarından türetilmiyor, matrisin kendisinden okunuyor — bir satır her zaman izinlerinin ön eki değil (denetim mühür zinciri satırı tam olarak böyle kaçmıştı). Sebep şu: bir izin config'e, seeder'a ve rol şablonlarına yazılıyor; ekranın okuduğu sözlük DÖRDÜNCÜ yer ve kimsenin bakmadığı dördüncü yer geride kalıyor."
                    ]
                }
            }
        },
        {
            "title": "Sorgulama ekranı iki şeyi söylemiyordu",
            "tickets": [
                "EGT-136"
            ],
            "changes": {
                "satis": {
                    "fixed": [
                        "Firmanın KENDİ beyan ettiği sertifikalar sorguda hiç görünmüyordu. Sorgu sertifikaları yalnız 3E'nin açtığı eğitim kaydı üzerinden okuyordu; firmanın panelinden girdiği sertifikanın böyle bir kaydı yok. Sonuç: geçerli üç sertifikası olan bir kişi ekranda «hiç sertifikası yok» diye çıkıyordu — production'da ölçüldü, Control Union'dan bir kişide. Artık kişinin sahip olduğu her sertifika okunuyor, geldiği yer fark etmeksizin.",
                        "Firmanın «bu kişi için eğitim takibi yapmayın» dediği personel sonuç listesinden çıktı. O işaret EGT-113'te tam bu iş için eklenmişti ama yalnız müşteri paneline ulaşmıştı; ofisin Sorgulama ekranı herkesi saymaya devam ediyordu ve satışçı bunu göremiyordu.",
                        "Yeni bir kapalı liste: «Kapsam dışı bırakılanlar». Kaç kişinin değerlendirilmediği dışarıda yazıyor, tıklanınca kimler oldukları ve NEDEN kapsam dışı kaldıkları görünüyor — firma eğitim takibi yapmıyor, ya da işe giriş tarihi girilmediği için süre hesaplanamıyor. İkincisi zaten sessizce eleniyordu; artık söylüyor.",
                        "Kimse gizlenmiyor, ayrı sayılıyor: firma kararını değiştirdiği ya da eksik bilgi girildiği gün listeye geri geliyorlar."
                    ]
                }
            }
        },
        {
            "title": "Modal içinde açılan hiçbir liste görünmüyordu",
            "tickets": [
                "EGT-135"
            ],
            "changes": {
                "satis": {
                    "fixed": [
                        "«Kalem ekle» penceresinde eğitim seçicisine tıklanınca hiçbir şey olmuyordu — liste boş sanılıyordu. Liste aslında AÇILIYOR, doluyor ve doğru yere konumlanıyordu; sadece pencerenin ARKASINDA çiziliyordu, yani ekranda hiç görünmüyordu."
                    ]
                },
                "altyapi": {
                    "fixed": [
                        "Sebep tek ve ortaktı: EGT-119'da açılan katmanlar, kartların içinde kırpılmasınlar diye sayfanın en dışına taşınmıştı. Bu onları pencerelerin katman düzeninden de çıkardı — katmanlar 40. sırada, pencereler 50. sıradaydı. Sonuç: modal, çekmece ya da seçici pencere içindeki HER açılır liste görünmez oldu (tarih seçici, aranabilir seçim, çoklu seçim, satır menüsü, telefon ülke kodu, yetki kapsamı).",
                        "Katman sırası artık tek bir tanımdan geliyor ve pencerelerin üstünde. Yedi dosyada yedi ayrı sayı yerine tek değer — yedi kopya, bir sonraki pencere eklendiğinde birinin geride kalmasının yoludur.",
                        "Tarayıcı testi yerine kural testi yazıldı: sayfanın dışına taşınan hiçbir katman kendi sıra numarasını taşıyamaz, ve o tek değer pencerelerin en yükseğinden büyük olmak zorunda. İkisi birden olmadan aynı hata sessizce geri gelir."
                    ]
                }
            }
        },
        {
            "title": "Devralınan eğitim geçmişi için ilk temel atıldı",
            "tickets": [
                "EGT-108"
            ],
            "changes": {
                "backoffice": {
                    "added": [
                        "Yetki matrisine yeni bir satır geldi: «Geçmiş veri» — görüntüleme ve eşleştirme olmak üzere iki yetki. Kendi izni olarak açıldı, mevcut bir yetkiye yamanmadı: bu liste 2.381 kişinin kimlik numarasını taşıyor ve kimin görebileceği bilerek verilmesi gereken bir karar. ⚠ Henüz kimseye verilmedi ve arkasındaki ekranlar yazılmadı; ekranlar geldiğinde bu yetkiyi taşıyan kişiler görecek.",
                        "Backoffice'e «Geçmiş veri» menü grubu ve altına ilk sayfa geldi: «Eğitim adları». Devralınan listede eğitimler nasıl yazılmışsa öyle duruyor — aynı eğitimin 36 farklı yazımı var — ve her yazım katalogdaki eğitime elle bağlanıyor, ilk eğitim mi yenileme mi olduğu elle seçiliyor. ⚠ Hiçbir alan önceden dolu gelmiyor ve sistem hiçbir tahmin yapmıyor: «Y-» önekinin yenileme demek olduğunu herkes biliyor ama buna dayanıp karar vermek, bu işte yasaklanmış olan varsayımın ta kendisi olurdu.",
                        "Her yazımın yanında kaç belgeyi etkilediği yazıyor. Sebep: 595 belge taşıyan bir yazımla 1 belge taşıyan bozuk bir varyantı ayırt etmenin tek yolu bu — listede 21 tane «MARPOL 73/79…73/98» var ve hepsi birinin Excel'de hücreyi aşağı sürüklemesinden doğmuş.",
                        "Eşleme yarım kaydedilemiyor: eğitim seçilip tür seçilmezse ya da tersi olursa reddediliyor. Yarım bir eşleme ekranda «bu halledilmiş» gibi görünür ama hiçbir sertifika üretmez.",
                        "Eşleme bekleyen satırlar kırmızı, eşlenmişler yeşil görünüyor: solda renkli bir çubuk, bekleyende ayrıca hafif kırmızı bir zemin. Ekranın işi ayıklama — hangisine müdahale edileceği tek bakışta görünmezse, kişi kelime kelime sütun okumak zorunda kalıyor. ⚠ Renk tek başına bırakılmadı: rozet aynı şeyi yazıyla da söylüyor, çünkü kırmızı-yeşil ayırt edemeyen biri için renk bir sinyal değildir.",
                        "«Geçmiş veri» altına ikinci sayfa: «Personel listesi». Devralınan 2.381 belgenin tamamı burada. Kimlik numarası ve telefon MASKELİ görünüyor, listedeki firma adı Excel'de nasıl yazıyorsa öyle duruyor, eğitim yeri ayrı bir sütun (istenirse açılıyor).",
                        "⛔ Toplu kimlik numarası araması: firmanın gönderdiği listeyi olduğu gibi yapıştırıyorsunuz — isimler, başlıklar, virgüller fark etmiyor — ve aradan 11 haneli numaralar ayıklanıp tek seferde aranıyor. Kırk kişiyi tek tek aramak bir arama değil, bir öğleden sonradır.",
                        "Seçilen kayıtlar bir firmaya TASLAK olarak bağlanıyor: kişi oluşmuyor, davet gitmiyor. Yanlış bağlanan geri alınabiliyor ve kayıt bağlanmamış havuza dönüyor. Firma doğruladıysa geri alınamıyor. ⚠ Zaten bağlı bir kayıt seçiliyse işlem TAMAMEN reddediliyor — kırk kayıttan otuz sekizini bağlayıp ikisini sessizce atlamak, kişiye kırkının da bittiğini düşündürürdü.",
                        "Aynı kimlik numarası birden fazla firmada görünüyorsa satır bunu BİLGİ olarak yazıyor. Sistem hangisinin doğru olduğuna karar vermiyor: bu, tabloda olmayan bir bilgidir ve müşteriyle konuşan insan karar verir."
                    ]
                },
                "altyapi": {
                    "added": [
                        "İzmir'deki Akademi'den devralınan eğitim geçmişinin duracağı üç tablo kuruldu: belgeler, eğitim adlarının eşlemesi ve firma reddleri. Henüz veri yüklenmedi.",
                        "Kimlik numaraları şifreli saklanıyor ve arama şifreyi çözmeden yapılıyor — bir firma «şu kişiler sizden eğitim almış mıydı» diye kırk kimlik numarası gönderdiğinde cevap buradan çıkacak.",
                        "Aynı belgenin iki kez girmesi veritabanı düzeyinde engellendi (kişi + eğitim adı + tarih). Yakında gelecek 10 yıllık dosya bugünkü iki yılı da içerdiği için bu şart.",
                        "Sertifikalara üçüncü bir kaynak türü eklendi: «devralınan geçmiş». Bugüne kadar iki tür vardı — bizim verdiğimiz eğitimden çıkan ve firmanın kendi beyan ettiği. Bu üçüncüsü ikisinden de farklı: bizim kaydımız ama devraldığımız bir geçmiş, ve ekranlarda «bakanlıktan doğrulayın» uyarısı buna bağlanacak.",
                        "Geçmiş veri araması işlem günlüğüne yazılıyor: hangi koşullar sorulmuş ve kaç kayıt dönmüş. ⚠ Yapıştırılan kimlik numaraları SAYIYA indirgeniyor — numaraların kendisi loga yazılsaydı, korumaya çalıştığımız veriyi silinemeyen bir tabloya kopyalamış olurduk.",
                        "Sertifika kaydında `source` alanı veritabanı düzeyinde kısıtlı ve yalnız iki değer tanıyordu; üçüncüsü («devralınan geçmiş») eklendi. İlk geçmiş sertifikayı veritabanı reddetti — o kısıt tam bunun için var."
                    ]
                },
                "musteri": {
                    "added": [
                        "Müşteri paneline yeni sayfa: «3E'den daha önce eğitim almış personeliniz». 3E'nin devraldığı eğitim geçmişinde firmaya ait olduğu tespit edilen kişiler burada listeleniyor — KİŞİ bazında, belge bazında değil. Bir kişinin on belgesi olabiliyor; belge listesi olsaydı firma aynı ismi sekiz kez görür ve hangi satıra cevap vereceğini bilemezdi.",
                        "Firma her kişi için üç şeyi söylüyor — bizim bilemeyeceğimiz üç şey: e-posta (devraldığımız listede hiç yok), nerede çalıştığı, ve hâlâ orada olup olmadığı. Kimlik numarası ve telefon maskeli görünüyor; telefon, ismin yanında «evet bu bizim Ahmet» dedirten tek ipucu.",
                        "«Bu kişi bizde çalışmıyor» düğmesi: kişinin belgeleri listeden çıkıp 3E'ye geri dönüyor ve kimin reddettiği kaydediliyor. Yanlış eşleştirmenin bize ulaştığı tek kanal bu — devraldığımız listede firma adı serbest metin ve 912 satırda hiç yok, dolayısıyla yanlış eşleşme kaçınılmaz.",
                        "Kaydedene kadar hiçbir kişi oluşmuyor. Kaydedildiğinde: personel listesine ekleniyor, geçmiş sertifikaları işleniyor ve davet gidiyor. ⚠ Kimlik numarası zaten listede kayıtlıysa İKİNCİ bir kayıt açılmıyor, belgeler mevcut kişiye ekleniyor — ve firmanın kendi kaydı korunuyor: adı, telefonu, e-postası eski listeden gelen bilgiyle EZİLMİYOR.",
                        "Eksik olanlar gizlenmiyor, düzeltilmesi isteniyor: eğitim tarihi olmayan belge (155 satır) ve algoritmayı tutmayan kimlik numarası, kaydetmeden önce ekranda soruluyor. Kimlik numarası özellikle şart — kişinin listede zaten olup olmadığını anlamanın tek yolu o."
                    ]
                },
                "planlama": {
                    "added": [
                        "Uyum sorgusunda ve müşterinin personel listesinde, devralınan geçmişten gelen sertifikaların yanında «geçmiş veriden geliyor — lütfen bakanlıktan doğrulayın» uyarısı çıkıyor. Sebep: o sertifikanın tarihi BİZİM eğitim tarihimiz, geçerlilik bitişi de katalogdaki yenileme süresinden hesaplandı — kimse bir belgeye bakıp yazmadı. Satışçı bir firmayı arayacaksa bunu bilmeli."
                    ]
                }
            }
        },
        {
            "title": "Teklif onaylandıktan sonra firmanın katılımcı ekleyeceği yer yoktu",
            "tickets": [
                "EGT-140"
            ],
            "changes": {
                "musteri": {
                    "fixed": [
                        "Teklif onaylanıyor, koltuklar tahsis ediliyor, fatura kesilebiliyordu — ama eğitim firmanın kendi panelindeki eğitim listesine hiç düşmüyordu. Katılımcı ekleme kutusu o listedeki eğitimin sayfasında olduğu için firma personelini hiçbir yerden ekleyemiyordu: kapalı eğitim «bu eğitim size ait değil» diyordu, açık eğitim ise listede yoktu. Onay artık eğitimi firmaya bağlıyor.",
                        "Kontenjanı teyit edilmemiş bir teklif satırı bağlanmıyor. O satır henüz bir yer satmadı; firmayı olmayan koltukları doldurmaya çağırmak olurdu.",
                        "Onaylanmış teklif ekranı artık sıradaki adımı söylüyor: «Sırada: katılımcı listesi» kutusu teklifteki her eğitimi, tarihini ve kaç kişinin eklendiğini gösteriyor, tıklayınca katılımcı ekranına götürüyor. Eskiden ekran «Onaylandı» rozetini basıp susuyordu.",
                        "Firma gündemindeki «Yaklaşan eğitimler» listesi artık kaç personelin kayıtlı olduğunu yazıyor; hiç kimse eklenmemişse bunu iş olarak söylüyor ve ekleme ekranına bağlıyor. Sayı tasarımda vardı, ekranda boştu.",
                        "Kişi başı fiyatla satılan eğitimde firma, satın aldığı kişi sayısından fazlasını artık ekleyemiyor: altıncı kişi «bu teklifte 5 kişilik yer var ve hepsi dolu» diyerek reddediliyor. Eskiden hiçbir sınır yoktu — 5 kişilik teklif onaylayan firma, eğitimin kontenjanı elverdiği sürece 20 kişi ekleyebiliyordu. ⚠ Günlük fiyatla satılan eğitimde böyle bir sınır YOK ve olmayacak: orada satılan şey bir günlük eğitimdir, kaç kişi geleceği firmanın kararıdır ve fiyat değişmez."
                    ]
                },
                "satis": {
                    "changed": [
                        "Günlük fiyatlı kalem eklerken «Beklenen kişi sayısı» alanı çıkıyor ve miktar alanının adı «Gün sayısı» oluyor. Günlük satırda miktar GÜN'dür; kaç kişi geleceğini yazacak bir yer hiç yoktu, dolayısıyla salonun kaç sandalyeye ihtiyacı olduğu eğitim sabahı öğreniliyordu. Sayı fiyatı etkilemez ve kimseyi engellemez.",
                        "Sayı sonradan değişirse (önce 4 demişlerdi, 6 oldu) satışçı eğitim ekranından güncelliyor — onaylanmış teklif yeniden gönderilmiyor. Teklif belgesi bir kanıttır ve içindeki sayı sonradan değiştirilmez; yaşayan sayı eğitim ile firma bağında durur. Değişiklik işlem günlüğüne kimin yaptığıyla birlikte yazılır.",
                        "Eğitim ekranındaki katılımcı bölümünün üstünde her firma için «beklenen / eklenen» satırı var; ikisi tutmuyorsa satır sarıya dönüyor. Kutuyu hem satışçı hem planlamacı düzenleyebiliyor — satışçının planlama yetkisi yoktur, telefonda konuşulan sayıyı yazacak kişi odur.",
                        "Onay takibi yardım makalesine onaydan sonrasının müşterinin işi olduğunu ve kontenjanı teyit edilmemiş satırın firmaya açılmadığını anlatan adım eklendi; teklif hazırlama ve eğitim planlama makaleleri de yeni alanı anlatıyor."
                    ]
                },
                "planlama": {
                    "added": [
                        "Eğitim ekranındaki katılımcı bölümünün üstüne firma başına «beklenen kişi / eklenen kişi» satırı geldi; ikisi tutmuyorsa satır sarıya dönüyor. Salon, eğitmen ve ikram beklenen sayıya göre ayarlandığı için fark görünür olmalıydı — günlük fiyatla satılan bir eğitimde bu sayı hiçbir yerde durmuyordu ve kaç sandalye gerektiği eğitim sabahı öğreniliyordu.",
                        "Sayıyı planlamacı da satışçı da değiştirebiliyor; kimseyi engellemiyor, yalnız bilgidir. Değişiklik işlem günlüğüne kimin yaptığıyla yazılıyor.",
                        "Eğitim planlama yardım makalesine bu satırı okumayı anlatan adım eklendi."
                    ]
                }
            }
        },
        {
            "title": "Geçmiş veri ekranı: tarih yazan ilk kişide beyaz sayfa, sertifika kartında isim yerine tire",
            "tickets": [
                "EGT-108"
            ],
            "changes": {
                "musteri": {
                    "fixed": [
                        "«3E'den daha önce eğitim almış personeliniz» ekranı, tarihi olan ilk belgeyi çizerken patlıyor ve sayfa boş kalıyordu: tarih biçimleyicisi gün nesnesi bekliyor, ekran ise tarihi metin olarak veriyordu. Tarayıcıda ölçüldü; testler ekranın verisini doğruluyordu ama çizimini değil.",
                        "Sertifika kartı, kişi adı ve eğitim adı yerine «—» gösteriyordu. Kart bu iki bilgiyi yalnız eğitim kaydı üzerinden okuyordu; üç kaynaktan ikisinde (firmanın kendi beyan ettiği belge ve devraldığımız geçmiş) böyle bir kayıt hiç yok. Artık sertifikanın kendi satırındaki kişi ve donmuş eğitim adı okunuyor — bu, geçmiş verinin yanında firmanın beyan ettiği sertifikaları da düzeltir; ikisi de bugüne kadar isimsiz görünüyordu.",
                        "«Geçmiş veriden geliyor — lütfen bakanlıktan doğrulayın» rozeti Sertifikalar ekranına da kondu. Tarihlerin okunduğu yer burasıydı ve rozet tam da o tarihler için var."
                    ]
                },
                "omurga": {
                    "fixed": [
                        "Geçmiş veri tablolarının sekiz yabancı anahtar kolonuna indeks eklendi. PostgreSQL yalnız işaret edilen tarafı indeksler; indekssiz kolon hem her birleştirmede hem de bağlı kaydın silinmesinde tabloyu baştan sona tarar."
                    ]
                }
            }
        },
        {
            "title": "Aynı tarayıcıdan ikinci bir firmanın hesabına girişte 500",
            "tickets": [
                "EGT-141"
            ],
            "changes": {
                "musteri": {
                    "fixed": [
                        "Bir firmanın hesabına girdikten sonra çıkmadan başka bir firmanın hesabına girmeye çalışıldığında müşteri paneli 500 veriyordu. Firma numarası oturuma girişten SONRA yazılıyordu; oysa giriş anında denetim kaydı 'kim giriş yaptı' diye soruyor ve bu soru firmayı oturumdan okuyor — yani bir önceki girişten kalan firmayı. Numara artık girişten ÖNCE yazılıyor. Aynı düzeltme şifresiz (bağlantılı) girişe de yapıldı.",
                        "Veri sızmıyordu: kapıyı kapatan şey kiracı kapsamı denetiminin ta kendisiydi. Kaybedilen şey girişti — kullanıcının çerezlerini silmekten başka çıkışı yoktu."
                    ]
                }
            }
        },
        {
            "title": "Geçmiş personel listesi: kimlik ve telefon açık, kişi bazında görünüm ve «Detay»",
            "tickets": [
                "EGT-108"
            ],
            "changes": {
                "backoffice": {
                    "changed": [
                        "Kimlik numarası ve telefon artık maskesiz gösteriliyor. Maske kimseden bir şey saklamıyordu: ekranın kendi süzgeci zaten kimlik numarasıyla arıyor, yani numarayı bilen satırı bulabiliyordu — maskenin tek yaptığı, telefonla firmayı arayacak kişinin numarayı okuyamaması oldu. Dosya 3E'nin kendi kayıtları. Koruyan şeyler yerinde: bu ekranı yalnız «geçmiş veriyi görüntüleme» yetkisi olan görüyor ve her okuma erişim günlüğüne yazılıyor."
                    ],
                    "added": [
                        "«Kişi bazında göster» kipi: aynı kişinin bütün belgeleri tek satırda toplanıyor, yanında kaç belgesi ve kaç ayrı firma adı altında göründüğü yazıyor. Karar kişi bazında veriliyor, dosya ise belge bazında yazılmış — 2.381 satır 1.040 kişi ve bir kişi on belgeye kadar çıkıyor.",
                        "Tekil satırdaki «Detay», o kişinin kimlik numarasıyla süzülmüş belge listesini açıyor. Bu yol da erişim günlüğüne yazılıyor; kolay yol günlüksüz olsaydı herkesin kullandığı yol günlüksüz olurdu.",
                        "Tekil satırın durumu, karar bekleyeni öne alıyor: dokuz belgesi onaylı bir kişinin onuncusu bekliyorsa satır «bağlanmadı» der."
                    ]
                }
            }
        },
        {
            "title": "Geçmiş personel listesinde durum adları, tekilleştirme düğmesi ve kolon başlıkları",
            "tickets": [
                "EGT-108"
            ],
            "changes": {
                "backoffice": {
                    "changed": [
                        "Durum adları kimin sırası olduğunu söyleyecek şekilde değişti: «Bağlanmadı» → «Firması belli değil», «Firmaya bağlandı» → «Firma onayı bekliyor», «Firma doğruladı» → «Firma onayladı», «Firma reddetti» → «Firma «bizde değil» dedi». Eskisi iki farklı adımı da «bağlı» diye anlatıyordu; oysa biri 3E'nin peşine düşmesi gereken satır, diğeri arkasında gerçek bir kişi ve sertifika olan bitmiş iş.",
                        "«Kişi bazında göster» süzgeç panelinden çıkıp arama kutusunun yanına, üst çubuğa taşındı; düğmenin yazısı ve ikonu kipe göre dönüyor ve kip adres satırında duruyor, yani sayfa yenilenince kaybolmuyor. Bir kip satırı daraltmaz, satırın ne olduğunu değiştirir — panel içinde açılıp «Uygula»ya basılacak bir şey değildi.",
                        "«Bu kimlik başka firmalarda da görünüyor» başlığı «Diğer firmalar» oldu, açıklaması tooltip'e taşındı — uzun başlık tabloyu yana kaydırıyordu. Kişi kipindeki «Belge» ve «Firma adı» sayaçlarına da tooltip eklendi."
                    ]
                }
            }
        },
        {
            "title": "E-posta bağlantısıyla giren 404 alıyordu; katılımcılara ayrı giriş sayfası açıldı",
            "tickets": [
                "EGT-143",
                "EGT-145"
            ],
            "changes": {
                "musteri": {
                    "fixed": [
                        "«Bana giriş bağlantısı gönder» ile giren kişi, kimlik sorusunu doğru cevapladıktan sonra 404 alıyordu. Herkes eğitim günü ekranına gönderiliyordu; o ekran yalnız bir eğitime kayıtlı kişiler için var ve başkasına «bulunamadı» diyor. Firma yöneticisi böylece başarıyla giriş yapıp hiçbir yere varamıyordu — bağlantıyla açılan oturum firma paneline de giremez, bu bilinçli bir güvenlik kuralı (bağlantı iletilebilir bir şeydir).",
                        "Artık bir eğitime kayıtlıysa eskisi gibi eğitim günü ekranına gidiyor; değilse «Bağlantınız çalıştı — bu bağlantı eğitim gününüz içindir, firma panelinize şifrenizle girin» diyen bir sayfa görüyor ve oradan giriş ekranına geçebiliyor. Sayfa «hata» demiyor: bağlantı çalıştı, yanlış olan kapıydı."
                    ],
                    "added": [
                        "Katılımcılara ayrı giriş sayfası: /katilimci/giris. Yalnız e-posta ister, bağlantı gönderir, şifre sormaz. Firma paneli girişi ise yalnız şifre ile — oradaki bağlantı seçeneği kalktı, yerine «Eğitim günü girişi» yönlendirmesi kondu. İki sayfa birbirine bağlantı veriyor.",
                        "Sebep: müşteri tarafına iki farklı insan geliyor ve yalnız birinin şifresi var. Tek ekran, firma yöneticisine hiçbir yere götürmeyen bir kapı gösteriyor, eğitime gelen kişinin tek kapısını da dolduramayacağı bir şifre formunun altına gömüyordu."
                    ]
                }
            }
        },
        {
            "title": "Müşteri panelinde passkey ile giriş",
            "tickets": [
                "EGT-144"
            ],
            "changes": {
                "musteri": {
                    "added": [
                        "Firma paneline artık passkey ile girilebiliyor: parmak izi, Face ID veya cihaz kilidi. Şifre ve doğrulama kodunu tek adımda çözüyor, yani telefona uygulama kurma zorunluluğu kalkıyor — daha önce şifreyle giren herkes bir doğrulama uygulaması kurmak zorundaydı.",
                        "Güvenlik ekranına «Passkey» kartı eklendi: cihaz ekleme, listeleme ve silme. Ekleme ve silme, ekranın geri kalanıyla aynı şifre penceresinin arkasında — çalınmış bir oturumdan passkey eklemek, hesabı süresiz elde tutmanın sessiz yoludur ve hiçbir şifre değişikliği onu silmez.",
                        "Passkey ile açılan oturum ikinci faktör istemez: cihaz, anahtarı vermeden önce kişiyi zaten doğruluyor — «sahip olduğun şey» ile «olduğun şey» tek adımda kanıtlanıyor."
                    ]
                },
                "altyapi": {
                    "added": [
                        "Müşteri passkey'leri kendi tablosunda ve kendi firmasında duruyor: satır güvenliği açık, her kayıt firmasını taşıyor. Ofis ve backoffice passkey tablolarının firması yok çünkü o hesapların da yok; aynı şekli kopyalamak kimlik bilgilerini kiracılığın dışına çıkarırdı.",
                        "Giriş anında kimlik bilgisi, firma bilinmeden bulunmak zorunda — soru zaten «bu hangi firmanın» olduğu için. Şifre girişindeki ve bağlantı girişindeki gibi dar bir veritabanı kapısı yazıldı: dört kolon döndürüyor (kayıt, firması, sahibi ve doğrulamada kullanılan açık anahtar), kişiye dair hiçbir şey döndürmüyor."
                    ]
                }
            }
        },
        {
            "title": "Sözleşmeler ekranında belge adları yerine ham anahtarlar görünüyordu",
            "tickets": [
                "EGT-146"
            ],
            "changes": {
                "musteri": {
                    "fixed": [
                        "Sözleşmeler ekranı belge adları yerine «legal_text.keys.cerez_politikasi» gibi ham anahtarlar gösteriyordu. Sistemde on hukuki belge var, sözlükte yalnız birinin adı yazılıydı; çeviri bulunamayınca anahtarın kendisi basılıyor — yani eksik metin, hata gibi değil ekran gibi görünüyor. On belgenin hepsi Türkçe ve İngilizce adlandırıldı.",
                        "Bir daha olmaması için test yazıldı: sistemdeki her hukuki belgenin iki dilde de adı olmak zorunda. Aynı sınıf hata yetki ekranında da çıkmıştı (EGT-139); ikisini de artık test yakalıyor."
                    ]
                }
            }
        },
        {
            "title": "«3E'den eğitim almışlar» ekranının menüde girişi yoktu",
            "tickets": [
                "EGT-108"
            ],
            "changes": {
                "musteri": {
                    "fixed": [
                        "Geçmiş veri ekranı yazıldı, test edildi ve canlıya çıktı — ama menüye konmamıştı; adres çubuğuna yazmadan ulaşılamıyordu. «Ekibim» grubuna «3E'den eğitim almışlar» kalemi eklendi.",
                        "Kalem yalnız cevaplanacak kişi varken görünüyor. Bu, 3E'nin bir kez sorduğu bir soru; son kişi de cevaplandığında arkasında bir şey kalmıyor ve sürekli boş duran bir menü satırı insanlara o satırı görmezden gelmeyi öğretir."
                    ]
                }
            }
        },
        {
            "title": "Personel eklerken evrak sorulmuyordu, kimseye görev açılmıyordu",
            "tickets": [
                "EGT-147"
            ],
            "changes": {
                "musteri": {
                    "added": [
                        "Personel ekleme sayfasında her evrak için üç cevap: «Şimdi yükle», «Ben yükleyeceğim», «Personel yüklesin». Son ikisi görev açıyor — son tarihiyle birlikte. Eğitmen ekleme ekranında yıllardır işleyen çözümün aynısı; müşteri tarafında hiç yoktu.",
                        "«Şimdi yükle» seçilince evrakın kendi alanları soruluyor: belge numarası, veren kurum, veriliş tarihi, geçerlilik bitişi. Hangi alanların çıkacağını evrak türünün kendi tanımı söylüyor — bu anahtarlar aylardır açıktı ve hiçbir müşteri ekranı okumuyordu, dolayısıyla sağlık raporu dolmayan bir belge, diploma numarasız bir kağıt olarak kaydediliyordu.",
                        "Panoya «Sizi bekleyenler» kartı: kişinin kendi görevleri, hangi personelin hangi evrakı ve son tarihi. Gecikenler kırmızı. Görev açmak tek başına yetmiyordu — müşteri panelinde görevin görüneceği hiçbir yer yoktu, yani hatırlatma yazılıp kimsenin açamayacağı bir yere konuyordu.",
                        "Geçmiş veriden onaylanan kişiler için de aynı görevler açılıyor; onların diploması, kimliği ve sağlık raporu da eksik doğuyor.",
                        "«Personel yüklesin» yalnız o evrakı personelin yükleyebildiği türlerde çıkıyor. Kapalıysa görev firma yetkilisine kalıyor — kapatamayacağı bir görev, hiç görev olmamasından kötüdür."
                    ],
                    "changed": [
                        "Evrak yükleme talebi artık dosyanın yanında ne söylediğini de alıyor. Zorlama yok: boş bırakılan alan yazılmıyor, cevaplanmayan evrak için kimseye görev açılmıyor — kişi yine de oluşuyor."
                    ]
                },
                "altyapi": {
                    "added": [
                        "Katılımcı evrakına «veren kurum» kolonu eklendi; evrak türlerinin üçü bunu istiyordu ve yazacak yer yoktu."
                    ]
                }
            }
        },
        {
            "title": "Evrak bölümünün adı, önceki sertifikanın yeri ve sertifika kopyası",
            "tickets": [
                "EGT-147"
            ],
            "changes": {
                "musteri": {
                    "changed": [
                        "«Zorunlu evraklar» başlığı «Evraklar» oldu. Hiçbiri zorunlu değil — başlık, ekranın yaptığı işi yanlış anlatıyordu.",
                        "«Önceki sertifika» evrak listesinden çıktı. Hemen üstünde zaten kişinin elindeki sertifikaları soran bir bölüm vardı; aynı belge iki ayrı yerde isteniyordu ve iki yer birbirinden farklı şey söyleyebilirdi. O bölümün adı da «Sertifikalar» oldu.",
                        "Sertifika satırına belgenin kopyası eklenebiliyor. Kopya, numarası ve tarihleri satırdan alarak aynı evrak türü altında saklanıyor — tek satır, tek doğru. Belge türü silinmedi; değişen, ekranın onu nerede sorduğu."
                    ]
                }
            }
        },
        {
            "title": "Geçmiş personel onayı, kendi çekmecesi yerine personel ekleme sayfasına devredildi",
            "tickets": [
                "EGT-108",
                "EGT-147"
            ],
            "changes": {
                "musteri": {
                    "changed": [
                        "«3E'den eğitim almışlar» ekranındaki «Kaydet», artık kendi çekmecesini açmıyor; kişiyi personel ekleme sayfasına devrediyor. O çekmece kişi oluşturmak için gerekenin yarısını soruyordu — evrak yok, görev yok, sertifika numarası yok — ve iki ayrı ekranın kişi oluşturması, birbiriyle uyumlu tutulması gereken iki ekran demekti.",
                        "Ekleme sayfası devraldığı kişinin bilgilerini kendisi dolduruyor: adı, belgeleri, tarihleri. Tarihler değiştirilebiliyor — dosya yıllar öncesine ait ve 155 satırda tarih hiç yok. Kimlik numarası, dosyadaki numara kendi doğrulamasından geçmiyorsa BİLEREK boş geliyor: zorunlu bir kutuda duran geçersiz numara «bu doğru» gibi okunur.",
                        "Aynı kaydetme hem kişiyi oluşturuyor hem geçmiş kayıtları ona bağlıyor. Kişi ikiye bölünmüyor: onay, formun az önce yazdığı kimlik numarasından kişiyi buluyor."
                    ],
                    "added": [
                        "Devralınan her belge için gerçek sertifika numarası sorulabiliyor — spec'te yazılıp yapılmamış adım. Boş bırakılırsa bizim ürettiğimiz «GEÇMİŞ-000123» kalıyor; devraldığımız dosya sertifika numarası taşımıyor ve gerçekçi görünen uydurma bir numara sahtecilik olurdu."
                    ]
                }
            }
        },
        {
            "title": "Devralınan kişinin kimlik numarası ve telefonu forma taşınmıyordu",
            "tickets": [
                "EGT-108"
            ],
            "changes": {
                "musteri": {
                    "fixed": [
                        "Geçmiş personel ekranından devredilen kişinin kimlik numarası ve telefonu, ekleme formuna boş geliyordu. Liste ekranı ikisini de maskeliyor — kırk ismin arasından geçen bir listede doğru olan bu — ama devir, firmanın sorumluluğunu üstlendiği TEK kişinin oluşturulduğu form. Firma o numarayı hiç görmedi: numara 3E'nin devraldığı dosyadan geliyor. Maskelemek kişiyi korumuyor, formu doldurulamaz hâle getiriyordu. Artık ikisi de dolu geliyor ve değiştirilebiliyor.",
                        "Dosyadaki numara kendi doğrulamasından geçmiyorsa da artık boş gelmiyor: numara yazılıyor ve kutunun üstünde neden kontrol edilmesi gerektiği söyleniyor. «Şunu düzelt», «şunu bul»dan küçük bir iştir."
                    ]
                }
            }
        },
        {
            "title": "Geçmiş veride kişi değil belge bağlanıyordu",
            "tickets": [
                "EGT-108"
            ],
            "changes": {
                "backoffice": {
                    "fixed": [
                        "Bir kişinin belgelerinden yalnız seçilenler firmaya bağlanıyordu; aynı kişinin diğer belgeleri havuzda kalıyordu. Sonuç: bir insan iki hâlde birden duruyordu — 2025 sertifikası firma tarafından onaylanmış, 2019 ve 2016 belgeleri «firması belli değil» olarak öksüz kalmış, ve iki ekranın hiçbiri bunların aynı kişi olduğunu söylemiyordu.",
                        "Verilen karar «bu KİŞİ o firmanın» olduğu için bağlama da artık kişiyi bağlıyor: bir satır seçildiğinde aynı kimlik numarasının bekleyen bütün satırları o firmaya gidiyor. Bağı kaldırmak da aynı şekilde kişinin tamamını geri alıyor — yarısı bağlı, yarısı serbest bir insan okunabilir bir durum değil.",
                        "Başka bir firmanın ONAYLADIĞI belge yerinden kımıldamıyor. İnsanlar iş değiştirir; iki firmanın aynı kişiye dair kaydı da doğrudur ve birinin cevabını diğerine taşımak bize düşmez."
                    ]
                }
            }
        },
        {
            "title": "Onaylanmış kişinin diğer geçmiş belgeleri firmadan tekrar onay bekliyordu",
            "tickets": [
                "EGT-108"
            ],
            "changes": {
                "backoffice": {
                    "fixed": [
                        "Firma bir kişiyi onayladıktan sonra o kişinin sonradan bağlanan belgeleri «firma onayı bekliyor» durumunda kalıyordu. Oysa firma bir KİŞİ hakkındaki soruyu cevaplamıştı: «bu sizin personeliniz mi». Aynı kişinin 2019'daki kursunu tekrar sormak, cevapladıkları bir soruyu yeniden sormaktı — kişi zaten personel listelerinde, sertifikasıyla birlikte duruyorken.",
                        "Artık o belgeler kişiye yazılıyor: sertifikası oluşuyor, eğitim tarihinden tarihleniyor, geçerliliği katalogdan hesaplanıyor. Kimse oluşturulmuyor — bu yalnız firmanın zaten oluşturduğu bir kişi için işliyor.",
                        "Eşleşmemiş yazımı olan belge bekliyor kalıyor: adı olmayan bir eğitimin geçerlilik süresi de yoktur, ve uydurma bitiş tarihi taşıyan bir sertifika bekleyen bir satırdan kötüdür. Aynı şey eşleme yapıldığı anda da işliyor — «IMSBC KOD» eşlendiği anda onu bekleyen kişilerin belgeleri kendiliğinden işleniyor."
                    ],
                    "added": [
                        "Eğitim adı eşleme ekranına «Bekleyen» sütunu: o yazım eşlenmediği için kaydedilemeyen, firmaya bağlı kayıt sayısı. Sıfırdan büyükse bir firma tam o yüzden bekliyor demektir — otuz altı satırlık listede hangisinin acil olduğu artık görünüyor."
                    ]
                },
                "musteri": {
                    "changed": [
                        "«Bir belgesi eşleştirilmedi» uyarısı artık hangi belge olduğunu yazıyor. Öncesi, firmayı kendi belgelerini saymaya gönderiyordu."
                    ]
                }
            }
        },
        {
            "title": "Devralınan eğitim geçmişi sisteme yüklendi",
            "tickets": [
                "EGT-108"
            ],
            "changes": {
                "backoffice": {
                    "added": [
                        "3E'nin devraldığı akademinin eğitim geçmişi sisteme kondu: 2.381 satır, 1.041 kişi, 36 farklı belge yazımı, 16.01.2024 – 06.05.2026 aralığı. Kayıtların tamamı «firması belli değil» olarak duruyor; eşleştirmeyi insan yapacak.",
                        "Yükleme elle değil seeder ile yapıldı: pazartesiki sıfırlamadan sonra aynı iş tekrar edilmeyecek. İkinci kez koşturulduğunda hiçbir şey yazmıyor — aynı kişi, aynı yazım ve aynı tarih aynı belgedir.",
                        "Dosyadaki 38 satır birebir tekrardı (aynı kişi + aynı yazım + aynı tarih) ve tek kayıt olarak alındı. Bir kimlik numarası kendi doğrulamasından geçmiyor ve öyle işaretlendi; 155 satırda tarih yok, hiçbir satırda e-posta yok — üçü de ekranların sorduğu sorular.",
                        "Hiçbir yazım düzeltilmedi. «Y-MARPOL 73/79» ile «Y-MARPOL 73/98» arası yirmi dört yazım büyük ihtimalle 73/78'in yazım hatası, ama birinin sertifikasının hangi eğitim olduğu bizim varsayacağımız bir şey değil — eşleme ekranında insan karar verecek."
                    ]
                }
            }
        },
        {
            "title": "Eğitim adı eşlenmeden kişi firmaya bağlanamıyor",
            "tickets": [
                "EGT-108"
            ],
            "changes": {
                "backoffice": {
                    "changed": [
                        "Eğitim adı eşlenmemiş bir kaydı firmaya bağlamak artık reddediliyor (Sets: «eşleştirmeler yapılmadan personel ataması yapamasınlar»). Eşlenmemiş yazımın ne eğitimi olduğu belli değildir, geçerlilik süresi de hesaplanamaz; öyle bir kaydı firmaya vermek, onlara kaydedemeyecekleri bir satır ve yalnız bizim cevaplayabileceğimiz bir soru vermektir.",
                        "Ret, hangi yazımların eşlenmesi gerektiğini adıyla söylüyor. «Eşleme eksik» demek insanı otuz altı satırın içinde aratır; adını yazmak doğrudan o ikisine gönderir.",
                        "Bağlama kişinin tamamını aldığı için kontrol de tamamına bakıyor: kişinin dört belgesinden biri eşlenmemişse üçü de bağlanmıyor."
                    ]
                }
            }
        }
    ]
}