Changelog

Platforma eklenen yeni özellikler, iyileştirmeler, düzeltmeler ve güvenlik güncellemeleri.

18.09.2026
Yeni

İzleme Modülü, Anahtar/Şifre Üretici ve Uyumluluk Raporu İyileştirmeleri

Şube web sitelerinizi, sunucularınızı ve domain'lerinizi tek panelden otomatik izleyen yeni bir modül eklendi — ayrıca Araçlar bölümüne bir anahtar/şifre üretici ve SOC 2 uyumluluk raporunda birkaç önemli doğruluk düzeltmesi geldi.

Yeni: İzleme modülü

  • 5 izleyici tipi: HTTP/Uptime, SSL sertifika bitişi, Domain (WHOIS), Ping, Port kontrolü.
  • Bir web sitesi eklerken HTTP + SSL + Domain izleyicileri "standart paket" olarak otomatik kurulur.
  • Sorun anında e-posta + panel içi bildirim; flapping'i önlemek için 2 ardışık hata eşiği.
  • Haftalık AI destekli özet rapor — trend ve anomali tespiti.
  • Tek tıkla yayınlanan herkese açık durum sayfası (status.example.com tarzı, login gerektirmez).
  • Ana sayfa dashboard'una İzleme widget'ı: tip bazlı ayrı çizgiler (HTTP/SSL/Domain/Ping/Port) + sorunlu izleyicinin ayrı kesikli çizgisiyle vurgulanması.
  • Plan bazlı izleyici limitleri: Starter 3, Professional 25, Business/Enterprise sınırsız.

