PYBS (Personel Yönetim Bilgi Sistemi) / Ramsa/modules/bordro-goruntule.php
bordro-goruntule.php 299 satır • 14.58 KB
<?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'; ?>