Kurumlarda kullanılacak yapay zekâ uygulamalarının ve AI ajanlarının devreye alınmadan önce güvenlik açısından incelenmesi için hazırlanmıştır. Form; veri güvenliği, kişisel verilerin korunması, erişim yetkileri, AI ajanlarının işlem yapabilme sınırları, siber saldırı riskleri ve güvenlik kontrolleri gibi önemli konuları kapsar. Böylece olası güvenlik açıklarının, veri sızıntılarının ve yetkisiz işlemlerin önceden belirlenmesine yardımcı olur.
Formun temel amacı; yapay zekâ sistemlerinin kurumlarda güvenli, kontrollü ve izlenebilir şekilde kullanılmasını sağlamaktır. Güvenlik kontrollerini standart bir yapıda değerlendirir, risk seviyelerini otomatik hesaplar ve tespit edilen eksiklikler için alınması gereken önlemlerin takibini kolaylaştırır.
Değerlendirme sonuçlarının Excel ve PDF olarak raporlanabilmesi sayesinde kayıt, onay ve denetim süreçlerine destek olur. Böylece kurumların yapay zekâ teknolojilerini kullanırken güvenlik risklerini daha etkin yönetmesine katkı sağlar.
Bir Not defteri açarak, aşağıdaki (Mavi satırlar) html kodu içine kaydedin. Not defteri uzantısını .txt yerine ".html" olarak değiştirip kaydedin. Ör: "Yapay Zekâ ve AI Ajanı Güvenlik Ön Değerlendirme Formu.html" sayfayı kapatıp tekrar açtığınızda, web browser üzerinden sayfanız açılacaktır.
Sol tarafta görünen logo için, html dosyanız nerede ise, masaüstü veya oluşturulan bir klasör. Logonuzda aynı yerde olursa forma yansır. Logo ismi "logo.jpg" olmalı. Çift tıklayarak açtığınızda, browser üzerinde form açılışı gerçekleşir. Veya alanına 5 kez peş peşe tıklayarak çalışma esnasında logo değişimi de yapılabilir.
Başlık, başlığın altındaki, başlığın sağındaki ve alttaki yazıları, not defteri içinde "Ctrl + F" tuşları ile kelime yazarak bulabilir, ilgili metinleri kendinize göre uyarlayarak kaydederek kullanabilirsiniz. Başlık alanındaki "OLGUN BAŞKANLIĞI" alanına 5 kez peş peşe tıklayarak; Departman, Müdürlük veya Başkanlığınıza ait bilgiyi manuel girebilirsiniz.
Formun boş hali;
Formun dolu hali:
PDF / Yazdır
Dışarı Aktarılan Excel Verisi:
HTML Kod:
<!doctype html>
<html lang="tr">
<head>
<meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1">
<title>Yapay Zekâ ve AI Ajanı Güvenlik Ön Değerlendirmesi</title>
<script src="https://cdn.jsdelivr.net/npm/xlsx@0.18.5/dist/xlsx.full.min.js"></script>
<style>
:root{--bg:#f8fafc;--blue:#0284c7;--line:#dbe4ee;--text:#172333;--sub:#64748b;--white:#fff;--light:#eff6ff}
*{box-sizing:border-box}body{margin:0;background:var(--bg);font:13px 'Segoe UI',Arial,sans-serif;color:var(--text)}
.shell{max-width:1550px;margin:18px auto;padding:15px;background:#fff;border:1px solid var(--line);border-radius:7px;box-shadow:0 3px 18px #1723330a}
.top{border:1px solid var(--line);border-radius:6px;padding:13px;background:#fff;margin-bottom:14px}
.header{display:flex;align-items:center;min-height:78px;gap:12px}.logo{width:68px;height:68px;object-fit:contain;flex:none}.header-titles{min-width:0;flex:1}.header h1{margin:0;font-size:22px;color:#0f2b46}.header p{margin:5px 0 0;color:var(--sub);font-size:12px}.agency{min-width:150px;max-width:43%;text-align:right;align-self:stretch;display:flex;justify-content:flex-end;align-items:center;white-space:nowrap;font-weight:700;font-size:14px;overflow:hidden;outline:0}.agency.editing{outline:2px dashed var(--blue);white-space:nowrap;overflow:hidden}.logo{cursor:pointer}.agency{cursor:pointer;flex:0 1 auto;min-width:0;max-width:43%;text-overflow:clip}.agency.editing{cursor:text}.logo:focus-visible,.agency:focus-visible{outline:2px solid var(--blue);outline-offset:2px}.logo-file-input{display:none}
.toolbar{border-top:1px solid var(--line);padding-top:12px;margin-top:12px;display:flex;flex-wrap:wrap;gap:8px;align-items:center}button,.upload{cursor:pointer;border:1px solid #cbd5e1;background:white;color:#1e293b;padding:9px 12px;border-radius:5px;font:600 12px 'Segoe UI',Arial,sans-serif}button:hover,.upload:hover{border-color:var(--blue);background:#f0f9ff}.primary{background:var(--blue);color:white;border-color:var(--blue)}.primary:hover{background:#0369a1;color:white}.export-excel{background:#dbeafe;border-color:#93c5fd;color:#1e40af}.export-excel:hover{background:#bfdbfe}.import-excel{background:#dcfce7;border-color:#86efac;color:#166534}.import-excel:hover{background:#bbf7d0}.print-pdf{background:#f1f5f9;border-color:#cbd5e1;color:#334155}.print-pdf:hover{background:#e2e8f0}.upload input{display:none}.toolbar .hint{margin-left:auto;font-size:11px;color:var(--sub)}
.summary{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:9px;margin-bottom:14px}.stat{border:1px solid var(--line);border-radius:6px;padding:12px;background:#fff}.stat small{display:block;color:var(--sub);font-weight:600}.stat strong{display:block;font-size:20px;margin-top:5px}.risk-low{color:#15803d}.risk-medium{color:#a16207}.risk-high{color:#c2410c}.risk-critical{color:#b91c1c}
section{border:1px solid var(--line);border-radius:6px;margin:0 0 12px;padding:0 13px 13px;background:white}section h2{margin:0 -13px 13px;padding:10px 13px;background:#f1f8fd;border-bottom:1px solid #d4e8f7;color:#075985;font-size:14px;display:flex;justify-content:space-between;align-items:center}section h2 small{font-size:11px;color:#64748b;font-weight:400}.grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:11px}.field{min-width:0}.field label{display:block;margin-bottom:5px;font-size:12px;font-weight:600}.field input,.field select,.field textarea,.control select,.control input,.action input,.action select,.action textarea{width:100%;min-width:0;background:#fff;color:#172333;border:1px solid #cbd5e1;border-radius:5px;padding:8px;font:12px 'Segoe UI',Arial,sans-serif}.field textarea,.action textarea{min-height:68px;resize:vertical}.span2{grid-column:span 2}.span4{grid-column:span 4}input:focus,select:focus,textarea:focus{outline:2px solid #bae6fd;border-color:#0284c7}.subheading{font-weight:700;margin:13px 0 8px;color:#475569}.checks{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:9px}.control{border:1px solid #e2e8f0;border-radius:5px;padding:10px;display:grid;grid-template-columns:minmax(0,1fr) 155px;align-items:start;gap:7px}.control .question{font-size:12px;font-weight:600}.control .note{grid-column:1/-1;display:none}.control .note.open{display:block}.control .meta{font-size:10px;color:#64748b;margin-top:4px}.control.critical{border-left:3px solid #f59e0b}.control select{font-size:11px}.toggle-note{font-size:10px;color:#0369a1;cursor:pointer;border:0;background:transparent;padding:0;text-align:left}.actions{overflow-x:auto}.actions table{border-collapse:collapse;width:100%;min-width:860px}.actions th,.actions td{border:1px solid var(--line);padding:6px;text-align:left;vertical-align:top}.actions th{background:#f1f8fd;font-size:11px}.actions button{padding:6px 9px}.muted{color:var(--sub);font-size:11px}.section-note{font-size:11px;color:#64748b;margin:-5px 0 10px}.hidden{display:none!important}.footer{text-align:right;color:#94a3b8;font-size:10px;margin-top:10px}.printonly{display:none}.pill{background:#e0f2fe;padding:3px 8px;border-radius:12px;color:#075985;font-size:10px}
@media(max-width:1050px){.grid{grid-template-columns:repeat(2,minmax(0,1fr))}.span4{grid-column:span 2}.checks{grid-template-columns:1fr}}@media(max-width:650px){.shell{margin:0;padding:8px}.header h1{font-size:16px}.logo{width:48px;height:48px}.agency{font-size:10px;min-width:80px}.summary{grid-template-columns:repeat(2,1fr)}.grid{grid-template-columns:1fr}.span2,.span4{grid-column:span 1}.control{grid-template-columns:1fr}.header p{font-size:10px}}
@page{size:A4 landscape;margin:9mm 10mm 15mm;@bottom-right{content:"Sayfa " counter(page) " / " counter(pages);font-family:"Segoe UI",Arial,sans-serif;font-size:9pt;color:#475569}}@media print{
body{background:white;font-size:10px;print-color-adjust:exact;-webkit-print-color-adjust:exact}.shell{max-width:none;border:0;box-shadow:none;margin:0;padding:0}.top{border:1px solid #cbd5e1;padding:8px;margin-bottom:0;border-bottom:0;border-radius:0}.shell>.summary{margin-top:0}.shell>#sections{margin-top:0}.shell>#sections>section:first-child{margin-top:0}.header{min-height:58px}.logo{width:53px;height:53px}.header h1{font-size:17px}.agency{font-size:12px}.toolbar,.no-print,.toggle-note{display:none!important}.summary{gap:5px;margin-bottom:8px}.stat{padding:6px}.stat strong{font-size:14px}section{padding:0 8px 8px;margin-bottom:8px;break-inside:auto;page-break-inside:auto}section h2{margin:0 -8px 7px;padding:6px 8px;font-size:11px;break-after:avoid} .grid{gap:6px}.field label{font-size:9px;margin-bottom:3px}.field input,.field select,.field textarea,.control select,.control input,.action input,.action select,.action textarea{border-color:#cbd5e1;padding:4px;font-size:9px;min-height:0}.field textarea{min-height:40px}.checks{gap:5px}.control{padding:6px;grid-template-columns:minmax(0,1fr) 118px;break-inside:avoid;page-break-inside:avoid}.control .question{font-size:9px}.control .meta{font-size:8px}.control .note{display:block!important}.control .note:placeholder-shown{display:none!important}.actions table{min-width:0}.actions th,.actions td{padding:3px}.footer{display:none}.printonly{display:none!important}
}
/* Olgun UI2 — kullanıcı tarafından verilen HTML başlık referansı */
:root{--bg:#f8fafc;--blue:#0284c7;--line:#d7dee8;--sub:#64748b}
body{background:#f8fafc;padding:14px;font-family:"Segoe UI",Arial,sans-serif}
.shell{width:100%;max-width:1540px;margin:0 auto;padding:10px;background:#fff;border:1px solid #d7dee8;border-radius:8px;box-shadow:0 2px 8px rgba(15,23,42,.06)}
.top{width:100%;padding:0;background:#fff;border:1px solid #d7dee8;border-radius:6px;box-shadow:0 2px 8px rgba(15,23,42,.06);overflow:hidden;margin-bottom:10px}
.header{display:grid;grid-template-columns:60px minmax(0,1fr) fit-content(45vw);align-items:center;gap:12px;min-height:0;padding:10px 14px;background:#fff;border:0;border-left:5px solid #0284c7;box-shadow:none}
.logo{width:60px;height:60px;padding:0;margin:0;border:0;background:transparent;border-radius:0;object-fit:contain;cursor:pointer}
.header-titles{min-width:0;align-self:center}
.header h1{margin:0;font-size:21px;font-weight:750;line-height:1.15;color:#0f172a}
.header p{margin:4px 0 0;color:#64748b;font-size:11.5px;line-height:1.35}
.agency{justify-self:end;align-self:stretch;display:flex;align-items:center;justify-content:flex-end;margin:0;min-width:0;max-width:45vw;height:100%;font-size:15px;font-weight:700;line-height:1.2;color:#000;text-align:right;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;outline:0}
.agency.editing{max-width:45vw;margin-left:auto;padding:2px 4px;background:#f0f9ff;outline:1px dashed #0284c7;border-radius:3px;text-overflow:clip;cursor:text}
.toolbar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;width:100%;margin:0;padding:9px 14px;border:0;border-top:1px solid #d7dee8;background:#fff}
.toolbar button,.toolbar .upload{display:inline-flex;align-items:center;justify-content:center;min-height:36px;padding:8px 12px;border-radius:6px;font:700 12px "Segoe UI",Arial,sans-serif;white-space:nowrap}
.export-excel{background:#e0f2fe!important;border-color:#bae6fd!important;color:#075985!important}
.import-excel{background:#dcfce7!important;border-color:#bbf7d0!important;color:#166534!important}
.print-pdf{background:#f1f5f9!important;border-color:#cbd5e1!important;color:#334155!important}
section{border-color:#d7dee8;box-shadow:0 2px 8px rgba(15,23,42,.06);overflow:hidden}
section h2{background:#f8fbfd;border-bottom:1px solid #dbe3ea;border-left:4px solid #0284c7;color:#075985}
@media(max-width:1050px){.header{grid-template-columns:52px minmax(0,1fr) fit-content(40vw);gap:10px}.logo{width:52px;height:52px}.agency,.agency.editing{max-width:40vw}}
@media(max-width:680px){body{padding:6px}.shell{padding:6px}.header{grid-template-columns:44px minmax(0,1fr) fit-content(34vw);gap:8px;padding:8px 10px}.logo{width:44px;height:44px}.header h1{font-size:17px}.header p{font-size:10.5px}.agency,.agency.editing{max-width:34vw;font-size:12px}.toolbar{padding:8px 10px}}
@page{size:A4 landscape;margin:8mm 7mm 11mm 7mm;@bottom-right{content:"Sayfa " counter(page) " / " counter(pages);font:8pt "Segoe UI",Arial,sans-serif;color:#64748b;text-align:right;white-space:nowrap}}
@media print{
*{-webkit-print-color-adjust:exact!important;print-color-adjust:exact!important}
html,body{padding:0!important;margin:0!important;background:#fff!important}
.shell{max-width:none!important;margin:0!important;padding:2.5mm!important;border:0.3mm solid #cbd5e1!important;border-radius:0!important;box-shadow:none!important}
.top{margin:0 0 1.5mm!important;border:1px solid #cbd5e1!important;border-radius:0!important;box-shadow:none!important;break-after:avoid-page}
.header{display:grid!important;grid-template-columns:14mm minmax(0,1fr) fit-content(65mm)!important;align-items:center!important;gap:3mm!important;min-height:0!important;padding:2.5mm 3mm!important;background:#fff!important;border:0!important;border-left:1.2mm solid #0284c7!important}
.logo{width:14mm!important;height:14mm!important;background:transparent!important;border:0!important;padding:0!important}
.header h1{font-size:14pt!important;color:#0f172a!important}.header p{font-size:8pt!important;color:#64748b!important;margin-top:1mm!important}
.agency,.agency.editing{font-size:10pt!important;color:#000!important;max-width:65mm!important;align-self:stretch!important;display:flex!important;align-items:center!important;justify-content:flex-end!important;white-space:nowrap!important;background:transparent!important;outline:0!important;padding:0!important}
.toolbar,.no-print{display:none!important}.summary{margin-top:0!important}
section{box-shadow:none!important;margin-bottom:1.5mm!important}
}
.agent-section.agent-inactive>.checks{opacity:.55;pointer-events:none}.agent-section.agent-inactive>.section-note{color:#64748b}
</style>
</head>
<body><main class="shell"><div class="top"><div class="header"><img class="logo" id="brandLogo" src="logo.jpg" alt="Kurum logosu" title="Logoyu değiştirmek için art arda 5 kez tıklayın" tabindex="0" onerror="this.style.opacity='0'"><input class="logo-file-input" id="logoUpload" type="file" accept="image/png,image/jpeg,image/webp,image/gif,image/svg+xml"><div class="header-titles"><h1>Yapay Zekâ ve AI Ajanı Güvenlik Ön Değerlendirmesi</h1><p>(AI & AI Agent Security Pre-Assessment Form)</p></div><div class="agency" id="agency" title="Metni değiştirmek için art arda 5 kez tıklayın" tabindex="0">OLGUN BAŞKANLIĞI</div></div><div class="toolbar"><button class="export-excel" id="exportBtn">Excel Dışarı Aktar</button><label class="upload import-excel">Excel İçeri Aktar<input id="importFile" type="file" accept=".xlsx,.xls"></label><button class="print-pdf" id="printBtn">PDF / Yazdır</button></div></div>
<div class="summary"><div class="stat"><small>Genel Risk Puanı</small><strong id="scoreStat">—</strong></div><div class="stat"><small>Risk Seviyesi</small><strong id="levelStat">Değerlendirilmedi</strong></div><div class="stat"><small>Yanıtlanan Kontrol</small><strong id="answeredStat">0 / 0</strong></div><div class="stat"><small>Kritik Kontrol İhlali</small><strong id="criticalStat">0</strong></div></div>
<div id="sections"></div><div class="footer">Yapay Zekâ ve AI Ajanı Güvenlik Ön Değerlendirmesi</div></main>
<script>
'use strict';
const RESPONSE=['','Evet','Kısmen','Hayır','Uygulanamaz','Doğrulanamadı'];
const sections=[
{title:'01 — Genel Bilgiler',fields:[['Değerlendirme No','text'],['Değerlendirme Tarihi','date'],['Uygulama / AI Ajanı Adı','text'],['Talep Eden Birim','text'],['Sorumlu Personel','text'],['Görevi / Unvanı','text'],['Kullanım Ortamı','select:Geliştirme|Test|Üretim'],['Değerlendirme Durumu','select:Taslak|İncelemede|Tamamlandı'],['Kullanım Amacı','textarea:4']]},
{title:'02 — Yapay Zekâ Sisteminin Tanımlanması',fields:[['Sistem Türü','select:Üretken AI / LLM|AI Ajanı|Çoklu AI Ajanı|Tahmin / Sınıflandırma AI|Diğer'],['Kullanım Modeli','select:Bulut|Kurum İçi|Hibrit'],['AI Modeli ve Sürümü','text'],['Hizmet Sağlayıcı','text'],['Lisans / Kaynak Modeli','select:Açık Kaynak|Ticari|Kuruma Özel'],['İnternet Erişimi','select:Var|Yok|Kısıtlı'],['Harici Entegrasyon','select:Var|Yok'],['Sistem Kritikliği','select:Düşük|Orta|Yüksek|Kritik'],['Entegrasyonlar / Sistem Sınırları','textarea:4']]},
{title:'03 — Veri Güvenliği ve Gizlilik',checks:[['Kişisel veri işlenmesi için uygun hukuki dayanak ve kontroller değerlendirildi mi?',3,true],['Hassas / gizli kurumsal veriler sınıflandırılıp korunuyor mu?',3,true],['Kurum dışına veri aktarımı kontrol ediliyor mu?',3,true],['Verilerin model eğitiminde kullanımı kapatılmış veya yetkiyle yönetiliyor mu?',3,false],['Veri saklama ve güvenli silme politikası mevcut mu?',2,false],['Aktarım ve depolamada uygun şifreleme kullanılıyor mu?',3,true],['Veri maskeleme / veri minimizasyonu uygulanıyor mu?',2,false],['Veri lokasyonu, alt işleyenler ve üçüncü taraf paylaşımı biliniyor mu?',2,false]]},
{title:'04 — Kimlik Doğrulama ve Yetkilendirme',checks:[['Kullanıcı ve servis kimlikleri doğrulanıyor mu?',3,true],['Uygun hesaplarda MFA uygulanıyor mu?',2,false],['Rol / öznitelik tabanlı erişim kontrolü bulunuyor mu?',3,true],['En az ayrıcalık ve görev ayrılığı uygulanıyor mu?',3,true],['API anahtarları ve tokenlar güvenli kasada saklanıyor mu?',3,true],['Ayrıcalıklı erişimler kayıt altına alınıyor mu?',2,false],['Servis hesaplarının yaşam döngüsü ve yetkileri yönetiliyor mu?',2,false]]},
{title:'05 — AI Ajanı Yetki ve Otonomi Kontrolleri',agent:true,checks:[['Ajanın bağımsız işlem ve karar sınırları tanımlanmış mı?',3,true],['Araç / API çağrıları izin listesiyle kısıtlanıyor mu?',3,true],['Dosya okuma, yazma ve silme yetkileri sınırlandırılmış mı?',3,true],['Kod / sistem komutu çalıştırma kontrollü veya yalıtılmış mı?',3,true],['Ajanlar arası görev devri ve güven sınırları kontrol ediliyor mu?',3,true],['Yüksek etkili işlemler için insan onayı gerekli mi?',3,true],['Ajanın rolü ve yetki kapsamı teknik olarak zorlanıyor mu?',3,true],['Acil durdurma ve kimlik bilgisi iptali mekanizması var mı?',3,true],['Kritik eylemler geri alınabiliyor veya telafi planı var mı?',2,false],['İşlem süresi, maliyet ve çağrı sınırları uygulanıyor mu?',2,false]]},
{title:'06 — Yapay Zekâya Özgü Siber Güvenlik Riskleri',checks:[['Prompt Injection girişimlerine karşı katmanlı savunma uygulanıyor mu?',3,true],['Güvenilmeyen içerik, araç çıktısı ve belge girdileri ayrıştırılıyor mu?',3,true],['Model çıktıları komut / sorgu / işlem öncesi doğrulanıyor mu?',3,true],['Sistem talimatları, sırlar ve hassas veriler çıktıdan korunuyor mu?',3,true],['Veri ve model zehirleme riskine karşı kaynak bütünlüğü sağlanıyor mu?',2,false],['RAG / vektör deposunda belge düzeyinde erişim kontrolü var mı?',3,true],['Eklenti, model ve yazılım bağımlılıkları güvenlik açısından inceleniyor mu?',2,false],['Kaynak tüketimi, limit aşımı ve kötüye kullanım kısıtlanıyor mu?',2,false],['Yanıltıcı / hatalı çıktılar için doğrulama ve insan gözetimi var mı?',2,false]]},
{title:'07 — İzleme, Kayıt ve Olay Yönetimi',checks:[['Kullanıcı ve ajan faaliyetleri denetlenebilir biçimde loglanıyor mu?',3,true],['Kritik eylemler kimlik, zaman ve hedef bilgileriyle izleniyor mu?',3,true],['Şüpheli kullanım / yetki aşımı için uyarı tanımlı mı?',2,false],['Uygun loglar SIEM veya merkezi izleme sistemine iletiliyor mu?',2,false],['AI sistemlerine özgü olay müdahale prosedürü var mı?',3,true],['Ajan hızlıca durdurulabiliyor veya izole edilebiliyor mu?',3,true],['Loglar ve izlerde hassas bilgiler korunuyor mu?',2,false]]},
{title:'08 — Mevzuat, Uyumluluk ve Tedarikçi Güvenliği',checks:[['KVKK ve diğer ilgili gizlilik yükümlülükleri değerlendirildi mi?',3,true],['Faaliyet alanına özgü düzenlemeler belirlendi mi?',2,false],['AI sağlayıcısı / tedarikçisi güvenlik incelemesinden geçti mi?',3,true],['Gerekli veri işleme ve gizlilik sözleşmeleri mevcut mu?',2,false],['Alt yükleniciler ve veri paylaşım zinciri şeffaf mı?',2,false],['Kurumsal AI politikaları / ISO 42001 yönetişim gereksinimleri değerlendirildi mi?',2,false],['Hizmet sonlandırma, erişim iptali ve veri imha koşulları mevcut mu?',2,false]]},
{title:'09 — Güvenlik Testleri ve Doğrulama',checks:[['Sistem güvenlik testleri gerçekleştirildi ve belgelendi mi?',3,true],['Prompt Injection / jailbreak test senaryoları çalıştırıldı mı?',3,true],['Yetki yükseltme ve erişim sınırı ihlalleri test edildi mi?',3,true],['Veri sızıntısı senaryoları test edildi mi?',3,true],['AI ajanının yetki dışı işlem senaryoları test edildi mi?',3,true],['Kritik ve yüksek öncelikli bulgular giderildi mi?',3,true],['Test kanıtları ve düzeltme doğrulamaları saklandı mı?',2,false]]},
{title:'10 — Risk Değerlendirme Sonucu',fields:[['Toplam Risk Puanı','readonly'],['Risk Seviyesi','readonly'],['Kritik Güvenlik Bulguları','textarea:4'],['Risk Azaltıcı Kontroller','textarea:4'],['Düzeltici Faaliyetler','textarea:4'],['Aksiyon Sorumlusu','text'],['Hedef Tamamlanma Tarihi','date'],['Kalan Risk','select:Düşük|Orta|Yüksek|Kritik']]},
{title:'11 — Nihai Güvenlik Değerlendirmesi ve Onay',fields:[['Genel Güvenlik Değerlendirmesi','textarea:4'],['Değerlendirme Kararı','select:Onaylandı|Şartlı Onay|Reddedildi|Ek İnceleme'],['Kullanım Kısıtlamaları','textarea:4'],['Risk Kabul Eden Yetkili','text'],['Güvenlik Değerlendirmesini Yapan','text'],['Onay Tarihi','date'],['Sonraki Değerlendirme Tarihi','date']]}
];
const slug=s=>s.normalize('NFKD').replace(/[\u0300-\u036f]/g,'').replace(/[^a-zA-Z0-9]+/g,'_').replace(/^_|_$/g,'').toLowerCase();
const fieldId=(si,fi)=>`f_${si}_${fi}`;
const escapeHTML=s=>String(s??'').replace(/[&<>"']/g,c=>({'&':'&','<':'<','>':'>','"':'"',"'":'''}[c]));
let agentMode=false;
function makeField(si,fi,[label,type]){let id=fieldId(si,fi), html='';if(type.startsWith('select:')){html=`<select id="${id}" data-label="${escapeHTML(label)}"><option value="">Seçiniz</option>${type.slice(7).split('|').map(v=>`<option>${escapeHTML(v)}</option>`).join('')}</select>`;}else if(type.startsWith('textarea'))html=`<textarea id="${id}" data-label="${escapeHTML(label)}" placeholder="Açıklama giriniz..."></textarea>`;else html=`<input id="${id}" data-label="${escapeHTML(label)}" type="${type==='readonly'?'text':type}" ${type==='readonly'?'readonly':''}>`;return `<div class="field ${type.startsWith('textarea')?'span2':''}"><label for="${id}">${escapeHTML(label)}</label>${html}</div>`;}
function makeCheck(si,ci,[q,weight,critical]){let id=`c_${si}_${ci}`;return `<div class="control ${critical?'critical':''}" data-control="${id}" data-weight="${weight}" data-critical="${critical}"><div><div class="question">${escapeHTML(q)}</div><div class="meta">Ağırlık: ${weight}${critical?' · Kritik kontrol':''}</div><button class="toggle-note no-print" type="button" data-toggle-note="${id}">+ Açıklama / Kanıt</button></div><select id="${id}" aria-label="${escapeHTML(q)}">${RESPONSE.map(r=>`<option value="${escapeHTML(r)}">${escapeHTML(r||'Seçiniz')}</option>`).join('')}</select><textarea class="note" id="note_${id}" placeholder="Gerekçe, kanıt referansı veya açıklama..."></textarea></div>`;}
function createSections(){const host=document.getElementById('sections');host.innerHTML=sections.map((s,si)=>`<section id="section_${si}" class="${s.agent?'agent-section':''}"><h2><span>${escapeHTML(s.title)}</span>${s.agent?'<small>Yalnızca ajan sistemlerinde zorunlu</small>':''}</h2>${s.fields?`<div class="grid">${s.fields.map((f,fi)=>makeField(si,fi,f)).join('')}</div>`:''}${s.checks?`<p class="section-note">Her kontrol için yanıt seçin; gerekçe ve kanıt eklemek için “Açıklama / Kanıt”ı kullanın.</p><div class="checks">${s.checks.map((c,ci)=>makeCheck(si,ci,c)).join('')}</div>`:''}${si===9?`<div class="subheading">Düzeltici Aksiyon Takibi</div><div class="actions"><table><thead><tr><th>Bulgu / Aksiyon</th><th>Sorumlu</th><th>Öncelik</th><th>Hedef Tarihi</th><th>Durum</th><th class="no-print">İşlem</th></tr></thead><tbody id="actionRows"></tbody></table></div>`:''}</section>`).join('');document.querySelectorAll('[data-toggle-note]').forEach(b=>b.addEventListener('click',()=>{const el=document.getElementById('note_'+b.dataset.toggleNote);el.classList.toggle('open');b.textContent=el.classList.contains('open')?'− Açıklamayı Gizle':'+ Açıklama / Kanıt'}));document.getElementById('f_1_0').addEventListener('change',setAgentMode);setAgentMode();}
function setAgentMode(){const type=document.getElementById('f_1_0').value;agentMode=type==='AI Ajanı'||type==='Çoklu AI Ajanı';const section=document.querySelector('.agent-section');section.classList.remove('hidden');section.classList.toggle('agent-inactive',!agentMode);const info=section.querySelector('h2 small');if(info)info.textContent=agentMode?'AI ajanı kontrolleri değerlendirmeye dahil':'AI ajanı seçilmedi: bölüm görünür, risk hesabına dahil değil';calculate();}
function addAction(data={}){const body=document.getElementById('actionRows'),row=document.createElement('tr');row.className='action';const values=[data.bulgu||'',data.sorumlu||'',data.oncelik||'',data.tarih||'',data.durum||''];row.innerHTML=`<td><textarea aria-label="Bulgu / Aksiyon" placeholder="Bulgu ve düzeltici faaliyet..."></textarea></td><td><input aria-label="Sorumlu"></td><td><select aria-label="Öncelik"><option value="">Seçiniz</option><option>Düşük</option><option>Orta</option><option>Yüksek</option><option>Kritik</option></select></td><td><input type="date" aria-label="Hedef tarihi"></td><td><select aria-label="Durum"><option value="">Seçiniz</option><option>Açık</option><option>Devam Ediyor</option><option>Kapandı</option></select></td><td class="no-print"><button type="button" class="remove-action">Sil</button></td>`;body.appendChild(row);[...row.querySelectorAll('textarea,input,select')].forEach((el,i)=>el.value=values[i]||'');row.querySelector('.remove-action').addEventListener('click',()=>{row.remove();if(!document.querySelector('#actionRows .action'))addAction();});row.querySelectorAll('textarea,input,select').forEach(el=>el.addEventListener('change',()=>{const all=[...document.querySelectorAll('#actionRows .action')];if(all.at(-1)===row && [...row.querySelectorAll('textarea,input,select')].some(x=>x.value.trim()))addAction();}));}
function calculate(){let risk=0,max=0,answered=0,total=0,criticalFail=0;document.querySelectorAll('.control').forEach(el=>{if(el.closest('.hidden')||(el.closest('.agent-section')&&!agentMode))return;total++;const v=el.querySelector('select').value,w=Number(el.dataset.weight),crit=el.dataset.critical==='true';if(!v||v==='Uygulanamaz')return;answered++;max+=w;if(v==='Hayır')risk+=w;else if(v==='Kısmen')risk+=w*.5;else if(v==='Doğrulanamadı')risk+=w*.75;if(crit&&(v==='Hayır'||v==='Doğrulanamadı'))criticalFail++;});let score=max?Math.round(risk/max*100):null,level=score===null?'Değerlendirilmedi':score<25?'Düşük':score<50?'Orta':score<75?'Yüksek':'Kritik';if(criticalFail&&level==='Düşük')level='Yüksek';if(criticalFail&&level==='Orta')level='Yüksek';let col={'Düşük':'risk-low','Orta':'risk-medium','Yüksek':'risk-high','Kritik':'risk-critical'}[level]||'';document.getElementById('scoreStat').textContent=score===null?'—':score+'/100';const node=document.getElementById('levelStat');node.className=col;node.textContent=level;document.getElementById('answeredStat').textContent=`${answered} / ${total}`;document.getElementById('criticalStat').textContent=criticalFail;document.getElementById('f_9_0').value=score===null?'':score+'/100';document.getElementById('f_9_1').value=level==='Değerlendirilmedi'?'':level;return {score,level,answered,total,criticalFail};}
function snapshot(){calculate();const fields=[];sections.forEach((s,si)=>(s.fields||[]).forEach(([label],fi)=>fields.push({id:fieldId(si,fi),bolum:s.title,alan:label,deger:document.getElementById(fieldId(si,fi)).value})));const controls=[];sections.forEach((s,si)=>(s.checks||[]).forEach(([q,w,c],ci)=>{let id=`c_${si}_${ci}`;controls.push({id,bolum:s.title,soru:q,agirlik:w,kritik:c,yanit:document.getElementById(id).value,aciklama:document.getElementById('note_'+id).value});}));const actions=[...document.querySelectorAll('#actionRows .action')].map(row=>{let a=[...row.querySelectorAll('textarea,input,select')].map(e=>e.value);return {bulgu:a[0],sorumlu:a[1],oncelik:a[2],tarih:a[3],durum:a[4]}}).filter(a=>Object.values(a).some(Boolean));return {fields,controls,actions,agency:document.getElementById('agency').textContent.trim()};}
function needXLSX(){if(typeof XLSX==='undefined'){alert('Excel kütüphanesi yüklenemedi. İnternete bağlanıp sayfayı yeniden açın.');return false;}return true;}
function excelExport(){if(!needXLSX())return;const data=snapshot(),wb=XLSX.utils.book_new();const sheets=[['Form',data.fields],['Kontroller',data.controls],['Aksiyonlar',data.actions],['Kurum',[{kurum:data.agency}]]];for(const [name,rows] of sheets){let sheet=XLSX.utils.json_to_sheet(rows);sheet['!cols']=Object.keys(rows[0]||{}).map(key=>({wch:key==='soru'?85:key==='deger'||key==='aciklama'?55:25}));XLSX.utils.book_append_sheet(wb,sheet,name);}XLSX.writeFile(wb,'AI_Ajani_Guvenlik_On_Degerlendirme.xlsx');}
async function excelImport(file){if(!file||!needXLSX())return;try{let buf=await file.arrayBuffer(),wb=XLSX.read(buf,{type:'array'});for(let name of ['Form','Kontroller'])if(!wb.Sheets[name])throw Error(name+' sayfası bulunamadı.');let rows=sheet=>XLSX.utils.sheet_to_json(wb.Sheets[sheet],{defval:''});for(let item of rows('Form')){let el=document.getElementById(item.id);if(el&&!el.readOnly)el.value=String(item.deger??'');}setAgentMode();for(let item of rows('Kontroller')){let el=document.getElementById(item.id),note=document.getElementById('note_'+item.id);if(el&&RESPONSE.includes(String(item.yanit)))el.value=String(item.yanit);if(note){note.value=String(item.aciklama??'');note.classList.toggle('open',!!note.value);}}document.getElementById('actionRows').innerHTML='';if(wb.Sheets.Aksiyonlar)rows('Aksiyonlar').forEach(addAction);if(!document.querySelector('#actionRows .action') || [...document.querySelectorAll('#actionRows .action')].at(-1).querySelector('textarea').value)addAction();if(wb.Sheets.Kurum){let a=rows('Kurum')[0];if(a&&a.kurum)document.getElementById('agency').textContent=String(a.kurum);}calculate();alert('Excel verileri başarıyla içeri aktarıldı.');}catch(e){alert('Excel içeri aktarılamadı: '+e.message);}finally{document.getElementById('importFile').value='';}}
function validatePrint(){const r=calculate();if(r.answered<r.total&&!confirm(`Kontrollerin ${r.total-r.answered} tanesi yanıtlanmadı veya uygulanamaz olarak işaretlendi. Yine de yazdırılsın mı?`))return;window.print();}
// Olgun UI2: logo ve kurum adı kendi alanlarında art arda 5 TIKLAMA ile düzenlenir.
const agency=document.getElementById('agency');
const brandLogo=document.getElementById('brandLogo');
const logoUpload=document.getElementById('logoUpload');
function fiveClicks(node,action){let count=0,last=0;node.addEventListener('click',()=>{if(node.isContentEditable)return;const now=Date.now();count=now-last<=1800?count+1:1;last=now;if(count===5){count=0;action();}});node.addEventListener('keydown',e=>{if((e.key==='Enter'||e.key===' ')&&!node.isContentEditable){e.preventDefault();node.click();}});}
function beginAgencyEdit(){agency.contentEditable='true';agency.classList.add('editing');agency.focus();const range=document.createRange(),sel=window.getSelection();range.selectNodeContents(agency);sel.removeAllRanges();sel.addRange(range);}
fiveClicks(agency,beginAgencyEdit);
agency.addEventListener('blur',()=>{agency.contentEditable='false';agency.classList.remove('editing');agency.textContent=agency.textContent.trim()||'OLGUN BAŞKANLIĞI';try{localStorage.setItem('olgunUI2_agency',agency.textContent)}catch(e){}});
agency.addEventListener('keydown',e=>{if(e.key==='Enter'){e.preventDefault();agency.blur();}if(e.key==='Escape'){e.preventDefault();agency.blur();}});
fiveClicks(brandLogo,()=>logoUpload.click());
logoUpload.addEventListener('change',e=>{const file=e.target.files&&e.target.files[0];if(!file)return;if(!file.type.startsWith('image/')){alert('Lütfen bir görsel seçin.');return;}if(file.size>3*1024*1024){alert('Logo dosyası en fazla 3 MB olabilir.');return;}const reader=new FileReader();reader.onload=()=>{brandLogo.src=reader.result;brandLogo.style.opacity='1';try{localStorage.setItem('olgunUI2_logo',reader.result);}catch(err){console.warn('Logo tarayıcı depolamasına kaydedilemedi:',err);}};reader.readAsDataURL(file);e.target.value='';});
try{const savedAgency=localStorage.getItem('olgunUI2_agency');if(savedAgency)agency.textContent=savedAgency;const savedLogo=localStorage.getItem('olgunUI2_logo');if(savedLogo){brandLogo.src=savedLogo;brandLogo.style.opacity='1';}}catch(e){}
document.getElementById('exportBtn').onclick=excelExport;document.getElementById('importFile').onchange=e=>excelImport(e.target.files[0]);document.getElementById('printBtn').onclick=validatePrint;document.addEventListener('change',e=>{if(e.target.matches('.control select'))calculate();});createSections();addAction();
</script></body></html>


























