PYBS (Personel Yönetim Bilgi Sistemi) / Ramsa/modules/tum-mesailer-rapor.php
tum-mesailer-rapor.php 213 satır • 8.94 KB
<?php
// modules/tum-mesailer-rapor.php
session_start();
require_once '../config/db.php';
require_once '../config/functions.php';

yetkiKontrol(['root', 'yonetici', 'mudur', 'vardiya_amiri', 'muhasebe', 'insan_kaynaklari']);

// --- PARAMETRELER ---
$format = $_GET['format'] ?? 'print';
$kullanici_id = $_SESSION['kullanici_id'];
$rol = $_SESSION['rol'];
$yuksek_yetki = in_array($rol, ['root', 'muhasebe', 'insan_kaynaklari']);

// Filtre Değerleri
$filtre_durum = $_GET['filtre'] ?? 'aktif';
$filtre_personel_id = isset($_GET['personel_id']) ? (int)$_GET['personel_id'] : 0;
$secilen_yil = $_GET['yil'] ?? date('Y');
$secilen_ay = $_GET['ay'] ?? date('m');

date_default_timezone_set('Europe/Istanbul'); 
$rapor_tarihi_saati = date('d.m.Y H:i');
$ay_isimleri = ['01'=>'OCAK','02'=>'ŞUBAT','03'=>'MART','04'=>'NİSAN','05'=>'MAYIS','06'=>'HAZİRAN','07'=>'TEMMUZ','08'=>'AĞUSTOS','09'=>'EYLÜL','10'=>'EKİM','11'=>'KASIM','12'=>'ARALIK'];

// --- BAŞLIK OLUŞTURMA ---
$baslik_ek = "";
$donem_ek = "";

// Personel İsmi Başlıkta
if ($filtre_personel_id > 0) {
    $stmt_p = $pdo->prepare("SELECT ad, soyad FROM kullanicilar WHERE id = ?");
    $stmt_p->execute([$filtre_personel_id]);
    $p_bilgi = $stmt_p->fetch();
    if($p_bilgi) $baslik_ek = $p_bilgi['ad'] . " " . $p_bilgi['soyad'] . " - ";
}

// Dönem Bilgisi Başlıkta
if ($filtre_durum == 'aktif') {
    $donem_ek = " (" . $ay_isimleri[date('m')] . " " . date('Y') . ")";
} elseif ($filtre_durum == 'tarih') {
    $donem_ek = " (" . $ay_isimleri[sprintf('%02d', $secilen_ay)] . " " . $secilen_yil . ")";
} else {
    $donem_ek = " (TÜM GEÇMİŞ)";
}

$rapor_basligi = $baslik_ek . "PERSONEL MESAİ RAPORU" . $donem_ek;

// --- SQL SORGUSU HAZIRLAMA ---
$sql = "SELECT m.*, k.ad, k.soyad, k.rol as k_rol, k.tc_no, 
        o.ad as o_ad, o.soyad as o_soyad,
        y.ad as y_ad, y.soyad as y_soyad
        FROM mesai_hareketleri m 
        JOIN kullanicilar k ON m.calisan_id = k.id 
        LEFT JOIN kullanicilar o ON m.onaylayan_id = o.id 
        LEFT JOIN kullanicilar y ON m.hedef_yonetici_id = y.id 
        WHERE 1=1 ";

$params = [];

// 1. Yetki Filtresi
if (!$yuksek_yetki) {
    $sql .= " AND m.hedef_yonetici_id = :hid ";
    $params[':hid'] = $kullanici_id;
}

// 2. Personel Filtresi
if ($filtre_personel_id > 0) {
    $sql .= " AND m.calisan_id = :pid ";
    $params[':pid'] = $filtre_personel_id;
}

