İş Etki Analizi ve Kurtarma Hedefi Formu

Kurumların kritik iş süreçlerinde yaşanabilecek kesintilerin etkilerini değerlendirmek, kabul edilebilir kesinti ve veri kaybı sürelerini belirlemek amacıyla geliştirilmiştir. 

Form; iş sürekliliğini sağlamak, kurtarma önceliklerini belirlemek, olası risklere karşı hazırlığı artırmak ve kurumsal dayanıklılığı güçlendirmek için kullanılır.

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: "İş Etki Analizi ve Kurtarma Hedefi 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">
<meta name="color-scheme" content="light">
<title>İş Etki Analizi ve Kurtarma Hedefi Formu</title>
<style>
/* OLGUN UI2 — ekranın tamamını kaplayan kurumsal tasarım */
:root{
  --blue:#0284c7;--blue-dark:#0369a1;--dark:#1e293b;--muted:#64748b;
  --line:#cbd5e1;--soft-line:#e2e8f0;--page-bg:#f1f5f9;
  --shell-bg:#f1f5f9;--soft-blue:#eff6ff;--white:#ffffff;
  --heading-size:20px
}
*{box-sizing:border-box}
html{min-height:100%;background:var(--page-bg)}
body{margin:0;min-height:100%;background:var(--page-bg);color:var(--dark);
  font:13px/1.45 "Segoe UI",Arial,sans-serif}
