PYBS (Personel Yönetim Bilgi Sistemi) / Ramsa/modules/personel-kart.php
personel-kart.php 371 satır • 19.52 KB
<?php
// modules/personel-kart.php
session_start();
require_once '../config/db.php';
require_once '../config/functions.php';

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

// --- YILLIK İZİN HESAPLAMA ---
if (!function_exists('yillikIzinHesapla')) {
    function yillikIzinHesapla($pdo, $calisan_id) {
        $stmt_donem = $pdo->prepare("SELECT * FROM calisma_donemleri WHERE calisan_id = ? ORDER BY ise_giris ASC");
        $stmt_donem->execute([$calisan_id]);
        $donemler = $stmt_donem->fetchAll();

        $toplam_gun = 0;
        $aktif_giris = null;
        $ilk_giris = null;

        if (!empty($donemler)) {
            $ilk_giris = $donemler[0]['ise_giris'];
        }

        foreach ($donemler as $d) {
            $giris = new DateTime($d['ise_giris']);
            $cikis = $d['isten_cikis'] ? new DateTime($d['isten_cikis']) : new DateTime();
            if ($d['aktif_donem'] == 1) $aktif_giris = $d['ise_giris'];
            if ($cikis >= $giris) $toplam_gun += $giris->diff($cikis)->days;
        }
        
        // Kullanıcı yaş ve devreden izin bilgisi
        $u_bilgi = $pdo->query("SELECT devreden_izin, ise_giris_tarihi, dogum_tarihi FROM kullanicilar WHERE id = $calisan_id")->fetch();

        if (empty($donemler)) {
            // Eğer dönem tablosu boşsa ana tablodaki veriyi ilk giriş kabul et
            $ilk_giris = $u_bilgi['ise_giris_tarihi'];
            $giris = new DateTime($ilk_giris);
            $bugun = new DateTime();
            $toplam_gun = $giris->diff($bugun)->days;
        }

        $calisma_yili = floor($toplam_gun / 365);

        $toplam_hak_edilen = floatval($u_bilgi['devreden_izin'] ?? 0);
        $bu_yil_hak_edilen = 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_edilen += $hak;
            if ($i == $calisma_yili) $bu_yil_hak_edilen = $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());

        $kalan = $toplam_hak_edilen - $kullanilan;
        $gecmisten_devreden = $kalan - $bu_yil_hak_edilen;

        return [
            'toplam_hak' => $toplam_hak_edilen,
            'kullanilan' => $kullanilan,
            'kalan' => $kalan,
            'bu_yil_hak_edilen' => $bu_yil_hak_edilen,
            'gecmisten_devreden' => $gecmisten_devreden,
            'calisma_yili' => $calisma_yili,
            'toplam_gun' => $toplam_gun,
            'donemler' => $donemler,
            'aktif_giris' => $aktif_giris,
            'ilk_giris' => $ilk_giris // Hesaplanan gerçek ilk giriş tarihi
        ];
    }
}

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

$id = (int)$_GET['id'];

if ($_SESSION['rol'] == 'calisan' && $_SESSION['kullanici_id'] != $id) {
    die("Bu personel kartını görüntüleme yetkiniz yok.");
}

$stmt = $pdo->prepare("SELECT * FROM kullanicilar WHERE id = ?");
$stmt->execute([$id]);
$p = $stmt->fetch();
if (!$p) die("Personel bulunamadı.");

$bakiye = yillikIzinHesapla($pdo, $id);
$tum_izinler = $pdo->query("SELECT * FROM izin_talepleri WHERE calisan_id = $id ORDER BY baslangic_tarihi DESC")->fetchAll();
$tum_mesailer = $pdo->query("SELECT * FROM mesai_hareketleri WHERE calisan_id = $id ORDER BY tarih DESC")->fetchAll();