// 3. Tarih Filtresi
if ($filtre_durum == 'aktif') {
    $sql .= " AND YEAR(m.tarih) = YEAR(CURDATE()) AND MONTH(m.tarih) = MONTH(CURDATE())";
} elseif ($filtre_durum == 'tarih') {
    $sql .= " AND YEAR(m.tarih) = :yil AND MONTH(m.tarih) = :ay";
    $params[':yil'] = $secilen_yil;
    $params[':ay'] = $secilen_ay;
}

$sql .= " ORDER BY m.tarih DESC";

$stmt = $pdo->prepare($sql);
$stmt->execute($params);
$mesailer = $stmt->fetchAll();

// --- EXCEL ÇIKTISI ---
if ($format == 'excel') {
    $dosya_adi = "Mesai_" . ($filtre_personel_id > 0 ? "Personel_" : "") . date('Y-m-d') . ".xls";
    header("Content-Type: application/vnd.ms-excel; charset=utf-8");
    header("Content-Disposition: attachment; filename=$dosya_adi");
    echo "\xEF\xBB\xBF"; 
    ?>
    <table border="1">
        <thead>
            <tr style="background:#eee;">
                <th>Personel</th><th>Tarih</th><th>Saat Aralığı</th><th>Brüt Süre</th><th>Net (Çalışılan)</th><th>Katsayı</th><th>Hakediş (Ödenecek)</th><th>Tür</th><th>Durum</th><th>İşlem Yapan / Yönetici</th>
            </tr>
        </thead>
        <tbody>
            <?php foreach($mesailer as $m): 
                $brut = (float)$m['toplam_saat'];
                
                // Kesinti Sorgusu
                $kesinti = 0;
                $sql_izin = "SELECT izin_turu, saatlik_sure FROM izin_talepleri WHERE calisan_id = ? AND durum = 'onaylandi' AND ? BETWEEN DATE(baslangic_tarihi) AND DATE(bitis_tarihi)";
                $stmt_i = $pdo->prepare($sql_izin);
                $stmt_i->execute([$m['calisan_id'], $m['tarih']]);
                $izin = $stmt_i->fetch();

                if ($izin && in_array($izin['izin_turu'], ['saatlik', 'hastalik', 'ucretsiz', 'mazeret', 'diger', 'mesaiye_gelmedi'])) {
                    $kesinti = ($izin['izin_turu'] == 'saatlik') ? $izin['saatlik_sure'] : 9;
                }
                
                $net = $brut - $kesinti;
                if($net < 0) $net = 0;
                $katsayi = ($m['mesai_turu'] == 'fazla_mesai' || $m['mesai_turu'] == 'vardiya_gece') ? 1.5 : 2.0;
                $hakedis = $net * $katsayi;
                
                // Yönetici
                $islem_yapan = ($m['durum']=='beklemede') ? $m['y_ad'].' '.$m['y_soyad'].' (Bekliyor)' : $m['o_ad'].' '.$m['o_soyad'];
            ?>
            <tr>
                <td><?php echo $m['ad'].' '.$m['soyad']; ?></td>
                <td><?php echo date('d.m.Y', strtotime($m['tarih'])); ?></td>
                <td><?php echo substr($m['baslangic_saati'],0,5).'-'.substr($m['bitis_saati'],0,5); ?></td>
                <td><?php echo str_replace('.',',',$brut); ?></td>
                <td><?php echo str_replace('.',',',$net); ?></td>
                <td>x<?php echo $katsayi; ?></td>
                <td style="font-weight:bold;"><?php echo str_replace('.',',',$hakedis) . " (x$katsayi)"; ?></td>
                <td><?php echo $m['mesai_turu']; ?></td>
                <td><?php echo strtoupper($m['durum']); ?></td>
                <td><?php echo $islem_yapan; ?></td>
            </tr>
            <?php endforeach; ?>
        </tbody>
    </table>
    <?php exit;
}
?>

