<?php
// modules/izin-talep.php (Personel Kişisel İzin Talep Sayfası)
session_start();
require_once '../config/db.php';
require_once '../config/functions.php';
// Yetki kontrolü: Oturum açan herkes bu sayfaya erişebilir.
yetkiKontrol(['root', 'yonetici', 'mudur', 'vardiya_amiri', 'calisan', 'stajyer', 'muhasebe', 'insan_kaynaklari']);
include '../includes/header.php';
include '../includes/menu.php';
$mesaj = '';
$kullanici_id = $_SESSION['kullanici_id'];
$rol = $_SESSION['rol'];
$ad_soyad = $_SESSION['ad_soyad']; // Bildirim metni için
// --- SAAT SEÇENEKLERİ (SADECE TAM VE BUÇUK SAATLER) ---
$zaman_secenekleri = "";
for ($saat = 0; $saat < 24; $saat++) {
foreach (['00', '30'] as $dakika) {
$deger = sprintf('%02d:%s', $saat, $dakika);
$zaman_secenekleri .= "<option value='$deger'>$deger</option>";
}
}
// --- RESMİ TATİLLERİ ÇEK ---
$tatiller_db = $pdo->query("SELECT tarih FROM resmi_tatiller")->fetchAll(PDO::FETCH_COLUMN);
$tatiller_json = json_encode($tatiller_db);
// --- BAKİYE HESAPLAMA ---
$stmt_u = $pdo->prepare("SELECT ise_giris_tarihi, devreden_izin FROM kullanicilar WHERE id = ?");
$stmt_u->execute([$kullanici_id]);
$user_data = $stmt_u->fetch();
$ise_giris = new DateTime($user_data['ise_giris_tarihi']);
$bugun = new DateTime();
$kidem_yil = $ise_giris->diff($bugun)->y;
// Yasal Hakediş Hesaplama
$yasal_hak = ($kidem_yil >= 15) ? 26 : (($kidem_yil >= 5) ? 20 : 14);
if ($rol == 'stajyer') $yasal_hak = 0;
$toplam_hak = $yasal_hak + (float)$user_data['devreden_izin'];
// Kullanılan Yıllık İzin (Bu yıl)
$sql_kul = "SELECT SUM(toplam_gun) FROM izin_talepleri WHERE calisan_id = ? AND izin_turu IN ('yillik') AND durum = 'onaylandi' AND YEAR(baslangic_tarihi) = YEAR(CURDATE())";
$stmt_kul = $pdo->prepare($sql_kul);
$stmt_kul->execute([$kullanici_id]);
$kullanilan = (float)$stmt_kul->fetchColumn();
$kalan_bakiye = $toplam_hak - $kullanilan;
// --- KAYIT İŞLEMİ ---
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
csrfKontrol($_POST['csrf_token']);
$hedef_yonetici = $_POST['hedef_yonetici_id'];
$izin_secimi = $_POST['izin_turu'];
$izin_turu = ($izin_secimi == 'saatlik') ? 'saatlik' : $izin_secimi;
$aciklama = guvenlik($_POST['aciklama']);
$hata = false; $toplam_gun = 0; $saatlik_sure = 0; $baslangic = ""; $bitis = "";
$kontrol_bas = "";
$kontrol_bit = "";
// 1. SAATLİK İZİN HESAPLAMA
if ($izin_turu == 'saatlik') {
$tarih = $_POST['saatlik_tarih'];
$bas_saat = $_POST['saatlik_bas'];
$bit_saat = $_POST['saatlik_bit'];
$baslangic = "$tarih $bas_saat:00";
$bitis = "$tarih $bit_saat:00";
$kontrol_bas = $tarih;
$kontrol_bit = $tarih;
if (empty($tarih) || empty($bas_saat) || empty($bit_saat)) {
$mesaj = '<div class="alert alert-danger">Hata: Saatlik izin için Tarih ve saatler zorunludur.</div>';
$hata = true;
goto end_of_post_logic;
}
if (strtotime($bitis) <= strtotime($baslangic)) {
$mesaj = '<div class="alert alert-danger">Bitiş saati başlangıçtan sonra olmalı.</div>';
$hata = true;
} else {
$diff = strtotime($bitis) - strtotime($baslangic);
$saatlik_sure = round($diff / 3600, 2);
$toplam_gun = 0;
}
}
// 2. GÜNLÜK İZİN HESAPLAMA
else {
$gelen_tarih = $_POST['baslangic_tarihi_gun'];
$gun_sayisi = (float)$_POST['gun_sayisi'];
if (empty($gelen_tarih) || $gun_sayisi <= 0) {
$mesaj = '<div class="alert alert-danger">Hata: Başlangıç tarihi ve gün sayısı zorunludur.</div>';
$hata = true;
goto end_of_post_logic;
}
$baslangic_tarihi = $gelen_tarih . ' 08:00:00';
// Bakiye Kontrolü (Sadece Yıllık İzin)
if ($izin_turu === 'yillik' && $gun_sayisi > $kalan_bakiye) {
$mesaj = '<div class="alert alert-danger">Yetersiz bakiye! Talep edilen süre kalan hakkınızdan fazla.</div>';
$hata = true;
} else {
// Bitiş Tarihini Hesapla (İşe Başlama Tarihi)
$temp_date = new DateTime($gelen_tarih);
$sayilan_gun = 0;
$tatil_atla = in_array($izin_turu, ['yillik']);
$i=0;
while ($sayilan_gun < floor($gun_sayisi)) {
$ymd = $temp_date->format('Y-m-d');
$h_gun = $temp_date->format('N');
$gun_gecerli = true;
if ($tatil_atla) {
if ($h_gun == 7 || in_array($ymd, $tatiller_db)) { $gun_gecerli = false; }
}
if ($gun_gecerli) { $sayilan_gun++; }
if ($sayilan_gun < floor($gun_sayisi)) { $temp_date->modify('+1 day'); }
$i++; if($i>90) break;
}
$baslangic = $baslangic_tarihi;
$bitis = $temp_date->format('Y-m-d 18:00:00');
$toplam_gun = $gun_sayisi;
$kontrol_bas = date('Y-m-d', strtotime($baslangic));
$kontrol_bit = date('Y-m-d', strtotime($bitis));
}
}
// =========================================================
// !!! ÇAKIŞMA KONTROLÜ (Mevcut İzin/Mesai Var mı?) !!!
// =========================================================
if (!$hata) {
$hata_mesaji_detay = "Seçilen tarihler arasında zaten **onaylanmış veya beklemede olan** başka bir izin/mesai kaydınız bulunmaktadır. Bu tarihlere yeni bir talep giremezsiniz. Hata varsa lütfen **İnsan Kaynakları ya da Yönetim** birimine başvurunuz.";
// 1. İzin Çakışması
$sql_izin_cakisma = "
SELECT COUNT(*)
FROM izin_talepleri
WHERE calisan_id = ?
AND durum IN ('beklemede', 'onaylandi')
AND (
(? BETWEEN DATE(baslangic_tarihi) AND DATE(bitis_tarihi)) OR
(? BETWEEN DATE(baslangic_tarihi) AND DATE(bitis_tarihi))
)";
$stmt_izin_cakisma = $pdo->prepare($sql_izin_cakisma);
$stmt_izin_cakisma->execute([$kullanici_id, $kontrol_bas, $kontrol_bit]);
if ($stmt_izin_cakisma->fetchColumn() > 0) {
$mesaj = "<div class='alert alert-danger shadow-sm border-start border-danger border-5'>
<h5 class='alert-heading h6 fw-bold'><i class='fas fa-exclamation-triangle me-2'></i> KAYIT HATA!</h5> $hata_mesaji_detay
</div>";
$hata = true;
}
}
// 2. Mesai Çakışması
if (!$hata) {
$sql_mesai_cakisma = "
SELECT COUNT(*) FROM mesai_hareketleri
WHERE calisan_id = ?
AND durum IN ('beklemede', 'onaylandi')
AND tarih BETWEEN ? AND ?";
$stmt_mesai_cakisma = $pdo->prepare($sql_mesai_cakisma);
$stmt_mesai_cakisma->execute([$kullanici_id, $kontrol_bas, $kontrol_bit]);
if ($stmt_mesai_cakisma->fetchColumn() > 0) {
$mesaj = "<div class='alert alert-danger shadow-sm border-start border-danger border-5'>
<h5 class='alert-heading h6 fw-bold'><i class='fas fa-exclamation-triangle me-2'></i> KAYIT HATA!</h5> $hata_mesaji_detay
</div>";
$hata = true;
}
}
// =========================================================
if (!$hata) {
$sql = "INSERT INTO izin_talepleri (calisan_id, hedef_yonetici_id, izin_turu, baslangic_tarihi, bitis_tarihi, toplam_gun, saatlik_sure, aciklama, durum)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, 'beklemede')";
try {
// Kendi ID'mizi kullandığımız için calisan_id otomatik olarak session'dan gelir.
$pdo->prepare($sql)->execute([$kullanici_id, $hedef_yonetici, $izin_turu, $baslangic, $bitis, $toplam_gun, $saatlik_sure, $aciklama]);
// Log
$log_txt = ($izin_turu == 'saatlik') ? "Saatlik İzin ($saatlik_sure S)" : "$gun_sayisi Gün İzin ($izin_turu)";
logKaydet($pdo, $kullanici_id, 'ekleme', $log_txt, 'izin_talepleri', $pdo->lastInsertId());
// --- BİLDİRİMLER ---
// 1. Yöneticiye
bildirimGonder($pdo, $hedef_yonetici, "Yeni İzin Talebi", "$ad_soyad sizden izin onayı bekliyor.", "../modules/tum-izinler.php");
// 2. İK ve Muhasebeye (Bilgi)
rolBildirimGonder($pdo, ['insan_kaynaklari', 'muhasebe'], "Yeni İzin Talebi", "$ad_soyad bir izin talebi oluşturdu.", "../modules/tum-izinler.php");
$mesaj = '<div class="alert alert-success shadow-sm border-start border-success border-5"><i class="fas fa-check-circle me-2"></i> İzin talebiniz başarıyla iletildi ve bildirim gönderildi.</div>';
} catch (PDOException $e) {
$mesaj = '<div class="alert alert-danger">Hata: ' . $e->getMessage() . '</div>';
}
}
}
end_of_post_logic:
// Personel, talebini yöneticisine veya müdürüne gönderebilir.
$yoneticiler = $pdo->query("SELECT id, ad, soyad, rol FROM kullanicilar WHERE rol IN ('yonetici', 'mudur') AND durum=1 AND id != $kullanici_id")->fetchAll();
$izinler = $pdo->prepare("SELECT * FROM izin_talepleri WHERE calisan_id = ? ORDER BY olusturulma_tarihi DESC");
$izinler->execute([$kullanici_id]);
$kayitlar = $izinler->fetchAll();
?>
<div class="container-fluid">
<div class="row g-4 mb-4">
<div class="col-12 col-md-4">
<div class="card border-0 shadow-sm h-100" style="background: linear-gradient(135deg, #2A7BB8 0%, #1e5c8a 100%); color: white;">
<div class="card-body text-center p-4">
<div class="mb-2 text-white-50 text-uppercase fw-bold small">Kalan Yıllık İzin Bakiyesi</div>
<h1 class="display-3 fw-bold mb-0"><?php echo $kalan_bakiye; ?></h1>
<span class="badge bg-white text-primary rounded-pill px-3 mt-2">GÜN</span>
</div>
</div>
</div>
<div class="col-12 col-md-8">
<div class="card border-0 shadow-sm h-100 border-start border-5 border-warning">
<div class="card-body p-4">
<h6 class="text-muted text-uppercase mb-3 fw-bold"><i class="fas fa-balance-scale text-warning me-2"></i> İzin Kuralları</h6>
<div class="row small text-muted">
<div class="col-md-6">
<ul class="list-unstyled mb-0">
<li class="mb-2"><strong class="text-dark">Yıllık İzin:</strong> Pazar ve Resmi Tatiller izin süresinden <u>sayılmaz</u>. Bakiyeden düşer.</li>
<li class="mb-2"><strong class="text-dark">Saatlik İzin:</strong> Ücretsiz izin olarak kabul edilir, maaştan kesinti yapılır.</li>
</ul>
</div>
<div class="col-md-6">
<ul class="list-unstyled mb-0">
<li class="mb-2"><strong class="text-dark">Evlilik/Ölüm:</strong> Takvim Günü Sayılır. Bakiye düşmez.</li>
<li><strong class="text-dark">Babalık:</strong> Takvim Günü Sayılır. Bakiye düşmez.</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row g-4">
<div class="col-12 col-lg-8 mx-auto">
<div class="card border-0 shadow-sm">
<div class="card-header bg-white py-3 border-bottom">
<h5 class="mb-0 fw-bold text-dark"><i class="fas fa-file-signature text-primary me-2"></i> İzin Talebi Oluştur</h5>
</div>
<div class="card-body p-4">
<?php echo $mesaj; ?>
<form method="POST" id="izinFormu">
<input type="hidden" name="csrf_token" value="<?php echo csrfTokenOlustur(); ?>">
<div class="row g-3 mb-4">
<div class="col-md-6">
<label class="form-label fw-bold small text-muted">ONAYLAYACAK YÖNETİCİ</label>
<select name="hedef_yonetici_id" id="yoneticiSecim" class="form-select py-2 bg-light" required>
<option value="">Seçiniz...</option>
<?php foreach($yoneticiler as $y): ?>
<option value="<?php echo $y['id']; ?>"><?php echo $y['ad'].' '.$y['soyad']; ?> (<?php echo strtoupper($y['rol']); ?>)</option>
<?php endforeach; ?>
</select>
</div>
<div class="col-md-6">
<label class="form-label fw-bold small text-muted">İZİN TÜRÜ</label>
<select name="izin_turu" id="izinTuruSecimi" class="form-select py-2 border-primary fw-bold" required onchange="turDegisti()">
<optgroup label="Bakiyeden Düşenler">
<?php if($rol != 'stajyer'): ?>
<option value="yillik">📅 Yıllık İzin (Tatiller Sayılmaz)</option>
<?php endif; ?>
</optgroup>
<optgroup label="Ücretli Yasal İzinler (Bakiye Düşmez)">
<?php if($rol != 'stajyer'): ?>
<option value="evlilik" data-sure="7">💍 Evlilik İzni (7 Gün)</option>
<option value="babalik" data-sure="5">👶 Babalık İzni (5 Gün)</option>
<option value="olum" data-sure="3">⚰️ Ölüm İzni (3 Gün)</option>
<?php endif; ?>
<option value="hastalik">🚑 Hastalık / Rapor</option>
<option value="diger">❓ Diğer Ücretli İzin</option>
</optgroup>
<optgroup label="Ücretsiz İzinler (Maaş Kesintisi)">
<option value="saatlik">🕒 Saatlik İzin (Maaş Kesintisi)</option>
</optgroup>
</select>
</div>
</div>
<div id="yasalBilgiKutusu" class="alert alert-info d-none small shadow-sm"></div>
<hr class="my-4" style="opacity: 0.1">
<div id="alan_gunluk" class="bg-light p-3 rounded border mb-3">
<div class="row g-3">
<div class="col-12 col-md-4">
<label class="form-label fw-bold small text-muted">BAŞLANGIÇ TARİHİ</label>
<input type="date" name="baslangic_tarihi_gun" id="inpTarih" class="form-control py-2" value="<?php echo date('Y-m-d'); ?>" onchange="hesaplaBitis()">
<div class="form-text small">Seçilen tarih 1. gün sayılır.</div>
</div>
<div class="col-12 col-md-4">
<label class="form-label fw-bold small text-muted text-primary">GÜN SAYISI</label>
<div class="input-group">
<input type="number" name="gun_sayisi" id="inpGun" class="form-control py-2" step="0.5" min="0.5" placeholder="Gün" onchange="hesaplaBitis()">
<span class="input-group-text">Gün</span>
</div>
<input type="hidden" id="kalanBakiye" value="<?php echo $kalan_bakiye; ?>">
</div>
<div class="col-12 col-md-4">
<label class="form-label fw-bold small text-muted text-success">İŞE BAŞLAMA TARİHİ</label>
<input type="text" id="outBitis" class="form-control py-2 bg-white text-success fw-bold" readonly value="-">
</div>
</div>
<div id="bakiyeUyari" class="alert alert-danger mt-2 d-none small"><i class="fas fa-exclamation-circle"></i> Talep edilen gün sayısı bakiyenizden fazla!</div>
</div>
<div id="alan_saatlik" class="bg-warning bg-opacity-10 p-3 rounded border border-warning mb-3" style="display:none;">
<div class="row g-3">
<div class="col-12 col-md-6">
<label class="form-label fw-bold small text-muted">BAŞLANGIÇ TARİHİ <span class="text-danger">*</span></label>
<input type="date" name="saatlik_tarih" id="inpSaatTarih" class="form-control py-2" value="<?php echo date('Y-m-d'); ?>">
</div>
<div class="col-6 col-md-3">
<label class="form-label fw-bold small text-muted">BAŞLANGIÇ SAATİ</label>
<select name="saatlik_bas" class="form-select">
<option value="">Seçiniz</option>
<?php echo $zaman_secenekleri; ?>
</select>
</div>
<div class="col-6 col-md-3">
<label class="form-label fw-bold small text-muted">BİTİŞ SAATİ</label>
<select name="saatlik_bit" class="form-select">
<option value="">Seçiniz</option>
<?php echo $zaman_secenekleri; ?>
</select>
</div>
</div>
</div>
<div class="mb-4">
<label class="form-label fw-bold small text-muted">AÇIKLAMA / MAZERET</label>
<textarea name="aciklama" id="inpAciklama" class="form-control" rows="2" required placeholder="İzin nedeninizi belirtiniz..."></textarea>
</div>
<div class="d-grid">
<button type="button" class="btn btn-primary btn-lg fw-bold shadow-sm" onclick="onayIste()">
<i class="fas fa-paper-plane me-2"></i> İzin Talebini Gönder
</button>
</div>
</form>
</div>
</div>
</div>
</div>
<div class="card border-0 shadow-sm mt-4">
<div class="card-header bg-white py-3 border-bottom">
<h5 class="mb-0 fw-bold text-dark"><i class="fas fa-history me-2"></i> İzin Geçmişim</h5>
</div>
<div class="table-responsive">
<table class="table table-hover align-middle mb-0">
<thead class="table-light small text-muted">
<tr><th>Tür</th><th>Başlangıç</th><th>Süre</th><th>Durum</th><th>Kayıt</th></tr>
</thead>
<tbody>
<?php foreach($kayitlar as $k): ?>
<tr>
<td class="ps-4">
<?php if($k['izin_turu'] == 'saatlik'): ?>
<span class="badge bg-warning text-dark">SAATLİK</span>
<?php else: ?>
<span class="badge bg-secondary"><?php echo strtoupper($k['izin_turu']); ?></span>
<?php endif; ?>
</td>
<td>
<span class="fw-bold text-dark"><?php echo tarihTurkce(date('Y-m-d', strtotime($k['baslangic_tarihi']))); ?></span>
<br>
<?php if($k['izin_turu'] == 'saatlik'): ?>
<small class="text-muted"><?php echo date('H:i', strtotime($k['baslangic_tarihi'])) . ' - ' . date('H:i', strtotime($k['bitis_tarihi'])); ?></small>
<?php endif; ?>
</td>
<td>
<?php echo ($k['izin_turu'] == 'saatlik') ? $k['saatlik_sure'].' Saat' : floatval($k['toplam_gun']).' Gün'; ?>
</td>
<td>
<?php if($k['durum']=='onaylandi'): ?><span class="badge bg-success bg-opacity-10 text-success">Onaylı</span>
<?php elseif($k['durum']=='reddedildi'): ?><span class="badge bg-danger bg-opacity-10 text-danger">Red</span>
<?php else: ?><span class="badge bg-warning bg-opacity-10 text-warning">Bekliyor</span><?php endif; ?>
</td>
<td class="text-muted small">
<?php echo date('d.m.Y', strtotime($k['olusturulma_tarihi'])); ?>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
</div>
</div>
<div class="modal fade" id="onayModal" tabindex="-1">
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content border-0 shadow">
<div class="modal-header bg-primary text-white">
<h5 class="modal-title"><i class="fas fa-question-circle me-2"></i> Onaylıyor musunuz?</h5>
<button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body p-4">
<p class="mb-3 text-center">Aşağıdaki izin talebiniz yöneticiye iletilecektir:</p>
<div class="alert alert-light border small">
<div><strong class="text-dark">Yönetici:</strong> <span id="modalYonetici" class="text-primary"></span></div>
<div><strong class="text-dark">Tarih / Süre:</strong> <span id="modalTarih" class="text-primary"></span></div>
<div><strong class="text-dark">Konu:</strong> <span id="modalKonu" class="text-primary"></span></div>
<div id="modalIseBaslama" class="mt-2 text-success fw-bold border-top pt-2"></div>
</div>
<div class="text-center small text-muted">Göndermek istediğinize emin misiniz?</div>
</div>
<div class="modal-footer justify-content-center border-0 bg-light">
<button type="button" class="btn btn-secondary px-4" data-bs-dismiss="modal">İptal</button>
<button type="button" class="btn btn-primary px-4 fw-bold" onclick="formuGonder()">Evet, Gönder</button>
</div>
</div>
</div>
</div>
<script>
const resmiTatiller = <?php echo $tatiller_json; ?>;
function turDegisti() {
const select = document.getElementById('izinTuruSecimi');
const selectedOption = select.options[select.selectedIndex];
const tur = select.value;
const inpGun = document.getElementById('inpGun');
const bilgiKutusu = document.getElementById('yasalBilgiKutusu');
let msg = "";
if (tur === 'evlilik') msg = "<strong>Evlilik İzni:</strong> 7 Gün (Takvim günü). Bakiye düşmez.";
else if (tur === 'babalik') msg = "<strong>Babalık İzni:</strong> 5 Gün (Takvim günü). Bakiye düşmez.";
else if (tur === 'olum') msg = "<strong>Ölüm İzni:</strong> 3 Gün (Takvim günü). Bakiye düşmez.";
else if (tur === 'yillik') msg = "<strong>Yıllık İzin:</strong> Pazar ve Tatiller sayılmaz. Bakiyeden düşer.";
if(msg) { bilgiKutusu.innerHTML = "<i class='fas fa-info-circle'></i> " + msg; bilgiKutusu.classList.remove('d-none'); }
else { bilgiKutusu.classList.add('d-none'); }
const divGunluk = document.getElementById('alan_gunluk');
const divSaatlik = document.getElementById('alan_saatlik');
const inpGunlukBas = document.getElementById('inpTarih');
const inpSaatlikBas = document.querySelector('#alan_saatlik select[name="saatlik_bas"]');
const inpSaatlikBit = document.querySelector('#alan_saatlik select[name="saatlik_bit"]');
const inpSaatlikTarih = document.querySelector('input[name="saatlik_tarih"]');
// Zorunluluk/Görünürlük Ayarı
const resetFields = (bas, bit, tarih = null, required = false) => {
if (required) {
bas.setAttribute('required', 'required');
if (bit) bit.setAttribute('required', 'required');
if (tarih) tarih.setAttribute('required', 'required');
} else {
bas.removeAttribute('required');
if (bit) bit.removeAttribute('required');
if (tarih) tarih.removeAttribute('required');
}
};
if (tur === 'saatlik') {
divGunluk.style.display = 'none';
divSaatlik.style.display = 'block';
resetFields(inpSaatlikBas, inpSaatlikBit, inpSaatlikTarih, true);
resetFields(inpGunlukBas, inpGun); // Günlük alanların required'ını kaldır
} else {
divGunluk.style.display = 'block';
divSaatlik.style.display = 'none';
resetFields(inpGunlukBas, inpGun, null, true);
resetFields(inpSaatlikBas, inpSaatlikBit, inpSaatlikTarih); // Saatlik alanların required'ını kaldır
const yasalSure = selectedOption.getAttribute('data-sure');
if (yasalSure) { inpGun.value = yasalSure; inpGun.setAttribute('readonly', true); }
else { if(inpGun.hasAttribute('readonly')) { inpGun.value = ''; inpGun.removeAttribute('readonly'); } }
hesaplaBitis();
}
}
function hesaplaBitis() {
const basTarihStr = document.getElementById('inpTarih').value;
const gunSayisi = parseFloat(document.getElementById('inpGun').value);
const tur = document.getElementById('izinTuruSecimi').value;
const outBitis = document.getElementById('outBitis');
const kalanBakiye = parseFloat(document.getElementById('kalanBakiye').value);
const uyari = document.getElementById('bakiyeUyari');
if (tur === 'yillik' && gunSayisi > kalanBakiye) {
uyari.classList.remove('d-none');
outBitis.value = "Limit Aşıldı";
return;
} else {
uyari.classList.add('d-none');
}
if (!basTarihStr || !gunSayisi || gunSayisi <= 0) { outBitis.value = "-"; return; }
let currentDate = new Date(basTarihStr + 'T00:00:00'); // Saat hatasını önlemek için T00:00:00 eklendi
let sayilanGun = 0;
const tatilAtla = (tur === 'yillik');
while (sayilanGun < Math.floor(gunSayisi)) {
let ymd = currentDate.toISOString().split('T')[0];
let dayOfWeek = currentDate.getDay();
let gunGecerli = true;
if (tatilAtla) {
// Pazar (0) veya Resmi Tatil
if (dayOfWeek === 0 || resmiTatiller.includes(ymd)) {
gunGecerli = false;
}
}
if (gunGecerli) { sayilanGun++; }
if (sayilanGun < Math.floor(gunSayisi)) {
currentDate.setDate(currentDate.getDate() + 1);
}
}
// İş Başı (Bitiş tarihi + 1 gün)
currentDate.setDate(currentDate.getDate() + 1);
// İş Başı, Pazar veya Resmi Tatil gününe denk geliyorsa atla
let checkLoop = 0;
while(checkLoop < 10) {
let ymdCheck = currentDate.toISOString().split('T')[0];
let dayCheck = currentDate.getDay();
// Pazar (0) veya Resmi Tatil ise atla
if(dayCheck === 0 || resmiTatiller.includes(ymdCheck)) {
currentDate.setDate(currentDate.getDate() + 1);
} else {
break;
}
checkLoop++;
}
const options = { day: 'numeric', month: 'long', year: 'numeric' };
outBitis.value = currentDate.toLocaleDateString('tr-TR', options);
}
function calculateHours(start, end) {
const [h1, m1] = start.split(':').map(Number);
const [h2, m2] = end.split(':').map(Number);
let totalMinutes1 = h1 * 60 + m1;
let totalMinutes2 = h2 * 60 + m2;
// Gece geçişi
if (totalMinutes2 < totalMinutes1) {
totalMinutes2 += 24 * 60;
}
const diffMinutes = totalMinutes2 - totalMinutes1;
return diffMinutes / 60;
}
function onayIste() {
const form = document.getElementById('izinFormu');
if (!form.checkValidity()) { form.reportValidity(); return; }
const yonetici = document.getElementById('yoneticiSecim');
const yoneticiText = yonetici.options[yonetici.selectedIndex].text;
const konu = document.getElementById('inpAciklama').value;
const tur = document.getElementById('izinTuruSecimi').value;
let tarihBilgi = "";
let iseBaslama = "";
if (tur === 'saatlik') {
const tarih = document.querySelector('input[name="saatlik_tarih"]').value;
const bas_saat = document.querySelector('select[name="saatlik_bas"]').value;
const bit_saat = document.querySelector('select[name="saatlik_bit"]').value;
const saatFarki = calculateHours(bas_saat, bit_saat);
tarihBilgi = `${tarih} ${bas_saat} - ${bit_saat} (Saatlik)`;
iseBaslama = "Süre: " + saatFarki + " Saat";
if(saatFarki <= 0) {
alert("Bitiş saati başlangıç saatinden sonra olmalıdır."); return;
}
} else {
const trh = new Date(document.getElementById('inpTarih').value + 'T00:00:00');
const gun = document.getElementById('inpGun').value;
const baslama = document.getElementById('outBitis').value;
if(baslama === "Limit Aşıldı") { alert("Yıllık izin bakiyesi yetersiz!"); return; }
const tarihOptions = { year: 'numeric', month: 'long', day: 'numeric' };
tarihBilgi = trh.toLocaleDateString('tr-TR', tarihOptions) + " (" + gun + " Gün)";
iseBaslama = "İşe Başlama: " + baslama;
}
document.getElementById('modalYonetici').textContent = yoneticiText;
document.getElementById('modalTarih').textContent = tarihBilgi;
document.getElementById('modalKonu').textContent = konu.substring(0, 40) + (konu.length > 40 ? "..." : "");
document.getElementById('modalIseBaslama').textContent = iseBaslama;
new bootstrap.Modal(document.getElementById('onayModal')).show();
}
function formuGonder() {
document.getElementById('izinFormu').submit();
}
document.addEventListener('DOMContentLoaded', function() {
turDegisti();
});
</script>
<?php include '../includes/footer.php'; ?>