button,input,select,textarea{font:inherit}
/* TEK ANA DIŞ ÇERÇEVE: max-width yok; tüm ekran genişliği ve en az ekran yüksekliği */
.app{
  width:100%;max-width:none;min-height:100vh;min-height:100dvh;
  margin:0;padding:14px;display:flex;flex-direction:column;gap:12px;
  background:#edf3f8;border:1px solid #a6b8c8;border-top:5px solid #0284c7;
  border-radius:0;box-shadow:inset 0 0 0 1px #f8fafc,0 3px 14px rgba(15,23,42,.08)
}
/* Başlık, işlem çubuğu, içerik: birbirinden AYRI BEYAZ paneller */
.header,.toolbar,.form-card{
  background:#ffffff;border:1px solid #b8c7d4;border-radius:6px;
  box-shadow:0 2px 7px rgba(15,23,42,.07)
}
.header{
  display:flex;align-items:center;gap:14px;min-height:96px;padding:14px 18px;
  border-left:4px solid #0284c7;background:#ffffff
}
.logo-box{
  width:68px;height:68px;flex:none;display:grid;place-items:center;
  border:1px solid #cbd5e1;border-radius:6px;background:#f8fafc;
  overflow:hidden;color:#94a3b8;font-size:11px;font-weight:600;
  cursor:pointer;padding:0;appearance:none
}
.logo-box:hover{border-color:#7dd3fc;background:#f0f9ff}
.logo-box img{width:100%;height:100%;object-fit:contain;display:none}
.header-title{flex:1;min-width:0}
h1{font-size:var(--heading-size);line-height:1.25;margin:0 0 5px;font-weight:700;color:#173a53}
.subtitle{font-size:12px;color:#64748b}
.brand{
  font-size:calc(var(--heading-size) - 1.33px);font-weight:700;color:#111827;
  line-height:1.3;text-align:right;min-width:0;max-width:100%;
  overflow-wrap:anywhere;word-break:normal;
  outline-offset:3px;cursor:pointer;user-select:none;-webkit-user-select:none
}
.brand-wrap{
  margin-left:auto;min-width:0;max-width:46%;flex:0 1 auto;
  display:flex;flex-direction:column;align-items:flex-end;justify-content:center;
  text-align:right
}
.brand-hint{font-size:10px;line-height:1.3;color:#0369a1;text-align:right;margin-top:3px}
[hidden]{display:none!important}
.brand[contenteditable="true"]{outline:2px dashed var(--blue);background:#eff8ff;
  border-radius:3px;padding:4px;cursor:text;user-select:text;-webkit-user-select:text}
/* ARAÇ PANELİ — BEYAZ (#ffffff); asla mavi/gri zemin veya renkli şerit uygulanmaz. */
.toolbar{
  display:flex;justify-content:flex-start;align-items:center;flex:none;
  min-height:58px;margin:0;padding:10px 12px;
  background:#ffffff;border:1px solid #cbd5e1;border-radius:6px;
  box-shadow:0 2px 7px rgba(15,23,42,.07)
}
.toolbar-actions{
  display:flex;align-items:center;justify-content:flex-start;gap:8px;flex-wrap:wrap;
  padding:0;border:0;background:transparent;box-shadow:none
}
.btn{
  min-height:35px;border:1px solid #cbd5e1;background:#fff;color:#334155;
  border-radius:5px;padding:7px 13px;font-size:12px;font-weight:600;cursor:pointer;
  white-space:nowrap;transition:background-color .12s,border-color .12s
}
.btn:hover{background:#f1f5f9}
/* Renk yalnızca BUTONLARIN kendi alanında */
.btn-import{background:#dbeafe;border-color:#93c5fd;color:#1e40af}
.btn-import:hover{background:#bfdbfe;border-color:#60a5fa}
.btn-export{background:#dcfce7;border-color:#86efac;color:#166534}
.btn-export:hover{background:#bbf7d0;border-color:#4ade80}
.btn-print{background:#f1f5f9;border-color:#cbd5e1;color:#334155}
.btn-print:hover{background:#e2e8f0;border-color:#94a3b8}
.btn:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible{
  outline:2px solid #0ea5e9;outline-offset:1px
}
/* TEK form: bölüm panelleriyle görsel hiyerarşi, dış kenar çerçevesi */
.form-card{overflow:hidden;background:#ffffff;border:1px solid #b8c7d4;flex:1;
  min-width:0;box-shadow:0 2px 7px rgba(15,23,42,.07)}
.form-top{
  padding:12px 16px;border-bottom:1px solid #e2e8f0;
  background:#ffffff;
  display:flex;align-items:center;justify-content:space-between;gap:12px
}
.form-top strong{font-size:14px;color:#075985}
.form-top span{color:var(--muted);font-size:11px}
.section{padding:13px 16px 15px;border-bottom:1px solid #d4e0ea;background:#fff}
.section:nth-of-type(even){background:#fcfeff}
.section:last-child{border-bottom:0}
h2{
  font-size:13px;margin:0 0 12px;font-weight:700;color:#0369a1;
  border-left:4px solid var(--blue);border-top:1px solid #d6eaf8;
  border-bottom:1px solid #d6eaf8;padding:7px 10px;
  background:#eaf6fe;border-radius:0 4px 4px 0
}
.grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:11px 13px}
.field{display:flex;flex-direction:column;gap:5px;min-width:0}
.span-2{grid-column:span 2}.span-3{grid-column:span 3}.span-4{grid-column:span 4}
label{color:#3e5b70;font-weight:600;font-size:12px}
input,select,textarea{
  min-width:0;width:100%;border:1px solid #cad8e5;border-radius:5px;
  background:#fff;color:#162f42;padding:8px 10px;outline:none
}
input::placeholder,textarea::placeholder{color:#9aaaba}
textarea{min-height:59px;resize:vertical;overflow:hidden;line-height:1.45}
input[readonly]{background:#f1f7fb;color:#174b6f;font-weight:700}
.duration{display:flex;gap:6px}
.duration input{flex:1;min-width:0}
.duration select{width:98px;flex:none;padding-left:6px;padding-right:5px}
.hint{font-size:11px;color:var(--muted);margin:9px 0 0}
.result{
  margin-top:12px;padding:10px 12px;background:#f1f8fd;
  border:1px solid #d6e7f4;border-radius:5px;
  display:flex;align-items:center;gap:14px;flex-wrap:wrap
}
.result .item{display:flex;align-items:center;gap:7px}
.result b{font-size:12px;color:#415f75}
.result output{font-weight:700;color:#075985}
#validation{margin:0;font-size:11px;color:#475569;flex:1;min-width:230px}
#validation[data-status="bad"]{color:#b91c1c}
#validation[data-status="ok"]{color:#047857}
#notification{
  display:none;margin:0 0 12px;padding:9px 12px;border-radius:5px;
  border:1px solid #b6dcf3;background:#eff8ff;color:#075985
}
#notification[data-kind="error"]{background:#fff1f2;border-color:#fecdd3;color:#9f1239}
.note{font-size:11px;color:#728496;margin:0 2px 0}
.screen-footer{display:flex;justify-content:flex-end;align-items:center;
  font-size:11px;color:#64748b;min-height:25px;padding:4px 3px 0;
  font-weight:600;font-variant-numeric:tabular-nums}
/* Yazıcı sayfaları alttaki @page kuralıyla ayrıca numaralanır. */
@media(max-width:900px){
  :root{--heading-size:18px}
  .grid{grid-template-columns:repeat(2,minmax(0,1fr))}
  .span-3,.span-4{grid-column:span 2}
  .app{padding:10px;gap:10px}
}
@media(max-width:560px){
  :root{--heading-size:15px}
  .app{margin:0;padding:7px;gap:8px;border-radius:0}
  .header{gap:9px;padding:10px;border-left-width:4px}
  .logo-box{width:47px;height:47px}
  .subtitle{font-size:10px}
  .brand-wrap{max-width:44%}
  .grid{grid-template-columns:minmax(0,1fr)}
  .span-2,.span-3,.span-4{grid-column:span 1}
  .form-top{align-items:flex-start;flex-direction:column}
  .toolbar{padding:6px}
  .toolbar-actions{width:100%;justify-content:flex-start}
  .btn{flex:1 1 135px;white-space:normal}
  .section{padding:11px 10px}
}
.print-text{display:none}
/* Olgun UI2 yazdırma standardı: dolu sayfalar, sağ alt sayfa numarası. */
@page{
  size:A4 landscape;
  margin:7mm 9mm 14mm 9mm;
  @bottom-right{
    content:"Sayfa " counter(page) " / " counter(pages);
    font-family:"Segoe UI",Arial,sans-serif;
    font-size:9pt;
    font-weight:600;
    color:#475569;
    text-align:right;
    vertical-align:middle;
  }
}
@media print{
  html,body{margin:0!important;padding:0!important;height:auto!important;min-height:0!important;
    overflow:visible!important;background:#fff!important;color:#111;font-size:9.5px;
    print-color-adjust:exact;-webkit-print-color-adjust:exact}
  .app{display:block;min-height:0!important;height:auto!important;width:100%!important;gap:0!important;
    max-width:none;margin:0!important;padding:0!important;background:#fff;
    border:0;border-radius:0;box-shadow:none;overflow:visible!important;
    break-before:auto;break-after:auto;page-break-after:auto}
  .header,.form-card{box-shadow:none;border-color:#bccddd}
  .form-card{border:1px solid #b6c9d8}
  .header{min-height:50px;padding:4px 9px;margin:0 0 4px;
    break-inside:avoid;page-break-inside:avoid;
    border-left:4px solid var(--blue);background:linear-gradient(90deg,#fff,#eff8fd)}
  .logo-box{width:43px;height:43px}
  h1{font-size:14px}.subtitle{font-size:9px}.brand{font-size:12.67px;color:#111827}
  .brand-hint,.toolbar,#notification,.note,.screen-footer{display:none!important}
  .form-top{padding:4px 9px;background:#eff7fc}.form-top strong{font-size:11px}
  .section{padding:2px 9px 3px;break-inside:auto;page-break-inside:auto;
    break-before:auto;break-after:auto}
  .section:last-child{break-after:auto;page-break-after:auto}
  h2{font-size:10px;margin-bottom:3px;padding:2px 6px;background:#eaf6fe!important;
    break-after:avoid;page-break-after:avoid}
  .grid{grid-template-columns:repeat(4,minmax(0,1fr))!important;gap:3px 8px}
  .span-2{grid-column:span 2!important}.span-3{grid-column:span 3!important}.span-4{grid-column:span 4!important}
  .field{display:block;gap:2px;break-inside:auto;page-break-inside:auto}
  .field>label{display:block;margin-bottom:2px}
  label{font-size:9px}
  input,select,textarea{
    border:1px solid #d8e0e7;padding:2px 5px;font-size:9px!important;
    background:white!important;color:#1e293b!important
  }
  textarea{display:none!important}
  .print-text{display:block!important;min-height:22px;padding:2px 5px;
    font-size:9px;line-height:1.45;white-space:pre-wrap;overflow-wrap:anywhere;
    border:1px solid #d8e0e7;border-radius:5px;break-inside:auto;page-break-inside:auto}

  .duration select{width:68px}
  .result{padding:4px 6px;margin-top:5px;gap:10px;break-inside:avoid}
  .result b,#validation{font-size:9px}
  .form-card{overflow:visible!important;break-after:auto;page-break-after:auto}
  #biaForm{margin:0;padding:0;break-after:auto;page-break-after:auto}
}
</style>
</head>
<body>
<div class="app">
  <header class="header">
    <button type="button" class="logo-box" id="logoButton" title="Aynı klasördeki logo.jpg otomatik görünür. Logo seçmek/değiştirmek için tıklayın." aria-label="Kurum logosunu seç veya değiştir"><img id="logo" src="logo.jpg" alt="Kurum logosu"><span id="logoText">LOGO</span></button>
    <input id="logoFile" type="file" accept="image/png,image/jpeg,image/webp,image/gif" hidden>
    <div class="header-title"><h1>İş Etki Analizi ve Kurtarma Hedefi Formu</h1><div class="subtitle">(Business Impact Analysis – BIA / RTO / RPO)</div></div>
    <div class="brand-wrap"><div id="brand" class="brand" title="Düzenlemek için art arda 5 kez tıklayın veya dokunun" tabindex="0" role="button" aria-label="Kurum adını düzenlemek için art arda 5 kez tıklayın">OLGUN BAŞKANLIĞI</div><span id="brandHint" class="brand-hint" aria-live="polite" hidden></span></div>
  </header>

  <div class="toolbar" aria-label="Dosya ve yazdırma işlemleri">
    <div class="toolbar-actions">
      <button type="button" class="btn btn-import" id="excelImport">↥ Excel İçeri Aktar</button>
      <button type="button" class="btn btn-export" id="excelExport">↧ Excel Dışarı Aktar</button>
      <button type="button" class="btn btn-print" id="printButton">PDF / Yazdır</button>
    </div>
    <input hidden type="file" id="excelFile" accept=".xlsx,.xls">
  </div>
  <p id="notification" role="status" aria-live="polite"></p>

  <main class="form-card">
    <div class="form-top"><strong>İş Sürekliliği Değerlendirme Kaydı</strong><span>Tek form · Her kurum için genel kullanım</span></div>
    <form id="biaForm" autocomplete="off">
      <section class="section">
        <h2>1. İş Süreci Bilgileri</h2>
        <div class="grid">
          <div class="field"><label for="kayitNo">BIA / Kayıt No</label><input id="kayitNo" placeholder="Örn. BIA-001"></div>
          <div class="field"><label for="tarih">Değerlendirme Tarihi</label><input id="tarih" type="date"></div>
          <div class="field"><label for="birim">Birim / Departman</label><input id="birim" placeholder="Sorumlu birim"></div>
          <div class="field"><label for="sahip">İş Süreci Sahibi</label><input id="sahip" placeholder="Adı ve soyadı"></div>
          <div class="field span-2"><label for="surec">İş Süreci / Kritik Hizmet</label><input id="surec" placeholder="Değerlendirilen iş süreci veya hizmet"></div>
          <div class="field span-2"><label for="sistem">İlgili Sistem / Uygulama</label><input id="sistem" placeholder="Varsa sistem ve uygulama adları"></div>
        </div>
      </section>

      <section class="section">
        <h2>2. Kesintinin İş Etkisi</h2>
        <div class="grid">
          <div class="field"><label for="operasyon">Operasyonel Etki</label><select id="operasyon" class="impact"><option value="">Seçiniz</option><option value="1">Düşük</option><option value="2">Orta</option><option value="3">Yüksek</option><option value="4">Kritik</option></select></div>
          <div class="field"><label for="finans">Mali Etki</label><select id="finans" class="impact"><option value="">Seçiniz</option><option value="1">Düşük</option><option value="2">Orta</option><option value="3">Yüksek</option><option value="4">Kritik</option></select></div>
          <div class="field"><label for="mevzuat">Mevzuat / Hukuki Etki</label><select id="mevzuat" class="impact"><option value="">Seçiniz</option><option value="1">Düşük</option><option value="2">Orta</option><option value="3">Yüksek</option><option value="4">Kritik</option></select></div>
          <div class="field"><label for="itibar">İtibar / Hizmet Etkisi</label><select id="itibar" class="impact"><option value="">Seçiniz</option><option value="1">Düşük</option><option value="2">Orta</option><option value="3">Yüksek</option><option value="4">Kritik</option></select></div>
          <div class="field span-4"><label for="etkiAciklama">Kesinti Etkisi ve Gerekçesi</label><textarea id="etkiAciklama" rows="2" placeholder="Kesintinin faaliyetlere, hizmet alanlara ve kuruma olası etkisi"></textarea></div>
        </div>
      </section>

      <section class="section">
        <h2>3. Kesinti ve Kurtarma Hedefleri</h2>
        <div class="grid">
          <div class="field"><label for="mtpd">MTPD / Azami Tolere Edilebilir Kesinti</label><div class="duration"><input id="mtpd" type="number" min="0" step="any" placeholder="Süre"><select id="mtpdUnit"><option>Dakika</option><option selected>Saat</option><option>Gün</option></select></div></div>
          <div class="field"><label for="rto">Hedef RTO / Kurtarma Süresi</label><div class="duration"><input id="rto" type="number" min="0" step="any" placeholder="Süre"><select id="rtoUnit"><option>Dakika</option><option selected>Saat</option><option>Gün</option></select></div></div>
          <div class="field"><label for="rpo">Hedef RPO / Veri Kaybı Süresi</label><div class="duration"><input id="rpo" type="number" min="0" step="any" placeholder="Süre"><select id="rpoUnit"><option selected>Dakika</option><option>Saat</option><option>Gün</option></select></div></div>
          <div class="field"><label for="oncelik">Kurtarma Önceliği (Öneri)</label><input id="oncelik" readonly placeholder="Etkiye göre hesaplanır"></div>
          <div class="field"><label for="testRto">Son Testte Ölçülen RTO (Varsa)</label><div class="duration"><input id="testRto" type="number" min="0" step="any" placeholder="Süre"><select id="testRtoUnit"><option>Dakika</option><option selected>Saat</option><option>Gün</option></select></div></div>
          <div class="field"><label for="testRpo">Son Testte Ölçülen RPO (Varsa)</label><div class="duration"><input id="testRpo" type="number" min="0" step="any" placeholder="Süre"><select id="testRpoUnit"><option selected>Dakika</option><option>Saat</option><option>Gün</option></select></div></div>
          <div class="field span-2"><label for="hedefGerekce">RTO / RPO Hedeflerinin Gerekçesi</label><input id="hedefGerekce" placeholder="Hedeflerin hangi ihtiyaca göre belirlendiği"></div>
        </div>
        <div class="result" aria-live="polite">
          <div class="item"><b>İş Kritiklik:</b> <output id="kritiklik">—</output></div>
          <p id="validation" data-status="neutral">Hedef süreler girildiğinde uygunluk kontrolü burada gösterilir.</p>
        </div>
      </section>

      <section class="section">
        <h2>4. Bağımlılıklar ve Kurtarma Yaklaşımı</h2>
        <div class="grid">
          <div class="field span-2"><label for="bagimlilik">Kritik Sistemler, Kaynaklar ve Bağımlılıklar</label><textarea id="bagimlilik" rows="2" placeholder="Personel, altyapı, veri, tedarikçi veya diğer hizmetler"></textarea></div>
          <div class="field span-2"><label for="kurtarma">Kurtarma Yöntemi / Alternatif İşleyiş</label><textarea id="kurtarma" rows="2" placeholder="Yedekleme, alternatif ortam, manuel işleyiş veya iş sürekliliği planı"></textarea></div>
        </div>
      </section>

      <section class="section">
        <h2>5. Değerlendirme ve Onay</h2>
        <div class="grid">
          <div class="field span-4"><label for="aksiyon">Karar, İyileştirme İhtiyacı ve Açıklamalar</label><textarea id="aksiyon" rows="2" placeholder="Eksikler, sorumlu aksiyonlar ve değerlendirme sonucu"></textarea></div>
          <div class="field"><label for="hazirlayan">Hazırlayan / Değerlendiren</label><input id="hazirlayan" placeholder="Adı ve soyadı"></div>
          <div class="field"><label for="onaylayan">Onaylayan Yetkili</label><input id="onaylayan" placeholder="Adı ve soyadı"></div>
          <div class="field"><label for="onayTarih">Onay Tarihi</label><input id="onayTarih" type="date"></div>
          <div class="field"><label for="durum">Değerlendirme Durumu</label><select id="durum"><option value="">Seçiniz</option><option>Taslak</option><option>Değerlendirmede</option><option>Onaylandı</option><option>Revizyon Gerekli</option></select></div>
        </div>
      </section>
    </form>
  </main>
  <p class="note">MTPD: Tolere edilebilecek en uzun kesinti. RTO: Hizmeti geri döndürme süresi hedefi. RPO: Zamansal veri kaybı sınırı. Otomatik kritiklik ve öncelik, kurumsal kararın yerine geçmeyen önerilerdir.</p>
  <footer class="screen-footer" aria-label="Form sayfa bilgisi">Sayfa 1 / 1</footer>
</div>
<script>
(()=>{
  "use strict";
  const $=id=>document.getElementById(id);
  const form=$("biaForm");
  form.querySelectorAll('textarea').forEach(t=>{const d=document.createElement('div');d.className='print-text';d.setAttribute('aria-hidden','true');t.after(d);});
  function syncPrintText(){form.querySelectorAll('textarea').forEach(t=>{t.nextElementSibling.textContent=t.value||' ';});}
  window.addEventListener('beforeprint',syncPrintText);
  form.addEventListener('input',e=>{if(e.target.matches('textarea'))syncPrintText()});
  syncPrintText();
  const ids=["kayitNo","tarih","birim","sahip","surec","sistem","operasyon","finans","mevzuat","itibar","etkiAciklama","mtpd","mtpdUnit","rto","rtoUnit","rpo","rpoUnit","testRto","testRtoUnit","testRpo","testRpoUnit","hedefGerekce","bagimlilik","kurtarma","aksiyon","hazirlayan","onaylayan","onayTarih","durum"];
  const labels={kayitNo:"BIA / Kayıt No",tarih:"Değerlendirme Tarihi",birim:"Birim / Departman",sahip:"İş Süreci Sahibi",surec:"İş Süreci / Kritik Hizmet",sistem:"İlgili Sistem / Uygulama",operasyon:"Operasyonel Etki",finans:"Mali Etki",mevzuat:"Mevzuat / Hukuki Etki",itibar:"İtibar / Hizmet Etkisi",etkiAciklama:"Kesinti Etkisi ve Gerekçesi",mtpd:"MTPD",mtpdUnit:"MTPD Birimi",rto:"Hedef RTO",rtoUnit:"RTO Birimi",rpo:"Hedef RPO",rpoUnit:"RPO Birimi",testRto:"Ölçülen RTO",testRtoUnit:"Ölçülen RTO Birimi",testRpo:"Ölçülen RPO",testRpoUnit:"Ölçülen RPO Birimi",hedefGerekce:"Hedeflerin Gerekçesi",bagimlilik:"Kritik Bağımlılıklar",kurtarma:"Kurtarma Yöntemi",aksiyon:"Karar ve İyileştirmeler",hazirlayan:"Hazırlayan",onaylayan:"Onaylayan",onayTarih:"Onay Tarihi",durum:"Değerlendirme Durumu"};
  const impactNames={"1":"Düşük","2":"Orta","3":"Yüksek","4":"Kritik"};
  // Kurum adı: çift tıklama zorunlu değildir; beş ardışık normal tıklama/dokunma yeterlidir.
  // Böylece masaüstünde ve dokunmatik cihazlarda aynı şekilde çalışır.
  const storage={
    get(key){try{return window.localStorage.getItem(key)}catch(_){return null}},
    set(key,value){try{window.localStorage.setItem(key,value);return true}catch(_){return false}},
    remove(key){try{window.localStorage.removeItem(key)}catch(_){}}
  };
  const brand=$("brand"),brandHint=$("brandHint"),brandKey="olgun_ui2_kurum_adi";
  const saved=storage.get(brandKey)||storage.get("olgun_bia_brand");
  if(saved)brand.textContent=saved;
  let taps=0,lastTap=0,resetTimer=0,previousName=brand.textContent;
  function endTapSequence(){taps=0;lastTap=0;window.clearTimeout(resetTimer);brandHint.hidden=true}
  function enableBrandEdit(){
    endTapSequence();previousName=brand.textContent;
    brand.contentEditable="true";brand.setAttribute("role","textbox");
    brand.setAttribute("aria-label","Kurum adını düzenleyin; Enter ile kaydedin, Escape ile iptal edin");
    brandHint.textContent="Düzenleyin · Enter ile kaydedin";brandHint.hidden=false;
    brand.focus();
    const range=document.createRange(),sel=window.getSelection();
    range.selectNodeContents(brand);sel.removeAllRanges();sel.addRange(range);
  }
  function registerTap(){
    if(brand.isContentEditable)return;
    const now=Date.now();taps=now-lastTap<=1800?taps+1:1;lastTap=now;
    if(taps>=5){enableBrandEdit();return}
    brandHint.textContent=`Düzenleme için ${taps}/5 tıklama`;brandHint.hidden=false;
    window.clearTimeout(resetTimer);resetTimer=window.setTimeout(endTapSequence,1900);
  }
  brand.addEventListener("click",registerTap);
  brand.addEventListener("keydown",e=>{
    if(!brand.isContentEditable&&(e.key==="Enter"||e.key===" ")){
      e.preventDefault();registerTap();return;
    }
    if(!brand.isContentEditable)return;
    if(e.key==="Enter"){e.preventDefault();brand.blur()}
    if(e.key==="Escape"){e.preventDefault();brand.textContent=previousName;brand.blur()}
  });
  brand.addEventListener("blur",()=>{
    if(!brand.isContentEditable)return;
    brand.contentEditable="false";brand.setAttribute("role","button");
    brand.setAttribute("aria-label","Kurum adını düzenlemek için art arda 5 kez tıklayın");
    brand.textContent=(brand.textContent||"").replace(/\s+/g," ").trim().slice(0,150)||"OLGUN BAŞKANLIĞI";
    storage.set(brandKey,brand.textContent);brandHint.hidden=true;
  });

  // logo.jpg otomatik yüklenir. Eksikse LOGO yer tutucusu kalır.
  // Logo düğmesine tıklanarak kullanıcı dosya seçebilir; küçük görseller yerel olarak saklanır.
  const logo=$("logo"),logoText=$("logoText"),logoInput=$("logoFile"),logoKey="olgun_ui2_logo";
  function showLogo(){
    const found=logo.complete&&logo.naturalWidth>0;
    logo.style.display=found?"block":"none";logoText.style.display=found?"none":"block";
    $("logoButton").title=found?"Logoyu değiştirmek için tıklayın (Shift+tıkla: logo.jpg dosyasına dön)":"Logo seçmek için tıklayın. Varsayılan resim: aynı klasördeki logo.jpg";
  }
  logo.addEventListener("load",showLogo);
  logo.addEventListener("error",showLogo);
  const savedLogo=storage.get(logoKey);
  if(savedLogo&&/^data:image\/(?:png|jpeg|webp|gif);base64,/.test(savedLogo))logo.src=savedLogo;
  showLogo(); // Resim önceden önbellekten yüklenmişse load olayını kaçırma.
  $("logoButton").addEventListener("click",e=>{
    if(e.shiftKey){storage.remove(logoKey);logo.src="logo.jpg";showLogo();return}
    logoInput.click();
  });
  logoInput.addEventListener("change",e=>{
    const file=e.target.files&&e.target.files[0];if(!file)return;
    if(!["image/png","image/jpeg","image/webp","image/gif"].includes(file.type)){
      notify("Lütfen PNG, JPG, WebP veya GIF formatında bir logo seçin.",true);logoInput.value="";return;
    }
    if(file.size>1400000){notify("Logo en fazla 1,4 MB olabilir. Daha küçük bir görsel seçin.",true);logoInput.value="";return}
    const reader=new FileReader();
    reader.onload=()=>{
      const result=String(reader.result||"");logo.src=result;showLogo();
      if(!storage.set(logoKey,result))notify("Logo bu oturumda gösterilecek; tarayıcıda kalıcı saklama yapılamadı.");
    };
    reader.onerror=()=>notify("Logo dosyası okunamadı.",true);
    reader.readAsDataURL(file);logoInput.value="";
  });
  const factor={Dakika:1,Saat:60,"Gün":1440};
  const value=id=>{const s=$(id).value.trim();return s===""?null:Number(s)};
  const minutes=(id,unit)=>{const n=value(id);return n===null||!Number.isFinite(n)||n<0?null:n*factor[$(unit).value]};
  const compare=(a,b,msg)=>a===null||b===null?null:a>b?msg:null;
  function update(){
    const rated=["operasyon","finans","mevzuat","itibar"].map(x=>Number($(x).value)).filter(x=>x>0);
    const max=rated.length?Math.max(...rated):0;
    $("kritiklik").textContent=max?impactNames[max]:"—";
    $("oncelik").value=max?({1:"P4 – Düşük",2:"P3 – Orta",3:"P2 – Yüksek",4:"P1 – Kritik"})[max]:"";
    const mtpd=minutes("mtpd","mtpdUnit"),rto=minutes("rto","rtoUnit"),rpo=minutes("rpo","rpoUnit"),testRto=minutes("testRto","testRtoUnit"),testRpo=minutes("testRpo","testRpoUnit");
    const errors=[compare(rto,mtpd,"Hedef RTO, MTPD sınırını aşıyor."),compare(testRto,rto,"Ölçülen RTO, hedef RTO'yu aşıyor."),compare(testRpo,rpo,"Ölçülen RPO, hedef RPO'yu aşıyor.")].filter(Boolean);
    const output=$("validation");
    if(errors.length){output.textContent="Uyarı: "+errors.join(" ");output.dataset.status="bad"}
    else if(rto!==null&&mtpd!==null&&(!Number.isFinite(testRto)||testRto===null||testRto<=rto)&&(!Number.isFinite(testRpo)||testRpo===null||rpo!==null&&testRpo<=rpo)){
      output.textContent="Girilen süreler arasında tespit edilmiş bir hedef aşımı yok.";output.dataset.status="ok";
    }else{output.textContent="Hedef süreler girildiğinde uygunluk kontrolü burada gösterilir.";output.dataset.status="neutral"}
  }
  function resize(t){if(t.tagName!=="TEXTAREA")return;t.style.height="auto";t.style.height=Math.max(59,t.scrollHeight+2)+"px"}
  form.addEventListener("input",e=>{resize(e.target);update()});
  form.addEventListener("change",update);
  const notify=(msg,error=false)=>{const n=$("notification");n.textContent=msg;n.dataset.kind=error?"error":"info";n.style.display="block"};
  function getXLSX(){if(!window.XLSX){notify("Excel işlemi için internet bağlantısı veya HTML ile aynı klasörde xlsx.full.min.js kütüphanesi gereklidir.",true);return null}return window.XLSX}
  function makeRows(){
    const rows=[["Alan","Değer"]];
    for(const id of ids){let v=$(id).value;if(["operasyon","finans","mevzuat","itibar"].includes(id))v=impactNames[v]||"";rows.push([labels[id],v])}
    rows.push(["Hesaplanan Kritiklik",$("kritiklik").textContent],["Önerilen Kurtarma Önceliği",$("oncelik").value],["Hedef Uygunluk Notu",$("validation").textContent]);
    return rows;
  }
  $("excelExport").addEventListener("click",()=>{
    const X=getXLSX();if(!X)return;
    try{const ws=X.utils.aoa_to_sheet(makeRows());ws["!cols"]=[{wch:35},{wch:90}];
      const wb=X.utils.book_new();X.utils.book_append_sheet(wb,ws,"BIA Formu");X.writeFile(wb,"BIA_RTO_RPO_Formu.xlsx");}
    catch(e){notify("Excel dışarı aktarma başarısız: "+e.message,true)}
  });
  $("excelImport").addEventListener("click",()=>{if(getXLSX())$("excelFile").click()});
  $("excelFile").addEventListener("change",async e=>{
    const file=e.target.files?.[0];if(!file)return;
    const X=getXLSX();if(!X)return;
    try{
      const data=await file.arrayBuffer(),wb=X.read(data,{type:"array",cellDates:false});
      if(!wb.SheetNames.length)throw new Error("Çalışma sayfası bulunamadı.");
      const sheet=wb.Sheets[wb.SheetNames[0]];
      const rows=X.utils.sheet_to_json(sheet,{header:1,defval:"",raw:false});
      if(!rows.length||String(rows[0][0]).trim()!=="Alan"||String(rows[0][1]).trim()!=="Değer")throw new Error("Formun Excel şablonu tanınamadı.");
      const lookup=new Map(ids.map(id=>[labels[id],id]));
      let applied=0;
      for(const row of rows.slice(1)){
        const id=lookup.get(String(row[0]||"").trim());if(!id)continue;
        let v=String(row[1]??"");
        if(["operasyon","finans","mevzuat","itibar"].includes(id))v=Object.keys(impactNames).find(key=>impactNames[key]===v)||v;
        if($(id).tagName==="SELECT"&&!Array.from($(id).options).some(opt=>opt.value===v))continue;
        $(id).value=v;applied++;
      }
      form.querySelectorAll("textarea").forEach(resize);update();
      notify(applied+" alan Excel dosyasından içeri aktarıldı.");
    }catch(err){notify("Excel içeri aktarma başarısız: "+err.message,true)}
    finally{e.target.value=""}
  });
  $("printButton").addEventListener("click",()=>window.print());
  update();
})();
</script>
<script async src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.18.5/xlsx.full.min.js"></script>
</body>
</html>