PYBS (Personel Yönetim Bilgi Sistemi)
<?php
// modules/bordro-goruntule.php
session_start();
require_once '../config/db.php';
require_once '../config/functions.php';
// Yetki: Tüm roller girebilir (Kendi verisi)
yetkiKontrol(['root', 'yonetici', 'mudur', 'vardiya_amiri', 'calisan', 'stajyer', 'muhasebe', 'insan_kaynaklari']);
include '../includes/header.php';
include '../includes/menu.php';
// --- FİLTRELER ---
$yil = $_GET['yil'] ?? date('Y');
$ay = $_GET['ay'] ?? date('m');
$kullanici_id = $_SESSION['kullanici_id']; // Sadece oturum açan kişi
// --- HESAPLAMA PARAMETRELERİ ---
$gun_sayisi = cal_days_in_month(CAL_GREGORIAN, $ay, $yil);
$tarih_bas = date('Y-m-01', strtotime("$yil-$ay-01"));
$tarih_bit = date('Y-m-t', strtotime("$yil-$ay-01"));
// Tatilleri Çek
$stmt_tatil = $pdo->query("SELECT tarih FROM resmi_tatiller");
$tatiller = $stmt_tatil->fetchAll(PDO::FETCH_COLUMN);
// Kullanıcı Bilgileri
$stmt_u = $pdo->prepare("SELECT * FROM kullanicilar WHERE id = ?");
$stmt_u->execute([$kullanici_id]);
$u = $stmt_u->fetch();
if(!$u) die("Kullanıcı bulunamadı.");
// --- MAAŞ HESAPLAMA MOTORU (Yönetici Ekranıyla Birebir Aynı) ---
$maas_db = maasGetir($pdo, $kullanici_id, $yil, $ay);
$hakedis_tablosu = [];
if($maas_db > 0) {
$gunluk_ucret = $maas_db / 30;
$saatlik = $maas_db / 225;
$k15 = 0; $k20 = 0;
$toplam_kesinti_saat = 0;
$calisilmayan_gun_giris_cikis = 0;
// 1. Avanslar
$stmt_avans = $pdo->prepare("SELECT SUM(avans_miktari) FROM avans_hareketleri WHERE calisan_id = ? AND islem_tarihi BETWEEN ? AND ? AND durum = 'onaylandi'");
$stmt_avans->execute([$kullanici_id, $tarih_bas, $tarih_bit]);
$avans = $stmt_avans->fetchColumn() ?: 0;
// 2. İkramiyeler
$stmt_ikr = $pdo->prepare("SELECT SUM(miktar) FROM ikramiyeler WHERE calisan_id = ? AND donem_tarihi BETWEEN ? AND ?");
$stmt_ikr->execute([$kullanici_id, $tarih_bas, $tarih_bit]);
$ikramiye = $stmt_ikr->fetchColumn() ?: 0;
$ise_giris = $u['ise_giris_tarihi'];
$isten_cikis = $u['isten_cikis_tarihi'];
// GÜNLÜK DÖNGÜ
for($d=1; $d<=$gun_sayisi; $d++) {
$tarih = "$yil-$ay-" . sprintf('%02d', $d);
$gun_no = date('N', strtotime($tarih)); // 1:Pzt ... 6:Cmt, 7:Pzr
// A. AKTİFLİK KONTROLÜ (Kıst Gün)
$aktif_mi = true;
if ($tarih < $ise_giris) $aktif_mi = false;
elseif (!empty($isten_cikis) && $tarih > $isten_cikis) $aktif_mi = false;
if (!$aktif_mi) {
$calisilmayan_gun_giris_cikis++;
continue;
}
$is_tatil = in_array($tarih, $tatiller);
$is_calisma_gunu = ($gun_no < 6 && !$is_tatil);
// B. İZİN KONTROLÜ (Çoklu İzin Desteği - fetchAll)
$gunluk_ham_kesinti = 0;
$stmt_izin = $pdo->prepare("SELECT * FROM izin_talepleri WHERE calisan_id=? AND durum='onaylandi' AND ? BETWEEN DATE(baslangic_tarihi) AND DATE(bitis_tarihi)");
$stmt_izin->execute([$kullanici_id, $tarih]);
$izinler = $stmt_izin->fetchAll(); // <-- ÖNEMLİ: fetchAll yapıldı.
foreach ($izinler as $izin) {
// Sadece ücretsiz/kesintili türler ve çalışma günleri
$ucretsiz_turler = ['hastalik', 'saatlik', 'ucretsiz', 'mazeret', 'mesaiye_gelmedi'];
if ($is_calisma_gunu && in_array($izin['izin_turu'], $ucretsiz_turler)) {
if ($izin['izin_turu'] == 'saatlik' || $izin['izin_turu'] == 'mesaiye_gelmedi') {
// Saatlik kesintileri topla
$gunluk_ham_kesinti += (float)$izin['saatlik_sure'];
} else {
// Tam gün kesintiler (Hastalık vb.) -> 9 saat
$gunluk_ham_kesinti = 9;
}
}
// Süt izni (sut_izni) buraya girmez, dolayısıyla kesinti yapmaz.
}
// Günlük maksimum kesinti kontrolü (9 saati geçemez)
if ($gunluk_ham_kesinti > 9) $gunluk_ham_kesinti = 9;
// C. MESAİ KONTROLÜ (Kazanç)
$gunluk_ham_mesai = 0;
$stmt_mesai = $pdo->prepare("SELECT SUM(toplam_saat) as toplam, mesai_turu FROM mesai_hareketleri WHERE calisan_id=? AND durum='onaylandi' AND tarih=? AND mesai_turu IN ('fazla_mesai', 'hafta_tatili', 'resmi_tatil_mesaisi', 'vardiya_gece')");
$stmt_mesai->execute([$kullanici_id, $tarih]);
$mesai_kaydi = $stmt_mesai->fetch();
if ($mesai_kaydi && $mesai_kaydi['toplam'] > 0) {
$gunluk_ham_mesai = (float)$mesai_kaydi['toplam'];
}
// D. MAHSUPLAŞMA (Fazla mesai - Eksik saat)
$net_kesinti = $gunluk_ham_kesinti;
$net_mesai = $gunluk_ham_mesai;
if ($gunluk_ham_kesinti > 0 && $gunluk_ham_mesai > 0) {
if ($gunluk_ham_mesai >= $gunluk_ham_kesinti) {
$net_mesai = $gunluk_ham_mesai - $gunluk_ham_kesinti;
$net_kesinti = 0;
} else {
$net_kesinti = $gunluk_ham_kesinti - $gunluk_ham_mesai;
$net_mesai = 0;
}
}
if ($net_kesinti > 0) $toplam_kesinti_saat += $net_kesinti;
if ($net_mesai > 0) {
$mesai_tur = $mesai_kaydi['mesai_turu'] ?? '';
// KURAL: Pazar (7) veya Resmi Tatil -> 2.0x
// KURAL: Cumartesi (6) veya Hafta içi -> 1.5x
if ($is_tatil || $gun_no == 7 || $mesai_tur == 'resmi_tatil_mesaisi') {
$k20 += $net_mesai;
} else {
$k15 += $net_mesai;
}
}
}
// SONUÇLAR
$kist_kesinti_tutar = $calisilmayan_gun_giris_cikis * $gunluk_ucret;
$ek_kazanc = ($k15 * $saatlik * 1.5) + ($k20 * $saatlik * 2.0);
$izin_kesinti_tutar = ($toplam_kesinti_saat * $saatlik);
// YENİ: Toplam Aylık Gelir (Maaş + Mesai + İkramiye)
$toplam_gelir = $maas_db + $ek_kazanc + $ikramiye;
$toplam_kesinti = $izin_kesinti_tutar + $avans + $kist_kesinti_tutar;
// NET HAKEDİŞ FORMÜLÜ: Toplam Gelir - Kesintiler
$toplam_hakedis = $toplam_gelir - $toplam_kesinti;
if ($toplam_hakedis < 0) $toplam_hakedis = 0;
$hakedis_tablosu = [
'net_maas' => $maas_db,
'k15' => $k15,
'k20' => $k20,
'ek_kazanc' => $ek_kazanc,
'ikramiye' => $ikramiye,
'toplam_gelir' => $toplam_gelir,
'kesinti_saat' => $toplam_kesinti_saat,
'kist_gun' => $calisilmayan_gun_giris_cikis,
'kist_tutar' => $kist_kesinti_tutar,
'izin_tutar' => $izin_kesinti_tutar,
'avans' => $avans,
'toplam_hakedis' => $toplam_hakedis
];
}
?>
<div class="container-fluid pb-5">
<div class="d-flex justify-content-between align-items-center mb-4 no-print">
<h3><i class="fas fa-file-invoice-dollar text-primary"></i> Maaş Bordrom</h3>
</div>
<div class="card bg-light border mb-4 no-print">
<div class="card-body p-3">
<form method="GET" class="row g-2 align-items-end">
<div class="col-md-3">
<label class="fw-bold small">Dönem Seçiniz</label>
<div class="input-group">
<select name="ay" class="form-select">
<?php
$aylar = ['01'=>'Ocak','02'=>'Şubat','03'=>'Mart','04'=>'Nisan','05'=>'Mayıs','06'=>'Haziran','07'=>'Temmuz','08'=>'Ağustos','09'=>'Eylül','10'=>'Ekim','11'=>'Kasım','12'=>'Aralık'];
foreach($aylar as $k=>$v) echo "<option value='$k' ".($k==$ay?'selected':'').">$v</option>";
?>
</select>
<select name="yil" class="form-select">
<?php for($y=2024; $y<=2030; $y++) echo "<option value='$y' ".($y==$yil?'selected':'').">$y</option>"; ?>
</select>
<button type="submit" class="btn btn-primary">Getir</button>
</div>
</div>
</form>
</div>
</div>
<?php if(empty($hakedis_tablosu)): ?>
<div class="alert alert-warning text-center p-5">
<h4><i class="fas fa-exclamation-circle"></i> Maaş Bilgisi Bulunamadı</h4>
<p>Seçilen dönem için maaş veriniz tanımlanmamış olabilir.</p>
</div>
<?php else: ?>
<div class="card shadow-lg border-0" id="printableArea">
<div class="card-header bg-white border-bottom-0 pt-4 pb-0">
<div class="d-flex justify-content-between align-items-center border-bottom pb-3">
<div class="d-flex align-items-center">
<img src="../assets/img/logo.png" alt="Logo" style="height: 50px;" class="me-3">
<div>
<h4 class="mb-0 fw-bold text-uppercase">Personel Maaş Bordrosu</h4>
<span class="text-muted small"><?php echo $aylar[$ay] . ' ' . $yil; ?> Dönemi</span>
</div>
</div>
<div class="text-end">
<h5 class="fw-bold mb-0"><?php echo htmlspecialchars($u['ad'] . ' ' . $u['soyad']); ?></h5>
<span class="badge bg-light text-dark border"><?php echo htmlspecialchars($u['rol']); ?></span>
</div>
</div>
</div>
<div class="card-body p-4">
<div class="row mb-4">
<div class="col-md-6">
<div class="card h-100 border-success">
<div class="card-header bg-success text-white fw-bold">KAZANÇLAR (+)</div>
<ul class="list-group list-group-flush">
<li class="list-group-item d-flex justify-content-between">
<span><i class="fas fa-wallet text-secondary me-2"></i> Net Maaş</span>
<span class="fw-bold"><?php echo number_format($hakedis_tablosu['net_maas'], 2); ?> ₺</span>
</li>
<li class="list-group-item d-flex justify-content-between">
<span><i class="fas fa-clock text-secondary me-2"></i> Fazla Mesai (1.5x) <small class="text-muted">(<?php echo $hakedis_tablosu['k15']; ?> Saat)</small></span>
<span>Dahil</span>
</li>
<li class="list-group-item d-flex justify-content-between">
<span><i class="fas fa-calendar-check text-secondary me-2"></i> Tatil Mesaisi (2.0x) <small class="text-muted">(<?php echo $hakedis_tablosu['k20']; ?> Saat)</small></span>
<span>Dahil</span>
</li>
<li class="list-group-item d-flex justify-content-between" style="background-color: #fffde7;">
<span><i class="fas fa-gift text-warning me-2"></i> İkramiye / Prim</span>
<span class="fw-bold text-success">+<?php echo number_format($hakedis_tablosu['ikramiye'], 2); ?> ₺</span>
</li>
<li class="list-group-item d-flex justify-content-between bg-success bg-opacity-10">
<span class="fw-bold text-success">Toplam Mesai Kazancı</span>
<span class="fw-bold text-success">+<?php echo number_format($hakedis_tablosu['ek_kazanc'], 2); ?> ₺</span>
</li>
<li class="list-group-item d-flex justify-content-between bg-primary bg-opacity-25">
<span class="fw-bold text-primary">TOPLAM AYLIK GELİR</span>
<span class="fw-bold text-primary"><?php echo number_format($hakedis_tablosu['toplam_gelir'], 2); ?> ₺</span>
</li>
</ul>
</div>
</div>
<div class="col-md-6">
<div class="card h-100 border-danger">
<div class="card-header bg-danger text-white fw-bold">KESİNTİLER (-)</div>
<ul class="list-group list-group-flush">
<li class="list-group-item d-flex justify-content-between">
<span><i class="fas fa-user-clock text-secondary me-2"></i> Eksik Gün / Kıst <small class="text-muted">(<?php echo $hakedis_tablosu['kist_gun']; ?> Gün)</small></span>
<span class="text-danger">-<?php echo number_format($hakedis_tablosu['kist_tutar'], 2); ?> ₺</span>
</li>
<li class="list-group-item d-flex justify-content-between">
<span><i class="fas fa-door-open text-secondary me-2"></i> Ücretsiz İzin / Devamsızlık <small class="text-muted">(<?php echo $hakedis_tablosu['kesinti_saat']; ?> Saat)</small></span>
<span class="text-danger">-<?php echo number_format($hakedis_tablosu['izin_tutar'], 2); ?> ₺</span>
</li>
<li class="list-group-item d-flex justify-content-between">
<span><i class="fas fa-hand-holding-dollar text-secondary me-2"></i> Avans</span>
<span class="text-danger">-<?php echo number_format($hakedis_tablosu['avans'], 2); ?> ₺</span>
</li>
<li class="list-group-item d-flex justify-content-between bg-danger bg-opacity-10">
<span class="fw-bold text-danger">Toplam Kesinti</span>
<span class="fw-bold text-danger">-<?php echo number_format($hakedis_tablosu['kist_tutar'] + $hakedis_tablosu['izin_tutar'] + $hakedis_tablosu['avans'], 2); ?> ₺</span>
</li>
</ul>
</div>
</div>
</div>
<div class="alert alert-secondary border-dark border-2 p-4">
<div class="d-flex justify-content-between align-items-center">
<div>
<h5 class="mb-0 text-uppercase fw-bold text-dark">Net Ödenecek Tutar</h5>
<small class="text-muted">Banka hesabınıza yatırılacak tutardır.</small>
</div>
<div class="display-6 fw-bold text-dark">
<?php echo number_format($hakedis_tablosu['toplam_hakedis'], 2); ?> <span class="fs-4">₺</span>
</div>
</div>
</div>
</div>
</div>
<?php endif; ?>
</div>
<?php include '../includes/footer.php'; ?>
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