sys/veri_detay/#008

PYBS (Personel Yönetim Bilgi Sistemi)

Son Senkronizasyon: 16.12.2025
mali-rapor.php 293 satır • 13.84 KB
<?php
// modules/mali-rapor.php
session_start();
require_once '../config/db.php';
require_once '../config/functions.php';

// Yetki
yetkiKontrol(['root', 'yonetici', 'muhasebe', 'insan_kaynaklari']);

include '../includes/header.php';
include '../includes/menu.php';

// --- FİLTRELEME PARAMETRELERİ ---
$filtre_durum = $_GET['filtre'] ?? 'aktif'; // Varsayılan: Aktif Dönem
$secilen_ay = $_GET['ay'] ?? date('m');
$secilen_yil = $_GET['yil'] ?? date('Y');

// Hesaplama yapılacak dönemi belirle
if ($filtre_durum == 'aktif') {
    $hesap_ay = date('m');
    $hesap_yil = date('Y');
} else {
    $hesap_ay = $secilen_ay;
    $hesap_yil = $secilen_yil;
}

// --- HESAPLAMA MOTORU ---
$gun_sayisi = cal_days_in_month(CAL_GREGORIAN, $hesap_ay, $hesap_yil);
$tatiller = $pdo->query("SELECT tarih FROM resmi_tatiller")->fetchAll(PDO::FETCH_COLUMN);
$tarih_bas = date('Y-m-01', strtotime("$hesap_yil-$hesap_ay-01"));
$tarih_bit = date('Y-m-t', strtotime("$hesap_yil-$hesap_ay-01"));

// Personel Listesi
$personeller = $pdo->query("SELECT id, ad, soyad, rol, ise_giris_tarihi, isten_cikis_tarihi FROM kullanicilar WHERE rol != 'root' ORDER BY ad ASC")->fetchAll();

$mali_veriler = [];
$g_maas = 0; $g_mesai_tutar = 0; $g_kesinti_tutar = 0; $g_avans = 0; $g_odenecek = 0;

foreach ($personeller as $p) {
    // --- GÜNCELLEME: AKTİFLİK KONTROLÜ (Maas Hesapla ile Tutarlılık) ---
    // Eğer personel işe giriş tarihi rapor ayının bitişinden sonraysa VEYA işten çıkış tarihi rapor ayının başından önceyse bu personeli dahil etme.
    if ($p['ise_giris_tarihi'] > $tarih_bit) continue; 
    if (!empty($p['isten_cikis_tarihi']) && $p['isten_cikis_tarihi'] < $tarih_bas) continue;

    // 1. Tarihsel Maaş (O dönemdeki maaşını bul)
    $maas_db = maasGetir($pdo, $p['id'], $hesap_yil, $hesap_ay);
    if ($maas_db <= 0) continue; 

    $gunluk_ucret = $maas_db / 30;
    $saatlik_ucret = $maas_db / 225;
    
    $k15 = 0; $k20 = 0; $toplam_kesinti_saat = 0; $calisilmayan_gun = 0;

    $avans = $pdo->query("SELECT SUM(avans_miktari) FROM avans_hareketleri WHERE calisan_id={$p['id']} AND islem_tarihi BETWEEN '$tarih_bas' AND '$tarih_bit' AND durum='onaylandi'")->fetchColumn() ?: 0;

    $ise_giris = $p['ise_giris_tarihi'];
    $isten_cikis = $p['isten_cikis_tarihi'];

    for($d=1; $d<=$gun_sayisi; $d++) {
        $tarih = "$hesap_yil-$hesap_ay-" . sprintf('%02d', $d);
        $gun_no = date('N', strtotime($tarih)); 
        
        // A. AKTİFLİK (Kıst Maaş Gün Bazlı Kontrol)
        $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++; continue; }

        $is_tatil = in_array($tarih, $tatiller);
        $is_haftasonu = ($gun_no >= 6);
        $is_calisma_gunu = ($gun_no < 6 && !$is_tatil);

        // B. İZİN
        $izin = $pdo->query("SELECT * FROM izin_talepleri WHERE calisan_id={$p['id']} AND durum='onaylandi' AND '$tarih' BETWEEN DATE(baslangic_tarihi) AND DATE(bitis_tarihi)")->fetch();
        $gunluk_ham_kesinti = 0;

        if ($izin) {
            // SADECE ÜCRETSİZLER KESİLİR (Diğer ve Yıllık Çıkarıldı)
            $ucretsizler = ['hastalik', 'saatlik', 'mazeret', 'ucretsiz', 'mesaiye_gelmedi'];
            if (in_array($izin['izin_turu'], $ucretsizler) && $is_calisma_gunu) {
                if ($izin['izin_turu'] == 'saatlik' || $izin['izin_turu'] == 'mesaiye_gelmedi') {
                    $gunluk_ham_kesinti = (float)$izin['saatlik_sure'];
                } else {
                    $bas_saat = date('H:i', strtotime($izin['baslangic_tarihi']));
                    if (date('Y-m-d', strtotime($izin['baslangic_tarihi'])) == $tarih) {
                        if ($bas_saat == '08:00') $gunluk_ham_kesinti = 9;
                        elseif ($bas_saat >= '13:00') $gunluk_ham_kesinti = 5; 
                        else {
                            $diff = (strtotime('18:00') - strtotime($bas_saat)) / 3600;
                            $gunluk_ham_kesinti = ($diff > 0) ? $diff : 9;
                        }
                    } else {
                        $gunluk_ham_kesinti = 9; 
                    }
                }
            }
        }

        // C. MESAİ
        $mesai = $pdo->query("SELECT SUM(toplam_saat) as toplam, mesai_turu 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', 'vardiya_gece')")->fetch();
        $gunluk_ham_mesai = ($mesai && $mesai['toplam'] > 0) ? (float)$mesai['toplam'] : 0;

        // D. MAHSUPLAŞMA
        $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) {
            if ($is_haftasonu || $is_tatil || $mesai['mesai_turu'] == 'resmi_tatil_mesaisi' || $mesai['mesai_turu'] == 'hafta_tatili') $k20 += $net_mesai; 
            else $k15 += $net_mesai;
        }
    }

    // SONUÇLAR
    $mesai_hakedis = ($k15 * $saatlik_ucret * 1.5) + ($k20 * $saatlik_ucret * 2.0);
    $izin_kesinti_tutar = ($toplam_kesinti_saat * $saatlik_ucret);
    $kist_kesinti_tutar = $calisilmayan_gun * $gunluk_ucret;
    $toplam_kesinti = $izin_kesinti_tutar + $kist_kesinti_tutar;
    
    $net_odenecek = $maas_db + $mesai_hakedis - $toplam_kesinti - $avans;
    if($net_odenecek < 0) $net_odenecek = 0;

    // GLOBAL TOPLAM
    $g_maas += $maas_db;
    $g_mesai_tutar += $mesai_hakedis;
    $g_kesinti_tutar += $toplam_kesinti;
    $g_avans += $avans;
    $g_odenecek += $net_odenecek;

    $mali_veriler[] = [
        'ad_soyad' => $p['ad'].' '.$p['soyad'],
        'rol' => $p['rol'],
        'net_maas' => $maas_db,
        'mesai_15_saat' => $k15,
        'mesai_20_saat' => $k20,
        'mesai_hakedis' => $mesai_hakedis,
        'top_kesinti' => $toplam_kesinti, 
        'avans' => $avans,
        'odenecek' => $net_odenecek
    ];
}
?>

