PYBS (Personel Yönetim Bilgi Sistemi)
<?php
// config/functions.php
// Veritabanı bağlantısını içeri alıyoruz
require_once 'db.php';
// Oturumu başlat (Eğer başlamadıysa)
if (session_status() === PHP_SESSION_NONE) {
session_start();
}
/**
* 1. GÜVENLİK FONKSİYONU (XSS Temizliği)
*/
function guvenlik($veri) {
$veri = trim($veri);
$veri = stripslashes($veri);
$veri = htmlspecialchars($veri);
return $veri;
}
/**
* 2. DETAYLI LOGLAMA FONKSİYONU
*/
function logKaydet($pdo, $kullanici_id, $islem_tipi, $aciklama, $tablo = null, $kayit_id = null, $eski_veri = null, $yeni_veri = null) {
$ip = $_SERVER['REMOTE_ADDR'];
$cihaz = $_SERVER['HTTP_USER_AGENT'];
$temiz_islem_tipi = guvenlik($islem_tipi);
$temiz_aciklama = guvenlik($aciklama);
$sql = "INSERT INTO sistem_loglari (kullanici_id, islem_tipi, aciklama, tablo_adi, kayit_id, eski_veri, yeni_veri, ip_adresi, cihaz_bilgisi)
VALUES (:kid, :tip, :acik, :tablo, :rid, :eski, :yeni, :ip, :cihaz)";
$stmt = $pdo->prepare($sql);
$stmt->execute([
':kid' => $kullanici_id,
':tip' => $temiz_islem_tipi,
':acik' => $temiz_aciklama,
':tablo' => $tablo,
':rid' => $kayit_id,
':eski' => $eski_veri ? json_encode($eski_veri, JSON_UNESCAPED_UNICODE) : null,
':yeni' => $yeni_veri ? json_encode($yeni_veri, JSON_UNESCAPED_UNICODE) : null,
':ip' => $ip,
':cihaz' => $cihaz
]);
}
/**
* 3. YETKİ KONTROLÜ
*/
function yetkiKontrol($izin_verilen_roller) {
if (!isset($_SESSION['kullanici_id']) || !isset($_SESSION['rol'])) {
header("Location: ../index.php?hata=giris_yapilmali");
exit;
}
if (!in_array($_SESSION['rol'], $izin_verilen_roller)) {
global $pdo;
logKaydet($pdo, $_SESSION['kullanici_id'], 'guvenlik_uyarisi', 'Yetkisiz sayfaya erişim denemesi: ' . $_SERVER['PHP_SELF']);
header("Location: ../index.php?hata=yetkisiz_erisim");
exit;
}
}
/**
* 4. CSRF TOKEN OLUŞTURMA
*/
function csrfTokenOlustur() {
if (empty($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
return $_SESSION['csrf_token'];
}
/**
* 5. CSRF KONTROL
*/
function csrfKontrol($token) {
if (!isset($_SESSION['csrf_token']) || $token !== $_SESSION['csrf_token']) {
die("Güvenlik Uyarısı: CSRF doğrulaması başarısız. Lütfen sayfayı yenileyip tekrar deneyin.");
}
}
/**
* 6. HAFTALIK ÇALIŞMA SÜRESİ HESAPLA
*/
function haftalikToplamSureGetir($pdo, $calisan_id, $referans_tarih) {
$dt = new DateTime($referans_tarih);
$dt->modify('this week monday');
$baslangic = $dt->format('Y-m-d');
$dt->modify('this week sunday');
$bitis = $dt->format('Y-m-d');
$sql = "SELECT SUM(toplam_saat) as toplam
FROM mesai_hareketleri
WHERE calisan_id = ?
AND tarih BETWEEN ? AND ?
AND durum = 'onaylandi'";
$stmt = $pdo->prepare($sql);
$stmt->execute([$calisan_id, $baslangic, $bitis]);
return (float)$stmt->fetchColumn();
}
/**
* 7. YILLIK İZİN HAKEDİŞ HESAPLA (OTOMATİK)
* İşe giriş tarihi ve doğum tarihine göre hak edilen gün sayısını döner.
*/
function yillikIzinHakedisHesapla($pdo, $kullanici_id) {
$stmt = $pdo->prepare("SELECT ise_giris_tarihi, dogum_tarihi, rol, devreden_izin FROM kullanicilar WHERE id = ?");
$stmt->execute([$kullanici_id]);
$u = $stmt->fetch();
if (!$u) return 0;
if ($u['rol'] == 'stajyer') return 0; // Stajyerin yıllık izni olmaz
$ise_giris = new DateTime($u['ise_giris_tarihi']);
$bugun = new DateTime();
// Kıdem Yılı
$kidem_yil = $ise_giris->diff($bugun)->y;
// Henüz 1 yılı dolmamışsa
if ($kidem_yil < 1) return (float)$u['devreden_izin'];
// Baz Hesap (Kıdem Yılına Göre)
if ($kidem_yil >= 15) {
$hakedis = 26;
} elseif ($kidem_yil >= 5) {
$hakedis = 20;
} else {
$hakedis = 14;
}
// Yaş Kontrolü (18 yaş altı ve 50 yaş üstü en az 20 gün olmak zorunda - Kanuni Zorunluluk)
if (!empty($u['dogum_tarihi'])) {
$dogum = new DateTime($u['dogum_tarihi']);
$yas = $dogum->diff($bugun)->y;
// GÜNCELLEME: 18 yaş dahil (<=) ve 50 yaş dahil (>=)
if (($yas <= 18 || $yas >= 50) && $hakedis < 20) {
$hakedis = 20;
}
}
// Devreden izin varsa ekle
return $hakedis + (float)$u['devreden_izin'];
}
/**
* 8. GÜNCEL İZİN BAKİYESİ SORGULA
* Toplam Hakediş - Kullanılan
*/
function bakiyeSorgula($pdo, $kullanici_id) {
$toplam_hak = yillikIzinHakedisHesapla($pdo, $kullanici_id);
// Sadece "yillik" izin türü bakiyeden düşer
$sql_kul = "SELECT SUM(toplam_gun) FROM izin_talepleri
WHERE calisan_id = ?
AND izin_turu = 'yillik'
AND durum = 'onaylandi'
AND YEAR(baslangic_tarihi) = YEAR(CURDATE())";
$stmt_kul = $pdo->prepare($sql_kul);
$stmt_kul->execute([$kullanici_id]);
$kullanilan = (float)$stmt_kul->fetchColumn();
return [
'toplam_hak' => $toplam_hak,
'kullanilan' => $kullanilan,
'kalan' => $toplam_hak - $kullanilan
];
}
/**
* 9. TELEFON FORMATLAMA
*/
function telefonFormatla($tel) {
$tel = preg_replace('/[^0-9]/', '', $tel);
if (empty($tel)) return '';
if (strlen($tel) == 10) return '+90' . $tel;
if (strlen($tel) == 11 && substr($tel, 0, 1) == '0') return '+9' . $tel;
if (strlen($tel) == 12 && substr($tel, 0, 2) == '90') return '+' . $tel;
return '+' . $tel;
}
/**
* 10. TÜRKÇE TARİH FORMATLAMA
*/
function tarihTurkce($tarih, $sadece_ay_yil = false) {
if (!$tarih) return '-';
$zaman = strtotime($tarih);
$aylar_en = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
$aylar_tr = ['Ocak', 'Şubat', 'Mart', 'Nisan', 'Mayıs', 'Haziran', 'Temmuz', 'Ağustos', 'Eylül', 'Ekim', 'Kasım', 'Aralık'];
$format = $sadece_ay_yil ? 'F Y' : 'd F Y';
$ingilizce_tarih = date($format, $zaman);
return str_replace($aylar_en, $aylar_tr, $ingilizce_tarih);
}
/**
* 11. BİLDİRİM GÖNDER
*/
function bildirimGonder($pdo, $hedef_kullanici_id, $baslik, $mesaj, $link) {
$sql = "INSERT INTO bildirimler (kullanici_id, baslik, mesaj, link) VALUES (?, ?, ?, ?)";
$pdo->prepare($sql)->execute([$hedef_kullanici_id, $baslik, $mesaj, $link]);
}
/**
* 12. GRUP BİLDİRİMİ
*/
function rolBildirimGonder($pdo, $roller_dizisi, $baslik, $mesaj, $link) {
$in = str_repeat('?,', count($roller_dizisi) - 1) . '?';
$sql = "SELECT id FROM kullanicilar WHERE rol IN ($in) AND durum = 1";
$stmt = $pdo->prepare($sql);
$stmt->execute($roller_dizisi);
$kisiler = $stmt->fetchAll(PDO::FETCH_COLUMN);
foreach($kisiler as $k_id) {
bildirimGonder($pdo, $k_id, $baslik, $mesaj, $link);
}
}
/**
* 13. OKUNMAMIŞ BİLDİRİM SAYISI
*/
function bildirimSayisi($pdo, $uid) {
$sql = "SELECT COUNT(*) FROM bildirimler WHERE kullanici_id = ? AND okundu = 0";
$stmt = $pdo->prepare($sql);
$stmt->execute([$uid]);
return $stmt->fetchColumn();
}
/**
* 14. PERSONEL ANLIK DURUM SORGULA
*/
function personelDurumu($pdo, $calisan_id) {
$bugun = date('Y-m-d');
$sql = "SELECT COUNT(*) FROM izin_talepleri
WHERE calisan_id = ?
AND durum = 'onaylandi'
AND ? BETWEEN DATE(baslangic_tarihi) AND DATE(bitis_tarihi)";
$stmt = $pdo->prepare($sql);
$stmt->execute([$calisan_id, $bugun]);
if ($stmt->fetchColumn() > 0) {
return '<span class="badge bg-warning text-dark"><i class="fas fa-umbrella-beach"></i> İZİNLİ</span>';
} else {
return '<span class="badge bg-success"><i class="fas fa-briefcase"></i> MESAİDE</span>';
}
}
function maasGetir($pdo, $calisan_id, $yil, $ay) {
// O ayın son günü itibariyle geçerli olan maaşı baz alıyoruz.
$hedef_tarih = date("Y-m-t", strtotime("$yil-$ay-01"));
$stmt = $pdo->prepare("SELECT maas_miktari FROM maas_gecmisi WHERE calisan_id = ? AND gecerlilik_baslangic <= ? ORDER BY gecerlilik_baslangic DESC LIMIT 1");
$stmt->execute([$calisan_id, $hedef_tarih]);
$maas = $stmt->fetchColumn();
// Eğer geçmişte kayıt yoksa (eski sistemden kalma ise) güncel maaşı döndür
if (!$maas) {
$stmt2 = $pdo->prepare("SELECT aylik_net_maas FROM kullanicilar WHERE id = ?");
$stmt2->execute([$calisan_id]);
$maas = $stmt2->fetchColumn();
}
return (float)$maas;
}
?>
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