PYBS (Personel Yönetim Bilgi Sistemi) / modules/mali-rapor.php
mali-rapor.php 264 satır • 12.83 KB
<?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'; ?>