PYBS (Personel Yönetim Bilgi Sistemi) / Ramsa/modules/izin-gir.php
izin-gir.php 545 satır • 26.60 KB
<?php
// modules/izin-gir.php
session_start();
require_once '../config/db.php';
require_once '../config/functions.php';

// Yetkiler: Root, Yönetici, Muhasebe, İK
yetkiKontrol(['root', 'yonetici', 'muhasebe', 'insan_kaynaklari']);

// --- GELİŞMİŞ KIDEM VE İZİN HESAPLAMA MOTORU ---
if (!function_exists('yillikIzinHesapla')) {
    function yillikIzinHesapla($pdo, $calisan_id) {
        $stmt = $pdo->prepare("SELECT * FROM calisma_donemleri WHERE calisan_id = ? ORDER BY ise_giris ASC");
        $stmt->execute([$calisan_id]);
        $donemler = $stmt->fetchAll();
        
        // Kullanıcı bilgisini al
        $u_bilgi = $pdo->query("SELECT ise_giris_tarihi, devreden_izin, dogum_tarihi FROM kullanicilar WHERE id = $calisan_id")->fetch();

        // Eski veri fallback
        if (empty($donemler)) {
            if (!$u_bilgi) return ['toplam_hak'=>0, 'kullanilan'=>0, 'kalan'=>0, 'calisma_yili'=>0, 'ise_giris'=>date('Y-m-d')];
            $donemler = [['ise_giris' => $u_bilgi['ise_giris_tarihi'], 'isten_cikis' => null]];
        }

        $toplam_gun = 0;
        foreach ($donemler as $d) {
            $giris = new DateTime($d['ise_giris']);
            $cikis = $d['isten_cikis'] ? new DateTime($d['isten_cikis']) : new DateTime(); 
            if ($cikis >= $giris) {
                $fark = $giris->diff($cikis);
                $toplam_gun += $fark->days;
            }
        }

        $calisma_yili = floor($toplam_gun / 365);
        $toplam_hak = floatval($u_bilgi['devreden_izin'] ?? 0);
        
        // Yaş Hesabı
        $yas = 0;
        if (!empty($u_bilgi['dogum_tarihi'])) {
            $dt_dogum = new DateTime($u_bilgi['dogum_tarihi']);
            $dt_bugun = new DateTime();
            $yas = $dt_bugun->diff($dt_dogum)->y;
        }
        
        for ($i = 1; $i <= $calisma_yili; $i++) {
            $hak = 14;
            if ($i > 5 && $i < 15) $hak = 20; elseif ($i >= 15) $hak = 26;
            
            // 50 yaş üstü ve 18 yaş altı kontrolü (Min 20 Gün)
            if (($yas <= 18 || $yas >= 50) && $hak < 20) {
                $hak = 20;
            }
            
            $toplam_hak += $hak;
        }

        $stmt_used = $pdo->prepare("SELECT SUM(toplam_gun) FROM izin_talepleri WHERE calisan_id = ? AND izin_turu = 'yillik' AND durum != 'reddedildi'");
        $stmt_used->execute([$calisan_id]);
        $kullanilan = floatval($stmt_used->fetchColumn());

        return [
            'toplam_hak' => $toplam_hak,
            'kullanilan' => $kullanilan,
            'kalan' => $toplam_hak - $kullanilan,
            'calisma_yili' => $calisma_yili,
            'ise_giris' => $u_bilgi['ise_giris_tarihi']
        ];
    }
}

// --- ÇAKIŞMA KONTROL FONKSİYONU ---
function cakismaVarMi($pdo, $calisan_id, $bas, $bit) {
    // Reddedilenler hariç, tarih aralığı çakışan kayıt var mı?
    // Mantık: (TalepBas < MevcutBit) AND (TalepBit > MevcutBas)
    $sql = "SELECT count(*) FROM izin_talepleri 
            WHERE calisan_id = ? 
            AND durum != 'reddedildi' 
            AND (baslangic_tarihi < ? AND bitis_tarihi > ?)";
    $stmt = $pdo->prepare($sql);
    $stmt->execute([$calisan_id, $bit, $bas]);
    return $stmt->fetchColumn() > 0;
}

