sys/veri_detay/#008

PYBS (Personel Yönetim Bilgi Sistemi)

Son Senkronizasyon: 16.12.2025
tum-izinler.php 535 satır • 27.12 KB
<?php
// modules/tum-izinler.php
session_start();
require_once '../config/db.php';
require_once '../config/functions.php';

// Yetki Kontrolü
yetkiKontrol(['root', 'yonetici', 'mudur', 'vardiya_amiri', 'muhasebe', 'insan_kaynaklari']);

// Türkçe Tarih Formatı Fonksiyonu
function tarihFormatTr($tarih) {
    $aylar = [
        '01' => 'Ocak', '02' => 'Şubat', '03' => 'Mart', '04' => 'Nisan', 
        '05' => 'Mayıs', '06' => 'Haziran', '07' => 'Temmuz', '08' => 'Ağustos', 
        '09' => 'Eylül', '10' => 'Ekim', '11' => 'Kasım', '12' => 'Aralık'
    ];
    $d = date('d', strtotime($tarih));
    $m = date('m', strtotime($tarih));
    $y = date('Y', strtotime($tarih));
    return $d . ' ' . $aylar[$m] . ' ' . $y;
}

// İzin Türleri Konfigürasyonu
$izin_turleri_config = [
    'yillik' => 1, 'hastalik' => 0, 'evlilik' => 0, 'babalik' => 0, 
    'olum' => 0, 'saatlik' => 0, 'sut_izni' => 0, 'diger' => 0, 'mesaiye_gelmedi' => 0
];

// Resmi Tatiller
$tatiller = $pdo->query("SELECT tarih FROM resmi_tatiller")->fetchAll(PDO::FETCH_COLUMN);
$tatiller_json = json_encode($tatiller);

// Personel Listesi (Filtre için)
$personel_listesi = $pdo->query("SELECT id, ad, soyad FROM kullanicilar ORDER BY ad ASC")->fetchAll();

// Saat Seçenekleri
$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>";
    }
}

// --- AJAX: Kayıt Getir (Düzenleme İçin) ---
if (isset($_GET['ajax']) && $_GET['ajax'] == 'kayit_getir' && isset($_GET['id'])) {
    $id = (int)$_GET['id'];
    $stmt = $pdo->prepare("SELECT * FROM izin_talepleri WHERE id = ?");
    $stmt->execute([$id]);
    $veri = $stmt->fetch(PDO::FETCH_ASSOC);
    
    // Frontend için ayrıştırılmış veriler
    $veri['bas_tarih_raw'] = date('Y-m-d', strtotime($veri['baslangic_tarihi']));
    $veri['bas_saat_raw'] = date('H:i', strtotime($veri['baslangic_tarihi'])); 
    $veri['bit_tarih_raw'] = date('Y-m-d', strtotime($veri['bitis_tarihi']));
    $veri['bit_saat_raw'] = date('H:i', strtotime($veri['bitis_tarihi']));
    
    echo json_encode($veri);
    exit;
}

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

$mesaj = '';
$kullanici_id = $_SESSION['kullanici_id'];
$rol = $_SESSION['rol'];
$yuksek_yetki = in_array($rol, ['root', 'muhasebe', 'insan_kaynaklari']);

// --- FİLTRELEME PARAMETRELERİ ---
$filtre_durum = $_GET['filtre'] ?? 'aktif'; // Varsayılan: Aktif Dönem
$filtre_personel = $_GET['personel_id'] ?? ''; // Personel ID
$secilen_ay = $_GET['ay'] ?? date('m');
$secilen_yil = $_GET['yil'] ?? date('Y');

