{
    "date": "2026-08-22",
    "entries": [
        {
            "title": "Müşteri ekleme bölümü geri geldi: hiç firma yokken de görünüyor",
            "tickets": [
                "EGT-191"
            ],
            "changes": {
                "satis": {
                    "fixed": [
                        "Ofis panelinde Müşteriler menüsü ve listesi görünmüyordu. Sebep: ikisi de «bu kişi en az bir firmaya erişiyor mu» sorusuna bağlıydı ve canlı temizlikten sonra hiç firma kalmadığı için cevap herkeste «hayır» oldu — ilk firmayı girecek kişi dahil. Yani firma eklemek için firma gerekiyordu.",
                        "Soru artık ters sırayla soruluyor: bu kişi firmaların hepsini görebiliyor mu, ya da yeni firma ekleyebiliyor mu? Öyleyse boş liste bir cevaptır, ret değil. Kendisine firma atanmış ama geniş yetkisi olmayan satışçı için kural aynen duruyor."
                    ]
                }
            }
        },
        {
            "title": "Süresi dolan davet yeniden gönderilebiliyor; ofis daveti bir hafta geçerli",
            "tickets": [
                "EGT-193"
            ],
            "changes": {
                "backoffice": {
                    "added": [
                        "Ofis kullanıcısının kartında «Daveti Yeniden Gönder» düğmesi var artık. Daha önce davet yalnızca hesap açılırken bir kez gidiyordu; süresi dolduğunda o hesaba ulaşmanın hiçbir yolu kalmıyordu.",
                        "Yeni davet gönderilince eski bağlantı aynı anda geçersiz oluyor. Tek hesaba iki açık kapı, biri de artık kimsenin olmayabilecek bir posta kutusunda duran kapı, çözdüğünden büyük bir açıklık olurdu.",
                        "Düğme yalnız daveti henüz kabul etmemiş hesaplarda çıkıyor. Parolası olan bir hesapta bu bağlantı, eski parolayı bilmeden yenisini koymanın yolu olurdu; onun cevabı kişinin kendi isteyeceği parola sıfırlamadır."
                    ],
                    "changed": [
                        "Ofis davetinin geçerlilik süresi 24 saatten 7 güne çıkarıldı. Bu yeni bir sayı değil: müşteri tarafında zaten 7 gündü ve aynı gerekçeyle uzatılmıştı. Ofis tarafı bir günde kalmıştı, yani aynı kişi hangi panelden davet edildiğine göre iki farklı kuralla karşılaşıyordu. Süre yine de yönetici ayarıdır, İş ayarları ekranından değiştirilir."
                    ]
                }
            }
        },
        {
            "title": "Backoffice hesabına davet gönderilebiliyor",
            "tickets": [
                "EGT-190"
            ],
            "changes": {
                "backoffice": {
                    "added": [
                        "Backoffice kullanıcı listesinde «Davet gönder» eylemi var artık. Hesap açılıyor ama kişinin girebileceği hiçbir yol olmuyordu: hesap bilerek kimsenin bilmediği rastgele bir parolayla açılıyor (hesabı açan kişi asla parolayı bilmez) ve bunu izlemesi gereken davet akışı hiç yazılmamıştı. Canlıda iki hesap «hiç giriş yapılmamış» halde duruyordu.",
                        "Gönderilen şey bir bağlantıdır, parola değil: düğmeye basan kişi de dahil kimse hesabın parolasını öğrenmez. İşlem günlüğüne yazılır.",
                        "Backoffice giriş ekranına «parolamı unuttum» yolu da açıldı — panelde bu da yoktu. Altyapısı zaten hazırdı, yalnız açılmamıştı."
                    ]
                }
            }
        },
        {
            "title": "Var olan bir kişiye eğitmen dosyası açılabiliyor: tek hesapla hem yönetici hem eğitmen",
            "tickets": [
                "EGT-192"
            ],
            "changes": {
                "operasyon": {
                    "added": [
                        "Kullanıcı kartında «Eğitmen Dosyası Aç» var artık: kategori, bakanlık eğitmen numarası, sertifika geçerliliği, görevli olduğu kuruluş sayısı, ücret ve verebileceği eğitimler girilir.",
                        "Daha önce eğitmen dosyası yalnızca hesap AÇILIRKEN açılabiliyordu. Sonucu canlıda görüldü: hem yöneticilik hem eğitmenlik yapan kişiye ikinci bir hesap açmak gerekti — iki posta kutusu, iki yetki kümesi ve hangisinin eğitim verdiğini söyleyemeyen bir kadro listesi.",
                        "Dosya açmak kişinin hesabını, yetkilerini ve organizasyondaki yerini değiştirmez. Aynı şekilde eğitmen grubunda olmak da tek başına eğitmen dosyası vermez; ikisi ayrı kararlar.",
                        "Aynı kişiye ikinci dosya açılmıyor: iki dosya, kadro listesine hangisini okuyacağını sorardı."
                    ]
                }
            }
        },
        {
            "title": "Backoffice daveti gerçekten gidiyor; düğmenin adı da yerine geldi",
            "tickets": [
                "EGT-194",
                "EGT-195"
            ],
            "changes": {
                "backoffice": {
                    "fixed": [
                        "«Davet gönder» düğmesi ekranda kendi kod adını yazıyordu (authorization.backoffice_users.invite). Sebep: sözlük dosyasında aynı başlık iki kez açılmıştı ve ikincisi birincisinin üstüne yazıyordu — davetle ilgili dört satır sessizce kayboldu. Başlıklar birleştirildi; aynı hatanın bir daha sessizce geçmemesi için sözlükte tekrarlanan başlığı yakalayan bir kontrol eklendi (aynı hata Tedarikçiler sözlüğünde de duruyordu, o da temizlendi).",
                        "Davet düğmesi «gönderilemedi» diyordu ve gerçekten gönderilmiyordu. Bağlantı, uygulamada bulunmayan bir sayfaya göre kuruluyordu: backoffice paneli parola belirleme sayfasını kendi adresinde, imzalı bağlantıyla sunuyor. Davet artık o sayfaya giden imzalı bağlantıyı taşıyor.",
                        "Davet mektubu artık diğer bütün mektuplarla aynı Türkçe şablonda gidiyor; daha önce çerçevesi İngilizce olan hazır şablon kullanılacaktı."
                    ]
                }
            }
        },
        {
            "title": "Saatler çeyreğine kadar giriliyor; müfredat penceresi Türkçeleşti",
            "tickets": [
                "EGT-196"
            ],
            "changes": {
                "backoffice": {
                    "fixed": [
                        "Saat alanına 1,25 yazınca sistem sessizce 1,3 yapıyordu. Sebep veritabanıydı: saat alanları virgülden sonra tek basamak tutuyordu ve saatin onda biri altı dakika demek — kimse dersi altıda birlik dilimlere bölmüyor. Saat tutan alanların hepsi (eğitimin ilk/yenileme/sınav süresi, oturum süresi, müfredat konu saati, eğitmen hakediş saati ve fiyat bandı saati) artık iki basamak tutuyor; çeyrek saat yazılabiliyor. Girilmiş hiçbir değer değişmedi.",
                        "Fiyat bandı saati de ondalık oldu. Bant, eğitimin süresiyle eşleştirilen şeydir; tam sayı tutan bir bant, süresi çeyrekli olan eğitimin hiçbir zaman giremeyeceği bir banttır.",
                        "Müfredat sürümü penceresindeki düğmeler «training curriculum Oluştur» / «training curriculum düzenle» yazıyordu. Artık «Müfredat sürümü oluştur» / «Müfredat sürümünü düzenle».",
                        "Tarih kutuları tarayıcının kendi takvimini kullanıyordu ve o takvim biçimini tarayıcının diline göre seçiyor: İngilizce tarayıcıda 26 Temmuz 2019 tarihi 07/26/2019 diye, ay önde görünüyordu. Artık backoffice'teki bütün tarih kutuları gün.ay.yıl yazıyor — 26.07.2019. Kaybolan bir şey yoktu, tehlikeli olan da buydu: 07.06 ile 06.07 iki gerçek tarihtir ve okuyan hangisi olduğunu ayırt edemez."
                    ]
                }
            }
        },
        {
            "title": "Panelin «fiyat bandı» kartı artık bandın düzeltileceği ekrana götürüyor",
            "tickets": [
                "EGT-197"
            ],
            "changes": {
                "backoffice": {
                    "fixed": [
                        "Panel ekranındaki «Eğitim saatine karşılık gelen fiyat bandı» kartının «Düzelt» bağlantısı fiyat listelerini açıyordu — orada bandı düzeltecek bir satır yok. Artık fiyat bantları ekranını açıyor.",
                        "Kartın açıklaması da gerçeği yazmıyordu: saati hiçbir banda girmeyen eğitimin fiyatı «hesaplanamıyor» değil, listedeki EN UZUN banttan hesaplanıyor — yani teklife eksik bir tutar düşüyor ve ortada hata çıkmıyor. Metin bunu söylüyor ve düzeltmenin iki yolunu da yazıyor: bant eklemek ya da eğitimin saatini düzeltmek.",
                        "Canlıda bugün eksik olan tek satır bu: Görev 8 — Yükleme/istif planlarının hazırlanması 24 saat, en uzun bant ise 20 saat."
                    ]
                }
            }
        },
        {
            "title": "Eğitmen listesi ve durum ekranı, eğitmen sayısı arttıkça yavaşlamayacak",
            "tickets": [],
            "changes": {
                "operasyon": {
                    "fixed": [
                        "Eğitmen listesi ve «Eğitmen durumu» ekranı, her eğitmen için ayrı ayrı üç sorgu koşuyordu: kişinin belgeleri, kendisinden istenen belgeler ve zorunlu belge tiplerinin listesi. Üçüncüsü herkes için aynı listedir. Otuz eğitmenlik bir tabloyu çizmek doksan sorgu demekti.",
                        "Belge durumu artık listenin tamamı için tek seferde okunuyor; ölçüldü: on eğitmenle 38 sorgu yerine 11 sorgu, ve sayı eğitmen sayısıyla artmıyor.",
                        "Canlıda fark edilmemesinin sebebi veri: bugün tek bir eğitmen kayıtlı ve tek eğitmen üç sorgu demek. Hata geliştirme makinesinde yakalandı; kadro büyüdükçe ekranda görünecekti."
                    ]
                }
            }
        },
        {
            "title": "Kapanan hata ticket'ı artık Sentry kaydını da kapatıyor",
            "tickets": [],
            "changes": {
                "backoffice": {
                    "fixed": [
                        "Hata takibinin iki yarısı birbirinden ayrılmıştı: bot Sentry'deki her çözülmemiş hataya bir OPS kaydı açıyor, ama kayıt kapandığında Sentry tarafını hiçbir şey kapatmıyordu. Bugün sayıldı — 3e-egitim'in 24 açık Sentry kaydından 14'ü haftalar önce kapanmış ticket'lara aitti.",
                        "Bot artık her turun sonunda kapanmış ticket'ların Sentry kaydını da kapatıyor. Kapanmış sayma ölçütü YouTrack'in kendi damgası; «Fixed», «Duplicate», «Obsolete» hepsi aynı anlama gelir ve durum adı listesi tutulmuyor.",
                        "Kapatma «çözüldü» olarak yapılıyor, «yok say» olarak değil: aynı hata tekrar düşerse Sentry kaydı regresyon olarak kendiliğinden yeniden açılır. Yok sayılan kayıt sessiz kalırdı.",
                        "Biriken 17 kayıt elle temizlendi; ticket'ı olmayan tek canlı kayıt için de ayrı bir OPS kaydı açıldı."
                    ]
                }
            }
        },
        {
            "title": "Deploy, dosya sahipliği bozuk kalırsa artık söylüyor",
            "tickets": [
                "OPS-25"
            ],
            "changes": {
                "backoffice": {
                    "fixed": [
                        "11 Ağustos'ta canlıda «bootstrap/cache/config.php yazılamıyor» hatası düşmüştü: deploy bir kez root olarak koşulmuş, sürüm dizini root'a ait kalmış, uygulama kendi önbelleğine yazamamıştı. Sahiplik düzeltmesi 20 Ağustos'ta yapılmıştı ve tekrarlamadı — bugün doğrulandı: sunucudaki tüm dosyalar www-data'ya ait, uygulama önbellek dizinine yazabiliyor, hatanın 11 Ağustos'tan beri yeni bir olayı yok.",
                        "Asıl kusur hatanın sessiz olmasıydı: sahiplik düzeltme adımı başarısız olursa hiçbir yere yazmıyordu, hata ancak uygulamanın ilk isteğinde ortaya çıkıyordu. Deploy artık düzeltmeden sonra sürümü tarıyor ve www-data'ya ait olmayan dosya kalmışsa uyarı basıyor — hangi dosya olduğunu adıyla yazarak.",
                        "12 Ağustos port taşımasından kalan root sahipli .env yedeği silindi (içeriği güncel dosyayla birebir aynıydı, kaybolan ayar yok)."
                    ]
                }
            }
        }
    ]
}