// --- AJAX İŞLEMİ ---
if (isset($_GET['action']) && $_GET['action'] == 'get_bakiye') {
    $pid = (int)$_GET['personel_id'];
    $b = yillikIzinHesapla($pdo, $pid);
    header('Content-Type: application/json');
    echo json_encode($b);
    exit;
}

include '../includes/header.php';
include '../includes/menu.php';

$mesaj = '';
$kullanici_id = $_SESSION['kullanici_id'];
$tum_calisanlar = $pdo->query("SELECT id, ad, soyad, rol, cinsiyet FROM kullanicilar WHERE durum=1 AND rol != 'root' ORDER BY ad ASC")->fetchAll();

// --- GÜNCELLENMİŞ İZİN AYARLARI ---
$izin_ayarlari = [
    'yillik' => ['label' => 'Yıllık İzin', 'gun' => 0, 'ucret' => 'Ücretli', 'kural' => 'yillik'],
    'babalik' => ['label' => 'Babalık İzni', 'gun' => 5, 'ucret' => 'Ücretli', 'kural' => 'takvim'],
    'olum' => ['label' => 'Ölüm İzni', 'gun' => 3, 'ucret' => 'Ücretli', 'kural' => 'takvim'],
    'evlilik' => ['label' => 'Evlilik İzni', 'gun' => 3, 'ucret' => 'Ücretli', 'kural' => 'takvim'],
    'diger' => ['label' => 'Diğer İzin', 'gun' => 0, 'ucret' => 'Ücretli', 'kural' => 'takvim'], 
    'sut_izni' => ['label' => 'Süt İzni', 'type' => 'saat', 'ucret' => 'Ücretli', 'kural' => 'saat'],
    'hastalik' => ['label' => 'Hastalık / Rapor', 'gun' => 0, 'ucret' => 'Ücretsiz (SGK)', 'kural' => 'takvim'],
    'saatlik' => ['label' => 'Saatlik İzin', 'type' => 'saat', 'ucret' => 'Ücretsiz', 'kural' => 'saat'],
    'ucretsiz' => ['label' => 'Ücretsiz İzin', 'gun' => 0, 'ucret' => 'Ücretsiz', 'kural' => 'takvim'],
    'mesaiye_gelmedi' => ['label' => 'Devamsızlık', 'gun' => 0, 'ucret' => 'Ücretsiz', 'kural' => 'takvim']
];

$resmi_tatiller = $pdo->query("SELECT tarih FROM resmi_tatiller")->fetchAll(PDO::FETCH_COLUMN);
$tatiller_json = json_encode($resmi_tatiller);
$izin_ayarlari_json = json_encode($izin_ayarlari);

$zaman_secenekleri = ""; 
for($s=0;$s<24;$s++) foreach(['00','30'] as $d) $zaman_secenekleri .= "<option>".sprintf('%02d:%s',$s,$d)."</option>";