// --- POST: GÜNCELLEME İŞLEMİ ---
if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['islem_turu']) && $_POST['islem_turu'] == 'guncelle') {
    csrfKontrol($_POST['csrf_token']);
    if (!$yuksek_yetki) die("Yetkisiz işlem.");

    $kayit_id = (int)$_POST['kayit_id'];
    $izin_turu = $_POST['izin_turu'];
    $aciklama = guvenlik($_POST['aciklama']);
    
    // Değerleri Hazırla
    if ($izin_turu == 'saatlik' || $izin_turu == 'sut_izni' || $izin_turu == 'mesaiye_gelmedi') {
        $tarih_gun = $_POST['saatlik_tarih'];
        $bas_saat = $_POST['baslangic_saat_saatlik'];
        $bit_saat = $_POST['bitis_saat_saatlik'];
        
        $db_bas = $tarih_gun . ' ' . $bas_saat . ':00';
        $db_bit = $tarih_gun . ' ' . $bit_saat . ':00';
        
        $t1 = strtotime($bas_saat);
        $t2 = strtotime($bit_saat);
        $saatlik_sure = round(($t2 - $t1) / 3600, 2);
        if ($saatlik_sure < 0) $saatlik_sure = 0;
        
        $toplam_gun = 0; 
    } else {
        $baslangic = $_POST['gunluk_baslangic'];
        $baslangic_saat = $_POST['gunluk_baslangic_saat'];
        $gun_sayisi = (float)$_POST['toplam_gun'];
        
        $is_gunu_bazli = $izin_turleri_config[$izin_turu] ?? 0;
        $current = new DateTime($baslangic);
        $sayilan = 0;
        
        while ($sayilan < $gun_sayisi) {
            $ymd = $current->format('Y-m-d');
            $day = $current->format('N');
            $sayilsin_mi = true;
            if ($is_gunu_bazli == 1) {
                if ($day == 7 || in_array($ymd, $tatiller)) $sayilsin_mi = false;
            }
            if ($sayilsin_mi) $sayilan++;
            if ($sayilan >= $gun_sayisi) break;
            $current->modify('+1 day');
        }
        
        $db_bitis_gun = $current->format('Y-m-d');
        $db_bas = $baslangic . ' ' . $baslangic_saat . ':00';
        $db_bit = $db_bitis_gun . ' 18:00:00'; 
        
        $saatlik_sure = 0;
        $toplam_gun = $gun_sayisi;
    }

    $sql = "UPDATE izin_talepleri SET izin_turu=?, baslangic_tarihi=?, bitis_tarihi=?, toplam_gun=?, saatlik_sure=?, aciklama=? WHERE id=?";
    $stmt = $pdo->prepare($sql);
    if ($stmt->execute([$izin_turu, $db_bas, $db_bit, $toplam_gun, $saatlik_sure, $aciklama, $kayit_id])) {
        logKaydet($pdo, $kullanici_id, 'guncelleme', "İzin güncellendi (ID: $kayit_id)", 'izin_talepleri', $kayit_id);
        $mesaj = '<div class="alert alert-success">Kayıt başarıyla güncellendi.</div>';
    } else {
        $mesaj = '<div class="alert alert-danger">Güncelleme hatası.</div>';
    }
}

