<?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'; ?>