<div class="container-fluid">
    <div class="d-flex justify-content-between align-items-center mb-4">
        <h3><i class="fas fa-chart-pie text-primary me-2"></i> Mali Rapor Merkezi</h3>
        <div class="btn-group">
            <a href="mali-rapor-indirme.php?format=excel&filtre=<?php echo $filtre_durum; ?>&ay=<?php echo $secilen_ay; ?>&yil=<?php echo $secilen_yil; ?>" target="_blank" class="btn btn-success"><i class="fas fa-file-excel me-2"></i> Excel İndir</a>
            <a href="mali-rapor-indirme.php?format=pdf&filtre=<?php echo $filtre_durum; ?>&ay=<?php echo $secilen_ay; ?>&yil=<?php echo $secilen_yil; ?>" target="_blank" class="btn btn-danger"><i class="fas fa-file-pdf me-2"></i> PDF Yazdır</a>
        </div>
    </div>

    <div class="card bg-light border mb-4">
        <div class="card-body p-3">
            <form method="GET" class="row g-2 align-items-end">
                <div class="col-md-3">
                    <label class="small fw-bold">Görünüm Seçenekleri</label>
                    <select name="filtre" id="filtreSecim" class="form-select form-select-sm" onchange="filtreDegisti()">
                        <option value="aktif" <?php echo $filtre_durum=='aktif'?'selected':''; ?>>Aktif (Cari) Dönem</option>
                        <option value="tarih" <?php echo $filtre_durum=='tarih'?'selected':''; ?>>Dönem Seç (Arşiv)</option>
                    </select>
                </div>
                <div class="col-md-4 tarih-secimi" style="<?php echo $filtre_durum=='tarih'?'':'display:none;'; ?>">
                    <label class="small fw-bold">Dönem Seçiniz</label>
                    <div class="input-group input-group-sm">
                        <select name="ay" class="form-select">
                            <?php 
                            $aylar_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'];
                            foreach($aylar_tr as $k => $v) echo "<option value='$k' ".($k==$secilen_ay?'selected':'').">$v</option>"; 
                            ?>
                        </select>
                        <select name="yil" class="form-select">
                            <?php for($y=2024; $y<=date('Y')+1; $y++) echo "<option value='$y' ".($y==$secilen_yil?'selected':'').">$y</option>"; ?>
                        </select>
                    </div>
                </div>
                <div class="col-md-2">
                    <button type="submit" class="btn btn-primary btn-sm w-100"><i class="fas fa-filter"></i> Uygula</button>
                </div>
            </form>
        </div>
    </div>

    <div class="row g-3 mb-4">
        <div class="col-md-3">
            <div class="card bg-primary text-white border-0 shadow-sm">
                <div class="card-body">
                    <h6 class="card-title text-white-50">Toplam Maaş Yükü</h6>
                    <h3><?php echo number_format($g_maas, 2); ?> ₺</h3>
                </div>
            </div>
        </div>
        <div class="col-md-3">
            <div class="card bg-success text-white border-0 shadow-sm">
                <div class="card-body">
                    <h6 class="card-title text-white-50">Mesai Ödemesi</h6>
                    <h3>+<?php echo number_format($g_mesai_tutar, 2); ?> ₺</h3>
                </div>
            </div>
        </div>
        <div class="col-md-3">
            <div class="card bg-danger text-white border-0 shadow-sm">
                <div class="card-body">
                    <h6 class="card-title text-white-50">Toplam Kesintiler</h6>
                    <h3>-<?php echo number_format($g_kesinti_tutar + $g_avans, 2); ?> ₺</h3>
                </div>
            </div>
        </div>
        <div class="col-md-3">
            <div class="card bg-dark text-white border-0 shadow-sm">
                <div class="card-body">
                    <h6 class="card-title text-white-50">NET ÖDENECEK</h6>
                    <h3><?php echo number_format($g_odenecek, 2); ?> ₺</h3>
                </div>
            </div>
        </div>
    </div>

    <div class="card border-0 shadow-sm">
        <div class="card-body p-0">
            <div class="table-responsive">
                <table class="table table-striped table-hover align-middle mb-0 text-center">
                    <thead class="table-dark">
                        <tr>
                            <th class="text-start ps-3">Personel</th>
                            <th>Baz Maaş</th>
                            <th>1.5x Mesai</th>
                            <th>2.0x Mesai</th>
                            <th>Mesai Tutar</th>
                            <th>Kesinti (Tümü)</th>
                            <th>Net Hakediş</th>
                            <th>Avans</th>
                            <th class="bg-primary border-start">ÖDENECEK</th>
                        </tr>
                    </thead>
                    <tbody>
                        <?php foreach($mali_veriler as $m): 
                            $net_hakedis_ara = $m['net_maas'] + $m['mesai_hakedis'] - $m['top_kesinti'];
                        ?>
                        <tr>
                            <td class="text-start ps-3 fw-bold">
                                <?php echo $m['ad_soyad']; ?><br>
                                <span class="badge bg-light text-dark fw-normal border"><?php echo $m['rol']; ?></span>
                            </td>
                            <td><?php echo number_format($m['net_maas'], 2); ?> ₺</td>
                            <td><?php echo $m['mesai_15_saat']; ?> s</td>
                            <td><?php echo $m['mesai_20_saat']; ?> s</td>
                            <td class="text-success fw-bold">+<?php echo number_format($m['mesai_hakedis'], 2); ?> ₺</td>
                            <td class="text-danger fw-bold">-<?php echo number_format($m['top_kesinti'], 2); ?> ₺</td>
                            <td class="fw-bold"><?php echo number_format($net_hakedis_ara, 2); ?> ₺</td>
                            <td class="text-danger">-<?php echo number_format($m['avans'], 2); ?> ₺</td>
                            <td class="bg-primary text-white fw-bold fs-5"><?php echo number_format($m['odenecek'], 2); ?> ₺</td>
                        </tr>
                        <?php endforeach; ?>
                    </tbody>
                    <tfoot class="table-light fw-bold">
                        <tr>
                            <td class="text-start ps-3">GENEL TOPLAM</td>
                            <td><?php echo number_format($g_maas, 2); ?> ₺</td>
                            <td colspan="2" class="text-center">-</td>
                            <td class="text-success">+<?php echo number_format($g_mesai_tutar, 2); ?> ₺</td>
                            <td class="text-danger">-<?php echo number_format($g_kesinti_tutar, 2); ?> ₺</td>
                            <td>-</td>
                            <td class="text-danger">-<?php echo number_format($g_avans, 2); ?> ₺</td>
                            <td class="bg-dark text-white"><?php echo number_format($g_odenecek, 2); ?> ₺</td>
                        </tr>
                    </tfoot>
                </table>
            </div>
        </div>
    </div>
</div>

<script>
function filtreDegisti() {
    const val = document.getElementById('filtreSecim').value;
    const tarihDiv = document.querySelector('.tarih-secimi');
    tarihDiv.style.display = (val === 'tarih') ? 'block' : 'none';
}
</script>

<?php include '../includes/footer.php'; ?>
DATA_PAYLOAD (Açıklama)
Kapak

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

9,356
Sinyal (Ağ Hiti)
1.54 MB
Kapasite

Ağda Paylaş