// --- GET: İŞLEMLER (ONAY, RED, BEKLEME) ---
if (isset($_GET['islem']) && isset($_GET['id'])) {
    $id = (int)$_GET['id'];
    $aksiyon = $_GET['islem'];
    
    $sql_k = "SELECT * FROM izin_talepleri WHERE id = ?";
    $params_k = [$id];
    if(!$yuksek_yetki) {
        $sql_k .= " AND hedef_yonetici_id = ?";
        $params_k[] = $kullanici_id;
    }
    
    $stmt = $pdo->prepare($sql_k);
    $stmt->execute($params_k);
    $kayit = $stmt->fetch(PDO::FETCH_ASSOC);

    if ($kayit) {
        $yeni_durum = ($aksiyon == 'onayla') ? 'onaylandi' : 'reddedildi';
        if ($aksiyon == 'beklemede') $yeni_durum = 'beklemede';
        
        if ($kayit['durum'] != 'beklemede' && !$yuksek_yetki) {
            $mesaj = "<div class='alert alert-warning'>Sadece beklemedeki kayıtları yönetebilirsiniz.</div>";
        } else {
            $upd = $pdo->prepare("UPDATE izin_talepleri SET durum = ?, onaylayan_id = ?, onaylanma_tarihi = NOW() WHERE id = ?");
            if ($upd->execute([$yeni_durum, $kullanici_id, $id])) {
                logKaydet($pdo, $kullanici_id, 'guncelleme', "İzin durumu: $yeni_durum", 'izin_talepleri', $id);
                try { bildirimGonder($pdo, $kayit['calisan_id'], "İzin İşlemi", "İzin talebiniz: $yeni_durum", "izin-talep.php"); } catch(Exception $e) { }
                $mesaj = "<div class='alert alert-success'>Durum güncellendi: <strong>".strtoupper($yeni_durum)."</strong></div>";
            }
        }
    } else {
        $mesaj = "<div class='alert alert-danger'>Kayıt bulunamadı.</div>";
    }
}

// --- LİSTELEME SORGUSU ---
$sql = "SELECT i.*, k.ad, k.soyad, k.rol as k_rol, 
        o.ad as o_ad, o.soyad as o_soyad, 
        y.ad as y_ad, y.soyad as y_soyad,
        (SELECT COUNT(*) FROM sistem_loglari WHERE tablo_adi='izin_talepleri' AND kayit_id=i.id AND islem_tipi='guncelleme') as degisiklik
        FROM izin_talepleri i 
        JOIN kullanicilar k ON i.calisan_id = k.id 
        LEFT JOIN kullanicilar o ON i.onaylayan_id = o.id 
        LEFT JOIN kullanicilar y ON i.hedef_yonetici_id = y.id
        WHERE 1=1 ";

// 1. Yetki Filtresi
if (!$yuksek_yetki) {
    $sql .= " AND i.hedef_yonetici_id = $kullanici_id ";
}

// 2. Personel Filtresi (YENİ)
if (!empty($filtre_personel)) {
    $sql .= " AND i.calisan_id = " . intval($filtre_personel);
}

// 3. Tarih Filtresi
if ($filtre_durum == 'aktif') {
    $sql .= " AND YEAR(i.baslangic_tarihi) = YEAR(CURDATE()) AND MONTH(i.baslangic_tarihi) = MONTH(CURDATE())";
} elseif ($filtre_durum == 'tarih') {
    $sql .= " AND YEAR(i.baslangic_tarihi) = $secilen_yil AND MONTH(i.baslangic_tarihi) = $secilen_ay";
}

$sql .= " ORDER BY i.baslangic_tarihi DESC";
$stmt = $pdo->prepare($sql);
$stmt->execute();
$izinler = $stmt->fetchAll();
?>

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css">