<!DOCTYPE html>
<html lang="tr">
<head>
    <meta charset="UTF-8">
    <title>Mesai Raporu</title>
    <style>
        body { font-family: sans-serif; font-size: 11px; padding: 20px; }
        .antet { border-bottom: 2px solid #333; margin-bottom: 20px; display: flex; justify-content: space-between; align-items: center; }
        table { width: 100%; border-collapse: collapse; margin-top: 10px; }
        th, td { border: 1px solid #ccc; padding: 6px; text-align: left; }
        th { background: #f2f2f2; }
        @media print { .no-print { display: none; } }
    </style>
</head>
<body>
    <div class="no-print" style="text-align: right; margin-bottom: 10px;">
        <button onclick="window.print()" style="padding: 5px 15px; font-weight:bold;">Yazdır / PDF</button>
    </div>
    <div class="antet">
        <img src="../assets/img/logo.png" height="50" alt="Logo">
        <div style="text-align:right;">
            <h3 style="margin:0;"><?php echo $rapor_basligi; ?></h3>
            <small>Oluşturulma: <?php echo $rapor_tarihi_saati; ?></small>
        </div>
    </div>
    <table>
        <thead>
            <tr>
                <th>Personel</th><th>Tarih</th><th>Saat Aralığı</th><th>Brüt</th><th>Net</th><th>Hakediş (Ödenecek)</th><th>Durum</th><th>İşlem Yapan</th>
            </tr>
        </thead>
        <tbody>
            <?php foreach($mesailer as $m): 
                $renk = ($m['durum']=='onaylandi') ? 'color:green; font-weight:bold;' : ($m['durum']=='reddedildi' ? 'color:red;' : '');
                
                $brut = (float)$m['toplam_saat'];
                $kesinti = 0;
                
                $sql_izin = "SELECT izin_turu, saatlik_sure FROM izin_talepleri WHERE calisan_id = ? AND durum = 'onaylandi' AND ? BETWEEN DATE(baslangic_tarihi) AND DATE(bitis_tarihi)";
                $stmt_i = $pdo->prepare($sql_izin);
                $stmt_i->execute([$m['calisan_id'], $m['tarih']]);
                $izin = $stmt_i->fetch();

                if ($izin && in_array($izin['izin_turu'], ['saatlik', 'hastalik', 'ucretsiz', 'mazeret', 'diger', 'mesaiye_gelmedi'])) {
                    $kesinti = ($izin['izin_turu'] == 'saatlik') ? $izin['saatlik_sure'] : 9;
                }
                
                $net = $brut - $kesinti;
                if($net < 0) $net = 0;
                $katsayi = ($m['mesai_turu'] == 'fazla_mesai' || $m['mesai_turu'] == 'vardiya_gece') ? 1.5 : 2.0;
                $hakedis = $net * $katsayi;
                
                $islem_yapan = ($m['durum']=='beklemede') ? $m['y_ad'].' '.$m['y_soyad'] : $m['o_ad'].' '.$m['o_soyad'];
            ?>
            <tr>
                <td><?php echo $m['ad'].' '.$m['soyad']; ?></td>
                <td><?php echo date('d.m.Y', strtotime($m['tarih'])); ?></td>
                <td><?php echo substr($m['baslangic_saati'],0,5).'-'.substr($m['bitis_saati'],0,5); ?></td>
                <td><?php echo $brut; ?> s</td>
                <td><?php echo $net; ?> s</td>
                <td style="font-weight:bold; background:#e8f5e9;"><?php echo $hakedis; ?> s (x<?php echo $katsayi; ?>)</td>
                <td style="<?php echo $renk; ?>"><?php echo strtoupper($m['durum']); ?></td>
                <td style="font-size:10px;"><?php echo $islem_yapan; ?></td>
            </tr>
            <?php endforeach; ?>
            <?php if(empty($mesailer)): ?>
                <tr><td colspan="8" style="text-align:center; padding:20px;">Kayıt bulunamadı.</td></tr>
            <?php endif; ?>
        </tbody>
    </table>
</body>
</html>