PYBS (Personel Yönetim Bilgi Sistemi)
<?php
// modules/maas-hesapla.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';
$yil = $_GET['yil'] ?? date('Y');
$ay = $_GET['ay'] ?? date('m');
$personel_filtre_id = $_GET['personel_id'] ?? 'tumu'; // ID, Rol adı veya 'tumu'
$gun_sayisi = cal_days_in_month(CAL_GREGORIAN, $ay, $yil);
$tarih_bas = date('Y-m-01', strtotime("$yil-$ay-01"));
$tarih_bit = date('Y-m-t', strtotime("$yil-$ay-01"));
// --- YARDIMCI FORMAT FONKSİYONU ---
function formatSaatListeleme($saat) {
if ($saat === null || $saat === 0.0 || $saat === 0) return 0;
// Eğer saat tam sayı ise ondalık kısmı gösterme (örn: 2.0 -> 2)
if ($saat == floor($saat)) {
return (int)$saat;
}
// Değilse, bir ondalık basamak göster (örn: 2.5)
return number_format($saat, 1, '.', '');
}
// -------------------------------------
// --- KATSAYILAR ---
$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
// --------------------
// Resmi Tatilleri Çek
$tatiller = $pdo->query("SELECT tarih FROM resmi_tatiller")->fetchAll(PDO::FETCH_COLUMN);
$resmi_tatiller_arr = $tatiller; // JS için kullanılacak
// Rol Bazlı Toplu Filtreleme Seçenekleri
$rol_filtreleri = [
'yonetici' => 'Tüm Yöneticiler',
'mudur' => 'Tüm Müdürler',
'vardiya_amiri' => 'Tüm Vardiya Amirleri',
'muhasebe' => 'Tüm Muhasebe',
'insan_kaynaklari' => 'Tüm İK',
'calisan' => 'Tüm Çalışanlar',
'stajyer' => 'Tüm Stajyerler',
];
// Personel Listesi SQL'i
$sql_per = "SELECT id, ad, soyad, aylik_net_maas, rol FROM kullanicilar WHERE durum=1 AND rol != 'root'";
if ($personel_filtre_id != 'tumu') {
if (is_numeric($personel_filtre_id)) {
$sql_per .= " AND id = " . (int)$personel_filtre_id;
} elseif (isset($rol_filtreleri[$personel_filtre_id])) {
$sql_per .= " AND rol = " . $pdo->quote($personel_filtre_id);
}
}
$sql_per .= " ORDER BY ad ASC";
$personeller = $pdo->query($sql_per)->fetchAll();
// Tüm personeller (Filtre kutusu için)
$tum_personeller_query = $pdo->query("SELECT id, ad, soyad, rol FROM kullanicilar WHERE durum=1 AND rol != 'root' ORDER BY rol, ad ASC")->fetchAll();
$tum_personeller_gruplu = [];
foreach ($tum_personeller_query as $p) {
if (!isset($tum_personeller_gruplu[$p['rol']])) {
$tum_personeller_gruplu[$p['rol']] = [];
}
$tum_personeller_gruplu[$p['rol']][] = $p;
}
// Rol adlarını Türkçeleştirme
$rol_adlari = [
'yonetici' => 'Yöneticiler',
'mudur' => 'Müdürler',
'vardiya_amiri' => 'Vardiya Amirleri',
'muhasebe' => 'Muhasebe',
'insan_kaynaklari' => 'İnsan Kaynakları',
'calisan' => 'Çalışanlar',
'stajyer' => 'Stajyerler',
];
// --- DETAY MODALI İÇİN VERİ ÇEKİMİ ---
$detay_data = [];
$personel_ids = array_column($personeller, 'id');
if (!empty($personel_ids)) {
$ids_string = implode(',', $personel_ids);
// 1. Mesai Hareketleri (Netleşmiş Kazanç)
$stmt_mesai = $pdo->prepare("
SELECT calisan_id, tarih, baslangic_saati, bitis_saati, toplam_saat, mesai_turu, aciklama
FROM mesai_hareketleri
WHERE calisan_id IN ($ids_string) AND durum = 'onaylandi'
AND tarih BETWEEN ? AND ?
AND toplam_saat > 0
ORDER BY tarih ASC
");
$stmt_mesai->execute([$tarih_bas, $tarih_bit]);
while ($m = $stmt_mesai->fetch()) {
$gun_no = date('N', strtotime($m['tarih']));
$is_tatil = in_array($m['tarih'], $resmi_tatiller_arr);
$is_pazar = ($gun_no == 7);
// Mesai Çarpanını belirle
$carpan = ($is_pazar || $is_tatil) ? '2.0' : '1.5';
// Brüt Süre Hesaplama (Mola Düşülmüş Ham Süre)
$t1 = strtotime($m['baslangic_saati']);
$t2 = strtotime($m['bitis_saati']);
if ($t2 < $t1) $t2 += 24 * 60 * 60;
$fark = ($t2 - $t1) / 3600;
// Mola Düş (admin-mesai-ekle.php mantığı)
$mola = 0;
if ($fark > 7.5) $mola = 1; elseif ($fark > 4) $mola = 0.5;
$brut_saat = $fark - $mola;
if($brut_saat < 0) $brut_saat = 0;
if (!isset($detay_data[$m['calisan_id']]['mesai'])) {
$detay_data[$m['calisan_id']]['mesai'] = [];
}
if (!isset($detay_data[$m['calisan_id']]['mesai'][$carpan])) {
$detay_data[$m['calisan_id']]['mesai'][$carpan] = [];
}
$detay_data[$m['calisan_id']]['mesai'][$carpan][] = [
'tarih' => $m['tarih'],
'bas_saat' => date('H:i', strtotime($m['baslangic_saati'])),
'bit_saat' => date('H:i', strtotime($m['bitis_saati'])),
'brut_saat' => (float)number_format($brut_saat, 1), // Mola düşülmüş ham süre
'net_saat' => (float)$m['toplam_saat'], // Mahsuplaşmış net süre
'aciklama' => $m['aciklama']
];
}
// 2. İzin Kesintileri (Sadece Ücretsiz Tam Gün İzin)
$stmt_izin_kesinti = $pdo->prepare("
SELECT calisan_id, izin_turu, baslangic_tarihi, bitis_tarihi, saatlik_sure, aciklama
FROM izin_talepleri
WHERE calisan_id IN ($ids_string) AND durum = 'onaylandi'
AND izin_turu = 'diger'
AND DATE(baslangic_tarihi) <= ? AND DATE(bitis_tarihi) >= ?
");
$stmt_izin_kesinti->execute([$tarih_bit, $tarih_bas]);
while ($i = $stmt_izin_kesinti->fetch()) {
$izin_turu_etiket = 'ÜCRETSİZ TAM GÜN İZİN';
$gunluk_kesinti_saati = 9;
$start_date = new DateTime(date('Y-m-d', strtotime($i['baslangic_tarihi'])));
$end_date = new DateTime(date('Y-m-d', strtotime($i['bitis_tarihi'])));
for ($date = $start_date; $date <= $end_date; $date->modify('+1 day')) {
$g_tarih = $date->format('Y-m-d');
if ($g_tarih >= $tarih_bas && $g_tarih <= $tarih_bit) {
if (!isset($detay_data[$i['calisan_id']]['izin_kesinti'])) {
$detay_data[$i['calisan_id']]['izin_kesinti'] = [];
}
$net_kesinti = $gunluk_kesinti_saati;
$detay_data[$i['calisan_id']]['izin_kesinti'][] = [
'tarih' => $g_tarih,
'turu' => $izin_turu_etiket,
'saat' => $net_kesinti,
'aciklama' => $i['aciklama']
];
}
}
}
}
// --------------------------------------------------------------------------
?>
<div class="container-fluid">
<div class="d-flex justify-content-between align-items-center mb-3">
<h3><i class="fas fa-money-bill-wave text-success"></i> Maaş Hesaplama Modülü</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> Excel</button>
<button type="button" onclick="submitReport('pdf')" class="btn btn-sm btn-danger" title="Antetli PDF/Yazdır"><i class="fas fa-file-pdf"></i> PDF</button>
</div>
</div>
<div class="card-box p-3 mb-3 border-top border-success border-3">
<form method="GET" id="maasForm" class="row g-2 align-items-end">
<div class="col-md-2">
<label>Yıl</label>
<select name="yil" class="form-select form-select-sm">
<?php for($y=2024; $y<=2030; $y++) echo "<option value='$y' ".($y==$yil?'selected':'').">$y</option>"; ?>
</select>
</div>
<div class="col-md-2">
<label>Ay</label>
<select name="ay" class="form-select form-select-sm">
<?php
$aylar = ['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 as $k=>$v) echo "<option value='$k' ".($k==$ay?'selected':'').">$v</option>";
?>
</select>
</div>
<div class="col-md-4">
<label>Personel / Grup Filtresi</label>
<select name="personel_id" class="form-select form-select-sm">
<option value="tumu" <?php if($personel_filtre_id == 'tumu') echo 'selected'; ?>>--- TÜM PERSONELLER (Bordro) ---</option>
<option disabled>────── ROL GRUPLARI ──────</option>
<?php foreach($rol_filtreleri as $rol_key => $rol_ad): ?>
<option value="<?php echo $rol_key; ?>" <?php if($personel_filtre_id == $rol_key) echo 'selected'; ?>>
<?php echo $rol_ad; ?>
</option>
<?php endforeach; ?>
<option disabled>────── TEKİL PERSONEL ──────</option>
<?php
foreach($tum_personeller_gruplu as $rol => $personel_listesi):
$rol_baslik = $rol_adlari[$rol] ?? strtoupper($rol);
?>
<optgroup label="<?php echo $rol_baslik; ?>">
<?php foreach($personel_listesi as $p): ?>
<option value="<?php echo $p['id']; ?>" <?php if($personel_filtre_id == $p['id']) echo 'selected'; ?>>
<?php echo $p['ad'] . ' ' . $p['soyad']; ?>
</option>
<?php endforeach; ?>
</optgroup>
<?php endforeach; ?>
</select>
</div>
<div class="col-md-2">
<button type="submit" class="btn btn-success btn-sm w-100">Hesapla</button>
</div>
<input type="hidden" name="format" id="reportFormat" value="">
<input type="hidden" name="rapor_tur" value="puantaj_detay"> </form>
</div>
<div class="card border-0 shadow-sm overflow-auto">
<table class="table table-bordered table-hover text-center align-middle mb-0" style="font-size: 0.85rem;">
<thead class="table-dark">
<tr>
<th rowspan="2" class="align-middle">Personel</th>
<th rowspan="2" class="align-middle">Net Maaş</th>
<th colspan="3" class="bg-primary border-start">Ek Kazançlar</th>
<th colspan="3" class="bg-danger border-start">Kesintiler</th>
<th rowspan="2" class="align-middle bg-success">TOPLAM HAKEDİŞ</th>
</tr>
<tr>
<th>Hafta İçi/Cts (1.5x)</th>
<th>Pzr/Tatil (2.0x)</th>
<th>Tutar</th>
<th>İzin Kesinti Saati</th>
<th>Avans</th>
<th>Toplam Tutar</th>
</tr>
</thead>
<tbody>
<?php foreach($personeller as $per):
$aylik_net_maas = (float)$per['aylik_net_maas'];
if ($aylik_net_maas <= 0) {
echo "<tr><td class='text-start fw-bold'>{$per['ad']} {$per['soyad']}</td><td>-</td><td colspan='8' class='bg-light text-danger'>Maaş bilgisi tanımlanmamış.</td></tr>";
continue;
}
// Saatlik Ücret Hesaplama
$saatlik_ucret = $aylik_net_maas / 225;
$kazanc_15_saat = 0;
$kazanc_20_saat = 0;
$kesinti_saat = 0;
// --- AVANS ÇEKİMİ ---
$stmt_avans = $pdo->prepare("SELECT SUM(avans_miktari) FROM avans_hareketleri WHERE calisan_id = ? AND islem_tarihi BETWEEN ? AND ? AND durum = 'onaylandi'");
$stmt_avans->execute([$per['id'], $tarih_bas, $tarih_bit]);
$aylik_avans_tutar = $stmt_avans->fetchColumn() ?: 0.00;
// ---------------------
// --- FAZLA MESAİ (Netleşmiş Borç Düşülmüş) ---
$stmt_mesai_toplam = $pdo->prepare("
SELECT tarih, SUM(toplam_saat) as toplam_mesai
FROM mesai_hareketleri
WHERE calisan_id = ? AND durum = 'onaylandi'
AND tarih BETWEEN ? AND ?
AND mesai_turu IN ('fazla_mesai', 'hafta_tatili', 'resmi_tatil_mesaisi')
GROUP BY tarih
");
$stmt_mesai_toplam->execute([$per['id'], $tarih_bas, $tarih_bit]);
$mesai_gunluk_liste = $stmt_mesai_toplam->fetchAll(PDO::FETCH_KEY_PAIR);
foreach ($mesai_gunluk_liste as $tarih => $mesai_sure) {
if ($mesai_sure > 0) {
$gun_no = date('N', strtotime($tarih));
$is_tatil = in_array($tarih, $tatiller);
$is_pazar = ($gun_no == 7);
if ($is_pazar || $is_tatil) {
$kazanc_20_saat += $mesai_sure;
} else {
$kazanc_15_saat += $mesai_sure;
}
}
}
// 2. İZİN KESİNTİSİ SAATLERİNİ TOPLA (Sadece tam gün ücretsiz izin)
$stmt_izin_kesinti_toplam = $pdo->prepare("
SELECT SUM(DATEDIFF(bitis_tarihi, baslangic_tarihi) + 1) AS toplam_gun
FROM izin_talepleri
WHERE calisan_id = ? AND durum = 'onaylandi'
AND izin_turu = 'diger'
AND DATE(baslangic_tarihi) <= ? AND DATE(bitis_tarihi) >= ?
");
$stmt_izin_kesinti_toplam->execute([$per['id'], $tarih_bit, $tarih_bas]);
$toplam_ucretsiz_gun = $stmt_izin_kesinti_toplam->fetchColumn() ?: 0;
$kesinti_saat = $toplam_ucretsiz_gun * 9; // 9 saat günlük standart çalışma süresi
// Hesaplamalar
$tutar_15 = $kazanc_15_saat * ($saatlik_ucret * $carpan_15);
$tutar_20 = $kazanc_20_saat * ($saatlik_ucret * $carpan_20);
$toplam_ek = $tutar_15 + $tutar_20;
$tutar_izin_kesinti = $kesinti_saat * $saatlik_ucret;
// Toplam Kesinti = İzin Kesintisi (Sadece Ücretsiz Tam Gün) + Avans
$toplam_kesinti_tutar = $tutar_izin_kesinti + $aylik_avans_tutar;
$toplam_hakedis = $aylik_net_maas + $toplam_ek - $toplam_kesinti_tutar;
?>
<tr>
<td class="text-start fw-bold">
<a href="maas-rapor.php?yil=<?php echo $yil; ?>&ay=<?php echo $ay; ?>&personel_id=<?php echo $per['id']; ?>&format=pdf"
target="_blank"
class="text-decoration-none text-dark"
title="<?php echo $per['ad'].' '.$per['soyad']; ?> için PDF Bordro Oluştur">
<?php echo $per['ad'].' '.$per['soyad']; ?>
</a>
</td>
<td><?php echo number_format($aylik_net_maas, 2); ?> ₺</td>
<td style="cursor: pointer;" onclick="openDetailModal(<?php echo $per['id']; ?>, 'mesai', '1.5')" data-bs-toggle="modal" data-bs-target="#detailModal" class="fw-bold">
<?php echo formatSaatListeleme($kazanc_15_saat); ?> s
</td>
<td style="cursor: pointer;" onclick="openDetailModal(<?php echo $per['id']; ?>, 'mesai', '2.0')" data-bs-toggle="modal" data-bs-target="#detailModal" class="fw-bold">
<?php echo formatSaatListeleme($kazanc_20_saat); ?> s
</td>
<td class="text-success fw-bold">+<?php echo number_format($toplam_ek, 2); ?> ₺</td>
<td style="cursor: pointer;" onclick="openDetailModal(<?php echo $per['id']; ?>, 'izin_kesinti', '9')" data-bs-toggle="modal" data-bs-target="#detailModal" class="fw-bold">
<?php echo ($kesinti_saat > 0) ? formatSaatListeleme($kesinti_saat)." Saat" : "-"; ?>
</td>
<td class="text-danger fw-bold">-<?php echo number_format($aylik_avans_tutar, 2); ?> ₺</td>
<td class="text-danger fw-bold">-<?php echo number_format($toplam_kesinti_tutar, 2); ?> ₺</td>
<td class="bg-success text-white fw-bold h5 mb-0">
<?php echo number_format($toplam_hakedis, 2); ?> ₺
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
<div class="mt-3 small text-muted">
* Hesaplamalar her personelin **tanımlı net maaşı** üzerinden ve **225 saatlik aylık çalışma** baz alınarak yapılmıştır. <br>
* Fazla Mesai Çarpanları: Hafta İçi/Cts **<?php echo $carpan_15; ?> katı**, Pazar/Tatil **<?php echo $carpan_20; ?> katı**. <br>
* **Fazla Mesai:** Girilen mesai süreleri, **varsa saatlik izin borçları düşüldükten sonra** kalan net süre üzerinden hesaplanmıştır (Mahsuplaşma Uyumlu). <br>
* **İzin Kesintisi:** Sadece **tam gün ücretsiz izinler** kesinti yaratır. Saatlik izinler, fazla mesai ile mahsuplaştığı için burada kesinti olarak görünmez. <br>
* **Avans:** Bu ay ödenen onaylı avans tutarı, hakedişten düşülmüştür.
</div>
</div>
<div class="modal fade" id="detailModal" tabindex="-1" aria-labelledby="detailModalLabel" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered modal-lg">
<div class="modal-content">
<div class="modal-header bg-primary text-white" id="detailModalHeader">
<h5 class="modal-title" id="detailModalLabel"><i class="fas fa-search me-2"></i> Detaylı Döküm</h5>
<button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal" aria-label="Kapat"></button>
</div>
<div class="modal-body" id="modalPrintArea">
<h6 id="modalPersonelAdi" class="fw-bold mb-3 border-bottom pb-2"></h6>
<p id="modalToplamSure" class="alert alert-info py-2 small fw-bold mb-3 d-none"></p>
<div class="table-responsive">
<table class="table table-striped table-bordered table-sm small mb-0">
<thead class="table-light">
<tr>
<th>Tarih</th>
<th>Başlangıç - Bitiş Aralığı</th>
<th id="modalIkinciSutunBaslik">Net Süre (Brüt)</th>
<th>Hak Edilen Süre (Net)</th>
<th>Açıklama</th>
</tr>
</thead>
<tbody id="modalDetayBody">
</tbody>
</table>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Kapat</button>
<button type="button" class="btn btn-info" onclick="printModalContent()"><i class="fas fa-print me-1"></i> Yazdır</button>
</div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
<script>
// PHP verisini JavaScript'e aktar
const DETAY_DATA = <?php echo json_encode($detay_data); ?>;
const AY_YIL_ETIKET_PHP = "<?php echo date('Y-m-d', strtotime("$yil-$ay-01")); ?>";
function getGunAdi(tarihStr) {
const date = new Date(tarihStr + 'T00:00:00');
const gunler = ['Pazar', 'Pazartesi', 'Salı', 'Çarşamba', 'Perşembe', 'Cuma', 'Cumartesi'];
const aylar = ['Ocak', 'Şubat', 'Mart', 'Nisan', 'Mayıs', 'Haziran', 'Temmuz', 'Ağustos', 'Eylül', 'Ekim', 'Kasım', 'Aralık'];
// Ay adını Türkçeleştirme
const ayAdi = aylar[date.getMonth()];
const gunAdi = gunler[date.getDay()];
return `${date.getDate()} ${ayAdi} ${date.getFullYear()} (${gunAdi})`;
}
function openDetailModal(personelId, tip, carpan_saat) {
const data = DETAY_DATA[personelId];
const adSoyad = document.querySelector(`a[href*="personel_id=${personelId}"]`).textContent.trim();
const modalTitle = document.getElementById('detailModalLabel');
const modalPersonelAdi = document.getElementById('modalPersonelAdi');
const modalDetayBody = document.getElementById('modalDetayBody');
const modalIkinciSutunBaslik = document.getElementById('modalIkinciSutunBaslik');
const modalToplamSure = document.getElementById('modalToplamSure');
// Ay yıl etiketini Türkçe formatla
const modalAyYil = getGunAdi(AY_YIL_ETIKET_PHP).split(' ')[1] + ' ' + new Date(AY_YIL_ETIKET_PHP + 'T00:00:00').getFullYear();
let detayListesi = [];
let baslik = "";
let toplamSure = 0;
modalDetayBody.innerHTML = '';
if (tip === 'mesai') {
const carpan = carpan_saat;
detayListesi = data?.mesai?.[carpan] || [];
// Tablo başlıklarını Fazla Mesai'ye göre ayarla
document.querySelector('#modalPrintArea thead tr:first-child th:nth-child(3)').textContent = 'Net Süre (Brüt)';
document.querySelector('#modalPrintArea thead tr:first-child th:nth-child(4)').textContent = 'Hak Edilen Süre (Net)';
if (carpan === '1.5') {
baslik = "Fazla Mesai (Hafta İçi / Cumartesi - 1.5x)";
} else {
baslik = "Fazla Mesai (Pazar / Resmi Tatil - 2.0x)";
}
} else if (tip === 'izin_kesinti') {
detayListesi = data?.izin_kesinti || [];
baslik = "Maaş Kesintisi (Ücretsiz Tam Gün İzin)";
// Tablo başlıklarını İzin Kesintisi'ne göre ayarla
document.querySelector('#modalPrintArea thead tr:first-child th:nth-child(3)').textContent = 'Kesinti Saati';
document.querySelector('#modalPrintArea thead tr:first-child th:nth-child(4)').textContent = 'Açıklama';
// Fazla mesaiye ait olan 5. sütunu gizle/kullanma
document.querySelector('#modalPrintArea thead tr:first-child th:nth-child(5)').style.display = 'none';
document.querySelector('#modalPrintArea tbody tr td:nth-child(5)').style.display = 'none';
// İzin kesintisi için ikinci sütun başlığını düzelt
document.querySelector('#modalPrintArea thead tr:first-child th:nth-child(2)').textContent = 'İzin Türü';
}
modalTitle.textContent = baslik;
modalPersonelAdi.textContent = `${adSoyad} | ${modalAyYil} Detayları`;
if (detayListesi.length === 0) {
modalDetayBody.innerHTML = '<tr><td colspan="5" class="text-center text-muted">Bu ay için detaylı kayıt bulunmamaktadır.</td></tr>';
modalToplamSure.classList.add('d-none');
return;
}
// Listeyi tarihe göre sırala
detayListesi.sort((a, b) => new Date(a.tarih) - new Date(b.tarih));
detayListesi.forEach(item => {
let sureVeyaAralik = '';
let birinciDeger = '';
let ikinciDeger = '';
let aciklama = item.aciklama || '-';
const netSaat = parseFloat(item.saat || item.net_saat);
toplamSure += netSaat;
if (tip === 'mesai') {
sureVeyaAralik = `${item.bas_saat} - ${item.bit_saat}`;
birinciDeger = (item.brut_saat).toFixed(1);
ikinciDeger = (item.net_saat).toFixed(1);
} else if (tip === 'izin_kesinti') {
sureVeyaAralik = item.turu;
birinciDeger = (item.saat).toFixed(1); // Kesinti saati (9 saat)
ikinciDeger = aciklama; // İkinci değeri açıklama olarak kullan
aciklama = ''; // Boş bırak
// İzin kesintisi için 5. sütunu boş bırak
document.querySelector('#modalPrintArea thead tr:first-child th:nth-child(5)').style.display = 'none';
}
const row = document.createElement('tr');
if (tip === 'mesai') {
row.innerHTML = `
<td>${getGunAdi(item.tarih)}</td>
<td>${sureVeyaAralik}</td>
<td class="fw-bold text-end text-primary">${birinciDeger}</td>
<td class="fw-bold text-end text-success">${ikinciDeger}</td>
<td>${aciklama}</td>
`;
} else {
row.innerHTML = `
<td>${getGunAdi(item.tarih)}</td>
<td>${sureVeyaAralik}</td>
<td class="fw-bold text-end text-danger">${birinciDeger}</td>
<td>${ikinciDeger}</td>
<td style="display:none;"></td>
`;
}
modalDetayBody.appendChild(row);
});
// Total süreyi göster
modalToplamSure.textContent = `${baslik} Toplam Süre: ${toplamSure.toFixed(1)} Saat`;
modalToplamSure.classList.remove('d-none');
// Mesai ise 5. sütunu tekrar görünür yap
if (tip === 'mesai') {
document.querySelector('#modalPrintArea thead tr:first-child th:nth-child(5)').style.display = 'table-cell';
}
}
function printModalContent() {
const content = document.getElementById('modalPrintArea').innerHTML;
const printWindow = window.open('', '', 'height=600,width=800');
printWindow.document.write('<html><head><title>Bordro Detay Raporu</title>');
printWindow.document.write('<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">');
printWindow.document.write('<style>');
printWindow.document.write('@media print {');
printWindow.document.write('h6, h5 { color: #000 !important; }');
printWindow.document.write('.table { font-size: 10pt; }');
printWindow.document.write('.container { width: 100%; }'); // Tam genişlik kullan
printWindow.document.write('}');
printWindow.document.write('</style>');
printWindow.document.write('</head><body>');
printWindow.document.write('<div class="container py-4">');
// Yazdırma sırasında tablo başlığını düzelt
printWindow.document.write('<h4 class="mb-4 text-center">' + document.getElementById('detailModalLabel').textContent + '</h4>');
printWindow.document.write(content);
printWindow.document.write('</div></body></html>');
printWindow.document.close();
printWindow.focus();
setTimeout(() => {
printWindow.print();
printWindow.close();
}, 500);
}
function submitReport(type) {
const form = document.getElementById('maasForm');
const hiddenInput = document.getElementById('reportFormat');
hiddenInput.value = type;
form.action = 'maas-rapor.php';
form.target = '_blank';
form.submit();
form.action = '';
form.target = '_self';
}
</script>
<?php include '../includes/footer.php'; ?>
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