<?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'; ?>