PYBS (Personel Yönetim Bilgi Sistemi) / modules/profil.php
profil.php 315 satır • 15.80 KB
<?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>