Yeni: Anahtar ve Şifre Üretici

  • Araçlar sekme çubuğuna "Anahtar Üretici" eklendi — Ağ Araçları'nın yanında, ayrı bir sayfa.
  • 256/128-bit şifreleme anahtarı, CodeIgniter/Django anahtarı, WPA/WEP anahtarı, UUID v4.
  • Akılda kalıcı / güçlü / maksimum güvenlik şifre üretici — her kategoriden 3 seçenek.
  • Tamamen tarayıcıda (crypto.getRandomValues(), modulo-bias'sız) üretilir — hiçbir değer sunucuya gönderilmez.

SOC 2 Uyumluluk Raporu — doğruluk düzeltmeleri

  • HSTS kontrolü artık gerçek bir HTTP header isteğiyle doğrulanıyor (önceden sabit "Pasif" gösteriyordu).
  • Admin 2FA benimsenme oranı artık test/otomasyon hesaplarını hariç tutuyor — gerçek insan admin oranını yansıtıyor.
  • Değişiklik yönetimi (migration geçmişi) ve bulut yedek kanıtı artık doğru kaynaktan okunuyor.

İzleme modülü mevcut planınızda zaten aktif olabilir — Araçlar → Anahtar Üretici ve İzleyiciler sayfalarından hemen deneyebilirsiniz.

10.09.2026
İyileşti

Şeffaflık: Veri Konumu, Alt İşleyen Listesi ve Yasal Metin Güncellemesi

Gizlilik Politikası, Veri İşleme Sözleşmesi (DPA) ve Trust Center; platformun güncel altyapısını ve özellik setini birebir yansıtacak şekilde gözden geçirildi.

Veri konumu netleştirildi

  • Uygulama ve tüm tenant veritabanları Hetzner Online GmbH — Almanya (AB), NBG1 veri merkezinde barındırılıyor.
  • Yurt dışı aktarım, sağlayıcının veri işleme sözleşmesi (AV-Vertrag) ve AB Standart Sözleşme Maddeleri (SCC 2021/914) ile güvenceye alınıyor; KVKK m.9 Kurul Standart Sözleşme bildirimi tamamlanma aşamasında.
  • Natro (Türkiye) yalnızca genel tanıtım sitesinin yedek kopyasını barındırıyor — kişisel veya tenant verisi içermiyor.

Alt işleyen (sub-processor) listesi güncellendi

  • /dpa.php §5: Hetzner + Sentry (hata izleme) eklendi, konumlar ve aktarım dayanakları gerçek duruma göre düzeltildi.
  • /privacy.php §4: aynı düzeltme + AB içi barındırma vurgusu.

Yeni veri kategorileri ve özellikler yasal metinlere işlendi

  • Gizlilik Politikası §2: "Teknik erişim" (ağ / modem panel / servis erişim bilgileri, AES-256 şifreli) ve "Çalışan kullanımı / davranışı" (Shadow SaaS tespiti) kategorileri eklendi.
  • §3: Shadow SaaS gibi bireysel yazılım kullanımını gösteren özelliklerde hukuki sebep, ölçülülük ve çalışan bilgilendirmesi sorumluluğunun Veri Sorumlusu (Müşteri) tarafında olduğunu belirten "Çalışan izleme özellikleri" bilgilendirmesi eklendi.
  • Hizmet Kullanım Koşulları §4: hizmet kapsamına Shadow SaaS keşfi, TCO raporlama, lisans geri alma analizi, AI araç envanteri, donanım/filo sağlık skorlaması ve otomatik SSL'li white-label özel alan adları eklendi.
  • Çerez Politikası: İngilizce Gizlilik Politikası çerez bölümü, Türkçe sürümle ve canlı çerez tercih paneliyle eşitlendi (4 kategori: Gerekli / Analiz / Tercihler / Pazarlama).

Fiyatlandırma karşılaştırması

  • Plan karşılaştırma tablosuna "White-label / özel alan adı (otomatik SSL)" satırı eklendi — Enterprise ayrımı artık tabloda görünüyor.

Hiçbir veri işleme uygulaması değişmedi; bu güncelleme mevcut durumu belgelere doğru şekilde yansıtır. Gizlilik Politikası ve DPA'nın "son güncelleme" tarihi 2026-09-10 olarak ayarlandı.

05.09.2026
İyileşti

White-Label: Otomatik SSL + Custom Domain E-posta Linkleri

Enterprise white-label özelliği tam anlamıyla tamamlandı. Tenant'lar artık kendi subdomainlerini (ör. panel.acme.com) hem otomatik SSL ile hem de tutarlı e-posta linkleriyle kullanabilir.

Otomatik SSL Provisioning (Sprint 16.2)

  • SA panelinde custom domain girilince ssl_status='pending' kuyruğuna alınır.
  • Her 5 dakikada çalışan cron DNS'in sunucuya (78.47.156.55) çözümlendiğini doğrular, ardından Let's Encrypt certbot ile sertifika alır ve nginx conf'u dinamik olarak oluşturur.
  • SSL aktif olunca badge "SSL Aktif" olur; başarısız olursa "Yeniden Dene" butonu görünür.
  • Sertifika yenilemesi certbot systemd timer ile 12 saatte bir otomatik gerçekleşir — manuel işlem gerekmez.

CNAME ile Kurulum — A Kaydı Gerekmez

  • Tenant'ın mevcut web sitesi başka hostingde olsa dahi yalnızca panel.acme.com CNAME teknikdanisman.net kaydı yeterlidir.
  • Ana domain (acme.com) ve diğer servisler hiç etkilenmez.
  • SA paneli DNS kurulum yönergesi buna göre güncellendi: CNAME öncelikli olarak vurgulandı.

E-posta Linkleri Custom Domain'e Göre Dinamik

  • tenant_base_url(int ) helper eklendi (config.php): ssl_status='active' custom domain varsa onu, yoksa APP_URL'i döner.
  • Etkilenen e-posta şablonları: lisans/servis/ödeme/garanti uyarıları, sigorta bitiş uyarısı, donanım bakım hatırlatması, haftalık özet, not hatırlatmaları.
  • Şifre sıfırlama ve İK izin portalı linkleri de custom domain üzerinden gönderilir.
  • Static cache sayesinde toplu cron gönderiminde aynı tenant için tek DB sorgusu yapılır.

SA Panel Navigasyon İyileştirmesi

  • tenant_detail.php üst aksiyonlar bölümüne Branding & SSL butonu eklendi — tenant_settings.php?tab=branding'e doğrudan erişim sağlar.
03.09.2026
İyileşti

Pazarlama Sayfaları İçerik Güncellemesi & UI Düzeltmeleri

Tüm public (giriş gerektirmeyen) sayfalar; sigorta modülü, donanım sağlık skoru ve müşteri portalı gibi yeni özellikler vurgulanacak şekilde güncellendi. Aynı zamanda navbar, tour ve form katmanında görsel düzeltmeler yapıldı.

İçerik Güncellemeleri

  • register.php, pricing.php, about.php, home.php, tour.php — Sigorta modülü, donanım sağlık skoru/yenileme planlaması ve KVKK & GDPR uyumu her sayfada öne çıkarıldı.
  • content/marketing.json — FAQ: import entry'ye sigorta modülü eklendi; pricing entry'deki eski lansman kampanyası "10 ay öde 12 ay kullan" ile değiştirildi.
  • roadmap.php + lib/Roadmap.php — Now / Next / Later içeriği 2026-09-03 sistem durumuna göre güncellendi (TÜRKPATENT takibi, test coverage, ionCube, Docker Compose eklemeleri).

UI Düzeltmeleri

  • Navbar hamburger breakpoint — 768px'ten 1200px'e yükseltildi. 7 nav bağlantısı + dil/tema toggle + CTA yaklaşık 1191px kaplıyor; artık büyük tablette de collapse olmadan görüntüleniyor.
  • tour.php geniş ekran.tour-grid max-width 1040 → 1400px, gap 2.5 → 4rem; 1920px ekranda içerik artık tam kullanıyor.
  • tour.php mobil ok bindirmesi — 768px'te slide padding 60px, .tour-arrow 8px'e çekildi; sol ok artık metin üzerine binmiyor.
  • register.php logo — Light modda logo-cube-white.svg görünmezdi; logo-cube.svg (koyu) olarak değiştirildi. CSS dark-mode swap mekanizması korundu.
  • register.php CAPTCHAmax-width:110px kısıtlaması kaldırıldı; input tam genişlikte.
  • marketing_brand_strip.php/assets/ root-absolute yolu assets/ relative yapıldı; href="/""./" (XAMPP subdir uyumu).
  • home.php footer logobrand-cube-themed class eklendi; light modda white logo arka planla çakışmıyor.
  • contact.php WhatsApp — E-posta kartlarıyla tutarlı channel-link bağlantısı eklendi.
  • legal_page.php — "Son güncelleme" etiketi t() sarmalandı; EN modda da doğru çeviri görünüyor.
  • self_host.php — Docker Compose roadmap tarihi Q3 → Q4 2026; ölü .top/.brand/.nav CSS kaldırıldı.
  • api.phpspec-url="/openapi.php""openapi.php" relative; Redoc lokal subdir kurulumunda da çalışıyor.
  • pricing.php — Pre-launch banner dark modda #fff (çarpıcı beyaz) → zinc-800 (#27272a) + zinc-700 border; sayfayla uyumlu koyu ton.
01.09.2026
Yeni

Sunucu Envanteri: Önizle · Düzenle · Sil İşlemleri

Şube detay sayfasının Sunucular sekmesindeki envanter tablosuna tam işlem sütunu eklendi. Her sunucu kaydı artık tablo satırından yönetilebilir.

👁 Önizleme Modalı

  • Göz ikonuna tıklanınca AJAX çağrısı olmadan açılan Bootstrap modal: sunucunun tüm detaylarını (marka/model, OS, CPU/RAM/disk, dahili+harici IP, rol, konum, durum, tarihler, notlar) gösterir.
  • Modal data-* atributlarıyla beslenir; sayfa render'ında hazırdır.
  • Write iznine sahip kullanıcılar için modal footer'da Düzenle kısa yolu görünür.
  • Modal document.body'e taşınır (parent stacking context escape) — buton tıklaması engellenmez.

✏️ Düzenle

  • Kalem ikonu server_form.php?edit_id={id}&return_to=customer_detail.php?tab=servers adresine bağlanır.
  • Düzenleme tamamlandıktan sonra sunucular sekmesine geri dönülür.

🗑 Sil

  • CSRF korumalı POST formu; onay diyaloğuyla silme işlemi gerçekleştirilir.
  • customer_id sahiplik doğrulaması + write izin kontrolü yapılır.
  • Silme işlemi audit log'a kaydedilir.

🔧 IP Sütunu Düzeltmesi

  • Tablo IP sütunu artık ip_internal kolonunu okur (eski ip_address yerine); geriye dönük uyum korundu.
01.09.2026
Düzeltme

Haber Akışı Görünürlük Düzeltmesi + Modal Backdrop

İki ayrı görsel sorun giderildi.

📰 Haber Akışı (News Ticker)

  • Vercel temasında --ui-primary token'ı ön plan rengi (#0a0a0a) olduğundan ticker arka planı sayfayla iç içe geçiyor ve görünmez oluyordu. --ui-brand-rgb token'ına geçildi.
  • Service Worker td-v86 sürümüne yükseltilerek eski sayfa cache'i temizlendi.
  • Tenant DB'lerinde aktif haber bulunmayan durum için fallback mekanizması eklendi (expected_tenant_db ile ikinci deneme).

🪟 Modal Backdrop Bulanıklığı

  • .modal-backdrop.show üzerindeki backdrop-filter: blur(8px) tüm sayfa içeriğini bulanıklaştırıyordu.
  • panel-vercel.css'te backdrop-filter: none !important override'ı eklenerek panel-polish.css ve panel-v2.css'ten gelen blur kuralları etkisiz kılındı.
01.09.2026
Yeni

Şube Kimlik Bilgileri: Network & Modem Paneli Alanları

Şube detay sayfasının Kimlik Bilgileri sekmesine iki yeni kart eklendi. IT teknisyenleri artık ağ yapılandırmasını ve modem panel erişim bilgilerini aynı ekranda görebilir ve güncelleyebilir.

🌐 Network Bilgileri Kartı

  • Sabit IP, Alt Ağ Maskesi, Ağ Geçidi ve DNS 1 alanları eklendi.
  • Değerler doğrudan customers tablosuna kaydedilir; mevcut şifre güncelleme formuyla entegre çalışır.
  • DB: static_ip, subnet_mask, default_gateway, dns_primary kolonları — migration 20260901_000002.

📡 Modem Paneli Bölümü

  • İnternet kartının içine Panel IP, Kullanıcı Adı ve Şifre alanları eklendi.
  • Şifre alanı diğer şifrelerle aynı cv_encrypt() korumasına sahip; göster/gizle ve kopyala butonları mevcut.
  • DB: internet_modem_panel, internet_modem_panel_kullanici_adi, internet_modem_panel_sifre kolonları — migration 20260901_000003.

🔀 Düzen İyileştirmeleri

  • Güvenlik Duvarı kartı sağ sütuna (Erişim Noktası altına) taşındı — mantıksal gruplanma iyileştirildi.
  • Kimlik durumu göstergesi (cred-status-dot) Network kartına eklendi.
31.08.2026
Güvenlik

Güvenlik Denetimi & Performans Düzeltmeleri

Triple Audit (UI / Güvenlik / Performans) sonrası 7 kritik ve majör bulgu giderildi.

🔒 Güvenlik Düzeltmeleri

  • SVG yükleme güvenlik açığı kapatıldıcustomer_form.php logo yükleme alanından SVG kaldırıldı; yalnızca jpg/jpeg/png/webp kabul ediliyor. uploads/logos/ klasörüne .htaccess + nginx whitelist eklendi.
  • Canary tokenconfig.php boot sırasında hostname kontrolü; yetkisiz sunucuda TD_CANARY_URL fetch ile uyarı gönderiliyor. Lokal: TD_CANARY_DISABLED=true.
  • TÜRKPATENT marka tescili — Başvuru No 2026/673388 (31.08.2026). 4-diamond logo + "teknik danışman" — Sınıf 35 (iş yönetimi) + 42 (yazılım hizmetleri). Ücret ₺5.640 ödendi.

⚡ Performans Düzeltmeleri

  • Column prefs N×1.1s → tek istekcolumn_prefs_api.php batch GET endpoint eklendi (?keys=k1,k2). assets/panel-col-drag.js paralel bireysel fetch'ten batch fetch'e geçirildi.
  • Filo sağlık double JOIN → aggregate SQLhardware_fleet_health() tek geçişe optimize edildi.

🔧 Panel Düzeltmeleri

  • SA Panel: super_admin/subscriptions.php içerik kayma düzeltmesi.
  • SA Panel: super_admin/ai_kb_admin.php tablo sütun hizalama sabitleme (table-layout:fixed + <colgroup>).
  • Migration format düzeltmesi: version + name alanları zorunlu kılındı.
30.08.2026
İyileşti

Sidebar Aktif Durum & KPI Kart Yeniden Tasarımı

Panel'in navigasyon ve metrik gösterim katmanında görsel iyileştirmeler yapıldı.

Sidebar Aktif Durum

  • Aktif bağlantı artık rgba(0,106,255,.06) tinted arka plan + #006AFF sol border ile vurgulanıyor (eski: gri ton).
  • Donanım menüsü tek buton olarak sadeleştirildi — Stok / Hurda / Sunucular alt-linkleri kaldırıldı. Sekmeler arası geçiş shown.bs.tab event ile URL + sidebar senkronizasyonu yapıyor.

KPI Kart Renk Tasarımı

  • Her varyant (primary / success / warning / danger / teal) için ayrı: tinted background + tinted border + accent KPI değeri.
  • Marka rengi #0070F3#006AFF ile hizalandı.
  • revenue.php — 5 kart tek satır grid (row-cols-2 row-cols-md-5).
  • tco_report.php — CSS grid repeat(5,1fr); toplam satır sade dikey yapıya dönüştürüldü.
30.08.2026
Yeni

Donanım Sağlık Skoru — Cihaz & Filo Sağlık Analizi

Her cihaza 0–100 arası otomatik sağlık skoru ve A/B/C/D kalite notu atan yeni lib/HardwareHealth.php modülü yayına alındı. Filo genelinde anlık IT sağlık durumunu tek bakışta özetler.

Puanlama Sinyalleri

  • Garanti durumu — Garanti bilgisi yok (−10), ≤90 gün (−15), süresi dolmuş (−25)
  • EOL yaklaşımı — ≤90 gün (−20), EOL geçti (−30)
  • Açık servis kayıtları — Her açık kayıt −15 puan (en fazla −30)
  • Cihaz yaşı — 3–5 yıl (−10), 5+ yıl (−20)

Grade sınırları: A ≥ 85 · B ≥ 65 · C ≥ 40 · D < 40

hardware.php Entegrasyonu

  • Filo Sağlık kartı — Sekmeler üzerinde. Toplam skor/100, renkli progress bar (yeşil/sarı/kırmızı), risk badge'leri.
  • Tablo kolonu — Her cihaz satırında A 90, C 55 gibi skor rozeti; hover'da sinyal detayı tooltip.
  • Batch SQL ile N+1 sorgu yok: hardware_open_service_counts() tek sorguda tüm IDs için sayım.
  • Filo özeti için hardware_fleet_health() — aggregate SQL, tüm filo puanı tek geçişte.

İlgili Kütüphaneler

  • lib/HardwareLifecycle.php — Yenileme skoru: tamir maliyeti + kullanım ömrü + bütçe tahmini ile cihaz başına yenileme aciliyeti.
  • lib/CustomerHealth.php — Şube IT sağlık skoru: donanım + lisans + açık servis kombinasyonu.
25.08.2026
Product

ITAM Zekası: Shadow SaaS · TCO Raporu · Son Kullanma Takvimi · Lisans Geri Alma · AI Araç Envanteri

Envanter koridoruna 5 analitik modül eklendi. Temel donanım/lisans takibinin ötesine geçerek stratejik IT varlık yönetimi (ITAM) katmanı tamamlandı.

👁 Shadow SaaS Tespiti (shadow_saas.php)

  • Çalışanların IT onayı olmadan kullandığı SaaS araçlarını tespit eder.
  • Her araç için Onayla / Bloke Et / İncele akışı — yönetici kararı audit log'a işlenir.
  • Kullanım sıklığı, departman ve maliyet tahmini ile risk sınıflandırması.

💰 TCO Raporu (tco_report.php)

  • Toplam Sahip Olma Maliyeti (TCO): lisans ücretleri + ödeme geçmişi + sigorta primleri + donanım amortisman maliyeti tek raporda.
  • Müşteri bazlı filtre, TRY/USD döviz desteği, yıllık projeksiyon grafiği.
  • Maliyet kalemlerine tıklayınca kayıt detayına derinleşme.

📅 Son Kullanma Takvimi (expiry_calendar.php)

  • Lisans bitiş tarihleri + domain yenilemeler FullCalendar görünümünde renk-kodlu.
  • 30 / 60 / 90 gün uyarı bandı — kritik yaklaşanlar otomatik öne çıkar.
  • Takvim etkinliğine tıklayınca doğrudan ilgili kayıt formuna yönlendirme.

✂ Lisans Geri Alma (license_harvesting.php)

  • Her lisans için used_seats / quantity kullanım analizi — utilization bar inline görünüm.
  • Düşük kullanım (<50 %) filtresi; boşta kalan koltuk × birim maliyet = potansiyel tasarruf hesabı (TRY + USD).
  • Satır üstünde "kullanım gir" butonu → modal değil, inline form → kayıt → canlı güncelleme (CSRF korumalı AJAX).
  • Özet KPI: toplam lisans, ortalama kullanım %, toplam boşa giden yıllık maliyet.
  • DB: licenses.used_seats yeni kolon (migrations/tenant/20260825_000002).

🤖 AI Araç Envanteri (ai_tools.php)

  • Şirkette kullanılan tüm AI/ML araçlarını kart görünümünde takip eder.
  • Kategoriler: Metin · Kod · Görsel · Ses · Veri Analizi · Otomasyon · Diğer.
  • Veri hassasiyeti rozeti: Low / Medium / High / Critical — GDPR/KVKK risk değerlendirmesi için.
  • Plan tipi (Free/Trial/Paid/Enterprise), koltuk sayısı, aylık maliyet (TRY/USD/EUR/GBP), inceleme tarihi.
  • Ekle / Düzenle / Sil modalı body düzeyinde — stacking context sorunu yok.
  • DB: ai_tools yeni tablo (migrations/tenant/20260825_000004).

🔗 Navigasyon & entegrasyon

  • Her iki yeni sayfa sidebar Envanter accordion'a eklendi: Lisans Geri Alma (✂) + AI Araçları (🖥) — licenses modül izni ile korunuyor.
  • licenses.php satır aksiyonlarına "Kullanım / Harvesting" kısa yolu eklendi.
  • menu.php + güncellendi.

Özet: 5 yeni sayfa · 2 migration · 2 API endpoint (license_harvesting_api.php, ai_tools_api.php) · sidebar + menu güncelleme · tüm POST işlemleri CSRF korumalı.

12.08.2026
Shipped

PayTR canlı moda alındı — uçtan uca doğrulama tamam

PayTR iFrame API entegrasyonu PRODUCTION modunda; ilk gerçek 1 TL + Starter (499 TL) ödemesi uçtan uca doğrulandı. Aboneler artık kart ile ödeme yaparak anında panel'e erişebiliyor.

  • PAYTR_TEST_MODE=0 canlıda aktif — sandbox'tan production'a geçiş tamam.
  • 1 TL smoke test (10:14:03): /paytr_test.php → PayTR 3DS → webhook → PAYMENT_SUCCESS event #7. Hash verify + "OK" yanıtı doğrulandı.
  • Starter 499 TL end-to-end (10:22:21): /subscribe.php plan seç → PayTR iFrame → 3D Secure → callback → subscription upsert → tenant aktive. Full chain 6 aşama çalıştı.
  • Kritik CSP fix: Canlı 3DS iframe için frame-src 'self' https: gerekli — PayTR kullanıcıyı bankanın kendi 3DS sayfasına (acs.<banka>.com) yönlendirir; önceki dar frame-src 'self' https://www.paytr.com Chrome'un "This content is blocked" hatası verdiği için genişletildi. frame-ancestors 'self' sıkı kaldığından güvenlik seviyesi düşmedi.
  • opcache invariant: Sunucuda opcache.validate_timestamps=0config.local.php değişikliğinden sonra systemctl reload php8.3-fpm zorunlu adım.
  • Test kayıtları temizlendi: subscriptions.id=1 → cancelled, subscription_checkouts.id=1 → deleted, payment_events audit trail için korundu.
  • RFC 0005 — production rollout checklist tamamı ✓ işaretli.

Sonraki: PayTR panelinden 1 TL + 499 TL iade işlemi (2-5 iş günü), tenant admin'lerine "Ödeme sistemi aktif" duyurusu, üyelik yenileme otomasyonu (mevcut kod tek seferlik ödeme — auto-renewal ayrı sprint).

12.08.2026
İyileşti

Ödeme sağlayıcısı: iyzico → PayTR iFrame API

Abonelik ödeme altyapısı tamamen PayTR iFrame API'ye taşındı. Kod, DB şeması, webhook, testler ve dokümantasyon provider-agnostic hale getirildi — ileride başka sağlayıcı eklenirse minimum efor.

  • iFrame API: Kullanıcı sitemizden çıkmaz — kart formu + 3D Secure PayTR tarafında (PCI-DSS yükü minimum). /subscribe.php iframe embed, iframeResizer.min.js ile responsive.
  • Webhook: subscription_webhook.php PayTR "OK" text yanıtı + hash verify (merchant_oid + salt + status + total_amount) + idempotency (payment_events UNIQUE).
  • Migration 20260812_000001: subscriptions.iyzico_refprovider_ref + provider kolonu. iyzico_customer_ref / iyzico_plan_ref DROP. subscription_checkouts.iyzico_tokenprovider_token + merchant_oid. payment_events.source default 'iyzico''paytr'.
  • /paytr_test.php admin-only PoC: config kontrolü + plan catalog + 1 TL sandbox iFrame test.
  • RFC 0005: iFrame vs Direct/Link karar gerekçesi + rollback planı + production checklist.
  • RFC 0004 superseded olarak işaretlendi (tarihsel referans).
  • Kaldırıldı: lib/Iyzico.php, iyzico_test.php, tests/unit/Iyzico*.php. Yerine lib/PayTR.php + tests/unit/PayTR*.php.
  • Etiketler güncellendi: pricing.php, membership.php, home.php, trust.php, dpa.php, privacy.php, 4 landing experiment, llms.txt, README.md, SECURITY.md.

Aktivasyon adımı: PAYTR_MERCHANT_ID/KEY/SALT config.local.php'de tanımlı → PAYTR_TEST_MODE=0 ile production → PayTR mağaza panelinden Bildirim URL: https://teknikdanisman.net/subscription_webhook.php. Sandbox test kartı: 4355 0841 0000 0000 (CVC 000).

02.08.2026
Product

Yerel PC Bulut Yedek Monitörü — Duplicati entegrasyonu (Professional+)

Ana bilgisayardaki muhasebe, belgeler ve proje klasörleri artık tenant'ın kendi Google Drive / OneDrive / Dropbox / S3 hesabına AES-256 şifreli otomatik yedeklenir. TD Panel merkezi izler — passphrase kullanıcıda kalır (zero-knowledge).

🔐 Mimari — TD Panel monitor + Duplicati agent

  • Duplicati open-source Windows istemcisi müşteri PC'sine kurulur; AES-256 şifreleme, incremental + dedupe (5 GB backup değişince sadece 50 MB upload), 7-günlük deneme sonrası saldırganlık dostu retention (grandfather-father-son).
  • TD Panel sadece orkestrator + monitor. Yedek içeriği sunucumuzdan asla geçmez — direkt PC → şifreli → kullanıcının cloud hesabı. Passphrase de sunucuda saklanmaz (kaybolursa restore imkansız → UI'da güçlü uyarı).
  • Webhook receiver (backup_cloud_webhook.php): Duplicati --send-http-url her backup sonrası JSON rapor postlar; TD Panel status/boyut/dosya sayısı/hata güncellenir.

📊 Kullanıcı arayüzü — backup_cloud.php

  • Cihaz wizard'ı: sağlayıcı (4 seçenek) + tıklanabilir klasör preset chip'leri (Belgeler, Masaüstü, Muhasebe programları Logo/Mikro/ETA/Netsis, D:/E: sürücü kökü) + "Bilgisayardan Gözat" butonu (webkitdirectory + prefix picker modal).
  • KPI Row: Kayıtlı cihaz sayısı · Son yedek yaşı · Toplam boyut · Sorunlu cihaz sayısı.
  • Cihaz listesi: Status badge (Sağlıklı/Uyarı/Hatalı) · Config indir · Webhook URL kopyala · Sil.
  • 12 adımlık kurulum rehberi (Duplicati indir → OAuth → passphrase → source seç → schedule → advanced webhook 3 ayarı → Run now → doğrulama) + Sık Sorunlar 5 madde.

🚨 Dashboard entegrasyonu + uyarı

  • Bulut Yedek Sağlığı widget'ı dashboard'da: son 5 cihaz + genel status badge (Sağlıklı/Kontrol edin/Aksiyon gerekli).
  • Alert cron (backup_cloud_alerts.php, günlük 09:00): 48 saat yedek yoksa veya status=fail ise tenant admin'lere HTML e-posta uyarısı — cihaz listesi + yaş + hata detayı ile.

💰 Plan matrisi

  • Starter · Free: ❌ Yok
  • Professional: ✅ 1 cihaz · 4 sağlayıcı · günlük yedek · 48h uyarı
  • Business: ✅ + öncelikli destek
  • Enterprise: ✅ + çoklu cihaz + custom retention politikaları

🔒 Güvenlik + KVKK

  • Zero-knowledge encryption: Passphrase Duplicati kurulumunda kullanıcı belirler, sunucuya asla gitmez. Yedek içeriğine ne TD Panel ne de bulut sağlayıcı erişebilir.
  • Webhook secret: 48-char hex, cihaz başına UNIQUE, rate-limited endpoint (60 req/60sn), body 500KB cap.
  • Data ownership KVKK dostu: Yedek kullanıcının kendi bulut hesabında. TD Panel sadece taşıyıcı sinyal (status raporu). Cross-border data transfer sözleşmesi kullanıcının kendi cloud sağlayıcısıyla.
  • Config export: Duplicati JSON import edilebilir; TargetURL provider bazlı (googledrive://, onedrivev2://, dropbox:///, s3://) — kullanıcı sonradan OAuth Login yapar.

Sayı özet: 813 satır kod · 5 yeni dosya (backup_cloud.php + webhook + widget + cron + migration) · 4 provider · 12 adım kurulum rehberi · plan gate (Professional+). MVP production-ready — Demo tenant üzerinde E2E test doğrulandı (POST 200, status/boyut/dosya sayısı/audit log). Kurulum ~10 dk müşteri PC'si başına.

30.07.2026
Product

Landing + panel UX yenilemesi: premium arkaplan, sidebar akordeon, row aksiyonları, Stok terminolojisi

3 günlük yoğun UX yenilemesi. Landing sayfası premium hisseye çıktı, panel içi tutarlılık ve keşfedilebilirlik ciddi seviyede arttı. 40+ commit'in tematik özeti.

🎨 Premium arkaplan — landing + login

  • Aurora + hairline gridpartials/hero_backdrop.php reusable partial. 4 renkli gradient blob (mavi/cyan/mor/emerald) 22-40s organik float animation, mix-blend-mode: screen ile iç içe erir. Statik SVG 40×40 grid, kenar vignette maskesi ile merkezde tam, kenarlarda kaybolur.
  • Uygulama: home.php hero + login.php viewport-full. Sıfır JS (CSS-only), GPU-accelerated translate3d + will-change: transform. prefers-reduced-motion ve mobile guard'ları hazır.
  • Landing 02-product-first patch — canlı badge (pulse dot), preview-frame accent glow, hero-copy içinde bağlamlı "Kurulum Sihirbazını Başlat" butonu, hareketli fake cursor dashboard mockup içinde (Vercel/Linear tarzı).

🌗 Dark mode kontrast fixleri

  • Vercel binary override sorunu--ui-primary dark tema'da #ededed (beyaz-gri) olduğu için birçok yerde "beyaz-üstünde-beyaz" oluşuyordu. Toplam 10+ element düzeltildi:
    • Pagination aktif sayfa, .preset-btn.active, .td-save-bar .btn-save, .sidebar-badge-info, .notes-tab.active, .filter-pill.active, .view-segment a.active, .type-toggle radio labels, AI chat header, e-Fatura OAuth popup butonu
    • Fix: sabit brand mavi (#006AFF) safety override panel-vercel.css chain sonunda
  • Bootstrap 5 body variable override — dark tema için --bs-body-color, --bs-secondary-color, --bs-emphasis-color vb. 10 CSS var eklendi. .text-body, .text-secondary vb. utility'ler artık doğru kontrastta.
  • FullCalendar dark mode — 12 FC CSS variable override (--fc-neutral-bg-color, --fc-list-event-hover-bg-color vs.) + explicit .fc-list-day-cushion safety. Etkilenen sayfalar: it_calendar.php, hr_leaves.php, tour.php, about_panel.php.
  • home.php dark contrast.bento-icon, .pricing-teaser, .testimonial-avatar için color: var(--bg) ile Vercel binary ters kontrast (Sprint 8.30 kalıntı bug).

📂 Sidebar akordeon — Envanter · İK · Destek

  • 13 yeni alt sekme — tab yapılı sayfaların alt tab'larına doğrudan link:
    • Envanter → Donanım: Stok, Hurda, Sunucular (3)
    • Envanter → Sigorta/Belge: Takip, Arşiv, İptal (3)
    • İnsan Kaynakları → İzin Yönetimi: Aktif, Arşiv, Takvim, Kanban (4)
    • Destek → Notlar: Tümü, Notlar, Aktif Görevler, Tamamlanan (4)
    • Destek → Önemli Linkler: Linkler, İndirmeler (2)
  • Akordeon toggle — parent link'in yanında + / düğmesi (CSS-only ::before, icon-agnostic). localStorage state persist. Active sub-tab varsa parent otomatik açık başlar.
  • 3 render path unifiedrenderPrimaryLink (Envanter), HR grubu, Destek grubu — hepsi tek tablosuna bağlı sub-aware active detection.

📋 Row aksiyonları standart sıra

  • Kural: Detay → Düzenle → ... → Sil (Sil her zaman sonda, Detay her zaman başta). 7 sayfada tutarlı: hardware, licenses, services, employees, payments, insurance, customers.
  • Extra aksiyonlar detay modal footer'ına taşındı — row temiz kalır, detay içinde bağlamlı akışlar:
    • hardware.php: Zimmet Tutanağı, Servis Kaydı, QR Etiket, Şubeye Taşı (4)
    • licenses.php + services.php: Yenile (+1 yıl)
    • payments.php: Faturaya Çevir (e-Fatura/e-Arşiv taslağı)
    • insurance.php takip tab: Yenile, Arşivle, İptal Et (3)
  • JS pattern: show.bs.modal event'inde trigger'ın data-* attribute'larından footer buton href/hidden input'ları dinamik set edilir. Permission gate (data-can-manage vb.) ile koşullu görünürlük.

📦 Envanter yönetimi — Stok terminolojisi + yeni özellik

  • "Boştaki Sağlam" → "Stok" yeniden adlandırma (5 kullanıcı-görünür metin: tab label, redirect msg, section header, form etiketi, employee release desc). Sidebar sub-tab, tab label, modal başlığı tutarlı.
  • Yeni: Hardware "Stoğa Taşı" özelliğihardware_form.php'de checkbox ile: cihazı [STOK] placeholder employee'ye çevirir, released_condition, released_at, released_from_employee_id, released_from_name alanları doldurulur. Hurda ile mutex (aynı anda ikisi işaretlenemez). Personel değişimi + audit için.

🎯 Dashboard + tab kart görsel tutarlılığı

  • Vercel Geist palette — 3 kart set'i (KPI glance, metric cards, .mail-kpi support stats) hepsinde üst 3px renk çubuk, hover'da 5px. Palette-bağımsız sabit renkler:
    • Blue #0070f3, Emerald #10b981, Amber #f5a623, Red #ee0000, Cyan #22d3ee, Purple #7c3aed
  • Panel-nav-tabs birleşimi — 8 sayfada (hardware, hr_leaves, insurance, important_links, payments, tools, e-posta admin) aynı .panel-nav-tabs stili. Bootstrap standard + border-bottom active indicator.
  • Dashboard hero orb ambience.panel-hero::before/::after subtle radial blur (mavi + cyan), "Sistem Aktif" trust badge'inde dashLivePulse yeşil nabız animasyonu.

🔧 UX iyileştirmeleri + temizlikler

  • Notlar & Yapılacaklar composer redesign — Textarea üstte tam genişlik + alt bar (Not/Görev pill toggle + büyük Ekle CTA + ⌘↵ kısayol ipucu). Focus'ta subtle brand mavi glow. Linear/Notion tarzı.
  • Görünümler → Görünüm (tekil) — buton stili Filtrele ile birebir aynı (.btn-filter-apply). Filtrele butonunun yanına taşındı (4 sayfa) — CRUD cycle daha akıcı.
  • Dışa Aktar UI kaldırıldıexport_dropdown() boş string döndürüyor. Rapor (colPickerModal) tek export akışı olarak kaldı. 20+ sayfada dokunmadan silindi. Backend ?export=csv/xlsx/pdf handler'ları bulk toolbar için korundu.
  • Kurulum Sihirbazı auto-open kaldırıldı — dashboard'a girişte artık otomatik açılmıyor. Hero'daki "Kurulum Sihirbazını Başlat" butonuna tıklandığında açılır.
  • AI Chat header — brand mavi bg + beyaz metin sabitlendi (Vercel binary'de görünmeme sorunu çözüldü).

⚡ Performans + operasyon

  • SA panel CSS cache-buster — 21 SA sayfasında panel-v2.css ?v=filemtime eklendi. Deploy sonrası SA kullanıcıları eski CSS'i görmez.
  • panel-vercel.css safety override chain — chain'in en sonuna 4 bölüm: Bootstrap dark vars, FC dark, contrast safety, 02-product-first global. panel-v2.css'e dokunmadan tüm bug'lar tek noktadan.
  • Panel Kullanım Rehberiabout_panel.php tab 4 tamamen güncellendi: 6 accordion + 1 yeni bölüm (Filtre, Görünüm, Kurulum Sihirbazı, AI Sohbet), 180 satır TR+EN paralel metin.

Sayı özet: 40+ commit · 60+ dosya düzenlemesi · +2000/-1500 net satır · 5 backup (rollback güvencesi). Panel görsel dili artık tutarlı (Vercel Geist), keşfedilebilirlik ↑ (sidebar akordeon + row-detay ayrımı), landing premium (aurora backdrop).

02.07.2026
Product

HR self-servis izin portalı + takvim view + marka logo yayılımı

Personel kendi izin taleplerini güvenli bir portal üzerinden girer, İK takvim üzerinden onaylar. İş yükü azaltıcı 5-fazlı sprint.

  • Kalıcı personel portalıhr_leave_portal.php
    • İK hr_leave_token.php'de "Kalıcı Portal Linki" seçer → token_type='personal', 365 gün TTL
    • Personel ?t=<hash> ile giriş yapar: dashboard'da kullanılan / bekleyen / kalan yıllık kota tile'ları + yeni talep formu + son 20 talep + bekleyenler için "İptal Et"
    • Mevcut tek-kullanımlık hr_leave_public.php akışı korundu — geriye dönük uyumlu, otomatik yönlendirme
    • Aynı personelde yeni portal linki üretildiğinde önceki otomatik iptal edilir (tek aktif invariant)
  • HR takvim viewhr_leaves.php?tab=takvim (FullCalendar 6.1)
    • Ay / Hafta / Liste view, TR locale, status renk paleti (bekliyor sarı, onaylı yeşil, reddedildi kırmızı, iptal gri)
    • Event click → detay modal: firma, tarih, gün, durum, kaynak, neden + onay/red butonları (canWrite + status='bekliyor' şartıyla)
    • Yeni JSON endpoint hr_leaves_calendar_api.php — customer_id + tarih range + opsiyonel status filtresi, TD_JSON_ENDPOINT pattern
    • Reddedilen / iptal edilen event'ler için toggle checkbox — refetch tetikler
    • Composite index idx_hr_leaves_cal (customer_id, start_date, end_date) range query performansı
  • Akıllı kontroller — portal formu submit öncesi
    • Yıllık kota: hr_leave_types.max_days_per_year aşılırsa HARD BLOCK — "talep 7 gün, kalan hakkınız 3 gün..."
    • Departman çakışması: aynı departmanda o tarihte izinli var mı → SOFT WARNING + zorunlu onay checkbox, kaydolmaz
    • Sticky form değerleri (validation error'da kullanıcı yeniden yazmasın)
  • Bildirim akışılib/HrLeaveMailer.php
    • Yeni onRejected(, , ) — personel'e "izin reddedildi" e-postası (opsiyonel İK notu)
    • Yeni notifyHrOfNewRequest(, ) — portal talebi sonrası İK ekibine (admin + can_write user'lar) toplu bilgi + CTA butonu
    • Best-effort try/catch — mail hatası ana akışı bozmaz
  • Marka logo yayılımı — 15 marketing/public sayfa
    • Eski "TD" text mark → yeni 4-diamond cube (logo-cube-white.svg · siyah karo)
    • pricing, auth_guide, errors, examples, integrations, self_host, webhooks_catalog, changelog, roadmap, legal_page, components, trust, onboarding, status, api
    • Her sayfa kendi lokal .brand-mark CSS'i; background:#0a0a0a + overflow:hidden + child img rule ile normalize edildi

Şema değişikliği idempotent (hr_init.php içinde information_schema check + ALTER pattern'i), ilk HR sayfa yüklemesinde çalışır. sw.js td-v57 → td-v58, endpoint bypass listesine hr_leaves_calendar_api.php eklendi.

22.06.2026
Güvenlik

Webhook secret rotation — Logger entegrasyonu + roadmap güncelleme

Webhook secret rotation altyapısı zaten implement edilmişti (7 gün grace period, X-TD-Signature-Previous header desteği, UI butonu). Bu güncellemede observability pipeline'a bağlandı.

  • Logger::warn('Webhook secret rotated') — rotation event'i audit_log yanında JSON event stream'e de düşer. Sentry uyumlu (anlık alarm).
  • Context: webhook_id, grace_until (7 gün sonrası), rotated_by (user_id)
  • Roadmap güncellemesi: "Webhook secret rotation UI" item'ı "shipped" durumunda olduğu için silindi; yerine "Webhook diff payload coverage genişletme" (insurance renewal, tenant lifecycle event'leri) eklendi.

Aktif rotation akışı: webhooks.php listede 🟡 turuncu butonu → confirm → yeni secret oluşur, eski 7 gün X-TD-Signature-Previous'a gider. Alıcı taraf bu sürede yeni secret'a geçer.

22.06.2026
Product

Public webhook event kataloğu + PWA cilası

Geliştirici keşfedilebilirliği ve mobil deneyim için iki cila.

  • /webhooks_catalog.php — Stripe Events benzeri tek sayfa public referans.
    • 10 entity × 3 action (created/updated/deleted) audit-derived event + 5 destek talebi event + sistem testi = 36 olay listelendi
    • HMAC-SHA256 imzalama (Node.js doğrulama snippet'i dahil), secret rotation grace, idempotency notu
    • Exponential backoff [60, 300, 900, 3600, 21600] saniye, 10s timeout, 60 req/dk rate limit
    • Örnek payload'lar: hardware.created + support_ticket.replied
    • Nav linkleri: api.php, status.php, changelog.php, roadmap.php — tüm dev docs cross-link
  • PWA cilası — mobile install deneyimi tutarlandı.
    • Auto-inject theme-color Vercel blue (#006aff) — eski slate hex'leri kaldırıldı
    • Stale manifest.json silindi (hardcoded /teknikdanisman/ path ile prod'da kırıktı) — manifest.php dinamik APP_BASE çözüyor
    • Offline fallback sayfası Geist Sans + outline icon + online listener auto-reload

Smoke test sayısı 7 → 8 (webhook catalog HTTP 200 + key string'ler doğrulanıyor).

22.06.2026
Yeni

SSO/OIDC PoC — Microsoft Entra ID kanıtlandı (composer'sız)

Kurumsal müşteri unlock'unun ilk adımı: OpenID Connect entegrasyonu. Composer dependency'siz, vanilla PHP + OpenSSL ile RS256 JWT verify. Mevcut login flow'u hiç dokunmaz — PoC ayrı endpoint'te (/sso_test.php, admin-only).

  • lib/SsoOidcClient.php — minimal OIDC client
    • Discovery (.well-known/openid-configuration)
    • Authorization URL üretimi (state + nonce + CSRF guard)
    • Code → ID token exchange
    • RS256 imza doğrulama (JWKS fetch + OpenSSL public key reconstruction)
    • Claims kontrolü: iss, aud, exp, nbf, nonce
  • /sso_test.php — admin-only test endpoint:
    • Config eksikse adım adım kurulum ekranı (Azure Portal step-by-step)
    • Microsoft'a redirect → callback'te ID token decode + claims göster
    • "PoC kullanıcıya login açmadı, mevcut session aynen devam ediyor" disclaimer
  • RFC 0003 — SSO/OIDC Entegrasyonu — OIDC vs SAML kararı, provider strategy (Entra → Google → Okta), JIT provisioning senaryoları, 3 sprint roll-out planı, başarı kriterleri
  • 27 yeni unit test — base64url, JWT format validation, malformed input rejection. Toplam 204 → 231 passing
  • docs/secrets.md bölüm 7 SSO config detayları + rotation prosedürü

Production rollout: Sprint 2'de ayrı RFC ile JIT user provisioning + login.php entegrasyonu + tenant başına SSO config UI. Bu PoC tasarımın kanıtı.

22.06.2026
Platform

Restore otomasyonu — tek tenant + backup envanter scriptleri

DR runbook'taki "15 dk manuel adımlar" otomatize edildi. Drill veya gerçek incident anında zaman tasarrufu + insan hatası riski azalır.

  • ops/restore_tenant.sh — Tek tenant veya master DB restore.
    • Sanity check: DB adı pattern (td_master veya td_tenant_*)
    • Integrity verify: gunzip + SHA256SUMS karşılaştırma
    • Interactive guard: "EVET" yazılmadıkça DROP yapmaz
    • DROP+CREATE → restore → smoke (table/customer/employee count)
    • Logger::warn('Database restored') event Sentry'ye + audit trail
  • ops/list_backups.sh — Backup envanteri.
    • Tüm timestamp'leri tablo halinde (boyut + içerik özeti)
    • Latest symlink hedefi işaretli
    • last_run / last_integrity_check / last_offsite_run meta JSON'ları yazdırır
    • -v flag: her dump dosyası ayrı listelenir
  • DR runbook bölüm 3.1 güncellendi: "A) Otomatik script (önerilen)" + "B) Manuel adımlar (fallback)" iki yöntem. Tahmini süre 15dk → 5dk.

Production'da sadece list_backups test edildi (read-only). restore_tenant gerçek tenant'a karşı çalıştırılmadı (drill kapsamı) — interactive guard sayesinde yanlışlıkla tetiklenemez.

22.06.2026
Yeni

Public /roadmap.php — Şu an / Sırada / Sonra board

/roadmap.php yayında. Linear/Vercel-style "Now / Next / Later" üç sütun board.

  • Şu an (3 item): iyzico aktivasyonu, off-site backup config, Sentry alarm verification
  • Sırada (5 item): SSO production, ilk DR drill, Insurance UX, webhook secret rotation, Lighthouse threshold mandatory
  • Sonra (7 item): Laravel parallel shell, SOC 2 Type 1, multi-currency, Google/Okta OIDC, PWA offline, webhook expansion, RAG AI
  • 5 kategori chip: Enterprise · Ürün · Platform · Güvenlik · DX
  • RFC linki her item için (RFC 0003 SSO, RFC 0004 iyzico vs.)
  • Dark/light otomatik · responsive · prefers-color-scheme
  • Tüm public sayfa navigation'larına eklendi (login/changelog/legal pages footer)

"Söz değil niyet" disclaimer notu açık. Stripe/Linear pattern — şeffaflık + esneklik. Kod-dağıtımıyla güncellenir, GitHub'da diff'lenebilir.

22.06.2026
İyileşti

Ops setup docs + CI shellcheck — onboarding ve script güvenliği

Yeni sunucu setup'ı ve script regression risklerini azaltan üçlü:

  • ops/rclone.conf.example — Backblaze B2 EU / Cloudflare R2 / S3 uyumlu depolama için hazır rclone config template'leri (placeholder credentials). Off-site backup 10 dk'da aktivasyon.
  • docs/secrets.md — Tüm config.local.php constant'larının isim/format/amaç referansı. Gerçek değer içermez (KASA'da). DR senaryosunda secret restore akışı dokümante.
  • CI: shellcheck jobops/*.sh dosyaları her push'ta lint edilir. Backup/integrity/offsite script'lerinde silent regression yakalanır.
  • README.md documentation tablosuna 3 yeni link (DR runbook, secrets, ops).
22.06.2026
Yeni

Off-site şifreli yedek upload — DR runbook #1 maddesi kapandı

Tek-bölge backup başarısızlık riski kapatıldı. Sunucuya rclone kuruldu, encrypt+upload script altyapısı hazır. Kullanıcı bir storage provider seçip TD_OFFSITE_REMOTE tanımlayınca otomatik aktif.

  • ops/offsite_upload.sh: Backup tamamlandıktan sonra otomatik tetiklenir · tar -czf - | gpg --symmetric AES256 ile şifreler · rclone'a 10MB/s bant limitiyle push · uzakta varlık doğrular · 30 gün uzak retention · last_offsite_run.json meta
  • Eksik config = graceful skip: TD_OFFSITE_REMOTE tanımlı değilse ana backup'ı bozmaz, meta'ya status: skipped yazar
  • /health.php + /status.php: backup_offsite component eklendi — yapılandırılmamış/eski/başarısız ayrımı
  • Önerilen provider: Backblaze B2 EU, Cloudflare R2, AWS S3 Glacier EU veya kendi sunucunuz
  • DR runbook: Step-by-step Storage Box kurulumu + provider karşılaştırma tablosu + restore drill prosedürü dokümante edildi

Senin yapacakların: Provider seç → rclone config → config.local.php'de TD_OFFSITE_REMOTE tanımla. ~10 dk iş. Sonrası otomatik.

22.06.2026
İyileşti

iyzico subscription PoC — plan catalog tek kaynağa konsolide

Trial→paid funnel altyapısı: mevcut iyzico HTTP client + checkout + webhook + plan catalog mevcut ama legacy 3-plan modern 4-plan ile uyumsuzdu. Konsolidasyon tamamlandı, aktivasyon plan dokümante.

  • Catalog tek kaynak (strangler-fig): iyzico_plans_catalog() artık Subscription::planDefinitions()'tan derive — legacy basic/pro/enterprise → modern starter/professional/business. Enterprise (price=0) sales-led, iyzico checkout dışı.
  • /iyzico_test.php admin-only PoC: config kontrolü + plan catalog görselleme + sandbox checkout test endpoint. Mevcut subscription flow'a hiç dokunmaz.
  • RFC 0004:
    • Plan catalog konsolidasyonu (before/after mimari diagram)
    • iyzico integration full flow (checkout → callback → webhook)
    • 4 alternatif değerlendirme (Stripe TR / PayTR / manuel / Paddle)
    • 4 sprint roll-out planı (PoC → Sandbox → Production → Polish)
    • Risk listesi: webhook race condition, PCI scope, dunning management
  • docs/secrets.md bölüm 8 yenilendi: sandbox vs production, test kart, RFC 0004 link
  • 22 yeni unit test — catalog derive doğrulama (slug eşleşmesi, legacy yokluğu, enterprise filtreleme). Toplam: 231 → 253 passing

Aktivasyon adımı: Senin iyzico sandbox hesabı aç → API key'leri config.local.php'e ekle → Pricing Plans iyzico merchant panel'de oluştur → end-to-end test. RFC 0004 Sprint 2 maddeleri.

22.06.2026
İyileşti

InsuranceRenewalService — strangler-fig 3. resource

Sigorta poliçesi yenileme akışı (yeni INSERT + eski arşivle, atomic transaction) insurance_form.php'den çıkarılıp lib/InsuranceRenewalService.php'e taşındı.

  • 22 satır kod tekrarı silindi — page-level POST handler 9 satıra düştü
  • RenewalService ile paralel pattern — RFC 0002'de "ileride" notu kapandı. İki servis aynı disiplin (auth + audit_log + Logger::info + exception kontratı) ama farklı akış (bump vs archive_and_clone)
  • 7 yeni unit test — toplam 197 → 204 passing. Validation + auth path doğrulandı
  • Domain service çoğul: Artık lib/ içinde 2 renewal service + RenewalRunner pattern, gelecekteki domain extraction'lar (notification, audit) için somut örnek
22.06.2026
Product

Dev surface tamamlandı — Auth/Examples/Cron + 502 incident fix

Public developer dokümantasyonu Stripe-seviyesinde tamamlandı, operatör tarafı için cron görünürlüğü eklendi, aynı gün yaşanan SA 502 incident'i kapatıldı.

Dev docs (public)

  • /auth_guide.php — Authentication getting-started: 4 adımlı ilk key flow, scope tablosu (read/write/admin), 90 günlük rotation prosedürü, env var / HTTPS / per-integration key güvenlik pratikleri, SSS.
  • /examples.php — 5 senaryo × 5 dil (cURL, Node.js, Python, PHP, Go) = 25 snippet. Müşteri listele + pagination, personel oluştur + Idempotency-Key, servis/lisans yenile, webhook receiver (HMAC verify timing-safe), tüm sayfa pagination loop (rate-limit retry).
  • Tab UI — dil seçici sekmeler + hover'da kopyala butonu (1.4s "Kopyalandı" feedback), Geist Sans/Mono tipografi.

Operatör tarafı (super admin)

  • super_admin/audit_search.php — Cross-tenant audit_log arama: filtre (tenant/action/entity/user/IP/free-text/tarih), action pill renkli (create yeşil, update sarı, delete kırmızı, login mavi), CSV export (UTF-8 BOM).
  • super_admin/cron_monitor.php — 8 zamanlanmış görev için son çalışma + status badge + KPI strip. Meta JSON dosyaları (last_run, last_integrity_check, last_offsite_run) + log mtime'larından okur. 2026-06-21 backup silent-failure incident'ine doğrudan yanıt.

Cross-link dev surface

Tüm public sayfalar birbirine bağlı: api ↔ auth_guide ↔ openapi ↔ postman ↔ examples ↔ webhooks_catalog ↔ errors ↔ changelog ↔ roadmap ↔ status.

Bonus: 502 incident kapatıldı

Aynı gün öğleden sonra SA paneli 502 incident'i yaşandı ve resolved. Root cause: super_admin/index.php'te ölü kodun (PDOStatement cast warning) Logger üzerinden FastCGI stderr buffer'ını taşırması. Fix: ölü kod kaldırıldı + master DB'ye audit_log tablosu eklendi + MigrationRunner DDL-safe yapıldı.

Test: prod karşı 335 yeşil (smoke 7 → 12). Investment-readiness: dev experience tarafı artık tam.

22.06.2026
Yeni

Haftalık backup integrity check + Sentry alarm

"Backup alındı" ile "backup gerçekten geri yüklenebilir" arasındaki uçurumu kapatan haftalık otomasyon. Schrödinger backup pattern'ine son.

  • ops/verify_backup_integrity.sh + /etc/cron.d/teknikdanisman-backup-integrity (Pazar 04:00)
  • 6 kontrol katmanı: latest symlink · SHA256SUMS doğrulama · her .sql.gz gunzip -t · application_files.tar.gz tar -tzf · last_run freshness · off-site durumu
  • Hata → Sentry: Script içinden PHP CLI ile Logger::critical() çağrılır — existing observability pipeline reuse (zero ekstra altyapı)
  • /health.php + /status.php: backup_integrity component eklendi — 14 gün üstü stale → fail, 10 gün üstü warn
  • İlk run smoke test: 8 dosya hash'i doğrulandı, 7 sql.gz OK, application files 3380 entry, status warn (sadece off-site eksik)

Bugünün bulgu örüntüsü: 2 ay sessiz backup hatası → Logger latent bug yakaladı → Yeni backup script → Off-site upload skeleton → Haftalık integrity check + Sentry alarm. Observability + DR güveninin somut zinciri.

22.06.2026
Düzeltme

Backup script v2 + DR runbook — 2 aylık silent failure giderildi

Kritik bulgu: Eski backup script config.local.php'de tanımsız olan $DB_NAME environment'ı bekliyordu — 2 ay+ boş (388 byte) yedek üretiyordu. Latest symlink April 28'i gösteriyordu; tüm sistem yedeksizdi.

  • Yeni script (ops/teknikdanisman_backup.sh): Master DB + tüm aktif tenant DB'leri ayrı ayrı dump · application files · SHA256SUMS · atomic latest symlink · 14 gün retention · last_run.json meta dosyası
  • Eski script: /usr/local/bin/teknikdanisman_backup.sh.bak'a yedeklendi
  • İlk başarılı run: Master 27KB + 6 tenant (4.2MB+5×~150KB) + app 47MB · toplam 52MB · 14 günden eski 54 boş klasör otomatik temizlendi
  • /health.php + /status.php: "Yedekleme" component'i eklendi — <30 saat OK, 30-48 saat warn, >48 saat fail. Sentry alarm uyumlu
  • DR runbook (docs/disaster-recovery.md) yazıldı: RPO ≤ 24 saat, RTO ≤ 4 saat hedefleri · 3 senaryo (tek tenant / master / full sunucu) adım adım · quarterly drill takvimi · eksikler listesi (off-site, GPG encryption, integrity test)
  • SECURITY.md Backup & DR + Observability bölümleri eklendi

Production yedek artık doğrulanmış şekilde işliyor.

22.06.2026
Platform

Audit arama + Postman collection + Errors reference

Hem operatör (super admin) hem dev tarafında keşfedilebilirliği büyüten üç ekleme.

  • Super Admin → Audit Arama (super_admin/audit_search.php).
    • Cross-tenant audit_log sorgusu: her aktif tenant'a tek tek bağlanır, filtreli çekim sonra global merge sort yapar.
    • Filtreler: tenant, action, entity_type, user (id veya label), IP, free-text (context/old_values/new_values), tarih aralığı, limit 50–500.
    • Action pill renkli (create yeşil, update sarı, delete kırmızı, login mavi), context kolonu tıklayınca genişler.
    • CSV export — UTF-8 BOM ile Excel uyumlu.
    • Eski şema fallback (user_label/old_values/new_values kolonları yoksa NULL select).
  • /postman.php — Postman v2.1 collection JSON.
    • 5 endpoint, 5 folder, attachment olarak indirilir → Postman/Insomnia/Bruno tek tık import.
    • Bearer auth + {{api_key}}/{{base_url}} variable'ları, query parametreleri keşfedilebilir disabled flag ile.
    • POST'lar {{$guid}} ile dinamik Idempotency-Key.
  • /errors.php — Stripe ErrorReference benzeri public hata kataloğu.
    • Transport/Auth + Resource + Validation hata kodları (toplam 25+) HTTP status, açıklama ve çözüm ile.
    • Rate limit header'ları ve Idempotency-Key kullanımı dahil.
    • Standart hata zarfı + validation_failed alan-bazlı detay örnekleri.

Smoke test sayısı 7 → 11 (errors, postman, webhooks_catalog, audit_search guard). Cross-link'li dev surface: api ↔ openapi ↔ postman ↔ webhooks ↔ errors ↔ changelog ↔ roadmap ↔ status.

22.06.2026
Güvenlik

Critical-path audit Logger entegrasyonu

Security-sensitive operasyonlar artık iki katmanlı audit: DB audit_log() (persistant trail) + Logger::info/warn (JSON event stream → nginx log → Sentry).

  • Tenant lifecycle: super_admin/tenant_form.php tenant created event (slug, db_name, plan_id, billing_cycle, created_by_sa)
  • API key lifecycle: api_keys.php create (info) + revoke (warn) + delete (warn) — key_id + tenant_id + label + scopes context
  • Auth events: login.php success (info) ve failed (warn) — username + remaining attempts
  • System backup download: super_admin/system_backup.php super admin tarafından manuel backup tetiklenmesi (warn) — sa_user + archive_bytes

Niye iki katman? audit_log() DB trail (sorgulanabilir, kim-ne-ne-zaman). Logger::warn/info JSON event stream — Sentry'ye opsiyonel iletim, log aggregator-ready, observability dashboard. Yatırımcı diligence'ta "audit log + observability" sorusuna iki yanıt.

21.06.2026
İyileşti

Versiyonlu migration sistemi — Linear/Stripe pattern

Şema değişikliklerini izlenebilir, sıralı, idempotent şekilde uygulamak için yeni bir runner katmanı eklendi. Mevcut lib/Migrations.php (settings.php başında çalışan idempotent block'lar) coexist eder — sadece yeni migration'lar buraya gelir.

  • Dosya tabanlı: migrations/tenant/YYYYMMDD_NNNNNN_kebab-name.php veya migrations/master/...
  • Tracking: Her DB'de otomatik schema_migrations tablosu
  • Transactional: Her migration kendi transaction'ında; hata → rollback + Logger::critical
  • CLI: php migrate.php status / up / rollback · --master · --tenant=slug filtreleri
  • Observability bağlantısı: Hata Sentry DSN tanımlıysa anında alarm geçer

Detay ve örnek migration: migrations/README.md

21.06.2026
İyileşti

Strangler-fig refactor başlangıcı — RenewalService

Mimari yenilenmenin ilk somut adımı: services.php ve licenses.php'in yenileme handler'larında birebir kopyalanan iş mantığı lib/RenewalService.php'e taşındı.

  • 32 satır kod tekrarı silindi — page-level dosyalar 6 satıra düştü, sadece HTTP routing + flash kaldı
  • Tek konfigürasyon noktası — yeni resource eklemek için RESOURCE_CONFIG'e tek entry yeter (insurance.php ileride bunu kullanabilir)
  • Test edilebilir hale geldi — PDO mock'la unit test mümkün
  • Observability entegre — her yenileme Logger::info('Resource renewed', ...) ile JSON log üretir
  • Dokümantasyon: docs/rfcs/0002-renewal-service.md

Kullanıcı için davranış birebir aynı; bu büyük rebuild değil — strangler-fig pattern'inin canlı kanıtı. Yatırımcı diligence'ta "Refactor edebiliyor musunuz?" sorusuna somut yanıt.

21.06.2026
Yeni

Domain ve lisans listelerinde tek-tıkla "Yenilendi" aksiyonu

Servisler (services.php) ve Lisans (licenses.php) yönetim sayfalarındaki aksiyon kümesine yeşil Yenilendi butonu eklendi. Onay sonrası mevcut yenileme tarihi +1 yıl ileri alınır.

  • Services: Dolu olan end_date, domain_expiry, hosting_expiry, expiry_date alanlarının her birine +1 yıl. Hiçbiri yoksa end_date = bugün+1 yıl
  • Licenses: renewal_date +1 yıl
  • Tüm yenilemeler audit_log'a yazılır

Manuel olarak tarih düzenlemek için Form sayfası açmaya gerek yok — listeden tek tıkla yenilenebilir.

21.06.2026
Yeni

Public API dokümantasyonu — OpenAPI 3.0 + Redoc

Geliştirici dokümantasyonunu açık erişime aldık. Auth gereken eski api_docs.php içerideki referans olarak kalır; yeni public sayfa Redoc ile render edilmiş Stripe/Linear-style üç-kolon layout sunar.

  • /api.php — interaktif Redoc reference
  • /openapi.php — OpenAPI 3.0 spec (YAML, makine-okunur). Postman / Insomnia / kod üreticileri için doğrudan kullanılır.
  • RFC 0001 + 0000 template yayımlandı: docs/rfcs/

Bearer token oluşturmak için panele giriş yapıp Ağ Araçları → API Anahtarları sekmesini kullanın.

21.06.2026
Düzeltme

Mobil menü, tema butonu ve quick-capture UX iyileştirmeleri

Mobil deneyim ve sağ-üst aksiyon kümesinde bir dizi tutarlılık sorunu giderildi:

  • Mobil menü bazı tarayıcılarda off-canvas drawer'ın transform interpolasyonu nedeniyle açılmıyordu — translate3d tabanlı override ile çözüldü
  • Açık/Koyu mod butonu artık her sayfanın sağ-üst köşesinde — daha önce yalnızca dashboard'da görünüyordu
  • Hızlı Not / Görev butonu (Alt+N) sağ-alt floating circle yerine, top bar'a alındı — funnel butonunun yanına
  • Mobil menüden "Tema Değiştir" ve "Yardım İpuçları" kaldırıldı (top bar'da daha sezgisel konumda)
  • Yanıt Şablonları sidebar'dan kaldırıldı, Destek Talepleri sayfasına buton olarak eklendi
  • API Anahtarları ve Webhooks sayfaları Ağ Araçları altında sekme olarak konsolide edildi
21.06.2026
Yeni

GitHub Actions CI — her push otomatik lint, test, spec validation

Repo'ya CI pipeline eklendi (.github/workflows/ci.yml). Her push ve pull_request'te aşağıdaki üç iş paralel/seri çalışır:

  • PHP Lint — tüm *.php dosyaları PHP 8.3 ile syntax check (vendor/uploads/backups hariç)
  • Unit Testsphp tests/run.php unit; lint başarılıysa çalışır (189 test)
  • OpenAPI Spec Validationdocs/openapi.yaml Redocly CLI ile validate edilir; spec implementation'la ayrışmasın

Concurrent run'lar otomatik iptal — son push hep güncel sonuç verir. README'ye CI badge eklendi; master branch'inin sağlığı doğrudan repo sayfasından görünür.

21.06.2026
İyileşti

Personel evrak yönetimi tek ekrana toplandı

Personel düzenleme ekranı (employee_form.php) artık tüm evrak akışının tek merkezi. Daha önce ayrı bir employee_documents.php sayfasında olan yükleme/silme fonksiyonu, form içine konsolide edildi:

  • 8 kategori aynı ekranda: İşe Başlangıç · Zimmet · İzin · İhtar · İşten Çıkış · Sözleşme · Sağlık & SGK · Diğer
  • Her kategoride sistem tarafından oluşturulan formlar (yazdırma sayfaları) ve yüklenmiş ıslak imzalı evraklar yan yana listelenir
  • Her satırda Aç/İndir + Sil butonu — sistem kayıtları için de silme desteği (örn. iptal edilen ihtar kayıtları)
  • Yeni: İşten Çıkış için A4 print sayfası (employee_termination_print.php) eklendi — teslim/iade checklist'i ile

Eski employee_documents.php URL'i artık employee_form.php?edit_id=X#section-documents adresine yönlendiriyor — eski bookmark'lar kırılmaz.

21.06.2026
Güvenlik

Uyum tabanı: security.txt, gizlilik politikası, DPA

Kurumsal müşteri diligence süreçlerinde sıkça istenen üç belgeyi public olarak yayınladık:

Login sayfasının footer'ına tüm hukuki belgelere kısayollar eklendi. Güvenlik raporu için security@teknikdanisman.net aktif.

21.06.2026
Yeni

REST API: yenileme endpoint + rate-limit header dogfood

RenewalService bugün web POST handler'larından çıkarıldı; aynı servis şimdi public API'a da bağlandı. Bir karar = iki kanaldan tüketim — strangler-fig dogfood.

  • Yeni endpoint: POST /api/v1/renew.php — body {"resource": "service" | "license", "id": 42}
  • Yetki: Bearer token + write scope + idempotency key opsiyonel
  • Cevap: { object: "renewal", resource, id, updated_columns, fallback_used }
  • Rate limit header'ları tüm endpoint'lerde aktif: X-RateLimit-Limit / Remaining / Reset · 429'da Retry-After: 60
  • OpenAPI spec güncellendi/api.php sayfasında doğrudan görünür
  • Limit aşımları artık loglanır (Logger::warn 'API rate limit exceeded') → Sentry alarm uyumlu
  • Cleanup query optimize: Eski rate-hit silme her request'te değil, %5 örnekleme ile (master DB yükü -95%)