<style>
    .flatpickr-day.resmi-tatil { background: #ffebee !important; border-color: #ffcdd2; color: #c62828; font-weight: bold; }
    .flatpickr-day.pazar-gunu { background: #fff3e0 !important; border-color: #ffe0b2; color: #ef6c00; font-weight: bold; }
    .table-responsive { overflow-x: visible !important; } 
    .saat-kutu { display: none; background: #f8f9fa; padding: 15px; border-radius: 5px; border: 1px solid #dee2e6; }
    .gun-kutu { display: block; background: #fff; padding: 15px; border-radius: 5px; border: 1px solid #dee2e6; }
</style>

<div class="container-fluid">
    <div class="d-flex justify-content-between align-items-center mb-3">
        <h3><i class="fas fa-calendar-check text-primary"></i> İzin Yönetimi</h3>
        <div class="btn-group">
            <button type="button" onclick="exportRapor('excel')" class="btn btn-success"><i class="fas fa-file-excel"></i> Excel</button>
            <button type="button" onclick="exportRapor('pdf')" class="btn btn-danger"><i class="fas fa-file-pdf"></i> PDF Yazdır</button>
        </div>
    </div>
    
    <?php echo $mesaj; ?>

    <div class="card bg-light border mb-4">
        <div class="card-body p-3">
            <form method="GET" class="row g-2 align-items-end">
                <div class="col-md-3">
                    <label class="small fw-bold">Personel</label>
                    <select name="personel_id" class="form-select form-select-sm">
                        <option value="">Tümü</option>
                        <?php foreach($personel_listesi as $p): ?>
                            <option value="<?php echo $p['id']; ?>" <?php echo ($filtre_personel == $p['id']) ? 'selected' : ''; ?>>
                                <?php echo htmlspecialchars($p['ad'] . ' ' . $p['soyad']); ?>
                            </option>
                        <?php endforeach; ?>
                    </select>
                </div>

                <div class="col-md-3">
                    <label class="small fw-bold">Dönem Tipi</label>
                    <select name="filtre" id="filtreSecim" class="form-select form-select-sm" onchange="filtreDegisti()">
                        <option value="aktif" <?php echo $filtre_durum=='aktif'?'selected':''; ?>>Bu Ay (Aktif)</option>
                        <option value="tarih" <?php echo $filtre_durum=='tarih'?'selected':''; ?>>Belirli Ay Seç</option>
                        <option value="tum" <?php echo $filtre_durum=='tum'?'selected':''; ?>>Tüm Geçmiş</option>
                    </select>
                </div>

                <div class="col-md-4 tarih-secimi" style="<?php echo $filtre_durum=='tarih'?'':'display:none;'; ?>">
                    <label class="small fw-bold">Ay / Yıl Seçiniz</label>
                    <div class="input-group input-group-sm">
                        <select name="ay" class="form-select">
                            <?php 
                            $aylar_tr = ['01'=>'Ocak','02'=>'Şubat','03'=>'Mart','04'=>'Nisan','05'=>'Mayıs','06'=>'Haziran','07'=>'Temmuz','08'=>'Ağustos','09'=>'Eylül','10'=>'Ekim','11'=>'Kasım','12'=>'Aralık'];
                            foreach($aylar_tr as $k => $v) echo "<option value='$k' ".($k==$secilen_ay?'selected':'').">$v</option>"; 
                            ?>
                        </select>
                        <select name="yil" class="form-select">
                            <?php for($y=2024; $y<=date('Y')+1; $y++) echo "<option value='$y' ".($y==$secilen_yil?'selected':'').">$y</option>"; ?>
                        </select>
                    </div>
                </div>

                <div class="col-md-2">
                    <button type="submit" class="btn btn-primary btn-sm w-100"><i class="fas fa-filter"></i> Uygula</button>
                </div>
            </form>
        </div>
    </div>
    
    <div class="card border-0 shadow-sm">
        <div class="table-responsive">
            <table class="table table-hover align-middle mb-0">
                <thead class="table-dark">
                    <tr>
                        <th>Personel</th>
                        <th>Tür</th>
                        <th>Tarih / Süre</th>
                        <th width="20%">Açıklama</th> 
                        <th>Durum / İşlem Yapan</th>
                        <th class="text-end" style="min-width: 150px;">İşlemler</th>
                    </tr>
                </thead>
                <tbody>
                    <?php if(empty($izinler)): ?>
                        <tr><td colspan="6" class="text-center py-4 text-muted">Kayıt bulunamadı.</td></tr>
                    <?php endif; ?>
                    <?php foreach($izinler as $row): 
                        // İşlem Yapan Bilgisi
                        $islem_yapan = "";
                        if ($row['durum'] == 'beklemede') {
                            $islem_yapan = '<span class="text-muted small"><i class="fas fa-hourglass-half"></i> Bekleniyor: </span>' . $row['y_ad'] . ' ' . $row['y_soyad'];
                        } else {
                            $islem_yapan = '<span class="text-success small"><i class="fas fa-user-check"></i> </span>' . $row['o_ad'] . ' ' . $row['o_soyad'];
                        }
                    ?>
                    <tr class="<?php echo ($row['degisiklik']>0)?'table-warning bg-opacity-10':''; ?>">
                        <td>
                            <strong><?php echo htmlspecialchars($row['ad'].' '.$row['soyad']); ?></strong><br>
                            <span class="badge bg-light text-dark border"><?php echo htmlspecialchars($row['k_rol']); ?></span>
                        </td>
                        <td>
                            <?php echo strtoupper(str_replace('_',' ',$row['izin_turu'])); ?>
                        </td>
                        <td>
                            <?php echo tarihFormatTr($row['baslangic_tarihi']); ?><br>
                            <small class="fw-bold text-muted">
                                <?php echo ($row['izin_turu']=='saatlik'||$row['izin_turu']=='sut_izni'||$row['izin_turu']=='mesaiye_gelmedi') ? $row['saatlik_sure'].' Saat' : floatval($row['toplam_gun']).' Gün'; ?>
                            </small>
                        </td>
                        
                        <td>
                            <div style="max-width: 250px; overflow-wrap: break-word; font-size: 0.9em;">
                                <?php echo !empty($row['aciklama']) ? htmlspecialchars($row['aciklama']) : '<em class="text-muted">-</em>'; ?>
                            </div>
                        </td>

                        <td>
                            <?php if($row['durum']=='onaylandi'): ?>
                                <span class="badge bg-success mb-1">Onaylı</span>
                            <?php elseif($row['durum']=='reddedildi'): ?>
                                <span class="badge bg-danger mb-1">Red</span>
                            <?php else: ?>
                                <span class="badge bg-warning text-dark mb-1">Bekliyor</span>
                            <?php endif; ?>
                            <div class="small"><?php echo $islem_yapan; ?></div>
                        </td>
                        <td class="text-end">
                            <div class="btn-group position-static">
                                <a href="izin-yazdir.php?id=<?php echo $row['id']; ?>" target="_blank" class="btn btn-sm btn-info text-white" title="Yazdır"><i class="fas fa-print"></i></a>
                                <?php if($yuksek_yetki): ?>
                                    <button class="btn btn-sm btn-outline-primary" onclick="duzenle(<?php echo $row['id']; ?>)" title="Düzenle"><i class="fas fa-edit"></i></button>
                                <?php endif; ?>
                                <?php if($row['durum']=='beklemede'): ?>
                                    <a href="?islem=onayla&id=<?php echo $row['id']; ?>" class="btn btn-sm btn-success" title="Onayla"><i class="fas fa-check"></i></a>
                                    <a href="?islem=reddet&id=<?php echo $row['id']; ?>" class="btn btn-sm btn-danger" title="Reddet"><i class="fas fa-times"></i></a>
                                <?php elseif($yuksek_yetki): ?>
                                    <button type="button" class="btn btn-sm btn-secondary dropdown-toggle" data-bs-toggle="dropdown"><i class="fas fa-cog"></i></button>
                                    <ul class="dropdown-menu dropdown-menu-end">
                                        <li><a class="dropdown-item text-danger" href="?islem=reddet&id=<?php echo $row['id']; ?>">İptal Et / Reddet</a></li>
                                        <li><a class="dropdown-item" href="?islem=beklemede&id=<?php echo $row['id']; ?>">Beklemeye Al</a></li>
                                    </ul>
                                <?php endif; ?>
                            </div>
                        </td>
                    </tr>
                    <?php endforeach; ?>
                </tbody>
            </table>
        </div>
    </div>
</div>

<div class="modal fade" id="editModal" tabindex="-1">
    <div class="modal-dialog modal-lg">
        <form method="POST" class="modal-content">
            <div class="modal-header bg-primary text-white">
                <h5 class="modal-title">İzin Düzenle</h5>
                <button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal"></button>
            </div>
            <div class="modal-body">
                <input type="hidden" name="csrf_token" value="<?php echo csrfTokenOlustur(); ?>">
                <input type="hidden" name="islem_turu" value="guncelle">
                <input type="hidden" name="kayit_id" id="editId">
                
                <div class="mb-3">
                    <label class="fw-bold">İzin Türü</label>
                    <select name="izin_turu" id="editTur" class="form-select" onchange="formTipiDegistir()">
                        <option value="yillik" data-is-gunu="1">Yıllık İzin (Ücretli)</option>
                        <option value="hastalik" data-is-gunu="0">Hastalık / Rapor (Ücretsiz)</option>
                        <option value="evlilik" data-is-gunu="0" data-gun="3">Evlilik İzni (Ücretli - 3 Gün)</option>
                        <option value="babalik" data-is-gunu="0" data-gun="5">Babalık İzni (Ücretli - 5 Gün)</option>
                        <option value="olum" data-is-gunu="0" data-gun="3">Ölüm İzni (Ücretli - 3 Gün)</option>
                        <option value="saatlik" data-is-gunu="0">Saatlik İzin (Ücretsiz)</option>
                        <option value="mesaiye_gelmedi" data-is-gunu="0">Mesaiye Gelmedi</option>
                        <option value="sut_izni" data-is-gunu="0">Süt İzni (Ücretli)</option>
                        <option value="diger" data-is-gunu="0">Diğer İzin (Ücretli)</option>
                    </select>
                </div>

                <div id="gunlukAlan" class="gun-kutu">
                    <div class="row g-3">
                        <div class="col-md-3">
                            <label class="small fw-bold">Başlangıç Tarihi</label>
                            <input type="text" name="gunluk_baslangic" id="gunlukBas" class="form-control">
                        </div>
                        <div class="col-md-3">
                            <label class="small fw-bold">Başlangıç Saati</label>
                            <select name="gunluk_baslangic_saat" id="gunlukBasSaat" class="form-select" onchange="tarihHesapla()">
                                <?php echo $zaman_secenekleri; ?>
                            </select>
                        </div>
                        <div class="col-md-2">
                            <label class="small fw-bold">Gün Sayısı</label>
                            <input type="number" step="0.5" name="toplam_gun" id="editGun" class="form-control" onkeyup="tarihHesapla()" onchange="tarihHesapla()">
                        </div>
                        <div class="col-md-4">
                            <label class="small fw-bold">Bitiş Tarihi</label>
                            <input type="text" name="gunluk_bitis" id="gunlukBit" class="form-control" readonly>
                        </div>
                        <div class="col-12">
                            <label class="text-success small fw-bold">İşe Başlama Tarihi</label>
                            <input type="text" id="iseBaslama" class="form-control text-success fw-bold" readonly>
                        </div>
                    </div>
                    <small id="hesapAciklama" class="text-muted d-block mt-2"></small>
                </div>

                <div id="saatlikAlan" class="saat-kutu">
                    <div class="row g-3">
                        <div class="col-md-4">
                            <label>Tarih</label>
                            <input type="text" name="saatlik_tarih" id="saatlikTarih" class="form-control">
                        </div>
                        <div class="col-md-3">
                            <label>Başlangıç</label>
                            <select name="baslangic_saat_saatlik" id="saatBas" class="form-select"><?php echo $zaman_secenekleri; ?></select>
                        </div>
                        <div class="col-md-3">
                            <label>Bitiş</label>
                            <select name="bitis_saat_saatlik" id="saatBit" class="form-select"><?php echo $zaman_secenekleri; ?></select>
                        </div>
                        <div class="col-md-2"><label>Süre</label><input type="text" name="saatlik_sure" id="editSaat" class="form-control" readonly></div>
                    </div>
                </div>

                <div class="mt-3"><label>Açıklama</label><textarea name="aciklama" id="editAciklama" class="form-control" rows="2"></textarea></div>
            </div>
            <div class="modal-footer"><button type="submit" class="btn btn-primary">Kaydet</button></div>
        </form>
    </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 fpConfig = { locale: "tr", dateFormat: "Y-m-d", altInput: true, altFormat: "d F Y", onDayCreate: function(dObj, dStr, fp, dayElem){ let date = dayElem.dateObj.toISOString().split('T')[0]; if(tatiller.includes(date)) { dayElem.className += " resmi-tatil"; } else if(dayElem.dateObj.getDay()===0) { dayElem.className += " pazar-gunu"; } } };
let fpGunlukBas = flatpickr("#gunlukBas", { ...fpConfig, onChange: tarihHesapla });
let fpGunlukBit = flatpickr("#gunlukBit", { ...fpConfig, clickOpens: false });
let fpSaatlik = flatpickr("#saatlikTarih", fpConfig);

function filtreDegisti() { document.querySelector('.tarih-secimi').style.display = (document.getElementById('filtreSecim').value === 'tarih') ? 'block' : 'none'; }

// Rapor Çıktısı İçin Yeni Fonksiyon
function exportRapor(format) {
    const pid = document.querySelector('select[name="personel_id"]').value;
    const filtre = document.getElementById('filtreSecim').value;
    const ay = document.querySelector('select[name="ay"]').value;
    const yil = document.querySelector('select[name="yil"]').value;
    
    let url = `tum-izinler-rapor.php?format=${format}&personel_id=${pid}&filtre=${filtre}&ay=${ay}&yil=${yil}`;
    window.open(url, '_blank');
}

function formTipiDegistir() {
    const sel = document.getElementById('editTur');
    const tur = sel.value;
    const opt = sel.options[sel.selectedIndex];
    if (opt.getAttribute('data-gun')) { document.getElementById('editGun').value = opt.getAttribute('data-gun'); tarihHesapla(); }
    const isSaatlik = (tur === 'saatlik' || tur === 'sut_izni' || tur === 'mesaiye_gelmedi');
    document.getElementById('gunlukAlan').style.display = isSaatlik ? 'none' : 'block';
    document.getElementById('saatlikAlan').style.display = isSaatlik ? 'block' : 'none';
    if(!isSaatlik) tarihHesapla();
}

function tarihHesapla() {
    let basTarihStr = document.getElementById('gunlukBas').value;
    let gun = parseFloat(document.getElementById('editGun').value) || 0;
    const isGunuBazli = document.getElementById('editTur').options[document.getElementById('editTur').selectedIndex].getAttribute('data-is-gunu') == '1';
    
    if (!basTarihStr || gun <= 0) return;
    let loopDate = new Date(basTarihStr);
    let sonTarih = new Date(basTarihStr);
    let sayilan = 0;

    while(sayilan < gun) {
        let ymd = loopDate.toISOString().split('T')[0];
        let day = loopDate.getDay();
        let sayilsin = true;
        if(isGunuBazli && (day === 0 || day === 6 || tatiller.includes(ymd))) sayilsin = false;
        if(sayilsin) sayilan++;
        if(sayilan >= gun) { sonTarih = new Date(loopDate); break; }
        loopDate.setDate(loopDate.getDate() + 1);
    }
    fpGunlukBit.setDate(sonTarih);
    
    let isBasi = new Date(sonTarih);
    isBasi.setDate(isBasi.getDate() + 1);
    while (true) {
        let ymd = isBasi.toISOString().split('T')[0];
        if (isBasi.getDay() === 0 || isBasi.getDay() === 6 || tatiller.includes(ymd)) isBasi.setDate(isBasi.getDate() + 1);
        else break; 
    }
    document.getElementById('iseBaslama').value = isBasi.toLocaleDateString('tr-TR', { day: 'numeric', month: 'long', year: 'numeric', weekday: 'long' });
    document.getElementById('hesapAciklama').innerText = isGunuBazli ? "Cmt, Pzr ve Tatiller süreyi uzatır." : "Tüm günler sayılır.";
}

function duzenle(id) {
    const modal = new bootstrap.Modal(document.getElementById('editModal'));
    fetch(`tum-izinler.php?ajax=kayit_getir&id=${id}`).then(r=>r.json()).then(d=>{
        document.getElementById('editId').value = d.id;
        document.getElementById('editTur').value = d.izin_turu;
        document.getElementById('editAciklama').value = d.aciklama;
        document.getElementById('editGun').value = d.toplam_gun;
        formTipiDegistir();
        if (d.izin_turu === 'saatlik' || d.izin_turu === 'sut_izni' || d.izin_turu === 'mesaiye_gelmedi') {
            fpSaatlik.setDate(d.bas_tarih_raw);
            document.getElementById('saatBas').value = d.bas_saat_raw;
            document.getElementById('saatBit').value = d.bit_saat_raw;
            document.getElementById('editSaat').value = d.saatlik_sure;
        } else {
            fpGunlukBas.setDate(d.bas_tarih_raw);
            document.getElementById('gunlukBasSaat').value = d.bas_saat_raw;
            tarihHesapla(); 
        }
        modal.show();
    });
}
[document.getElementById('saatBas'), document.getElementById('saatBit')].forEach(el => el.addEventListener('change', function() {
    let s1 = document.getElementById('saatBas').value, s2 = document.getElementById('saatBit').value;
    if(s1 && s2) {
        let diff = (new Date("2000-01-01 " + s2) - new Date("2000-01-01 " + s1)) / 36e5;
        document.getElementById('editSaat').value = (diff < 0 ? 0 : diff).toFixed(1);
    }
}));
</script>
<?php include '../includes/footer.php'; ?>
DATA_PAYLOAD (Açıklama)
Kapak

DEMO SÜRÜMÜDÜR TAM SÜRÜM İÇİN İLETİŞİM KURUN

📖 PYBS (Personel Yönetim Bilgi Sistemi) Kullanım Kılavuzu

🚀 Proje Tanımı

PYBS, personel bilgilerini, izinleri, maaş bordrolarını ve performans değerlendirmelerini merkezi ve dijital bir platformda yönetmek için tasarlanmış kapsamlı bir Personel Yönetim Bilgi Sistemi'dir. Amacımız, İnsan Kaynakları (İK) süreçlerini otomatikleştirerek verimliliği artırmak ve veri tutarlılığını sağlamaktır.

✨ Temel Özellikler

Personel Yönetimi: Çalışanların kişisel, iletişim ve görev bilgilerini kaydetme/güncelleme.

İzin Yönetimi: Çalışanların izin taleplerini oluşturma, onaylama/reddetme ve kalan izin haklarını takip etme.

Performans Değerlendirme: Yöneticilerin ve çalışanların performans hedeflerini belirlemesi ve değerlendirmeleri kaydetmesi.

Bordro Entegrasyonu: Maaş ve avans bilgilerini kaydetme ve bordro çıktılarını oluşturma (Harici sistemlerle entegrasyon potansiyeli).

Raporlama: İK yöneticileri için özet ve detaylı personel, izin ve bordro raporları oluşturma.

💻 Son Kullanıcı Kullanımı🔑 Giriş Yapma

Demo için kullanıcı adı : test.test

Demo için şifre : 123456

Demo hesabında root / yonetici vb yetki yoktur.

Tam sürüm için iletişime geçin.

Sistem "Ramsa Makine" tarafından aktif olarak kullanılmaktadır

Meta Veri (Özet)

İşyeri çalışanlarının maaş, fazla mesai ve puantaj ile bordro takip, kontrol ve raporlama sistemi

9,344
Sinyal (Ağ Hiti)
1.54 MB
Kapasite

Ağda Paylaş