sys/veri_detay/#008

PYBS (Personel Yönetim Bilgi Sistemi)

Son Senkronizasyon: 16.12.2025
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'; ?>
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,587
Sinyal (Ağ Hiti)
1.54 MB
Kapasite

Ağda Paylaş