PYBS (Personel Yönetim Bilgi Sistemi)
<?php
// modules/mali-rapor.php
session_start();
require_once '../config/db.php';
require_once '../config/functions.php';
// Yetki kontrolü: Muhasebe, İK ve Yöneticiler bu paneli görebilir.
yetkiKontrol(['root', 'yonetici', 'muhasebe', 'insan_kaynaklari']);
include '../includes/header.php';
include '../includes/menu.php';
// Fonksiyonları yükle (maas-hesapla.php'den alınmıştır)
// Bu fonksiyon, saatleri listeleme amaçlı güzel bir formata dönüştürür
function formatSaatListeleme($saat) {
if ($saat === null || $saat === 0.0 || $saat === 0) return 0;
if ($saat == floor($saat)) {
return (int)$saat;
}
return number_format($saat, 1, '.', '');
}
// --- FİLTRELER ---
$yil = $_GET['yil'] ?? date('Y');
$ay = $_GET['ay'] ?? date('m');
$gun_sayisi = cal_days_in_month(CAL_GREGORIAN, $ay, $yil);
// --- KATSAYILAR (maas-hesapla.php'den alınmıştır) ---
$carpan_15 = 1.5; // Haftaiçi Fazla Mesai ve Cumartesi Mesaisi için Çarpan
$carpan_20 = 2.0; // Pazar, Resmi Tatil ve Bayram Günleri için Çarpan
// Aylık standart çalışma saati (Örn: 225 saat, 7.5 saat x 30 gün)
$aylik_std_saat = (float)($pdo->query("SELECT ayar_degeri FROM site_ayarlari WHERE ayar_anahtari = 'aylik_mesai_saati'")->fetchColumn() ?: 225.0);
// Resmi Tatilleri Çek
$tatiller = $pdo->query("SELECT tarih FROM resmi_tatiller")->fetchAll(PDO::FETCH_COLUMN);
// Personel Listesi: Root hariç, aktif personel
$sql_per = "SELECT id, ad, soyad, aylik_net_maas FROM kullanicilar WHERE durum=1 AND rol != 'root' ORDER BY ad ASC";
$personeller = $pdo->query($sql_per)->fetchAll();
// --- AYIN TARİHLERİ ---
$ay_baslangici = date('Y-m-01', strtotime("$yil-$ay-01"));
$ay_sonu = date('Y-m-t', strtotime("$yil-$ay-01"));
$ay_isimleri_tr = ['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'];
// --- VERİ TOPLAMA VE HESAPLAMA ---
$mali_veriler = [];
$genel_toplam_net_maas = 0;
$genel_toplam_mesai_hakedis = 0;
$genel_toplam_izin_kesinti = 0;
$genel_toplam_avans = 0;
$genel_toplam_odenecek = 0;
foreach ($personeller as $p) {
$p_id = $p['id'];
$net_maas = (float)$p['aylik_net_maas'];
$genel_toplam_net_maas += $net_maas;
// Geçici Mesai ve Kesinti Toplamları
$toplam_fazla_mesai_15 = 0;
$toplam_fazla_mesai_20 = 0;
$izin_kesinti_saati = 0;
// GÜNLÜK DÖNGÜ (Maaş ve Kesinti Hesaplama)
for($d=1; $d<=$gun_sayisi; $d++) {
$tarih = date('Y-m-d', strtotime("$yil-$ay-$d"));
$gun_no = date('N', strtotime($tarih));
$is_tatil = in_array($tarih, $tatiller);
// 1. İzin Kesinti Hesaplama
$izin = $pdo->query("SELECT izin_turu, saatlik_sure, baslangic_tarihi, bitis_tarihi FROM izin_talepleri
WHERE calisan_id={$p_id} AND durum='onaylandi'
AND '$tarih' BETWEEN DATE(baslangic_tarihi) AND DATE(bitis_tarihi)")->fetch();
if ($izin) {
if ($izin['izin_turu'] == 'diger') {
$izin_kesinti_saati += 9;
} elseif ($izin['izin_turu'] == 'saatlik') {
$izin_sure = (float)$izin['saatlik_sure'];
$bas_saat_str = date('H:i', strtotime($izin['baslangic_tarihi']));
$bit_saat_str = date('H:i', strtotime($izin['bitis_tarihi']));
if ($gun_no <= 5 && $bas_saat_str === '08:00' && $bit_saat_str === '12:00') {
$izin_kesinti_saati += 4.0;
} elseif ($gun_no <= 5 && $bas_saat_str === '13:00' && $bit_saat_str === '18:00') {
$izin_kesinti_saati += 5.0;
} else {
$izin_kesinti_saati += $izin_sure;
}
}
}
// 2. Fazla Mesai Hesaplama
$mesai = $pdo->query("SELECT SUM(toplam_saat) FROM mesai_hareketleri
WHERE calisan_id={$p_id} AND durum='onaylandi'
AND tarih='$tarih'
AND mesai_turu IN ('fazla_mesai', 'hafta_tatili', 'resmi_tatil_mesaisi')")->fetchColumn() ?: 0;
if ($mesai > 0) {
$is_pazar = ($gun_no == 7);
if ($is_pazar || $is_tatil) {
$toplam_fazla_mesai_20 += $mesai;
} else {
$toplam_fazla_mesai_15 += $mesai;
}
}
}
// MAAŞ VE KESİNTİ HESAPLAMA BİTİŞ
// Saatlik Net Ücret
$saatlik_net_ucret = $net_maas / $aylik_std_saat;
// Fazla Mesai Hakedişleri
$fazla_mesai_hakedis_15 = $toplam_fazla_mesai_15 * $saatlik_net_ucret * $carpan_15;
$fazla_mesai_hakedis_20 = $toplam_fazla_mesai_20 * $saatlik_net_ucret * $carpan_20;
$toplam_mesai_hakedis_tutar = $fazla_mesai_hakedis_15 + $fazla_mesai_hakedis_20;
// İzin Kesintisi
$izin_kesinti_tutar = $izin_kesinti_saati * $saatlik_net_ucret;
$toplam_kesinti_tutar = $izin_kesinti_tutar;
// 2. AVANS HESAPLAMA
$stmt_avans = $pdo->prepare("
SELECT COALESCE(SUM(avans_miktari), 0)
FROM avans_hareketleri
WHERE calisan_id = ? AND durum = 'onaylandi'
AND islem_tarihi BETWEEN ? AND ?
");
$stmt_avans->execute([$p_id, $ay_baslangici, $ay_sonu]);
$aylik_avans = (float)$stmt_avans->fetchColumn();
// 3. NET ÖDENECEK HESAPLAMA
$net_hakedis = $net_maas + $toplam_mesai_hakedis_tutar - $toplam_kesinti_tutar;
$odenecek_tutar = $net_hakedis - $aylik_avans;
// Genel Toplamları Güncelle
$genel_toplam_mesai_hakedis += $toplam_mesai_hakedis_tutar;
$genel_toplam_izin_kesinti += $izin_kesinti_tutar;
$genel_toplam_avans += $aylik_avans;
$genel_toplam_odenecek += $odenecek_tutar;
$mali_veriler[] = [
'ad_soyad' => $p['ad'] . ' ' . $p['soyad'],
'net_maas' => $net_maas,
'mesai_15_saat' => formatSaatListeleme($toplam_fazla_mesai_15),
'mesai_20_saat' => formatSaatListeleme($toplam_fazla_mesai_20),
'mesai_hakedis' => $toplam_mesai_hakedis_tutar,
'izin_kesinti_saat' => formatSaatListeleme($izin_kesinti_saati),
'izin_kesinti_tutar' => $izin_kesinti_tutar,
'avans' => $aylik_avans,
'net_hakedis' => $net_hakedis,
'odenecek' => $odenecek_tutar,
];
}
?>
<div class="container-fluid px-3">
<div class="d-flex justify-content-between align-items-center mb-4">
<h3><i class="fas fa-chart-line text-primary"></i> Mali Rapor Merkezi</h3>
<div class="btn-group">
<button type="button" onclick="submitReport('excel')" class="btn btn-sm btn-success" title="Excel İndir"><i class="fas fa-file-excel"></i> XLS İndir</button>
<button type="button" onclick="submitReport('pdf')" class="btn btn-sm btn-danger" title="PDF İndir"><i class="fas fa-file-pdf"></i> PDF İndir</button>
</div>
</div>
<div class="card border-0 shadow-sm mb-4">
<div class="card-body p-3 border-bottom">
<form method="GET" class="row g-2 align-items-end" id="filterForm">
<div class="col-6 col-md-4 col-lg-2">
<label class="small">Yıl</label>
<select name="yil" class="form-select form-select-sm">
<?php for($y=2024; $y<=date('Y'); $y++): ?>
<option value='<?php echo $y; ?>' <?php echo ($y == $yil) ? 'selected' : ''; ?>><?php echo $y; ?></option>
<?php endfor; ?>
</select>
</div>
<div class="col-6 col-md-4 col-lg-2">
<label class="small">Ay</label>
<select name="ay" class="form-select form-select-sm">
<?php foreach($ay_isimleri_tr as $k=>$v): ?>
<option value='<?php echo $k; ?>' <?php echo ($k == $ay) ? 'selected' : ''; ?>><?php echo $v; ?></option>
<?php endforeach; ?>
</select>
</div>
<div class="col-12 col-md-4 col-lg-2">
<button type="submit" class="btn btn-primary btn-sm w-100"><i class="fas fa-filter"></i> Filtrele</button>
</div>
<input type="hidden" name="reportFormat" id="reportFormat" value="">
</form>
</div>
</div>
<div class="alert alert-info shadow-sm small border-start border-primary border-5">
<h6 class="fw-bold"><i class="fas fa-info-circle me-2"></i>Bilgilendirme</h6>
<p class="mb-0">Aşağıdaki tablo, **<?php echo $ay_isimleri_tr[$ay] . ' ' . $yil; ?>** dönemi için tüm aktif personelin **Net Maaş Hakedişini** ve **Avans Kesintilerini** detaylı olarak gösterir. Tüm tutarlar net maaş üzerinden hesaplanmıştır.</p>
</div>
<div class="card border-0 shadow-sm">
<div class="table-responsive">
<table class="table table-hover table-striped align-middle mb-0 small" style="font-size: 13px;">
<thead class="table-dark">
<tr>
<th rowspan="2" class="text-start">PERSONEL</th>
<th rowspan="2" class="text-center">AYLIK NET MAAŞ</th>
<th colspan="2" class="text-center bg-secondary">FAZLA MESAİ (SAAT)</th>
<th rowspan="2" class="text-center text-success">MESAİ HAKEDİŞİ (TL)</th>
<th rowspan="2" class="text-center text-danger">İZİN KESİNTİSİ (TL)</th>
<th rowspan="2" class="text-center">NET HAKEDİŞ TOPLAMI (A+B-C)</th>
<th rowspan="2" class="text-center text-danger">AVANS KESİNTİSİ (TL)</th>
<th rowspan="2" class="text-center bg-primary text-white">ÖDENECEK TUTAR (TL)</th>
</tr>
<tr class="table-secondary">
<th class="text-center">1.5x</th>
<th class="text-center">2.0x</th>
</tr>
</thead>
<tbody>
<?php foreach($mali_veriler as $m): ?>
<tr>
<td class="text-start fw-bold"><?php echo $m['ad_soyad']; ?></td>
<td class="text-center"><?php echo number_format($m['net_maas'], 2); ?> ₺</td>
<td class="text-center"><?php echo $m['mesai_15_saat']; ?></td>
<td class="text-center"><?php echo $m['mesai_20_saat']; ?></td>
<td class="text-center text-success fw-bold">+<?php echo number_format($m['mesai_hakedis'], 2); ?> ₺</td>
<td class="text-center text-danger fw-bold">-<?php echo number_format($m['izin_kesinti_tutar'], 2); ?> ₺</td>
<td class="text-center fw-bold"><?php echo number_format($m['net_hakedis'], 2); ?> ₺</td>
<td class="text-center text-danger fw-bold">-<?php echo number_format($m['avans'], 2); ?> ₺</td>
<td class="text-center bg-primary text-white fw-bold h6 mb-0"><?php echo number_format($m['odenecek'], 2); ?> ₺</td>
</tr>
<?php endforeach; ?>
<tr class="table-warning border-top border-4 border-dark">
<td class="text-start fw-bold h6">TOPLAM</td>
<td class="text-center fw-bold h6"><?php echo number_format($genel_toplam_net_maas, 2); ?> ₺</td>
<td colspan="2" class="text-center fw-bold h6 bg-secondary text-white">GENEL TOPLAMLAR</td>
<td class="text-center text-success fw-bold h6">+<?php echo number_format($genel_toplam_mesai_hakedis, 2); ?> ₺</td>
<td class="text-center text-danger fw-bold h6">-<?php echo number_format($genel_toplam_izin_kesinti, 2); ?> ₺</td>
<td class="text-center fw-bold h6"><?php echo number_format($genel_toplam_net_maas + $genel_toplam_mesai_hakedis - $genel_toplam_izin_kesinti, 2); ?> ₺</td>
<td class="text-center text-danger fw-bold h6">-<?php echo number_format($genel_toplam_avans, 2); ?> ₺</td>
<td class="text-center bg-primary text-white fw-bold h5 mb-0"><?php echo number_format($genel_toplam_odenecek, 2); ?> ₺</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<script>
function submitReport(type) {
const yil = document.querySelector('select[name="yil"]').value;
const ay = document.querySelector('select[name="ay"]').value;
// Raporlama aksiyonunu mali-rapor-indirme.php dosyasına yönlendir
// İndirme dosyasını, karışmaması için ayrı bir dosya olarak tasarlayacağız.
let url = 'mali-rapor-indirme.php?yil=' + yil + '&ay=' + ay + '&format=' + type;
window.open(url, '_blank');
}
</script>
<?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