بالنسبة للاجازة السنوية تكون 30 يوم في السنة و45 يوما في السنة لمن بلغ سن الخمسين او تجاوزت مدة خدمته عشرين عاما
وفي جميع الاحوال يجب ان يتمتع الموظف بإجازة لاتقل عن 15 يوما متصلة في السنة
بالنسبة لاجازة المرضية لمدة لاتزيد علي 45 يوم متصلة او 60 يوما متقطعة خلال السنة الواحدة
اجازة الحج تكون لعشرين يوما ولاتمنح الي مرة خلال فترة الخدمة
اجازة الزواج تكون اسبوعين ولاتمنح الي مرة واحدة خلال فترة الخدمة
وفاة الزوج اجازة تكون 4 اشهر و10 ايام
هدا كود ساعدني به اخي بلال لكن عندما اختار اجازة سنوية لموظف مثلا من تاريخ 1-1-2024 الي 1-1-2025 يقبله ونوعها اجازة سنوية اليس مفترض يحسب حسب العمر اذا كان 50 ياخد 45 يوم وتجاوز 20 عام في خدمة غير ذلك 30 يوم
ممكن تعديل علي كود ليدخل بيانات ومعرفة رصيد موظف لكل اجازة حسب منطق وبارك الله فيكم
<?php
include('header.php');
error_reporting(0);
ini_set('display_errors',0);function calculateVacationBalance($con, $emp_id, $type, $hire_date, $birth_date, $gender, $to_date){
$to =newDateTime($to_date);
$hire =newDateTime($hire_date);
$birth =newDateTime($birth_date);
$current_year = $to->format('Y');// حساب سنوات الخدمة
$service_years = $to->diff($hire)->y;// حساب العمر
$age = $to->diff($birth)->y;// استعلام للحصول على الأيام المستخدمة
$stmt = $con->prepare("
SELECT COALESCE(SUM(DATEDIFF(end_date, start_date) + 1), 0) AS used_days
FROM vacations
WHERE emp_id = ? AND type = ? AND accept = 1
AND YEAR(start_date) = ?
");
$stmt->bind_param("iss", $emp_id, $type, $current_year);
$stmt->execute();
$stmt->bind_result($used_days);
$stmt->fetch();
$stmt->close();
$used_days = $used_days ?:0;switch($type){case'اجازة سنوية':// 30 يومًا سنويًا، 45 يومًا إذا كان العمر ≥ 50 أو الخدمة ≥ 20 سنة
$annual_days =($age >=50|| $service_years >=20)?45:30;
$balance = $annual_days - $used_days;// التأكد من أن الرصيد لا يقل عن 15 يومًا متصلة إذا لم يتم استخدامهاreturn max(0, $balance);case'اجازة مرضية':// 45 يومًا متصلة أو 60 يومًا متقطعة سنويًا
$sick_balance =60- $used_days;return max(0, $sick_balance);case'اجازة الحج':// 20 يومًا مرة واحدة خلال الخدمة
$stmt = $con->prepare("
SELECT COUNT(*) AS taken
FROM vacations
WHERE emp_id = ? AND type = 'اجازة الحج' AND accept = 1
");
$stmt->bind_param("i", $emp_id);
$stmt->execute();
$stmt->bind_result($taken);
$stmt->fetch();
$stmt->close();return $taken >0?0:20;case'اجازة زواج':// 14 يومًا مرة واحدة خلال الخدمة
$stmt = $con->prepare("
SELECT COUNT(*) AS taken
FROM vacations
WHERE emp_id = ? AND type = 'اجازة زواج' AND accept = 1
");
$stmt->bind_param("i", $emp_id);
$stmt->execute();
$stmt->bind_result($taken);
$stmt->fetch();
$stmt->close();return $taken >0?0:14;case'اجازة وفاة الزوج':// 130 يومًا (4 أشهر و10 أيام) للإناث فقط، مرة واحدةif($gender !=='أنثى'){return0;}
$stmt = $con->prepare("
SELECT COUNT(*) AS taken
FROM vacations
WHERE emp_id = ? AND type = 'اجازة وفاة الزوج' AND accept = 1
");
$stmt->bind_param("i", $emp_id);
$stmt->execute();
$stmt->bind_result($taken);
$stmt->fetch();
$stmt->close();return $taken >0?0:130;default:return0;}}?><head><scriptsrc="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script><linkhref="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.13/css/select2.min.css"rel="stylesheet"/><scriptsrc="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script><scriptsrc="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.13/js/select2.min.js"></script><style>.rak {width:400px;height:300px;font-size:14px!important;}</style></head><divclass="col-md-9 pan1"><olclass="breadcrumb"style="background-color:#fff;padding-top:8px;padding-bottom:8px;color:#000;font-size:16px;"><li><ahref="vacations.php">الاجازات</a></li><liclass="active">اضافة اجازة جديد</li></ol></div></div><divclass="row"><divclass="col-md-9 pan1"><divclass="panel"style="color:#000;"><divclass="panel-body"style="font-size:14px;padding-left:40px;padding-right:40px;padding-bottom:25px;padding-top:25px;"><formmethod="POST"enctype="multipart/form-data"><divclass="row"><divclass="col-md-4"><divclass="form-group"style="margin-top:10px;"><label>الموظف</label><selectname="emp_id"id=""><?php
$sql ="SELECT e.person_id, p.name FROM employees e JOIN people p ON e.person_id = p.id;";
$result = $con->query($sql);while($row = $result->fetch_assoc()){
echo "<option value='{$row['person_id']}'>{$row['name']}</option>";}?></select></div></div><divclass="col-md-4"><divclass="form-group"style="margin-top:10px;"><label>نوع الاجازة</label><selectname="type"id=""><optionvalue="اجازة سنوية">اجازة سنوية</option><optionvalue="اجازة مرضية">اجازة مرضية</option><optionvalue="اجازة الحج">اجازة الحج</option><optionvalue="اجازة زواج">اجازة زواج</option><optionvalue="اجازة وفاة الزوج">اجازة وفاة الزوج</option></select></div></div><divclass="col-md-4"><divclass="form-group"style="margin-top:10px;"><label>تاريخ البداية</label><inputname="start_date"type="date"class="form-control"></div></div></div><divclass="row"><divclass="col-md-4"><divclass="form-group"style="margin-top:10px;"><label>تاريخ المباشرة</label><inputname="end_date"type="date"class="form-control"></div></div><divclass="col-md-4"><divclass="form-group"style="margin-top:10px;"><label>سبب الاجازة</label><inputname="reason"type="text"class="form-control"placeholder="ادخل سبب الاجازة"></div></div><divclass="col-md-4"><divclass="form-group"style="margin-top:10px;"><label>الموافقة مسبقا</label><inputname="companion"type="checkbox"class="form-control"></div></div></div><divclass="row"><divclass="col-md-4"><divclass="form-group"style="margin-top:10px;"><buttonname="submit"type="submit"class="btn btn-primary">إضافة <spanclass="ion-android-add"></span></button><buttontype="reset"class="btn btn-danger">إلغاء <spanclass="ion-android-delete"></span></button></div></div></div></form><?php
if($_SERVER["REQUEST_METHOD"]=="POST"){
$emp_id = $_POST['emp_id'];
$type = $_POST['type'];
$start_date = $_POST['start_date'];
$end_date = $_POST['end_date'];
$reason = $_POST['reason'];
$companion = isset($_POST['companion'])?1:0;
$created_at = date('Y-m-d H:i:s');
$start =newDateTime($start_date);
$end =newDateTime($end_date);
$interval = $start->diff($end);
$years = $interval->y;
$months = $interval->m;
$days = $interval->d;
$errors =[];if(empty($type)){ $errors[]='يجب تحديد نوع الإجازة';}if(empty($start_date)){ $errors[]='يجب إدخال تاريخ بداية الإجازة';}if(empty($end_date)){ $errors[]='يجب إدخال تاريخ المباشرة';}if($end <= $start){ $errors[]='تاريخ المباشرة يجب أن يكون بعد بداية الإجازة';}if(!empty($errors)){
echo implode('<br>', $errors);exit;}
mysqli_begin_transaction($con);try{
$stmt = $con->prepare("SELECT * FROM employees WHERE person_id = ?");
$stmt->bind_param("i", $emp_id);
$stmt->execute();
$employee = $stmt->get_result()->fetch_assoc();
$stmt->close();if(!$employee){
echo "لم يتم العثور على بيانات الموظف";exit;}// تحقق لا يوجد إجازة قيد الإجراء
$stmt = $con->prepare("SELECT COUNT(*) FROM vacations WHERE emp_id = ? AND accept = 0");
$stmt->bind_param("i", $emp_id);
$stmt->execute();
$stmt->bind_result($count);
$stmt->fetch();
$stmt->close();if($count >0){
echo "عذرًا، هنالك إجازة قيد الإجراء للموظف الحالي، الرجاء التحقق.";exit();}
$stmt = $con->prepare("SELECT * FROM people WHERE id = ?");
$stmt->bind_param("i", $emp_id);
$stmt->execute();
$people = $stmt->get_result()->fetch_assoc();
$stmt->close();if($type =="اجازة سنوية"){
$to =newDateTime($to_date);
$hire =newDateTime($hire_date);
$birth =newDateTime($birth_date);
$service_years = $to->diff($hire)->y;
$age = $to->diff($birth)->y;// تحديد الحد الأقصى للإجازة السنوية
$max_annual_days =($age >=50|| $service_years >=20)?45:30;// حساب عدد أيام الإجازة المطلوبة
$start =newDateTime($start_date);
$end =newDateTime($end_date);
$interval = $start->diff($end);
$requested_days = $interval->days +1;// التحقق من أن عدد أيام الإجازة المطلوبة لا يتجاوز الحد الأقصىif($requested_days > $max_annual_days){
echo "لا يمكنك طلب إجازة سنوية تتجاوز ". $max_annual_days ." يومًا. الحد الأقصى المسموح به هو: ". $max_annual_days ." يومًا.";exit;}}if($type =="اجازة مرضية"){}if($type =="اجازة الحج"){}if($type =="اجازة زواج"){}if($type =="اجازة وفاة الزوج"){}
$stmt = $con->prepare("INSERT INTO vacations (emp_id, years, months, days, reason, companion, type, start_date, end_date, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
$start_date_formatted = $start->format('Y-m-d');
$end_date_formatted = $end->format('Y-m-d');
$stmt->bind_param("iiiisissss",
$emp_id,
$years,
$months,
$requested_days,// الآن أصبحت days هي فارق الأيام
$reason,
$companion,
$type,
$start_date_formatted,
$end_date_formatted,
$created_at
);if($stmt->execute()){
echo "<script>
Swal.fire({
title: 'رسالة تأكيد',
text: 'تم إضافة بيانات اجازة موظف بنجاح!',
icon: 'success',
customClass: 'rak',
});
</script>";
echo '<meta http-equiv="refresh" content="2;url=vacations.php" />';}
$stmt->close();
mysqli_commit($con);}catch(Exception $e){
mysqli_rollback($con);
echo "خطأ: ". $e->getMessage();exit;}}?></div></div></div></div><?php
include('footer.php');?>
السؤال
ايمن ميلاد
السلام عليكم لدي منطق تالي لحساب اجازات
بالنسبة للاجازة السنوية تكون 30 يوم في السنة و45 يوما في السنة لمن بلغ سن الخمسين او تجاوزت مدة خدمته عشرين عاما
وفي جميع الاحوال يجب ان يتمتع الموظف بإجازة لاتقل عن 15 يوما متصلة في السنة
بالنسبة لاجازة المرضية لمدة لاتزيد علي 45 يوم متصلة او 60 يوما متقطعة خلال السنة الواحدة
اجازة الحج تكون لعشرين يوما ولاتمنح الي مرة خلال فترة الخدمة
اجازة الزواج تكون اسبوعين ولاتمنح الي مرة واحدة خلال فترة الخدمة
وفاة الزوج اجازة تكون 4 اشهر و10 ايام
هدا كود ساعدني به اخي بلال لكن عندما اختار اجازة سنوية لموظف مثلا من تاريخ 1-1-2024 الي 1-1-2025 يقبله ونوعها اجازة سنوية اليس مفترض يحسب حسب العمر اذا كان 50 ياخد 45 يوم وتجاوز 20 عام في خدمة غير ذلك 30 يوم
ممكن تعديل علي كود ليدخل بيانات ومعرفة رصيد موظف لكل اجازة حسب منطق وبارك الله فيكم
14 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.