{
  "date": "2026-08-11",
  "entries": [
    {
      "title": "Görevlerim ekranı firma görevlerinde çöküyordu",
      "tickets": [
        "EGT-96"
      ],
      "changes": {
        "operasyon": {
          "fixed": [
            "Görevlerim ekranı, görevlerden biri bir FİRMA hakkındaysa 500 veriyordu. Ekran her görevin ne hakkında olduğunu çözüp satıra adı ve bağlantısı yazıyor; bu okumayı firma kapsamı olmayan bir bağlamda yapıyordu ve firma kaydı tam da kapsam isteyen tablo olduğu için sorgu hata veriyordu. Diğer görev türleri tesadüfen kurtuluyordu — bir planlamacının görev listesi ise firma görevleriyle dolu.",
            "Aynı okuma bildirim çubuğunu da besliyor; bir firmayla ilgili bildirimde o da aynı sebeple düşüyordu."
          ],
          "changed": [
            "Firması olmayan (yeni başlamış) bir ofis kullanıcısında firma görevleri artık adsız ve bağlantısız görünüyor — görevin kendisi okunabiliyor, açamayacağı bir kayda bağlantı verilmiyor."
          ]
        }
      }
    },
    {
      "title": "Firmanın ilk kullanıcısı panele giremiyordu",
      "tickets": [
        "EGT-93"
      ],
      "changes": {
        "operasyon": {
          "changed": [
            "«Firma ekle» formu artık yetkili kullanıcıyı da soruyor: ad soyad, e-posta, telefon ve TCKN. Kişi firma açılırken oluşturuluyor, panel yöneticisi olarak tam yetkiyle atanıyor ve davet e-postası hemen gidiyor. TCKN burada zorunlu değil — firma kendi personelini eklerken zorunlu.",
            "Müşteri kartındaki kişi listesi kimin firma yöneticisi olduğunu satırında yazıyor."
          ],
          "added": [
            "İşlem günlüğünde yeni bir olay okunabilir adıyla görünüyor: «Firma yöneticisi olarak atandı». Bir firmanın ilk kullanıcısının ne zaman ve kimin eliyle yetkilendirildiği kayıttan okunabiliyor."
          ]
        },
        "musteri": {
          "fixed": [
            "Firmaya eklenen ilk kullanıcı panele giriş yapamıyordu: davet gidiyor, kişi şifresini belirliyor, panel 403 diyordu. Sebebi, her firma için oluşturulan «tam yetkili» rolün kimseye verilmemesiydi — yetki veren ekran da o yetkinin arkasındaydı, yani kimse kimseye yetki veremiyordu. Artık firmanın ilk kullanıcısı yönetici olarak atanıyor; diğerlerini bu kişi kendi panelinden yetkilendiriyor."
          ],
          "changed": [
            "Yetkisi olmayan biri panele geldiğinde çıplak «403» yerine açıklama görüyor: hesabının hazır olduğu, firma panelinde henüz yetkisi olmadığı ve bunu firmasındaki yöneticinin Organizasyon ekranından verebileceği yazıyor. Katılımcıysa kendi eğitim ekranına bağlantı da var."
          ]
        }
      }
    },
    {
      "title": "Planlama kuyruğunda menü iki kez çiziliyordu",
      "tickets": [
        "EGT-94"
      ],
      "changes": {
        "planlama": {
          "fixed": [
            "Planlama kuyruğu ekranında sol menü ve üst şerit iki kez basılıyordu. Ofis panelinde kabuk her sayfaya otomatik veriliyor; bu sayfa bir kez de kendi içinde sarmalıyordu, yani ikinci bir menü birincinin içinde çiziliyordu. Kabuk sarmalayıcısı sayfadan kaldırıldı."
          ]
        },
        "altyapi": {
          "added": [
            "Bir sayfanın kabuğu ikinci kez sarmasını engelleyen kontrol eklendi; aynı hata bir daha yazılırsa testler kırılıyor."
          ]
        }
      }
    },
    {
      "title": "Yedekteki katılımcı artık boşalan koltuğa çağrılabiliyor",
      "tickets": [
        "EGT-73"
      ],
      "changes": {
        "satis": {
          "added": [
            "Dolu bir eğitime isim yazıldığında kişi yedeğe düşüyordu ve koltuk boşalsa bile orada kalıyordu — çağıracak bir düğme hiç yoktu. Artık eğitim ekranındaki katılımcı listesinde yedekteki kişinin yanında «Yedekten çağır» var; kısa bir gerekçe yazılıyor ve kayda işleniyor.",
            "Bu iş satışın yetkisi oldu: «Yedekten katılımcı çağırma» ayrı bir izin ve satışçı paketlerinde varsayılan olarak açık. Sebebi, boşalan koltuğun müşteriyle yapılacak bir konuşma olması — planlamacının işi eğitimi planlamakla bitiyor. Eğitimi düzenleme yetkisi olanlar da yapabiliyor."
          ],
          "fixed": [
            "«Yedekten çağır» düğmesinin ve onay penceresinin metinleri ilk yazımda yanlış bölüme konmuştu; ekranda metin yerine anahtar adı görünecekti (ör. 'trainings.participants.promote'). Aynı gün, aynı iş içinde düzeltildi — canlıya çıkmadı, CI yakaladı."
          ]
        },
        "musteri": {
          "changed": [
            "Yedekte bekleyen personel koltuğa geçtiğinde kaydında «yedekten geldi» bilgisi duruyor; listede olduğu gibi görünüyor."
          ]
        }
      }
    },
    {
      "title": "Bir eğitim birden fazla yönergeye tabi olabiliyor",
      "tickets": [
        "EGT-101"
      ],
      "changes": {
        "backoffice": {
          "added": [
            "Eğitim tanımına «Ayrıca tabi olduğu yönergeler» alanı geldi. Örnek Tayfun'un kendi örneği: IMDG görev 4 ve 10 hem IMDG kod yönergesine hem tehlikeli yükler yönergesine tabi. İsterseniz hangi maddeye dayandığını da yazabilirsiniz.",
            "⚠ Asıl mevzuat ayrı duruyor ve öyle kalıyor: bakanlık bildirimi ve mevzuat sürüm takibi ona göre yürüyor. Bir eğitim planlanırken hangi yönergenin hangi sürümüne göre bildirildiği delil niteliğinde — orada iki cevap olamaz."
          ]
        },
        "planlama": {
          "fixed": [
            "Planlama ekranında mevzuat kartından bir eğitim aranırken, eğitim yalnızca ASIL yönergesinin altında görünüyordu. İki yönergeye tabi bir eğitimi ikinci karttan arayan planlamacı onu bulamıyordu — o kart açısından eğitim yok gibiydi. Artık her iki karttan da bulunuyor.",
            "Kartların üzerindeki «N tanım» sayısı da ikinci bağı sayıyor; önceden sayı ile altındaki liste birbirini tutmayabilirdi."
          ]
        }
      }
    },
    {
      "title": "Eğitim planlarken yeni mi yenileme mi seçiliyor",
      "tickets": [
        "EGT-101"
      ],
      "changes": {
        "planlama": {
          "added": [
            "Eğitim satırında «Eğitim türü» seçimi geldi: Yeni eğitim / Yenileme. Yanındaki not, seçime göre eğitim tanımındaki saati yazıyor — yani 16 saat mi 8 saat mi olduğunu seçerken görüyorsunuz.",
            "Yenileme seçildiğinde YÖN-2019 md.8 hatırlatması çıkıyor: katılımcı listesinde sertifikası dolmuş ya da kaydı olmayan kişiler işaretlenir, çünkü süre kaçmışsa yenileme yetmez ve baştan eğitim gerekir. ⚠ Kayıt engellenmiyor — uyarı."
          ],
          "fixed": [
            "Yenileme eğitimleri YENİ eğitim gibi planlanıp fiyatlanıyordu. Eğitim tanımı iki saati de taşıyor (ör. 16 ve 8) ama hangisinin geçerli olduğunu söyleyecek bir alan kullanılmıyordu: oturum planlayıcı ve fiyat her zaman yeni eğitim saatini okuyordu. Sonuç: 8 saatlik bir yenileme iki güne bölünüyor ve saat üzerinden fiyatlandığında iki katına çıkıyordu.",
            "Katılımcı listesindeki «yenileme uyarısı» da bu yüzden hiç çalışmıyordu: kod yazılıydı, ama eğitimin yenileme olduğunu söyleyen alan hiçbir zaman doldurulmadığı için uyarı hiç tetiklenmedi. Artık tetikleniyor.",
            "⚠ Bugünden önce planlanmış eğitimler «yeni eğitim» sayılıyor — sistem onları zaten öyle hesaplamıştı; başka türlü okumak geçmişi değiştirmek olurdu."
          ]
        }
      }
    },
    {
      "title": "Planlama formunda masraf girilebiliyor",
      "tickets": [
        "EGT-101"
      ],
      "changes": {
        "planlama": {
          "added": [
            "Eğitim planlarken masrafları da yazabiliyorsunuz. Eğitim satırının altında «Maliyet kalemleri» bölümü var: kalem adı, türü ve tahmini tutar; toplam anında hesaplanıyor. Salon, otel ve ulaşım zaten tarihlerle aynı konuşmada belli oluyor — önceden bunları girmek için eğitimi kaydedip detay ekranına dönmek gerekiyordu, yani sonradan hafızadan girmek.",
            "⚠ Birden fazla eğitim planlıyorsanız yazdığınız kalem YALNIZ o eğitim satırına işlenir; ekran bunu söylüyor. İki eğitimin paylaştığı bir gider (tek salon gibi) programın kendi maliyet ekranına girilir — iki satıra da yazılırsa raporlarda iki kez sayılır.",
            "Kalem türü listesi planlama ekranında da yönetici tanımlı listeden geliyor; detay ekranıyla aynı liste, çünkü maliyet raporları türe göre grupluyor."
          ],
          "fixed": [
            "Sağdaki «BU SAYFADA YOK» kutusu maliyet kalemlerini sayıyordu; artık saymıyor. Ekranın kendisiyle çelişen bir cümle, okuyanı iki satır yukarıda duran alanı aramaya gönderirdi."
          ]
        }
      }
    },
    {
      "title": "Firma panelinde bildirim ekranı 500 veriyordu",
      "tickets": [
        "EGT-102"
      ],
      "changes": {
        "musteri": {
          "fixed": [
            "Bildirim zilinde «1» yazıyor, tıklayınca ekran 500 veriyordu. Sebep yetki değil, bir tip uyuşmazlığıydı: bildirim satırı bir EĞİTİM'i işaret ediyordu ve satırı bağlantıya çevirirken «bu kişi bu kaydı açabilir mi» sorusu 3E'nin kendi eğitim kuralına soruluyordu — o kural yalnız ofis kullanıcısını tanıyor. Firma kullanıcısı geçince PHP çağrıyı reddediyor ve ekran hiç çizilemiyordu.",
            "Firma panelinin haber alabileceği dört kayıttan üçü (teklif, teklif isteği, fatura) her iki tarafı da yanıtlıyor; yalnız eğitim yanıtlamıyordu. Artık bir kural, soruyu soran kişiyi tanımıyorsa hiç sorulmuyor — bağlantı veriliyor ve kapıyı hedef ekranın kendisi koruyor (eğitim ekranı zaten firmanın kendi katılımcılarını ve satın aldığı eğitimi kontrol ediyor).",
            "Aynı hatanın başka bir kayıt türünde tekrarlamaması için test eklendi: panelin haber alabileceği her kayıt için kuralın firma kullanıcısını yanıtlayıp yanıtlamadığı sayılıyor.",
            "Bildirimden firmanıza tanımlı olmayan bir eğitime gidildiğinde artık çıplak «sayfa bulunamadı» yerine sebebi yazan bir sayfa çıkıyor: kaydınızın olmadığı ve firmanızın o eğitimi satın almış görünmediği söyleniyor, panele dönüş bağlantısı veriliyor. Bildirimde adı geçen bir eğitim için «bulunamadı» demek, ürünün bozuk olduğunu düşündürüyordu. Aynı cümle yazdırılabilir katılımcı listesinde de geçerli — tek kayıt, iki kapı, tek cevap."
          ]
        }
      }
    },
    {
      "title": "Audit tanığı: iki iş aynı anda yazınca mühür kaybolabiliyordu",
      "tickets": [
        "EGT-104"
      ],
      "changes": {
        "altyapi": {
          "fixed": [
            "İşlem kayıtlarının dış tanığı (herkese açık çapa deposu) tek bir git klonu üzerinde çalışıyor ve sırası şu: uzaktan çek → yereli sıfırla → mührü ekle → commit et → gönder. Saatlik mühürleme işi HER kayıt tablosu için ayrı ayrı planlandığından ikisi aynı dakikada koşuyordu; biri diğerinin henüz gönderilmemiş commit'ini siliyordu. Sonuç: o mühür hiç yayımlanmadan kayboluyor ve kanıt ancak ertesi günkü toparlama işiyle geliyordu.",
            "Canlıda ölçüldü: 11.08.2026 saat 08:00–10:00 arasında altı başarısız gönderim. Çarpışmanın gönderim tarafı kayda düşüyordu; asıl tehlikeli olan silinme tarafı hiçbir yere düşmüyordu.",
            "Artık tanığa dokunan bütün işler tek işçili kendi kuyruğunda sırayla koşuyor. Ayrıca tanığın kendisi, bütün sıra boyunca bir kilit tutuyor — çünkü kuyruk tek kapı değil: bir kullanıcı ekrandan mühür doğrulaması yaptığında da aynı klasöre giriliyor. Kilit alınamazsa iş hata verip yeniden deneniyor; sessizce üzerine yazmıyor."
          ]
        }
      }
    },
    {
      "title": "Güvenlik güncellemeleri",
      "tickets": [
        "EGT-103"
      ],
      "changes": {
        "altyapi": {
          "fixed": [
            "Markdown kütüphanesi (league/commonmark) 2.8.3'ten 2.9.2'ye çıktı. Altı güvenlik uyarısı kapandı; dördü yüksek dereceli ve hepsi aynı türden: özel biçimde hazırlanmış bir metin, sunucuyu işlemcide kilitleyebiliyordu (iç içe geçmiş başlıklar, çakışan başlık adları, tekrarlanan dipnotlar, yan yana öznitelik blokları). Bir tanesi de bağlantı süzgecinin görünmez karakterlerle atlatılmasıydı. Bu kütüphane bizde sözleşme metinlerini, teklif gövdelerini ve yasal sayfaları HTML'e çeviriyor — yani müşterinin okuduğu her yazılı belge oradan geçiyor.",
            "Arayüz tarafında nanoid paketi güncellendi (yüksek dereceli, sonsuz döngü). Yalnız derleme aracının bağımlılığı; canlı sayfalara girmiyor.",
            "⚠ Denetimler artık temiz: composer ve npm tarafında bilinen açık kalmadı."
          ]
        }
      }
    },
    {
      "title": "Hata ekranları: kod artık logda da yazıyor",
      "tickets": [
        "EGT-102"
      ],
      "changes": {
        "altyapi": {
          "fixed": [
            "500 ekranı «Hata kaydedildi» diyor ama gösterecek bir kod taşımıyordu — yani destek her aramaya «saat kaçtı, ne yapıyordunuz» diye başlıyordu. Artık ekranda bir hata kodu var (ör. ERR-3D1BF43A) ve AYNI kod log satırına da yazılıyor. Bir kişi kodu okuduğunda o isteğin kaydı doğrudan bulunuyor. ⚠ Başka bir projede tam tersi yaşanmıştı: ekranda kod vardı, logda yoktu ve ikisi birleştirilemiyordu — kod gösterip kaydetmemek, tutulamayan bir söz vermektir.",
            "Tanıtım sitesinde (landing ve yasal metinler) hiç hata sayfası yoktu: 500 alan ziyaretçi çerçevenin İngilizce, markasız «Server Error» sayfasını görüyordu. Panel ve ofisin sayfalarının eşi yazıldı — 500, 404 ve bakım; 500'de aynı hata kodu görünüyor.",
            "Hata ve bakım sayfalarında logo yoktu — yalnız «3E AKADEMİ» yazıyordu. Artık hepsinde giriş ekranlarındaki logo var. ⚠ Bakım sayfasında logo dosyaya gömülü basılıyor: o sayfa uygulama kapalıyken düz dosyadan servis ediliyor ve dışarıdan yüklenen hiçbir şeye güvenilemez.",
            "Bakıma alırken süre verilebiliyor ve ekranda «Tahmini bitiş: 18:30» olarak yazıyor. Laravel'in bakım modunda başlangıç–bitiş penceresi yok, ama --retry saniye ya da saat kabul ediyor ve sayfaya geçiriyordu; bugüne kadar bunu kimse okumuyordu. Yazılan saat sizin saatinizle okunur. Deploy'un bakım süresi de 15 saniyeden 5 dakikaya çıkarıldı — deploy zaten 2-3 dakika sürüyor.",
            "500 ekranı yalnız «local ve test dışında» çiziliyordu, yani görülebileceği hiçbir yerde açılamıyordu — bir yabancı tarafından okunması için yapılmış tek ekran, kimsenin bakamadığı ekrandı. Artık ölçüt hata ayıklama modu: kapatan kişi production davranışını görmek istiyordur ve onu görür."
          ]
        }
      }
    },
    {
      "title": "Bakım sayfası ve deploy'un PHP sürümü",
      "tickets": [
        "EGT-103"
      ],
      "changes": {
        "altyapi": {
          "added": [
            "Sistem bakıma alındığında artık kendi sayfamız çıkıyor: «Planlı bakım», ne olduğu, ne kadar süreceği ve devam eden eğitimlerin/taleplerin etkilenmediği yazılı, bir de «Sayfayı Yenile» düğmesi var. Öncesinde Laravel'in kendi sayfası çıkıyordu — bomboş beyaz bir ekranda İngilizce «503 Service Unavailable»; bakım penceresine denk gelen bir firma yöneticisi için bu, sistemin bozulduğu anlamına gelirdi. Sayfa dış kaynak kullanmıyor (stil kendi içinde), çünkü tam da uygulamanın çalışmadığı anda gösteriliyor."
          ],
          "fixed": [
            "Deploy, projenin PHP sürümünü tahmin ediyordu: bir script «kurulu olanların en yenisi»ni arıyor, ön koşul kontrolü ise çıplak «php»ye düşüyordu — sunucuda o 8.3. İki farklı cevap, ve bir deploy tam bu yüzden durdu. Sürüm artık .php-version dosyasında sabit yazılı (8.5), seçimi tek bir yer yapıyor, composer da aynı sürümü bildiriyor. ⚠ «En yenisi» zaten yanlış soruydu: makineye yeni bir PHP kurulması, kimse istemeden projenin sürümünü değiştirirdi."
          ]
        }
      }
    },
    {
      "title": "Teklif isteği artık kimin hangi sertifikasının dolduğunu söylüyor",
      "tickets": [
        "EGT-103"
      ],
      "changes": {
        "musteri": {
          "fixed": [
            "Teklif isteğinin ilk adımı «sertifikası dolan 7 kişi» diyor, hangi kişinin hangi sertifikasının dolduğunu söylemiyordu — devam edildiğinde de eğitim seçimi boş geliyordu, yani firma hangi eğitimi isteyeceğini kendi tahmin etmek zorundaydı.",
            "Tespit, kişi başına DEĞİL sertifika başına yapılıyor artık. Eskiden kişinin en geç biten sertifikasına bakılıyordu: ADR belgesi bir ay sonra dolan ama IMDG'si üç yıl geçerli olan personel «uyumlu» sayılıp listeye hiç girmiyordu. Bu bir görüntü eksiği değil, yanlış tespitti.",
            "Firmanın kendi girdiği (beyan ettiği) sertifikalar bu ekranda hiç okunmuyordu; yalnız 3E'nin eğitimlerinden doğan belgeler sayılıyordu. Artık ikisi de sayılıyor — Personel ekranının okuduğu kayıtların aynısı.",
            "Listelerdeki «＋ Filtre» penceresi bir seçenek seçildikten sonra kapanmıyor ve tablonun üstünü örtüyordu — liste doğru geliyor ama görünmüyordu. Artık pencerenin dışına tıklayınca (ve Esc ile) kapanıyor, uzun seçenek listeleri de pencerenin içinde kayıyor. Bütün listeleri ilgilendiren ortak bir davranış; personel filtresi 14 eğitimlik listeyle görünür kıldı."
          ],
          "added": [
            "İlk adımda tespit edilenler satır satır listeleniyor: kim, hangi eğitim, sertifika ne zaman doluyor, durumu ne. Satırlar işaretli geliyor; istemediğinizin işaretini kaldırıyorsunuz.",
            "«Devam» dendiğinde her eğitim için AYRI bir grup açılıyor ve o grubun eğitimi seçili geliyor. ADR yenileyecekler bir grup, IMDG yenileyecekler başka bir grup — teklif de zaten böyle fiyatlanıyor. Sertifikası olmayan (işe giriş kuralına giren) personel kendi grubunda toplanıyor, eğitimi boş: hangi eğitime ihtiyacı olduğunu kayıt söylemiyor, siz seçiyorsunuz.",
            "Ekibim › Personel'de «Sertifika eğitimi» süzgeci var: bir eğitimi seçtiğinizde yalnız o eğitimin sertifikasını taşıyanlar kalıyor ve uyum rozeti de o sertifikaya göre okunuyor — IMDG'si geçerli, ADR'si geçmiş biri ADR süzgecinde «Süresi Geçmiş» görünüyor.",
            "Aynı ekranda «Sertifika bitiş» başlığına tıklayarak en yakın dolan tarihe göre sıralanabiliyor. Tarihli sertifikası olmayan personel sona düşüyor.",
            "Personel listesinde satır seçimi ve «Eğitim planına ekle» geldi: seçtiğiniz kişilerle teklif isteği açılıyor, adları yazılı olarak. Liste tek bir eğitime süzülmüşse o eğitim de seçili geliyor; süzülmemişse eğitimi sonraki adımda siz seçiyorsunuz."
          ]
        }
      }
    },
    {
      "title": "Bir eğitim firmadan belge bekleyebiliyor — uyarı olarak",
      "tickets": [
        "EGT-79"
      ],
      "changes": {
        "musteri": {
          "added": [
            "Teklif isteğinin özet adımında, seçtiğiniz eğitimin firmanızdan beklediği bir belge varsa ve sistemde yoksa uyarı çıkıyor: hangi belge, hangi eğitim için, hangi maddeye dayanıyor. Belgeniz varsa ama süresi dolmuşsa bunu ayrıca söylüyor. ⚠ Engel değil — belgeyi yükleyebilir ya da uyarıyı görüp talebinizi yine gönderebilirsiniz; 3E gerekiyorsa iletişime geçer."
          ],
          "fixed": [
            "Uyarı kutusunun kenarlık rengi ilk yazımda tanımsız bir renk adıyla verilmişti; kutu kenarlıksız çizilecekti. Aynı gün, aynı iş içinde düzeltildi — canlıya çıkmadı, testler yakaladı."
          ]
        },
        "backoffice": {
          "added": [
            "Eğitim tanımına «Müşteriden beklenen belgeler» bölümü geldi: bir eğitimin, o eğitimi alacak firmadan hangi belgeyi beklediği burada işaretleniyor (ör. IMDG semineri için gözetim yetki belgesi). Belge türü kodda yazılı değil — listeden seçiliyor, madde referansı ve notu da burada tutuluyor.",
            "Müşteri firma kapsamında tanımlı belge türü yoksa bölüm bunu söylüyor; önce Belge türleri ekranından açılması gerekiyor."
          ]
        }
      }
    }
  ]
}