Daha hızlı ve pratik izin formu elinizin altında. form Çalıştığında ve yazdırırken ön izlemeler.
HTML Kod:
Kodu not defterine yapıştırın. İsim verin, uzantı ".html" olmalı. sonra çift tıklayarak çalıştırın. Firma ismi, İzin talep eden ve Metin mesajını, kalıcı olması için kod içinden de değiştirebilirsiniz.
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Yıllık İzin Dilekçesi</title>
<style>
* { box-sizing: border-box; }
body { margin: 0; background: #eef2f7; font-family: 'Segoe UI', Arial, sans-serif; }
.container { max-width: 1200px; margin: auto; padding: 20px; display: grid; grid-template-columns: 400px 1fr; gap: 20px; }
.panel { background: #fff; border-radius: 14px; padding: 20px; box-shadow: 0 4px 18px rgba(0,0,0,.08); }
.preview { background: transparent; padding: 0; box-shadow: none; }
label { display: block; margin-top: 10px; font-weight: 600; }
input, textarea { width: 100%; padding: 10px; border: 1px solid #ccd5e0; border-radius: 8px; margin-top: 5px; }
textarea { min-height: 70px; }
.btn { width: 100%; padding: 12px; border: none; border-radius: 8px; background: #0d6efd; color: #fff; font-weight: 700; cursor: pointer; margin-top: 15px; }
.preview-page { width: 210mm; min-height: 297mm; background: #fff; margin: auto; padding: 20mm; border: 1px solid #d9e2ec; box-shadow: 0 4px 18px rgba(0,0,0,.08); }
.letter-title { text-align: center; font-size: 18pt; font-weight: 700; margin-top: 25mm; margin-bottom: 10mm; }
.letter-content { font-size: 12pt; line-height: 1.6; text-align: justify; }
.letter-content p { margin-bottom: 8mm; text-indent: 10mm; }
.signature { width: 75mm; margin-left: auto; margin-top: 20mm; }
@media print {
body { background: #fff; }
.container { display: block; padding: 0; }
.panel { display: none !important; }
.preview, .preview-page {
width: 100% !important;
border: none !important;
box-shadow: none !important;
padding: 0 !important;
margin: 0 !important;
min-height: auto !important;
background: white !important;
}
}
</style>
</head>
<body>
<div class="container">
<div class="panel">
<label>Firma Bilgisi</label>
<input id="firma" value="SAVUNMA TEKNOLOJİ BİLİŞİM A.Ş.'NE">
<label>Dilekçe Metni</label>
<textarea id="metin">Şirketiniz bünyesinde, Teknik İşletme Dairesi, Kullanıcı Destek Biriminde görevli bulunmaktayım.</textarea>
<label>Başlangıç Tarihi</label>
<input type="date" id="baslangic">
<label>Bitiş Tarihi</label>
<input type="date" id="bitis">
<label>İzin Süresi (İş Günü)</label>
<input type="number" id="gun" readonly>
<label>İşbaşı Tarihi</label>
<input type="date" id="isbasi">
<label>Dilekçe Tarihi</label>
<input type="date" id="dilekce">
<label>Ad Soyad</label>
<input id="isim" value="Muhammed Yusuf OLGUN">
<button class="btn" id="printBtn">Yazdır / PDF Kaydet</button>
</div>
<div class="preview">
<div id="letter" class="preview-page"></div>
</div>
</div>
<script>
const el = id => document.getElementById(id);
const weekend = d => d.getDay() === 0 || d.getDay() === 6;
function parseDate(v) {
if (!v) return new Date();
const [y, m, d] = v.split('-').map(Number);
return new Date(y, m - 1, d);
}
function tr(v) { return v ? parseDate(v).toLocaleDateString('tr-TR') : ""; }
function workDays(s, e) {
let c = 0, t = new Date(s);
while (t <= e) { if (!weekend(t)) c++; t.setDate(t.getDate() + 1); }
return c;
}
function nextWorkDay(d) {
let x = new Date(d);
do { x.setDate(x.getDate() + 1); } while (weekend(x));
return x.toISOString().split('T')[0];
}
function numberToText(n) {
const map = {0:'sıfır',1:'bir',2:'iki',3:'üç',4:'dört',5:'beş',6:'altı',7:'yedi',8:'sekiz',9:'dokuz',10:'on'};
return map[n] || n;
}
function render() {
el('letter').innerHTML = `
<div class="letter-title">${el('firma').value}</div>
<div class="letter-content">
<p>${el('metin').value}</p>
<p>Yıllık izin hakkımı kullanmak üzere <b>${tr(el('baslangic').value)}</b> - <b>${tr(el('bitis').value)}</b> tarihleri arasında <b>${el('gun').value} (${numberToText(Number(el('gun').value))}) iş günü</b> süreyle izinli sayılmam hususunda gereğini arz eder, <b>${tr(el('isbasi').value)}</b> tarihinde görevime başlayacağımı bilgilerinize sunarım.</p>
</div>
<div class="signature">
<div>${tr(el('dilekce').value)}</div>
<br><b>${el('isim').value}</b><br>İmza
</div>`;
}
function recalc() {
const b = parseDate(el('baslangic').value);
const bt = parseDate(el('bitis').value);
if (bt < b) { el('bitis').value = el('baslangic').value; return; }
el('gun').value = workDays(b, bt);
if (!el('isbasi').value || parseDate(el('isbasi').value) <= bt) {
el('isbasi').value = nextWorkDay(bt);
}
render();
}
let today = new Date().toISOString().split('T')[0];
el('baslangic').value = today;
el('bitis').value = today;
el('dilekce').value = today;
recalc();
['firma', 'metin', 'isim', 'dilekce'].forEach(i => el(i).addEventListener('input', render));
el('baslangic').addEventListener('change', recalc);
el('bitis').addEventListener('change', recalc);
el('isbasi').addEventListener('change', render);
el('printBtn').addEventListener('click', () => {
recalc();
window.print();
});
</script>
</body>
</html>

