sys/veri_detay/#008

PYBS (Personel Yönetim Bilgi Sistemi)

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

// Yetkili Roller: Root, Yönetici, Muhasebe, İnsan Kaynakları
yetkiKontrol(['root', 'yonetici', 'muhasebe', 'insan_kaynaklari']);

// Fonksiyonları yükle (mali-rapor.php'den alınmıştı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 VE PARAMETRELER ---
$yil = guvenlik($_GET['yil'] ?? date('Y'));
$ay = guvenlik($_GET['ay'] ?? date('m'));
$format = guvenlik($_GET['format'] ?? 'print'); // 'excel' veya 'pdf' (print)

// Rapor tarihi, saat ve zaman dilimi ayarı
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
$baslik = "MERKEZİ MALİ RAPOR - " . $ay_isimleri[$ay] . " " . $yil;

$ay_baslangici = date('Y-m-01', strtotime("$yil-$ay-01"));
$ay_sonu = date('Y-m-t', strtotime("$yil-$ay-01"));

// --- KATSAYILAR ---
$carpan_15 = 1.5; 
$carpan_20 = 2.0; 
// Maaş hesaplama mantığı maas-hesapla.php'den alınmıştır, aylık standart saat 225 saat varsayılır.
$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();

// --- VERİ TOPLAMA VE HESAPLAMA (MANTIK BURADA TEKRAR EDİLDİ) ---
$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)
    $gun_sayisi = cal_days_in_month(CAL_GREGORIAN, $ay, $yil);
    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Ş HESAPLAMA BİTİŞ

    $saatlik_net_ucret = $net_maas / $aylik_std_saat;
    
    $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;
    
    $izin_kesinti_tutar = $izin_kesinti_saati * $saatlik_net_ucret;
    $toplam_kesinti_tutar = $izin_kesinti_tutar;
    
    // 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();

    // 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,
    ];
}

// --- RAPOR ÇIKTI BAŞLIKLARI (Excel/PDF) ---
if ($format == 'excel') {
    header("Content-Type: application/vnd.ms-excel; charset=utf-8");
    header("Content-Disposition: attachment; filename=Mali_Rapor_{$yil}_{$ay}.xls");
    header("Pragma: no-cache");
    header("Expires: 0");
    echo "\xEF\xBB\xBF"; // BOM
} elseif ($format == 'pdf') {
    // Print/PDF çıktısı için özel CSS eklenecek ve HTML formatı kullanılacak
}