$profil_resmi = (!empty($p['fotograf_yolu']) && file_exists("../".$p['fotograf_yolu'])) ? $p['fotograf_yolu'] : 'assets/img/default-user.png';
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
$current_url = $protocol . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
$qr_api_url = "https://api.qrserver.com/v1/create-qr-code/?size=150x150&data=" . urlencode($current_url);
?>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js"></script>

<style>
    :root {
        --primary-color: #2c3e50;
        --accent-color: #3498db;
        --light-bg: #f8f9fa;
        --border-color: #e9ecef;
    }
    
    body { background-color: #f0f2f5; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; }
    
    .sicil-container { width: 210mm; max-width: 210mm; margin: 0 auto; background: white; box-shadow: 0 0 20px rgba(0,0,0,0.05); }
    .page { height: 297mm; overflow: hidden; width: 210mm; background: white; }

    .kart-header {
        background: var(--primary-color);
        color: white;
        padding: 15px 30px;
        display: flex;
        justify-content: space-between;
        align-items: center;
        border-bottom: 4px solid var(--accent-color);
    }
    .kart-header h1 { font-size: 22px; margin: 0; font-weight: 700; }
    .qr-box img { border: 2px solid white; border-radius: 4px; background: white; width: 70px; height: 70px; }

    .kart-body { padding: 20px 30px; }

    .profile-section { display: flex; gap: 20px; margin-bottom: 20px; border-bottom: 1px solid var(--border-color); padding-bottom: 20px; }
    .profile-img img { width: 110px; height: 110px; object-fit: cover; border-radius: 10px; border: 1px solid var(--border-color); box-shadow: 0 3px 5px rgba(0,0,0,0.1); }
    .profile-info { flex: 1; }
    .profile-name { font-size: 24px; font-weight: 800; color: var(--primary-color); margin-bottom: 4px; text-transform: uppercase; }
    .profile-role { background: var(--accent-color); color: white; padding: 3px 10px; border-radius: 16px; font-size: 12px; font-weight: 600; text-transform: uppercase; margin-bottom: 10px; display: inline-block; }

    .info-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 12px; margin-bottom: 20px; }
    .info-item { background: var(--light-bg); padding: 8px 10px; border-radius: 5px; border-left: 4px solid var(--border-color); }
    .info-label { font-size: 9px; text-transform: uppercase; color: #7f8c8d; font-weight: 700; display: block; margin-bottom: 3px; }
    .info-value { font-size: 13px; color: #2c3e50; font-weight: 600; }

    .stats-container { display: grid; grid-template-columns: repeat(4, 1fr); gap: 12px; margin-top: 10px; }
    .stat-box { border: 1px solid var(--border-color); border-radius: 6px; padding: 10px; text-align: center; background: white; }
    .stat-box.highlight { background: #e3f2fd; border-color: #2196f3; }
    .stat-title { font-size: 9px; color: #7f8c8d; text-transform: uppercase; font-weight: 700; }
    .stat-val { font-size: 18px; font-weight: 800; color: var(--primary-color); margin-top: 4px; }
    .stat-box.highlight .stat-val { color: #1976d2; }

    .section-header { font-size: 14px; font-weight: 700; color: var(--primary-color); border-bottom: 2px solid var(--border-color); padding-bottom: 4px; margin: 20px 0 8px; display: flex; align-items: center; gap: 6px; }
    .data-table { width: 100%; border-collapse: collapse; font-size: 10px; margin-top: 8px; }
    .data-table th { background: #34495e; color: white; text-align: left; padding: 6px 8px; text-transform: uppercase; }
    .data-table td { padding: 6px 8px; border-bottom: 1px solid #eee; color: #333; }
    .data-table tr:nth-child(even) { background-color: #f9f9f9; }
    .data-table tr { page-break-inside: avoid; }

    @media print {
        body { margin: 0; padding: 0; background: white; }
        .no-print { display: none !important; }
        .sicil-container { box-shadow: none; margin: 0; padding: 0; width: 100%; }
        .page { height: auto; overflow: visible; }
        .kart-body { padding: 15px 25px; }
        .page + .page { page-break-before: always; }
    }
</style>

<div class="d-flex justify-content-between align-items-center mb-3 mt-3 container no-print">
    <a href="personel-yonetimi.php" class="btn btn-secondary btn-sm"><i class="fas fa-arrow-left"></i> Listeye Dön</a>
    <button onclick="generatePDF()" class="btn btn-success btn-sm"><i class="fas fa-file-pdf me-2"></i> PDF İndir</button>
</div>

<div class="sicil-container" id="pdf-content">

    <div class="page" id="page1">
        <div class="kart-header">
            <div>
                <img src="../assets/img/logo.png" style="height: 35px; margin-bottom: 4px; display:block;">
                <h1>PERSONEL SİCİL KARTI</h1>
                <small>RAMSA MAKİNE SANAYİ VE TİCARET A.Ş.</small>
            </div>
            <div class="qr-box">
                <img src="<?php echo $qr_api_url; ?>" width="70" height="70">
            </div>
        </div>

        <div class="kart-body">
            <div class="profile-section">
                <div class="profile-img">
                    <img src="../<?php echo $profil_resmi; ?>" alt="Fotoğraf">
                </div>
                <div class="profile-info">
                    <div class="profile-name"><?php echo $p['ad'] . ' ' . $p['soyad']; ?></div>
                    <span class="profile-role"><?php echo str_replace('_', ' ', $p['rol']); ?></span>
                    <div class="info-grid" style="margin-bottom: 0;">
                        <div class="info-item">
                            <span class="info-label">TC Kimlik No</span>
                            <span class="info-value"><?php echo $p['tc_no'] ?? '-'; ?></span>
                        </div>
                        <div class="info-item">
                            <span class="info-label">Toplam Hizmet Süresi</span>
                            <span class="info-value text-primary">
                                <?php echo $bakiye['calisma_yili']; ?> Yıl, <?php echo floor(($bakiye['toplam_gun'] % 365) / 30); ?> Ay
                            </span>
                        </div>
                    </div>
                </div>
            </div>

            <div class="section-header"><i class="fas fa-user-circle"></i> KİŞİSEL BİLGİLER</div>
            <div class="info-grid">
                <div class="info-item"><span class="info-label">Telefon</span><span class="info-value"><?php echo $p['telefon'] ?? '-'; ?></span></div>
                <div class="info-item"><span class="info-label">E-Posta</span><span class="info-value"><?php echo $p['email'] ?? '-'; ?></span></div>
                <div class="info-item"><span class="info-label">Doğum Tarihi</span><span class="info-value"><?php echo $p['dogum_tarihi'] ? date('d.m.Y', strtotime($p['dogum_tarihi'])) : '-'; ?></span></div>
                <div class="info-item"><span class="info-label">Cinsiyet</span><span class="info-value"><?php echo $p['cinsiyet'] ?? '-'; ?></span></div>
                <div class="info-item"><span class="info-label">Medeni Hali</span><span class="info-value"><?php echo $p['medeni_durum'] ?? '-'; ?></span></div>
                <div class="info-item"><span class="info-label">Çocuk Sayısı</span><span class="info-value"><?php echo $p['cocuk_sayisi'] ?? '0'; ?></span></div>
                <div class="info-item"><span class="info-label">Kan Grubu</span><span class="info-value"><?php echo $p['kan_grubu'] ?? '-'; ?></span></div>
                <div class="info-item"><span class="info-label">SGK No</span><span class="info-value"><?php echo $p['sgk_no'] ?? '-'; ?></span></div>
                <div class="info-item" style="grid-column: span 2;">
                    <span class="info-label">Adres</span><span class="info-value"><?php echo $p['adres'] ?? '-'; ?></span>
                </div>
            </div>

            <div class="section-header"><i class="fas fa-briefcase"></i> KURUMSAL BİLGİLER</div>
            <div class="info-grid">
                <div class="info-item"><span class="info-label">Departman / Rol</span><span class="info-value"><?php echo strtoupper(str_replace('_', ' ', $p['rol'])); ?></span></div>
                <div class="info-item"><span class="info-label">Net Maaş</span><span class="info-value"><?php echo number_format($p['aylik_net_maas'] ?? 0, 2, ',', '.'); ?> ₺</span></div>
                <div class="info-item"><span class="info-label">İlk İşe Giriş Tarihi</span>
                    <span class="info-value"><?php echo $bakiye['ilk_giris'] ? date('d.m.Y', strtotime($bakiye['ilk_giris'])) : '-'; ?></span>
                </div>
                <div class="info-item">
                    <span class="info-label">Çalışma Durumu</span>
                    <span class="info-value <?php echo $p['durum'] ? 'text-success' : 'text-danger'; ?>">
                        <?php echo $p['durum'] ? 'AKTİF' : 'PASİF'; ?>
                        <?php if ($p['isten_cikis_tarihi']) echo ' (' . date('d.m.Y', strtotime($p['isten_cikis_tarihi'])) . ')'; ?>
                    </span>
                </div>
            </div>

            <div class="section-header"><i class="fas fa-umbrella-beach"></i> YILLIK İZİN DURUMU (GÜN)</div>
            <div class="stats-container">
                <div class="stat-box">
                    <div class="stat-title">Geçen Yıldan Devreden</div>
                    <div class="stat-val"><?php echo number_format($bakiye['gecmisten_devreden'], 1); ?></div>
                </div>
                <div class="stat-box">
                    <div class="stat-title">Bu Yıl Hak Edilen</div>
                    <div class="stat-val"><?php echo number_format($bakiye['bu_yil_hak_edilen'], 1); ?></div>
                </div>
                <div class="stat-box">
                    <div class="stat-title">Kullanılan</div>
                    <div class="stat-val text-danger"><?php echo number_format($bakiye['kullanilan'], 1); ?></div>
                </div>
                <div class="stat-box highlight">
                    <div class="stat-title">TOPLAM KALAN</div>
                    <div class="stat-val"><?php echo number_format($bakiye['kalan'], 1); ?></div>
                </div>
            </div>
        </div>
    </div>

    <div class="page" id="page2">
        <div class="kart-body" style="padding-top: 40px;">
            <div class="section-header"><i class="fas fa-exchange-alt"></i> GİRİŞ - ÇIKIŞ HAREKETLERİ</div>
            <table class="data-table">
                <thead><tr><th>Giriş Tarihi</th><th>Çıkış Tarihi</th><th>Ayrılma Nedeni</th><th>Süre</th><th>Durum</th></tr></thead>
                <tbody>
                    <?php if(!empty($bakiye['donemler'])): foreach($bakiye['donemler'] as $d): 
                        $g = new DateTime($d['ise_giris']);
                        $c = $d['isten_cikis'] ? new DateTime($d['isten_cikis']) : new DateTime();
                        $diff = $g->diff($c);
                    ?>
                    <tr>
                        <td><?php echo date('d.m.Y', strtotime($d['ise_giris'])); ?></td>
                        <td><?php echo $d['isten_cikis'] ? date('d.m.Y', strtotime($d['isten_cikis'])) : 'Devam Ediyor'; ?></td>
                        <td><?php echo $d['ayrilma_nedeni'] ?? '-'; ?></td>
                        <td><?php echo $diff->y." Yıl, ".$diff->m." Ay"; ?></td>
                        <td><?php echo $d['aktif_donem'] ? '<span style="color:green;font-weight:bold">Aktif</span>' : 'Pasif'; ?></td>
                    </tr>
                    <?php endforeach; else: ?>
                    <tr><td colspan="5" align="center">Kayıt bulunamadı.</td></tr>
                    <?php endif; ?>
                </tbody>
            </table>

            <div class="section-header" style="margin-top: 40px;"><i class="fas fa-list-alt"></i> İZİN KULLANIM GEÇMİŞİ (DETAYLI)</div>
            <table class="data-table">
                <thead><tr><th width="30">#</th><th>İzin Türü</th><th>Başlangıç</th><th>Bitiş</th><th>Süre</th><th>Durum</th></tr></thead>
                <tbody>
                    <?php $i=1; foreach($tum_izinler as $iz): 
                        $sure = ($iz['izin_turu'] == 'saatlik' || $iz['izin_turu'] == 'sut_izni') 
                                ? $iz['saatlik_sure'] . ' Saat' : floatval($iz['toplam_gun']) . ' Gün';
                    ?>
                    <tr>
                        <td><?php echo $i++; ?></td>
                        <td><?php echo strtoupper(str_replace('_',' ',$iz['izin_turu'])); ?></td>
                        <td><?php echo date('d.m.Y H:i', strtotime($iz['baslangic_tarihi'])); ?></td>
                        <td><?php echo date('d.m.Y H:i', strtotime($iz['bitis_tarihi'])); ?></td>
                        <td style="font-weight:bold;"><?php echo $sure; ?></td>
                        <td><?php echo strtoupper($iz['durum']); ?></td>
                    </tr>
                    <?php endforeach; if(empty($tum_izinler)) echo '<tr><td colspan="6" align="center">Kayıt bulunamadı.</td></tr>'; ?>
                </tbody>
            </table>

            <div class="section-header" style="margin-top: 40px;"><i class="fas fa-clock"></i> MESAİ HAREKETLERİ GEÇMİŞİ</div>
            <table class="data-table">
                <thead><tr><th width="30">#</th><th>Tarih</th><th>Mesai Türü</th><th>Saat Aralığı</th><th>Süre</th><th>Durum</th></tr></thead>
                <tbody>
                    <?php $k=1; foreach($tum_mesailer as $m): 
                        $tur_ad = ($m['mesai_turu']=='fazla_mesai') ? 'Normal Fazla Mesai' : 
                                  (($m['mesai_turu']=='resmi_tatil_mesaisi') ? 'Resmi Tatil' : 
                                  (($m['mesai_turu']=='vardiya_gece') ? 'Vardiya Girişi' : 'Hafta Tatili'));
                    ?>
                    <tr>
                        <td><?php echo $k++; ?></td>
                        <td><?php echo date('d.m.Y', strtotime($m['tarih'])); ?></td>
                        <td><?php echo $tur_ad; ?></td>
                        <td><?php echo substr($m['baslangic_saati'],0,5) . ' - ' . substr($m['bitis_saati'],0,5); ?></td>
                        <td style="font-weight:bold; color:#27ae60;">+<?php echo $m['toplam_saat']; ?> Saat</td>
                        <td><?php echo strtoupper($m['durum']); ?></td>
                    </tr>
                    <?php endforeach; if(empty($tum_mesailer)) echo '<tr><td colspan="6" align="center">Kayıt bulunamadı.</td></tr>'; ?>
                </tbody>
            </table>

            <div class="no-print text-center text-muted small mt-5">
                Bu belge <?php echo date('d.m.Y H:i'); ?> tarihinde sistemden oluşturulmuştur.
            </div>
        </div>
    </div>
</div>

<script>
function generatePDF() {
    const { jsPDF } = window.jspdf;
    const pdf = new jsPDF({ orientation: 'portrait', unit: 'mm', format: 'a4' });

    const page1 = document.getElementById('page1');
    const page2 = document.getElementById('page2');

    html2canvas(page1, { scale: 2 }).then(canvas1 => {
        const imgData1 = canvas1.toDataURL('image/png');
        pdf.addImage(imgData1, 'PNG', 0, 0, 210, 297);

        html2canvas(page2, { scale: 2 }).then(canvas2 => {
            const imgData2 = canvas2.toDataURL('image/png');
            pdf.addPage();
            pdf.addImage(imgData2, 'PNG', 0, 0, 210, 297);

            pdf.save('Personel-Sicil-Karti_<?php echo $p['ad'] . '_' . $p['soyad']; ?>.pdf');
        });
    });
}
</script>

<?php include '../includes/footer.php'; ?>