PYBS (Personel Yönetim Bilgi Sistemi)
<?php
// modules/mesai-giris.php
session_start();
require_once '../config/db.php';
require_once '../config/functions.php';
// Herkes girebilir (Çalışanlar kendi adına, yöneticiler/muhasebe/İK diğerleri adına)
yetkiKontrol(['root', 'yonetici', 'mudur', 'vardiya_amiri', 'calisan', 'stajyer', 'muhasebe', 'insan_kaynaklari']);
include '../includes/header.php';
include '../includes/menu.php';
$mesaj = '';
$kullanici_id = $_SESSION['kullanici_id'];
$rol = $_SESSION['rol'];
// Yüksek yetki kontrolü
$yuksek_yetki = in_array($rol, ['root', 'yonetici', 'mudur', 'muhasebe', 'insan_kaynaklari']);
// Standart Günlük Çalışma Saati (Normalde 9.00 saat)
$gunluk_saat_std = (float)($pdo->query("SELECT ayar_degeri FROM site_ayarlari WHERE ayar_anahtari = 'gunluk_mesai_saati'")->fetchColumn() ?: 9.00);
// Fazla Mesai Sınırları
$maks_ek_mesai_saati_gunluk = 2.0; // Günlük 9 saat normal + 2 saat mesai sınırı.
$maks_ek_mesai_saati_haftalik = 15.0; // Haftalık 45 saat üzerine eklenebilecek maksimum mesai saati.
$maks_ek_mesai_saati_yillik = 270.0; // Yıllık yasal mesai sınırı.
// Tatil Günleri için Saat Aralığı (08:00 - 18:00)
$maks_tatil_calisma_saati = 10.0; // 18:00 - 08:00 = 10 saat.
// Resmi Tatil Listesi
$tatiller = $pdo->query("SELECT tarih FROM resmi_tatiller")->fetchAll(PDO::FETCH_COLUMN);
// --- SAAT SEÇENEKLERİ (GÜNCELLENDİ: Sadece tam ve buçuk saatler) ---
$zaman_secenekleri = "";
for ($saat = 0; $saat < 24; $saat++) {
foreach (['00', '30'] as $dakika) {
$deger = sprintf('%02d:%s', $saat, $dakika);
$zaman_secenekleri .= "<option value='$deger'>$deger</option>";
}
}
// SİLME İŞLEMİ (Mevcut kod aynı kalır)
if (isset($_GET['sil_id'])) {
$sil_id = (int)$_GET['sil_id'];
$sql_sil = "SELECT durum, calisan_id FROM mesai_hareketleri WHERE id = ?";
$kontrol_stmt = $pdo->prepare($sql_sil);
$kontrol_stmt->execute([$sil_id]);
$kayit = $kontrol_stmt->fetch();
if ($kayit) {
if ($kayit['durum'] == 'beklemede' && ($kayit['calisan_id'] == $kullanici_id || $yuksek_yetki)) {
$pdo->prepare("DELETE FROM mesai_hareketleri WHERE id = ?")->execute([$sil_id]);
$mesaj = '<div class="alert alert-warning shadow-sm border-0"><i class="fas fa-trash-alt me-2"></i> Kayıt silindi.</div>';
} elseif ($kayit['durum'] != 'beklemede' && !$yuksek_yetki) {
$mesaj = '<div class="alert alert-danger shadow-sm border-0"><i class="fas fa-times-circle me-2"></i> Hata: Onaylanmış kayıt silinemez!</div>';
} else {
$mesaj = '<div class="alert alert-danger shadow-sm border-0"><i class="fas fa-times-circle me-2"></i> Hata: Kayıt silme yetkiniz yok.</div>';
}
}
}
// KAYIT EKLEME
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
csrfKontrol($_POST['csrf_token']);
$kaydedilen_calisan_id = $kullanici_id;
if ($yuksek_yetki && isset($_POST['mesai_calisan_id']) && $_POST['mesai_calisan_id'] != 'kendi') {
$kaydedilen_calisan_id = (int)$_POST['mesai_calisan_id'];
}
$tarih = $_POST['tarih'];
$bas_saat = $_POST['baslangic_saati'];
$bit_saat = $_POST['bitis_saati'];
$yonetici_id = $_POST['hedef_yonetici_id'];
$aciklama = !empty($_POST['aciklama']) ? guvenlik($_POST['aciklama']) : '-';
$mesai_tipi = $_POST['mesai_turu'] ?? 'fazla_mesai';
$t1 = strtotime($bas_saat);
$t2 = strtotime($bit_saat);
if ($t2 < $t1) $t2 += 24 * 60 * 60; // Gece geçişi
$fark_saniye = $t2 - $t1;
$ham_saat = $fark_saniye / 3600;
// Mola Düşümü (Yüksek yetkili toplu girişte mola düşümü yapılmaz)
$mola = 0;
if (!$yuksek_yetki) {
if ($ham_saat > 7.5) $mola = 1;
elseif ($ham_saat > 4) $mola = 0.5;
}
$net_saat = $ham_saat - $mola;
if ($net_saat < 0) $net_saat = 0;
$gun_no = date('N', strtotime($tarih)); // 1=Pzt, 7=Pzr
$is_tatil_gunu = ($gun_no >= 6 || in_array($tarih, $tatiller));
$islem_engellendi = false;
// =========================================================
// !!! YILLIK SINIR KONTROLÜ (Maks. 270 Saat) - UYARI VERİLİR !!!
// =========================================================
$yil_basi = date('Y-01-01', strtotime($tarih));
$sql_yillik = "SELECT SUM(toplam_saat) FROM mesai_hareketleri
WHERE calisan_id = ? AND durum = 'onaylandi' AND tarih BETWEEN ? AND ?";
$stmt_yillik = $pdo->prepare($sql_yillik);
$stmt_yillik->execute([$kaydedilen_calisan_id, $yil_basi, $tarih]);
$yillik_toplam = $stmt_yillik->fetchColumn() ?: 0;
$yillik_yeni_toplam = $yillik_toplam + $net_saat;
if ($yillik_yeni_toplam > $maks_ek_mesai_saati_yillik) {
$izin_verilen = number_format($maks_ek_mesai_saati_yillik - $yillik_toplam, 1);
// KAYIT ENGELİ KALDIRILDI, ŞİDDETLİ UYARI VERİLDİ.
$mesaj_yillik = "<div class='alert alert-danger shadow-sm border-start border-danger border-5'>
<h5 class='alert-heading h6 fw-bold'><i class='fas fa-exclamation-triangle me-2'></i> ÖNEMLİ UYARI (KANUN LİMİTİ AŞILDI)!</h5>
Yıllık yasal mesai sınırı (**{$maks_ek_mesai_saati_yillik} saat**) bu kayıt ile aşılmaktadır.
Mevcut onaylı: **{$yillik_toplam} saat**. Yöneticiler, muvafakatname kontrolü yapmalıdır.
</div>";
}
// =========================================================
// !!! HAFTALIK SINIR KONTROLÜ (Maks. 15 Saat) - ENGELLEME DEVAM EDER !!!
// =========================================================
if (!$islem_engellendi) {
$tarih_obj = new DateTime($tarih);
$hafta_gun_no = $tarih_obj->format('N');
$hafta_baslangic = clone $tarih_obj;
$hafta_baslangic->modify('-' . ($hafta_gun_no - 1) . ' days');
$hafta_bitis = clone $hafta_baslangic;
$hafta_bitis->modify('+6 days');
$sql_haftalik_mesai = "SELECT SUM(toplam_saat) FROM mesai_hareketleri
WHERE calisan_id = ? AND durum = 'onaylandi' AND tarih BETWEEN ? AND ?";
$stmt_haftalik = $pdo->prepare($sql_haftalik_mesai);
$stmt_haftalik->execute([$kaydedilen_calisan_id, $hafta_baslangic->format('Y-m-d'), $hafta_bitis->format('Y-m-d')]);
$haftalik_toplam = $stmt_haftalik->fetchColumn() ?: 0;
$haftalik_yeni_toplam = $haftalik_toplam + $net_saat;
if ($haftalik_yeni_toplam > $maks_ek_mesai_saati_haftalik) {
$izin_verilen = number_format($maks_ek_mesai_saati_haftalik - $haftalik_toplam, 1);
if($izin_verilen < 0) $izin_verilen = 0;
$mesaj = "<div class='alert alert-danger shadow-sm border-start border-danger border-5'>
<h5 class='alert-heading h6 fw-bold'><i class='fas fa-exclamation-triangle me-2'></i> KAYIT İPTAL (HAFTALIK LİMİT)!</h5>
Haftalık toplam mesai sınırı (**{$maks_ek_mesai_saati_haftalik} saat**) aşıldı. Bu hafta kalan limit: **{$izin_verilen} saat**.
</div>";
$islem_engellendi = true;
}
}
// =========================================================
// !!! GÜNLÜK SINIR KONTROLÜ - ENGELLEME DEVAM EDER !!!
// =========================================================
if (!$islem_engellendi) {
if ($is_tatil_gunu) {
// --- 1. Tatil Günü Kontrolü (Cumartesi, Pazar, Resmi Tatil/Bayram) ---
$baslangic_zaman = strtotime($bas_saat);
$bitis_zaman = strtotime($bit_saat);
$hedef_baslangic = strtotime('08:00');
$hedef_bitis = strtotime('18:00');
if ($baslangic_zaman < $hedef_baslangic || $bitis_zaman > $hedef_bitis) {
$mesaj = "<div class='alert alert-danger shadow-sm border-start border-danger border-5'>
<h5 class='alert-heading h6 fw-bold'><i class='fas fa-exclamation-triangle me-2'></i> SAAT HATASI!</h5>
Tatil günlerinde mesai girişi sadece 08:00 - 18:00 saatleri arasında yapılabilir.
</div>";
$islem_engellendi = true;
}
if (!$islem_engellendi && $net_saat > $maks_tatil_calisma_saati) {
$mesaj = "<div class='alert alert-danger shadow-sm border-start border-danger border-5'>
<h5 class='alert-heading h6 fw-bold'><i class='fas fa-exclamation-triangle me-2'></i> SÜRE HATASI!</h5>
Tatil günlerinde toplam çalışma süresi 10 saati aşamaz (08:00-18:00).
</div>";
$islem_engellendi = true;
}
} else {
// --- 2. Hafta İçi Kontrolü (Pazartesi - Cuma) ---
$sql_onceki_mesai = "SELECT SUM(toplam_saat) FROM mesai_hareketleri
WHERE calisan_id = ? AND durum = 'onaylandi' AND tarih = ?";
$stmt_onceki = $pdo->prepare($sql_onceki_mesai);
$stmt_onceki->execute([$kaydedilen_calisan_id, $tarih]);
$onceki_onayli_mesai = $stmt_onceki->fetchColumn() ?: 0;
$toplam_mesai_o_gun = $onceki_onayli_mesai + $net_saat;
if ($toplam_mesai_o_gun > $maks_ek_mesai_saati_gunluk) {
$izin_verilen = number_format($maks_ek_mesai_saati_gunluk - $onceki_onayli_mesai, 1);
if($izin_verilen < 0) $izin_verilen = 0;
$mesaj = "<div class='alert alert-danger shadow-sm border-start border-danger border-5'>
<h5 class='alert-heading h6 fw-bold'><i class='fas fa-exclamation-triangle me-2'></i> KAYIT İPTAL (GÜNLÜK LİMİT)!</h5>
Hafta içi için günlük toplam mesai süresi (9 saat normal + 2 saat ek) aşılamaz.
Maksimum girebileceğiniz ek mesai: **{$izin_verilen} saat**'tir.
</div>";
$islem_engellendi = true;
}
}
}
// =========================================================
// !!! KONTROL SONUÇ VE KAYIT !!!
// =========================================================
if ($islem_engellendi) {
// Engelleme varsa işlemi sonlandır
goto end_of_post;
}
// Yıllık uyarı mesajını mevcut mesaja ekle (eğer haftalık/günlük engellenmediyse)
if (isset($mesaj_yillik)) {
if (empty($mesaj)) {
$mesaj = $mesaj_yillik;
} else {
$mesaj .= $mesaj_yillik; // Bu durum pratikte olmaz, çünkü engellenen bir işlemde bu koda gelmez.
}
}
// Hedef Yöneticiyi Kontrol et
if (empty($yonetici_id) && $kaydedilen_calisan_id == $kullanici_id && !$yuksek_yetki) {
$mesaj .= '<div class="alert alert-danger shadow-sm border-0">Hata: Lütfen onaylayacak yönetici seçiniz.</div>';
goto end_of_post;
} else {
$sql = "INSERT INTO mesai_hareketleri (calisan_id, hedef_yonetici_id, tarih, baslangic_saati, bitis_saati, toplam_saat, mesai_turu, aciklama, durum)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)";
$durum = ($kaydedilen_calisan_id != $kullanici_id && $yuksek_yetki) ? 'onaylandi' : 'beklemede';
$hedef_yonetici = ($durum == 'onaylandi') ? $kullanici_id : $yonetici_id;
try {
$pdo->prepare($sql)->execute([$kaydedilen_calisan_id, $hedef_yonetici, $tarih, $bas_saat, $bit_saat, $net_saat, $mesai_tipi, $aciklama, $durum]);
$log_mesaj = "Mesai girişi: $tarih ($net_saat Saat) - {$durum}";
if($kaydedilen_calisan_id != $kullanici_id) $log_mesaj .= " (Personel ID: {$kaydedilen_calisan_id} Adına)";
logKaydet($pdo, $kullanici_id, 'ekleme', $log_mesaj, 'mesai_hareketleri', $pdo->lastInsertId());
if (!isset($mesaj_yillik) || empty($mesaj_yillik)) {
if ($durum == 'onaylandi') {
$mesaj = '<div class="alert alert-success shadow-sm border-start border-success border-5"><h5 class="alert-heading h6 fw-bold"><i class="fas fa-check-circle me-2"></i>Başarılı!</h5> Mesai kaydı doğrudan onaylandı.</div>';
} else {
$mesaj = '<div class="alert alert-success shadow-sm border-start border-success border-5"><h5 class="alert-heading h6 fw-bold"><i class="fas fa-check-circle me-2"></i>Başarılı!</h5> Mesai kaydınız yöneticiye iletildi.</div>';
}
} else {
// Eğer yıllık uyarı varsa, başarılı kaydı uyarı mesajının üstüne/altına ekle
$basari_mesaji = ($durum == 'onaylandi') ? "Kayıt başarıyla doğrudan onaylandı." : "Kayıt başarıyla yöneticiye iletildi.";
$mesaj = $mesaj_yillik . "<div class='alert alert-success shadow-sm border-start border-success border-5 mt-3'>{$basari_mesaji}</div>";
}
} catch (PDOException $e) {
$mesaj = '<div class="alert alert-danger shadow-sm border-0">Hata: ' . $e->getMessage() . '</div>';
}
}
}
end_of_post: // Kayıt sonrası devam etme noktası
// --- İSTATİSTİKLER VE GEÇMİŞ ---
// Kendi istatistiklerini gösterir.
$bugun = new DateTime();
$ay_basi = $bugun->format('Y-m-01');
$ay_sonu = $bugun->format('Y-m-t');
$haftanin_gunu = $bugun->format('N');
$pazartesi = clone $bugun; $pazartesi->modify('-' . ($haftanin_gunu - 1) . ' days');
$pazar = clone $pazartesi; $pazar->modify('+6 days');
$sql_haftalik = "SELECT SUM(toplam_saat) FROM mesai_hareketleri WHERE calisan_id = ? AND durum = 'onaylandi' AND tarih BETWEEN ? AND ?";
$stmt_h = $pdo->prepare($sql_haftalik);
$stmt_h->execute([$kullanici_id, $pazartesi->format('Y-m-d'), $pazar->format('Y-m-d')]);
$haftalik_toplam = $stmt_h->fetchColumn() ?: 0;
$sql_aylik = "SELECT SUM(toplam_saat) FROM mesai_hareketleri WHERE calisan_id = ? AND durum = 'onaylandi' AND tarih BETWEEN ? AND ?";
$stmt_ay = $pdo->prepare($sql_aylik);
$stmt_ay->execute([$kullanici_id, $ay_basi, $ay_sonu]);
$aylik_genel = $stmt_ay->fetchColumn() ?: 0;
// İlerleme (%100 45 saat)
$yuzde = ($haftalik_toplam / 45) * 100;
if($yuzde > 100) $yuzde = 100;
$renk = ($haftalik_toplam >= 45) ? 'bg-danger' : 'bg-success';
// Yöneticiler (Sadece Normal Çalışanlar Yöneticisine göndermeli)
$yoneticiler = $pdo->query("SELECT id, ad, soyad, rol FROM kullanicilar WHERE rol IN ('yonetici', 'mudur') AND durum=1 AND id != $kullanici_id")->fetchAll();
// Tüm çalışanlar (Yüksek yetkili roller için)
$tum_calisanlar = [];
if ($yuksek_yetki) {
$tum_calisanlar = $pdo->query("SELECT id, ad, soyad, rol FROM kullanicilar WHERE durum=1 AND rol NOT IN ('root') ORDER BY ad ASC")->fetchAll();
}
// Geçmiş
$gecmis = $pdo->prepare("SELECT * FROM mesai_hareketleri WHERE calisan_id = ? ORDER BY tarih DESC LIMIT 20");
$gecmis->execute([$kullanici_id]);
$kayitlar = $gecmis->fetchAll();
?>
<div class="container-fluid px-3">
<div class="row mb-4">
<div class="col-12">
<div class="card border-0 shadow-sm overflow-hidden">
<div class="card-header bg-white py-3 border-bottom-0">
<h6 class="mb-0 fw-bold text-dark text-uppercase small"><i class="fas fa-chart-pie me-2 text-primary"></i> Puantaj Durumunuz (Kendi Kayıtlarınız)</h6>
</div>
<div class="card-body pt-0 pb-4">
<div class="row g-3 text-center">
<div class="col-6 border-end">
<div class="text-muted small mb-1">BU HAFTA</div>
<h2 class="mb-0 fw-bold text-dark"><?php echo number_format($haftalik_toplam, 1); ?></h2>
<small class="text-muted" style="font-size: 0.7rem;">/ 45 SAAT</small>
<div class="progress mt-2" style="height: 4px;">
<div class="progress-bar <?php echo $renk; ?>" style="width: <?php echo $yuzde; ?>%"></div>
</div>
</div>
<div class="col-6">
<div class="text-muted small mb-1">BU AY TOPLAM</div>
<h2 class="mb-0 fw-bold text-primary"><?php echo number_format($aylik_genel, 1); ?></h2>
<small class="text-muted" style="font-size: 0.7rem;">SAAT ÇALIŞMA</small>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row g-4">
<div class="col-12 col-md-6 col-lg-5">
<div class="card border-0 shadow-sm h-100">
<div class="card-header bg-primary text-white py-3">
<h5 class="mb-0 fw-bold"><i class="fas fa-clock me-2"></i> Mesai Girişi</h5>
</div>
<div class="card-body p-4">
<?php echo $mesaj; ?>
<form method="POST">
<input type="hidden" name="csrf_token" value="<?php echo csrfTokenOlustur(); ?>">
<?php if ($yuksek_yetki): ?>
<div class="alert alert-info small py-2">
Mesaiyi **<?php echo strtoupper($rol); ?>** yetkisiyle giriyorsunuz. (Doğrudan **ONAYLI** olarak kaydedilecektir).
</div>
<div class="mb-4">
<label class="form-label fw-bold text-dark small">MESAYİ GİRİLECEK PERSONEL <span class="text-danger">*</span></label>
<select name="mesai_calisan_id" class="form-select form-select-lg bg-light border-warning fw-bold" required>
<option value="kendi" selected>-- Kendi Adıma Gir --</option>
<option disabled>──────────</option>
<?php foreach($tum_calisanlar as $c): ?>
<option value="<?php echo $c['id']; ?>">
<?php echo $c['ad'].' '.$c['soyad'].' ('.strtoupper($c['rol']).')'; ?>
</option>
<?php endforeach; ?>
</select>
</div>
<?php endif; ?>
<div class="mb-4">
<label class="form-label fw-bold text-muted small">TARİH SEÇİNİZ <span class="text-danger">*</span></label>
<input type="date" name="tarih" id="mesaiTarih" class="form-control form-control-lg bg-light border-0 fw-bold" required value="<?php echo date('Y-m-d'); ?>">
<div class="form-text text-danger small fw-bold mt-1">
Günlük ve Haftalık Mesai Sınırları kontrol edilecektir.
</div>
</div>
<div class="row g-3 mb-4">
<div class="col-6">
<label class="form-label fw-bold text-muted small">BAŞLANGIÇ <span class="text-danger">*</span></label>
<select name="baslangic_saati" id="baslangicSaati" class="form-select form-select-lg bg-light border-0 fw-bold" required>
<option value="">Seç...</option>
<?php echo $zaman_secenekleri; ?>
</select>
</div>
<div class="col-6">
<label class="form-label fw-bold text-muted small">BİTİŞ <span class="text-danger">*</span></label>
<select name="bitis_saati" class="form-select form-select-lg bg-light border-0 fw-bold" required>
<option value="">Seç...</option>
<?php echo $zaman_secenekleri; ?>
</select>
</div>
</div>
<div class="mb-4">
<label class="form-label fw-bold text-muted small">MESAI TÜRÜ <span class="text-danger">*</span></label>
<select name="mesai_turu" class="form-select form-select-lg bg-light border-0">
<option value="fazla_mesai" selected>Fazla Mesai (Hafta İçi, Cumartesi - 1.5x)</option>
<option value="hafta_tatili">Hafta Tatili (Pazar - 2.0x)</option>
<option value="resmi_tatil_mesaisi">Resmi Tatil / Bayram (2.0x)</option>
</select>
</div>
<?php if (!$yuksek_yetki): ?>
<div class="mb-4">
<label class="form-label fw-bold text-muted small">ONAYLAYACAK KİŞİ <span class="text-danger">*</span></label>
<select name="hedef_yonetici_id" class="form-select form-select-lg bg-light border-0" required>
<option value="">Yönetici Seçiniz...</option>
<?php foreach($yoneticiler as $y): ?>
<option value="<?php echo $y['id']; ?>"><?php echo $y['ad'].' '.$y['soyad']; ?></option>
<?php endforeach; ?>
</select>
</div>
<?php else: ?>
<input type="hidden" name="hedef_yonetici_id" value="<?php echo $kullanici_id; ?>">
<?php endif; ?>
<div class="mb-4">
<label class="form-label fw-bold text-muted small">AÇIKLAMA (İsteğe Bağlı)</label>
<textarea name="aciklama" class="form-control bg-light border-0" rows="2" placeholder="Varsa notunuz..."></textarea>
</div>
<div class="d-grid">
<button type="submit" class="btn btn-primary btn-lg fw-bold shadow-sm py-3">
<i class="fas fa-paper-plane me-2"></i> KAYDET VE GÖNDER
</button>
</div>
</form>
</div>
</div>
</div>
<div class="col-12 col-md-6 col-lg-7">
<div class="card border-0 shadow-sm h-100">
<div class="card-header bg-white py-3 border-bottom">
<h5 class="mb-0 fw-bold text-dark"><i class="fas fa-history me-2"></i> Geçmiş Mesai Kayıtlarınız</h5>
</div>
<div class="table-responsive">
<table class="table table-hover align-middle mb-0">
<thead class="table-light small text-muted text-uppercase">
<tr>
<th class="ps-4">Tarih</th>
<th>Tür</th>
<th>Saat</th>
<th>Süre</th>
<th>Durum</th>
<th></th>
</tr>
</thead>
<tbody class="border-top-0">
<?php foreach($kayitlar as $k): ?>
<tr>
<td class="ps-4">
<span class="fw-bold text-dark"><?php echo tarihTurkce($k['tarih']); ?></span>
</td>
<td>
<?php
$tur_map = ['fazla_mesai' => 'FM', 'hafta_tatili' => 'HT', 'resmi_tatil_mesaisi' => 'RT', 'normal_mesai' => 'NM'];
echo $tur_map[$k['mesai_turu']] ?? 'Diğer';
?>
</td>
<td class="text-muted small">
<?php echo substr($k['baslangic_saati'],0,5).'-'.substr($k['bitis_saati'],0,5); ?>
</td>
<td>
<span class="badge bg-light text-dark border"><?php echo $k['toplam_saat']; ?> Saat</span>
</td>
<td>
<?php if($k['durum']=='onaylandi'): ?>
<span class="badge bg-success bg-opacity-10 text-success px-2 py-1">Onaylı</span>
<?php elseif($k['durum']=='reddedildi'): ?>
<span class="badge bg-danger bg-opacity-10 text-danger px-2 py-1">Red</span>
<?php else: ?>
<span class="badge bg-warning bg-opacity-10 text-warning px-2 py-1">Bekliyor</span>
<?php endif; ?>
</td>
<td class="text-end pe-3">
<?php if($k['durum'] == 'beklemede'): ?>
<a href="?sil_id=<?php echo $k['id']; ?>" class="btn btn-sm btn-outline-danger border-0" onclick="return confirm('Silmek istiyor musunuz?')">
<i class="fas fa-trash-alt"></i>
</a>
<?php endif; ?>
</td>
</tr>
<?php endforeach; ?>
<?php if(empty($kayitlar)): ?>
<tr><td colspan="6" class="text-center py-5 text-muted">Henüz kayıt bulunmuyor.</td></tr>
<?php endif; ?>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
<script>
function togglePersonel(hedef) {
const tekilDiv = document.getElementById('personelSecimDivTekil');
const cokluDiv = document.getElementById('personelSecimDivCoklu');
const tekilSelect = tekilDiv.querySelector('select');
const cokluSelect = cokluDiv.querySelector('select');
// Gizle/Göster
tekilDiv.style.display = (hedef === 'tekil') ? 'block' : 'none';
cokluDiv.style.display = (hedef === 'coklu') ? 'block' : 'none';
// Zorunluluk (required) ayarı
if (hedef === 'tekil') {
tekilSelect.setAttribute('required', 'required');
cokluSelect.removeAttribute('required');
} else if (hedef === 'coklu') {
tekilSelect.removeAttribute('required');
cokluSelect.setAttribute('required', 'required');
} else { // 'toplu'
tekilSelect.removeAttribute('required');
cokluSelect.removeAttribute('required');
}
}
document.addEventListener('DOMContentLoaded', function() {
const tarihInput = document.getElementById('mesaiTarih');
const saatSelect = document.getElementById('baslangicSaati');
const mesaiCalisanIdSelect = document.querySelector('select[name="mesai_calisan_id"]');
function saatAyarla() {
if (mesaiCalisanIdSelect && mesaiCalisanIdSelect.value !== 'kendi') {
saatSelect.value = '';
return;
}
const tarihDegeri = tarihInput.value;
if (!tarihDegeri) return;
const secilenTarih = new Date(tarihDegeri);
const gun = secilenTarih.getDay();
let hedefSaat = (gun === 0 || gun === 6) ? "08:00" : "18:00";
saatSelect.value = hedefSaat;
}
if (mesaiCalisanIdSelect) {
mesaiCalisanIdSelect.addEventListener('change', saatAyarla);
}
tarihInput.addEventListener('change', saatAyarla);
saatAyarla();
});
</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