PYBS (Personel Yönetim Bilgi Sistemi) / Ramsa/modules/mali-rapor.php
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'; ?>