PYBS (Personel Yönetim Bilgi Sistemi)
<?php
// modules/profil.php
session_start();
require_once '../config/db.php';
require_once '../config/functions.php';
// Herkes kendi profiline girebilir
yetkiKontrol(['root', 'yonetici', 'mudur', 'vardiya_amiri', 'muhasebe', 'insan_kaynaklari', 'calisan', 'stajyer']);
include '../includes/header.php';
include '../includes/menu.php';
$id = $_SESSION['kullanici_id'];
$mesaj = '';
// Maaş hariç gerekli bilgileri çek
$stmt = $pdo->prepare("SELECT id, ad, soyad, kullanici_adi, rol, email, telefon, tc_no, sgk_no, dogum_tarihi, ise_giris_tarihi, kan_grubu, adres, medeni_durum, cocuk_sayisi, fotograf_yolu, sifre_hash FROM kullanicilar WHERE id = ?");
$stmt->execute([$id]);
$u = $stmt->fetch();
if (!$u) {
session_destroy();
header('Location: ../auth/login.php');
exit;
}
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
csrfKontrol($_POST['csrf_token']);
// Değiştirilebilir alanlar
$email = guvenlik($_POST['email']);
$telefon = telefonFormatla($_POST['telefon']);
$kan_grubu = $_POST['kan_grubu'];
$adres = guvenlik($_POST['adres']);
$dogum_tarihi = $_POST['dogum_tarihi'];
$medeni_durum = $_POST['medeni_durum'];
$cocuk_sayisi = (int)$_POST['cocuk_sayisi'];
// Şifre kontrolü
$eski_sifre = $_POST['eski_sifre'];
$yeni_sifre = $_POST['yeni_sifre'];
if (!password_verify($eski_sifre, $u['sifre_hash'])) {
$mesaj = '<div class="alert alert-danger border-danger border-5 border-start shadow-sm">
<h6 class="alert-heading fw-bold"><i class="fas fa-exclamation-triangle me-2"></i>Hata!</h6>
Mevcut şifreniz yanlış. Değişiklikler kaydedilemedi.
</div>';
goto end_of_post;
}
// Yeni şifre kontrolü
$yeni_sifre_hash = '';
if (!empty($yeni_sifre)) {
if (strlen($yeni_sifre) < 6) {
$mesaj = '<div class="alert alert-danger">Yeni şifre en az 6 karakter olmalıdır.</div>';
goto end_of_post;
}
$yeni_sifre_hash = password_hash($yeni_sifre, PASSWORD_DEFAULT);
}
// Fotoğraf yükleme
$fotograf_yolu = $u['fotograf_yolu'];
if (isset($_FILES['fotograf']) && $_FILES['fotograf']['error'] === UPLOAD_ERR_OK) {
$upload_dir = 'assets/uploads/profil/';
$allowed = ['image/jpeg', 'image/jpg', 'image/png'];
$max_size = 2 * 1024 * 1024; // 2MB
if (!in_array($_FILES['fotograf']['type'], $allowed)) {
$mesaj = '<div class="alert alert-danger">Sadece JPG veya PNG dosyası yüklenebilir.</div>';
goto end_of_post;
}
if ($_FILES['fotograf']['size'] > $max_size) {
$mesaj = '<div class="alert alert-danger">Dosya boyutu 2MB\'ı geçemez.</div>';
goto end_of_post;
}
// Eski fotoğrafı sil
if (!empty($u['fotograf_yolu']) && file_exists('../' . $u['fotograf_yolu'])) {
@unlink('../' . $u['fotograf_yolu']);
}
$ext = pathinfo($_FILES['fotograf']['name'], PATHINFO_EXTENSION);
$yeni_ad = $upload_dir . $id . '_' . time() . '.' . $ext;
$hedef = '../' . $yeni_ad;
if (!is_dir('../' . $upload_dir)) {
mkdir('../' . $upload_dir, 0777, true);
}
if (move_uploaded_file($_FILES['fotograf']['tmp_name'], $hedef)) {
$fotograf_yolu = $yeni_ad;
} else {
$mesaj = '<div class="alert alert-danger">Fotoğraf yüklenirken hata oluştu.</div>';
goto end_of_post;
}
}
// Güncelleme sorgusu
$sql = "UPDATE kullanicilar SET email = ?, telefon = ?, kan_grubu = ?, adres = ?, dogum_tarihi = ?, medeni_durum = ?, cocuk_sayisi = ?, guncellenme_tarihi = NOW()";
$params = [$email, $telefon, $kan_grubu, $adres, $dogum_tarihi, $medeni_durum, $cocuk_sayisi];
if ($fotograf_yolu !== $u['fotograf_yolu']) {
$sql .= ", fotograf_yolu = ?";
$params[] = $fotograf_yolu;
}
if (!empty($yeni_sifre_hash)) {
$sql .= ", sifre_hash = ?";
$params[] = $yeni_sifre_hash;
}
$sql .= " WHERE id = ?";
$params[] = $id;
try {
$pdo->prepare($sql)->execute($params);
// Oturumdaki fotoğrafı güncelle
if ($fotograf_yolu !== $u['fotograf_yolu']) {
$_SESSION['fotograf_yolu'] = $fotograf_yolu;
}
$mesaj = '<div class="alert alert-success border-success border-5 border-start shadow-sm">
<h5 class="alert-heading fw-bold"><i class="fas fa-check-circle me-2"></i>Başarılı!</h5>
Profil bilgileriniz güncellendi.
</div>';
logKaydet($pdo, $id, 'guncelleme', 'Kendi profilini güncelledi.', 'kullanicilar', $id);
// Güncel veriyi tekrar çek
$stmt->execute([$id]);
$u = $stmt->fetch();
} catch (PDOException $e) {
$mesaj = '<div class="alert alert-danger">Veritabanı hatası: ' . htmlspecialchars($e->getMessage()) . '</div>';
}
}
end_of_post:
?>
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.0/css/all.min.css" rel="stylesheet">
<title>Profil Bilgilerim</title>
<style>
body { background-color: #f8f9fa; }
.card { border: none; border-radius: 1.5rem; overflow: hidden; }
.card-header { background: linear-gradient(135deg, #0d6efd, #0dcaf0); color: white; }
.form-control, .form-select { border-radius: 0.75rem; }
.btn-primary { border-radius: 0.75rem; padding: 0.85rem; font-weight: 600; }
.readonly-bg { background-color: #e9ecef !important; }
.profile-img { max-height: 200px; object-fit: cover; }
@media (max-width: 576px) { .container-fluid { padding: 1rem; } }
</style>
</head>
<body>
<div class="container-fluid py-4 py-md-5">
<div class="row justify-content-center">
<div class="col-12 col-lg-10 col-xl-8">
<h3 class="mb-4 text-center text-primary fw-bold">
<i class="fas fa-user-circle me-2"></i>Profil Bilgilerim
</h3>
<div class="card shadow-lg">
<div class="card-header py-4 text-center">
<h5 class="mb-0 text-white fw-bold">Kişisel Bilgilerinizi Güncelleyin</h5>
</div>
<div class="card-body p-4 p-md-5">
<?php echo $mesaj; ?>
<form method="POST" enctype="multipart/form-data" novalidate>
<input type="hidden" name="csrf_token" value="<?php echo csrfTokenOlustur(); ?>">
<!-- Kimlik Bilgileri (Readonly) -->
<h5 class="mb-4 text-primary"><i class="fas fa-id-card me-2"></i>Kimlik Bilgileri</h5>
<div class="row g-3 mb-4">
<div class="col-md-6">
<label class="form-label fw-semibold">Ad</label>
<input type="text" class="form-control form-control-lg readonly-bg" value="<?php echo htmlspecialchars($u['ad']); ?>" readonly>
</div>
<div class="col-md-6">
<label class="form-label fw-semibold">Soyad</label>
<input type="text" class="form-control form-control-lg readonly-bg" value="<?php echo htmlspecialchars($u['soyad']); ?>" readonly>
</div>
</div>
<div class="row g-3 mb-4">
<div class="col-md-6">
<label class="form-label fw-semibold">Kullanıcı Adı</label>
<input type="text" class="form-control form-control-lg readonly-bg" value="<?php echo htmlspecialchars($u['kullanici_adi']); ?>" readonly>
</div>
<div class="col-md-6">
<label class="form-label fw-semibold">Rol</label>
<input type="text" class="form-control form-control-lg readonly-bg" value="<?php echo ucfirst(str_replace('_', ' ', $u['rol'])); ?>" readonly>
</div>
</div>
<div class="row g-3 mb-4">
<div class="col-md-6">
<label class="form-label fw-semibold">TC Kimlik No</label>
<input type="text" class="form-control form-control-lg readonly-bg" value="<?php echo htmlspecialchars($u['tc_no']); ?>" readonly>
</div>
<div class="col-md-6">
<label class="form-label fw-semibold">SGK Sicil No</label>
<input type="text" class="form-control form-control-lg readonly-bg" value="<?php echo htmlspecialchars($u['sgk_no'] ?? ''); ?>" readonly>
</div>
</div>
<div class="mb-4">
<label class="form-label fw-semibold">İşe Giriş Tarihi</label>
<input type="date" class="form-control form-control-lg readonly-bg" value="<?php echo $u['ise_giris_tarihi']; ?>" readonly>
</div>
<hr class="my-5">
<!-- İletişim ve Kişisel Bilgiler -->
<h5 class="mb-4 text-primary"><i class="fas fa-address-book me-2"></i>İletişim ve Kişisel Bilgiler</h5>
<div class="row g-3 mb-4">
<div class="col-md-6">
<label class="form-label fw-semibold">E-Posta Adresi</label>
<input type="email" name="email" class="form-control form-control-lg" value="<?php echo htmlspecialchars($u['email'] ?? ''); ?>">
</div>
<div class="col-md-6">
<label class="form-label fw-semibold">Telefon</label>
<input type="text" name="telefon" class="form-control form-control-lg" value="<?php echo htmlspecialchars($u['telefon']); ?>" placeholder="05XXXXXXXXX">
</div>
</div>
<div class="mb-4">
<label class="form-label fw-semibold">Adres</label>
<textarea name="adres" class="form-control form-control-lg" rows="3"><?php echo htmlspecialchars($u['adres']); ?></textarea>
</div>
<div class="row g-3 mb-4">
<div class="col-md-4">
<label class="form-label fw-semibold">Doğum Tarihi</label>
<input type="date" name="dogum_tarihi" class="form-control form-control-lg" value="<?php echo $u['dogum_tarihi']; ?>">
</div>
<div class="col-md-4">
<label class="form-label fw-semibold">Kan Grubu</label>
<select name="kan_grubu" class="form-select form-select-lg">
<option value="">Seçiniz</option>
<?php
$kanlar = ['A Rh+', 'A Rh-', 'B Rh+', 'B Rh-', 'AB Rh+', 'AB Rh-', '0 Rh+', '0 Rh-'];
foreach($kanlar as $k):
?>
<option value="<?php echo $k; ?>" <?php echo $u['kan_grubu']==$k?'selected':''; ?>><?php echo $k; ?></option>
<?php endforeach; ?>
</select>
</div>
<div class="col-md-4">
<label class="form-label fw-semibold">Medeni Durum</label>
<select name="medeni_durum" class="form-select form-select-lg">
<option value="">Seçiniz</option>
<?php foreach(['Bekar','Evli','Dul','Boşanmış'] as $d): ?>
<option value="<?php echo $d; ?>" <?php echo $u['medeni_durum']==$d?'selected':''; ?>><?php echo $d; ?></option>
<?php endforeach; ?>
</select>
</div>
</div>
<div class="mb-4">
<label class="form-label fw-semibold">Çocuk Sayısı</label>
<input type="number" name="cocuk_sayisi" class="form-control form-control-lg" min="0" value="<?php echo $u['cocuk_sayisi']; ?>">
</div>
<hr class="my-5">
<!-- Profil Fotoğrafı -->
<h5 class="mb-4 text-primary"><i class="fas fa-image me-2"></i>Profil Fotoğrafı</h5>
<div class="row g-3 align-items-center mb-4">
<?php if (!empty($u['fotograf_yolu'])): ?>
<div class="col-md-4 text-center mb-3">
<label class="form-label fw-semibold">Mevcut Fotoğraf</label><br>
<img src="../<?php echo htmlspecialchars($u['fotograf_yolu']); ?>" class="img-fluid rounded shadow profile-img" alt="Profil Fotoğrafı">
</div>
<?php endif; ?>
<div class="col-md-<?php echo empty($u['fotograf_yolu']) ? '12' : '8'; ?>">
<label class="form-label fw-semibold">Yeni Fotoğraf Yükle</label>
<input type="file" name="fotograf" class="form-control form-control-lg" accept="image/jpeg,image/png">
<div class="form-text">JPG/PNG, maks. 2MB. Boş bırakırsanız değişmez.</div>
</div>
</div>
<hr class="my-5">
<!-- Şifre Değiştirme -->
<h5 class="mb-4 text-primary"><i class="fas fa-lock me-2"></i>Şifre Güncelleme</h5>
<div class="bg-light rounded p-4 border">
<div class="mb-3">
<label class="form-label fw-semibold text-danger">Mevcut Şifre <span class="text-muted small">(Zorunlu - değişiklik için)</span></label>
<input type="password" name="eski_sifre" class="form-control form-control-lg" required placeholder="Değişiklikleri kaydetmek için girin">
</div>
<div class="mb-3">
<label class="form-label fw-semibold">Yeni Şifre <span class="text-muted small">(İsteğe bağlı)</span></label>
<input type="password" name="yeni_sifre" class="form-control form-control-lg" placeholder="En az 6 karakter, değiştirmek istemiyorsanız boş bırakın">
</div>
</div>
<div class="d-grid mt-5">
<button type="submit" class="btn btn-primary btn-lg shadow">
<i class="fas fa-save me-2"></i> Bilgilerimi Güncelle
</button>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
<?php include '../includes/footer.php'; ?>
</body>
</html>
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