// POST İŞLEMİ
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    csrfKontrol($_POST['csrf_token']);
    $calisan_id = (int)$_POST['calisan_id'];
    $izin_turu = $_POST['izin_turu'];
    $aciklama = guvenlik($_POST['aciklama']);
    $hata = false;

    // Süt İzni Cinsiyet Kontrolü
    if ($izin_turu == 'sut_izni') {
        $cinsiyet = $pdo->query("SELECT cinsiyet FROM kullanicilar WHERE id = $calisan_id")->fetchColumn();
        if ($cinsiyet !== 'Kadın') { 
            $mesaj = '<div class="alert alert-danger">Hata: Süt izni sadece kadın personel içindir.</div>'; 
            $hata = true; 
        }
    }

    // Yıllık İzin Kontrolü
    if (!$hata && $izin_turu == 'yillik') {
        $bakiye = yillikIzinHesapla($pdo, $calisan_id);
        $talep_gun = (float)$_POST['gun_sayisi'];
        
        $baslangic = $_POST['baslangic_gunluk'];
        $ise_giris_obj = new DateTime($bakiye['ise_giris']);
        $izin_bas_obj = new DateTime($baslangic);
        $birinci_yil_dolus = clone $ise_giris_obj;
        $birinci_yil_dolus->modify('+1 year');

        if ($izin_bas_obj < $birinci_yil_dolus) {
            $mesaj = '<div class="alert alert-danger fw-bold"><i class="fas fa-ban"></i> HATA: Personel 1 yıllık kıdem süresini ('.$birinci_yil_dolus->format('d.m.Y').') doldurmadan yıllık izin kullanamaz.</div>';
            $hata = true;
        } elseif ($talep_gun > $bakiye['kalan']) {
            $mesaj = '<div class="alert alert-danger fw-bold"><i class="fas fa-exclamation-triangle"></i> Yetersiz Bakiye! (Kalan: '.$bakiye['kalan'].')</div>';
            $hata = true;
        }
    }

    if (!$hata) {
        $ayar = $izin_ayarlari[$izin_turu];
        
        // --- SAATLİK ve SÜT İZNİ ---
        if (isset($ayar['type']) && $ayar['type'] == 'saat') {
            if ($izin_turu == 'sut_izni') {
                $bas_t = $_POST['sut_bas_tarih']; $bit_t = $_POST['sut_bit_tarih'];
                $sut_bas = $_POST['sut_bas_saat']; $sut_bit = $_POST['sut_bit_saat'];
                $t1 = strtotime($sut_bas); $t2 = strtotime($sut_bit);
                $fark = round(($t2 - $t1) / 3600, 2);
                
                if($fark > 1.5) {
                    $mesaj = '<div class="alert alert-danger fw-bold"><i class="fas fa-ban"></i> HATA: Süt izni günlük 1.5 saati geçemez!</div>';
                } else {
                    $current = new DateTime($bas_t); $end = new DateTime($bit_t);
                    $stmt = $pdo->prepare("INSERT INTO izin_talepleri (calisan_id, hedef_yonetici_id, onaylayan_id, izin_turu, baslangic_tarihi, bitis_tarihi, toplam_gun, saatlik_sure, aciklama, durum, onaylanma_tarihi) VALUES (?, ?, ?, 'sut_izni', ?, ?, 0, ?, ?, 'onaylandi', NOW())");
                    
                    // Transaction Başlat
                    $pdo->beginTransaction();
                    try {
                        while ($current <= $end) {
                            $ymd = $current->format('Y-m-d'); $gun_no = $current->format('N');
                            if ($gun_no < 6 && !in_array($ymd, $resmi_tatiller)) {
                                $db_bas = "$ymd $sut_bas:00"; 
                                $db_bit = "$ymd $sut_bit:00";
                                
                                // Çakışma Kontrolü
                                if (cakismaVarMi($pdo, $calisan_id, $db_bas, $db_bit)) {
                                    throw new Exception("Seçilen tarihlerin bazılarında ($ymd) zaten kayıtlı bir izin mevcut.");
                                }

                                $stmt->execute([$calisan_id, $kullanici_id, $kullanici_id, $db_bas, $db_bit, $fark, $aciklama]);
                            }
                            $current->modify('+1 day');
                        }
                        $pdo->commit();
                        $mesaj = '<div class="alert alert-success">Süt izni kaydedildi.</div>';
                    } catch (Exception $e) {
                        $pdo->rollBack();
                        $mesaj = '<div class="alert alert-danger"><i class="fas fa-exclamation-circle"></i> '.$e->getMessage().'</div>';
                    }
                }

            } else {
                // Saatlik İzin
                $tarih = $_POST['saatlik_tarih'];
                $bas = $_POST['saatlik_bas']; $bit = $_POST['saatlik_bit'];
                $t1 = strtotime("$tarih $bas:00"); $t2 = strtotime("$tarih $bit:00");
                $mola_bas = strtotime("$tarih 12:00:00"); $mola_bit = strtotime("$tarih 13:00:00");
                $overlap = max(0, min($t2, $mola_bit) - max($t1, $mola_bas));
                $diff = (($t2 - $t1) - $overlap) / 3600; 
                
                $db_bas = "$tarih $bas:00"; 
                $db_bit = "$tarih $bit:00";
                
                if ($diff <= 0) { 
                    $mesaj = '<div class="alert alert-danger">Hata: Geçersiz süre.</div>'; 
                } elseif (cakismaVarMi($pdo, $calisan_id, $db_bas, $db_bit)) {
                    $mesaj = '<div class="alert alert-danger"><i class="fas fa-exclamation-circle"></i> HATA: Bu tarih ve saat aralığında personelin zaten bir izni var.</div>';
                } else {
                    $pdo->prepare("INSERT INTO izin_talepleri (calisan_id, hedef_yonetici_id, onaylayan_id, izin_turu, baslangic_tarihi, bitis_tarihi, toplam_gun, saatlik_sure, aciklama, durum, onaylanma_tarihi) VALUES (?, ?, ?, ?, ?, ?, 0, ?, ?, 'onaylandi', NOW())")
                        ->execute([$calisan_id, $kullanici_id, $kullanici_id, $izin_turu, $db_bas, $db_bit, $diff, $aciklama]);
                    $mesaj = "<div class='alert alert-success'>Saatlik izin kaydedildi. ($diff Saat)</div>";
                }
            }
        } 
        // --- GÜNLÜK İZİN ---
        else {
            $bas = $_POST['baslangic_gunluk'];
            $gun = (float)$_POST['gun_sayisi'];
            $kural = $ayar['kural'];

            $current = new DateTime($bas);
            $sayilan = 0;
            
            while ($sayilan < $gun) {
                $ymd = $current->format('Y-m-d');
                $day = $current->format('N'); // 1:Pzt ... 7:Paz
                
                $gecerli = true;
                if ($kural == 'yillik') { 
                    // Yıllık: Cumartesi DAHİL, Pazar ve Tatil HARİÇ
                    if ($day == 7 || in_array($ymd, $resmi_tatiller)) $gecerli = false;
                }
                
                if ($gecerli) $sayilan++;
                if ($sayilan >= $gun) break;
                
                $current->modify('+1 day');
            }
            
            $db_bas = $bas . ' 08:00:00';
            $db_bit = $current->format('Y-m-d') . ' 18:00:00';
            
            if (cakismaVarMi($pdo, $calisan_id, $db_bas, $db_bit)) {
                $mesaj = '<div class="alert alert-danger"><i class="fas fa-exclamation-circle"></i> HATA: Seçilen tarih aralığında personelin zaten kayıtlı bir izni bulunuyor. Lütfen tarihleri kontrol edin.</div>';
            } else {
                $pdo->prepare("INSERT INTO izin_talepleri (calisan_id, hedef_yonetici_id, onaylayan_id, izin_turu, baslangic_tarihi, bitis_tarihi, toplam_gun, aciklama, durum, onaylanma_tarihi) VALUES (?, ?, ?, ?, ?, ?, ?, ?, 'onaylandi', NOW())")
                    ->execute([$calisan_id, $kullanici_id, $kullanici_id, $izin_turu, $db_bas, $db_bit, $gun, $aciklama]);
                $mesaj = '<div class="alert alert-success">İzin başarıyla kaydedildi.</div>';
            }
        }
    }
}
?>

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.css">
<style>
    .flatpickr-day.resmi-tatil { background: #ffebee !important; border-color: #ffcdd2 !important; color: #c62828 !important; font-weight: bold; }
    .flatpickr-day.pazar-gunu { background: #fff3e0 !important; border-color: #ffe0b2 !important; color: #ef6c00 !important; font-weight: bold; }
    .flatpickr-input[readonly] { background-color: #fff !important; cursor: pointer; }
</style>

<div class="container-fluid">
    <div class="row justify-content-center">
        <div class="col-md-10">
            <div class="card p-4 shadow-sm">
                <h4 class="mb-3 border-bottom pb-2 text-primary"><i class="fas fa-user-clock me-2"></i> Personel İzin Girişi</h4>
                <?php echo $mesaj; ?>
                
                <form method="POST" id="izinForm">
                    <input type="hidden" name="csrf_token" value="<?php echo csrfTokenOlustur(); ?>">

                    <div class="row mb-3">
                        <div class="col-md-6">
                            <label class="fw-bold">Personel</label>
                            <select name="calisan_id" id="calisanId" class="form-select" required onchange="personelDegisti()">
                                <option value="">Seçiniz...</option>
                                <?php foreach($tum_calisanlar as $c) echo "<option value='{$c['id']}'>{$c['ad']} {$c['soyad']}</option>"; ?>
                            </select>
                        </div>
                        <div class="col-md-6">
                            <label class="fw-bold">İzin Türü</label>
                            <select name="izin_turu" id="izinTuru" class="form-select" required onchange="turDegisti()">
                                <option value="">Seçiniz...</option>
                                <?php foreach($izin_ayarlari as $k=>$v): 
                                    $label = $v['label'];
                                    if(isset($v['gun']) && $v['gun'] > 0) $label .= ' (' . $v['gun'] . ' Gün)';
                                    $label .= ' - ' . $v['ucret'];
                                ?>
                                    <option value="<?php echo $k; ?>"><?php echo $label; ?></option>
                                <?php endforeach; ?>
                            </select>
                            <div id="izinBilgiNotu" class="small mt-1 text-primary fw-bold"></div>
                            
                            <div id="bakiyeAlani" class="alert alert-info py-2 px-3 mt-2 d-none shadow-sm">
                                <i class="fas fa-info-circle"></i> <span id="bakiyeMetin">...</span>
                            </div>
                        </div>
                    </div>

                    <div id="gunlukAlan">
                        <div class="row g-2 mb-3 bg-light p-3 rounded border">
                            <div class="col-md-3"><label class="small fw-bold">Başlangıç</label><input type="text" name="baslangic_gunluk" id="basTarih" class="form-control bg-white" required></div>
                            <div class="col-md-2"><label class="small fw-bold">Gün Sayısı</label><input type="number" name="gun_sayisi" id="gunSayisi" class="form-control" step="0.5" min="0.5" onkeyup="hesapla()" onchange="hesapla()"></div>
                            <div class="col-md-3"><label class="small fw-bold">Bitiş (Dahil)</label><input type="text" id="bitTarih" class="form-control bg-white" readonly></div>
                            <div class="col-md-4"><label class="small fw-bold text-success">İşe Başlama</label><input type="text" id="iseBaslama" class="form-control bg-white fw-bold text-success" readonly value="-"></div>
                        </div>
                        <small class="text-muted mt-2 d-block" id="hesapAciklama"></small>
                    </div>

                    <div id="ozelAlan" class="d-none">
                        <div id="saatlikInputs" class="row g-2 mb-3 bg-warning bg-opacity-10 p-3 rounded d-none">
                            <div class="col-12"><label class="small fw-bold">Tarih</label><input type="text" name="saatlik_tarih" id="saatlikTarih" class="form-control bg-white"></div>
                            <div class="col-4"><label class="small fw-bold">Başlangıç</label><select name="saatlik_bas" id="saatBas" class="form-select bg-white" onchange="saatHesapla()"><?php echo $zaman_secenekleri; ?></select></div>
                            <div class="col-4"><label class="small fw-bold">Bitiş</label><select name="saatlik_bit" id="saatBit" class="form-select bg-white" onchange="saatHesapla()"><?php echo $zaman_secenekleri; ?></select></div>
                            <div class="col-4"><label class="small fw-bold">Süre</label><input type="text" id="saatSonuc" class="form-control fw-bold bg-white" readonly value="0 Saat"></div>
                            <div class="col-12"><small class="text-danger fst-italic">* 12:00 - 13:00 arası öğle molası süreden otomatik düşülür.</small></div>
                        </div>
                        
                        <div id="sutInputs" class="row g-2 mb-3 bg-danger bg-opacity-10 p-3 rounded d-none">
                            <div class="col-6"><label class="small fw-bold">Başlangıç Tarihi</label><input type="text" name="sut_bas_tarih" id="sutBasTarih" class="form-control bg-white"></div>
                            <div class="col-6"><label class="small fw-bold">Bitiş Tarihi</label><input type="text" name="sut_bit_tarih" id="sutBitTarih" class="form-control bg-white"></div>
                            <div class="col-6"><label class="small fw-bold">Çıkış Saati</label><select name="sut_bas_saat" id="sutBas" class="form-select bg-white" onchange="sutHesapla()"><?php echo $zaman_secenekleri; ?></select></div>
                            <div class="col-6"><label class="small fw-bold">Dönüş Saati</label><select name="sut_bit_saat" id="sutBit" class="form-select bg-white" onchange="sutHesapla()"><?php echo $zaman_secenekleri; ?></select></div>
                            <div class="col-12" id="sutUyari"></div>
                        </div>
                    </div>

                    <div class="mb-3">
                        <label class="fw-bold small">Açıklama</label>
                        <textarea name="aciklama" class="form-control" rows="2"></textarea>
                    </div>

                    <button type="submit" id="submitBtn" class="btn btn-primary fw-bold w-100 py-2">KAYDET</button>
                </form>
            </div>
        </div>
    </div>
</div>

<script src="https://cdn.jsdelivr.net/npm/flatpickr"></script>
<script src="https://cdn.jsdelivr.net/npm/flatpickr/dist/l10n/tr.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"></script>

<script>
const tatiller = <?php echo $tatiller_json; ?>;
const izinAyarlari = <?php echo $izin_ayarlari_json; ?>;
let currentBakiye = 0;
let calismaYili = 0;
let iseGirisTarihi = null;

const fpConfig = {
    locale: "tr", 
    dateFormat: "Y-m-d", 
    altInput: true, 
    altFormat: "d F Y", 
    disableMobile: true,
    onDayCreate: function(dObj, dStr, fp, dayElem){
        let d = fp.formatDate(dayElem.dateObj, "Y-m-d");
        if(tatiller.includes(d)) dayElem.className += " bg-danger text-white";
        else if(dayElem.dateObj.getDay()===0) dayElem.className += " bg-warning";
    }
};

document.addEventListener('DOMContentLoaded', function() {
    flatpickr("#basTarih", { ...fpConfig, defaultDate: "today", onChange: hesapla });
    flatpickr("#saatlikTarih", { ...fpConfig, defaultDate: "today" });
    flatpickr("#sutBasTarih", { ...fpConfig, defaultDate: "today" });
    flatpickr("#sutBitTarih", { ...fpConfig });
});

function personelDegisti() {
    const pid = document.getElementById('calisanId').value;
    if(pid) {
        fetch(`izin-gir.php?action=get_bakiye&personel_id=${pid}`)
            .then(r => r.json())
            .then(d => {
                currentBakiye = parseFloat(d.kalan);
                calismaYili = parseInt(d.calisma_yili);
                iseGirisTarihi = new Date(d.ise_giris);
                
                let txt = `Kıdem: ${d.calisma_yili} Yıl | Kalan Hak: ${d.kalan} Gün`;
                if(d.calisma_yili < 1) txt += " (1 Yıl dolmadı!)";
                
                document.getElementById('bakiyeMetin').innerText = txt;
                turDegisti();
            });
    }
}

function turDegisti() {
    const tur = document.getElementById('izinTuru').value;
    const ayar = izinAyarlari[tur];
    const bakiyeDiv = document.getElementById('bakiyeAlani');
    const bilgiDiv = document.getElementById('izinBilgiNotu');
    
    document.getElementById('gunSayisi').readOnly = false;
    document.getElementById('gunSayisi').value = '';
    
    if (!ayar) return;

    let bilgiTxt = `Durum: ${ayar.ucret}`;
    if (ayar.gun > 0) {
        document.getElementById('gunSayisi').value = ayar.gun;
        document.getElementById('gunSayisi').readOnly = true;
        bilgiTxt += ` | Süre: ${ayar.gun} Gün (Otomatik)`;
    }
    bilgiDiv.innerText = bilgiTxt;

    if (tur === 'yillik') {
        bakiyeDiv.classList.remove('d-none');
        if (calismaYili < 1) bakiyeDiv.className = "alert alert-danger py-2 px-3 mt-2 shadow-sm";
        else bakiyeDiv.className = "alert alert-info py-2 px-3 mt-2 shadow-sm";
    } else {
        bakiyeDiv.classList.add('d-none');
    }

    const gunluk = document.getElementById('gunlukAlan');
    const ozel = document.getElementById('ozelAlan');
    document.getElementById('saatlikInputs').classList.add('d-none');
    document.getElementById('sutInputs').classList.add('d-none');
    gunluk.classList.add('d-none');
    ozel.classList.add('d-none');
    document.getElementById('sutUyari').innerHTML = '';

    if (ayar.type === 'saat') {
        ozel.classList.remove('d-none');
        if (tur === 'saatlik') document.getElementById('saatlikInputs').classList.remove('d-none');
        if (tur === 'sut_izni') document.getElementById('sutInputs').classList.remove('d-none');
    } else {
        gunluk.classList.remove('d-none');
        hesapla();
    }
}

function saatHesapla() {
    let bas = document.getElementById('saatBas').value;
    let bit = document.getElementById('saatBit').value;
    if (!bas || !bit) return;

    let t1 = parseInt(bas.split(':')[0]) * 60 + parseInt(bas.split(':')[1]);
    let t2 = parseInt(bit.split(':')[0]) * 60 + parseInt(bit.split(':')[1]);
    if (t2 <= t1) { document.getElementById('saatSonuc').value = "Hata!"; return; }

    let diffMin = t2 - t1;
    let molaBas = 720; let molaBit = 780; 
    let overlap = Math.max(0, Math.min(t2, molaBit) - Math.max(t1, molaBas));

    diffMin -= overlap;
    document.getElementById('saatSonuc').value = (diffMin / 60).toFixed(2) + " Saat";
}

// Süt İzni 1.5 Saat Kontrolü
function sutHesapla() {
    let bas = document.getElementById('sutBas').value;
    let bit = document.getElementById('sutBit').value;
    const btn = document.getElementById('submitBtn');
    const uyari = document.getElementById('sutUyari');
    
    uyari.innerHTML = '';
    btn.disabled = false;

    if (!bas || !bit) return;
    
    let t1 = parseInt(bas.split(':')[0])*60 + parseInt(bas.split(':')[1]);
    let t2 = parseInt(bit.split(':')[0])*60 + parseInt(bit.split(':')[1]);
    
    if (t2 <= t1) { 
        uyari.innerHTML = '<span class="text-danger fw-bold small">Hata: Bitiş saati başlangıçtan büyük olmalıdır.</span>';
        btn.disabled = true;
        return; 
    }
    
    let diff = (t2 - t1) / 60; // Saat cinsinden fark
    
    if (diff > 1.5) {
        uyari.innerHTML = `<span class="text-danger fw-bold small"><i class="fas fa-exclamation-triangle"></i> Uyarı: Seçilen süre ${diff.toFixed(2)} saat. Süt izni günlük 1.5 saati geçemez!</span>`;
        btn.disabled = true;
    } else {
        uyari.innerHTML = `<span class="text-success fw-bold small"><i class="fas fa-check-circle"></i> Süre uygun: ${diff.toFixed(2)} Saat</span>`;
        btn.disabled = false;
    }
}

function hesapla() {
    const basStr = document.getElementById('basTarih').value; 
    const gunInput = document.getElementById('gunSayisi');
    let gun = parseFloat(gunInput.value);
    const tur = document.getElementById('izinTuru').value;
    const ayar = izinAyarlari[tur];
    const btn = document.getElementById('submitBtn');
    
    if (!tur || !ayar) return;
    
    if (tur === 'yillik') {
        if (gun > currentBakiye) gunInput.classList.add('is-invalid'); 
        else { gunInput.classList.remove('is-invalid'); btn.disabled = false; }
    }

    if(!basStr || gun <= 0) return;
    
    let parts = basStr.split('-');
    let current = new Date(parts[0], parts[1]-1, parts[2]); 
    let sayilan = 0;

    while (sayilan < gun) {
        let z = new Date(current.getTime() - (current.getTimezoneOffset() * 60000)).toISOString().split('T')[0];
        let day = current.getDay();
        let gecerli = true;

        if (ayar.kural === 'yillik') {
            if (day === 0 || tatiller.includes(z)) gecerli = false;
        } 
        if (gecerli) sayilan++;
        if (sayilan >= gun) break;
        current.setDate(current.getDate() + 1);
    }
    
    document.getElementById('bitTarih').value = current.toLocaleDateString('tr-TR', { day: 'numeric', month: 'long', year: 'numeric' });

    let isBasi = new Date(current);
    isBasi.setDate(isBasi.getDate() + 1);
    while (true) {
        let z = new Date(isBasi.getTime() - (isBasi.getTimezoneOffset() * 60000)).toISOString().split('T')[0];
        let day = isBasi.getDay();
        if (day === 0 || tatiller.includes(z)) isBasi.setDate(isBasi.getDate() + 1);
        else break; 
    }
    document.getElementById('iseBaslama').value = isBasi.toLocaleDateString('tr-TR', {weekday:'long', year:'numeric', month:'long', day:'numeric'});
    
    let kuralAciklama = (ayar.kural === 'yillik') ? "Kural: Pazar ve Tatiller süreden düşülmez (süreyi uzatır)." : "Kural: Takvim günü bazlıdır.";
    document.getElementById('hesapAciklama').innerHTML = kuralAciklama;
}
</script>
<?php include '../includes/footer.php'; ?>