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