?>
<!DOCTYPE html>
<html lang="tr">
<head>
    <meta charset="UTF-8">
    <title>Ramsa Makine Sanayii - <?php echo $baslik; ?></title>
    <style>
        body { font-family: Arial, sans-serif; font-size: 10px; margin: 0; padding: 20px; }
        
        /* RAPOR ANTEPİ VE LOGO */
        .rapor-header { 
            display: flex; 
            justify-content: space-between; 
            align-items: center; 
            border-bottom: 3px solid #333; 
            padding-bottom: 10px; 
            margin-bottom: 20px;
        }
        .rapor-header img { max-height: 50px; }
        .rapor-header h1 { 
            font-size: 16px; 
            font-weight: bold; 
            margin: 0; 
            color: #333;
        }
        .rapor-header p { 
            font-size: 10px; 
            margin: 0; 
            color: #666;
        }

        /* TABLO STİLİ */
        table { width: 100%; border-collapse: collapse; margin-bottom: 20px; table-layout: fixed; }
        th, td { border: 1px solid #000; padding: 5px; text-align: center; }
        th { background-color: #ddd; font-weight: bold; }
        .text-start { text-align: left !important; }
        .text-end { text-align: right !important; }
        
        /* Satır Stilleri */
        /* BAŞLIK VE TOPLAM SATIRLARI YAZICI DOSTU VE OKUNAKLI HALE GETİRİLDİ */
        .header-row { background-color: #343a40; color: #000; } /* Yazı Siyah */
        .subheader-row { background-color: #ccc; color: #000; } /* Yazı Siyah */
        .total-row { 
            background-color: #ffc107; 
            color: #000; /* Yazı Siyah */
            font-weight: bold; 
            border: 2px solid #000; /* Çerçeveyi kalınlaştırdık */
        }
        
        /* Tekil Ödenecek Tutar Stili (Yazıcıda ve Ekranda Görünen) */
        .odenecek-tutar-cell {
            background-color: #f0f0f0; /* Açık gri zemin */
            font-weight: bold;
            font-size: 11px;
            color: #000; /* Yazı Siyah */
        }

        /* İmza Alanı Stilleri */
        .imza-blogu { display: flex; justify-content: space-around; margin-top: 50px; page-break-inside: avoid; }
        .imza-kutu { width: 25%; text-align: center; padding: 10px; }
        .imza-baslik { font-weight: bold; border-top: 1px solid #000; padding-top: 5px; margin-top: 40px; font-size: 11px; }


        /* PDF/PRINT ÖZEL STİLLER */
        @media print {
            body { -webkit-print-color-adjust: exact; print-color-adjust: exact; }
            .no-print { display: none; }
            .rapor-header { border-bottom-color: #000; }
            th { background-color: #eee !important; }
            
            /* Yazıcı Dostu Başlıklar (Renk basılmasa bile metin okunmalı) */
            .header-row { background-color: #eee !important; color: #000 !important; } 
            .subheader-row { background-color: #ddd !important; color: #000 !important; }
            .total-row { 
                background-color: #ffc107 !important; /* Sarı tonunu koru */
                color: #000 !important; /* Yazı Siyah */
                border-color: #000 !important;
            }
            
            /* Genel Toplamın Son Sütunu */
            .total-row > td:last-child { 
                background-color: #d1ecf1 !important; /* Farklı bir açık ton, zorunlu değil ama okunaklılığı artırır */
                color: #000 !important;
                border: 2px solid #000 !important;
            }
            
            /* Sayfa URL'sini gizlemek için altbilgi ayarları */
            @page { 
                size: landscape; /* Geniş tablo için yatay */
                margin: 15mm; 
                @bottom-left { content: ""; }
                @bottom-right { content: ""; }
                @top-left { content: ""; }
                @top-right { content: ""; }
            } 
        }
    </style>
</head>
<body>

    <?php if($format == 'pdf'): ?>
        <div class="no-print" style="margin-bottom: 20px;">
            <button onclick="window.print()" style="padding: 10px 20px; font-weight: bold; cursor: pointer;">🖨️ YAZDIR / PDF OLUŞTUR</button>
        </div>
    <?php endif; ?>

    <div class="rapor-header">
        <img src="../assets/img/logo.png" alt="Şirket Logosu">
        <div class="text-center">
            <h1><?php echo $baslik; ?></h1>
            <p>Rapor Tarihi: <?php echo $rapor_tarihi_saati; ?></p>
        </div>
        <div style="width: 50px;"></div>
    </div>
    
    <?php if (empty($mali_veriler)): ?>
        <div style="text-align: center; padding: 50px; border: 1px dashed #ccc;">
            Seçilen dönemde aktif personel veya mali veri bulunmamaktadır.
        </div>
    <?php else: ?>
    
        <table style="font-size: 9px;">
            <thead>
                <tr class="header-row">
                    <th rowspan="2" class="text-start" style="width: 15%;">PERSONEL</th>
                    <th rowspan="2" style="width: 10%;">AYLIK NET MAAŞ (A)</th>
                    <th colspan="2" class="subheader-row" style="width: 15%;">FAZLA MESAİ (SAAT)</th>
                    <th rowspan="2" style="width: 10%;">MESAİ HAKEDİŞİ (B)</th>
                    <th rowspan="2" style="width: 10%;">İZİN/KESİNTİ (C)</th>
                    <th rowspan="2" style="width: 10%;">NET HAKEDİŞ (A+B-C)</th>
                    <th rowspan="2" style="width: 10%;">AVANS KESİNTİSİ (D)</th>
                    <th rowspan="2" class="header-row" style="width: 10%;">ÖDENECEK TUTAR (TL)</th>
                </tr>
                <tr class="subheader-row">
                    <th>1.5x</th>
                    <th>2.0x</th>
                </tr>
            </thead>
            <tbody>
                <?php foreach($mali_veriler as $m): ?>
                <tr>
                    <td class="text-start"><?php echo $m['ad_soyad']; ?></td>
                    <td><?php echo number_format($m['net_maas'], 2); ?> ₺</td>
                    <td><?php echo $m['mesai_15_saat']; ?> saat</td>
                    <td><?php echo $m['mesai_20_saat']; ?> saat</td>
                    <td style="color: green; font-weight: bold;">+<?php echo number_format($m['mesai_hakedis'], 2); ?> ₺</td>
                    <td style="color: red; font-weight: bold;">-<?php echo number_format($m['izin_kesinti_tutar'], 2); ?> ₺</td>
                    <td><?php echo number_format($m['net_hakedis'], 2); ?> ₺</td>
                    <td style="color: red; font-weight: bold;">-<?php echo number_format($m['avans'], 2); ?> ₺</td>
                    <td class="odenecek-tutar-cell"><?php echo number_format($m['odenecek'], 2); ?> ₺</td>
                </tr>
                <?php endforeach; ?>
                
                <tr class="total-row">
                    <td class="text-start">GENEL TOPLAM:</td>
                    <td><?php echo number_format($genel_toplam_net_maas, 2); ?> ₺</td>
                    <td colspan="2" style="background-color: #343a40; color: white;">ÖZET</td>
                    <td style="color: green;">+<?php echo number_format($genel_toplam_mesai_hakedis, 2); ?> ₺</td>
                    <td style="color: red;">-<?php echo number_format($genel_toplam_izin_kesinti, 2); ?> ₺</td>
                    <td><?php echo number_format($genel_toplam_net_maas + $genel_toplam_mesai_hakedis - $genel_toplam_izin_kesinti, 2); ?> ₺</td>
                    <td style="color: red;">-<?php echo number_format($genel_toplam_avans, 2); ?> ₺</td>
                    <td style="background-color: #d1ecf1; color: #000; font-size: 11px; border: 2px solid #000;"><?php echo number_format($genel_toplam_odenecek, 2); ?> ₺</td>
                </tr>
            </tbody>
        </table>
    
    <?php endif; ?>

    <div class="imza-blogu">
        <div class="imza-kutu">
            <div class="imza-baslik">HAZIRLAYAN / MUHASEBE</div>
        </div>
        <div class="imza-kutu">
            <div class="imza-baslik">YÖNETİCİ ONAYI</div>
        </div>
    </div>
    
    <?php if($format == 'pdf'): ?>
    <script>
        // PDF/Print için otomatik tetikleme
        window.onload = function() { setTimeout(function() { window.print(); }, 500); }
    </script>
    <?php endif; ?>

</body>
</html>
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,535
Sinyal (Ağ Hiti)
1.54 MB
Kapasite

Ağda Paylaş